1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program and library */
4 /* SCIP --- Solving Constraint Integer Programs */
5 /* */
6 /* Copyright (C) 2002-2021 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SCIP is distributed under the terms of the ZIB Academic License. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SCIP; see the file COPYING. If not visit scipopt.org. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15
16 /**@file set.c
17 * @ingroup OTHER_CFILES
18 * @brief methods for global SCIP settings
19 * @author Tobias Achterberg
20 * @author Timo Berthold
21 *
22 * @todo Functions like SCIPsetFeastol() are misleading (it seems that the feasibility tolerance can be set).
23 * Rename all functions starting with SCIPsetXXX, e.g., SCIPsetGetFeastol() and SCIPsetSetFeastol().
24 */
25
26 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
27
28 #include <assert.h>
29 #include <string.h>
30 #include <math.h>
31
32 #include "scip/def.h"
33 #include "scip/set.h"
34 #include "scip/stat.h"
35 #include "scip/clock.h"
36 #include "scip/event.h"
37 #include "scip/lp.h"
38 #include "scip/paramset.h"
39 #include "scip/scip.h"
40 #include "scip/bandit.h"
41 #include "scip/branch.h"
42 #include "scip/conflict.h"
43 #include "scip/cons.h"
44 #include "scip/disp.h"
45 #include "scip/dialog.h"
46 #include "scip/heur.h"
47 #include "scip/concsolver.h"
48 #include "scip/compr.h"
49 #include "scip/nodesel.h"
50 #include "scip/presol.h"
51 #include "scip/pricer.h"
52 #include "scip/reader.h"
53 #include "scip/relax.h"
54 #include "scip/sepa.h"
55 #include "scip/cutsel.h"
56 #include "scip/table.h"
57 #include "scip/prop.h"
58 #include "scip/benders.h"
59 #include "scip/expr.h"
60 #include "scip/nlpi.h"
61 #include "scip/pub_nlpi.h"
62 #include "scip/struct_scip.h" /* for SCIPsetPrintDebugMessage() */
63
64 /*
65 * Default settings
66 */
67
68
69 /* Branching */
70
71 #define SCIP_DEFAULT_BRANCH_SCOREFUNC 'p' /**< branching score function ('s'um, 'p'roduct) */
72 #define SCIP_DEFAULT_BRANCH_SCOREFAC 0.167 /**< branching score factor to weigh downward and upward gain prediction
73 * in sum score function */
74 #define SCIP_DEFAULT_BRANCH_PREFERBINARY FALSE /**< should branching on binary variables be preferred? */
75 #define SCIP_DEFAULT_BRANCH_CLAMP 0.2 /**< minimal fractional distance of branching point to a continuous variable'
76 * bounds; a value of 0.5 leads to branching always in the middle of a bounded domain */
77 #define SCIP_DEFAULT_BRANCH_MIDPULL 0.75 /**< fraction by which to move branching point of a continuous variable towards the middle of the domain */
78 #define SCIP_DEFAULT_BRANCH_MIDPULLRELDOMTRIG 0.5 /**< multiply midpull by relative domain width if the latter is below this value */
79 #define SCIP_DEFAULT_BRANCH_LPGAINNORMALIZE 's' /**< strategy for normalizing LP gain when updating pseudo costs of continuous variables */
80 #define SCIP_DEFAULT_BRANCH_DELAYPSCOST TRUE /**< should updating pseudo costs of continuous variables be delayed to after separation */
81 #define SCIP_DEFAULT_BRANCH_DIVINGPSCOST TRUE /**< should pseudo costs be updated also in diving and probing mode? */
82 #define SCIP_DEFAULT_BRANCH_FORCEALL FALSE /**< should all strong branching children be regarded even if
83 * one is detected to be infeasible? (only with propagation) */
84 #define SCIP_DEFAULT_BRANCH_FIRSTSBCHILD 'a' /**< child node to be regarded first during strong branching (only with propagation): 'u'p child, 'd'own child, 'h'istory-based, or 'a'utomatic */
85 #define SCIP_DEFAULT_BRANCH_CHECKSBSOL TRUE /**< should LP solutions during strong branching with propagation be checked for feasibility? */
86 #define SCIP_DEFAULT_BRANCH_ROUNDSBSOL TRUE /**< should LP solutions during strong branching with propagation be rounded? (only when checksbsol=TRUE) */
87 #define SCIP_DEFAULT_BRANCH_SUMADJUSTSCORE FALSE /**< score adjustment near zero by adding epsilon (TRUE) or using maximum (FALSE) */
88
89 /* Tree Compression */
90
91 #define SCIP_DEFAULT_COMPR_ENABLE FALSE /**< should automatic tree compression in reoptimization after presolving be enabled? */
92
93
94 /* Conflict Analysis (general) */
95
96 #define SCIP_DEFAULT_CONF_ENABLE TRUE /**< conflict analysis be enabled? */
97 #define SCIP_DEFAULT_CONF_MAXVARSFAC 0.15 /**< maximal fraction of variables involved in a conflict constraint */
98 #define SCIP_DEFAULT_CONF_MINMAXVARS 0 /**< minimal absolute maximum of variables involved in a conflict constraint */
99 #define SCIP_DEFAULT_CONF_MAXLPLOOPS 2 /**< maximal number of LP resolving loops during conflict analysis
100 * (-1: no limit) */
101 #define SCIP_DEFAULT_CONF_LPITERATIONS 10 /**< maximal number of LP iterations in each LP resolving loop
102 * (-1: no limit) */
103 #define SCIP_DEFAULT_CONF_USEPROP TRUE /**< should propagation conflict analysis be used? */
104 #define SCIP_DEFAULT_CONF_USEINFLP 'b' /**< should infeasible LP conflict analysis be used?
105 * ('o'ff, 'c'onflict graph, 'd'ual ray, 'b'oth conflict graph and dual ray)
106 */
107 #define SCIP_DEFAULT_CONF_USEBOUNDLP 'b' /**< should bound exceeding LP conflict analysis be used?
108 * ('o'ff, 'c'onflict graph, 'd'ual ray, 'b'oth conflict graph and dual solution)
109 */
110 #define SCIP_DEFAULT_CONF_USESB TRUE /**< should infeasible/bound exceeding strong branching conflict analysis
111 * be used? */
112 #define SCIP_DEFAULT_CONF_USEPSEUDO TRUE /**< should pseudo solution conflict analysis be used? */
113 #define SCIP_DEFAULT_CONF_PREFINFPROOF TRUE /**< prefer infeasibility proof to boundexceeding proof */
114 #define SCIP_DEFAULT_CONF_SEPARATE TRUE /**< should the conflict constraints be separated? */
115 #define SCIP_DEFAULT_CONF_DYNAMIC TRUE /**< should the conflict constraints be subject to aging? */
116
117
118 /* Conflict Analysis (conflict graph) */
119
120 #define SCIP_DEFAULT_CONF_MAXSTORESIZE 10000 /**< maximal size of the conflict pool */
121 #define SCIP_DEFAULT_CONF_RECONVLEVELS -1 /**< number of depth levels up to which UIP reconvergence constraints are
122 * generated (-1: generate reconvergence constraints in all depth levels) */
123 #define SCIP_DEFAULT_CONF_CLEANBNDDEPEND TRUE /**< should conflicts based on an old cutoff bound removed? */
124 #define SCIP_DEFAULT_CONF_FUIPLEVELS -1 /**< number of depth levels up to which first UIP's are used in conflict
125 * analysis (-1: use All-FirstUIP rule) */
126 #define SCIP_DEFAULT_CONF_INTERCONSS -1 /**< maximal number of intermediate conflict constraints generated in
127 * conflict graph (-1: use every intermediate constraint) */
128 #define SCIP_DEFAULT_CONF_MAXCONSS 10 /**< maximal number of conflict constraints accepted at an infeasible node
129 * (-1: use all generated conflict constraints) */
130 #define SCIP_DEFAULT_CONF_PREFERBINARY FALSE /**< should binary conflicts be preferred? */
131 #define SCIP_DEFAULT_CONF_ALLOWLOCAL TRUE /**< should conflict constraints be generated that are only valid locally? */
132 #define SCIP_DEFAULT_CONF_SETTLELOCAL FALSE /**< should conflict constraints be attached only to the local subtree
133 * where they can be useful? */
134 #define SCIP_DEFAULT_CONF_REPROPAGATE TRUE /**< should earlier nodes be repropagated in order to replace branching
135 * decisions by deductions? */
136 #define SCIP_DEFAULT_CONF_KEEPREPROP TRUE /**< should constraints be kept for repropagation even if they are too long? */
137 #define SCIP_DEFAULT_CONF_REMOVEABLE TRUE /**< should the conflict's relaxations be subject to LP aging and cleanup? */
138 #define SCIP_DEFAULT_CONF_DEPTHSCOREFAC 1.0 /**< score factor for depth level in bound relaxation heuristic of LP analysis */
139 #define SCIP_DEFAULT_CONF_PROOFSCOREFAC 1.0 /**< score factor for impact on acticity in bound relaxation heuristic of LP analysis */
140 #define SCIP_DEFAULT_CONF_UPLOCKSCOREFAC 0.0 /**< score factor for up locks in bound relaxation heuristic of LP analysis */
141 #define SCIP_DEFAULT_CONF_DOWNLOCKSCOREFAC 0.0 /**< score factor for down locks in bound relaxation heuristic of LP analysis */
142 #define SCIP_DEFAULT_CONF_SCOREFAC 0.98 /**< factor to decrease importance of variables' earlier conflict scores */
143 #define SCIP_DEFAULT_CONF_RESTARTNUM 0 /**< number of successful conflict analysis calls that trigger a restart
144 * (0: disable conflict restarts) */
145 #define SCIP_DEFAULT_CONF_RESTARTFAC 1.5 /**< factor to increase restartnum with after each restart */
146 #define SCIP_DEFAULT_CONF_IGNORERELAXEDBD FALSE /**< should relaxed bounds be ignored? */
147 #define SCIP_DEFAULT_CONF_MAXVARSDETECTIMPLIEDBOUNDS 250 /**< maximal number of variables to try to detect global bound implications and shorten the whole conflict set (0: disabled) */
148 #define SCIP_DEFAULT_CONF_FULLSHORTENCONFLICT TRUE /**< try to shorten the whole conflict set or terminate early (depending on the 'maxvarsdetectimpliedbounds' parameter) */
149 #define SCIP_DEFAULT_CONF_CONFLITWEIGHT 0.0 /**< the weight the VSIDS score is weight by updating the VSIDS for a variable if it is part of a conflict */
150 #define SCIP_DEFAULT_CONF_CONFLITGRAPHWEIGHT 1.0/**< the weight the VSIDS score is weight by updating the VSIDS for a variable if it is part of a conflict graph */
151 #define SCIP_DEFAULT_CONF_WEIGHTSIZE 0.001 /**< weight of the size of a conflict used in score calculation */
152 #define SCIP_DEFAULT_CONF_WEIGHTREPROPDEPTH 0.1 /**< weight of the repropagation depth of a conflict used in score calculation */
153 #define SCIP_DEFAULT_CONF_WEIGHTVALIDDEPTH 1.0 /**< weight of the valid depth of a conflict used in score calculation */
154 #define SCIP_DEFAULT_CONF_MINIMPROVE 0.05 /**< minimal improvement of primal bound to remove conflicts based on a previous incumbent */
155
156 /* Conflict Analysis (dual ray) */
157
158 #define SCIP_DEFAULT_CONF_SEPAALTPROOFS FALSE /**< apply cut generating functions to construct alternative proofs */
159 #define SCIP_DEFAULT_CONF_USELOCALROWS TRUE /**< use local rows to construct infeasibility proofs */
160
161 /* Constraints */
162
163 #define SCIP_DEFAULT_CONS_AGELIMIT 0 /**< maximum age an unnecessary constraint can reach before it is deleted
164 * (0: dynamic adjustment, -1: constraints are never deleted) */
165 #define SCIP_DEFAULT_CONS_OBSOLETEAGE -1 /**< age of a constraint after which it is marked obsolete
166 * (0: dynamic adjustment, -1: constraints are never marked obsolete) */
167 #define SCIP_DEFAULT_CONS_DISABLEENFOPS FALSE /**< should enforcement of pseudo solution be disabled? */
168
169
170 /* Display */
171
172 #define SCIP_DEFAULT_DISP_VERBLEVEL SCIP_VERBLEVEL_HIGH /**< verbosity level of output */
173 #define SCIP_DEFAULT_DISP_WIDTH 143 /**< maximal number of characters in a node information line */
174 #define SCIP_DEFAULT_DISP_FREQ 100 /**< frequency for displaying node information lines */
175 #define SCIP_DEFAULT_DISP_HEADERFREQ 15 /**< frequency for displaying header lines (every n'th node info line) */
176 #define SCIP_DEFAULT_DISP_LPINFO FALSE /**< should the LP solver display status messages? */
177 #define SCIP_DEFAULT_DISP_ALLVIOLS FALSE /**< display all violations of the best solution after the solving process finished? */
178 #define SCIP_DEFAULT_DISP_RELEVANTSTATS TRUE /**< should the relevant statistics be displayed at the end of solving? */
179
180 /* Heuristics */
181
182 #define SCIP_DEFAULT_HEUR_USEUCTSUBSCIP FALSE /**< should setting of common subscip parameters include the activation of the UCT node selector? */
183
184 /* History */
185
186 #define SCIP_DEFAULT_HISTORY_VALUEBASED FALSE /**< should statistics be collected for variable domain value pairs */
187 #define SCIP_DEFAULT_HISTORY_ALLOWMERGE FALSE /**< should variable histories be merged from sub-SCIPs whenever possible? */
188 #define SCIP_DEFAULT_HISTORY_ALLOWTRANSFER FALSE /**< should variable histories be transferred to initialize SCIP copies? */
189
190 /* Limits */
191
192 #define SCIP_DEFAULT_LIMIT_TIME 1e+20 /**< maximal time in seconds to run */
193 #define SCIP_DEFAULT_LIMIT_MEMORY SCIP_MEM_NOLIMIT/**< maximal memory usage in MB */
194 #define SCIP_DEFAULT_LIMIT_GAP 0.0 /**< solving stops, if the gap is below the given value */
195 #define SCIP_DEFAULT_LIMIT_ABSGAP 0.0 /**< solving stops, if the absolute difference between primal and dual
196 * bound reaches this value */
197 #define SCIP_DEFAULT_LIMIT_NODES -1LL /**< maximal number of nodes to process (-1: no limit) */
198 #define SCIP_DEFAULT_LIMIT_STALLNODES -1LL /**< solving stops, if the given number of nodes was processed since the
199 * last improvement of the primal solution value (-1: no limit) */
200 #define SCIP_DEFAULT_LIMIT_SOLUTIONS -1 /**< solving stops, if given number of sols were found (-1: no limit) */
201 #define SCIP_DEFAULT_LIMIT_BESTSOL -1 /**< solving stops, if given number of solution improvements were found
202 * (-1: no limit) */
203 #define SCIP_DEFAULT_LIMIT_MAXSOL 100 /**< maximal number of solutions to store in the solution storage */
204 #define SCIP_DEFAULT_LIMIT_MAXORIGSOL 10 /**< maximal number of solutions candidates to store in the solution storage of the original problem */
205 #define SCIP_DEFAULT_LIMIT_RESTARTS -1 /**< solving stops, if the given number of restarts was triggered (-1: no limit) */
206 #define SCIP_DEFAULT_LIMIT_AUTORESTARTNODES -1 /**< if solve exceeds this number of nodes, an automatic restart is triggered (-1: no automatic restart)*/
207
208
209 /* LP */
210
211 #define SCIP_DEFAULT_LP_SOLVEFREQ 1 /**< frequency for solving LP at the nodes; -1: never; 0: only root LP */
212 #define SCIP_DEFAULT_LP_ITERLIM -1LL /**< iteration limit for each single LP solve; -1: no limit */
213 #define SCIP_DEFAULT_LP_ROOTITERLIM -1LL /**< iteration limit for initial root LP solve; -1: no limit */
214 #define SCIP_DEFAULT_LP_SOLVEDEPTH -1 /**< maximal depth for solving LPs (-1: no depth limit) */
215 #define SCIP_DEFAULT_LP_INITALGORITHM 's' /**< LP algorithm for solving initial LP relaxations ('s'implex, 'b'arrier,
216 * barrier with 'c'rossover) */
217 #define SCIP_DEFAULT_LP_RESOLVEALGORITHM 's' /**< LP algorithm for resolving LP relaxations if a starting basis exists
218 * ('s'implex, 'b'arrier, barrier with 'c'rossover) */
219 #define SCIP_DEFAULT_LP_PRICING 'l' /**< LP pricing strategy ('l'pi default, 'a'uto, 'f'ull pricing, 'p'artial,
220 * 's'teepest edge pricing, 'q'uickstart steepest edge pricing,
221 * 'd'evex pricing) */
222 #define SCIP_DEFAULT_LP_CLEARINITIALPROBINGLP TRUE/**< should lp state be cleared at the end of probing mode when lp
223 * was initially unsolved, e.g., when called right after presolving? */
224 #define SCIP_DEFAULT_LP_RESOLVERESTORE FALSE /**< should the LP be resolved to restore the state at start of diving (if FALSE we buffer the solution values)? */
225 #define SCIP_DEFAULT_LP_FREESOLVALBUFFERS FALSE /**< should the buffers for storing LP solution values during diving be freed at end of diving? */
226 #define SCIP_DEFAULT_LP_COLAGELIMIT 10 /**< maximum age a dynamic column can reach before it is deleted from SCIP_LP
227 * (-1: don't delete columns due to aging) */
228 #define SCIP_DEFAULT_LP_ROWAGELIMIT 10 /**< maximum age a dynamic row can reach before it is deleted from SCIP_LP
229 * (-1: don't delete rows due to aging) */
230 #define SCIP_DEFAULT_LP_CLEANUPCOLS FALSE /**< should new non-basic columns be removed after LP solving? */
231 #define SCIP_DEFAULT_LP_CLEANUPCOLSROOT FALSE /**< should new non-basic columns be removed after root LP solving? */
232 #define SCIP_DEFAULT_LP_CLEANUPROWS TRUE /**< should new basic rows be removed after LP solving? */
233 #define SCIP_DEFAULT_LP_CLEANUPROWSROOT TRUE /**< should new basic rows be removed after root LP solving? */
234 #define SCIP_DEFAULT_LP_CHECKSTABILITY TRUE /**< should LP solver's return status be checked for stability? */
235 #define SCIP_DEFAULT_LP_CONDITIONLIMIT -1.0 /**< maximum condition number of LP basis counted as stable (-1.0: no limit) */
236 #define SCIP_DEFAULT_LP_MARKOWITZ 0.01 /**< minimal Markowitz threshold to control sparsity/stability in LU factorization */
237 #define SCIP_DEFAULT_LP_CHECKPRIMFEAS TRUE /**< should LP solutions be checked for primal feasibility to resolve LP at numerical troubles? */
238 #define SCIP_DEFAULT_LP_CHECKDUALFEAS TRUE /**< should LP solutions be checked for dual feasibility to resolve LP at numerical troubles? */
239 #define SCIP_DEFAULT_LP_CHECKFARKAS TRUE /**< should infeasibility proofs from the LP be checked? */
240 #define SCIP_DEFAULT_LP_FASTMIP 1 /**< should FASTMIP setting of LP solver be used? */
241 #define SCIP_DEFAULT_LP_SCALING 1 /**< LP scaling (0: none, 1: normal, 2: aggressive) */
242 #define SCIP_DEFAULT_LP_PRESOLVING TRUE /**< should presolving of LP solver be used? */
243 #define SCIP_DEFAULT_LP_LEXDUALALGO FALSE /**< should the dual lexicographic algorithm be used? */
244 #define SCIP_DEFAULT_LP_LEXDUALROOTONLY TRUE /**< should the lexicographic dual algorithm be applied only at the root node */
245 #define SCIP_DEFAULT_LP_LEXDUALMAXROUNDS 2 /**< maximum number of rounds in the dual lexicographic algorithm */
246 #define SCIP_DEFAULT_LP_LEXDUALBASIC FALSE /**< choose fractional basic variables in lexicographic dual algorithm */
247 #define SCIP_DEFAULT_LP_LEXDUALSTALLING TRUE /**< turn on the lex dual algorithm only when stalling? */
248 #define SCIP_DEFAULT_LP_DISABLECUTOFF 2 /**< disable the cutoff bound in the LP solver? (0: enabled, 1: disabled, 2: auto) */
249 #define SCIP_DEFAULT_LP_ROWREPSWITCH 1.2 /**< simplex algorithm shall use row representation of the basis
250 * if number of rows divided by number of columns exceeds this value */
251 #define SCIP_DEFAULT_LP_THREADS 0 /**< number of threads used for solving the LP (0: automatic) */
252 #define SCIP_DEFAULT_LP_RESOLVEITERFAC -1.0 /**< factor of average LP iterations that is used as LP iteration limit
253 * for LP resolve (-1.0: unlimited) */
254 #define SCIP_DEFAULT_LP_RESOLVEITERMIN 1000 /**< minimum number of iterations that are allowed for LP resolve */
255 #define SCIP_DEFAULT_LP_SOLUTIONPOLISHING 3 /**< LP solution polishing method (0: disabled, 1: only root, 2: always, 3: auto) */
256 #define SCIP_DEFAULT_LP_REFACTORINTERVAL 0 /**< LP refactorization interval (0: automatic) */
257 #define SCIP_DEFAULT_LP_ALWAYSGETDUALS FALSE /**< should the dual solution always be collected */
258
259 /* NLP */
260
261 #define SCIP_DEFAULT_NLP_SOLVER "" /**< name of NLP solver to use, or "" if solver should be chosen by priority */
262 #define SCIP_DEFAULT_NLP_DISABLE FALSE /**< should the NLP be always disabled? */
263
264
265 /* Memory */
266
267 #define SCIP_DEFAULT_MEM_SAVEFAC 0.8 /**< fraction of maximal mem usage when switching to memory saving mode */
268 #define SCIP_DEFAULT_MEM_TREEGROWFAC 2.0 /**< memory growing factor for tree array */
269 #define SCIP_DEFAULT_MEM_PATHGROWFAC 2.0 /**< memory growing factor for path array */
270 #define SCIP_DEFAULT_MEM_TREEGROWINIT 65536 /**< initial size of tree array */
271 #define SCIP_DEFAULT_MEM_PATHGROWINIT 256 /**< initial size of path array */
272
273
274 /* Miscellaneous */
275
276 #define SCIP_DEFAULT_MISC_CATCHCTRLC TRUE /**< should the CTRL-C interrupt be caught by SCIP? */
277 #define SCIP_DEFAULT_MISC_USEVARTABLE TRUE /**< should a hashtable be used to map from variable names to variables? */
278 #define SCIP_DEFAULT_MISC_USECONSTABLE TRUE /**< should a hashtable be used to map from constraint names to constraints? */
279 #define SCIP_DEFAULT_MISC_USESMALLTABLES FALSE /**< should smaller hashtables be used? yields better performance for small problems with about 100 variables */
280 #define SCIP_DEFAULT_MISC_EXACTSOLVE FALSE /**< should the problem be solved exactly (with proven dual bounds)? */
281 #define SCIP_DEFAULT_MISC_RESETSTAT TRUE /**< should the statistics be reset if the transformed problem is
282 * freed otherwise the statistics get reset after original problem is
283 * freed (in case of Benders' decomposition this parameter should be set
284 * to FALSE and therefore can be used to collect statistics over all
285 * runs) */
286 #define SCIP_DEFAULT_MISC_IMPROVINGSOLS FALSE /**< should only solutions be checked which improve the primal bound */
287 #define SCIP_DEFAULT_MISC_PRINTREASON TRUE /**< should the reason be printed if a given start solution is infeasible? */
288 #define SCIP_DEFAULT_MISC_ESTIMEXTERNMEM TRUE /**< should the usage of external memory be estimated? */
289 #define SCIP_DEFAULT_MISC_AVOIDMEMOUT TRUE /**< try to avoid running into memory limit by restricting plugins like heuristics? */
290 #define SCIP_DEFAULT_MISC_TRANSORIGSOLS TRUE /**< should SCIP try to transfer original solutions to the transformed space (after presolving)? */
291 #define SCIP_DEFAULT_MISC_TRANSSOLSORIG TRUE /**< should SCIP try to transfer transformed solutions to the original space (after solving)? */
292 #define SCIP_DEFAULT_MISC_CALCINTEGRAL TRUE /**< should SCIP calculate the primal dual integral? */
293 #define SCIP_DEFAULT_MISC_FINITESOLSTORE FALSE /**< should SCIP try to remove infinite fixings from solutions copied to the solution store? */
294 #define SCIP_DEFAULT_MISC_OUTPUTORIGSOL TRUE /**< should the best solution be transformed to the orignal space and be output in command line run? */
295 #define SCIP_DEFAULT_MISC_ALLOWSTRONGDUALREDS TRUE /**< should strong dual reductions be allowed in propagation and presolving? */
296 #define SCIP_DEFAULT_MISC_ALLOWWEAKDUALREDS TRUE /**< should weak dual reductions be allowed in propagation and presolving? */
297 #define SCIP_DEFAULT_MISC_REFERENCEVALUE 1e99 /**< objective value for reference purposes */
298 #define SCIP_DEFAULT_MISC_USESYMMETRY 7 /**< bitset describing used symmetry handling technique (0: off; 1: polyhedral (orbitopes and/or symresacks)
299 * 2: orbital fixing; 3: orbitopes and orbital fixing; 4: Schreier Sims cuts; 5: Schreier Sims cuts and
300 * orbitopes); 6: Schreier Sims cuts and orbital fixing; 7: Schreier Sims cuts, orbitopes, and orbital
301 * fixing, see type_symmetry.h */
302 #define SCIP_DEFAULT_MISC_SCALEOBJ TRUE /**< should the objective function be scaled? */
303
304 #ifdef WITH_DEBUG_SOLUTION
305 #define SCIP_DEFAULT_MISC_DEBUGSOLUTION "-" /**< path to a debug solution */
306 #endif
307
308 /* Randomization */
309 #define SCIP_DEFAULT_RANDOM_RANDSEEDSHIFT 0 /**< global shift of all random seeds in the plugins, this will have no impact on the permutation and LP seeds */
310 #define SCIP_DEFAULT_RANDOM_PERMUTATIONSEED 0 /**< seed value for permuting the problem after reading/transformation (0: no permutation) */
311 #define SCIP_DEFAULT_RANDOM_LPSEED 0 /**< random seed for LP solver, e.g. for perturbations in the simplex (0: LP default) */
312 #define SCIP_DEFAULT_RANDOM_PERMUTECONSS TRUE /**< should order of constraints be permuted (depends on permutationseed)? */
313 #define SCIP_DEFAULT_RANDOM_PERMUTEVARS FALSE /**< should order of variables be permuted (depends on permutationseed)? */
314
315
316 /* Node Selection */
317
318 #define SCIP_DEFAULT_NODESEL_CHILDSEL 'h' /**< child selection rule ('d'own, 'u'p, 'p'seudo costs, 'i'nference, 'l'p value,
319 * 'r'oot LP value difference, 'h'brid inference/root LP value difference) */
320
321
322 /* Presolving */
323
324 #define SCIP_DEFAULT_PRESOL_ABORTFAC 8e-04 /**< abort presolve, if at most this fraction of the problem was changed
325 * in last presolve round */
326 #define SCIP_DEFAULT_PRESOL_MAXROUNDS -1 /**< maximal number of presolving rounds (-1: unlimited, 0: off) */
327 #define SCIP_DEFAULT_PRESOL_MAXRESTARTS -1 /**< maximal number of restarts (-1: unlimited) */
328 #define SCIP_DEFAULT_PRESOL_CLQTABLEFAC 2.0 /**< limit on number of entries in clique table relative to number of problem nonzeros */
329 #define SCIP_DEFAULT_PRESOL_RESTARTFAC 0.025 /**< fraction of integer variables that were fixed in the root node
330 * triggering a restart with preprocessing after root node evaluation */
331 #define SCIP_DEFAULT_PRESOL_IMMRESTARTFAC 0.10 /**< fraction of integer variables that were fixed in the root node triggering an
332 * immediate restart with preprocessing */
333 #define SCIP_DEFAULT_PRESOL_SUBRESTARTFAC 1.00 /**< fraction of integer variables that were globally fixed during the
334 * solving process triggering a restart with preprocessing */
335 #define SCIP_DEFAULT_PRESOL_RESTARTMINRED 0.10 /**< minimal fraction of integer variables removed after restart to allow
336 * for an additional restart */
337 #define SCIP_DEFAULT_PRESOL_DONOTMULTAGGR FALSE /**< should multi-aggregation of variables be forbidden? */
338 #define SCIP_DEFAULT_PRESOL_DONOTAGGR FALSE /**< should aggregation of variables be forbidden? */
339
340
341 /* Pricing */
342
343 #define SCIP_DEFAULT_PRICE_ABORTFAC 2.0 /**< pricing is aborted, if fac * price_maxvars pricing candidates were
344 * found */
345 #define SCIP_DEFAULT_PRICE_MAXVARS 100 /**< maximal number of variables priced in per pricing round */
346 #define SCIP_DEFAULT_PRICE_MAXVARSROOT 2000 /**< maximal number of priced variables at the root node */
347 #define SCIP_DEFAULT_PRICE_DELVARS FALSE /**< should variables created at the current node be deleted when the node is solved
348 * in case they are not present in the LP anymore? */
349 #define SCIP_DEFAULT_PRICE_DELVARSROOT FALSE /**< should variables created at the root node be deleted when the root is solved
350 * in case they are not present in the LP anymore? */
351
352 /* Decomposition */
353 #define SCIP_DEFAULT_DECOMP_BENDERSLABELS FALSE /**< should the variables be labelled for the application of Benders' decomposition */
354 #define SCIP_DEFAULT_DECOMP_APPLYBENDERS FALSE /**< if a decomposition exists, should Benders' decomposition be applied? */
355 #define SCIP_DEFAULT_DECOMP_MAXGRAPHEDGE 10000 /**< maximum number of edges in block graph computation (-1: no limit, 0: disable block graph computation) */
356 #define SCIP_DEFAULT_DECOMP_DISABLEMEASURES FALSE /**< disable expensive measures */
357
358 /* Benders' decomposition */
359 #define SCIP_DEFAULT_BENDERS_SOLTOL 1e-6 /**< the tolerance used to determine optimality in Benders' decomposition */
360 #define SCIP_DEFAULT_BENDERS_CUTLPSOL TRUE /**< should Benders' cuts be generated from the LP solution? */
361 #define SCIP_DEFAULT_BENDERS_COPYBENDERS TRUE /**< should Benders' decomposition be copied for sub-SCIPs? */
362
363 /* Reoptimization */
364
365 #define SCIP_DEFAULT_REOPT_OBJSIMSOL -1.0 /**< re-use stored solutions only if the similarity of the new and the old objective
366 function is greater or equal than this value */
367 #define SCIP_DEFAULT_REOPT_OBJSIMROOTLP 0.8 /**< similarity of two sequential objective function to disable solving the root LP. */
368 #define SCIP_DEFAULT_REOPT_OBJSIMDELAY -1.0 /**< start reoptimizing the search if the new objective function has similarity of
369 * at least SCIP_DEFAULT_REOPT_DELAY w.r.t. the previous objective function. */
370 #define SCIP_DEFAULT_REOPT_VARORDERINTERDICTION 'd' /** use 'd'efault, 'r'andom or 'i'nference score for variable
371 * ordering when performing interdiction branching during
372 * reoptimization of nodes
373 */
374 #define SCIP_DEFAULT_REOPT_MAXSAVEDNODES INT_MAX/**< maximum number of saved nodes */
375 #define SCIP_DEFAULT_REOPT_MAXDIFFOFNODES INT_MAX/**< maximum number of bound changes of two ancestor nodes
376 * such that the path get not shrunk */
377 #define SCIP_DEFAULT_REOPT_FORCEHEURRESTART 3 /**< force a restart if the last n optimal solutions are found by
378 * reoptsols heuristic
379 */
380 #define SCIP_DEFAULT_REOPT_SAVESOLS INT_MAX/**< save n best solutions found so far. */
381 #define SCIP_DEFAULT_REOPT_SOLVELP 1 /**< strategy for solving the LP at nodes from reoptimization */
382 #define SCIP_DEFAULT_REOPT_SOLVELPDIFF 1 /**< difference of path length between two ancestor nodes to solve the LP */
383 #define SCIP_DEFAULT_REOPT_ENABLE FALSE /**< enable reoptimization */
384 #define SCIP_DEFAULT_REOPT_SEPAGLBINFSUBTREES TRUE/**< save global constraints to separate infeasible subtrees */
385 #define SCIP_DEFAULT_REOPT_SEPABESTSOL FALSE /**< separate the optimal solution, e.g., for solving constraint shortest
386 * path problems
387 */
388 #define SCIP_DEFAULT_REOPT_STOREVARHISTOTY FALSE/**< use the variable history of the previous solve if the objective
389 * function has changed only slightly
390 */
391 #define SCIP_DEFAULT_REOPT_USEPSCOST FALSE /**< re-use pseudo costs of the objective function changed only slightly */
392 #define SCIP_DEFAULT_REOPT_COMMONTIMELIMIT FALSE/**< is the given time limit for all reoptimization round? */
393 #define SCIP_DEFAULT_REOPT_SHRINKINNER TRUE /**< replace branched transit nodes by their child nodes, if the number
394 * of bound changes is not to large
395 */
396 #define SCIP_DEFAULT_REOPT_STRONGBRANCHINIT TRUE/**< try to fix variables before reoptimizing by probing like strong
397 * branching
398 */
399 #define SCIP_DEFAULT_REOPT_REDUCETOFRONTIER TRUE/**< delete stored nodes which were not reoptimized */
400 #define SCIP_DEFAULT_REOPT_SAVECONSPROP FALSE/**< save constraint propagation */
401 #define SCIP_DEFAULT_REOPT_USESPLITCONS TRUE /**< use constraints to reconstruct the subtree pruned be dual reduction
402 * when reactivating the node
403 */
404 #define SCIP_DEFAULT_REOPT_USECUTS FALSE /**< reoptimize cuts found at the root node */
405 #define SCIP_DEFAULT_REOPT_MAXCUTAGE 0 /**< maximal age of a cut to be use for reoptimization */
406
407 /* Propagating */
408
409 #define SCIP_DEFAULT_PROP_MAXROUNDS 100 /**< maximal number of propagation rounds per node (-1: unlimited) */
410 #define SCIP_DEFAULT_PROP_MAXROUNDSROOT 1000 /**< maximal number of propagation rounds in root node (-1: unlimited) */
411 #define SCIP_DEFAULT_PROP_ABORTONCUTOFF TRUE /**< should propagation be aborted immediately? setting this to FALSE could
412 * help conflict analysis to produce more conflict constraints */
413
414
415 /* Separation */
416
417 #define SCIP_DEFAULT_SEPA_MAXBOUNDDIST 1.0 /**< maximal relative distance from current node's dual bound to primal
418 * bound compared to best node's dual bound for applying separation
419 * (0.0: only on current best node, 1.0: on all nodes) */
420 #define SCIP_DEFAULT_SEPA_MAXLOCALBOUNDDIST 0.0 /**< maximal relative distance from current node's dual bound to primal
421 * bound compared to best node's dual bound for applying local separation
422 * (0.0: only on current best node, 1.0: on all nodes) */
423 #define SCIP_DEFAULT_SEPA_MAXCOEFRATIO 1e+4 /**< maximal ratio between coefficients in strongcg, cmir, and flowcover cuts */
424 #define SCIP_DEFAULT_SEPA_MAXCOEFRATIOFACROWPREP 10.0 /**< maximal ratio between coefficients (as factor of 1/feastol) to ensure in rowprep cleanup */
425 #define SCIP_DEFAULT_SEPA_MINEFFICACY 1e-4 /**< minimal efficacy for a cut to enter the LP */
426 #define SCIP_DEFAULT_SEPA_MINEFFICACYROOT 1e-4 /**< minimal efficacy for a cut to enter the LP in the root node */
427 #define SCIP_DEFAULT_SEPA_ORTHOFUNC 'e' /**< function used for calc. scalar prod. in orthogonality test ('e'uclidean, 'd'iscrete) */
428 #define SCIP_DEFAULT_SEPA_EFFICACYNORM 'e' /**< row norm to use for efficacy calculation ('e'uclidean, 'm'aximum,
429 * 's'um, 'd'iscrete) */
430 #define SCIP_DEFAULT_SEPA_CUTSELRESTART 'a' /**< cut selection during restart ('a'ge, activity 'q'uotient) */
431 #define SCIP_DEFAULT_SEPA_CUTSELSUBSCIP 'a' /**< cut selection for sub SCIPs ('a'ge, activity 'q'uotient) */
432 #define SCIP_DEFAULT_SEPA_FILTERCUTPOOLREL TRUE /**< should cutpool separate only cuts with high relative efficacy? */
433 #define SCIP_DEFAULT_SEPA_MAXRUNS -1 /**< maximal number of runs for which separation is enabled (-1: unlimited) */
434 #define SCIP_DEFAULT_SEPA_MAXROUNDS -1 /**< maximal number of separation rounds per node (-1: unlimited) */
435 #define SCIP_DEFAULT_SEPA_MAXROUNDSROOT -1 /**< maximal number of separation rounds in the root node (-1: unlimited) */
436 #define SCIP_DEFAULT_SEPA_MAXROUNDSROOTSUBRUN -1 /**< maximal number of separation rounds in the root node of a subsequent run (-1: unlimited) */
437 #define SCIP_DEFAULT_SEPA_MAXADDROUNDS 1 /**< maximal additional number of separation rounds in subsequent
438 * price-and-cut loops (-1: no additional restriction) */
439 #define SCIP_DEFAULT_SEPA_MAXSTALLROUNDSROOT 10 /**< maximal number of consecutive separation rounds without objective
440 * or integrality improvement in the root node (-1: no additional restriction) */
441 #define SCIP_DEFAULT_SEPA_MAXSTALLROUNDS 1 /**< maximal number of consecutive separation rounds without objective
442 * or integrality improvement in local nodes (-1: no additional restriction) */
443 #define SCIP_DEFAULT_SEPA_MAXCUTS 100 /**< maximal number of cuts separated per separation round */
444 #define SCIP_DEFAULT_SEPA_MAXCUTSROOT 2000 /**< maximal separated cuts at the root node */
445 #define SCIP_DEFAULT_SEPA_CUTAGELIMIT 80 /**< maximum age a cut can reach before it is deleted from global cut pool
446 * (-1: cuts are never deleted from the global cut pool) */
447 #define SCIP_DEFAULT_SEPA_POOLFREQ 10 /**< separation frequency for the global cut pool */
448 #define SCIP_DEFAULT_SEPA_MINACTIVITYQUOT 0.8 /**< minimum cut activity quotient to convert cuts into constraints
449 * during a restart (0.0: all cuts are converted) */
450
451 /* Parallel */
452 #define SCIP_DEFAULT_PARALLEL_MODE 1 /**< the mode for the parallel implementation. Either 0: opportunistic or
453 * 1: deterministic */
454 #define SCIP_DEFAULT_PARALLEL_MINNTHREADS 1 /**< the minimum number of threads used in parallel code */
455 #define SCIP_DEFAULT_PARALLEL_MAXNTHREADS 8 /**< the maximum number of threads used in parallel code */
456
457 /* Concurrent solvers */
458 #define SCIP_DEFAULT_CONCURRENT_CHANGESEEDS TRUE /**< should the concurrent solvers use different random seeds? */
459 #define SCIP_DEFAULT_CONCURRENT_CHANGECHILDSEL TRUE /**< should the concurrent solvers use different child selection rules? */
460 #define SCIP_DEFAULT_CONCURRENT_COMMVARBNDS TRUE /**< should the concurrent solvers communicate variable bounds? */
461 #define SCIP_DEFAULT_CONCURRENT_PRESOLVEBEFORE TRUE /**< should the problem be presolved before it is copied to the concurrent solvers? */
462 #define SCIP_DEFAULT_CONCURRENT_INITSEED 5131912 /**< the seed used to initialize the random seeds for the concurrent solvers */
463 #define SCIP_DEFAULT_CONCURRENT_FREQINIT 10.0 /**< initial frequency of synchronization with other threads
464 * (fraction of time required for solving the root LP) */
465 #define SCIP_DEFAULT_CONCURRENT_FREQMAX 10.0 /**< maximal frequency of synchronization with other threads
466 * (fraction of time required for solving the root LP) */
467 #define SCIP_DEFAULT_CONCURRENT_FREQFACTOR 1.5 /**< factor by which the frequency of synchronization is changed */
468 #define SCIP_DEFAULT_CONCURRENT_TARGETPROGRESS 0.001 /**< when adapting the synchronization frequency this value is the targeted
469 * relative difference by which the absolute gap decreases per synchronization */
470 #define SCIP_DEFAULT_CONCURRENT_MAXNSOLS 3 /**< maximum number of solutions that will be shared in a single synchronization */
471 #define SCIP_DEFAULT_CONCURRENT_MAXNSYNCDELAY 7 /**< maximum number of synchronizations before reading is enforced regardless of delay */
472 #define SCIP_DEFAULT_CONCURRENT_MINSYNCDELAY 10.0 /**< minimum delay before synchronization data is read */
473 #define SCIP_DEFAULT_CONCURRENT_NBESTSOLS 10 /**< how many of the N best solutions should be considered for synchronization */
474 #define SCIP_DEFAULT_CONCURRENT_PARAMSETPREFIX "" /**< path prefix for parameter setting files of concurrent solvers */
475
476
477 /* Timing */
478
479 #define SCIP_DEFAULT_TIME_CLOCKTYPE SCIP_CLOCKTYPE_WALL /**< default clock type for timing */
480 #define SCIP_DEFAULT_TIME_ENABLED TRUE /**< is timing enabled? */
481 #define SCIP_DEFAULT_TIME_READING FALSE /**< belongs reading time to solving time? */
482 #define SCIP_DEFAULT_TIME_RARECLOCKCHECK FALSE /**< should clock checks of solving time be performed less frequently (might exceed time limit slightly) */
483 #define SCIP_DEFAULT_TIME_STATISTICTIMING TRUE /**< should timing for statistic output be enabled? */
484 #define SCIP_DEFAULT_TIME_NLPIEVAL FALSE /**< should time for evaluation in NLP solves be measured? */
485
486
487 /* visualization output */
488
489 #define SCIP_DEFAULT_VISUAL_VBCFILENAME "-" /**< name of the VBC tool output file, or "-" if no VBC tool output should be created */
490 #define SCIP_DEFAULT_VISUAL_BAKFILENAME "-" /**< name of the BAK tool output file, or "-" if no BAK tool output should be created */
491 #define SCIP_DEFAULT_VISUAL_REALTIME TRUE /**< should the real solving time be used instead of a time step counter in visualization? */
492 #define SCIP_DEFAULT_VISUAL_DISPSOLS FALSE /**< should the node where solutions are found be visualized? */
493 #define SCIP_DEFAULT_VISUAL_DISPLB FALSE /**< should lower bound information be visualized? */
494 #define SCIP_DEFAULT_VISUAL_OBJEXTERN TRUE /**< should be output the external value of the objective? */
495
496
497 /* Reading */
498
499 #define SCIP_DEFAULT_READ_INITIALCONSS TRUE /**< should model constraints be marked as initial? */
500 #define SCIP_DEFAULT_READ_DYNAMICCONSS TRUE /**< should model constraints be subject to aging? */
501 #define SCIP_DEFAULT_READ_DYNAMICCOLS FALSE /**< should columns be added and removed dynamically to the LP? */
502 #define SCIP_DEFAULT_READ_DYNAMICROWS FALSE /**< should rows be added and removed dynamically to the LP? */
503 #define SCIP_DEFAULT_WRITE_GENNAMES_OFFSET 0 /**< when writing the problem with generic names, we start with index
504 * 0; using this parameter we can change the starting index to be
505 * different */
506
507
508 /* Writing */
509
510 #define SCIP_DEFAULT_WRITE_ALLCONSS FALSE /**< should all constraints be written (including the redundant constraints)? */
511 #define SCIP_DEFAULT_PRINTZEROS FALSE /**< should variables set to zero be printed? */
512
513
514
515 /** calculate memory size for dynamically allocated arrays */
516 static
517 int calcGrowSize(
518 int initsize, /**< initial size of array */
519 SCIP_Real growfac, /**< growing factor of array */
520 int num /**< minimum number of entries to store */
521 )
522 {
523 int size;
524
525 assert(initsize >= 0);
526 assert(growfac >= 1.0);
527 assert(num >= 0);
528
529 if( growfac == 1.0 )
530 size = MAX(initsize, num);
531 else
532 {
533 int oldsize;
534
535 /* calculate the size with this loop, such that the resulting numbers are always the same (-> block memory) */
536 initsize = MAX(initsize, 4);
537 size = initsize;
538 oldsize = size - 1;
539
540 /* second condition checks against overflow */
541 while( size < num && size > oldsize )
542 {
543 oldsize = size;
544 size = (int)(growfac * size + initsize);
545 }
546
547 /* if an overflow happened, set the correct value */
548 if( size <= oldsize )
549 size = num;
550 }
551
552 assert(size >= initsize);
553 assert(size >= num);
554
555 return size;
556 }
557
558
559 /** information method for a parameter change of feastol */
560 static
561 SCIP_DECL_PARAMCHGD(paramChgdFeastol)
562 { /*lint --e{715}*/
563 SCIP_Real newfeastol;
564
565 newfeastol = SCIPparamGetReal(param);
566
567 /* change the feastol through the SCIP call in order to adjust LP's feastol if necessary */
568 SCIP_CALL( SCIPchgFeastol(scip, newfeastol) );
569
570 return SCIP_OKAY;
571 }
572
573 /** information method for a parameter change of lpfeastolfactor */
574 static
575 SCIP_DECL_PARAMCHGD(paramChgdLPFeastolFactor)
576 { /*lint --e{715}*/
577 SCIP_Real newlpfeastolfactor;
578
579 newlpfeastolfactor = SCIPparamGetReal(param);
580
581 if( SCIPgetStage(scip) == SCIP_STAGE_SOLVING && SCIPgetLPFeastol(scip) > newlpfeastolfactor * SCIPfeastol(scip) )
582 {
583 /* reset the LP feastol to ensure that it does not exceed newlpfeastolfactor * SCIP's feastol
584 * this also marks the LP unsolved
585 */
586 SCIPresetLPFeastol(scip);
587 }
588
589 return SCIP_OKAY;
590 }
591
592 /** information method for a parameter change of dualfeastol */
593 static
594 SCIP_DECL_PARAMCHGD(paramChgdDualfeastol)
595 { /*lint --e{715}*/
596 SCIP_Real newdualfeastol;
597
598 newdualfeastol = SCIPparamGetReal(param);
599
600 /* change the dualfeastol through the SCIP call in order to mark the LP unsolved */
601 SCIP_CALL( SCIPchgDualfeastol(scip, newdualfeastol) );
602
603 return SCIP_OKAY;
604 }
605
606 /** information method for a parameter change of barrierconvtol */
607 static
608 SCIP_DECL_PARAMCHGD(paramChgdBarrierconvtol)
609 { /*lint --e{715}*/
610 SCIP_Real newbarrierconvtol;
611
612 newbarrierconvtol = SCIPparamGetReal(param);
613
614 /* change the barrierconvtol through the SCIP call in order to mark the LP unsolved */
615 SCIP_CALL( SCIPchgBarrierconvtol(scip, newbarrierconvtol) );
616
617 return SCIP_OKAY;
618 }
619
620 /** information method for a parameter change of infinity value */
621 static
622 SCIP_DECL_PARAMCHGD(paramChgdInfinity)
623 { /*lint --e{715}*/
624 SCIP_Real infinity;
625
626 infinity = SCIPparamGetReal(param);
627
628 /* Check that infinity value of LP-solver is at least as large as the one used in SCIP. This is necessary, because we
629 * transfer SCIP infinity values to the ones by the LPI, but not the converse. */
630 if ( scip->lp != NULL && scip->lp->lpi != NULL && infinity > SCIPlpiInfinity(scip->lp->lpi) )
631 {
632 SCIPerrorMessage("The infinity value of the LP solver has to be at least as large as the one of SCIP.\n");
633 return SCIP_PARAMETERWRONGVAL;
634 }
635
636 return SCIP_OKAY;
637 }
638
639 /** parameter change information method to autoselect display columns again */
640 static
641 SCIP_DECL_PARAMCHGD(SCIPparamChgdDispWidth)
642 { /*lint --e{715}*/
643 /* automatically select the new active display columns */
644 SCIP_CALL( SCIPautoselectDisps(scip) );
645
646 return SCIP_OKAY;
647 }
648
649 /** parameter change information method that some limit was changed */
650 static
651 SCIP_DECL_PARAMCHGD(SCIPparamChgdLimit)
652 { /*lint --e{715}*/
653 SCIPmarkLimitChanged(scip);
654 return SCIP_OKAY;
655 }
656
657 /** information method for a parameter change of mem_arraygrowfac */
658 static
659 SCIP_DECL_PARAMCHGD(paramChgdArraygrowfac)
660 { /*lint --e{715}*/
661 SCIP_Real newarraygrowfac;
662
663 newarraygrowfac = SCIPparamGetReal(param);
664
665 /* change arraygrowfac */
666 BMSsetBufferMemoryArraygrowfac(SCIPbuffer(scip), newarraygrowfac);
667 BMSsetBufferMemoryArraygrowfac(SCIPcleanbuffer(scip), newarraygrowfac);
668
669 return SCIP_OKAY;
670 }
671
672 /** information method for a parameter change of mem_arraygrowinit */
673 static
674 SCIP_DECL_PARAMCHGD(paramChgdArraygrowinit)
675 { /*lint --e{715}*/
676 int newarraygrowinit;
677
678 newarraygrowinit = SCIPparamGetInt(param);
679
680 /* change arraygrowinit */
681 BMSsetBufferMemoryArraygrowinit(SCIPbuffer(scip), newarraygrowinit);
682 BMSsetBufferMemoryArraygrowinit(SCIPcleanbuffer(scip), newarraygrowinit);
683
684 return SCIP_OKAY;
685 }
686
687 /** information method for a parameter change of reopt_enable */
688 static
689 SCIP_DECL_PARAMCHGD(paramChgdEnableReopt)
690 { /*lint --e{715}*/
691 SCIP_RETCODE retcode;
692
693 assert( scip != NULL );
694 assert( param != NULL );
695
696 /* create or deconstruct the reoptimization data structures */
697 retcode = SCIPenableReoptimization(scip, SCIPparamGetBool(param));
698
699 /* an appropriate error message is already printed in the above method */
700 if( retcode == SCIP_INVALIDCALL )
701 return SCIP_PARAMETERWRONGVAL;
702
703 return SCIP_OKAY;
704 }
705
706 /** information method for a parameter change of usesymmetry */
707 static
708 SCIP_DECL_PARAMCHGD(paramChgdUsesymmetry)
709 { /*lint --e{715}*/
710 assert( scip != NULL );
711 assert( param != NULL );
712
713 if ( SCIPgetStage(scip) >= SCIP_STAGE_INITPRESOLVE && SCIPgetStage(scip) <= SCIP_STAGE_SOLVED )
714 {
715 if ( SCIPparamGetInt(param) > 0 )
716 {
717 SCIPerrorMessage("Cannot turn on symmetry handling during (pre)solving or change method.\n");
718 return SCIP_PARAMETERWRONGVAL;
719 }
720 }
721
722 return SCIP_OKAY;
723 }
724
725 /** set parameters for reoptimization */
726 SCIP_RETCODE SCIPsetSetReoptimizationParams(
727 SCIP_SET* set, /**< SCIP data structure */
728 SCIP_MESSAGEHDLR* messagehdlr /**< message handler */
729 )
730 {
731 assert(set != NULL);
732 assert(messagehdlr != NULL);
733
734 if( set->reopt_enable )
735 {
736 /* disable some parts of conflict analysis */
737 SCIP_CALL( SCIPsetSetCharParam(set, messagehdlr, "conflict/useboundlp", 'o') );
738 SCIP_CALL( SCIPsetSetBoolParam(set, messagehdlr, "conflict/usepseudo", FALSE) );
739
740 /* TODO check wheather multi aggregation can be enabled in reoptimization */
741 if( SCIPsetIsParamFixed(set, "presolving/donotmultaggr") )
742 {
743 SCIP_CALL( SCIPsetChgParamFixed(set, "presolving/donotmultaggr", FALSE) );
744 }
745 SCIP_CALL( SCIPsetSetBoolParam(set, messagehdlr, "presolving/donotmultaggr", TRUE) );
746
747 if( SCIPsetIsParamFixed(set, "branching/nodereopt/priority") )
748 {
749 SCIP_CALL( SCIPsetChgParamFixed(set, "branching/nodereopt/priority", FALSE) );
750 }
751 SCIP_CALL( SCIPsetSetIntParam(set, messagehdlr, "branching/nodereopt/priority", INT_MAX/4) );
752 }
753 else
754 {
755 /* disable conflict analysis */
756 if( SCIPsetIsParamFixed(set, "conflict/enable") )
757 {
758 SCIP_CALL( SCIPsetChgParamFixed(set, "conflict/enable", FALSE) );
759 }
760 SCIP_CALL( SCIPsetResetParam(set, messagehdlr, "conflict/enable") );
761
762 /* TODO check wheather multi aggregation can be enabled in reoptimization */
763 if( SCIPsetIsParamFixed(set, "presolving/donotmultaggr") )
764 {
765 SCIP_CALL( SCIPsetChgParamFixed(set, "presolving/donotmultaggr", FALSE) );
766 }
767 SCIP_CALL( SCIPsetResetParam(set, messagehdlr, "presolving/donotmultaggr") );
768
769 /* set priority to defeault */
770 if( SCIPsetFindBranchrule(set, "nodereopt") != NULL )
771 {
772 if( SCIPsetIsParamFixed(set, "branching/nodereopt/priority") )
773 {
774 SCIP_CALL( SCIPsetChgParamFixed(set, "branching/nodereopt/priority", FALSE) );
775 }
776 SCIP_CALL( SCIPsetResetParam(set, messagehdlr, "branching/nodereopt/priority") );
777 }
778 }
779
780 return SCIP_OKAY;
781 }
782
783 /** enable or disable all plugin timers depending on the value of the flag \p enabled */
784 void SCIPsetEnableOrDisablePluginClocks(
785 SCIP_SET* set, /**< SCIP settings */
786 SCIP_Bool enabled /**< should plugin clocks be enabled? */
787 )
788 {
789 int i;
790
791 assert(set != NULL);
792
793 /* go through all plugin types and enable or disable their respective clocks */
794 for( i = set->nreaders - 1; i >= 0; --i )
795 SCIPreaderEnableOrDisableClocks(set->readers[i], enabled);
796
797 for( i = set->npricers - 1; i >= 0; --i )
798 SCIPpricerEnableOrDisableClocks(set->pricers[i], enabled);
799
800 for( i = set->nconshdlrs - 1; i >= 0; --i )
801 SCIPconshdlrEnableOrDisableClocks(set->conshdlrs[i], enabled);
802
803 for( i = set->nconflicthdlrs - 1; i >= 0; --i )
804 SCIPconflicthdlrEnableOrDisableClocks(set->conflicthdlrs[i], enabled);
805
806 for( i = set->npresols - 1; i >= 0; --i )
807 SCIPpresolEnableOrDisableClocks(set->presols[i], enabled);
808
809 for( i = set->nrelaxs - 1; i >= 0; --i )
810 SCIPrelaxEnableOrDisableClocks(set->relaxs[i], enabled);
811
812 for( i = set->nsepas - 1; i >= 0; --i )
813 SCIPsepaEnableOrDisableClocks(set->sepas[i], enabled);
814
815 for( i = set->nprops - 1; i >= 0; --i )
816 SCIPpropEnableOrDisableClocks(set->props[i], enabled);
817
818 for( i = set->nheurs - 1; i >= 0; --i )
819 SCIPheurEnableOrDisableClocks(set->heurs[i], enabled);
820
821 for( i = set->neventhdlrs - 1; i >= 0; --i )
822 SCIPeventhdlrEnableOrDisableClocks(set->eventhdlrs[i], enabled);
823
824 for( i = set->nnodesels - 1; i >= 0; --i )
825 SCIPnodeselEnableOrDisableClocks(set->nodesels[i], enabled);
826
827 for ( i = set->ncutsels - 1; i >= 0; --i )
828 SCIPcutselEnableOrDisableClocks(set->cutsels[i], enabled);
829
830 for( i = set->nbranchrules - 1; i >= 0; --i )
831 SCIPbranchruleEnableOrDisableClocks(set->branchrules[i], enabled);
832 }
833
834 /* method to be invoked when the parameter timing/statistictiming is changed */
835 static
836 SCIP_DECL_PARAMCHGD(paramChgdStatistictiming)
837 { /*lint --e{715}*/
838 SCIP_CALL( SCIPenableOrDisableStatisticTiming(scip) );
839
840 return SCIP_OKAY;
841 }
842
843 /** copies plugins from sourcescip to targetscip; in case that a constraint handler which does not need constraints
844 * cannot be copied, valid will return FALSE. All plugins can declare that, if their copy process failed, the
845 * copied SCIP instance might not represent the same problem semantics as the original.
846 * Note that in this case dual reductions might be invalid. */
847 SCIP_RETCODE SCIPsetCopyPlugins(
848 SCIP_SET* sourceset, /**< source SCIP_SET data structure */
849 SCIP_SET* targetset, /**< target SCIP_SET data structure */
850 SCIP_Bool copyreaders, /**< should the file readers be copied */
851 SCIP_Bool copypricers, /**< should the variable pricers be copied */
852 SCIP_Bool copyconshdlrs, /**< should the constraint handlers be copied */
853 SCIP_Bool copyconflicthdlrs, /**< should the conflict handlers be copied */
854 SCIP_Bool copypresolvers, /**< should the presolvers be copied */
855 SCIP_Bool copyrelaxators, /**< should the relaxators be copied */
856 SCIP_Bool copyseparators, /**< should the separators be copied */
857 SCIP_Bool copycutselectors, /**< should the cut selectors be copied */
858 SCIP_Bool copypropagators, /**< should the propagators be copied */
859 SCIP_Bool copyheuristics, /**< should the heuristics be copied */
860 SCIP_Bool copyeventhdlrs, /**< should the event handlers be copied */
861 SCIP_Bool copynodeselectors, /**< should the node selectors be copied */
862 SCIP_Bool copybranchrules, /**< should the branchrules be copied */
863 SCIP_Bool copydisplays, /**< should the display columns be copied */
864 SCIP_Bool copydialogs, /**< should the dialogs be copied */
865 SCIP_Bool copytables, /**< should the statistics tables be copied */
866 SCIP_Bool copyexprhdlrs, /**< should the expression handlers be copied */
867 SCIP_Bool copynlpis, /**< should the NLP interfaces be copied */
868 SCIP_Bool* allvalid /**< pointer to store whether all plugins were validly copied */
869 )
870 {
871 int p;
872 SCIP_Bool valid;
873
874 assert(sourceset != NULL);
875 assert(targetset != NULL);
876 assert(sourceset != targetset);
877 assert(allvalid != NULL);
878
879 *allvalid = TRUE;
880
881 /* copy all dialog plugins */
882 if( copydialogs && sourceset->dialogs != NULL )
883 {
884 for( p = sourceset->ndialogs - 1; p >= 0; --p )
885 {
886 /* @todo: the copying process of dialog handlers is currently not checked for consistency */
887 SCIP_CALL( SCIPdialogCopyInclude(sourceset->dialogs[p], targetset) );
888 }
889 }
890
891 /* copy all reader plugins */
892 if( copyreaders && sourceset->readers != NULL )
893 {
894 for( p = sourceset->nreaders - 1; p >= 0; --p )
895 {
896 SCIP_CALL( SCIPreaderCopyInclude(sourceset->readers[p], targetset) );
897 }
898 }
899
900 /* copy all variable pricer plugins */
901 if( copypricers && sourceset->pricers != NULL )
902 {
903 for( p = sourceset->npricers - 1; p >= 0; --p )
904 {
905 valid = FALSE;
906 SCIP_CALL( SCIPpricerCopyInclude(sourceset->pricers[p], targetset, &valid) );
907 *allvalid = *allvalid && valid;
908 if( SCIPpricerIsActive(sourceset->pricers[p]) )
909 {
910 SCIP_CALL( SCIPactivatePricer(targetset->scip, targetset->pricers[p]) );
911 }
912 }
913 }
914
915 /* copy all constraint handler plugins */
916 if( copyconshdlrs && sourceset->conshdlrs_include != NULL )
917 {
918 /* copy them in order they were added to the sourcescip
919 *
920 * @note we only have to set the valid pointer to FALSE in case that a constraint handler, which does not need
921 * constraints, does not copy; in the case that a constraint handler does not copy and it needs constraint
922 * we will detect later that the problem is not valid if a constraint of that type exits
923 */
924 for( p = 0; p < sourceset->nconshdlrs; ++p )
925 {
926 if( SCIPconshdlrIsClonable(sourceset->conshdlrs_include[p]) )
927 {
928 valid = FALSE;
929 SCIP_CALL( SCIPconshdlrCopyInclude(sourceset->conshdlrs_include[p], targetset, &valid) );
930 *allvalid = *allvalid && valid;
931 SCIPsetDebugMsg(sourceset, "Copying conshdlr <%s> was%s valid.\n", SCIPconshdlrGetName(sourceset->conshdlrs_include[p]), valid ? "" : " not");
932 }
933 else if( !SCIPconshdlrNeedsCons(sourceset->conshdlrs_include[p]) )
934 {
935 SCIPsetDebugMsg(sourceset, "Copying Conshdlr <%s> without constraints not valid.\n", SCIPconshdlrGetName(sourceset->conshdlrs_include[p]));
936 *allvalid = FALSE;
937 }
938 }
939 }
940
941 /* copy all conflict handler plugins */
942 if( copyconflicthdlrs && sourceset->conflicthdlrs != NULL )
943 {
944 for( p = sourceset->nconflicthdlrs - 1; p >= 0; --p )
945 {
946 SCIP_CALL( SCIPconflicthdlrCopyInclude(sourceset->conflicthdlrs[p], targetset) );
947 }
948 }
949
950 /* copy all presolver plugins */
951 if( copypresolvers && sourceset->presols != NULL )
952 {
953 for( p = sourceset->npresols - 1; p >= 0; --p )
954 {
955 SCIP_CALL( SCIPpresolCopyInclude(sourceset->presols[p], targetset) );
956 }
957 }
958
959 /* copy all relaxator plugins */
960 if( copyrelaxators && sourceset->relaxs != NULL )
961 {
962 for( p = sourceset->nrelaxs - 1; p >= 0; --p )
963 {
964 SCIP_CALL( SCIPrelaxCopyInclude(sourceset->relaxs[p], targetset) );
965 }
966 }
967
968 /* copy all separator plugins */
969 if( copyseparators && sourceset->sepas != NULL )
970 {
971 for( p = sourceset->nsepas - 1; p >= 0; --p )
972 {
973 SCIP_CALL( SCIPsepaCopyInclude(sourceset->sepas[p], targetset) );
974 }
975 }
976
977 /* copy all cut selector plugins */
978 if( copycutselectors && sourceset->cutsels != NULL )
979 {
980 for( p = sourceset->ncutsels - 1; p >= 0; --p )
981 {
982 SCIP_CALL( SCIPcutselCopyInclude(sourceset->cutsels[p], targetset) );
983 }
984 }
985
986 /* copy all propagators plugins */
987 if( copypropagators && sourceset->props != NULL )
988 {
989 for( p = sourceset->nprops - 1; p >= 0; --p )
990 {
991 SCIP_CALL( SCIPpropCopyInclude(sourceset->props[p], targetset) );
992 }
993 }
994
995 /* copy all primal heuristics plugins */
996 if( copyheuristics && sourceset->heurs != NULL )
997 {
998 for( p = sourceset->nheurs - 1; p >= 0; --p )
999 {
1000 SCIP_CALL( SCIPheurCopyInclude(sourceset->heurs[p], targetset) );
1001 }
1002 }
1003
1004 /* copy all event handler plugins */
1005 if( copyeventhdlrs && sourceset->eventhdlrs != NULL )
1006 {
1007 for( p = sourceset->neventhdlrs - 1; p >= 0; --p )
1008 {
1009 /* @todo: the copying process of event handlers is currently not checked for consistency */
1010 SCIP_CALL( SCIPeventhdlrCopyInclude(sourceset->eventhdlrs[p], targetset) );
1011 }
1012 }
1013
1014 /* copy all node selector plugins */
1015 if( copynodeselectors && sourceset->nodesels != NULL )
1016 {
1017 for( p = sourceset->nnodesels - 1; p >= 0; --p )
1018 {
1019 SCIP_CALL( SCIPnodeselCopyInclude(sourceset->nodesels[p], targetset) );
1020 }
1021 }
1022
1023 /* copy all branchrule plugins */
1024 if( copybranchrules && sourceset->branchrules != NULL )
1025 {
1026 for( p = sourceset->nbranchrules - 1; p >= 0; --p )
1027 {
1028 SCIP_CALL( SCIPbranchruleCopyInclude(sourceset->branchrules[p], targetset) );
1029 }
1030 }
1031
1032 /* copy all display plugins */
1033 if( copydisplays && sourceset->disps != NULL )
1034 {
1035 for( p = sourceset->ndisps - 1; p >= 0; --p )
1036 {
1037 SCIP_CALL( SCIPdispCopyInclude(sourceset->disps[p], targetset) );
1038 }
1039 }
1040
1041 /* copy all table plugins */
1042 if( copytables && sourceset->tables != NULL )
1043 {
1044 for( p = sourceset->ntables - 1; p >= 0; --p )
1045 {
1046 SCIP_CALL( SCIPtableCopyInclude(sourceset->tables[p], targetset) );
1047 }
1048 }
1049
1050 /* copy all expression handlers */
1051 if( copyexprhdlrs && sourceset->exprhdlrs != NULL )
1052 {
1053 for( p = sourceset->nexprhdlrs - 1; p >= 0; --p )
1054 {
1055 SCIP_CALL( SCIPexprhdlrCopyInclude(sourceset->exprhdlrs[p], targetset) );
1056 }
1057 }
1058
1059 /* copy all NLP interfaces */
1060 if( copynlpis && sourceset->nlpis != NULL )
1061 {
1062 for( p = sourceset->nnlpis - 1; p >= 0; --p )
1063 {
1064 SCIP_CALL( SCIPnlpiCopyInclude(sourceset->nlpis[p], targetset) );
1065 }
1066 }
1067
1068 return SCIP_OKAY;
1069 }
1070
1071
1072 /** copies parameters from sourcescip to targetscip */
1073 SCIP_RETCODE SCIPsetCopyParams(
1074 SCIP_SET* sourceset, /**< source SCIP_SET data structure */
1075 SCIP_SET* targetset, /**< target SCIP_SET data structure */
1076 SCIP_MESSAGEHDLR* messagehdlr /**< message handler of target SCIP */
1077 )
1078 {
1079 assert(sourceset != NULL);
1080 assert(targetset != NULL);
1081 assert(sourceset != targetset);
1082 assert(targetset->scip != NULL);
1083
1084 SCIP_CALL( SCIPparamsetCopyParams(sourceset->paramset, targetset->paramset, targetset, messagehdlr) );
1085
1086 return SCIP_OKAY;
1087 }
1088
1089 /** creates global SCIP settings */
1090 SCIP_RETCODE SCIPsetCreate(
1091 SCIP_SET** set, /**< pointer to SCIP settings */
1092 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
1093 BMS_BLKMEM* blkmem, /**< block memory */
1094 SCIP* scip /**< SCIP data structure */
1095 )
1096 {
1097 assert(set != NULL);
1098 assert(scip != NULL);
1099
1100 SCIP_ALLOC( BMSallocMemory(set) );
1101
1102 (*set)->stage = SCIP_STAGE_INIT;
1103 (*set)->scip = scip;
1104 (*set)->buffer = SCIPbuffer(scip);
1105 (*set)->cleanbuffer = SCIPcleanbuffer(scip);
1106
1107 SCIP_CALL( SCIPparamsetCreate(&(*set)->paramset, blkmem) );
1108
1109 (*set)->readers = NULL;
1110 (*set)->nreaders = 0;
1111 (*set)->readerssize = 0;
1112 (*set)->pricers = NULL;
1113 (*set)->npricers = 0;
1114 (*set)->nactivepricers = 0;
1115 (*set)->pricerssize = 0;
1116 (*set)->pricerssorted = FALSE;
1117 (*set)->pricersnamesorted = FALSE;
1118 (*set)->conshdlrs = NULL;
1119 (*set)->conshdlrs_sepa = NULL;
1120 (*set)->conshdlrs_enfo = NULL;
1121 (*set)->conshdlrs_include = NULL;
1122 (*set)->nconshdlrs = 0;
1123 (*set)->conshdlrssize = 0;
1124 (*set)->conflicthdlrs = NULL;
1125 (*set)->nconflicthdlrs = 0;
1126 (*set)->conflicthdlrssize = 0;
1127 (*set)->conflicthdlrssorted = FALSE;
1128 (*set)->conflicthdlrsnamesorted = FALSE;
1129 (*set)->benders = NULL;
1130 (*set)->nbenders = 0;
1131 (*set)->nactivebenders = 0;
1132 (*set)->benderssize = 0;
1133 (*set)->benderssorted = FALSE;
1134 (*set)->bendersnamesorted = FALSE;
1135
1136 (*set)->debugsoldata = NULL;
1137 SCIP_CALL( SCIPdebugSolDataCreate(&(*set)->debugsoldata) ); /*lint !e506 !e774*/
1138
1139 (*set)->presols = NULL;
1140 (*set)->npresols = 0;
1141 (*set)->presolssize = 0;
1142 (*set)->presolssorted = FALSE;
1143 (*set)->presolsnamesorted = FALSE;
1144 (*set)->relaxs = NULL;
1145 (*set)->nrelaxs = 0;
1146 (*set)->relaxssize = 0;
1147 (*set)->relaxssorted = FALSE;
1148 (*set)->relaxsnamesorted = FALSE;
1149 (*set)->sepas = NULL;
1150 (*set)->nsepas = 0;
1151 (*set)->sepassize = 0;
1152 (*set)->sepassorted = FALSE;
1153 (*set)->sepasnamesorted = FALSE;
1154 (*set)->props = NULL;
1155 (*set)->props_presol = NULL;
1156 (*set)->nprops = 0;
1157 (*set)->propssize = 0;
1158 (*set)->propssorted = FALSE;
1159 (*set)->propspresolsorted = FALSE;
1160 (*set)->propsnamesorted = FALSE;
1161 (*set)->concsolvertypes = NULL;
1162 (*set)->nconcsolvertypes = 0;
1163 (*set)->concsolvertypessize = 0;
1164 (*set)->concsolvers = NULL;
1165 (*set)->nconcsolvers = 0;
1166 (*set)->concsolverssize = 0;
1167 (*set)->concurrent_paramsetprefix = NULL;
1168 (*set)->cutsels = NULL;
1169 (*set)->ncutsels = 0;
1170 (*set)->cutselssize = 0;
1171 (*set)->cutselssorted = FALSE;
1172 (*set)->heurs = NULL;
1173 (*set)->nheurs = 0;
1174 (*set)->heurssize = 0;
1175 (*set)->heurssorted = FALSE;
1176 (*set)->heursnamesorted = FALSE;
1177 (*set)->comprs = NULL;
1178 (*set)->ncomprs = 0;
1179 (*set)->comprssize = 0;
1180 (*set)->comprssorted = FALSE;
1181 (*set)->comprsnamesorted = FALSE;
1182 (*set)->eventhdlrs = NULL;
1183 (*set)->neventhdlrs = 0;
1184 (*set)->eventhdlrssize = 0;
1185 (*set)->nodesels = NULL;
1186 (*set)->nnodesels = 0;
1187 (*set)->nodeselssize = 0;
1188 (*set)->nodesel = NULL;
1189 (*set)->branchrules = NULL;
1190 (*set)->nbranchrules = 0;
1191 (*set)->branchrulessize = 0;
1192 (*set)->branchrulessorted = FALSE;
1193 (*set)->branchrulesnamesorted = FALSE;
1194 (*set)->banditvtables = NULL;
1195 (*set)->banditvtablessize = 0;
1196 (*set)->nbanditvtables = 0;
1197 (*set)->disps = NULL;
1198 (*set)->ndisps = 0;
1199 (*set)->dispssize = 0;
1200 (*set)->tables = NULL;
1201 (*set)->ntables = 0;
1202 (*set)->tablessize = 0;
1203 (*set)->tablessorted = FALSE;
1204 (*set)->dialogs = NULL;
1205 (*set)->ndialogs = 0;
1206 (*set)->dialogssize = 0;
1207 (*set)->exprhdlrs = NULL;
1208 (*set)->exprhdlrvar = NULL;
1209 (*set)->exprhdlrval = NULL;
1210 (*set)->exprhdlrsum = NULL;
1211 (*set)->exprhdlrproduct = NULL;
1212 (*set)->exprhdlrpow = NULL;
1213 (*set)->nexprhdlrs = 0;
1214 (*set)->exprhdlrssize = 0;
1215 (*set)->exprhdlrssorted = FALSE;
1216 (*set)->nlpis = NULL;
1217 (*set)->nnlpis = 0;
1218 (*set)->nlpissize = 0;
1219 (*set)->nlpissorted = FALSE;
1220 (*set)->limitchanged = FALSE;
1221 (*set)->subscipsoff = FALSE;
1222 (*set)->extcodenames = NULL;
1223 (*set)->extcodedescs = NULL;
1224 (*set)->nextcodes = 0;
1225 (*set)->extcodessize = 0;
1226 (*set)->visual_vbcfilename = NULL;
1227 (*set)->visual_bakfilename = NULL;
1228 (*set)->nlp_solver = NULL;
1229 (*set)->nlp_disable = FALSE;
1230 (*set)->num_relaxfeastol = SCIP_INVALID;
1231 (*set)->misc_debugsol = NULL;
1232
1233 /* the default time limit is infinite */
1234 (*set)->istimelimitfinite = FALSE;
1235
1236 /* branching parameters */
1237 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1238 "branching/scorefunc",
1239 "branching score function ('s'um, 'p'roduct, 'q'uotient)",
1240 &(*set)->branch_scorefunc, TRUE, SCIP_DEFAULT_BRANCH_SCOREFUNC, "spq",
1241 NULL, NULL) );
1242 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1243 "branching/scorefac",
1244 "branching score factor to weigh downward and upward gain prediction in sum score function",
1245 &(*set)->branch_scorefac, TRUE, SCIP_DEFAULT_BRANCH_SCOREFAC, 0.0, 1.0,
1246 NULL, NULL) );
1247 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1248 "branching/preferbinary",
1249 "should branching on binary variables be preferred?",
1250 &(*set)->branch_preferbinary, FALSE, SCIP_DEFAULT_BRANCH_PREFERBINARY,
1251 NULL, NULL) );
1252 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1253 "branching/clamp",
1254 "minimal relative distance of branching point to bounds when branching on a continuous variable",
1255 &(*set)->branch_clamp, FALSE, SCIP_DEFAULT_BRANCH_CLAMP, 0.0, 0.5,
1256 NULL, NULL) );
1257 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1258 "branching/midpull",
1259 "fraction by which to move branching point of a continuous variable towards the middle of the domain; a value of 1.0 leads to branching always in the middle of the domain",
1260 &(*set)->branch_midpull, FALSE, SCIP_DEFAULT_BRANCH_MIDPULL, 0.0, 1.0,
1261 NULL, NULL) );
1262 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1263 "branching/midpullreldomtrig",
1264 "multiply midpull by relative domain width if the latter is below this value",
1265 &(*set)->branch_midpullreldomtrig, FALSE, SCIP_DEFAULT_BRANCH_MIDPULLRELDOMTRIG, 0.0, 1.0,
1266 NULL, NULL) );
1267 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1268 "branching/lpgainnormalize",
1269 "strategy for normalization of LP gain when updating pseudocosts of continuous variables (divide by movement of 'l'p value, reduction in 'd'omain width, or reduction in domain width of 's'ibling)",
1270 &(*set)->branch_lpgainnorm, FALSE, SCIP_DEFAULT_BRANCH_LPGAINNORMALIZE, "dls",
1271 NULL, NULL) );
1272 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1273 "branching/delaypscostupdate",
1274 "should updating pseudo costs for continuous variables be delayed to the time after separation?",
1275 &(*set)->branch_delaypscost, FALSE, SCIP_DEFAULT_BRANCH_DELAYPSCOST,
1276 NULL, NULL) );
1277 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1278 "branching/divingpscost",
1279 "should pseudo costs be updated also in diving and probing mode?",
1280 &(*set)->branch_divingpscost, FALSE, SCIP_DEFAULT_BRANCH_DIVINGPSCOST,
1281 NULL, NULL) );
1282 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1283 "branching/forceallchildren",
1284 "should all strong branching children be regarded even if one is detected to be infeasible? (only with propagation)",
1285 &(*set)->branch_forceall, TRUE, SCIP_DEFAULT_BRANCH_FORCEALL,
1286 NULL, NULL) );
1287 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1288 "branching/firstsbchild",
1289 "child node to be regarded first during strong branching (only with propagation): 'u'p child, 'd'own child, 'h'istory-based, or 'a'utomatic",
1290 &(*set)->branch_firstsbchild, TRUE, SCIP_DEFAULT_BRANCH_FIRSTSBCHILD, "aduh",
1291 NULL, NULL) );
1292 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1293 "branching/checksol",
1294 "should LP solutions during strong branching with propagation be checked for feasibility?",
1295 &(*set)->branch_checksbsol, TRUE, SCIP_DEFAULT_BRANCH_CHECKSBSOL,
1296 NULL, NULL) );
1297 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1298 "branching/roundsbsol",
1299 "should LP solutions during strong branching with propagation be rounded? (only when checksbsol=TRUE)",
1300 &(*set)->branch_roundsbsol, TRUE, SCIP_DEFAULT_BRANCH_ROUNDSBSOL,
1301 NULL, NULL) );
1302 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1303 "branching/sumadjustscore",
1304 "score adjustment near zero by adding epsilon (TRUE) or using maximum (FALSE)",
1305 &(*set)->branch_sumadjustscore, TRUE, SCIP_DEFAULT_BRANCH_SUMADJUSTSCORE,
1306 NULL, NULL) );
1307
1308 /* tree compression parameters */
1309 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1310 "compression/enable",
1311 "should automatic tree compression after the presolving be enabled?",
1312 &(*set)->compr_enable, TRUE, SCIP_DEFAULT_COMPR_ENABLE,
1313 NULL, NULL) );
1314
1315 /* conflict analysis parameters */
1316 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1317 "conflict/enable",
1318 "should conflict analysis be enabled?",
1319 &(*set)->conf_enable, FALSE, SCIP_DEFAULT_CONF_ENABLE,
1320 NULL, NULL) );
1321 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1322 "conflict/cleanboundexceedings",
1323 "should conflicts based on an old cutoff bound be removed from the conflict pool after improving the primal bound?",
1324 &(*set)->conf_cleanbnddepend, TRUE, SCIP_DEFAULT_CONF_CLEANBNDDEPEND,
1325 NULL, NULL) );
1326 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1327 "conflict/uselocalrows",
1328 "use local rows to construct infeasibility proofs",
1329 &(*set)->conf_uselocalrows, TRUE, SCIP_DEFAULT_CONF_USELOCALROWS,
1330 NULL, NULL) );
1331 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1332 "conflict/useprop",
1333 "should propagation conflict analysis be used?",
1334 &(*set)->conf_useprop, FALSE, SCIP_DEFAULT_CONF_USEPROP,
1335 NULL, NULL) );
1336 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1337 "conflict/useinflp",
1338 "should infeasible LP conflict analysis be used? ('o'ff, 'c'onflict graph, 'd'ual ray, 'b'oth conflict graph and dual ray)",
1339 &(*set)->conf_useinflp, FALSE, SCIP_DEFAULT_CONF_USEINFLP, "ocdb",
1340 NULL, NULL) );
1341 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1342 "conflict/useboundlp",
1343 "should bound exceeding LP conflict analysis be used? ('o'ff, 'c'onflict graph, 'd'ual ray, 'b'oth conflict graph and dual ray)",
1344 &(*set)->conf_useboundlp, FALSE, SCIP_DEFAULT_CONF_USEBOUNDLP, "ocdb",
1345 NULL, NULL) );
1346 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1347 "conflict/usesb",
1348 "should infeasible/bound exceeding strong branching conflict analysis be used?",
1349 &(*set)->conf_usesb, FALSE, SCIP_DEFAULT_CONF_USESB,
1350 NULL, NULL) );
1351 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1352 "conflict/usepseudo",
1353 "should pseudo solution conflict analysis be used?",
1354 &(*set)->conf_usepseudo, FALSE, SCIP_DEFAULT_CONF_USEPSEUDO,
1355 NULL, NULL) );
1356 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1357 "conflict/maxvarsfac",
1358 "maximal fraction of variables involved in a conflict constraint",
1359 &(*set)->conf_maxvarsfac, TRUE, SCIP_DEFAULT_CONF_MAXVARSFAC, 0.0, SCIP_REAL_MAX,
1360 NULL, NULL) );
1361 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1362 "conflict/minmaxvars",
1363 "minimal absolute maximum of variables involved in a conflict constraint",
1364 &(*set)->conf_minmaxvars, TRUE, SCIP_DEFAULT_CONF_MINMAXVARS, 0, INT_MAX,
1365 NULL, NULL) );
1366 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1367 "conflict/maxlploops",
1368 "maximal number of LP resolving loops during conflict analysis (-1: no limit)",
1369 &(*set)->conf_maxlploops, TRUE, SCIP_DEFAULT_CONF_MAXLPLOOPS, -1, INT_MAX,
1370 NULL, NULL) );
1371 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1372 "conflict/lpiterations",
1373 "maximal number of LP iterations in each LP resolving loop (-1: no limit)",
1374 &(*set)->conf_lpiterations, TRUE, SCIP_DEFAULT_CONF_LPITERATIONS, -1, INT_MAX,
1375 NULL, NULL) );
1376 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1377 "conflict/fuiplevels",
1378 "number of depth levels up to which first UIP's are used in conflict analysis (-1: use All-FirstUIP rule)",
1379 &(*set)->conf_fuiplevels, TRUE, SCIP_DEFAULT_CONF_FUIPLEVELS, -1, INT_MAX,
1380 NULL, NULL) );
1381 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1382 "conflict/interconss",
1383 "maximal number of intermediate conflict constraints generated in conflict graph (-1: use every intermediate constraint)",
1384 &(*set)->conf_interconss, TRUE, SCIP_DEFAULT_CONF_INTERCONSS, -1, INT_MAX,
1385 NULL, NULL) );
1386 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1387 "conflict/reconvlevels",
1388 "number of depth levels up to which UIP reconvergence constraints are generated (-1: generate reconvergence constraints in all depth levels)",
1389 &(*set)->conf_reconvlevels, TRUE, SCIP_DEFAULT_CONF_RECONVLEVELS, -1, INT_MAX,
1390 NULL, NULL) );
1391 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1392 "conflict/maxconss",
1393 "maximal number of conflict constraints accepted at an infeasible node (-1: use all generated conflict constraints)",
1394 &(*set)->conf_maxconss, TRUE, SCIP_DEFAULT_CONF_MAXCONSS, -1, INT_MAX,
1395 NULL, NULL) );
1396 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1397 "conflict/maxstoresize",
1398 "maximal size of conflict store (-1: auto, 0: disable storage)",
1399 &(*set)->conf_maxstoresize, TRUE, SCIP_DEFAULT_CONF_MAXSTORESIZE, -1, INT_MAX,
1400 NULL, NULL) );
1401 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1402 "conflict/preferbinary",
1403 "should binary conflicts be preferred?",
1404 &(*set)->conf_preferbinary, FALSE, SCIP_DEFAULT_CONF_PREFERBINARY,
1405 NULL, NULL) );
1406 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1407 "conflict/prefinfproof",
1408 "prefer infeasibility proof to boundexceeding proof",
1409 &(*set)->conf_prefinfproof, TRUE, SCIP_DEFAULT_CONF_PREFINFPROOF,
1410 NULL, NULL) );
1411 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1412 "conflict/allowlocal",
1413 "should conflict constraints be generated that are only valid locally?",
1414 &(*set)->conf_allowlocal, TRUE, SCIP_DEFAULT_CONF_ALLOWLOCAL,
1415 NULL, NULL) );
1416 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1417 "conflict/settlelocal",
1418 "should conflict constraints be attached only to the local subtree where they can be useful?",
1419 &(*set)->conf_settlelocal, TRUE, SCIP_DEFAULT_CONF_SETTLELOCAL,
1420 NULL, NULL) );
1421 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1422 "conflict/repropagate",
1423 "should earlier nodes be repropagated in order to replace branching decisions by deductions?",
1424 &(*set)->conf_repropagate, TRUE, SCIP_DEFAULT_CONF_REPROPAGATE,
1425 NULL, NULL) );
1426 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1427 "conflict/keepreprop",
1428 "should constraints be kept for repropagation even if they are too long?",
1429 &(*set)->conf_keepreprop, TRUE, SCIP_DEFAULT_CONF_KEEPREPROP,
1430 NULL, NULL) );
1431 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1432 "conflict/separate",
1433 "should the conflict constraints be separated?",
1434 &(*set)->conf_separate, TRUE, SCIP_DEFAULT_CONF_SEPARATE,
1435 NULL, NULL) );
1436 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1437 "conflict/dynamic",
1438 "should the conflict constraints be subject to aging?",
1439 &(*set)->conf_dynamic, TRUE, SCIP_DEFAULT_CONF_DYNAMIC,
1440 NULL, NULL) );
1441 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1442 "conflict/removable",
1443 "should the conflict's relaxations be subject to LP aging and cleanup?",
1444 &(*set)->conf_removable, TRUE, SCIP_DEFAULT_CONF_REMOVEABLE,
1445 NULL, NULL) );
1446 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1447 "conflict/graph/depthscorefac",
1448 "score factor for depth level in bound relaxation heuristic",
1449 &(*set)->conf_depthscorefac, TRUE, SCIP_DEFAULT_CONF_DEPTHSCOREFAC, SCIP_REAL_MIN, SCIP_REAL_MAX,
1450 NULL, NULL) );
1451 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1452 "conflict/proofscorefac",
1453 "score factor for impact on acticity in bound relaxation heuristic",
1454 &(*set)->conf_proofscorefac, TRUE, SCIP_DEFAULT_CONF_PROOFSCOREFAC, SCIP_REAL_MIN, SCIP_REAL_MAX,
1455 NULL, NULL) );
1456 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1457 "conflict/uplockscorefac",
1458 "score factor for up locks in bound relaxation heuristic",
1459 &(*set)->conf_uplockscorefac, TRUE, SCIP_DEFAULT_CONF_UPLOCKSCOREFAC, SCIP_REAL_MIN, SCIP_REAL_MAX,
1460 NULL, NULL) );
1461 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1462 "conflict/downlockscorefac",
1463 "score factor for down locks in bound relaxation heuristic",
1464 &(*set)->conf_downlockscorefac, TRUE, SCIP_DEFAULT_CONF_DOWNLOCKSCOREFAC, SCIP_REAL_MIN, SCIP_REAL_MAX,
1465 NULL, NULL) );
1466 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1467 "conflict/scorefac",
1468 "factor to decrease importance of variables' earlier conflict scores",
1469 &(*set)->conf_scorefac, TRUE, SCIP_DEFAULT_CONF_SCOREFAC, 1e-6, 1.0,
1470 NULL, NULL) );
1471 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1472 "conflict/restartnum",
1473 "number of successful conflict analysis calls that trigger a restart (0: disable conflict restarts)",
1474 &(*set)->conf_restartnum, FALSE, SCIP_DEFAULT_CONF_RESTARTNUM, 0, INT_MAX,
1475 NULL, NULL) );
1476 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1477 "conflict/restartfac",
1478 "factor to increase restartnum with after each restart",
1479 &(*set)->conf_restartfac, FALSE, SCIP_DEFAULT_CONF_RESTARTFAC, 0.0, SCIP_REAL_MAX,
1480 NULL, NULL) );
1481 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1482 "conflict/ignorerelaxedbd",
1483 "should relaxed bounds be ignored?",
1484 &(*set)->conf_ignorerelaxedbd, TRUE, SCIP_DEFAULT_CONF_IGNORERELAXEDBD,
1485 NULL, NULL) );
1486 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1487 "conflict/maxvarsdetectimpliedbounds",
1488 "maximal number of variables to try to detect global bound implications and shorten the whole conflict set (0: disabled)",
1489 &(*set)->conf_maxvarsdetectimpliedbounds, TRUE, SCIP_DEFAULT_CONF_MAXVARSDETECTIMPLIEDBOUNDS, 0, INT_MAX,
1490 NULL, NULL) );
1491 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1492 "conflict/fullshortenconflict",
1493 "try to shorten the whole conflict set or terminate early (depending on the 'maxvarsdetectimpliedbounds' parameter)",
1494 &(*set)->conf_fullshortenconflict, TRUE, SCIP_DEFAULT_CONF_FULLSHORTENCONFLICT,
1495 NULL, NULL) );
1496 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1497 "conflict/conflictweight",
1498 "the weight the VSIDS score is weight by updating the VSIDS for a variable if it is part of a conflict",
1499 &(*set)->conf_conflictweight, FALSE, SCIP_DEFAULT_CONF_CONFLITWEIGHT, 0.0, 1.0,
1500 NULL, NULL) );
1501 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1502 "conflict/conflictgraphweight",
1503 "the weight the VSIDS score is weight by updating the VSIDS for a variable if it is part of a conflict graph",
1504 &(*set)->conf_conflictgraphweight, FALSE, SCIP_DEFAULT_CONF_CONFLITGRAPHWEIGHT, 0.0, 1.0,
1505 NULL, NULL) );
1506 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1507 "conflict/minimprove",
1508 "minimal improvement of primal bound to remove conflicts based on a previous incumbent",
1509 &(*set)->conf_minimprove, TRUE, SCIP_DEFAULT_CONF_MINIMPROVE, 0.0, 1.0, NULL, NULL) );
1510 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1511 "conflict/weightsize",
1512 "weight of the size of a conflict used in score calculation",
1513 &(*set)->conf_weightsize, TRUE, SCIP_DEFAULT_CONF_WEIGHTSIZE, 0.0, 1.0, NULL, NULL) );
1514 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1515 "conflict/weightrepropdepth",
1516 "weight of the repropagation depth of a conflict used in score calculation",
1517 &(*set)->conf_weightrepropdepth, TRUE, SCIP_DEFAULT_CONF_WEIGHTREPROPDEPTH, 0.0, 1.0, NULL, NULL) );
1518 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1519 "conflict/weightvaliddepth",
1520 "weight of the valid depth of a conflict used in score calculation",
1521 &(*set)->conf_weightvaliddepth, TRUE, SCIP_DEFAULT_CONF_WEIGHTVALIDDEPTH, 0.0, 1.0, NULL, NULL) );
1522 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1523 "conflict/sepaaltproofs",
1524 "apply cut generating functions to construct alternative proofs",
1525 &(*set)->conf_sepaaltproofs, FALSE, SCIP_DEFAULT_CONF_SEPAALTPROOFS,
1526 NULL, NULL) );
1527
1528 /* constraint parameters */
1529 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1530 "constraints/agelimit",
1531 "maximum age an unnecessary constraint can reach before it is deleted (0: dynamic, -1: keep all constraints)",
1532 &(*set)->cons_agelimit, TRUE, SCIP_DEFAULT_CONS_AGELIMIT, -1, INT_MAX,
1533 NULL, NULL) );
1534 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1535 "constraints/obsoleteage",
1536 "age of a constraint after which it is marked obsolete (0: dynamic, -1 do not mark constraints obsolete)",
1537 &(*set)->cons_obsoleteage, TRUE, SCIP_DEFAULT_CONS_OBSOLETEAGE, -1, INT_MAX,
1538 NULL, NULL) );
1539 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1540 "constraints/disableenfops",
1541 "should enforcement of pseudo solution be disabled?",
1542 &(*set)->cons_disableenfops, TRUE, SCIP_DEFAULT_CONS_DISABLEENFOPS,
1543 NULL, NULL) );
1544
1545 /* display parameters */
1546 assert(sizeof(int) == sizeof(SCIP_VERBLEVEL)); /*lint !e506*/
1547 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1548 "display/verblevel",
1549 "verbosity level of output",
1550 (int*)&(*set)->disp_verblevel, FALSE, (int)SCIP_DEFAULT_DISP_VERBLEVEL,
1551 (int)SCIP_VERBLEVEL_NONE, (int)SCIP_VERBLEVEL_FULL,
1552 NULL, NULL) );
1553 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1554 "display/width",
1555 "maximal number of characters in a node information line",
1556 &(*set)->disp_width, FALSE, SCIP_DEFAULT_DISP_WIDTH, 0, INT_MAX,
1557 SCIPparamChgdDispWidth, NULL) );
1558 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1559 "display/freq",
1560 "frequency for displaying node information lines",
1561 &(*set)->disp_freq, FALSE, SCIP_DEFAULT_DISP_FREQ, -1, INT_MAX,
1562 NULL, NULL) );
1563 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1564 "display/headerfreq",
1565 "frequency for displaying header lines (every n'th node information line)",
1566 &(*set)->disp_headerfreq, FALSE, SCIP_DEFAULT_DISP_HEADERFREQ, -1, INT_MAX,
1567 NULL, NULL) );
1568 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1569 "display/lpinfo",
1570 "should the LP solver display status messages?",
1571 &(*set)->disp_lpinfo, FALSE, SCIP_DEFAULT_DISP_LPINFO,
1572 NULL, NULL) );
1573 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1574 "display/allviols",
1575 "display all violations for a given start solution / the best solution after the solving process?",
1576 &(*set)->disp_allviols, FALSE, SCIP_DEFAULT_DISP_ALLVIOLS,
1577 NULL, NULL) );
1578 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1579 "display/relevantstats",
1580 "should the relevant statistics be displayed at the end of solving?",
1581 &(*set)->disp_relevantstats, FALSE, SCIP_DEFAULT_DISP_RELEVANTSTATS,
1582 NULL, NULL) );
1583
1584 /* heuristic parameters */
1585 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1586 "heuristics/useuctsubscip",
1587 "should setting of common subscip parameters include the activation of the UCT node selector?",
1588 &(*set)->heur_useuctsubscip, TRUE, SCIP_DEFAULT_HEUR_USEUCTSUBSCIP, NULL, NULL) );
1589
1590 /* history parameters */
1591 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1592 "history/valuebased",
1593 "should statistics be collected for variable domain value pairs?",
1594 &(*set)->history_valuebased, FALSE, SCIP_DEFAULT_HISTORY_VALUEBASED,
1595 NULL, NULL) );
1596 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1597 "history/allowmerge",
1598 "should variable histories be merged from sub-SCIPs whenever possible?",
1599 &(*set)->history_allowmerge, FALSE, SCIP_DEFAULT_HISTORY_ALLOWMERGE,
1600 NULL, NULL) );
1601 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1602 "history/allowtransfer",
1603 "should variable histories be transferred to initialize SCIP copies?",
1604 &(*set)->history_allowtransfer, FALSE, SCIP_DEFAULT_HISTORY_ALLOWTRANSFER,
1605 NULL, NULL) );
1606
1607 /* limit parameters */
1608 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1609 "limits/time",
1610 "maximal time in seconds to run",
1611 &(*set)->limit_time, FALSE, SCIP_DEFAULT_LIMIT_TIME, 0.0, SCIP_DEFAULT_LIMIT_TIME,
1612 SCIPparamChgdLimit, NULL) );
1613 SCIP_CALL( SCIPsetAddLongintParam(*set, messagehdlr, blkmem,
1614 "limits/nodes",
1615 "maximal number of nodes to process (-1: no limit)",
1616 &(*set)->limit_nodes, FALSE, SCIP_DEFAULT_LIMIT_NODES, -1LL, SCIP_LONGINT_MAX,
1617 SCIPparamChgdLimit, NULL) );
1618 SCIP_CALL( SCIPsetAddLongintParam(*set, messagehdlr, blkmem,
1619 "limits/totalnodes",
1620 "maximal number of total nodes (incl. restarts) to process (-1: no limit)",
1621 &(*set)->limit_totalnodes, FALSE, SCIP_DEFAULT_LIMIT_NODES, -1LL, SCIP_LONGINT_MAX,
1622 SCIPparamChgdLimit, NULL) );
1623 SCIP_CALL( SCIPsetAddLongintParam(*set, messagehdlr, blkmem,
1624 "limits/stallnodes",
1625 "solving stops, if the given number of nodes was processed since the last improvement of the primal solution value (-1: no limit)",
1626 &(*set)->limit_stallnodes, FALSE, SCIP_DEFAULT_LIMIT_STALLNODES, -1LL, SCIP_LONGINT_MAX,
1627 SCIPparamChgdLimit, NULL) );
1628 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1629 "limits/memory",
1630 "maximal memory usage in MB; reported memory usage is lower than real memory usage!",
1631 &(*set)->limit_memory, FALSE, (SCIP_Real)SCIP_DEFAULT_LIMIT_MEMORY, 0.0, (SCIP_Real)SCIP_MEM_NOLIMIT,
1632 SCIPparamChgdLimit, NULL) );
1633 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1634 "limits/gap",
1635 "solving stops, if the relative gap = |primal - dual|/MIN(|dual|,|primal|) is below the given value, the gap is 'Infinity', if primal and dual bound have opposite signs",
1636 &(*set)->limit_gap, FALSE, SCIP_DEFAULT_LIMIT_GAP, 0.0, SCIP_REAL_MAX,
1637 SCIPparamChgdLimit, NULL) );
1638 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1639 "limits/absgap",
1640 "solving stops, if the absolute gap = |primalbound - dualbound| is below the given value",
1641 &(*set)->limit_absgap, FALSE, SCIP_DEFAULT_LIMIT_ABSGAP, 0.0, SCIP_REAL_MAX,
1642 SCIPparamChgdLimit, NULL) );
1643 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1644 "limits/solutions",
1645 "solving stops, if the given number of solutions were found (-1: no limit)",
1646 &(*set)->limit_solutions, FALSE, SCIP_DEFAULT_LIMIT_SOLUTIONS, -1, INT_MAX,
1647 SCIPparamChgdLimit, NULL) );
1648 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1649 "limits/bestsol",
1650 "solving stops, if the given number of solution improvements were found (-1: no limit)",
1651 &(*set)->limit_bestsol, FALSE, SCIP_DEFAULT_LIMIT_BESTSOL, -1, INT_MAX,
1652 SCIPparamChgdLimit, NULL) );
1653 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1654 "limits/maxsol",
1655 "maximal number of solutions to store in the solution storage",
1656 &(*set)->limit_maxsol, FALSE, SCIP_DEFAULT_LIMIT_MAXSOL, 1, INT_MAX,
1657 SCIPparamChgdLimit, NULL) );
1658 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1659 "limits/maxorigsol",
1660 "maximal number of solutions candidates to store in the solution storage of the original problem",
1661 &(*set)->limit_maxorigsol, FALSE, SCIP_DEFAULT_LIMIT_MAXORIGSOL, 0, INT_MAX,
1662 SCIPparamChgdLimit, NULL) );
1663 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1664 "limits/restarts",
1665 "solving stops, if the given number of restarts was triggered (-1: no limit)",
1666 &(*set)->limit_restarts, FALSE, SCIP_DEFAULT_LIMIT_RESTARTS, -1, INT_MAX,
1667 SCIPparamChgdLimit, NULL) );
1668
1669 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1670 "limits/autorestartnodes",
1671 "if solve exceeds this number of nodes for the first time, an automatic restart is triggered (-1: no automatic restart)",
1672 &(*set)->limit_autorestartnodes, FALSE, SCIP_DEFAULT_LIMIT_AUTORESTARTNODES, -1, INT_MAX,
1673 SCIPparamChgdLimit, NULL) );
1674
1675 /* LP parameters */
1676 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1677 "lp/solvefreq",
1678 "frequency for solving LP at the nodes (-1: never; 0: only root LP)",
1679 &(*set)->lp_solvefreq, FALSE, SCIP_DEFAULT_LP_SOLVEFREQ, -1, SCIP_MAXTREEDEPTH,
1680 NULL, NULL) );
1681 SCIP_CALL( SCIPsetAddLongintParam(*set, messagehdlr, blkmem,
1682 "lp/iterlim",
1683 "iteration limit for each single LP solve (-1: no limit)",
1684 &(*set)->lp_iterlim, TRUE, SCIP_DEFAULT_LP_ITERLIM, -1LL, SCIP_LONGINT_MAX,
1685 NULL, NULL) );
1686 SCIP_CALL( SCIPsetAddLongintParam(*set, messagehdlr, blkmem,
1687 "lp/rootiterlim",
1688 "iteration limit for initial root LP solve (-1: no limit)",
1689 &(*set)->lp_rootiterlim, TRUE, SCIP_DEFAULT_LP_ROOTITERLIM, -1LL, SCIP_LONGINT_MAX,
1690 NULL, NULL) );
1691 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1692 "lp/solvedepth",
1693 "maximal depth for solving LP at the nodes (-1: no depth limit)",
1694 &(*set)->lp_solvedepth, FALSE, SCIP_DEFAULT_LP_SOLVEDEPTH, -1, SCIP_MAXTREEDEPTH,
1695 NULL, NULL) );
1696 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1697 "lp/initalgorithm",
1698 "LP algorithm for solving initial LP relaxations (automatic 's'implex, 'p'rimal simplex, 'd'ual simplex, 'b'arrier, barrier with 'c'rossover)",
1699 &(*set)->lp_initalgorithm, FALSE, SCIP_DEFAULT_LP_INITALGORITHM, "spdbc",
1700 NULL, NULL) );
1701 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1702 "lp/resolvealgorithm",
1703 "LP algorithm for resolving LP relaxations if a starting basis exists (automatic 's'implex, 'p'rimal simplex, 'd'ual simplex, 'b'arrier, barrier with 'c'rossover)",
1704 &(*set)->lp_resolvealgorithm, FALSE, SCIP_DEFAULT_LP_RESOLVEALGORITHM, "spdbc",
1705 NULL, NULL) );
1706 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
1707 "lp/pricing",
1708 "LP pricing strategy ('l'pi default, 'a'uto, 'f'ull pricing, 'p'artial, 's'teepest edge pricing, 'q'uickstart steepest edge pricing, 'd'evex pricing)",
1709 &(*set)->lp_pricing, FALSE, SCIP_DEFAULT_LP_PRICING, "lafpsqd",
1710 NULL, NULL) );
1711 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1712 "lp/clearinitialprobinglp",
1713 "should lp state be cleared at the end of probing mode when lp was initially unsolved, e.g., when called right after presolving?",
1714 &(*set)->lp_clearinitialprobinglp, TRUE, SCIP_DEFAULT_LP_CLEARINITIALPROBINGLP,
1715 NULL, NULL) );
1716 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1717 "lp/resolverestore",
1718 "should the LP be resolved to restore the state at start of diving (if FALSE we buffer the solution values)?",
1719 &(*set)->lp_resolverestore, TRUE, SCIP_DEFAULT_LP_RESOLVERESTORE,
1720 NULL, NULL) );
1721 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1722 "lp/freesolvalbuffers",
1723 "should the buffers for storing LP solution values during diving be freed at end of diving?",
1724 &(*set)->lp_freesolvalbuffers, TRUE, SCIP_DEFAULT_LP_FREESOLVALBUFFERS,
1725 NULL, NULL) );
1726 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1727 "lp/colagelimit",
1728 "maximum age a dynamic column can reach before it is deleted from the LP (-1: don't delete columns due to aging)",
1729 &(*set)->lp_colagelimit, TRUE, SCIP_DEFAULT_LP_COLAGELIMIT, -1, INT_MAX,
1730 NULL, NULL) );
1731 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1732 "lp/rowagelimit",
1733 "maximum age a dynamic row can reach before it is deleted from the LP (-1: don't delete rows due to aging)",
1734 &(*set)->lp_rowagelimit, TRUE, SCIP_DEFAULT_LP_ROWAGELIMIT, -1, INT_MAX,
1735 NULL, NULL) );
1736 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1737 "lp/cleanupcols",
1738 "should new non-basic columns be removed after LP solving?",
1739 &(*set)->lp_cleanupcols, TRUE, SCIP_DEFAULT_LP_CLEANUPCOLS,
1740 NULL, NULL) );
1741 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1742 "lp/cleanupcolsroot",
1743 "should new non-basic columns be removed after root LP solving?",
1744 &(*set)->lp_cleanupcolsroot, TRUE, SCIP_DEFAULT_LP_CLEANUPCOLSROOT,
1745 NULL, NULL) );
1746 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1747 "lp/cleanuprows",
1748 "should new basic rows be removed after LP solving?",
1749 &(*set)->lp_cleanuprows, TRUE, SCIP_DEFAULT_LP_CLEANUPROWS,
1750 NULL, NULL) );
1751 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1752 "lp/cleanuprowsroot",
1753 "should new basic rows be removed after root LP solving?",
1754 &(*set)->lp_cleanuprowsroot, TRUE, SCIP_DEFAULT_LP_CLEANUPROWSROOT,
1755 NULL, NULL) );
1756 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1757 "lp/checkstability",
1758 "should LP solver's return status be checked for stability?",
1759 &(*set)->lp_checkstability, TRUE, SCIP_DEFAULT_LP_CHECKSTABILITY,
1760 NULL, NULL) );
1761 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1762 "lp/conditionlimit",
1763 "maximum condition number of LP basis counted as stable (-1.0: no limit)",
1764 &(*set)->lp_conditionlimit, TRUE, SCIP_DEFAULT_LP_CONDITIONLIMIT, -1.0, SCIP_REAL_MAX,
1765 NULL, NULL) );
1766 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1767 "lp/minmarkowitz",
1768 "minimal Markowitz threshold to control sparsity/stability in LU factorization",
1769 &(*set)->lp_markowitz, TRUE, SCIP_DEFAULT_LP_MARKOWITZ, 1e-4, 0.9999,
1770 NULL, NULL) );
1771 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1772 "lp/checkprimfeas",
1773 "should LP solutions be checked for primal feasibility, resolving LP when numerical troubles occur?",
1774 &(*set)->lp_checkprimfeas, TRUE, SCIP_DEFAULT_LP_CHECKPRIMFEAS,
1775 NULL, NULL) );
1776 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1777 "lp/checkdualfeas",
1778 "should LP solutions be checked for dual feasibility, resolving LP when numerical troubles occur?",
1779 &(*set)->lp_checkdualfeas, TRUE, SCIP_DEFAULT_LP_CHECKDUALFEAS,
1780 NULL, NULL) );
1781 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1782 "lp/checkfarkas",
1783 "should infeasibility proofs from the LP be checked?",
1784 &(*set)->lp_checkfarkas, TRUE, SCIP_DEFAULT_LP_CHECKFARKAS,
1785 NULL, NULL) );
1786 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1787 "lp/fastmip",
1788 "which FASTMIP setting of LP solver should be used? 0: off, 1: low",
1789 &(*set)->lp_fastmip, TRUE, SCIP_DEFAULT_LP_FASTMIP, 0, 1,
1790 NULL, NULL) );
1791 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1792 "lp/scaling",
1793 "LP scaling (0: none, 1: normal, 2: aggressive)",
1794 &(*set)->lp_scaling, TRUE, SCIP_DEFAULT_LP_SCALING, 0, 2,
1795 NULL, NULL) );
1796 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1797 "lp/presolving",
1798 "should presolving of LP solver be used?",
1799 &(*set)->lp_presolving, TRUE, SCIP_DEFAULT_LP_PRESOLVING,
1800 NULL, NULL) );
1801 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1802 "lp/lexdualalgo",
1803 "should the lexicographic dual algorithm be used?",
1804 &(*set)->lp_lexdualalgo, TRUE, SCIP_DEFAULT_LP_LEXDUALALGO,
1805 NULL, NULL) );
1806 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1807 "lp/lexdualrootonly",
1808 "should the lexicographic dual algorithm be applied only at the root node",
1809 &(*set)->lp_lexdualrootonly, TRUE, SCIP_DEFAULT_LP_LEXDUALROOTONLY,
1810 NULL, NULL) );
1811 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1812 "lp/lexdualmaxrounds",
1813 "maximum number of rounds in the lexicographic dual algorithm (-1: unbounded)",
1814 &(*set)->lp_lexdualmaxrounds, TRUE, SCIP_DEFAULT_LP_LEXDUALMAXROUNDS, -1, INT_MAX,
1815 NULL, NULL) );
1816 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1817 "lp/lexdualbasic",
1818 "choose fractional basic variables in lexicographic dual algorithm?",
1819 &(*set)->lp_lexdualbasic, TRUE, SCIP_DEFAULT_LP_LEXDUALBASIC,
1820 NULL, NULL) );
1821 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1822 "lp/lexdualstalling",
1823 "turn on the lex dual algorithm only when stalling?",
1824 &(*set)->lp_lexdualstalling, TRUE, SCIP_DEFAULT_LP_LEXDUALSTALLING,
1825 NULL, NULL) );
1826 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1827 "lp/disablecutoff",
1828 "disable the cutoff bound in the LP solver? (0: enabled, 1: disabled, 2: auto)",
1829 &(*set)->lp_disablecutoff, TRUE, SCIP_DEFAULT_LP_DISABLECUTOFF,
1830 0, 2, NULL, NULL) );
1831 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1832 "lp/rowrepswitch",
1833 "simplex algorithm shall use row representation of the basis if number of rows divided by number of columns exceeds this value (-1.0 to disable row representation)",
1834 &(*set)->lp_rowrepswitch, TRUE, SCIP_DEFAULT_LP_ROWREPSWITCH, -1.0, SCIP_REAL_MAX,
1835 NULL, NULL) );
1836 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1837 "lp/threads",
1838 "number of threads used for solving the LP (0: automatic)",
1839 &(*set)->lp_threads, TRUE, SCIP_DEFAULT_LP_THREADS, 0, 64,
1840 NULL, NULL) );
1841 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1842 "lp/resolveiterfac",
1843 "factor of average LP iterations that is used as LP iteration limit for LP resolve (-1: unlimited)",
1844 &(*set)->lp_resolveiterfac, TRUE, SCIP_DEFAULT_LP_RESOLVEITERFAC, -1.0, SCIP_REAL_MAX,
1845 NULL, NULL) );
1846 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1847 "lp/resolveitermin",
1848 "minimum number of iterations that are allowed for LP resolve",
1849 &(*set)->lp_resolveitermin, TRUE, SCIP_DEFAULT_LP_RESOLVEITERMIN, 1, INT_MAX,
1850 NULL, NULL) );
1851
1852 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1853 "lp/solutionpolishing",
1854 "LP solution polishing method (0: disabled, 1: only root, 2: always, 3: auto)",
1855 &(*set)->lp_solutionpolishing, TRUE, SCIP_DEFAULT_LP_SOLUTIONPOLISHING, 0, 3,
1856 NULL, NULL) );
1857
1858 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1859 "lp/refactorinterval",
1860 "LP refactorization interval (0: auto)",
1861 &(*set)->lp_refactorinterval, TRUE, SCIP_DEFAULT_LP_REFACTORINTERVAL, 0, INT_MAX,
1862 NULL, NULL) );
1863 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1864 "lp/alwaysgetduals",
1865 "should the Farkas duals always be collected when an LP is found to be infeasible?",
1866 &(*set)->lp_alwaysgetduals, FALSE, SCIP_DEFAULT_LP_ALWAYSGETDUALS,
1867 NULL, NULL) );
1868
1869 /* NLP parameters */
1870 SCIP_CALL( SCIPsetAddStringParam(*set, messagehdlr, blkmem,
1871 "nlp/solver",
1872 "solver to use for solving NLPs; leave empty to select NLPI with highest priority",
1873 &(*set)->nlp_solver, FALSE, SCIP_DEFAULT_NLP_SOLVER,
1874 NULL, NULL) );
1875 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1876 "nlp/disable",
1877 "should the NLP relaxation be always disabled (also for NLPs/MINLPs)?",
1878 &(*set)->nlp_disable, FALSE, SCIP_DEFAULT_NLP_DISABLE,
1879 NULL, NULL) );
1880
1881 /* memory parameters */
1882 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1883 "memory/savefac",
1884 "fraction of maximal memory usage resulting in switch to memory saving mode",
1885 &(*set)->mem_savefac, FALSE, SCIP_DEFAULT_MEM_SAVEFAC, 0.0, 1.0,
1886 NULL, NULL) );
1887 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1888 "memory/arraygrowfac",
1889 "memory growing factor for dynamically allocated arrays",
1890 &(*set)->mem_arraygrowfac, TRUE, SCIP_DEFAULT_MEM_ARRAYGROWFAC, 1.0, 10.0,
1891 paramChgdArraygrowfac, NULL) );
1892 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1893 "memory/arraygrowinit",
1894 "initial size of dynamically allocated arrays",
1895 &(*set)->mem_arraygrowinit, TRUE, SCIP_DEFAULT_MEM_ARRAYGROWINIT, 0, INT_MAX,
1896 paramChgdArraygrowinit, NULL) );
1897 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1898 "memory/treegrowfac",
1899 "memory growing factor for tree array",
1900 &(*set)->mem_treegrowfac, TRUE, SCIP_DEFAULT_MEM_TREEGROWFAC, 1.0, 10.0,
1901 NULL, NULL) );
1902 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1903 "memory/treegrowinit",
1904 "initial size of tree array",
1905 &(*set)->mem_treegrowinit, TRUE, SCIP_DEFAULT_MEM_TREEGROWINIT, 0, INT_MAX,
1906 NULL, NULL) );
1907 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
1908 "memory/pathgrowfac",
1909 "memory growing factor for path array",
1910 &(*set)->mem_pathgrowfac, TRUE, SCIP_DEFAULT_MEM_PATHGROWFAC, 1.0, 10.0,
1911 NULL, NULL) );
1912 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
1913 "memory/pathgrowinit",
1914 "initial size of path array",
1915 &(*set)->mem_pathgrowinit, TRUE, SCIP_DEFAULT_MEM_PATHGROWINIT, 0, INT_MAX,
1916 NULL, NULL) );
1917
1918 /* miscellaneous parameters */
1919 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1920 "misc/catchctrlc",
1921 "should the CTRL-C interrupt be caught by SCIP?",
1922 &(*set)->misc_catchctrlc, FALSE, SCIP_DEFAULT_MISC_CATCHCTRLC,
1923 NULL, NULL) );
1924 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1925 "misc/usevartable",
1926 "should a hashtable be used to map from variable names to variables?",
1927 &(*set)->misc_usevartable, FALSE, SCIP_DEFAULT_MISC_USEVARTABLE,
1928 NULL, NULL) );
1929 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1930 "misc/useconstable",
1931 "should a hashtable be used to map from constraint names to constraints?",
1932 &(*set)->misc_useconstable, FALSE, SCIP_DEFAULT_MISC_USECONSTABLE,
1933 NULL, NULL) );
1934 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1935 "misc/usesmalltables",
1936 "should smaller hashtables be used? yields better performance for small problems with about 100 variables",
1937 &(*set)->misc_usesmalltables, FALSE, SCIP_DEFAULT_MISC_USESMALLTABLES,
1938 NULL, NULL) );
1939 #if 0 /**@todo activate exactsolve parameter and finish implementation of solving MIPs exactly */
1940 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1941 "misc/exactsolve",
1942 "should the problem be solved exactly (with proven dual bounds)?",
1943 &(*set)->misc_exactsolve, FALSE, SCIP_DEFAULT_MISC_EXACTSOLVE,
1944 NULL, NULL) );
1945 #else
1946 (*set)->misc_exactsolve = SCIP_DEFAULT_MISC_EXACTSOLVE;
1947 #endif
1948
1949 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1950 "misc/resetstat",
1951 "should the statistics be reset if the transformed problem is freed (in case of a Benders' decomposition this parameter should be set to FALSE)",
1952 &(*set)->misc_resetstat, FALSE, SCIP_DEFAULT_MISC_RESETSTAT,
1953 NULL, NULL) );
1954
1955 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1956 "misc/improvingsols",
1957 "should only solutions be checked which improve the primal bound",
1958 &(*set)->misc_improvingsols, FALSE, SCIP_DEFAULT_MISC_IMPROVINGSOLS,
1959 NULL, NULL) );
1960 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1961 "misc/printreason",
1962 "should the reason be printed if a given start solution is infeasible",
1963 &(*set)->misc_printreason, FALSE, SCIP_DEFAULT_MISC_PRINTREASON,
1964 NULL, NULL) );
1965 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1966 "misc/estimexternmem",
1967 "should the usage of external memory be estimated?",
1968 &(*set)->misc_estimexternmem, FALSE, SCIP_DEFAULT_MISC_ESTIMEXTERNMEM,
1969 NULL, NULL) );
1970 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1971 "misc/avoidmemout",
1972 "try to avoid running into memory limit by restricting plugins like heuristics?",
1973 &(*set)->misc_avoidmemout, FALSE, SCIP_DEFAULT_MISC_AVOIDMEMOUT,
1974 NULL, NULL) );
1975 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1976 "misc/transorigsols",
1977 "should SCIP try to transfer original solutions to the transformed space (after presolving)?",
1978 &(*set)->misc_transorigsols, FALSE, SCIP_DEFAULT_MISC_TRANSORIGSOLS,
1979 NULL, NULL) );
1980 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1981 "misc/transsolsorig",
1982 "should SCIP try to transfer transformed solutions to the original space (after solving)?",
1983 &(*set)->misc_transsolsorig, FALSE, SCIP_DEFAULT_MISC_TRANSSOLSORIG,
1984 NULL, NULL) );
1985 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1986 "misc/calcintegral",
1987 "should SCIP calculate the primal dual integral value?",
1988 &(*set)->misc_calcintegral, FALSE, SCIP_DEFAULT_MISC_CALCINTEGRAL,
1989 NULL, NULL) );
1990 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1991 "misc/finitesolutionstore",
1992 "should SCIP try to remove infinite fixings from solutions copied to the solution store?",
1993 &(*set)->misc_finitesolstore, FALSE, SCIP_DEFAULT_MISC_FINITESOLSTORE,
1994 NULL, NULL) );
1995 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
1996 "misc/outputorigsol",
1997 "should the best solution be transformed to the orignal space and be output in command line run?",
1998 &(*set)->misc_outputorigsol, FALSE, SCIP_DEFAULT_MISC_OUTPUTORIGSOL,
1999 NULL, NULL) );
2000 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2001 "misc/allowstrongdualreds",
2002 "should strong dual reductions be allowed in propagation and presolving?",
2003 &(*set)->misc_allowstrongdualreds, FALSE, SCIP_DEFAULT_MISC_ALLOWSTRONGDUALREDS,
2004 NULL, NULL) );
2005 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2006 "misc/allowweakdualreds",
2007 "should weak dual reductions be allowed in propagation and presolving?",
2008 &(*set)->misc_allowweakdualreds, FALSE, SCIP_DEFAULT_MISC_ALLOWWEAKDUALREDS,
2009 NULL, NULL) );
2010 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2011 "misc/scaleobj",
2012 "should the objective function be scaled so that it is always integer?",
2013 &(*set)->misc_scaleobj, FALSE, SCIP_DEFAULT_MISC_SCALEOBJ,
2014 NULL, NULL) );
2015
2016 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2017 "misc/referencevalue",
2018 "objective value for reference purposes",
2019 &(*set)->misc_referencevalue, FALSE, SCIP_DEFAULT_MISC_REFERENCEVALUE, SCIP_REAL_MIN, SCIP_REAL_MAX,
2020 NULL, NULL) );
2021
2022 #ifdef WITH_DEBUG_SOLUTION
2023 SCIP_CALL( SCIPsetAddStringParam(*set, messagehdlr, blkmem,
2024 "misc/debugsol",
2025 "path to a debug solution",
2026 &(*set)->misc_debugsol, FALSE, SCIP_DEFAULT_MISC_DEBUGSOLUTION,
2027 NULL, NULL) );
2028 #endif
2029
2030 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2031 "misc/usesymmetry",
2032 "bitset describing used symmetry handling technique (0: off; 1: polyhedral (orbitopes and/or symresacks);" \
2033 " 2: orbital fixing; 3: orbitopes and orbital fixing; 4: Schreier Sims cuts; 5: Schreier Sims cuts and " \
2034 "orbitopes); 6: Schreier Sims cuts and orbital fixing; 7: Schreier Sims cuts, orbitopes, and orbital " \
2035 "fixing, see type_symmetry.h.",
2036 &(*set)->misc_usesymmetry, FALSE, SCIP_DEFAULT_MISC_USESYMMETRY, 0, 7,
2037 paramChgdUsesymmetry, NULL) );
2038
2039 /* randomization parameters */
2040 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2041 "randomization/randomseedshift",
2042 "global shift of all random seeds in the plugins and the LP random seed",
2043 &(*set)->random_randomseedshift, FALSE, SCIP_DEFAULT_RANDOM_RANDSEEDSHIFT, 0, INT_MAX,
2044 NULL, NULL) );
2045
2046 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2047 "randomization/permutationseed",
2048 "seed value for permuting the problem after reading/transformation (0: no permutation)",
2049 &(*set)->random_permutationseed, FALSE, SCIP_DEFAULT_RANDOM_PERMUTATIONSEED, 0, INT_MAX,
2050 NULL, NULL) );
2051
2052 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2053 "randomization/permuteconss",
2054 "should order of constraints be permuted (depends on permutationseed)?",
2055 &(*set)->random_permuteconss, TRUE, SCIP_DEFAULT_RANDOM_PERMUTECONSS,
2056 NULL, NULL) );
2057
2058 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2059 "randomization/permutevars",
2060 "should order of variables be permuted (depends on permutationseed)?",
2061 &(*set)->random_permutevars, TRUE, SCIP_DEFAULT_RANDOM_PERMUTEVARS,
2062 NULL, NULL) );
2063
2064 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2065 "randomization/lpseed",
2066 "random seed for LP solver, e.g. for perturbations in the simplex (0: LP default)",
2067 &(*set)->random_randomseed, FALSE, SCIP_DEFAULT_RANDOM_LPSEED, 0, INT_MAX,
2068 NULL, NULL) );
2069
2070 /* node selection */
2071 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2072 "nodeselection/childsel",
2073 "child selection rule ('d'own, 'u'p, 'p'seudo costs, 'i'nference, 'l'p value, 'r'oot LP value difference, 'h'ybrid inference/root LP value difference)",
2074 &(*set)->nodesel_childsel, FALSE, SCIP_DEFAULT_NODESEL_CHILDSEL, "dupilrh",
2075 NULL, NULL) );
2076
2077 /* numerical parameters */
2078 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2079 "numerics/infinity",
2080 "values larger than this are considered infinity",
2081 &(*set)->num_infinity, FALSE, SCIP_DEFAULT_INFINITY, 1e+10, SCIP_INVALID/10.0,
2082 paramChgdInfinity, NULL) );
2083 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2084 "numerics/epsilon",
2085 "absolute values smaller than this are considered zero",
2086 &(*set)->num_epsilon, FALSE, SCIP_DEFAULT_EPSILON, SCIP_MINEPSILON, SCIP_MAXEPSILON,
2087 NULL, NULL) );
2088 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2089 "numerics/sumepsilon",
2090 "absolute values of sums smaller than this are considered zero",
2091 &(*set)->num_sumepsilon, FALSE, SCIP_DEFAULT_SUMEPSILON, SCIP_MINEPSILON*1e+03, SCIP_MAXEPSILON,
2092 NULL, NULL) );
2093 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2094 "numerics/feastol",
2095 "feasibility tolerance for constraints",
2096 &(*set)->num_feastol, FALSE, SCIP_DEFAULT_FEASTOL, SCIP_MINEPSILON*1e+03, SCIP_MAXEPSILON,
2097 paramChgdFeastol, NULL) );
2098 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2099 "numerics/checkfeastolfac",
2100 "feasibility tolerance factor; for checking the feasibility of the best solution",
2101 &(*set)->num_checkfeastolfac, FALSE, SCIP_DEFAULT_CHECKFEASTOLFAC, 0.0, SCIP_REAL_MAX,
2102 NULL, NULL) );
2103 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2104 "numerics/lpfeastolfactor",
2105 "factor w.r.t. primal feasibility tolerance that determines default (and maximal) primal feasibility tolerance of LP solver",
2106 &(*set)->num_lpfeastolfactor, FALSE, SCIP_DEFAULT_LPFEASTOLFACTOR, 1e-6, 1.0,
2107 paramChgdLPFeastolFactor, NULL) );
2108 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2109 "numerics/dualfeastol",
2110 "feasibility tolerance for reduced costs in LP solution",
2111 &(*set)->num_dualfeastol, FALSE, SCIP_DEFAULT_DUALFEASTOL, SCIP_MINEPSILON*1e+03, SCIP_MAXEPSILON,
2112 paramChgdDualfeastol, NULL) );
2113 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2114 "numerics/barrierconvtol",
2115 "LP convergence tolerance used in barrier algorithm",
2116 &(*set)->num_barrierconvtol, TRUE, SCIP_DEFAULT_BARRIERCONVTOL, SCIP_MINEPSILON*1e+03, SCIP_MAXEPSILON,
2117 paramChgdBarrierconvtol, NULL) );
2118 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2119 "numerics/boundstreps",
2120 "minimal relative improve for strengthening bounds",
2121 &(*set)->num_boundstreps, TRUE, SCIP_DEFAULT_BOUNDSTREPS, SCIP_MINEPSILON*1e+03, SCIP_INVALID/10.0,
2122 NULL, NULL) );
2123 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2124 "numerics/pseudocosteps",
2125 "minimal variable distance value to use for branching pseudo cost updates",
2126 &(*set)->num_pseudocosteps, TRUE, SCIP_DEFAULT_PSEUDOCOSTEPS, SCIP_MINEPSILON*1e+03, 1.0,
2127 NULL, NULL) );
2128 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2129 "numerics/pseudocostdelta",
2130 "minimal objective distance value to use for branching pseudo cost updates",
2131 &(*set)->num_pseudocostdelta, TRUE, SCIP_DEFAULT_PSEUDOCOSTDELTA, 0.0, SCIP_REAL_MAX,
2132 NULL, NULL) );
2133 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2134 "numerics/recomputefac",
2135 "minimal decrease factor that causes the recomputation of a value (e.g., pseudo objective) instead of an update",
2136 &(*set)->num_recompfac, TRUE, SCIP_DEFAULT_RECOMPFAC, 0.0, SCIP_REAL_MAX,
2137 NULL, NULL) );
2138 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2139 "numerics/hugeval",
2140 "values larger than this are considered huge and should be handled separately (e.g., in activity computation)",
2141 &(*set)->num_hugeval, TRUE, SCIP_DEFAULT_HUGEVAL, 0.0, SCIP_INVALID/10.0,
2142 NULL, NULL) );
2143
2144 /* presolving parameters */
2145 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2146 "presolving/maxrounds",
2147 "maximal number of presolving rounds (-1: unlimited, 0: off)",
2148 &(*set)->presol_maxrounds, FALSE, SCIP_DEFAULT_PRESOL_MAXROUNDS, -1, INT_MAX,
2149 NULL, NULL) );
2150 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2151 "presolving/abortfac",
2152 "abort presolve, if at most this fraction of the problem was changed in last presolve round",
2153 &(*set)->presol_abortfac, TRUE, SCIP_DEFAULT_PRESOL_ABORTFAC, 0.0, 1.0,
2154 NULL, NULL) );
2155 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2156 "presolving/maxrestarts",
2157 "maximal number of restarts (-1: unlimited)",
2158 &(*set)->presol_maxrestarts, FALSE, SCIP_DEFAULT_PRESOL_MAXRESTARTS, -1, INT_MAX,
2159 NULL, NULL) );
2160 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2161 "presolving/restartfac",
2162 "fraction of integer variables that were fixed in the root node triggering a restart with preprocessing after root node evaluation",
2163 &(*set)->presol_restartfac, TRUE, SCIP_DEFAULT_PRESOL_RESTARTFAC, 0.0, 1.0,
2164 NULL, NULL) );
2165 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2166 "presolving/clqtablefac",
2167 "limit on number of entries in clique table relative to number of problem nonzeros",
2168 &(*set)->presol_clqtablefac, TRUE, SCIP_DEFAULT_PRESOL_CLQTABLEFAC, 0.0, SCIP_REAL_MAX,
2169 NULL, NULL) );
2170 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2171 "presolving/immrestartfac",
2172 "fraction of integer variables that were fixed in the root node triggering an immediate restart with preprocessing",
2173 &(*set)->presol_immrestartfac, TRUE, SCIP_DEFAULT_PRESOL_IMMRESTARTFAC, 0.0, 1.0,
2174 NULL, NULL) );
2175 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2176 "presolving/subrestartfac",
2177 "fraction of integer variables that were globally fixed during the solving process triggering a restart with preprocessing",
2178 &(*set)->presol_subrestartfac, TRUE, SCIP_DEFAULT_PRESOL_SUBRESTARTFAC, 0.0, 1.0,
2179 NULL, NULL) );
2180 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2181 "presolving/restartminred",
2182 "minimal fraction of integer variables removed after restart to allow for an additional restart",
2183 &(*set)->presol_restartminred, TRUE, SCIP_DEFAULT_PRESOL_RESTARTMINRED, 0.0, 1.0,
2184 NULL, NULL) );
2185 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2186 "presolving/donotmultaggr",
2187 "should multi-aggregation of variables be forbidden?",
2188 &(*set)->presol_donotmultaggr, TRUE, SCIP_DEFAULT_PRESOL_DONOTMULTAGGR,
2189 NULL, NULL) );
2190 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2191 "presolving/donotaggr",
2192 "should aggregation of variables be forbidden?",
2193 &(*set)->presol_donotaggr, TRUE, SCIP_DEFAULT_PRESOL_DONOTAGGR,
2194 NULL, NULL) );
2195
2196 /* pricing parameters */
2197 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2198 "pricing/maxvars",
2199 "maximal number of variables priced in per pricing round",
2200 &(*set)->price_maxvars, FALSE, SCIP_DEFAULT_PRICE_MAXVARS, 1, INT_MAX,
2201 NULL, NULL) );
2202 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2203 "pricing/maxvarsroot",
2204 "maximal number of priced variables at the root node",
2205 &(*set)->price_maxvarsroot, FALSE, SCIP_DEFAULT_PRICE_MAXVARSROOT, 1, INT_MAX,
2206 NULL, NULL) );
2207 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2208 "pricing/abortfac",
2209 "pricing is aborted, if fac * pricing/maxvars pricing candidates were found",
2210 &(*set)->price_abortfac, FALSE, SCIP_DEFAULT_PRICE_ABORTFAC, 1.0, SCIP_REAL_MAX,
2211 NULL, NULL) );
2212 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2213 "pricing/delvars",
2214 "should variables created at the current node be deleted when the node is solved in case they are not present in the LP anymore?",
2215 &(*set)->price_delvars, FALSE, SCIP_DEFAULT_PRICE_DELVARS,
2216 NULL, NULL) );
2217 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2218 "pricing/delvarsroot",
2219 "should variables created at the root node be deleted when the root is solved in case they are not present in the LP anymore?",
2220 &(*set)->price_delvarsroot, FALSE, SCIP_DEFAULT_PRICE_DELVARSROOT,
2221 NULL, NULL) );
2222
2223 /* Decomposition parameters */
2224 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2225 "decomposition/benderslabels",
2226 "should the variables be labelled for the application of Benders' decomposition?",
2227 &(*set)->decomp_benderslabels, FALSE, SCIP_DEFAULT_DECOMP_BENDERSLABELS,
2228 NULL, NULL) );
2229 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2230 "decomposition/applybenders",
2231 "if a decomposition exists, should Benders' decomposition be applied?",
2232 &(*set)->decomp_applybenders, FALSE, SCIP_DEFAULT_DECOMP_APPLYBENDERS,
2233 NULL, NULL) );
2234 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2235 "decomposition/maxgraphedge",
2236 "maximum number of edges in block graph computation (-1: no limit, 0: disable block graph computation)",
2237 &(*set)->decomp_maxgraphedge, FALSE, SCIP_DEFAULT_DECOMP_MAXGRAPHEDGE, -1, INT_MAX,
2238 NULL, NULL) );
2239 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2240 "decomposition/disablemeasures",
2241 "disable expensive measures",
2242 &(*set)->decomp_disablemeasures, FALSE, SCIP_DEFAULT_DECOMP_DISABLEMEASURES,
2243 NULL, NULL) );
2244
2245 /* Benders' decomposition parameters */
2246 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2247 "benders/solutiontol",
2248 "the tolerance used for checking optimality in Benders' decomposition. tol where optimality is given by LB + tol > UB.",
2249 &(*set)->benders_soltol, FALSE, SCIP_DEFAULT_BENDERS_SOLTOL, 0.0, SCIP_REAL_MAX,
2250 NULL, NULL) );
2251 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2252 "benders/cutlpsol",
2253 "should Benders' cuts be generated from the solution to the LP relaxation?",
2254 &(*set)->benders_cutlpsol, FALSE, SCIP_DEFAULT_BENDERS_CUTLPSOL,
2255 NULL, NULL) );
2256 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2257 "benders/copybenders",
2258 "should Benders' decomposition be copied for use in sub-SCIPs?",
2259 &(*set)->benders_copybenders, FALSE, SCIP_DEFAULT_BENDERS_COPYBENDERS,
2260 NULL, NULL) );
2261
2262 /* propagation parameters */
2263 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2264 "propagating/maxrounds",
2265 "maximal number of propagation rounds per node (-1: unlimited)",
2266 &(*set)->prop_maxrounds, FALSE, SCIP_DEFAULT_PROP_MAXROUNDS, -1, INT_MAX,
2267 NULL, NULL) );
2268 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2269 "propagating/maxroundsroot",
2270 "maximal number of propagation rounds in the root node (-1: unlimited)",
2271 &(*set)->prop_maxroundsroot, FALSE, SCIP_DEFAULT_PROP_MAXROUNDSROOT, -1, INT_MAX,
2272 NULL, NULL) );
2273 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2274 "propagating/abortoncutoff",
2275 "should propagation be aborted immediately? setting this to FALSE could help conflict analysis to produce more conflict constraints",
2276 &(*set)->prop_abortoncutoff, FALSE, SCIP_DEFAULT_PROP_ABORTONCUTOFF,
2277 NULL, NULL) );
2278
2279 /* reoptimization */
2280 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2281 "reoptimization/enable",
2282 "should reoptimization used?",
2283 &(*set)->reopt_enable, FALSE, SCIP_DEFAULT_REOPT_ENABLE,
2284 paramChgdEnableReopt, NULL) );
2285 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2286 "reoptimization/maxsavednodes",
2287 "maximal number of saved nodes",
2288 &(*set)->reopt_maxsavednodes, TRUE, SCIP_DEFAULT_REOPT_MAXSAVEDNODES, -1, INT_MAX,
2289 NULL, NULL) );
2290 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2291 "reoptimization/maxdiffofnodes",
2292 "maximal number of bound changes between two stored nodes on one path",
2293 &(*set)->reopt_maxdiffofnodes, TRUE, SCIP_DEFAULT_REOPT_MAXDIFFOFNODES, 0, INT_MAX,
2294 NULL, NULL) );
2295 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2296 "reoptimization/globalcons/sepainfsubtrees",
2297 "save global constraints to separate infeasible subtrees.",
2298 &(*set)->reopt_sepaglbinfsubtrees, FALSE, SCIP_DEFAULT_REOPT_SEPAGLBINFSUBTREES,
2299 NULL, NULL) );
2300 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2301 "reoptimization/sepabestsol",
2302 "separate the optimal solution, i.e., for constrained shortest path",
2303 &(*set)->reopt_sepabestsol, TRUE, SCIP_DEFAULT_REOPT_SEPABESTSOL,
2304 NULL, NULL) );
2305 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2306 "reoptimization/storevarhistory",
2307 "use variable history of the previous solve if the objctive function has changed only slightly",
2308 &(*set)->reopt_storevarhistory, TRUE, SCIP_DEFAULT_REOPT_STOREVARHISTOTY,
2309 NULL, NULL) );
2310 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2311 "reoptimization/usepscost",
2312 "re-use pseudo costs if the objective function changed only slightly ",
2313 &(*set)->reopt_usepscost, TRUE, SCIP_DEFAULT_REOPT_USEPSCOST,
2314 NULL, NULL) );
2315 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2316 "reoptimization/solvelp",
2317 "at which reopttype should the LP be solved? (1: transit, 3: strong branched, 4: w/ added logicor, 5: only leafs).",
2318 &(*set)->reopt_solvelp, TRUE, SCIP_DEFAULT_REOPT_SOLVELP, 1, 5,
2319 NULL, NULL) );
2320 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2321 "reoptimization/solvelpdiff",
2322 "maximal number of bound changes at node to skip solving the LP",
2323 &(*set)->reopt_solvelpdiff, TRUE, SCIP_DEFAULT_REOPT_SOLVELPDIFF, 0, INT_MAX,
2324 NULL, NULL) );
2325 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2326 "reoptimization/savesols",
2327 "number of best solutions which should be saved for the following runs. (-1: save all)",
2328 &(*set)->reopt_savesols, TRUE, SCIP_DEFAULT_REOPT_SAVESOLS, 0, INT_MAX,
2329 NULL, NULL) );
2330 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2331 "reoptimization/objsimrootLP",
2332 "similarity of two sequential objective function to disable solving the root LP.",
2333 &(*set)->reopt_objsimrootlp, TRUE, SCIP_DEFAULT_REOPT_OBJSIMROOTLP, -1.0, 1.0,
2334 NULL, NULL) );
2335 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2336 "reoptimization/objsimsol",
2337 "similarity of two objective functions to re-use stored solutions",
2338 &(*set)->reopt_objsimsol, TRUE, SCIP_DEFAULT_REOPT_OBJSIMSOL, -1.0, 1.0,
2339 NULL, NULL) );
2340 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2341 "reoptimization/delay",
2342 "minimum similarity for using reoptimization of the search tree.",
2343 &(*set)->reopt_objsimdelay, TRUE, SCIP_DEFAULT_REOPT_OBJSIMDELAY, -1.0, 1.0,
2344 NULL, NULL) );
2345 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2346 "reoptimization/commontimelimit",
2347 "time limit over all reoptimization rounds?.",
2348 &(*set)->reopt_commontimelimit, TRUE, SCIP_DEFAULT_REOPT_COMMONTIMELIMIT,
2349 NULL, NULL) );
2350 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2351 "reoptimization/shrinkinner",
2352 "replace branched inner nodes by their child nodes, if the number of bound changes is not to large",
2353 &(*set)->reopt_shrinkinner, TRUE, SCIP_DEFAULT_REOPT_SHRINKINNER,
2354 NULL, NULL) );
2355 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2356 "reoptimization/strongbranchinginit",
2357 "try to fix variables at the root node before reoptimizing by probing like strong branching",
2358 &(*set)->reopt_sbinit, TRUE, SCIP_DEFAULT_REOPT_STRONGBRANCHINIT,
2359 NULL, NULL) );
2360 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2361 "reoptimization/reducetofrontier",
2362 "delete stored nodes which were not reoptimized",
2363 &(*set)->reopt_reducetofrontier, TRUE, SCIP_DEFAULT_REOPT_REDUCETOFRONTIER,
2364 NULL, NULL) );
2365 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2366 "reoptimization/forceheurrestart",
2367 "force a restart if the last n optimal solutions were found by heuristic reoptsols",
2368 &(*set)->reopt_forceheurrestart, TRUE, SCIP_DEFAULT_REOPT_FORCEHEURRESTART, 1, INT_MAX,
2369 NULL, NULL) );
2370 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2371 "reoptimization/saveconsprop",
2372 "save constraint propagations",
2373 &(*set)->reopt_saveconsprop, TRUE, SCIP_DEFAULT_REOPT_SAVECONSPROP,
2374 NULL, NULL) );
2375 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2376 "reoptimization/usesplitcons", "use constraints to reconstruct the subtree pruned be dual reduction when reactivating the node",
2377 &(*set)->reopt_usesplitcons, TRUE, SCIP_DEFAULT_REOPT_USESPLITCONS,
2378 NULL, NULL) );
2379 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2380 "reoptimization/varorderinterdiction", "use 'd'efault, 'r'andom or a variable ordering based on 'i'nference score for interdiction branching used during reoptimization",
2381 &(*set)->reopt_varorderinterdiction, TRUE, SCIP_DEFAULT_REOPT_VARORDERINTERDICTION, "dir",
2382 NULL, NULL) );
2383 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2384 "reoptimization/usecuts",
2385 "reoptimize cuts found at the root node",
2386 &(*set)->reopt_usecuts, TRUE, SCIP_DEFAULT_REOPT_USECUTS,
2387 NULL, NULL) );
2388 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2389 "reoptimization/maxcutage",
2390 "maximal age of a cut to be use for reoptimization",
2391 &(*set)->reopt_maxcutage, TRUE, SCIP_DEFAULT_REOPT_MAXCUTAGE, 0, INT_MAX,
2392 NULL, NULL) );
2393
2394 /* separation parameters */
2395 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2396 "separating/maxbounddist",
2397 "maximal relative distance from current node's dual bound to primal bound compared to best node's dual bound for applying separation (0.0: only on current best node, 1.0: on all nodes)",
2398 &(*set)->sepa_maxbounddist, FALSE, SCIP_DEFAULT_SEPA_MAXBOUNDDIST, 0.0, 1.0,
2399 NULL, NULL) );
2400 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2401 "separating/maxlocalbounddist",
2402 "maximal relative distance from current node's dual bound to primal bound compared to best node's dual bound for applying local separation (0.0: only on current best node, 1.0: on all nodes)",
2403 &(*set)->sepa_maxlocalbounddist, FALSE, SCIP_DEFAULT_SEPA_MAXLOCALBOUNDDIST, 0.0, 1.0,
2404 NULL, NULL) );
2405 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2406 "separating/maxcoefratio",
2407 "maximal ratio between coefficients in strongcg, cmir, and flowcover cuts",
2408 &(*set)->sepa_maxcoefratio, FALSE, SCIP_DEFAULT_SEPA_MAXCOEFRATIO, 1.0, SCIP_INVALID/10.0,
2409 NULL, NULL) );
2410 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2411 "separating/maxcoefratiofacrowprep",
2412 "maximal ratio between coefficients (as factor of 1/feastol) to ensure in rowprep cleanup",
2413 &(*set)->sepa_maxcoefratiofacrowprep, FALSE, SCIP_DEFAULT_SEPA_MAXCOEFRATIOFACROWPREP, 0.0, SCIP_REAL_MAX,
2414 NULL, NULL) );
2415 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2416 "separating/minefficacy",
2417 "minimal efficacy for a cut to enter the LP",
2418 &(*set)->sepa_minefficacy, FALSE, SCIP_DEFAULT_SEPA_MINEFFICACY, 0.0, SCIP_INVALID/10.0,
2419 NULL, NULL) );
2420 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2421 "separating/minefficacyroot",
2422 "minimal efficacy for a cut to enter the LP in the root node",
2423 &(*set)->sepa_minefficacyroot, FALSE, SCIP_DEFAULT_SEPA_MINEFFICACYROOT, 0.0, SCIP_INVALID/10.0,
2424 NULL, NULL) );
2425 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2426 "separating/minactivityquot",
2427 "minimum cut activity quotient to convert cuts into constraints during a restart (0.0: all cuts are converted)",
2428 &(*set)->sepa_minactivityquot, FALSE, SCIP_DEFAULT_SEPA_MINACTIVITYQUOT, 0.0, 1.0,
2429 NULL, NULL) );
2430 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2431 "separating/orthofunc",
2432 "function used for calc. scalar prod. in orthogonality test ('e'uclidean, 'd'iscrete)",
2433 &(*set)->sepa_orthofunc, TRUE, SCIP_DEFAULT_SEPA_ORTHOFUNC, "ed",
2434 NULL, NULL) );
2435 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2436 "separating/efficacynorm",
2437 "row norm to use for efficacy calculation ('e'uclidean, 'm'aximum, 's'um, 'd'iscrete)",
2438 &(*set)->sepa_efficacynorm, TRUE, SCIP_DEFAULT_SEPA_EFFICACYNORM, "emsd",
2439 NULL, NULL) );
2440 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2441 "separating/cutselrestart",
2442 "cut selection during restart ('a'ge, activity 'q'uotient)",
2443 &(*set)->sepa_cutselrestart, TRUE, SCIP_DEFAULT_SEPA_CUTSELRESTART, "aq",
2444 NULL, NULL) );
2445 SCIP_CALL( SCIPsetAddCharParam(*set, messagehdlr, blkmem,
2446 "separating/cutselsubscip",
2447 "cut selection for sub SCIPs ('a'ge, activity 'q'uotient)",
2448 &(*set)->sepa_cutselsubscip, TRUE, SCIP_DEFAULT_SEPA_CUTSELSUBSCIP, "aq",
2449 NULL, NULL) );
2450 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2451 "separating/filtercutpoolrel",
2452 "should cutpool separate only cuts with high relative efficacy?",
2453 &(*set)->sepa_filtercutpoolrel, TRUE, SCIP_DEFAULT_SEPA_FILTERCUTPOOLREL,
2454 NULL, NULL) );
2455 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2456 "separating/maxruns",
2457 "maximal number of runs for which separation is enabled (-1: unlimited)",
2458 &(*set)->sepa_maxruns, TRUE, SCIP_DEFAULT_SEPA_MAXRUNS, -1, INT_MAX,
2459 NULL, NULL) );
2460 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2461 "separating/maxrounds",
2462 "maximal number of separation rounds per node (-1: unlimited)",
2463 &(*set)->sepa_maxrounds, FALSE, SCIP_DEFAULT_SEPA_MAXROUNDS, -1, INT_MAX,
2464 NULL, NULL) );
2465 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2466 "separating/maxroundsroot",
2467 "maximal number of separation rounds in the root node (-1: unlimited)",
2468 &(*set)->sepa_maxroundsroot, FALSE, SCIP_DEFAULT_SEPA_MAXROUNDSROOT, -1, INT_MAX,
2469 NULL, NULL) );
2470 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2471 "separating/maxroundsrootsubrun",
2472 "maximal number of separation rounds in the root node of a subsequent run (-1: unlimited)",
2473 &(*set)->sepa_maxroundsrootsubrun, TRUE, SCIP_DEFAULT_SEPA_MAXROUNDSROOTSUBRUN, -1, INT_MAX,
2474 NULL, NULL) );
2475 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2476 "separating/maxaddrounds",
2477 "maximal additional number of separation rounds in subsequent price-and-cut loops (-1: no additional restriction)",
2478 &(*set)->sepa_maxaddrounds, TRUE, SCIP_DEFAULT_SEPA_MAXADDROUNDS, -1, INT_MAX,
2479 NULL, NULL) );
2480 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2481 "separating/maxstallrounds",
2482 "maximal number of consecutive separation rounds without objective or integrality improvement in local nodes (-1: no additional restriction)",
2483 &(*set)->sepa_maxstallrounds, FALSE, SCIP_DEFAULT_SEPA_MAXSTALLROUNDS, -1, INT_MAX,
2484 NULL, NULL) );
2485 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2486 "separating/maxstallroundsroot",
2487 "maximal number of consecutive separation rounds without objective or integrality improvement in the root node (-1: no additional restriction)",
2488 &(*set)->sepa_maxstallroundsroot, FALSE, SCIP_DEFAULT_SEPA_MAXSTALLROUNDSROOT, -1, INT_MAX,
2489 NULL, NULL) );
2490 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2491 "separating/maxcuts",
2492 "maximal number of cuts separated per separation round (0: disable local separation)",
2493 &(*set)->sepa_maxcuts, FALSE, SCIP_DEFAULT_SEPA_MAXCUTS, 0, INT_MAX,
2494 NULL, NULL) );
2495 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2496 "separating/maxcutsroot",
2497 "maximal number of separated cuts at the root node (0: disable root node separation)",
2498 &(*set)->sepa_maxcutsroot, FALSE, SCIP_DEFAULT_SEPA_MAXCUTSROOT, 0, INT_MAX,
2499 NULL, NULL) );
2500 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2501 "separating/cutagelimit",
2502 "maximum age a cut can reach before it is deleted from the global cut pool, or -1 to keep all cuts",
2503 &(*set)->sepa_cutagelimit, TRUE, SCIP_DEFAULT_SEPA_CUTAGELIMIT, -1, INT_MAX,
2504 NULL, NULL) );
2505 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2506 "separating/poolfreq",
2507 "separation frequency for the global cut pool (-1: disable global cut pool, 0: only separate pool at the root)",
2508 &(*set)->sepa_poolfreq, FALSE, SCIP_DEFAULT_SEPA_POOLFREQ, -1, SCIP_MAXTREEDEPTH,
2509 NULL, NULL) );
2510
2511 /* parallel parameters */
2512 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2513 "parallel/mode",
2514 "parallel optimisation mode, 0: opportunistic or 1: deterministic.",
2515 &(*set)->parallel_mode, FALSE, SCIP_DEFAULT_PARALLEL_MODE, 0, 1,
2516 NULL, NULL) );
2517 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2518 "parallel/minnthreads",
2519 "the minimum number of threads used during parallel solve",
2520 &(*set)->parallel_minnthreads, FALSE, SCIP_DEFAULT_PARALLEL_MINNTHREADS, 0, 64,
2521 NULL, NULL) );
2522 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2523 "parallel/maxnthreads",
2524 "the maximum number of threads used during parallel solve",
2525 &(*set)->parallel_maxnthreads, FALSE, SCIP_DEFAULT_PARALLEL_MAXNTHREADS, 0, 64,
2526 NULL, NULL) );
2527
2528 /* concurrent solver parameters */
2529 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2530 "concurrent/changeseeds",
2531 "set different random seeds in each concurrent solver?",
2532 &(*set)->concurrent_changeseeds, FALSE, SCIP_DEFAULT_CONCURRENT_CHANGESEEDS,
2533 NULL, NULL) );
2534 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2535 "concurrent/changechildsel",
2536 "use different child selection rules in each concurrent solver?",
2537 &(*set)->concurrent_changechildsel, FALSE, SCIP_DEFAULT_CONCURRENT_CHANGECHILDSEL,
2538 NULL, NULL) );
2539 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2540 "concurrent/commvarbnds",
2541 "should the concurrent solvers communicate global variable bound changes?",
2542 &(*set)->concurrent_commvarbnds, FALSE, SCIP_DEFAULT_CONCURRENT_COMMVARBNDS,
2543 NULL, NULL) );
2544 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2545 "concurrent/presolvebefore",
2546 "should the problem be presolved before it is copied to the concurrent solvers?",
2547 &(*set)->concurrent_presolvebefore, FALSE, SCIP_DEFAULT_CONCURRENT_PRESOLVEBEFORE,
2548 NULL, NULL) );
2549 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2550 "concurrent/initseed",
2551 "maximum number of solutions that will be shared in a one synchronization",
2552 &(*set)->concurrent_initseed, FALSE, SCIP_DEFAULT_CONCURRENT_INITSEED, 0, INT_MAX,
2553 NULL, NULL) );
2554 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2555 "concurrent/sync/freqinit",
2556 "initial frequency of synchronization with other threads",
2557 &(*set)->concurrent_freqinit, FALSE, SCIP_DEFAULT_CONCURRENT_FREQINIT, 0.0, SCIP_REAL_MAX,
2558 NULL, NULL) );
2559 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2560 "concurrent/sync/freqmax",
2561 "maximal frequency of synchronization with other threads",
2562 &(*set)->concurrent_freqmax, FALSE, SCIP_DEFAULT_CONCURRENT_FREQMAX, 0.0, SCIP_REAL_MAX,
2563 NULL, NULL) );
2564 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2565 "concurrent/sync/freqfactor",
2566 "factor by which the frequency of synchronization is changed",
2567 &(*set)->concurrent_freqfactor, FALSE, SCIP_DEFAULT_CONCURRENT_FREQFACTOR, 1.0, SCIP_REAL_MAX,
2568 NULL, NULL) );
2569 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2570 "concurrent/sync/targetprogress",
2571 "when adapting the synchronization frequency this value is the targeted relative difference by which the absolute gap decreases per synchronization",
2572 &(*set)->concurrent_targetprogress, FALSE, SCIP_DEFAULT_CONCURRENT_TARGETPROGRESS, 0.0, SCIP_REAL_MAX,
2573 NULL, NULL) );
2574 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2575 "concurrent/sync/maxnsols",
2576 "maximum number of solutions that will be shared in a single synchronization",
2577 &(*set)->concurrent_maxnsols, FALSE, SCIP_DEFAULT_CONCURRENT_MAXNSOLS, 0, 1000,
2578 NULL, NULL) );
2579 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2580 "concurrent/sync/maxnsyncdelay",
2581 "maximum number of synchronizations before reading is enforced regardless of delay",
2582 &(*set)->concurrent_maxnsyncdelay, TRUE, SCIP_DEFAULT_CONCURRENT_MAXNSYNCDELAY, 0, 100,
2583 NULL, NULL) );
2584 SCIP_CALL( SCIPsetAddRealParam(*set, messagehdlr, blkmem,
2585 "concurrent/sync/minsyncdelay",
2586 "minimum delay before synchronization data is read",
2587 &(*set)->concurrent_minsyncdelay, FALSE, SCIP_DEFAULT_CONCURRENT_MINSYNCDELAY, 0.0, SCIP_REAL_MAX,
2588 NULL, NULL) );
2589 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2590 "concurrent/sync/nbestsols",
2591 "how many of the N best solutions should be considered for synchronization?",
2592 &(*set)->concurrent_nbestsols, FALSE, SCIP_DEFAULT_CONCURRENT_NBESTSOLS, 0, INT_MAX,
2593 NULL, NULL) );
2594 SCIP_CALL( SCIPsetAddStringParam(*set, messagehdlr, blkmem,
2595 "concurrent/paramsetprefix",
2596 "path prefix for parameter setting files of concurrent solvers",
2597 &(*set)->concurrent_paramsetprefix, FALSE, SCIP_DEFAULT_CONCURRENT_PARAMSETPREFIX,
2598 NULL, NULL) );
2599
2600 /* timing parameters */
2601 assert(sizeof(int) == sizeof(SCIP_CLOCKTYPE)); /*lint !e506*/
2602 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2603 "timing/clocktype",
2604 "default clock type (1: CPU user seconds, 2: wall clock time)",
2605 (int*)&(*set)->time_clocktype, FALSE, (int)SCIP_DEFAULT_TIME_CLOCKTYPE, 1, 2,
2606 NULL, NULL) );
2607 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2608 "timing/enabled",
2609 "is timing enabled?",
2610 &(*set)->time_enabled, FALSE, SCIP_DEFAULT_TIME_ENABLED,
2611 NULL, NULL) );
2612 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2613 "timing/reading",
2614 "belongs reading time to solving time?",
2615 &(*set)->time_reading, FALSE, SCIP_DEFAULT_TIME_READING,
2616 NULL, NULL) );
2617 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2618 "timing/rareclockcheck",
2619 "should clock checks of solving time be performed less frequently (note: time limit could be exceeded slightly)",
2620 &(*set)->time_rareclockcheck, FALSE, SCIP_DEFAULT_TIME_RARECLOCKCHECK,
2621 NULL, NULL) );
2622 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2623 "timing/statistictiming",
2624 "should timing for statistic output be performed?",
2625 &(*set)->time_statistictiming, FALSE, SCIP_DEFAULT_TIME_STATISTICTIMING,
2626 paramChgdStatistictiming, NULL) );
2627 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2628 "timing/nlpieval",
2629 "should time for evaluation in NLP solves be measured?",
2630 &(*set)->time_nlpieval, FALSE, SCIP_DEFAULT_TIME_NLPIEVAL,
2631 NULL, NULL) );
2632
2633 /* visualization parameters */
2634 SCIP_CALL( SCIPsetAddStringParam(*set, messagehdlr, blkmem,
2635 "visual/vbcfilename",
2636 "name of the VBC tool output file, or - if no VBC tool output should be created",
2637 &(*set)->visual_vbcfilename, FALSE, SCIP_DEFAULT_VISUAL_VBCFILENAME,
2638 NULL, NULL) );
2639 SCIP_CALL( SCIPsetAddStringParam(*set, messagehdlr, blkmem,
2640 "visual/bakfilename",
2641 "name of the BAK tool output file, or - if no BAK tool output should be created",
2642 &(*set)->visual_bakfilename, FALSE, SCIP_DEFAULT_VISUAL_BAKFILENAME,
2643 NULL, NULL) );
2644 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2645 "visual/realtime",
2646 "should the real solving time be used instead of a time step counter in visualization?",
2647 &(*set)->visual_realtime, FALSE, SCIP_DEFAULT_VISUAL_REALTIME,
2648 NULL, NULL) );
2649 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2650 "visual/dispsols",
2651 "should the node where solutions are found be visualized?",
2652 &(*set)->visual_dispsols, FALSE, SCIP_DEFAULT_VISUAL_DISPSOLS,
2653 NULL, NULL) );
2654 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2655 "visual/displb",
2656 "should lower bound information be visualized?",
2657 &(*set)->visual_displb, FALSE, SCIP_DEFAULT_VISUAL_DISPLB,
2658 NULL, NULL) );
2659 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2660 "visual/objextern",
2661 "should be output the external value of the objective?",
2662 &(*set)->visual_objextern, FALSE, SCIP_DEFAULT_VISUAL_OBJEXTERN,
2663 NULL, NULL) );
2664
2665 /* Reading parameters */
2666 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2667 "reading/initialconss",
2668 "should model constraints be marked as initial?",
2669 &(*set)->read_initialconss, FALSE, SCIP_DEFAULT_READ_INITIALCONSS,
2670 NULL, NULL) );
2671 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2672 "reading/dynamicconss",
2673 "should model constraints be subject to aging?",
2674 &(*set)->read_dynamicconss, FALSE, SCIP_DEFAULT_READ_DYNAMICCONSS,
2675 NULL, NULL) );
2676 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2677 "reading/dynamiccols",
2678 "should columns be added and removed dynamically to the LP?",
2679 &(*set)->read_dynamiccols, FALSE, SCIP_DEFAULT_READ_DYNAMICCOLS,
2680 NULL, NULL) );
2681 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2682 "reading/dynamicrows",
2683 "should rows be added and removed dynamically to the LP?",
2684 &(*set)->read_dynamicrows, FALSE, SCIP_DEFAULT_READ_DYNAMICROWS,
2685 NULL, NULL) );
2686
2687 /* Writing parameters */
2688 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2689 "write/allconss",
2690 "should all constraints be written (including the redundant constraints)?",
2691 &(*set)->write_allconss, FALSE, SCIP_DEFAULT_WRITE_ALLCONSS,
2692 NULL, NULL) );
2693 SCIP_CALL( SCIPsetAddBoolParam(*set, messagehdlr, blkmem,
2694 "write/printzeros",
2695 "should variables set to zero be printed?",
2696 &(*set)->write_printzeros, FALSE, SCIP_DEFAULT_PRINTZEROS,
2697 NULL, NULL) );
2698 SCIP_CALL( SCIPsetAddIntParam(*set, messagehdlr, blkmem,
2699 "write/genericnamesoffset",
2700 "when writing a generic problem the index for the first variable should start with?",
2701 &(*set)->write_genoffset, FALSE, SCIP_DEFAULT_WRITE_GENNAMES_OFFSET, 0, INT_MAX/2,
2702 NULL, NULL) );
2703
2704 return SCIP_OKAY;
2705 }
2706
2707 /** frees global SCIP settings */
2708 SCIP_RETCODE SCIPsetFree(
2709 SCIP_SET** set, /**< pointer to SCIP settings */
2710 BMS_BLKMEM* blkmem /**< block memory */
2711 )
2712 {
2713 int i;
2714
2715 assert(set != NULL);
2716
2717 if( *set == NULL )
2718 return SCIP_OKAY;
2719
2720 /* free parameter set */
2721 SCIPparamsetFree(&(*set)->paramset, blkmem);
2722
2723 /* free file readers */
2724 for( i = 0; i < (*set)->nreaders; ++i )
2725 {
2726 SCIP_CALL( SCIPreaderFree(&(*set)->readers[i], *set) );
2727 }
2728 BMSfreeMemoryArrayNull(&(*set)->readers);
2729
2730 /* free variable pricers */
2731 for( i = 0; i < (*set)->npricers; ++i )
2732 {
2733 SCIP_CALL( SCIPpricerFree(&(*set)->pricers[i], *set) );
2734 }
2735 BMSfreeMemoryArrayNull(&(*set)->pricers);
2736
2737 /* free Benders' decomposition */
2738 for( i = 0; i < (*set)->nbenders; ++i )
2739 {
2740 SCIP_CALL( SCIPbendersFree(&(*set)->benders[i], *set) );
2741 }
2742 BMSfreeMemoryArrayNull(&(*set)->benders);
2743
2744 /* free constraint handlers */
2745 for( i = 0; i < (*set)->nconshdlrs; ++i )
2746 {
2747 SCIP_CALL( SCIPconshdlrFree(&(*set)->conshdlrs[i], *set) );
2748 }
2749 BMSfreeMemoryArrayNull(&(*set)->conshdlrs);
2750 BMSfreeMemoryArrayNull(&(*set)->conshdlrs_sepa);
2751 BMSfreeMemoryArrayNull(&(*set)->conshdlrs_enfo);
2752 BMSfreeMemoryArrayNull(&(*set)->conshdlrs_include);
2753
2754 /* free conflict handlers */
2755 for( i = 0; i < (*set)->nconflicthdlrs; ++i )
2756 {
2757 SCIP_CALL( SCIPconflicthdlrFree(&(*set)->conflicthdlrs[i], *set) );
2758 }
2759 BMSfreeMemoryArrayNull(&(*set)->conflicthdlrs);
2760
2761 /* free presolvers */
2762 for( i = 0; i < (*set)->npresols; ++i )
2763 {
2764 SCIP_CALL( SCIPpresolFree(&(*set)->presols[i], *set) );
2765 }
2766 BMSfreeMemoryArrayNull(&(*set)->presols);
2767
2768 /* free relaxators */
2769 for( i = 0; i < (*set)->nrelaxs; ++i )
2770 {
2771 SCIP_CALL( SCIPrelaxFree(&(*set)->relaxs[i], *set) );
2772 }
2773 BMSfreeMemoryArrayNull(&(*set)->relaxs);
2774
2775 /* free separators */
2776 for( i = 0; i < (*set)->nsepas; ++i )
2777 {
2778 SCIP_CALL( SCIPsepaFree(&(*set)->sepas[i], *set) );
2779 }
2780 BMSfreeMemoryArrayNull(&(*set)->sepas);
2781
2782 /* free cut selectors */
2783 for( i = 0; i < (*set)->ncutsels; ++i)
2784 {
2785 SCIP_CALL( SCIPcutselFree(&(*set)->cutsels[i], *set) );
2786 }
2787 BMSfreeMemoryArrayNull(&(*set)->cutsels);
2788
2789 /* free propagators */
2790 for( i = 0; i < (*set)->nprops; ++i )
2791 {
2792 SCIP_CALL( SCIPpropFree(&(*set)->props[i], *set) );
2793 }
2794 BMSfreeMemoryArrayNull(&(*set)->props);
2795 BMSfreeMemoryArrayNull(&(*set)->props_presol);
2796
2797 /* free primal heuristics */
2798 for( i = 0; i < (*set)->nheurs; ++i )
2799 {
2800 SCIP_CALL( SCIPheurFree(&(*set)->heurs[i], *set, blkmem) );
2801 }
2802 BMSfreeMemoryArrayNull(&(*set)->heurs);
2803
2804 /* free tree compressions */
2805 for( i = 0; i < (*set)->ncomprs; ++i )
2806 {
2807 SCIP_CALL( SCIPcomprFree(&(*set)->comprs[i], *set) );
2808 }
2809 BMSfreeMemoryArrayNull(&(*set)->comprs);
2810
2811 /* free event handlers */
2812 for( i = 0; i < (*set)->neventhdlrs; ++i )
2813 {
2814 SCIP_CALL( SCIPeventhdlrFree(&(*set)->eventhdlrs[i], *set) );
2815 }
2816 BMSfreeMemoryArrayNull(&(*set)->eventhdlrs);
2817
2818 /* free node selectors */
2819 for( i = 0; i < (*set)->nnodesels; ++i )
2820 {
2821 SCIP_CALL( SCIPnodeselFree(&(*set)->nodesels[i], *set) );
2822 }
2823 BMSfreeMemoryArrayNull(&(*set)->nodesels);
2824
2825 /* free branching methods */
2826 for( i = 0; i < (*set)->nbranchrules; ++i )
2827 {
2828 SCIP_CALL( SCIPbranchruleFree(&(*set)->branchrules[i], *set) );
2829 }
2830 BMSfreeMemoryArrayNull(&(*set)->branchrules);
2831
2832 /* free statistics tables */
2833 for( i = 0; i < (*set)->ntables; ++i )
2834 {
2835 SCIP_CALL( SCIPtableFree(&(*set)->tables[i], *set) );
2836 }
2837 BMSfreeMemoryArrayNull(&(*set)->tables);
2838
2839 /* free display columns */
2840 for( i = 0; i < (*set)->ndisps; ++i )
2841 {
2842 SCIP_CALL( SCIPdispFree(&(*set)->disps[i], *set) );
2843 }
2844 BMSfreeMemoryArrayNull(&(*set)->disps);
2845
2846 /* free dialogs */
2847 BMSfreeMemoryArrayNull(&(*set)->dialogs);
2848
2849 /* free expression handlers */
2850 for( i = 0; i < (*set)->nexprhdlrs; ++i )
2851 {
2852 SCIP_CALL( SCIPexprhdlrFree(&(*set)->exprhdlrs[i], *set, blkmem) );
2853 }
2854 BMSfreeMemoryArrayNull(&(*set)->exprhdlrs);
2855 (*set)->exprhdlrvar = NULL;
2856 (*set)->exprhdlrval = NULL;
2857 (*set)->exprhdlrsum = NULL;
2858 (*set)->exprhdlrproduct = NULL;
2859 (*set)->exprhdlrpow = NULL;
2860
2861 /* free NLPIs */
2862 for( i = 0; i < (*set)->nnlpis; ++i )
2863 {
2864 SCIP_CALL( SCIPnlpiFree(&(*set)->nlpis[i], *set) );
2865 }
2866 BMSfreeMemoryArrayNull(&(*set)->nlpis);
2867
2868 /* free concsolvers */
2869 SCIP_CALL( SCIPsetFreeConcsolvers(*set) );
2870
2871 /* free concsolvers types */
2872 for( i = 0; i < (*set)->nconcsolvertypes; ++i )
2873 {
2874 SCIPconcsolverTypeFree(&(*set)->concsolvertypes[i]);
2875 }
2876 BMSfreeMemoryArrayNull(&(*set)->concsolvertypes);
2877
2878 /* free information on external codes */
2879 for( i = 0; i < (*set)->nextcodes; ++i )
2880 {
2881 BMSfreeMemoryArrayNull(&(*set)->extcodenames[i]);
2882 BMSfreeMemoryArrayNull(&(*set)->extcodedescs[i]);
2883 }
2884 BMSfreeMemoryArrayNull(&(*set)->extcodenames);
2885 BMSfreeMemoryArrayNull(&(*set)->extcodedescs);
2886
2887 /* free virtual tables of bandit algorithms */
2888 for( i = 0; i < (*set)->nbanditvtables; ++i )
2889 {
2890 SCIPbanditvtableFree(&(*set)->banditvtables[i]);
2891 }
2892 BMSfreeMemoryArrayNull(&(*set)->banditvtables);
2893
2894 /* free debugging data structure */
2895 SCIP_CALL( SCIPdebugFree(*set) );
2896
2897 BMSfreeMemory(set);
2898
2899 return SCIP_OKAY;
2900 }
2901
2902 /** returns current stage of SCIP */
2903 SCIP_STAGE SCIPsetGetStage(
2904 SCIP_SET* set /**< global SCIP settings */
2905 )
2906 {
2907 assert(set != NULL);
2908
2909 return set->stage;
2910 }
2911
2912 /** creates a SCIP_Bool parameter, sets it to its default value, and adds it to the parameter set */
2913 SCIP_RETCODE SCIPsetAddBoolParam(
2914 SCIP_SET* set, /**< global SCIP settings */
2915 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2916 BMS_BLKMEM* blkmem, /**< block memory */
2917 const char* name, /**< name of the parameter */
2918 const char* desc, /**< description of the parameter */
2919 SCIP_Bool* valueptr, /**< pointer to store the current parameter value, or NULL */
2920 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
2921 SCIP_Bool defaultvalue, /**< default value of the parameter */
2922 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
2923 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
2924 )
2925 {
2926 assert(set != NULL);
2927
2928 SCIP_CALL( SCIPparamsetAddBool(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
2929 defaultvalue, paramchgd, paramdata) );
2930
2931 return SCIP_OKAY;
2932 }
2933
2934 /** creates an int parameter, sets it to its default value, and adds it to the parameter set */
2935 SCIP_RETCODE SCIPsetAddIntParam(
2936 SCIP_SET* set, /**< global SCIP settings */
2937 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2938 BMS_BLKMEM* blkmem, /**< block memory */
2939 const char* name, /**< name of the parameter */
2940 const char* desc, /**< description of the parameter */
2941 int* valueptr, /**< pointer to store the current parameter value, or NULL */
2942 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
2943 int defaultvalue, /**< default value of the parameter */
2944 int minvalue, /**< minimum value for parameter */
2945 int maxvalue, /**< maximum value for parameter */
2946 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
2947 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
2948 )
2949 {
2950 assert(set != NULL);
2951
2952 SCIP_CALL( SCIPparamsetAddInt(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
2953 defaultvalue, minvalue, maxvalue, paramchgd, paramdata) );
2954
2955 return SCIP_OKAY;
2956 }
2957
2958 /** creates a SCIP_Longint parameter, sets it to its default value, and adds it to the parameter set */
2959 SCIP_RETCODE SCIPsetAddLongintParam(
2960 SCIP_SET* set, /**< global SCIP settings */
2961 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2962 BMS_BLKMEM* blkmem, /**< block memory */
2963 const char* name, /**< name of the parameter */
2964 const char* desc, /**< description of the parameter */
2965 SCIP_Longint* valueptr, /**< pointer to store the current parameter value, or NULL */
2966 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
2967 SCIP_Longint defaultvalue, /**< default value of the parameter */
2968 SCIP_Longint minvalue, /**< minimum value for parameter */
2969 SCIP_Longint maxvalue, /**< maximum value for parameter */
2970 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
2971 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
2972 )
2973 {
2974 assert(set != NULL);
2975
2976 SCIP_CALL( SCIPparamsetAddLongint(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
2977 defaultvalue, minvalue, maxvalue, paramchgd, paramdata) );
2978
2979 return SCIP_OKAY;
2980 }
2981
2982 /** creates a SCIP_Real parameter, sets it to its default value, and adds it to the parameter set */
2983 SCIP_RETCODE SCIPsetAddRealParam(
2984 SCIP_SET* set, /**< global SCIP settings */
2985 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
2986 BMS_BLKMEM* blkmem, /**< block memory */
2987 const char* name, /**< name of the parameter */
2988 const char* desc, /**< description of the parameter */
2989 SCIP_Real* valueptr, /**< pointer to store the current parameter value, or NULL */
2990 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
2991 SCIP_Real defaultvalue, /**< default value of the parameter */
2992 SCIP_Real minvalue, /**< minimum value for parameter */
2993 SCIP_Real maxvalue, /**< maximum value for parameter */
2994 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
2995 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
2996 )
2997 {
2998 assert(set != NULL);
2999
3000 SCIP_CALL( SCIPparamsetAddReal(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
3001 defaultvalue, minvalue, maxvalue, paramchgd, paramdata) );
3002
3003 return SCIP_OKAY;
3004 }
3005
3006 /** creates a char parameter, sets it to its default value, and adds it to the parameter set */
3007 SCIP_RETCODE SCIPsetAddCharParam(
3008 SCIP_SET* set, /**< global SCIP settings */
3009 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3010 BMS_BLKMEM* blkmem, /**< block memory */
3011 const char* name, /**< name of the parameter */
3012 const char* desc, /**< description of the parameter */
3013 char* valueptr, /**< pointer to store the current parameter value, or NULL */
3014 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
3015 char defaultvalue, /**< default value of the parameter */
3016 const char* allowedvalues, /**< array with possible parameter values, or NULL if not restricted */
3017 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
3018 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
3019 )
3020 {
3021 assert(set != NULL);
3022
3023 SCIP_CALL( SCIPparamsetAddChar(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
3024 defaultvalue, allowedvalues, paramchgd, paramdata) );
3025
3026 return SCIP_OKAY;
3027 }
3028
3029 /** creates a string parameter, sets it to its default value, and adds it to the parameter set */
3030 SCIP_RETCODE SCIPsetAddStringParam(
3031 SCIP_SET* set, /**< global SCIP settings */
3032 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3033 BMS_BLKMEM* blkmem, /**< block memory */
3034 const char* name, /**< name of the parameter */
3035 const char* desc, /**< description of the parameter */
3036 char** valueptr, /**< pointer to store the current parameter value, or NULL */
3037 SCIP_Bool isadvanced, /**< is this parameter an advanced parameter? */
3038 const char* defaultvalue, /**< default value of the parameter */
3039 SCIP_DECL_PARAMCHGD ((*paramchgd)), /**< change information method of parameter */
3040 SCIP_PARAMDATA* paramdata /**< locally defined parameter specific data */
3041 )
3042 {
3043 assert(set != NULL);
3044
3045 SCIP_CALL( SCIPparamsetAddString(set->paramset, messagehdlr, blkmem, name, desc, valueptr, isadvanced,
3046 defaultvalue, paramchgd, paramdata) );
3047
3048 return SCIP_OKAY;
3049 }
3050
3051 /** gets the fixing status value of an existing parameter */
3052 SCIP_Bool SCIPsetIsParamFixed(
3053 SCIP_SET* set, /**< global SCIP settings */
3054 const char* name /**< name of the parameter */
3055 )
3056 {
3057 assert(set != NULL);
3058
3059 return SCIPparamsetIsFixed(set->paramset, name);
3060 }
3061
3062 /** returns the pointer to the SCIP parameter with the given name */
3063 SCIP_PARAM* SCIPsetGetParam(
3064 SCIP_SET* set, /**< global SCIP settings */
3065 const char* name /**< name of the parameter */
3066 )
3067 {
3068 assert(set != NULL);
3069
3070 return SCIPparamsetGetParam(set->paramset, name);
3071 }
3072
3073 /** gets the value of an existing SCIP_Bool parameter */
3074 SCIP_RETCODE SCIPsetGetBoolParam(
3075 SCIP_SET* set, /**< global SCIP settings */
3076 const char* name, /**< name of the parameter */
3077 SCIP_Bool* value /**< pointer to store the parameter */
3078 )
3079 {
3080 assert(set != NULL);
3081
3082 SCIP_CALL( SCIPparamsetGetBool(set->paramset, name, value) );
3083
3084 return SCIP_OKAY;
3085 }
3086
3087 /** gets the value of an existing Int parameter */
3088 SCIP_RETCODE SCIPsetGetIntParam(
3089 SCIP_SET* set, /**< global SCIP settings */
3090 const char* name, /**< name of the parameter */
3091 int* value /**< pointer to store the value of the parameter */
3092 )
3093 {
3094 assert(set != NULL);
3095
3096 SCIP_CALL( SCIPparamsetGetInt(set->paramset, name, value) );
3097
3098 return SCIP_OKAY;
3099 }
3100
3101 /** gets the value of an existing SCIP_Longint parameter */
3102 SCIP_RETCODE SCIPsetGetLongintParam(
3103 SCIP_SET* set, /**< global SCIP settings */
3104 const char* name, /**< name of the parameter */
3105 SCIP_Longint* value /**< pointer to store the value of the parameter */
3106 )
3107 {
3108 assert(set != NULL);
3109
3110 SCIP_CALL( SCIPparamsetGetLongint(set->paramset, name, value) );
3111
3112 return SCIP_OKAY;
3113 }
3114
3115 /** gets the value of an existing SCIP_Real parameter */
3116 SCIP_RETCODE SCIPsetGetRealParam(
3117 SCIP_SET* set, /**< global SCIP settings */
3118 const char* name, /**< name of the parameter */
3119 SCIP_Real* value /**< pointer to store the value of the parameter */
3120 )
3121 {
3122 assert(set != NULL);
3123
3124 SCIP_CALL( SCIPparamsetGetReal(set->paramset, name, value) );
3125
3126 return SCIP_OKAY;
3127 }
3128
3129 /** gets the value of an existing Char parameter */
3130 SCIP_RETCODE SCIPsetGetCharParam(
3131 SCIP_SET* set, /**< global SCIP settings */
3132 const char* name, /**< name of the parameter */
3133 char* value /**< pointer to store the value of the parameter */
3134 )
3135 {
3136 assert(set != NULL);
3137
3138 SCIP_CALL( SCIPparamsetGetChar(set->paramset, name, value) );
3139
3140 return SCIP_OKAY;
3141 }
3142
3143 /** gets the value of an existing String parameter */
3144 SCIP_RETCODE SCIPsetGetStringParam(
3145 SCIP_SET* set, /**< global SCIP settings */
3146 const char* name, /**< name of the parameter */
3147 char** value /**< pointer to store the value of the parameter */
3148 )
3149 {
3150 assert(set != NULL);
3151
3152 SCIP_CALL( SCIPparamsetGetString(set->paramset, name, value) );
3153
3154 return SCIP_OKAY;
3155 }
3156
3157 /** changes the fixing status of an existing parameter */
3158 SCIP_RETCODE SCIPsetChgParamFixed(
3159 SCIP_SET* set, /**< global SCIP settings */
3160 const char* name, /**< name of the parameter */
3161 SCIP_Bool fixed /**< new fixing status of the parameter */
3162 )
3163 {
3164 assert(set != NULL);
3165
3166 SCIP_CALL( SCIPparamsetFix(set->paramset, name, fixed) );
3167
3168 return SCIP_OKAY;
3169 }
3170
3171 /** changes the value of an existing SCIP_Bool parameter */
3172 SCIP_RETCODE SCIPsetChgBoolParam(
3173 SCIP_SET* set, /**< global SCIP settings */
3174 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3175 SCIP_PARAM* param, /**< parameter */
3176 SCIP_Bool value /**< new value of the parameter */
3177 )
3178 {
3179 SCIP_RETCODE retcode;
3180
3181 assert(set != NULL);
3182
3183 retcode = SCIPparamSetBool(param, set, messagehdlr, value, FALSE, TRUE);
3184
3185 if( retcode != SCIP_PARAMETERWRONGVAL )
3186 {
3187 SCIP_CALL( retcode );
3188 }
3189
3190 return retcode;
3191 }
3192
3193 /** changes the value of an existing SCIP_Bool parameter */
3194 SCIP_RETCODE SCIPsetSetBoolParam(
3195 SCIP_SET* set, /**< global SCIP settings */
3196 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3197 const char* name, /**< name of the parameter */
3198 SCIP_Bool value /**< new value of the parameter */
3199 )
3200 {
3201 assert(set != NULL);
3202
3203 SCIP_CALL( SCIPparamsetSetBool(set->paramset, set, messagehdlr, name, value) );
3204
3205 return SCIP_OKAY;
3206 }
3207
3208 /** sets the default value of an existing SCIP_Bool parameter */
3209 SCIP_RETCODE SCIPsetSetDefaultBoolParam(
3210 SCIP_SET* set, /**< global SCIP settings */
3211 const char* name, /**< name of the parameter */
3212 SCIP_Bool defaultvalue /**< new default value of the parameter */
3213 )
3214 {
3215 assert(set != NULL);
3216
3217 SCIP_CALL( SCIPparamsetSetDefaultBool(set->paramset, name, defaultvalue) );
3218
3219 return SCIP_OKAY;
3220 }
3221
3222
3223 /** changes the value of an existing Int parameter */
3224 SCIP_RETCODE SCIPsetChgIntParam(
3225 SCIP_SET* set, /**< global SCIP settings */
3226 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3227 SCIP_PARAM* param, /**< parameter */
3228 int value /**< new value of the parameter */
3229 )
3230 {
3231 SCIP_RETCODE retcode;
3232
3233 assert(set != NULL);
3234 assert(param != NULL);
3235
3236 retcode = SCIPparamSetInt(param, set, messagehdlr, value, FALSE, TRUE);
3237
3238 if( retcode != SCIP_PARAMETERWRONGVAL )
3239 {
3240 SCIP_CALL( retcode );
3241 }
3242
3243 return retcode;
3244 }
3245
3246 /** changes the value of an existing Int parameter */
3247 SCIP_RETCODE SCIPsetSetIntParam(
3248 SCIP_SET* set, /**< global SCIP settings */
3249 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3250 const char* name, /**< name of the parameter */
3251 int value /**< new value of the parameter */
3252 )
3253 {
3254 assert(set != NULL);
3255
3256 SCIP_CALL( SCIPparamsetSetInt(set->paramset, set, messagehdlr, name, value) );
3257
3258 return SCIP_OKAY;
3259 }
3260
3261 /** changes the default value of an existing Int parameter */
3262 SCIP_RETCODE SCIPsetSetDefaultIntParam(
3263 SCIP_SET* set, /**< global SCIP settings */
3264 const char* name, /**< name of the parameter */
3265 int defaultvalue /**< new default value of the parameter */
3266 )
3267 {
3268 assert(set != NULL);
3269
3270 SCIP_CALL( SCIPparamsetSetDefaultInt(set->paramset, name, defaultvalue) );
3271
3272 return SCIP_OKAY;
3273 }
3274
3275 /** changes the value of an existing SCIP_Longint parameter */
3276 SCIP_RETCODE SCIPsetChgLongintParam(
3277 SCIP_SET* set, /**< global SCIP settings */
3278 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3279 SCIP_PARAM* param, /**< parameter */
3280 SCIP_Longint value /**< new value of the parameter */
3281 )
3282 {
3283 SCIP_RETCODE retcode;
3284
3285 assert(set != NULL);
3286 assert(param != NULL);
3287
3288 retcode = SCIPparamSetLongint(param, set, messagehdlr, value, FALSE, TRUE);
3289
3290 if( retcode != SCIP_PARAMETERWRONGVAL )
3291 {
3292 SCIP_CALL( retcode );
3293 }
3294
3295 return retcode;
3296 }
3297
3298 /** changes the value of an existing SCIP_Longint parameter */
3299 SCIP_RETCODE SCIPsetSetLongintParam(
3300 SCIP_SET* set, /**< global SCIP settings */
3301 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3302 const char* name, /**< name of the parameter */
3303 SCIP_Longint value /**< new value of the parameter */
3304 )
3305 {
3306 assert(set != NULL);
3307
3308 SCIP_CALL( SCIPparamsetSetLongint(set->paramset, set, messagehdlr, name, value) );
3309
3310 return SCIP_OKAY;
3311 }
3312
3313 /** changes the value of an existing SCIP_Real parameter */
3314 SCIP_RETCODE SCIPsetChgRealParam(
3315 SCIP_SET* set, /**< global SCIP settings */
3316 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3317 SCIP_PARAM* param, /**< parameter */
3318 SCIP_Real value /**< new value of the parameter */
3319 )
3320 {
3321 SCIP_RETCODE retcode;
3322
3323 assert(set != NULL);
3324 assert(param != NULL);
3325
3326 retcode = SCIPparamSetReal(param, set, messagehdlr, value, FALSE, TRUE);
3327
3328 if( retcode != SCIP_PARAMETERWRONGVAL )
3329 {
3330 SCIP_CALL( retcode );
3331 }
3332
3333 return retcode;
3334 }
3335
3336 /** changes the value of an existing SCIP_Real parameter */
3337 SCIP_RETCODE SCIPsetSetRealParam(
3338 SCIP_SET* set, /**< global SCIP settings */
3339 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3340 const char* name, /**< name of the parameter */
3341 SCIP_Real value /**< new value of the parameter */
3342 )
3343 {
3344 assert(set != NULL);
3345
3346 SCIP_CALL( SCIPparamsetSetReal(set->paramset, set, messagehdlr, name, value) );
3347
3348 return SCIP_OKAY;
3349 }
3350
3351 /** changes the value of an existing Char parameter */
3352 SCIP_RETCODE SCIPsetChgCharParam(
3353 SCIP_SET* set, /**< global SCIP settings */
3354 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3355 SCIP_PARAM* param, /**< parameter */
3356 char value /**< new value of the parameter */
3357 )
3358 {
3359 SCIP_RETCODE retcode;
3360
3361 assert(set != NULL);
3362 assert(param != NULL);
3363
3364 retcode = SCIPparamSetChar(param, set, messagehdlr, value, FALSE, TRUE);
3365
3366 if( retcode != SCIP_PARAMETERWRONGVAL )
3367 {
3368 SCIP_CALL( retcode );
3369 }
3370
3371 return retcode;
3372 }
3373
3374 /** changes the value of an existing Char parameter */
3375 SCIP_RETCODE SCIPsetSetCharParam(
3376 SCIP_SET* set, /**< global SCIP settings */
3377 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3378 const char* name, /**< name of the parameter */
3379 char value /**< new value of the parameter */
3380 )
3381 {
3382 assert(set != NULL);
3383
3384 SCIP_CALL( SCIPparamsetSetChar(set->paramset, set, messagehdlr, name, value) );
3385
3386 return SCIP_OKAY;
3387 }
3388
3389 /** changes the value of an existing String parameter */
3390 SCIP_RETCODE SCIPsetChgStringParam(
3391 SCIP_SET* set, /**< global SCIP settings */
3392 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3393 SCIP_PARAM* param, /**< parameter */
3394 const char* value /**< new value of the parameter */
3395 )
3396 {
3397 SCIP_RETCODE retcode;
3398
3399 assert(set != NULL);
3400 assert(param != NULL);
3401
3402 retcode = SCIPparamSetString(param, set, messagehdlr, value, TRUE);
3403
3404 if( retcode != SCIP_PARAMETERWRONGVAL )
3405 {
3406 SCIP_CALL( retcode );
3407 }
3408
3409 return retcode;
3410 }
3411
3412 /** changes the value of an existing String parameter */
3413 SCIP_RETCODE SCIPsetSetStringParam(
3414 SCIP_SET* set, /**< global SCIP settings */
3415 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3416 const char* name, /**< name of the parameter */
3417 const char* value /**< new value of the parameter */
3418 )
3419 {
3420 assert(set != NULL);
3421
3422 SCIP_CALL( SCIPparamsetSetString(set->paramset, set, messagehdlr, name, value) );
3423
3424 return SCIP_OKAY;
3425 }
3426
3427 /** reads parameters from a file */
3428 SCIP_RETCODE SCIPsetReadParams(
3429 SCIP_SET* set, /**< global SCIP settings */
3430 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3431 const char* filename /**< file name */
3432 )
3433 {
3434 assert(set != NULL);
3435
3436 SCIP_CALL( SCIPparamsetRead(set->paramset, set, messagehdlr, filename) );
3437
3438 return SCIP_OKAY;
3439 }
3440
3441 /** writes all parameters in the parameter set to a file */
3442 SCIP_RETCODE SCIPsetWriteParams(
3443 SCIP_SET* set, /**< global SCIP settings */
3444 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3445 const char* filename, /**< file name, or NULL for stdout */
3446 SCIP_Bool comments, /**< should parameter descriptions be written as comments? */
3447 SCIP_Bool onlychanged /**< should only the parameters been written, that are changed from default? */
3448 )
3449 {
3450 assert(set != NULL);
3451
3452 SCIP_CALL( SCIPparamsetWrite(set->paramset, messagehdlr, filename, comments, onlychanged) );
3453
3454 return SCIP_OKAY;
3455 }
3456
3457 /** resets a single parameters to its default value */
3458 SCIP_RETCODE SCIPsetResetParam(
3459 SCIP_SET* set, /**< global SCIP settings */
3460 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3461 const char* name /**< name of the parameter */
3462 )
3463 {
3464 SCIP_CALL( SCIPparamsetSetToDefault(set->paramset, set, messagehdlr, name) );
3465
3466 return SCIP_OKAY;
3467 }
3468
3469 /** resets all parameters to their default values */
3470 SCIP_RETCODE SCIPsetResetParams(
3471 SCIP_SET* set, /**< global SCIP settings */
3472 SCIP_MESSAGEHDLR* messagehdlr /**< message handler */
3473 )
3474 {
3475 SCIP_CALL( SCIPparamsetSetToDefaults(set->paramset, set, messagehdlr) );
3476
3477 return SCIP_OKAY;
3478 }
3479
3480 /** sets parameters to
3481 *
3482 * - \ref SCIP_PARAMEMPHASIS_DEFAULT to use default values (see also SCIPsetResetParams())
3483 * - \ref SCIP_PARAMEMPHASIS_COUNTER to get feasible and "fast" counting process
3484 * - \ref SCIP_PARAMEMPHASIS_CPSOLVER to get CP like search (e.g. no LP relaxation)
3485 * - \ref SCIP_PARAMEMPHASIS_EASYCIP to solve easy problems fast
3486 * - \ref SCIP_PARAMEMPHASIS_FEASIBILITY to detect feasibility fast
3487 * - \ref SCIP_PARAMEMPHASIS_HARDLP to be capable to handle hard LPs
3488 * - \ref SCIP_PARAMEMPHASIS_OPTIMALITY to prove optimality fast
3489 * - \ref SCIP_PARAMEMPHASIS_PHASEFEAS to find feasible solutions during a 3 phase solution process
3490 * - \ref SCIP_PARAMEMPHASIS_PHASEIMPROVE to find improved solutions during a 3 phase solution process
3491 * - \ref SCIP_PARAMEMPHASIS_PHASEPROOF to proof optimality during a 3 phase solution process
3492 */
3493 SCIP_RETCODE SCIPsetSetEmphasis(
3494 SCIP_SET* set, /**< global SCIP settings */
3495 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3496 SCIP_PARAMEMPHASIS paramemphasis, /**< parameter settings */
3497 SCIP_Bool quiet /**< should the parameter be set quiet (no output) */
3498 )
3499 {
3500 SCIP_CALL( SCIPparamsetSetEmphasis(set->paramset, set, messagehdlr, paramemphasis, quiet) );
3501
3502 return SCIP_OKAY;
3503 }
3504
3505 /** sets parameters to deactivate separators and heuristics that use auxiliary SCIP instances; should be called for
3506 * auxiliary SCIP instances to avoid recursion
3507 */
3508 SCIP_RETCODE SCIPsetSetSubscipsOff(
3509 SCIP_SET* set, /**< global SCIP settings */
3510 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3511 SCIP_Bool quiet /**< should the parameter be set quiet (no output) */
3512 )
3513 {
3514 SCIP_CALL( SCIPparamsetSetToSubscipsOff(set->paramset, set, messagehdlr, quiet) );
3515
3516 return SCIP_OKAY;
3517 }
3518
3519 /** sets heuristic parameters values to
3520 * - SCIP_PARAMSETTING_DEFAULT which are the default values of all heuristic parameters
3521 * - SCIP_PARAMSETTING_FAST such that the time spent on heuristics is decreased
3522 * - SCIP_PARAMSETTING_AGGRESSIVE such that the heuristics are called more aggressively
3523 * - SCIP_PARAMSETTING_OFF which turn off all heuristics
3524 */
3525 SCIP_RETCODE SCIPsetSetHeuristics(
3526 SCIP_SET* set, /**< global SCIP settings */
3527 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3528 SCIP_PARAMSETTING paramsetting, /**< parameter settings */
3529 SCIP_Bool quiet /**< should the parameter be set quiet (no output) */
3530 )
3531 {
3532 SCIP_CALL( SCIPparamsetSetHeuristics(set->paramset, set, messagehdlr, paramsetting, quiet) );
3533
3534 return SCIP_OKAY;
3535 }
3536
3537 /** sets presolving parameters to
3538 * - SCIP_PARAMSETTING_DEFAULT which are the default values of all presolving parameters
3539 * - SCIP_PARAMSETTING_FAST such that the time spent on presolving is decreased
3540 * - SCIP_PARAMSETTING_AGGRESSIVE such that the presolving is more aggressive
3541 * - SCIP_PARAMSETTING_OFF which turn off all presolving
3542 */
3543 SCIP_RETCODE SCIPsetSetPresolving(
3544 SCIP_SET* set, /**< global SCIP settings */
3545 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3546 SCIP_PARAMSETTING paramsetting, /**< parameter settings */
3547 SCIP_Bool quiet /**< should the parameter be set quiet (no output) */
3548 )
3549 {
3550 SCIP_CALL( SCIPparamsetSetPresolving(set->paramset, set, messagehdlr, paramsetting, quiet) );
3551
3552 return SCIP_OKAY;
3553 }
3554
3555 /** sets separating parameters to
3556 * - SCIP_PARAMSETTING_DEFAULT which are the default values of all separating parameters
3557 * - SCIP_PARAMSETTING_FAST such that the time spent on separating is decreased
3558 * - SCIP_PARAMSETTING_AGGRESSIVE such that separating is more aggressive
3559 * - SCIP_PARAMSETTING_OFF which turn off all separating
3560 */
3561 SCIP_RETCODE SCIPsetSetSeparating(
3562 SCIP_SET* set, /**< global SCIP settings */
3563 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
3564 SCIP_PARAMSETTING paramsetting, /**< parameter settings */
3565 SCIP_Bool quiet /**< should the parameter be set quiet (no output) */
3566 )
3567 {
3568 SCIP_CALL( SCIPparamsetSetSeparating(set->paramset, set, messagehdlr, paramsetting, quiet) );
3569
3570 return SCIP_OKAY;
3571 }
3572
3573 /** returns the array of all available SCIP parameters */
3574 SCIP_PARAM** SCIPsetGetParams(
3575 SCIP_SET* set /**< global SCIP settings */
3576 )
3577 {
3578 assert(set != NULL);
3579
3580 return SCIPparamsetGetParams(set->paramset);
3581 }
3582
3583 /** returns the total number of all available SCIP parameters */
3584 int SCIPsetGetNParams(
3585 SCIP_SET* set /**< global SCIP settings */
3586 )
3587 {
3588 assert(set != NULL);
3589
3590 return SCIPparamsetGetNParams(set->paramset);
3591 }
3592
3593 /** inserts file reader in file reader list */
3594 SCIP_RETCODE SCIPsetIncludeReader(
3595 SCIP_SET* set, /**< global SCIP settings */
3596 SCIP_READER* reader /**< file reader */
3597 )
3598 {
3599 assert(set != NULL);
3600 assert(reader != NULL);
3601
3602 if( set->nreaders >= set->readerssize )
3603 {
3604 set->readerssize = SCIPsetCalcMemGrowSize(set, set->nreaders+1);
3605 SCIP_ALLOC( BMSreallocMemoryArray(&set->readers, set->readerssize) );
3606 }
3607 assert(set->nreaders < set->readerssize);
3608
3609 set->readers[set->nreaders] = reader;
3610 set->nreaders++;
3611
3612 return SCIP_OKAY;
3613 }
3614
3615 /** returns the file reader of the given name, or NULL if not existing */
3616 SCIP_READER* SCIPsetFindReader(
3617 SCIP_SET* set, /**< global SCIP settings */
3618 const char* name /**< name of file reader */
3619 )
3620 {
3621 int i;
3622
3623 assert(set != NULL);
3624 assert(name != NULL);
3625
3626 for( i = 0; i < set->nreaders; ++i )
3627 {
3628 if( strcmp(SCIPreaderGetName(set->readers[i]), name) == 0 )
3629 return set->readers[i];
3630 }
3631
3632 return NULL;
3633 }
3634
3635 /** inserts variable pricer in variable pricer list */
3636 SCIP_RETCODE SCIPsetIncludePricer(
3637 SCIP_SET* set, /**< global SCIP settings */
3638 SCIP_PRICER* pricer /**< variable pricer */
3639 )
3640 {
3641 assert(set != NULL);
3642 assert(pricer != NULL);
3643
3644 if( set->npricers >= set->pricerssize )
3645 {
3646 set->pricerssize = SCIPsetCalcMemGrowSize(set, set->npricers+1);
3647 SCIP_ALLOC( BMSreallocMemoryArray(&set->pricers, set->pricerssize) );
3648 }
3649 assert(set->npricers < set->pricerssize);
3650
3651 set->pricers[set->npricers] = pricer;
3652 set->npricers++;
3653 set->pricerssorted = FALSE;
3654
3655 return SCIP_OKAY;
3656 }
3657
3658 /** returns the variable pricer of the given name, or NULL if not existing */
3659 SCIP_PRICER* SCIPsetFindPricer(
3660 SCIP_SET* set, /**< global SCIP settings */
3661 const char* name /**< name of variable pricer */
3662 )
3663 {
3664 int i;
3665
3666 assert(set != NULL);
3667 assert(name != NULL);
3668
3669 for( i = 0; i < set->npricers; ++i )
3670 {
3671 if( strcmp(SCIPpricerGetName(set->pricers[i]), name) == 0 )
3672 return set->pricers[i];
3673 }
3674
3675 return NULL;
3676 }
3677
3678 /** sorts pricers by priorities */
3679 void SCIPsetSortPricers(
3680 SCIP_SET* set /**< global SCIP settings */
3681 )
3682 {
3683 assert(set != NULL);
3684
3685 if( !set->pricerssorted )
3686 {
3687 SCIPsortPtr((void**)set->pricers, SCIPpricerComp, set->npricers);
3688 set->pricerssorted = TRUE;
3689 set->pricersnamesorted = FALSE;
3690 }
3691 }
3692
3693 /** sorts pricers by name */
3694 void SCIPsetSortPricersName(
3695 SCIP_SET* set /**< global SCIP settings */
3696 )
3697 {
3698 assert(set != NULL);
3699
3700 if( !set->pricersnamesorted )
3701 {
3702 SCIPsortPtr((void**)set->pricers, SCIPpricerCompName, set->npricers);
3703 set->pricerssorted = FALSE;
3704 set->pricersnamesorted = TRUE;
3705 }
3706 }
3707
3708 /** inserts Benders' decomposition in the Benders' decomposition list */
3709 SCIP_RETCODE SCIPsetIncludeBenders(
3710 SCIP_SET* set, /**< global SCIP settings */
3711 SCIP_BENDERS* benders /**< Benders' decomposition structure */
3712 )
3713 {
3714 assert(set != NULL);
3715 assert(benders != NULL);
3716
3717 if( set->nbenders >= set->benderssize )
3718 {
3719 set->benderssize = SCIPsetCalcMemGrowSize(set, set->nbenders+1);
3720 SCIP_ALLOC( BMSreallocMemoryArray(&set->benders, set->benderssize) );
3721 }
3722 assert(set->nbenders < set->benderssize);
3723
3724 set->benders[set->nbenders] = benders;
3725 set->nbenders++;
3726 set->benderssorted = FALSE;
3727
3728 return SCIP_OKAY;
3729 }
3730
3731 /** returns the Benders' decomposition of the given name, or NULL if not existing */
3732 SCIP_BENDERS* SCIPsetFindBenders(
3733 SCIP_SET* set, /**< global SCIP settings */
3734 const char* name /**< name of the Benders' decomposition */
3735 )
3736 {
3737 int i;
3738
3739 assert(set != NULL);
3740 assert(name != NULL);
3741
3742 for( i = 0; i < set->nbenders; ++i )
3743 {
3744 if( strcmp(SCIPbendersGetName(set->benders[i]), name) == 0 )
3745 return set->benders[i];
3746 }
3747
3748 return NULL;
3749 }
3750
3751 /** sorts Benders' decomposition by priorities */
3752 void SCIPsetSortBenders(
3753 SCIP_SET* set /**< global SCIP settings */
3754 )
3755 {
3756 assert(set != NULL);
3757
3758 if( !set->benderssorted )
3759 {
3760 SCIPsortPtr((void**)set->benders, SCIPbendersComp, set->nbenders);
3761 set->benderssorted = TRUE;
3762 set->bendersnamesorted = FALSE;
3763 }
3764 }
3765
3766 /** sorts Benders' decomposition by name */
3767 void SCIPsetSortBendersName(
3768 SCIP_SET* set /**< global SCIP settings */
3769 )
3770 {
3771 assert(set != NULL);
3772
3773 if( !set->bendersnamesorted )
3774 {
3775 SCIPsortPtr((void**)set->benders, SCIPbendersCompName, set->nbenders);
3776 set->benderssorted = FALSE;
3777 set->bendersnamesorted = TRUE;
3778 }
3779 }
3780
3781 /** inserts constraint handler in constraint handler list */
3782 SCIP_RETCODE SCIPsetIncludeConshdlr(
3783 SCIP_SET* set, /**< global SCIP settings */
3784 SCIP_CONSHDLR* conshdlr /**< constraint handler */
3785 )
3786 {
3787 int priority;
3788 int i;
3789
3790 assert(set != NULL);
3791 assert(conshdlr != NULL);
3792 assert(!SCIPconshdlrIsInitialized(conshdlr));
3793
3794 /* allocate memory */
3795 if( set->nconshdlrs >= set->conshdlrssize )
3796 {
3797 set->conshdlrssize = SCIPsetCalcMemGrowSize(set, set->nconshdlrs+1);
3798 SCIP_ALLOC( BMSreallocMemoryArray(&set->conshdlrs, set->conshdlrssize) );
3799 SCIP_ALLOC( BMSreallocMemoryArray(&set->conshdlrs_sepa, set->conshdlrssize) );
3800 SCIP_ALLOC( BMSreallocMemoryArray(&set->conshdlrs_enfo, set->conshdlrssize) );
3801 SCIP_ALLOC( BMSreallocMemoryArray(&set->conshdlrs_include, set->conshdlrssize) );
3802 }
3803 assert(set->nconshdlrs < set->conshdlrssize);
3804
3805 /* sort constraint handler into conshdlrs array sorted by check priority */
3806 priority = SCIPconshdlrGetCheckPriority(conshdlr);
3807 for( i = set->nconshdlrs; i > 0 && SCIPconshdlrGetCheckPriority(set->conshdlrs[i-1]) < priority; --i )
3808 {
3809 set->conshdlrs[i] = set->conshdlrs[i-1];
3810 }
3811 set->conshdlrs[i] = conshdlr;
3812
3813 /* sort constraint handler into conshdlrs_sepa array sorted by sepa priority */
3814 priority = SCIPconshdlrGetSepaPriority(conshdlr);
3815 for( i = set->nconshdlrs; i > 0 && SCIPconshdlrGetSepaPriority(set->conshdlrs_sepa[i-1]) < priority; --i )
3816 {
3817 set->conshdlrs_sepa[i] = set->conshdlrs_sepa[i-1];
3818 }
3819 set->conshdlrs_sepa[i] = conshdlr;
3820
3821 /* sort constraint handler into conshdlrs_enfo array sorted by enfo priority */
3822 priority = SCIPconshdlrGetEnfoPriority(conshdlr);
3823 for( i = set->nconshdlrs; i > 0 && SCIPconshdlrGetEnfoPriority(set->conshdlrs_enfo[i-1]) < priority; --i )
3824 {
3825 set->conshdlrs_enfo[i] = set->conshdlrs_enfo[i-1];
3826 }
3827 set->conshdlrs_enfo[i] = conshdlr;
3828
3829 /* add constraint handler into conshdlrs_include array sorted by inclusion order */
3830 set->conshdlrs_include[set->nconshdlrs] = conshdlr;
3831
3832 set->nconshdlrs++;
3833
3834 return SCIP_OKAY;
3835 }
3836
3837 /** reinserts a constraint handler with modified sepa priority into the sepa priority sorted array */
3838 void SCIPsetReinsertConshdlrSepaPrio(
3839 SCIP_SET* set, /**< global SCIP settings */
3840 SCIP_CONSHDLR* conshdlr, /**< constraint handler to be reinserted */
3841 int oldpriority /**< the old separation priority of constraint handler */
3842 )
3843 {
3844 int newpriority;
3845 int newpos;
3846 int i;
3847 assert(set != NULL);
3848 assert(conshdlr != NULL);
3849
3850 newpriority = SCIPconshdlrGetSepaPriority(conshdlr);
3851 newpos = -1;
3852
3853 /* search for the old position of constraint handler; determine its new position at the same time */
3854 if( newpriority > oldpriority )
3855 {
3856 i = 0;
3857 while( i < set->nconshdlrs &&
3858 strcmp(SCIPconshdlrGetName(set->conshdlrs_sepa[i]), SCIPconshdlrGetName(conshdlr)) != 0 )
3859 {
3860 int priorityatpos;
3861
3862 priorityatpos = SCIPconshdlrGetSepaPriority(set->conshdlrs_sepa[i]);
3863 assert(priorityatpos >= oldpriority);
3864
3865 /* current index is the position to insert the constraint handler */
3866 if( newpriority > priorityatpos && newpos == -1 )
3867 newpos = i;
3868
3869 ++i;
3870 }
3871 assert(i < set->nconshdlrs);
3872
3873 /* constraint must change its position in array */
3874 if( newpos != -1 )
3875 {
3876 /* shift all constraint handlers between old and new position by one, and insert constraint handler */
3877 for( ; i > newpos; --i )
3878 {
3879 set->conshdlrs_sepa[i] = set->conshdlrs_sepa[i-1];
3880 }
3881 set->conshdlrs_sepa[newpos] = conshdlr;
3882 }
3883 }
3884 else if( newpriority < oldpriority )
3885 {
3886 i = set->nconshdlrs - 1;
3887 while( i >= 0 && strcmp(SCIPconshdlrGetName(set->conshdlrs_sepa[i]), SCIPconshdlrGetName(conshdlr)) != 0 )
3888 {
3889 int priorityatpos;
3890
3891 priorityatpos = SCIPconshdlrGetSepaPriority(set->conshdlrs_sepa[i]);
3892 assert(priorityatpos <= oldpriority);
3893
3894 /* current index is the position to insert the constraint handler */
3895 if( newpriority < priorityatpos && newpos == -1 )
3896 newpos = i;
3897
3898 --i;
3899 }
3900 assert(i >= 0);
3901
3902 /* constraint must change its position in array */
3903 if( newpos != -1 )
3904 {
3905 /* shift all constraint handlers between old and new position by one, and insert constraint handler */
3906 for(; i < newpos; ++i )
3907 {
3908 set->conshdlrs_sepa[i] = set->conshdlrs_sepa[i + 1];
3909 }
3910 set->conshdlrs_sepa[newpos] = conshdlr;
3911 }
3912 #ifndef NDEBUG
3913 for( i = 0; i < set->nconshdlrs - 1; ++i )
3914 assert(SCIPconshdlrGetSepaPriority(set->conshdlrs_sepa[i])
3915 >= SCIPconshdlrGetSepaPriority(set->conshdlrs_sepa[i + 1]));
3916 #endif
3917 }
3918 }
3919
3920 /** returns the constraint handler of the given name, or NULL if not existing */
3921 SCIP_CONSHDLR* SCIPsetFindConshdlr(
3922 SCIP_SET* set, /**< global SCIP settings */
3923 const char* name /**< name of constraint handler */
3924 )
3925 {
3926 int i;
3927
3928 assert(set != NULL);
3929 assert(name != NULL);
3930
3931 for( i = 0; i < set->nconshdlrs; ++i )
3932 {
3933 if( strcmp(SCIPconshdlrGetName(set->conshdlrs[i]), name) == 0 )
3934 return set->conshdlrs[i];
3935 }
3936
3937 return NULL;
3938 }
3939
3940 /** inserts conflict handler in conflict handler list */
3941 SCIP_RETCODE SCIPsetIncludeConflicthdlr(
3942 SCIP_SET* set, /**< global SCIP settings */
3943 SCIP_CONFLICTHDLR* conflicthdlr /**< conflict handler */
3944 )
3945 {
3946 assert(set != NULL);
3947 assert(conflicthdlr != NULL);
3948 assert(!SCIPconflicthdlrIsInitialized(conflicthdlr));
3949
3950 if( set->nconflicthdlrs >= set->conflicthdlrssize )
3951 {
3952 set->conflicthdlrssize = SCIPsetCalcMemGrowSize(set, set->nconflicthdlrs+1);
3953 SCIP_ALLOC( BMSreallocMemoryArray(&set->conflicthdlrs, set->conflicthdlrssize) );
3954 }
3955 assert(set->nconflicthdlrs < set->conflicthdlrssize);
3956
3957 set->conflicthdlrs[set->nconflicthdlrs] = conflicthdlr;
3958 set->nconflicthdlrs++;
3959 set->conflicthdlrssorted = FALSE;
3960
3961 return SCIP_OKAY;
3962 }
3963
3964 /** returns the conflict handler of the given name, or NULL if not existing */
3965 SCIP_CONFLICTHDLR* SCIPsetFindConflicthdlr(
3966 SCIP_SET* set, /**< global SCIP settings */
3967 const char* name /**< name of conflict handler */
3968 )
3969 {
3970 int i;
3971
3972 assert(set != NULL);
3973 assert(name != NULL);
3974
3975 for( i = 0; i < set->nconflicthdlrs; ++i )
3976 {
3977 if( strcmp(SCIPconflicthdlrGetName(set->conflicthdlrs[i]), name) == 0 )
3978 return set->conflicthdlrs[i];
3979 }
3980
3981 return NULL;
3982 }
3983
3984 /** sorts conflict handlers by priorities */
3985 void SCIPsetSortConflicthdlrs(
3986 SCIP_SET* set /**< global SCIP settings */
3987 )
3988 {
3989 assert(set != NULL);
3990
3991 if( !set->conflicthdlrssorted )
3992 {
3993 SCIPsortPtr((void**)set->conflicthdlrs, SCIPconflicthdlrComp, set->nconflicthdlrs);
3994 set->conflicthdlrssorted = TRUE;
3995 set->conflicthdlrsnamesorted = FALSE;
3996 }
3997 }
3998
3999 /** sorts conflict handlers by name */
4000 void SCIPsetSortConflicthdlrsName(
4001 SCIP_SET* set /**< global SCIP settings */
4002 )
4003 {
4004 assert(set != NULL);
4005
4006 if( !set->conflicthdlrsnamesorted )
4007 {
4008 SCIPsortPtr((void**)set->conflicthdlrs, SCIPconflicthdlrCompName, set->nconflicthdlrs);
4009 set->conflicthdlrssorted = FALSE;
4010 set->conflicthdlrsnamesorted = TRUE;
4011 }
4012 }
4013
4014 /** inserts presolver in presolver list */
4015 SCIP_RETCODE SCIPsetIncludePresol(
4016 SCIP_SET* set, /**< global SCIP settings */
4017 SCIP_PRESOL* presol /**< presolver */
4018 )
4019 {
4020 assert(set != NULL);
4021 assert(presol != NULL);
4022
4023 if( set->npresols >= set->presolssize )
4024 {
4025 set->presolssize = SCIPsetCalcMemGrowSize(set, set->npresols+1);
4026 SCIP_ALLOC( BMSreallocMemoryArray(&set->presols, set->presolssize) );
4027 }
4028 assert(set->npresols < set->presolssize);
4029
4030 set->presols[set->npresols] = presol;
4031 set->npresols++;
4032 set->presolssorted = FALSE;
4033
4034 return SCIP_OKAY;
4035 }
4036
4037 /** returns the presolver of the given name, or NULL if not existing */
4038 SCIP_PRESOL* SCIPsetFindPresol(
4039 SCIP_SET* set, /**< global SCIP settings */
4040 const char* name /**< name of presolver */
4041 )
4042 {
4043 int i;
4044
4045 assert(set != NULL);
4046 assert(name != NULL);
4047
4048 for( i = 0; i < set->npresols; ++i )
4049 {
4050 if( strcmp(SCIPpresolGetName(set->presols[i]), name) == 0 )
4051 return set->presols[i];
4052 }
4053
4054 return NULL;
4055 }
4056
4057 /** sorts presolvers by priorities */
4058 void SCIPsetSortPresols(
4059 SCIP_SET* set /**< global SCIP settings */
4060 )
4061 {
4062 assert(set != NULL);
4063
4064 if( !set->presolssorted )
4065 {
4066 SCIPsortPtr((void**)set->presols, SCIPpresolComp, set->npresols);
4067 set->presolssorted = TRUE;
4068 set->presolsnamesorted = FALSE;
4069 }
4070 }
4071
4072 /** sorts presolvers by name */
4073 void SCIPsetSortPresolsName(
4074 SCIP_SET* set /**< global SCIP settings */
4075 )
4076 {
4077 assert(set != NULL);
4078
4079 if( !set->presolsnamesorted )
4080 {
4081 SCIPsortPtr((void**)set->presols, SCIPpresolCompName, set->npresols);
4082 set->presolssorted = FALSE;
4083 set->presolsnamesorted = TRUE;
4084 }
4085 }
4086
4087 /** inserts relaxator in relaxator list */
4088 SCIP_RETCODE SCIPsetIncludeRelax(
4089 SCIP_SET* set, /**< global SCIP settings */
4090 SCIP_RELAX* relax /**< relaxator */
4091 )
4092 {
4093 assert(set != NULL);
4094 assert(relax != NULL);
4095 assert(!SCIPrelaxIsInitialized(relax));
4096
4097 if( set->nrelaxs >= set->relaxssize )
4098 {
4099 set->relaxssize = SCIPsetCalcMemGrowSize(set, set->nrelaxs+1);
4100 SCIP_ALLOC( BMSreallocMemoryArray(&set->relaxs, set->relaxssize) );
4101 }
4102 assert(set->nrelaxs < set->relaxssize);
4103
4104 set->relaxs[set->nrelaxs] = relax;
4105 set->nrelaxs++;
4106 set->relaxssorted = FALSE;
4107
4108 return SCIP_OKAY;
4109 }
4110
4111 /** returns the relaxator of the given name, or NULL if not existing */
4112 SCIP_RELAX* SCIPsetFindRelax(
4113 SCIP_SET* set, /**< global SCIP settings */
4114 const char* name /**< name of relaxator */
4115 )
4116 {
4117 int i;
4118
4119 assert(set != NULL);
4120 assert(name != NULL);
4121
4122 for( i = 0; i < set->nrelaxs; ++i )
4123 {
4124 if( strcmp(SCIPrelaxGetName(set->relaxs[i]), name) == 0 )
4125 return set->relaxs[i];
4126 }
4127
4128 return NULL;
4129 }
4130
4131 /** sorts relaxators by priorities */
4132 void SCIPsetSortRelaxs(
4133 SCIP_SET* set /**< global SCIP settings */
4134 )
4135 {
4136 assert(set != NULL);
4137
4138 if( !set->relaxssorted )
4139 {
4140 SCIPsortPtr((void**)set->relaxs, SCIPrelaxComp, set->nrelaxs);
4141 set->relaxssorted = TRUE;
4142 set->relaxsnamesorted = FALSE;
4143 }
4144 }
4145
4146 /** sorts relaxators by priorities */
4147 void SCIPsetSortRelaxsName(
4148 SCIP_SET* set /**< global SCIP settings */
4149 )
4150 {
4151 assert(set != NULL);
4152
4153 if( !set->relaxsnamesorted )
4154 {
4155 SCIPsortPtr((void**)set->relaxs, SCIPrelaxCompName, set->nrelaxs);
4156 set->relaxssorted = FALSE;
4157 set->relaxsnamesorted = TRUE;
4158 }
4159 }
4160
4161 /** inserts separator in separator list */
4162 SCIP_RETCODE SCIPsetIncludeSepa(
4163 SCIP_SET* set, /**< global SCIP settings */
4164 SCIP_SEPA* sepa /**< separator */
4165 )
4166 {
4167 assert(set != NULL);
4168 assert(sepa != NULL);
4169 assert(!SCIPsepaIsInitialized(sepa));
4170
4171 if( set->nsepas >= set->sepassize )
4172 {
4173 set->sepassize = SCIPsetCalcMemGrowSize(set, set->nsepas+1);
4174 SCIP_ALLOC( BMSreallocMemoryArray(&set->sepas, set->sepassize) );
4175 }
4176 assert(set->nsepas < set->sepassize);
4177
4178 set->sepas[set->nsepas] = sepa;
4179 set->nsepas++;
4180 set->sepassorted = FALSE;
4181
4182 return SCIP_OKAY;
4183 }
4184
4185 /** returns the separator of the given name, or NULL if not existing */
4186 SCIP_SEPA* SCIPsetFindSepa(
4187 SCIP_SET* set, /**< global SCIP settings */
4188 const char* name /**< name of separator */
4189 )
4190 {
4191 int i;
4192
4193 assert(set != NULL);
4194 assert(name != NULL);
4195
4196 for( i = 0; i < set->nsepas; ++i )
4197 {
4198 if( strcmp(SCIPsepaGetName(set->sepas[i]), name) == 0 )
4199 return set->sepas[i];
4200 }
4201
4202 return NULL;
4203 }
4204
4205 /** sorts separators by priorities */
4206 void SCIPsetSortSepas(
4207 SCIP_SET* set /**< global SCIP settings */
4208 )
4209 {
4210 assert(set != NULL);
4211
4212 if( !set->sepassorted )
4213 {
4214 SCIPsortPtr((void**)set->sepas, SCIPsepaComp, set->nsepas);
4215 set->sepassorted = TRUE;
4216 set->sepasnamesorted = FALSE;
4217 }
4218 }
4219
4220 /** sorts separators by name */
4221 void SCIPsetSortSepasName(
4222 SCIP_SET* set /**< global SCIP settings */
4223 )
4224 {
4225 assert(set != NULL);
4226
4227 if( !set->sepasnamesorted )
4228 {
4229 SCIPsortPtr((void**)set->sepas, SCIPsepaCompName, set->nsepas);
4230 set->sepassorted = FALSE;
4231 set->sepasnamesorted = TRUE;
4232 }
4233 }
4234
4235 /** inserts cut selector in cut selector list */
4236 SCIP_RETCODE SCIPsetIncludeCutsel(
4237 SCIP_SET* set, /**< global SCIP settings */
4238 SCIP_CUTSEL* cutsel /**< cut selector */
4239 )
4240 {
4241 assert(set != NULL);
4242 assert(cutsel != NULL);
4243 assert(!SCIPcutselIsInitialized(cutsel));
4244
4245 if( set->ncutsels >= set->cutselssize )
4246 {
4247 set->cutselssize = SCIPsetCalcMemGrowSize(set, set->ncutsels + 1);
4248 SCIP_ALLOC( BMSreallocMemoryArray(&set->cutsels, set->cutselssize) );
4249 }
4250 assert(set->ncutsels < set->cutselssize);
4251
4252 set->cutsels[set->ncutsels] = cutsel;
4253 set->ncutsels++;
4254 set->cutselssorted = FALSE;
4255
4256 return SCIP_OKAY;
4257 }
4258
4259 /** returns the cut selector of the given name, or NULL if not existing */
4260 SCIP_CUTSEL* SCIPsetFindCutsel(
4261 SCIP_SET* set, /**< global SCIP settings */
4262 const char* name /**< name of separator */
4263 )
4264 {
4265 int i;
4266
4267 assert(set != NULL);
4268 assert(name != NULL);
4269
4270 for( i = 0; i < set->ncutsels; ++i )
4271 {
4272 if( strcmp(SCIPcutselGetName(set->cutsels[i]), name) == 0 )
4273 return set->cutsels[i];
4274 }
4275
4276 return NULL;
4277 }
4278
4279 /** sorts cut selectors by priorities */
4280 void SCIPsetSortCutsels(
4281 SCIP_SET* set /**< global SCIP settings */
4282 )
4283 {
4284 assert(set != NULL);
4285
4286 if( !set->cutselssorted )
4287 {
4288 SCIPsortPtr((void**)set->cutsels, SCIPcutselComp, set->ncutsels);
4289 set->cutselssorted = TRUE;
4290 }
4291 }
4292
4293 /** inserts propagator in propagator list */
4294 SCIP_RETCODE SCIPsetIncludeProp(
4295 SCIP_SET* set, /**< global SCIP settings */
4296 SCIP_PROP* prop /**< propagator */
4297 )
4298 {
4299 assert(set != NULL);
4300 assert(prop != NULL);
4301 assert(!SCIPpropIsInitialized(prop));
4302
4303 if( set->nprops >= set->propssize )
4304 {
4305 set->propssize = SCIPsetCalcMemGrowSize(set, set->nprops+1);
4306 SCIP_ALLOC( BMSreallocMemoryArray(&set->props, set->propssize) );
4307 SCIP_ALLOC( BMSreallocMemoryArray(&set->props_presol, set->propssize) );
4308 }
4309 assert(set->nprops < set->propssize);
4310
4311 set->props[set->nprops] = prop;
4312 set->props_presol[set->nprops] = prop;
4313 set->nprops++;
4314 set->propssorted = FALSE;
4315 set->propspresolsorted = FALSE;
4316
4317 return SCIP_OKAY;
4318 }
4319
4320 /** returns the propagator of the given name, or NULL if not existing */
4321 SCIP_PROP* SCIPsetFindProp(
4322 SCIP_SET* set, /**< global SCIP settings */
4323 const char* name /**< name of propagator */
4324 )
4325 {
4326 int i;
4327
4328 assert(set != NULL);
4329 assert(name != NULL);
4330
4331 for( i = 0; i < set->nprops; ++i )
4332 {
4333 if( strcmp(SCIPpropGetName(set->props[i]), name) == 0 )
4334 return set->props[i];
4335 }
4336
4337 return NULL;
4338 }
4339
4340 /** sorts propagators by priorities */
4341 void SCIPsetSortProps(
4342 SCIP_SET* set /**< global SCIP settings */
4343 )
4344 {
4345 assert(set != NULL);
4346
4347 if( !set->propssorted )
4348 {
4349 SCIPsortPtr((void**)set->props, SCIPpropComp, set->nprops);
4350 set->propssorted = TRUE;
4351 set->propsnamesorted = FALSE;
4352 }
4353 }
4354
4355 /** sorts propagators by priorities for presolving */
4356 void SCIPsetSortPropsPresol(
4357 SCIP_SET* set /**< global SCIP settings */
4358 )
4359 {
4360 assert(set != NULL);
4361
4362 if( !set->propspresolsorted )
4363 {
4364 SCIPsortPtr((void**)set->props_presol, SCIPpropCompPresol, set->nprops);
4365 set->propspresolsorted = TRUE;
4366 set->propsnamesorted = FALSE;
4367 }
4368 }
4369
4370 /** sorts propagators w.r.t. names */
4371 void SCIPsetSortPropsName(
4372 SCIP_SET* set /**< global SCIP settings */
4373 )
4374 {
4375 assert(set != NULL);
4376
4377 if( !set->propsnamesorted )
4378 {
4379 SCIPsortPtr((void**)set->props, SCIPpropCompName, set->nprops);
4380 set->propssorted = FALSE;
4381 set->propsnamesorted = TRUE;
4382 }
4383 }
4384
4385 /** inserts bandit virtual function table into set */
4386 SCIP_RETCODE SCIPsetIncludeBanditvtable(
4387 SCIP_SET* set, /**< global SCIP settings */
4388 SCIP_BANDITVTABLE* banditvtable /**< bandit algorithm virtual function table */
4389 )
4390 {
4391 assert(set != NULL);
4392 assert(banditvtable != NULL);
4393
4394 if( set->nbanditvtables >= set->banditvtablessize )
4395 {
4396 int newsize = SCIPsetCalcMemGrowSize(set, set->nbanditvtables + 1);
4397 SCIP_ALLOC( BMSreallocMemoryArray(&set->banditvtables, newsize) );
4398 set->banditvtablessize = newsize;
4399 }
4400
4401 assert(set->nbanditvtables < set->banditvtablessize);
4402 set->banditvtables[set->nbanditvtables++] = banditvtable;
4403
4404 return SCIP_OKAY;
4405 }
4406
4407 /** returns the bandit virtual function table of the given name, or NULL if not existing */
4408 SCIP_BANDITVTABLE* SCIPsetFindBanditvtable(
4409 SCIP_SET* set, /**< global SCIP settings */
4410 const char* name /**< name of bandit algorithm virtual function table */
4411 )
4412 {
4413 int b;
4414
4415 assert(set != NULL);
4416 assert(name != NULL);
4417
4418 /* search for a bandit v table of the given name */
4419 for( b = 0; b < set->nbanditvtables; ++b )
4420 {
4421 if( strcmp(name, SCIPbanditvtableGetName(set->banditvtables[b])) == 0 )
4422 return set->banditvtables[b];
4423 }
4424
4425 return NULL;
4426 }
4427
4428 /** inserts concurrent solver type into the concurrent solver type list */
4429 SCIP_RETCODE SCIPsetIncludeConcsolverType(
4430 SCIP_SET* set, /**< global SCIP settings */
4431 SCIP_CONCSOLVERTYPE* concsolvertype /**< concurrent solver type */
4432 )
4433 {
4434 assert(set != NULL);
4435 assert(concsolvertype != NULL);
4436
4437 if( set->nconcsolvertypes >= set->concsolvertypessize )
4438 {
4439 set->concsolvertypessize = SCIPsetCalcMemGrowSize(set, set->nconcsolvertypes + 1);
4440 SCIP_ALLOC( BMSreallocMemoryArray(&set->concsolvertypes, set->concsolvertypessize) );
4441 }
4442 assert(set->nconcsolvertypes < set->concsolvertypessize);
4443
4444 set->concsolvertypes[set->nconcsolvertypes] = concsolvertype;
4445 set->nconcsolvertypes++;
4446
4447 return SCIP_OKAY;
4448 }
4449
4450 /** returns the concurrent solver type with the given name, or NULL if not existing */
4451 SCIP_CONCSOLVERTYPE* SCIPsetFindConcsolverType(
4452 SCIP_SET* set, /**< global SCIP settings */
4453 const char* name /**< name of concurrent solver type */
4454 )
4455 {
4456 int i;
4457
4458 assert(set != NULL);
4459 assert(name != NULL);
4460
4461 for( i = 0; i < set->nconcsolvertypes; ++i )
4462 {
4463 if( strcmp(SCIPconcsolverTypeGetName(set->concsolvertypes[i]), name) == 0 )
4464 return set->concsolvertypes[i];
4465 }
4466
4467 return NULL;
4468 }
4469
4470 /** inserts concurrent solver into the concurrent solver list */
4471 SCIP_RETCODE SCIPsetIncludeConcsolver(
4472 SCIP_SET* set, /**< global SCIP settings */
4473 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
4474 )
4475 {
4476 assert(set != NULL);
4477 assert(concsolver != NULL);
4478
4479 if( set->nconcsolvers >= set->concsolverssize )
4480 {
4481 set->concsolverssize = SCIPsetCalcMemGrowSize(set, set->nconcsolvers + 1);
4482 SCIP_ALLOC( BMSreallocMemoryArray(&set->concsolvers, set->concsolverssize) );
4483 }
4484 assert(set->nconcsolvers < set->concsolverssize);
4485
4486 set->concsolvers[set->nconcsolvers] = concsolver;
4487 assert(set->nconcsolvers == SCIPconcsolverGetIdx(concsolver));
4488
4489 set->nconcsolvers++;
4490
4491 return SCIP_OKAY;
4492 }
4493
4494 /** frees all concurrent solvers in the concurrent solver list */
4495 SCIP_RETCODE SCIPsetFreeConcsolvers(
4496 SCIP_SET* set /**< global SCIP settings */
4497 )
4498 {
4499 int i;
4500 assert(set != NULL);
4501
4502 /* call user callback for each concurrent solver */
4503 for( i = 0; i < set->nconcsolvers; ++i )
4504 {
4505 SCIP_CALL( SCIPconcsolverDestroyInstance(set, &set->concsolvers[i]) );
4506 }
4507
4508 /* set size and number to zero and free the concurent solver array */
4509 set->nconcsolvers = 0;
4510 set->concsolverssize = 0;
4511 BMSfreeMemoryArrayNull(&set->concsolvers);
4512
4513 return SCIP_OKAY;
4514 }
4515
4516 /** inserts primal heuristic in primal heuristic list */
4517 SCIP_RETCODE SCIPsetIncludeHeur(
4518 SCIP_SET* set, /**< global SCIP settings */
4519 SCIP_HEUR* heur /**< primal heuristic */
4520 )
4521 {
4522 assert(set != NULL);
4523 assert(heur != NULL);
4524 assert(!SCIPheurIsInitialized(heur));
4525
4526 if( set->nheurs >= set->heurssize )
4527 {
4528 set->heurssize = SCIPsetCalcMemGrowSize(set, set->nheurs+1);
4529 SCIP_ALLOC( BMSreallocMemoryArray(&set->heurs, set->heurssize) );
4530 }
4531 assert(set->nheurs < set->heurssize);
4532
4533 set->heurs[set->nheurs] = heur;
4534 set->nheurs++;
4535 set->heurssorted = FALSE;
4536
4537 return SCIP_OKAY;
4538 }
4539
4540 /** returns the primal heuristic of the given name, or NULL if not existing */
4541 SCIP_HEUR* SCIPsetFindHeur(
4542 SCIP_SET* set, /**< global SCIP settings */
4543 const char* name /**< name of primal heuristic */
4544 )
4545 {
4546 int i;
4547
4548 assert(set != NULL);
4549 assert(name != NULL);
4550
4551 for( i = 0; i < set->nheurs; ++i )
4552 {
4553 if( strcmp(SCIPheurGetName(set->heurs[i]), name) == 0 )
4554 return set->heurs[i];
4555 }
4556
4557 return NULL;
4558 }
4559
4560 /** sorts heuristics by priorities */
4561 void SCIPsetSortHeurs(
4562 SCIP_SET* set /**< global SCIP settings */
4563 )
4564 {
4565 assert(set != NULL);
4566
4567 if( !set->heurssorted )
4568 {
4569 SCIPsortPtr((void**)set->heurs, SCIPheurComp, set->nheurs);
4570 set->heurssorted = TRUE;
4571 set->heursnamesorted = FALSE;
4572 }
4573 }
4574
4575 /** sorts heuristics by names */
4576 void SCIPsetSortHeursName(
4577 SCIP_SET* set /**< global SCIP settings */
4578 )
4579 {
4580 assert(set != NULL);
4581
4582 if( !set->heursnamesorted )
4583 {
4584 SCIPsortPtr((void**)set->heurs, SCIPheurCompName, set->nheurs);
4585 set->heurssorted = FALSE;
4586 set->heursnamesorted = TRUE;
4587 }
4588 }
4589
4590 /** inserts tree compression in tree compression list */
4591 SCIP_RETCODE SCIPsetIncludeCompr(
4592 SCIP_SET* set, /**< global SCIP settings */
4593 SCIP_COMPR* compr /**< tree compression */
4594 )
4595 {
4596 assert(set != NULL);
4597 assert(compr != NULL);
4598 assert(!SCIPcomprIsInitialized(compr));
4599
4600 if( set->ncomprs >= set->comprssize )
4601 {
4602 set->comprssize = SCIPsetCalcMemGrowSize(set, set->ncomprs+1);
4603 SCIP_ALLOC( BMSreallocMemoryArray(&set->comprs, set->comprssize) );
4604 }
4605 assert(set->ncomprs < set->comprssize);
4606
4607 set->comprs[set->ncomprs] = compr;
4608 set->ncomprs++;
4609 set->comprssorted = FALSE;
4610
4611 return SCIP_OKAY;
4612 }
4613
4614 /** returns the tree compression of the given name, or NULL if not existing */
4615 SCIP_COMPR* SCIPsetFindCompr(
4616 SCIP_SET* set, /**< global SCIP settings */
4617 const char* name /**< name of tree compression */
4618 )
4619 {
4620 int i;
4621
4622 assert(set != NULL);
4623 assert(name != NULL);
4624
4625 for( i = 0; i < set->ncomprs; ++i )
4626 {
4627 if( strcmp(SCIPcomprGetName(set->comprs[i]), name) == 0 )
4628 return set->comprs[i];
4629 }
4630
4631 return NULL;
4632 }
4633
4634 /** sorts compressions by priorities */
4635 void SCIPsetSortComprs(
4636 SCIP_SET* set /**< global SCIP settings */
4637 )
4638 {
4639 assert(set != NULL);
4640
4641 if( !set->comprssorted )
4642 {
4643 SCIPsortPtr((void**)set->comprs, SCIPcomprComp, set->ncomprs);
4644 set->comprssorted = TRUE;
4645 set->comprsnamesorted = FALSE;
4646 }
4647 }
4648
4649 /** sorts heuristics by names */
4650 void SCIPsetSortComprsName(
4651 SCIP_SET* set /**< global SCIP settings */
4652 )
4653 {
4654 assert(set != NULL);
4655
4656 if( !set->comprsnamesorted )
4657 {
4658 SCIPsortPtr((void**)set->comprs, SCIPcomprCompName, set->ncomprs);
4659 set->comprssorted = FALSE;
4660 set->comprsnamesorted = TRUE;
4661 }
4662 }
4663
4664 /** inserts event handler in event handler list */
4665 SCIP_RETCODE SCIPsetIncludeEventhdlr(
4666 SCIP_SET* set, /**< global SCIP settings */
4667 SCIP_EVENTHDLR* eventhdlr /**< event handler */
4668 )
4669 {
4670 assert(set != NULL);
4671 assert(eventhdlr != NULL);
4672 assert(!SCIPeventhdlrIsInitialized(eventhdlr));
4673
4674 if( set->neventhdlrs >= set->eventhdlrssize )
4675 {
4676 set->eventhdlrssize = SCIPsetCalcMemGrowSize(set, set->neventhdlrs+1);
4677 SCIP_ALLOC( BMSreallocMemoryArray(&set->eventhdlrs, set->eventhdlrssize) );
4678 }
4679 assert(set->neventhdlrs < set->eventhdlrssize);
4680
4681 set->eventhdlrs[set->neventhdlrs] = eventhdlr;
4682 set->neventhdlrs++;
4683
4684 return SCIP_OKAY;
4685 }
4686
4687 /** returns the event handler of the given name, or NULL if not existing */
4688 SCIP_EVENTHDLR* SCIPsetFindEventhdlr(
4689 SCIP_SET* set, /**< global SCIP settings */
4690 const char* name /**< name of event handler */
4691 )
4692 {
4693 int i;
4694
4695 assert(set != NULL);
4696 assert(name != NULL);
4697
4698 for( i = 0; i < set->neventhdlrs; ++i )
4699 {
4700 if( strcmp(SCIPeventhdlrGetName(set->eventhdlrs[i]), name) == 0 )
4701 return set->eventhdlrs[i];
4702 }
4703
4704 return NULL;
4705 }
4706
4707 /** inserts node selector in node selector list */
4708 SCIP_RETCODE SCIPsetIncludeNodesel(
4709 SCIP_SET* set, /**< global SCIP settings */
4710 SCIP_NODESEL* nodesel /**< node selector */
4711 )
4712 {
4713 int i;
4714 int nodeselstdprio;
4715
4716 assert(set != NULL);
4717 assert(nodesel != NULL);
4718 assert(!SCIPnodeselIsInitialized(nodesel));
4719
4720 if( set->nnodesels >= set->nodeselssize )
4721 {
4722 set->nodeselssize = SCIPsetCalcMemGrowSize(set, set->nnodesels+1);
4723 SCIP_ALLOC( BMSreallocMemoryArray(&set->nodesels, set->nodeselssize) );
4724 }
4725 assert(set->nnodesels < set->nodeselssize);
4726
4727 nodeselstdprio = SCIPnodeselGetStdPriority(nodesel);
4728
4729 for( i = set->nnodesels; i > 0 && nodeselstdprio > SCIPnodeselGetStdPriority(set->nodesels[i-1]); --i )
4730 set->nodesels[i] = set->nodesels[i-1];
4731
4732 set->nodesels[i] = nodesel;
4733 set->nnodesels++;
4734
4735 return SCIP_OKAY;
4736 }
4737
4738 /** returns the node selector of the given name, or NULL if not existing */
4739 SCIP_NODESEL* SCIPsetFindNodesel(
4740 SCIP_SET* set, /**< global SCIP settings */
4741 const char* name /**< name of event handler */
4742 )
4743 {
4744 int i;
4745
4746 assert(set != NULL);
4747 assert(name != NULL);
4748
4749 for( i = 0; i < set->nnodesels; ++i )
4750 {
4751 if( strcmp(SCIPnodeselGetName(set->nodesels[i]), name) == 0 )
4752 return set->nodesels[i];
4753 }
4754
4755 return NULL;
4756 }
4757
4758 /** returns node selector with highest priority in the current mode */
4759 SCIP_NODESEL* SCIPsetGetNodesel(
4760 SCIP_SET* set, /**< global SCIP settings */
4761 SCIP_STAT* stat /**< dynamic problem statistics */
4762 )
4763 {
4764 assert(set != NULL);
4765 assert(stat != NULL);
4766
4767 /* check, if old node selector is still valid */
4768 if( set->nodesel == NULL && set->nnodesels > 0 )
4769 {
4770 int i;
4771
4772 set->nodesel = set->nodesels[0];
4773
4774 /* search highest priority node selector */
4775 if( stat->memsavemode )
4776 {
4777 for( i = 1; i < set->nnodesels; ++i )
4778 {
4779 if( SCIPnodeselGetMemsavePriority(set->nodesels[i]) > SCIPnodeselGetMemsavePriority(set->nodesel) )
4780 set->nodesel = set->nodesels[i];
4781 }
4782 }
4783 else
4784 {
4785 for( i = 1; i < set->nnodesels; ++i )
4786 {
4787 if( SCIPnodeselGetStdPriority(set->nodesels[i]) > SCIPnodeselGetStdPriority(set->nodesel) )
4788 set->nodesel = set->nodesels[i];
4789 }
4790 }
4791 }
4792
4793 return set->nodesel;
4794 }
4795
4796 /** inserts branching rule in branching rule list */
4797 SCIP_RETCODE SCIPsetIncludeBranchrule(
4798 SCIP_SET* set, /**< global SCIP settings */
4799 SCIP_BRANCHRULE* branchrule /**< branching rule */
4800 )
4801 {
4802 assert(set != NULL);
4803 assert(branchrule != NULL);
4804 assert(!SCIPbranchruleIsInitialized(branchrule));
4805
4806 if( set->nbranchrules >= set->branchrulessize )
4807 {
4808 set->branchrulessize = SCIPsetCalcMemGrowSize(set, set->nbranchrules+1);
4809 SCIP_ALLOC( BMSreallocMemoryArray(&set->branchrules, set->branchrulessize) );
4810 }
4811 assert(set->nbranchrules < set->branchrulessize);
4812
4813 set->branchrules[set->nbranchrules] = branchrule;
4814 set->nbranchrules++;
4815 set->branchrulessorted = FALSE;
4816
4817 return SCIP_OKAY;
4818 }
4819
4820 /** returns the branching rule of the given name, or NULL if not existing */
4821 SCIP_BRANCHRULE* SCIPsetFindBranchrule(
4822 SCIP_SET* set, /**< global SCIP settings */
4823 const char* name /**< name of event handler */
4824 )
4825 {
4826 int i;
4827
4828 assert(set != NULL);
4829 assert(name != NULL);
4830
(1) Event cond_true: |
Condition "i < set->nbranchrules", taking true branch. |
(5) Event loop_begin: |
Jumped back to beginning of loop. |
(6) Event cond_true: |
Condition "i < set->nbranchrules", taking true branch. |
(10) Event loop_begin: |
Jumped back to beginning of loop. |
(11) Event cond_false: |
Condition "i < set->nbranchrules", taking false branch. |
4831 for( i = 0; i < set->nbranchrules; ++i )
4832 {
(2) Event cond_false: |
Condition "strcmp(SCIPbranchruleGetName(set->branchrules[i]), name) == 0", taking false branch. |
(7) Event cond_false: |
Condition "strcmp(SCIPbranchruleGetName(set->branchrules[i]), name) == 0", taking false branch. |
4833 if( strcmp(SCIPbranchruleGetName(set->branchrules[i]), name) == 0 )
(3) Event if_end: |
End of if statement. |
(8) Event if_end: |
End of if statement. |
4834 return set->branchrules[i];
(4) Event loop: |
Jumping back to the beginning of the loop. |
(9) Event loop: |
Jumping back to the beginning of the loop. |
(12) Event loop_end: |
Reached end of loop. |
4835 }
4836
(13) Event return_null: |
Explicitly returning null. |
4837 return NULL;
4838 }
4839
4840 /** sorts branching rules by priorities */
4841 void SCIPsetSortBranchrules(
4842 SCIP_SET* set /**< global SCIP settings */
4843 )
4844 {
4845 assert(set != NULL);
4846
4847 if( !set->branchrulessorted )
4848 {
4849 SCIPsortPtr((void**)set->branchrules, SCIPbranchruleComp, set->nbranchrules);
4850 set->branchrulessorted = TRUE;
4851 set->branchrulesnamesorted = FALSE;
4852 }
4853 }
4854
4855 /** sorts branching rules by priorities */
4856 void SCIPsetSortBranchrulesName(
4857 SCIP_SET* set /**< global SCIP settings */
4858 )
4859 {
4860 assert(set != NULL);
4861
4862 if( !set->branchrulesnamesorted )
4863 {
4864 SCIPsortPtr((void**)set->branchrules, SCIPbranchruleCompName, set->nbranchrules);
4865 set->branchrulessorted = FALSE;
4866 set->branchrulesnamesorted = TRUE;
4867 }
4868 }
4869
4870 /** inserts display column in display column list */
4871 SCIP_RETCODE SCIPsetIncludeDisp(
4872 SCIP_SET* set, /**< global SCIP settings */
4873 SCIP_DISP* disp /**< display column */
4874 )
4875 {
4876 int i;
4877 int disppos;
4878
4879 assert(set != NULL);
4880 assert(disp != NULL);
4881 assert(!SCIPdispIsInitialized(disp));
4882
4883 if( set->ndisps >= set->dispssize )
4884 {
4885 set->dispssize = SCIPsetCalcMemGrowSize(set, set->ndisps+1);
4886 SCIP_ALLOC( BMSreallocMemoryArray(&set->disps, set->dispssize) );
4887 }
4888 assert(set->ndisps < set->dispssize);
4889
4890 disppos = SCIPdispGetPosition(disp);
4891
4892 for( i = set->ndisps; i > 0 && disppos < SCIPdispGetPosition(set->disps[i-1]); --i )
4893 {
4894 set->disps[i] = set->disps[i-1];
4895 }
4896 set->disps[i] = disp;
4897 set->ndisps++;
4898
4899 return SCIP_OKAY;
4900 }
4901
4902 /** returns the display column of the given name, or NULL if not existing */
4903 SCIP_DISP* SCIPsetFindDisp(
4904 SCIP_SET* set, /**< global SCIP settings */
4905 const char* name /**< name of display */
4906 )
4907 {
4908 int i;
4909
4910 assert(set != NULL);
4911 assert(name != NULL);
4912
4913 for( i = 0; i < set->ndisps; ++i )
4914 {
4915 if( strcmp(SCIPdispGetName(set->disps[i]), name) == 0 )
4916 return set->disps[i];
4917 }
4918
4919 return NULL;
4920 }
4921
4922 /** inserts statistics table in statistics table list */
4923 SCIP_RETCODE SCIPsetIncludeTable(
4924 SCIP_SET* set, /**< global SCIP settings */
4925 SCIP_TABLE* table /**< statistics table */
4926 )
4927 {
4928 assert(set != NULL);
4929 assert(table != NULL);
4930 assert(!SCIPtableIsInitialized(table));
4931
4932 if( set->ntables >= set->tablessize )
4933 {
4934 set->tablessize = SCIPsetCalcMemGrowSize(set, set->ntables+1);
4935 SCIP_ALLOC( BMSreallocMemoryArray(&set->tables, set->tablessize) );
4936 }
4937 assert(set->ntables < set->tablessize);
4938
4939 /* we insert in arbitrary order and sort once before printing statistics */
4940 set->tables[set->ntables] = table;
4941 set->ntables++;
4942 set->tablessorted = FALSE;
4943
4944 return SCIP_OKAY;
4945 }
4946
4947 /** returns the statistics table of the given name, or NULL if not existing */
4948 SCIP_TABLE* SCIPsetFindTable(
4949 SCIP_SET* set, /**< global SCIP settings */
4950 const char* name /**< name of statistics table */
4951 )
4952 {
4953 int i;
4954
4955 assert(set != NULL);
4956 assert(name != NULL);
4957
4958 for( i = 0; i < set->ntables; ++i )
4959 {
4960 if( strcmp(SCIPtableGetName(set->tables[i]), name) == 0 )
4961 return set->tables[i];
4962 }
4963
4964 return NULL;
4965 }
4966
4967 /** inserts dialog in dialog list */
4968 SCIP_RETCODE SCIPsetIncludeDialog(
4969 SCIP_SET* set, /**< global SCIP settings */
4970 SCIP_DIALOG* dialog /**< dialog */
4971 )
4972 {
4973 assert(set != NULL);
4974 assert(dialog != NULL);
4975
4976 if( set->ndialogs >= set->dialogssize )
4977 {
4978 set->dialogssize = SCIPsetCalcMemGrowSize(set, set->ndialogs+1);
4979 SCIP_ALLOC( BMSreallocMemoryArray(&set->dialogs, set->dialogssize) );
4980 }
4981 assert(set->ndialogs < set->dialogssize);
4982
4983 set->dialogs[set->ndialogs] = dialog;
4984 set->ndialogs++;
4985
4986 return SCIP_OKAY;
4987 }
4988
4989 /** returns if the dialog already exists */
4990 SCIP_Bool SCIPsetExistsDialog(
4991 SCIP_SET* set, /**< global SCIP settings */
4992 SCIP_DIALOG* dialog /**< dialog */
4993 )
4994 {
4995 int i;
4996
4997 assert(set != NULL);
4998
4999 if( dialog == NULL )
5000 return FALSE;
5001
5002 for( i = 0; i < set->ndialogs; ++i )
5003 {
5004 if( set->dialogs[i] == dialog )
5005 return TRUE;
5006 }
5007
5008 return FALSE;
5009 }
5010
5011 /** inserts expression handler in expression handler list */
5012 SCIP_RETCODE SCIPsetIncludeExprhdlr(
5013 SCIP_SET* set, /**< global SCIP settings */
5014 SCIP_EXPRHDLR* exprhdlr /**< expression handler */
5015 )
5016 {
5017 assert(set != NULL);
5018 assert(exprhdlr != NULL);
5019
5020 if( set->nexprhdlrs >= set->exprhdlrssize )
5021 {
5022 set->exprhdlrssize = SCIPsetCalcMemGrowSize(set, set->nexprhdlrs+1);
5023 SCIP_ALLOC( BMSreallocMemoryArray(&set->exprhdlrs, set->exprhdlrssize) );
5024 }
5025 assert(set->nexprhdlrs < set->exprhdlrssize);
5026
5027 set->exprhdlrs[set->nexprhdlrs] = exprhdlr;
5028 set->nexprhdlrs++;
5029 set->exprhdlrssorted = FALSE;
5030
5031 if( set->exprhdlrvar == NULL && strcmp(SCIPexprhdlrGetName(exprhdlr), "var") == 0 )
5032 set->exprhdlrvar = exprhdlr;
5033 else if( set->exprhdlrval == NULL && strcmp(SCIPexprhdlrGetName(exprhdlr), "val") == 0 )
5034 set->exprhdlrval = exprhdlr;
5035 else if( set->exprhdlrsum == NULL && strcmp(SCIPexprhdlrGetName(exprhdlr), "sum") == 0 )
5036 set->exprhdlrsum = exprhdlr;
5037 else if( set->exprhdlrproduct == NULL && strcmp(SCIPexprhdlrGetName(exprhdlr), "prod") == 0 )
5038 set->exprhdlrproduct = exprhdlr;
5039 else if( set->exprhdlrpow == NULL && strcmp(SCIPexprhdlrGetName(exprhdlr), "pow") == 0 )
5040 set->exprhdlrpow = exprhdlr;
5041
5042 return SCIP_OKAY;
5043 }
5044
5045 /** returns the expression handler of the given name, or NULL if not existing */
5046 SCIP_EXPRHDLR* SCIPsetFindExprhdlr(
5047 SCIP_SET* set, /**< global SCIP settings */
5048 const char* name /**< name of expression handler */
5049 )
5050 {
5051 int i;
5052
5053 assert(set != NULL);
5054 assert(name != NULL);
5055
5056 for( i = 0; i < set->nexprhdlrs; ++i )
5057 if( strcmp(SCIPexprhdlrGetName(set->exprhdlrs[i]), name) == 0 )
5058 return set->exprhdlrs[i];
5059
5060 return NULL;
5061 }
5062
5063 /** sorts expression handlers by name */
5064 void SCIPsetSortExprhdlrs(
5065 SCIP_SET* set /**< global SCIP settings */
5066 )
5067 {
5068 assert(set != NULL);
5069
5070 if( !set->exprhdlrssorted )
5071 {
5072 SCIPsortPtr((void**)set->exprhdlrs, SCIPexprhdlrComp, set->nexprhdlrs);
5073 set->exprhdlrssorted = TRUE;
5074 }
5075 }
5076
5077 /** inserts NLPI in NLPI list */
5078 SCIP_RETCODE SCIPsetIncludeNlpi(
5079 SCIP_SET* set, /**< global SCIP settings */
5080 SCIP_NLPI* nlpi /**< NLPI */
5081 )
5082 {
5083 assert(set != NULL);
5084 assert(nlpi != NULL);
5085
5086 if( set->nnlpis >= set->nlpissize )
5087 {
5088 set->nlpissize = SCIPsetCalcMemGrowSize(set, set->nnlpis+1);
5089 SCIP_ALLOC( BMSreallocMemoryArray(&set->nlpis, set->nlpissize) );
5090 }
5091 assert(set->nnlpis < set->nlpissize);
5092
5093 set->nlpis[set->nnlpis] = nlpi;
5094 set->nnlpis++;
5095 set->nlpissorted = FALSE;
5096
5097 return SCIP_OKAY;
5098 }
5099
5100 /** returns the NLPI of the given name, or NULL if not existing */
5101 SCIP_NLPI* SCIPsetFindNlpi(
5102 SCIP_SET* set, /**< global SCIP settings */
5103 const char* name /**< name of NLPI */
5104 )
5105 {
5106 int i;
5107
5108 assert(set != NULL);
5109 assert(name != NULL);
5110
5111 for( i = 0; i < set->nnlpis; ++i )
5112 {
5113 if( strcmp(SCIPnlpiGetName(set->nlpis[i]), name) == 0 )
5114 return set->nlpis[i];
5115 }
5116
5117 return NULL;
5118 }
5119
5120 /** sorts NLPIs by priorities */
5121 void SCIPsetSortNlpis(
5122 SCIP_SET* set /**< global SCIP settings */
5123 )
5124 {
5125 assert(set != NULL);
5126
5127 if( !set->nlpissorted )
5128 {
5129 SCIPsortPtr((void**)set->nlpis, SCIPnlpiComp, set->nnlpis);
5130 set->nlpissorted = TRUE;
5131 }
5132 }
5133
5134 /** set priority of an NLPI */
5135 void SCIPsetSetPriorityNlpi(
5136 SCIP_SET* set, /**< global SCIP settings */
5137 SCIP_NLPI* nlpi, /**< NLPI */
5138 int priority /**< new priority of NLPI */
5139 )
5140 {
5141 assert(set != NULL);
5142 assert(nlpi != NULL);
5143
5144 SCIPnlpiSetPriority(nlpi, priority);
5145 set->nlpissorted = FALSE;
5146 }
5147
5148 /** inserts information about an external code in external codes list */
5149 SCIP_RETCODE SCIPsetIncludeExternalCode(
5150 SCIP_SET* set, /**< global SCIP settings */
5151 const char* name, /**< name of external code */
5152 const char* description /**< description of external code, can be NULL */
5153 )
5154 {
5155 assert(set != NULL);
5156 assert(name != NULL);
5157
5158 if( set->nextcodes >= set->extcodessize )
5159 {
5160 set->extcodessize = SCIPsetCalcMemGrowSize(set, set->nextcodes+1);
5161 SCIP_ALLOC( BMSreallocMemoryArray(&set->extcodenames, set->extcodessize) );
5162 SCIP_ALLOC( BMSreallocMemoryArray(&set->extcodedescs, set->extcodessize) );
5163 }
5164 assert(set->nextcodes < set->extcodessize);
5165
5166 BMSduplicateMemoryArray(&(set->extcodenames[set->nextcodes]), name, (int) (strlen(name)+1)); /*lint !e866*/
5167 if( description != NULL )
5168 {
5169 BMSduplicateMemoryArray(&(set->extcodedescs[set->nextcodes]), description, (int) (strlen(description)+1)); /*lint !e866*/
5170 }
5171 else
5172 {
5173 set->extcodedescs[set->nextcodes] = NULL;
5174 }
5175 set->nextcodes++;
5176
5177 return SCIP_OKAY;
5178 }
5179
5180 /** calls init methods of all plugins */
5181 SCIP_RETCODE SCIPsetInitPlugins(
5182 SCIP_SET* set, /**< global SCIP settings */
5183 BMS_BLKMEM* blkmem, /**< block memory */
5184 SCIP_STAT* stat /**< dynamic problem statistics */
5185 )
5186 {
5187 int i;
5188
5189 assert(set != NULL);
5190
5191 /* active variable pricers */
5192 SCIPsetSortPricers(set);
5193 for( i = 0; i < set->nactivepricers; ++i )
5194 {
5195 SCIP_CALL( SCIPpricerInit(set->pricers[i], set) );
5196 }
5197
5198 /* Benders' decomposition algorithm */
5199 SCIPsetSortBenders(set);
5200 for( i = 0; i < set->nactivebenders; ++i )
5201 {
5202 SCIP_CALL( SCIPbendersInit(set->benders[i], set) );
5203 }
5204
5205 /* constraint handlers */
5206 for( i = 0; i < set->nconshdlrs; ++i )
5207 {
5208 SCIP_CALL( SCIPconshdlrInit(set->conshdlrs[i], blkmem, set, stat) );
5209 }
5210
5211 /* conflict handlers */
5212 for( i = 0; i < set->nconflicthdlrs; ++i )
5213 {
5214 SCIP_CALL( SCIPconflicthdlrInit(set->conflicthdlrs[i], set) );
5215 }
5216
5217 /* presolvers */
5218 for( i = 0; i < set->npresols; ++i )
5219 {
5220 SCIP_CALL( SCIPpresolInit(set->presols[i], set) );
5221 }
5222
5223 /* relaxators */
5224 for( i = 0; i < set->nrelaxs; ++i )
5225 {
5226 SCIP_CALL( SCIPrelaxInit(set->relaxs[i], set) );
5227 }
5228
5229 /* separators */
5230 for( i = 0; i < set->nsepas; ++i )
5231 {
5232 SCIP_CALL( SCIPsepaInit(set->sepas[i], set) );
5233 }
5234
5235 /* cut selectors */
5236 for( i = 0; i < set->ncutsels; ++i )
5237 {
5238 SCIP_CALL( SCIPcutselInit(set->cutsels[i], set) );
5239 }
5240
5241 /* propagators */
5242 for( i = 0; i < set->nprops; ++i )
5243 {
5244 SCIP_CALL( SCIPpropInit(set->props[i], set) );
5245 }
5246
5247 /* primal heuristics */
5248 for( i = 0; i < set->nheurs; ++i )
5249 {
5250 SCIP_CALL( SCIPheurInit(set->heurs[i], set) );
5251 }
5252
5253 /* tree compression */
5254 for( i = 0; i < set->ncomprs; ++i )
5255 {
5256 SCIP_CALL( SCIPcomprInit(set->comprs[i], set) );
5257 }
5258
5259 /* event handlers */
5260 for( i = 0; i < set->neventhdlrs; ++i )
5261 {
5262 SCIP_CALL( SCIPeventhdlrInit(set->eventhdlrs[i], set) );
5263 }
5264
5265 /* node selectors */
5266 for( i = 0; i < set->nnodesels; ++i )
5267 {
5268 SCIP_CALL( SCIPnodeselInit(set->nodesels[i], set) );
5269 }
5270
5271 /* branching rules */
5272 for( i = 0; i < set->nbranchrules; ++i )
5273 {
5274 SCIP_CALL( SCIPbranchruleInit(set->branchrules[i], set) );
5275 }
5276
5277 /* display columns */
5278 for( i = 0; i < set->ndisps; ++i )
5279 {
5280 SCIP_CALL( SCIPdispInit(set->disps[i], set) );
5281 }
5282 SCIP_CALL( SCIPdispAutoActivate(set) );
5283
5284 /* statistics tables */
5285 for( i = 0; i < set->ntables; ++i )
5286 {
5287 SCIP_CALL( SCIPtableInit(set->tables[i], set) );
5288 }
5289
5290 /* expression handlers */
5291 for( i = 0; i < set->nexprhdlrs; ++i )
5292 SCIPexprhdlrInit(set->exprhdlrs[i], set);
5293
5294 /* NLP solver interfaces */
5295 for( i = 0; i < set->nnlpis; ++i )
5296 SCIPnlpiInit(set->nlpis[i]);
5297
5298 return SCIP_OKAY;
5299 }
5300
5301 /** calls exit methods of all plugins */
5302 SCIP_RETCODE SCIPsetExitPlugins(
5303 SCIP_SET* set, /**< global SCIP settings */
5304 BMS_BLKMEM* blkmem, /**< block memory */
5305 SCIP_STAT* stat /**< dynamic problem statistics */
5306 )
5307 {
5308 int i;
5309
5310 assert(set != NULL);
5311
5312 /* active variable pricers */
5313 SCIPsetSortPricers(set);
5314 for( i = 0; i < set->nactivepricers; ++i )
5315 {
5316 SCIP_CALL( SCIPpricerExit(set->pricers[i], set) );
5317 }
5318
5319 /* Benders' decomposition */
5320 SCIPsetSortBenders(set);
5321 for( i = 0; i < set->nactivebenders; ++i )
5322 {
5323 SCIP_CALL( SCIPbendersExit(set->benders[i], set) );
5324 }
5325
5326 /* constraint handlers */
5327 for( i = 0; i < set->nconshdlrs; ++i )
5328 {
5329 SCIP_CALL( SCIPconshdlrExit(set->conshdlrs[i], blkmem, set, stat) );
5330 }
5331
5332 /* conflict handlers */
5333 for( i = 0; i < set->nconflicthdlrs; ++i )
5334 {
5335 SCIP_CALL( SCIPconflicthdlrExit(set->conflicthdlrs[i], set) );
5336 }
5337
5338 /* presolvers */
5339 for( i = 0; i < set->npresols; ++i )
5340 {
5341 SCIP_CALL( SCIPpresolExit(set->presols[i], set) );
5342 }
5343
5344 /* relaxators */
5345 for( i = 0; i < set->nrelaxs; ++i )
5346 {
5347 SCIP_CALL( SCIPrelaxExit(set->relaxs[i], set) );
5348 }
5349
5350 /* separators */
5351 for( i = 0; i < set->nsepas; ++i )
5352 {
5353 SCIP_CALL( SCIPsepaExit(set->sepas[i], set) );
5354 }
5355
5356 /* cut selectors */
5357 for( i = 0; i < set->ncutsels; ++i )
5358 {
5359 SCIP_CALL( SCIPcutselExit(set->cutsels[i], set) );
5360 }
5361
5362 /* propagators */
5363 for( i = 0; i < set->nprops; ++i )
5364 {
5365 SCIP_CALL( SCIPpropExit(set->props[i], set) );
5366 }
5367
5368 /* primal heuristics */
5369 for( i = 0; i < set->nheurs; ++i )
5370 {
5371 SCIP_CALL( SCIPheurExit(set->heurs[i], set) );
5372 }
5373
5374 /* tree compression */
5375 for( i = 0; i < set->ncomprs; ++i )
5376 {
5377 SCIP_CALL( SCIPcomprExit(set->comprs[i], set) );
5378 }
5379
5380 /* event handlers */
5381 for( i = 0; i < set->neventhdlrs; ++i )
5382 {
5383 SCIP_CALL( SCIPeventhdlrExit(set->eventhdlrs[i], set) );
5384 }
5385
5386 /* node selectors */
5387 for( i = 0; i < set->nnodesels; ++i )
5388 {
5389 SCIP_CALL( SCIPnodeselExit(set->nodesels[i], set) );
5390 }
5391
5392 /* branching rules */
5393 for( i = 0; i < set->nbranchrules; ++i )
5394 {
5395 SCIP_CALL( SCIPbranchruleExit(set->branchrules[i], set) );
5396 }
5397
5398 /* display columns */
5399 for( i = 0; i < set->ndisps; ++i )
5400 {
5401 SCIP_CALL( SCIPdispExit(set->disps[i], set) );
5402 }
5403
5404 /* statistics tables */
5405 for( i = 0; i < set->ntables; ++i )
5406 {
5407 SCIP_CALL( SCIPtableExit(set->tables[i], set) );
5408 }
5409
5410 return SCIP_OKAY;
5411 }
5412
5413 /** calls initpre methods of all plugins */
5414 SCIP_RETCODE SCIPsetInitprePlugins(
5415 SCIP_SET* set, /**< global SCIP settings */
5416 BMS_BLKMEM* blkmem, /**< block memory */
5417 SCIP_STAT* stat /**< dynamic problem statistics */
5418 )
5419 {
5420 int i;
5421
5422 assert(set != NULL);
5423
5424 /* inform presolvers that the presolving is about to begin */
5425 for( i = 0; i < set->npresols; ++i )
5426 {
5427 SCIP_CALL( SCIPpresolInitpre(set->presols[i], set) );
5428 }
5429
5430 /* inform propagators that the presolving is about to begin */
5431 for( i = 0; i < set->nprops; ++i )
5432 {
5433 SCIP_CALL( SCIPpropInitpre(set->props[i], set) );
5434 }
5435
5436 /* inform constraint handlers that the presolving is about to begin */
5437 for( i = 0; i < set->nconshdlrs; ++i )
5438 {
5439 SCIP_CALL( SCIPconshdlrInitpre(set->conshdlrs[i], blkmem, set, stat) );
5440 }
5441
5442 /* inform Benders' decomposition that the presolving is about to begin */
5443 for( i = 0; i < set->nactivebenders; ++i )
5444 {
5445 SCIP_CALL( SCIPbendersInitpre(set->benders[i], set, stat) );
5446 }
5447
5448 return SCIP_OKAY;
5449 }
5450
5451 /** calls exitpre methods of all plugins */
5452 SCIP_RETCODE SCIPsetExitprePlugins(
5453 SCIP_SET* set, /**< global SCIP settings */
5454 BMS_BLKMEM* blkmem, /**< block memory */
5455 SCIP_STAT* stat /**< dynamic problem statistics */
5456 )
5457 {
5458 int i;
5459
5460 assert(set != NULL);
5461
5462 /* inform presolvers that the presolving is about to end */
5463 for( i = 0; i < set->npresols; ++i )
5464 {
5465 SCIP_CALL( SCIPpresolExitpre(set->presols[i], set) );
5466 }
5467
5468 /* inform propagators that the presolving is about to end */
5469 for( i = 0; i < set->nprops; ++i )
5470 {
5471 SCIP_CALL( SCIPpropExitpre(set->props[i], set) );
5472 }
5473
5474 /* inform constraint handlers that the presolving is about to end */
5475 for( i = 0; i < set->nconshdlrs; ++i )
5476 {
5477 SCIP_CALL( SCIPconshdlrExitpre(set->conshdlrs[i], blkmem, set, stat) );
5478 }
5479
5480 /* inform Benders' decomposition that the presolving is about to end */
5481 for( i = 0; i < set->nactivebenders; ++i )
5482 {
5483 SCIP_CALL( SCIPbendersExitpre(set->benders[i], set, stat) );
5484 }
5485
5486 return SCIP_OKAY;
5487 }
5488
5489 /** calls initsol methods of all plugins */
5490 SCIP_RETCODE SCIPsetInitsolPlugins(
5491 SCIP_SET* set, /**< global SCIP settings */
5492 BMS_BLKMEM* blkmem, /**< block memory */
5493 SCIP_STAT* stat /**< dynamic problem statistics */
5494 )
5495 {
5496 int i;
5497
5498 assert(set != NULL);
5499
5500 /* reset SCIP-defined feasibility tolerance for relaxations
5501 * if this is invalid, then only the relaxation specific feasibility tolerance,
5502 * e.g., numerics/lpfeastol is applied
5503 * SCIP plugins or core may set num_relaxfeastol to request a
5504 * tighter feasibility tolerance, though
5505 * see also documentation of SCIPchgRelaxfeastol
5506 */
5507 set->num_relaxfeastol = SCIP_INVALID;
5508
5509 /* active variable pricers */
5510 SCIPsetSortPricers(set);
5511 for( i = 0; i < set->nactivepricers; ++i )
5512 {
5513 SCIP_CALL( SCIPpricerInitsol(set->pricers[i], set) );
5514 }
5515
5516 /* Benders' decomposition */
5517 SCIPsetSortBenders(set);
5518 for( i = 0; i < set->nactivebenders; ++i )
5519 {
5520 SCIP_CALL( SCIPbendersInitsol(set->benders[i], set) );
5521 }
5522
5523 /* constraint handlers */
5524 for( i = 0; i < set->nconshdlrs; ++i )
5525 {
5526 SCIP_CALL( SCIPconshdlrInitsol(set->conshdlrs[i], blkmem, set, stat) );
5527 }
5528
5529 /* conflict handlers */
5530 for( i = 0; i < set->nconflicthdlrs; ++i )
5531 {
5532 SCIP_CALL( SCIPconflicthdlrInitsol(set->conflicthdlrs[i], set) );
5533 }
5534
5535 /* relaxators */
5536 for( i = 0; i < set->nrelaxs; ++i )
5537 {
5538 SCIP_CALL( SCIPrelaxInitsol(set->relaxs[i], set) );
5539 }
5540
5541 /* separators */
5542 for( i = 0; i < set->nsepas; ++i )
5543 {
5544 SCIP_CALL( SCIPsepaInitsol(set->sepas[i], set) );
5545 }
5546
5547 /* cut selectors */
5548 for( i =0; i < set->ncutsels; ++i )
5549 {
5550 SCIP_CALL( SCIPcutselInitsol(set->cutsels[i], set) );
5551 }
5552
5553 /* propagators */
5554 for( i = 0; i < set->nprops; ++i )
5555 {
5556 SCIP_CALL( SCIPpropInitsol(set->props[i], set) );
5557 }
5558
5559 /* primal heuristics */
5560 for( i = 0; i < set->nheurs; ++i )
5561 {
5562 SCIP_CALL( SCIPheurInitsol(set->heurs[i], set) );
5563 }
5564
5565 /* event handlers */
5566 for( i = 0; i < set->neventhdlrs; ++i )
5567 {
5568 SCIP_CALL( SCIPeventhdlrInitsol(set->eventhdlrs[i], set) );
5569 }
5570
5571 /* node selectors */
5572 for( i = 0; i < set->nnodesels; ++i )
5573 {
5574 SCIP_CALL( SCIPnodeselInitsol(set->nodesels[i], set) );
5575 }
5576
5577 /* branching rules */
5578 for( i = 0; i < set->nbranchrules; ++i )
5579 {
5580 SCIP_CALL( SCIPbranchruleInitsol(set->branchrules[i], set) );
5581 }
5582
5583 /* display columns */
5584 for( i = 0; i < set->ndisps; ++i )
5585 {
5586 SCIP_CALL( SCIPdispInitsol(set->disps[i], set) );
5587 }
5588
5589 /* statistics tables */
5590 for( i = 0; i < set->ntables; ++i )
5591 {
5592 SCIP_CALL( SCIPtableInitsol(set->tables[i], set) );
5593 }
5594
5595 return SCIP_OKAY;
5596 }
5597
5598 /** calls exitsol methods of all plugins */
5599 SCIP_RETCODE SCIPsetExitsolPlugins(
5600 SCIP_SET* set, /**< global SCIP settings */
5601 BMS_BLKMEM* blkmem, /**< block memory */
5602 SCIP_STAT* stat, /**< dynamic problem statistics */
5603 SCIP_Bool restart /**< was this exit solve call triggered by a restart? */
5604 )
5605 {
5606 int i;
5607
5608 assert(set != NULL);
5609
5610 /* active variable pricers */
5611 SCIPsetSortPricers(set);
5612 for( i = 0; i < set->nactivepricers; ++i )
5613 {
5614 SCIP_CALL( SCIPpricerExitsol(set->pricers[i], set) );
5615 }
5616
5617 /* Benders' decomposition */
5618 SCIPsetSortBenders(set);
5619 for( i = 0; i < set->nactivebenders; ++i )
5620 {
5621 SCIP_CALL( SCIPbendersExitsol(set->benders[i], set) );
5622 }
5623
5624 /* constraint handlers */
5625 for( i = 0; i < set->nconshdlrs; ++i )
5626 {
5627 SCIP_CALL( SCIPconshdlrExitsol(set->conshdlrs[i], blkmem, set, stat, restart) );
5628 }
5629
5630 /* conflict handlers */
5631 for( i = 0; i < set->nconflicthdlrs; ++i )
5632 {
5633 SCIP_CALL( SCIPconflicthdlrExitsol(set->conflicthdlrs[i], set) );
5634 }
5635
5636 /* relaxators */
5637 for( i = 0; i < set->nrelaxs; ++i )
5638 {
5639 SCIP_CALL( SCIPrelaxExitsol(set->relaxs[i], set) );
5640 }
5641
5642 /* separators */
5643 for( i = 0; i < set->nsepas; ++i )
5644 {
5645 SCIP_CALL( SCIPsepaExitsol(set->sepas[i], set) );
5646 }
5647
5648 /* cut selectors */
5649 for( i = 0; i < set->ncutsels; ++i )
5650 {
5651 SCIP_CALL( SCIPcutselExitsol(set->cutsels[i], set) );
5652 }
5653
5654 /* propagators */
5655 for( i = 0; i < set->nprops; ++i )
5656 {
5657 SCIP_CALL( SCIPpropExitsol(set->props[i], set, restart) );
5658 }
5659
5660 /* primal heuristics */
5661 for( i = 0; i < set->nheurs; ++i )
5662 {
5663 SCIP_CALL( SCIPheurExitsol(set->heurs[i], set) );
5664 }
5665
5666 /* event handlers */
5667 for( i = 0; i < set->neventhdlrs; ++i )
5668 {
5669 SCIP_CALL( SCIPeventhdlrExitsol(set->eventhdlrs[i], set) );
5670 }
5671
5672 /* node selectors */
5673 for( i = 0; i < set->nnodesels; ++i )
5674 {
5675 SCIP_CALL( SCIPnodeselExitsol(set->nodesels[i], set) );
5676 }
5677
5678 /* branching rules */
5679 for( i = 0; i < set->nbranchrules; ++i )
5680 {
5681 SCIP_CALL( SCIPbranchruleExitsol(set->branchrules[i], set) );
5682 }
5683
5684 /* display columns */
5685 for( i = 0; i < set->ndisps; ++i )
5686 {
5687 SCIP_CALL( SCIPdispExitsol(set->disps[i], set) );
5688 }
5689
5690 /* statistics tables */
5691 for( i = 0; i < set->ntables; ++i )
5692 {
5693 SCIP_CALL( SCIPtableExitsol(set->tables[i], set) );
5694 }
5695
5696 return SCIP_OKAY;
5697 }
5698
5699 /** calculate memory size for dynamically allocated arrays */
5700 int SCIPsetCalcMemGrowSize(
5701 SCIP_SET* set, /**< global SCIP settings */
5702 int num /**< minimum number of entries to store */
5703 )
5704 {
5705 return calcGrowSize(set->mem_arraygrowinit, set->mem_arraygrowfac, num);
5706 }
5707
5708 /** calculate memory size for tree array */
5709 int SCIPsetCalcTreeGrowSize(
5710 SCIP_SET* set, /**< global SCIP settings */
5711 int num /**< minimum number of entries to store */
5712 )
5713 {
5714 return calcGrowSize(set->mem_treegrowinit, set->mem_treegrowfac, num);
5715 }
5716
5717 /** calculate memory size for path array */
5718 int SCIPsetCalcPathGrowSize(
5719 SCIP_SET* set, /**< global SCIP settings */
5720 int num /**< minimum number of entries to store */
5721 )
5722 {
5723 return calcGrowSize(set->mem_pathgrowinit, set->mem_pathgrowfac, num);
5724 }
5725
5726 /** sets verbosity level for message output */
5727 SCIP_RETCODE SCIPsetSetVerbLevel(
5728 SCIP_SET* set, /**< global SCIP settings */
5729 SCIP_VERBLEVEL verblevel /**< verbosity level for message output */
5730 )
5731 {
5732 assert(set != NULL);
5733
5734 if( verblevel > SCIP_VERBLEVEL_FULL )
5735 {
5736 SCIPerrorMessage("invalid verbosity level <%d>, maximum is <%d>\n", verblevel, SCIP_VERBLEVEL_FULL);
5737 return SCIP_INVALIDCALL;
5738 }
5739
5740 set->disp_verblevel = verblevel;
5741
5742 return SCIP_OKAY;
5743 }
5744
5745 /** sets feasibility tolerance */
5746 SCIP_RETCODE SCIPsetSetFeastol(
5747 SCIP_SET* set, /**< global SCIP settings */
5748 SCIP_LP* lp, /**< LP data, or NULL */
5749 SCIP_Real feastol /**< new feasibility tolerance */
5750 )
5751 {
5752 assert(set != NULL);
5753
5754 set->num_feastol = feastol;
5755
5756 /* the feasibility tolerance of the LP solver should never be larger than
5757 * numerics/lpfeastolfactor times SCIP's feasibility tolerance
5758 * if necessary, reset LP feastol
5759 */
5760 if( lp != NULL && SCIPlpGetFeastol(lp) > set->num_lpfeastolfactor * SCIPsetFeastol(set) )
5761 SCIPlpResetFeastol(lp, set);
5762
5763 return SCIP_OKAY;
5764 }
5765
5766 /** sets feasibility tolerance for reduced costs in LP solution */
5767 SCIP_RETCODE SCIPsetSetDualfeastol(
5768 SCIP_SET* set, /**< global SCIP settings */
5769 SCIP_Real dualfeastol /**< new reduced costs feasibility tolerance */
5770 )
5771 {
5772 assert(set != NULL);
5773
5774 set->num_dualfeastol = dualfeastol;
5775
5776 return SCIP_OKAY;
5777 }
5778
5779 /** sets LP convergence tolerance used in barrier algorithm */
5780 SCIP_RETCODE SCIPsetSetBarrierconvtol(
5781 SCIP_SET* set, /**< global SCIP settings */
5782 SCIP_Real barrierconvtol /**< new convergence tolerance used in barrier algorithm */
5783 )
5784 {
5785 assert(set != NULL);
5786
5787 set->num_barrierconvtol = barrierconvtol;
5788
5789 return SCIP_OKAY;
5790 }
5791
5792 /** sets primal feasibility tolerance for relaxations (relaxfeastol)
5793 *
5794 * @note Set to SCIP_INVALID to apply relaxation-specific feasibility tolerance only.
5795 *
5796 * @return Previous value of relaxfeastol.
5797 */
5798 SCIP_Real SCIPsetSetRelaxfeastol(
5799 SCIP_SET* set, /**< global SCIP settings */
5800 SCIP_Real relaxfeastol /**< new primal feasibility tolerance for relaxations, or SCIP_INVALID */
5801 )
5802 {
5803 SCIP_Real oldval;
5804
5805 assert(set != NULL);
5806 assert(relaxfeastol >= 0.0);
5807
5808 oldval = set->num_relaxfeastol;
5809 set->num_relaxfeastol = relaxfeastol;
5810
5811 return oldval;
5812 }
5813
5814 /** marks that some limit parameter was changed */
5815 void SCIPsetSetLimitChanged(
5816 SCIP_SET* set /**< global SCIP settings */
5817 )
5818 {
5819 set->limitchanged = TRUE;
5820
5821 set->istimelimitfinite = (set->limit_time < SCIP_DEFAULT_LIMIT_TIME);
5822 }
5823
5824 /** returns the maximal number of variables priced into the LP per round */
5825 int SCIPsetGetPriceMaxvars(
5826 SCIP_SET* set, /**< global SCIP settings */
5827 SCIP_Bool root /**< are we at the root node? */
5828 )
5829 {
5830 assert(set != NULL);
5831
5832 if( root )
5833 return set->price_maxvarsroot;
5834 else
5835 return set->price_maxvars;
5836 }
5837
5838 /** returns the maximal number of cuts separated per round */
5839 int SCIPsetGetSepaMaxcuts(
5840 SCIP_SET* set, /**< global SCIP settings */
5841 SCIP_Bool root /**< are we at the root node? */
5842 )
5843 {
5844 assert(set != NULL);
5845
5846 if( root )
5847 return set->sepa_maxcutsroot;
5848 else
5849 return set->sepa_maxcuts;
5850 }
5851
5852 /** returns the maximal ratio between coefficients to ensure in rowprep cleanup */
5853 SCIP_Real SCIPsetGetSepaMaxCoefRatioRowprep(
5854 SCIP_SET* set /**< global SCIP settings */
5855 )
5856 {
5857 SCIP_Real maxcoefrange;
5858
5859 maxcoefrange = set->sepa_maxcoefratiofacrowprep / set->num_feastol;
5860 if( maxcoefrange < 1.0 )
5861 maxcoefrange = 1.0;
5862
5863 return maxcoefrange;
5864 }
5865
5866 /** returns user defined objective value (in original space) for reference purposes */
5867 SCIP_Real SCIPsetGetReferencevalue(
5868 SCIP_SET* set /**< global SCIP settings */
5869 )
5870 {
5871 assert(NULL != set);
5872
5873 return set->misc_referencevalue;
5874 }
5875
5876
5877 /** returns debug solution data */
5878 SCIP_DEBUGSOLDATA* SCIPsetGetDebugSolData(
5879 SCIP_SET* set /**< global SCIP settings */
5880 )
5881 {
5882 assert(set != NULL);
5883
5884 return set->debugsoldata;
5885 }
5886
5887
5888 /*
5889 * simple functions implemented as defines
5890 */
5891
5892 /* In debug mode, the following methods are implemented as function calls to ensure
5893 * type validity.
5894 * In optimized mode, the methods are implemented as defines to improve performance.
5895 * However, we want to have them in the library anyways, so we have to undef the defines.
5896 */
5897
5898 #undef SCIPsetInfinity
5899 #undef SCIPsetEpsilon
5900 #undef SCIPsetSumepsilon
5901 #undef SCIPsetFeastol
5902 #undef SCIPsetDualfeastol
5903 #undef SCIPsetBarrierconvtol
5904 #undef SCIPsetPseudocosteps
5905 #undef SCIPsetPseudocostdelta
5906 #undef SCIPsetCutoffbounddelta
5907 #undef SCIPsetLPFeastolFactor
5908 #undef SCIPsetRelaxfeastol
5909 #undef SCIPsetRecompfac
5910 #undef SCIPsetIsEQ
5911 #undef SCIPsetIsLT
5912 #undef SCIPsetIsLE
5913 #undef SCIPsetIsGT
5914 #undef SCIPsetIsGE
5915 #undef SCIPsetIsInfinity
5916 #undef SCIPsetIsZero
5917 #undef SCIPsetIsPositive
5918 #undef SCIPsetIsNegative
5919 #undef SCIPsetIsIntegral
5920 #undef SCIPsetIsScalingIntegral
5921 #undef SCIPsetIsFracIntegral
5922 #undef SCIPsetFloor
5923 #undef SCIPsetCeil
5924 #undef SCIPsetRound
5925 #undef SCIPsetFrac
5926 #undef SCIPsetIsSumEQ
5927 #undef SCIPsetIsSumLT
5928 #undef SCIPsetIsSumLE
5929 #undef SCIPsetIsSumGT
5930 #undef SCIPsetIsSumGE
5931 #undef SCIPsetIsSumZero
5932 #undef SCIPsetIsSumPositive
5933 #undef SCIPsetIsSumNegative
5934 #undef SCIPsetSumFloor
5935 #undef SCIPsetSumCeil
5936 #undef SCIPsetSumRound
5937 #undef SCIPsetSumFrac
5938 #undef SCIPsetIsFeasEQ
5939 #undef SCIPsetIsFeasLT
5940 #undef SCIPsetIsFeasLE
5941 #undef SCIPsetIsFeasGT
5942 #undef SCIPsetIsFeasGE
5943 #undef SCIPsetIsFeasZero
5944 #undef SCIPsetIsFeasPositive
5945 #undef SCIPsetIsFeasNegative
5946 #undef SCIPsetIsFeasIntegral
5947 #undef SCIPsetIsFeasFracIntegral
5948 #undef SCIPsetFeasFloor
5949 #undef SCIPsetFeasCeil
5950 #undef SCIPsetFeasRound
5951 #undef SCIPsetFeasFrac
5952 #undef SCIPsetIsDualfeasEQ
5953 #undef SCIPsetIsDualfeasLT
5954 #undef SCIPsetIsDualfeasLE
5955 #undef SCIPsetIsDualfeasGT
5956 #undef SCIPsetIsDualfeasGE
5957 #undef SCIPsetIsDualfeasZero
5958 #undef SCIPsetIsDualfeasPositive
5959 #undef SCIPsetIsDualfeasNegative
5960 #undef SCIPsetIsDualfeasIntegral
5961 #undef SCIPsetIsDualfeasFracIntegral
5962 #undef SCIPsetDualfeasFloor
5963 #undef SCIPsetDualfeasCeil
5964 #undef SCIPsetDualfeasRound
5965 #undef SCIPsetDualfeasFrac
5966 #undef SCIPsetIsLbBetter
5967 #undef SCIPsetIsUbBetter
5968 #undef SCIPsetIsEfficacious
5969 #undef SCIPsetIsRelEQ
5970 #undef SCIPsetIsRelLT
5971 #undef SCIPsetIsRelLE
5972 #undef SCIPsetIsRelGT
5973 #undef SCIPsetIsRelGE
5974 #undef SCIPsetIsSumRelEQ
5975 #undef SCIPsetIsSumRelLT
5976 #undef SCIPsetIsSumRelLE
5977 #undef SCIPsetIsSumRelGT
5978 #undef SCIPsetIsSumRelGE
5979 #undef SCIPsetIsUpdateUnreliable
5980 #undef SCIPsetInitializeRandomSeed
5981 #undef SCIPsetIsHugeValue
5982 #undef SCIPsetGetHugeValue
5983 #undef SCIPsetGetSubscipsOff
5984
5985 /** returns value treated as infinity */
5986 SCIP_Real SCIPsetInfinity(
5987 SCIP_SET* set /**< global SCIP settings */
5988 )
5989 {
5990 assert(set != NULL);
5991
5992 return set->num_infinity;
5993 }
5994
5995 /** returns the minimum value that is regarded as huge and should be handled separately (e.g., in activity
5996 * computation)
5997 */
5998 SCIP_Real SCIPsetGetHugeValue(
5999 SCIP_SET* set /**< global SCIP settings */
6000 )
6001 {
6002 assert(set != NULL);
6003
6004 return set->num_hugeval;
6005 }
6006
6007 /** returns value treated as zero */
6008 SCIP_Real SCIPsetEpsilon(
6009 SCIP_SET* set /**< global SCIP settings */
6010 )
6011 {
6012 assert(set != NULL);
6013
6014 return set->num_epsilon;
6015 }
6016
6017 /** returns value treated as zero for sums of floating point values */
6018 SCIP_Real SCIPsetSumepsilon(
6019 SCIP_SET* set /**< global SCIP settings */
6020 )
6021 {
6022 assert(set != NULL);
6023
6024 return set->num_sumepsilon;
6025 }
6026
6027 /** returns feasibility tolerance for constraints */
6028 SCIP_Real SCIPsetFeastol(
6029 SCIP_SET* set /**< global SCIP settings */
6030 )
6031 {
6032 assert(set != NULL);
6033
6034 return set->num_feastol;
6035 }
6036
6037 /** returns feasibility tolerance for reduced costs */
6038 SCIP_Real SCIPsetDualfeastol(
6039 SCIP_SET* set /**< global SCIP settings */
6040 )
6041 {
6042 assert(set != NULL);
6043
6044 return set->num_dualfeastol;
6045 }
6046
6047 /** returns factor w.r.t. primal feasibility tolerance that determines default (and maximal) feasibility tolerance */
6048 SCIP_Real SCIPsetLPFeastolFactor(
6049 SCIP_SET* set /**< global SCIP settings */
6050 )
6051 {
6052 return set->num_lpfeastolfactor;
6053 }
6054
6055 /** returns convergence tolerance used in barrier algorithm */
6056 SCIP_Real SCIPsetBarrierconvtol(
6057 SCIP_SET* set /**< global SCIP settings */
6058 )
6059 {
6060 assert(set != NULL);
6061
6062 return set->num_barrierconvtol;
6063 }
6064
6065 /** returns minimal variable distance value to use for pseudo cost updates */
6066 SCIP_Real SCIPsetPseudocosteps(
6067 SCIP_SET* set /**< global SCIP settings */
6068 )
6069 {
6070 assert(set != NULL);
6071
6072 return set->num_pseudocosteps;
6073 }
6074
6075 /** returns minimal minimal objective distance value to use for pseudo cost updates */
6076 SCIP_Real SCIPsetPseudocostdelta(
6077 SCIP_SET* set /**< global SCIP settings */
6078 )
6079 {
6080 assert(set != NULL);
6081
6082 return set->num_pseudocostdelta;
6083 }
6084
6085 /** return the delta to use for computing the cutoff bound for integral objectives */
6086 SCIP_Real SCIPsetCutoffbounddelta(
6087 SCIP_SET* set /**< global SCIP settings */
6088 )
6089 {
6090 SCIP_Real feastol;
6091
6092 assert(set != NULL);
6093
6094 feastol = SCIPsetFeastol(set);
6095
6096 return MIN(100.0 * feastol, 0.0001);
6097 }
6098
6099 /** return the primal feasibility tolerance for relaxations */
6100 SCIP_Real SCIPsetRelaxfeastol(
6101 SCIP_SET* set /**< global SCIP settings */
6102 )
6103 {
6104 assert(set != NULL);
6105
6106 return set->num_relaxfeastol;
6107 }
6108
6109 /** returns minimal decrease factor that causes the recomputation of a value
6110 * (e.g., pseudo objective) instead of an update */
6111 SCIP_Real SCIPsetRecompfac(
6112 SCIP_SET* set /**< global SCIP settings */
6113 )
6114 {
6115 assert(set != NULL);
6116
6117 return set->num_recompfac;
6118 }
6119
6120 /** checks, if value is (positive) infinite */
6121 SCIP_Bool SCIPsetIsInfinity(
6122 SCIP_SET* set, /**< global SCIP settings */
6123 SCIP_Real val /**< value to be compared against infinity */
6124 )
6125 {
6126 assert(set != NULL);
6127
6128 return (val >= set->num_infinity);
6129 }
6130
6131 /** checks, if value is huge and should be handled separately (e.g., in activity computation) */
6132 SCIP_Bool SCIPsetIsHugeValue(
6133 SCIP_SET* set, /**< global SCIP settings */
6134 SCIP_Real val /**< value to be checked whether it is huge */
6135 )
6136 {
6137 assert(set != NULL);
6138
6139 return (val >= set->num_hugeval);
6140 }
6141
6142 /** checks, if values are in range of epsilon */
6143 SCIP_Bool SCIPsetIsEQ(
6144 SCIP_SET* set, /**< global SCIP settings */
6145 SCIP_Real val1, /**< first value to be compared */
6146 SCIP_Real val2 /**< second value to be compared */
6147 )
6148 {
6149 assert(set != NULL);
6150
6151 /* avoid to compare two different infinities; the reason for that is
6152 * that such a comparison can lead to unexpected results */
6153 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6154 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6155 || val1 == val2 ); /*lint !e777*/
6156
6157 return EPSEQ(val1, val2, set->num_epsilon);
6158 }
6159
6160 /** checks, if val1 is (more than epsilon) lower than val2 */
6161 SCIP_Bool SCIPsetIsLT(
6162 SCIP_SET* set, /**< global SCIP settings */
6163 SCIP_Real val1, /**< first value to be compared */
6164 SCIP_Real val2 /**< second value to be compared */
6165 )
6166 {
6167 assert(set != NULL);
6168
6169 /* avoid to compare two different infinities; the reason for that is
6170 * that such a comparison can lead to unexpected results */
6171 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6172 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6173 || val1 == val2 ); /*lint !e777*/
6174
6175 return EPSLT(val1, val2, set->num_epsilon);
6176 }
6177
6178 /** checks, if val1 is not (more than epsilon) greater than val2 */
6179 SCIP_Bool SCIPsetIsLE(
6180 SCIP_SET* set, /**< global SCIP settings */
6181 SCIP_Real val1, /**< first value to be compared */
6182 SCIP_Real val2 /**< second value to be compared */
6183 )
6184 {
6185 assert(set != NULL);
6186
6187 /* avoid to compare two different infinities; the reason for that is
6188 * that such a comparison can lead to unexpected results */
6189 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6190 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6191 || val1 == val2 ); /*lint !e777*/
6192
6193 return EPSLE(val1, val2, set->num_epsilon);
6194 }
6195
6196 /** checks, if val1 is (more than epsilon) greater than val2 */
6197 SCIP_Bool SCIPsetIsGT(
6198 SCIP_SET* set, /**< global SCIP settings */
6199 SCIP_Real val1, /**< first value to be compared */
6200 SCIP_Real val2 /**< second value to be compared */
6201 )
6202 {
6203 assert(set != NULL);
6204
6205 /* avoid to compare two different infinities; the reason for that is
6206 * that such a comparison can lead to unexpected results */
6207 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6208 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6209 || val1 == val2 ); /*lint !e777*/
6210
6211 return EPSGT(val1, val2, set->num_epsilon);
6212 }
6213
6214 /** checks, if val1 is not (more than epsilon) lower than val2 */
6215 SCIP_Bool SCIPsetIsGE(
6216 SCIP_SET* set, /**< global SCIP settings */
6217 SCIP_Real val1, /**< first value to be compared */
6218 SCIP_Real val2 /**< second value to be compared */
6219 )
6220 {
6221 assert(set != NULL);
6222
6223 /* avoid to compare two different infinities; the reason for that is
6224 * that such a comparison can lead to unexpected results */
6225 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6226 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6227 || val1 == val2 ); /*lint !e777*/
6228
6229 return EPSGE(val1, val2, set->num_epsilon);
6230 }
6231
6232 /** checks, if value is in range epsilon of 0.0 */
6233 SCIP_Bool SCIPsetIsZero(
6234 SCIP_SET* set, /**< global SCIP settings */
6235 SCIP_Real val /**< value to process */
6236 )
6237 {
6238 assert(set != NULL);
6239
6240 return EPSZ(val, set->num_epsilon);
6241 }
6242
6243 /** checks, if value is greater than epsilon */
6244 SCIP_Bool SCIPsetIsPositive(
6245 SCIP_SET* set, /**< global SCIP settings */
6246 SCIP_Real val /**< value to process */
6247 )
6248 {
6249 assert(set != NULL);
6250
6251 return EPSP(val, set->num_epsilon);
6252 }
6253
6254 /** checks, if value is lower than -epsilon */
6255 SCIP_Bool SCIPsetIsNegative(
6256 SCIP_SET* set, /**< global SCIP settings */
6257 SCIP_Real val /**< value to process */
6258 )
6259 {
6260 assert(set != NULL);
6261
6262 return EPSN(val, set->num_epsilon);
6263 }
6264
6265 /** checks, if value is integral within epsilon */
6266 SCIP_Bool SCIPsetIsIntegral(
6267 SCIP_SET* set, /**< global SCIP settings */
6268 SCIP_Real val /**< value to process */
6269 )
6270 {
6271 assert(set != NULL);
6272
6273 return EPSISINT(val, set->num_epsilon);
6274 }
6275
6276 /** checks whether the product val * scalar is integral in epsilon scaled by scalar */
6277 SCIP_Bool SCIPsetIsScalingIntegral(
6278 SCIP_SET* set, /**< global SCIP settings */
6279 SCIP_Real val, /**< unscaled value to check for scaled integrality */
6280 SCIP_Real scalar /**< value to scale val with for checking for integrality */
6281 )
6282 {
6283 SCIP_Real scaledeps;
6284
6285 assert(set != NULL);
6286
6287 scaledeps = REALABS(scalar);
6288 scaledeps = MAX(scaledeps, 1.0);
6289 scaledeps *= set->num_epsilon;
6290
6291 return EPSISINT(scalar*val, scaledeps);
6292 }
6293
6294 /** checks, if given fractional part is smaller than epsilon */
6295 SCIP_Bool SCIPsetIsFracIntegral(
6296 SCIP_SET* set, /**< global SCIP settings */
6297 SCIP_Real val /**< value to process */
6298 )
6299 {
6300 assert(set != NULL);
6301 assert(SCIPsetIsGE(set, val, -set->num_epsilon));
6302 assert(SCIPsetIsLE(set, val, 1.0+set->num_epsilon));
6303
6304 return (val <= set->num_epsilon);
6305 }
6306
6307 /** rounds value + feasibility tolerance down to the next integer in epsilon tolerance */
6308 SCIP_Real SCIPsetFloor(
6309 SCIP_SET* set, /**< global SCIP settings */
6310 SCIP_Real val /**< value to process */
6311 )
6312 {
6313 assert(set != NULL);
6314
6315 return EPSFLOOR(val, set->num_epsilon);
6316 }
6317
6318 /** rounds value - feasibility tolerance up to the next integer in epsilon tolerance */
6319 SCIP_Real SCIPsetCeil(
6320 SCIP_SET* set, /**< global SCIP settings */
6321 SCIP_Real val /**< value to process */
6322 )
6323 {
6324 assert(set != NULL);
6325
6326 return EPSCEIL(val, set->num_epsilon);
6327 }
6328
6329 /** rounds value to the nearest integer in epsilon tolerance */
6330 SCIP_Real SCIPsetRound(
6331 SCIP_SET* set, /**< global SCIP settings */
6332 SCIP_Real val /**< value to process */
6333 )
6334 {
6335 assert(set != NULL);
6336
6337 return EPSROUND(val, set->num_epsilon);
6338 }
6339
6340 /** returns fractional part of value, i.e. x - floor(x) in epsilon tolerance */
6341 SCIP_Real SCIPsetFrac(
6342 SCIP_SET* set, /**< global SCIP settings */
6343 SCIP_Real val /**< value to return fractional part for */
6344 )
6345 {
6346 assert(set != NULL);
6347
6348 return EPSFRAC(val, set->num_epsilon);
6349 }
6350
6351 /** checks, if values are in range of sumepsilon */
6352 SCIP_Bool SCIPsetIsSumEQ(
6353 SCIP_SET* set, /**< global SCIP settings */
6354 SCIP_Real val1, /**< first value to be compared */
6355 SCIP_Real val2 /**< second value to be compared */
6356 )
6357 {
6358 assert(set != NULL);
6359
6360 /* avoid to compare two different infinities; the reason for that is
6361 * that such a comparison can lead to unexpected results */
6362 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6363 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6364 || val1 == val2 ); /*lint !e777*/
6365
6366 return EPSEQ(val1, val2, set->num_sumepsilon);
6367 }
6368
6369 /** checks, if val1 is (more than sumepsilon) lower than val2 */
6370 SCIP_Bool SCIPsetIsSumLT(
6371 SCIP_SET* set, /**< global SCIP settings */
6372 SCIP_Real val1, /**< first value to be compared */
6373 SCIP_Real val2 /**< second value to be compared */
6374 )
6375 {
6376 assert(set != NULL);
6377
6378 /* avoid to compare two different infinities; the reason for that is
6379 * that such a comparison can lead to unexpected results */
6380 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6381 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6382 || val1 == val2 ); /*lint !e777*/
6383
6384 return EPSLT(val1, val2, set->num_sumepsilon);
6385 }
6386
6387 /** checks, if val1 is not (more than sumepsilon) greater than val2 */
6388 SCIP_Bool SCIPsetIsSumLE(
6389 SCIP_SET* set, /**< global SCIP settings */
6390 SCIP_Real val1, /**< first value to be compared */
6391 SCIP_Real val2 /**< second value to be compared */
6392 )
6393 {
6394 assert(set != NULL);
6395
6396 /* avoid to compare two different infinities; the reason for that is
6397 * that such a comparison can lead to unexpected results */
6398 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6399 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6400 || val1 == val2 ); /*lint !e777*/
6401
6402 return EPSLE(val1, val2, set->num_sumepsilon);
6403 }
6404
6405 /** checks, if val1 is (more than sumepsilon) greater than val2 */
6406 SCIP_Bool SCIPsetIsSumGT(
6407 SCIP_SET* set, /**< global SCIP settings */
6408 SCIP_Real val1, /**< first value to be compared */
6409 SCIP_Real val2 /**< second value to be compared */
6410 )
6411 {
6412 assert(set != NULL);
6413
6414 /* avoid to compare two different infinities; the reason for that is
6415 * that such a comparison can lead to unexpected results */
6416 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6417 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6418 || val1 == val2 ); /*lint !e777*/
6419
6420 return EPSGT(val1, val2, set->num_sumepsilon);
6421 }
6422
6423 /** checks, if val1 is not (more than sumepsilon) lower than val2 */
6424 SCIP_Bool SCIPsetIsSumGE(
6425 SCIP_SET* set, /**< global SCIP settings */
6426 SCIP_Real val1, /**< first value to be compared */
6427 SCIP_Real val2 /**< second value to be compared */
6428 )
6429 {
6430 assert(set != NULL);
6431
6432 /* avoid to compare two different infinities; the reason for that is
6433 * that such a comparison can lead to unexpected results */
6434 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6435 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6436 || val1 == val2 ); /*lint !e777*/
6437
6438 return EPSGE(val1, val2, set->num_sumepsilon);
6439 }
6440
6441 /** checks, if value is in range sumepsilon of 0.0 */
6442 SCIP_Bool SCIPsetIsSumZero(
6443 SCIP_SET* set, /**< global SCIP settings */
6444 SCIP_Real val /**< value to process */
6445 )
6446 {
6447 assert(set != NULL);
6448
6449 return EPSZ(val, set->num_sumepsilon);
6450 }
6451
6452 /** checks, if value is greater than sumepsilon */
6453 SCIP_Bool SCIPsetIsSumPositive(
6454 SCIP_SET* set, /**< global SCIP settings */
6455 SCIP_Real val /**< value to process */
6456 )
6457 {
6458 assert(set != NULL);
6459
6460 return EPSP(val, set->num_sumepsilon);
6461 }
6462
6463 /** checks, if value is lower than -sumepsilon */
6464 SCIP_Bool SCIPsetIsSumNegative(
6465 SCIP_SET* set, /**< global SCIP settings */
6466 SCIP_Real val /**< value to process */
6467 )
6468 {
6469 assert(set != NULL);
6470
6471 return EPSN(val, set->num_sumepsilon);
6472 }
6473
6474 /** rounds value + sumepsilon tolerance down to the next integer */
6475 SCIP_Real SCIPsetSumFloor(
6476 SCIP_SET* set, /**< global SCIP settings */
6477 SCIP_Real val /**< value to process */
6478 )
6479 {
6480 assert(set != NULL);
6481
6482 return EPSFLOOR(val, set->num_sumepsilon);
6483 }
6484
6485 /** rounds value - sumepsilon tolerance up to the next integer */
6486 SCIP_Real SCIPsetSumCeil(
6487 SCIP_SET* set, /**< global SCIP settings */
6488 SCIP_Real val /**< value to process */
6489 )
6490 {
6491 assert(set != NULL);
6492
6493 return EPSCEIL(val, set->num_sumepsilon);
6494 }
6495
6496 /** rounds value to the nearest integer in sumepsilon tolerance */
6497 SCIP_Real SCIPsetSumRound(
6498 SCIP_SET* set, /**< global SCIP settings */
6499 SCIP_Real val /**< value to process */
6500 )
6501 {
6502 assert(set != NULL);
6503
6504 return EPSROUND(val, set->num_sumepsilon);
6505 }
6506
6507 /** returns fractional part of value, i.e. x - floor(x) in sumepsilon tolerance */
6508 SCIP_Real SCIPsetSumFrac(
6509 SCIP_SET* set, /**< global SCIP settings */
6510 SCIP_Real val /**< value to process */
6511 )
6512 {
6513 assert(set != NULL);
6514
6515 return EPSFRAC(val, set->num_sumepsilon);
6516 }
6517
6518 /** checks, if relative difference of values is in range of feastol */
6519 SCIP_Bool SCIPsetIsFeasEQ(
6520 SCIP_SET* set, /**< global SCIP settings */
6521 SCIP_Real val1, /**< first value to be compared */
6522 SCIP_Real val2 /**< second value to be compared */
6523 )
6524 {
6525 SCIP_Real diff;
6526
6527 assert(set != NULL);
6528
6529 /* avoid to compare two different infinities; the reason for that is
6530 * that such a comparison can lead to unexpected results */
6531 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6532 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6533 || val1 == val2 ); /*lint !e777*/
6534
6535 diff = SCIPrelDiff(val1, val2);
6536
6537 return EPSZ(diff, set->num_feastol);
6538 }
6539
6540 /** checks, if relative difference of val1 and val2 is lower than feastol */
6541 SCIP_Bool SCIPsetIsFeasLT(
6542 SCIP_SET* set, /**< global SCIP settings */
6543 SCIP_Real val1, /**< first value to be compared */
6544 SCIP_Real val2 /**< second value to be compared */
6545 )
6546 {
6547 SCIP_Real diff;
6548
6549 assert(set != NULL);
6550
6551 /* avoid to compare two different infinities; the reason for that is
6552 * that such a comparison can lead to unexpected results */
6553 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6554 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6555 || val1 == val2 ); /*lint !e777*/
6556
6557 diff = SCIPrelDiff(val1, val2);
6558
6559 return EPSN(diff, set->num_feastol);
6560 }
6561
6562 /** checks, if relative difference of val1 and val2 is not greater than feastol */
6563 SCIP_Bool SCIPsetIsFeasLE(
6564 SCIP_SET* set, /**< global SCIP settings */
6565 SCIP_Real val1, /**< first value to be compared */
6566 SCIP_Real val2 /**< second value to be compared */
6567 )
6568 {
6569 SCIP_Real diff;
6570
6571 assert(set != NULL);
6572
6573 /* avoid to compare two different infinities; the reason for that is
6574 * that such a comparison can lead to unexpected results */
6575 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6576 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6577 || val1 == val2 ); /*lint !e777*/
6578
6579 diff = SCIPrelDiff(val1, val2);
6580
6581 return !EPSP(diff, set->num_feastol);
6582 }
6583
6584 /** checks, if relative difference of val1 and val2 is greater than feastol */
6585 SCIP_Bool SCIPsetIsFeasGT(
6586 SCIP_SET* set, /**< global SCIP settings */
6587 SCIP_Real val1, /**< first value to be compared */
6588 SCIP_Real val2 /**< second value to be compared */
6589 )
6590 {
6591 SCIP_Real diff;
6592
6593 assert(set != NULL);
6594
6595 /* avoid to compare two different infinities; the reason for that is
6596 * that such a comparison can lead to unexpected results */
6597 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6598 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6599 || val1 == val2 ); /*lint !e777*/
6600
6601 diff = SCIPrelDiff(val1, val2);
6602
6603 return EPSP(diff, set->num_feastol);
6604 }
6605
6606 /** checks, if relative difference of val1 and val2 is not lower than -feastol */
6607 SCIP_Bool SCIPsetIsFeasGE(
6608 SCIP_SET* set, /**< global SCIP settings */
6609 SCIP_Real val1, /**< first value to be compared */
6610 SCIP_Real val2 /**< second value to be compared */
6611 )
6612 {
6613 SCIP_Real diff;
6614
6615 assert(set != NULL);
6616
6617 /* avoid to compare two different infinities; the reason for that is
6618 * that such a comparison can lead to unexpected results */
6619 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6620 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6621 || val1 == val2 ); /*lint !e777*/
6622
6623 diff = SCIPrelDiff(val1, val2);
6624
6625 return !EPSN(diff, set->num_feastol);
6626 }
6627
6628 /** checks, if value is in range feasibility tolerance of 0.0 */
6629 SCIP_Bool SCIPsetIsFeasZero(
6630 SCIP_SET* set, /**< global SCIP settings */
6631 SCIP_Real val /**< value to process */
6632 )
6633 {
6634 assert(set != NULL);
6635
6636 return EPSZ(val, set->num_feastol);
6637 }
6638
6639 /** checks, if value is greater than feasibility tolerance */
6640 SCIP_Bool SCIPsetIsFeasPositive(
6641 SCIP_SET* set, /**< global SCIP settings */
6642 SCIP_Real val /**< value to process */
6643 )
6644 {
6645 assert(set != NULL);
6646
6647 return EPSP(val, set->num_feastol);
6648 }
6649
6650 /** checks, if value is lower than -feasibility tolerance */
6651 SCIP_Bool SCIPsetIsFeasNegative(
6652 SCIP_SET* set, /**< global SCIP settings */
6653 SCIP_Real val /**< value to process */
6654 )
6655 {
6656 assert(set != NULL);
6657
6658 return EPSN(val, set->num_feastol);
6659 }
6660
6661 /** checks, if value is integral within the feasibility bounds */
6662 SCIP_Bool SCIPsetIsFeasIntegral(
6663 SCIP_SET* set, /**< global SCIP settings */
6664 SCIP_Real val /**< value to process */
6665 )
6666 {
6667 assert(set != NULL);
6668
6669 return EPSISINT(val, set->num_feastol);
6670 }
6671
6672 /** checks, if given fractional part is smaller than feastol */
6673 SCIP_Bool SCIPsetIsFeasFracIntegral(
6674 SCIP_SET* set, /**< global SCIP settings */
6675 SCIP_Real val /**< value to process */
6676 )
6677 {
6678 assert(set != NULL);
6679 assert(SCIPsetIsGE(set, val, -2*set->num_feastol));
6680 assert(SCIPsetIsLE(set, val, 1.0+set->num_feastol));
6681
6682 return (val <= set->num_feastol);
6683 }
6684
6685 /** rounds value + feasibility tolerance down to the next integer in feasibility tolerance */
6686 SCIP_Real SCIPsetFeasFloor(
6687 SCIP_SET* set, /**< global SCIP settings */
6688 SCIP_Real val /**< value to process */
6689 )
6690 {
6691 assert(set != NULL);
6692
6693 return EPSFLOOR(val, set->num_feastol);
6694 }
6695
6696 /** rounds value - feasibility tolerance up to the next integer in feasibility tolerance */
6697 SCIP_Real SCIPsetFeasCeil(
6698 SCIP_SET* set, /**< global SCIP settings */
6699 SCIP_Real val /**< value to process */
6700 )
6701 {
6702 assert(set != NULL);
6703
6704 return EPSCEIL(val, set->num_feastol);
6705 }
6706
6707 /** rounds value to the nearest integer in feasibility tolerance */
6708 SCIP_Real SCIPsetFeasRound(
6709 SCIP_SET* set, /**< global SCIP settings */
6710 SCIP_Real val /**< value to process */
6711 )
6712 {
6713 assert(set != NULL);
6714
6715 return EPSROUND(val, set->num_feastol);
6716 }
6717
6718 /** returns fractional part of value, i.e. x - floor(x) in feasibility tolerance */
6719 SCIP_Real SCIPsetFeasFrac(
6720 SCIP_SET* set, /**< global SCIP settings */
6721 SCIP_Real val /**< value to process */
6722 )
6723 {
6724 assert(set != NULL);
6725
6726 return EPSFRAC(val, set->num_feastol);
6727 }
6728
6729 /** checks, if relative difference of values is in range of dual feasibility tolerance */
6730 SCIP_Bool SCIPsetIsDualfeasEQ(
6731 SCIP_SET* set, /**< global SCIP settings */
6732 SCIP_Real val1, /**< first value to be compared */
6733 SCIP_Real val2 /**< second value to be compared */
6734 )
6735 {
6736 SCIP_Real diff;
6737
6738 assert(set != NULL);
6739
6740 /* avoid to compare two different infinities; the reason for that is
6741 * that such a comparison can lead to unexpected results */
6742 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6743 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6744 || val1 == val2 ); /*lint !e777*/
6745
6746 diff = SCIPrelDiff(val1, val2);
6747
6748 return EPSZ(diff, set->num_dualfeastol);
6749 }
6750
6751 /** checks, if relative difference of val1 and val2 is lower than dual feasibility tolerance */
6752 SCIP_Bool SCIPsetIsDualfeasLT(
6753 SCIP_SET* set, /**< global SCIP settings */
6754 SCIP_Real val1, /**< first value to be compared */
6755 SCIP_Real val2 /**< second value to be compared */
6756 )
6757 {
6758 SCIP_Real diff;
6759
6760 assert(set != NULL);
6761
6762 /* avoid to compare two different infinities; the reason for that is
6763 * that such a comparison can lead to unexpected results */
6764 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6765 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6766 || val1 == val2 ); /*lint !e777*/
6767
6768 diff = SCIPrelDiff(val1, val2);
6769
6770 return EPSN(diff, set->num_dualfeastol);
6771 }
6772
6773 /** checks, if relative difference of val1 and val2 is not greater than dual feasibility tolerance */
6774 SCIP_Bool SCIPsetIsDualfeasLE(
6775 SCIP_SET* set, /**< global SCIP settings */
6776 SCIP_Real val1, /**< first value to be compared */
6777 SCIP_Real val2 /**< second value to be compared */
6778 )
6779 {
6780 SCIP_Real diff;
6781
6782 assert(set != NULL);
6783
6784 /* avoid to compare two different infinities; the reason for that is
6785 * that such a comparison can lead to unexpected results */
6786 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6787 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6788 || val1 == val2 ); /*lint !e777*/
6789
6790 diff = SCIPrelDiff(val1, val2);
6791
6792 return !EPSP(diff, set->num_dualfeastol);
6793 }
6794
6795 /** checks, if relative difference of val1 and val2 is greater than dual feasibility tolerance */
6796 SCIP_Bool SCIPsetIsDualfeasGT(
6797 SCIP_SET* set, /**< global SCIP settings */
6798 SCIP_Real val1, /**< first value to be compared */
6799 SCIP_Real val2 /**< second value to be compared */
6800 )
6801 {
6802 SCIP_Real diff;
6803
6804 assert(set != NULL);
6805
6806 /* avoid to compare two different infinities; the reason for that is
6807 * that such a comparison can lead to unexpected results */
6808 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6809 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6810 || val1 == val2 ); /*lint !e777*/
6811
6812 diff = SCIPrelDiff(val1, val2);
6813
6814 return EPSP(diff, set->num_dualfeastol);
6815 }
6816
6817 /** checks, if relative difference of val1 and val2 is not lower than -dual feasibility tolerance */
6818 SCIP_Bool SCIPsetIsDualfeasGE(
6819 SCIP_SET* set, /**< global SCIP settings */
6820 SCIP_Real val1, /**< first value to be compared */
6821 SCIP_Real val2 /**< second value to be compared */
6822 )
6823 {
6824 SCIP_Real diff;
6825
6826 assert(set != NULL);
6827
6828 /* avoid to compare two different infinities; the reason for that is
6829 * that such a comparison can lead to unexpected results */
6830 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
6831 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
6832 || val1 == val2 ); /*lint !e777*/
6833
6834 diff = SCIPrelDiff(val1, val2);
6835
6836 return !EPSN(diff, set->num_dualfeastol);
6837 }
6838
6839 /** checks, if value is in range feasibility tolerance of 0.0 */
6840 SCIP_Bool SCIPsetIsDualfeasZero(
6841 SCIP_SET* set, /**< global SCIP settings */
6842 SCIP_Real val /**< value to process */
6843 )
6844 {
6845 assert(set != NULL);
6846
6847 return EPSZ(val, set->num_dualfeastol);
6848 }
6849
6850 /** checks, if value is greater than dual feasibility tolerance */
6851 SCIP_Bool SCIPsetIsDualfeasPositive(
6852 SCIP_SET* set, /**< global SCIP settings */
6853 SCIP_Real val /**< value to process */
6854 )
6855 {
6856 assert(set != NULL);
6857
6858 return EPSP(val, set->num_dualfeastol);
6859 }
6860
6861 /** checks, if value is lower than -dual feasibility tolerance */
6862 SCIP_Bool SCIPsetIsDualfeasNegative(
6863 SCIP_SET* set, /**< global SCIP settings */
6864 SCIP_Real val /**< value to process */
6865 )
6866 {
6867 assert(set != NULL);
6868
6869 return EPSN(val, set->num_dualfeastol);
6870 }
6871
6872 /** checks, if value is integral within the dual feasibility bounds */
6873 SCIP_Bool SCIPsetIsDualfeasIntegral(
6874 SCIP_SET* set, /**< global SCIP settings */
6875 SCIP_Real val /**< value to process */
6876 )
6877 {
6878 assert(set != NULL);
6879
6880 return EPSISINT(val, set->num_dualfeastol);
6881 }
6882
6883 /** checks, if given fractional part is smaller than dual feasibility tolerance */
6884 SCIP_Bool SCIPsetIsDualfeasFracIntegral(
6885 SCIP_SET* set, /**< global SCIP settings */
6886 SCIP_Real val /**< value to process */
6887 )
6888 {
6889 assert(set != NULL);
6890 assert(SCIPsetIsGE(set, val, -set->num_dualfeastol));
6891 assert(SCIPsetIsLE(set, val, 1.0+set->num_dualfeastol));
6892
6893 return (val <= set->num_dualfeastol);
6894 }
6895
6896 /** rounds value + dual feasibility tolerance down to the next integer */
6897 SCIP_Real SCIPsetDualfeasFloor(
6898 SCIP_SET* set, /**< global SCIP settings */
6899 SCIP_Real val /**< value to process */
6900 )
6901 {
6902 assert(set != NULL);
6903
6904 return EPSFLOOR(val, set->num_dualfeastol);
6905 }
6906
6907 /** rounds value - dual feasibility tolerance up to the next integer */
6908 SCIP_Real SCIPsetDualfeasCeil(
6909 SCIP_SET* set, /**< global SCIP settings */
6910 SCIP_Real val /**< value to process */
6911 )
6912 {
6913 assert(set != NULL);
6914
6915 return EPSCEIL(val, set->num_dualfeastol);
6916 }
6917
6918 /** rounds value to the nearest integer in dual feasibility tolerance */
6919 SCIP_Real SCIPsetDualfeasRound(
6920 SCIP_SET* set, /**< global SCIP settings */
6921 SCIP_Real val /**< value to process */
6922 )
6923 {
6924 assert(set != NULL);
6925
6926 return EPSROUND(val, set->num_dualfeastol);
6927 }
6928
6929 /** returns fractional part of value, i.e. x - floor(x) in dual feasibility tolerance */
6930 SCIP_Real SCIPsetDualfeasFrac(
6931 SCIP_SET* set, /**< global SCIP settings */
6932 SCIP_Real val /**< value to process */
6933 )
6934 {
6935 assert(set != NULL);
6936
6937 return EPSFRAC(val, set->num_dualfeastol);
6938 }
6939
6940 /** checks, if the given new lower bound is at least min(oldub - oldlb, |oldlb|) times the bound
6941 * strengthening epsilon better than the old one or the change in the lower bound would fix the
6942 * sign of the variable
6943 */
6944 SCIP_Bool SCIPsetIsLbBetter(
6945 SCIP_SET* set, /**< global SCIP settings */
6946 SCIP_Real newlb, /**< new lower bound */
6947 SCIP_Real oldlb, /**< old lower bound */
6948 SCIP_Real oldub /**< old upper bound */
6949 )
6950 {
6951 assert(set != NULL);
6952 assert(SCIPsetIsLE(set, oldlb, oldub));
6953
6954 /* if lower bound is moved to 0 or higher, always accept bound change */
6955 if( oldlb < 0.0 && newlb >= 0.0 )
6956 return TRUE;
6957
6958 return EPSGT(newlb, oldlb, set->num_boundstreps * MAX(MIN(oldub - oldlb, REALABS(oldlb)), 1e-3)); /*lint !e666*/
6959 }
6960
6961 /** checks, if the given new upper bound is at least min(oldub - oldlb, |oldub|) times the bound
6962 * strengthening epsilon better than the old one or the change in the upper bound would fix the
6963 * sign of the variable
6964 */
6965 SCIP_Bool SCIPsetIsUbBetter(
6966 SCIP_SET* set, /**< global SCIP settings */
6967 SCIP_Real newub, /**< new upper bound */
6968 SCIP_Real oldlb, /**< old lower bound */
6969 SCIP_Real oldub /**< old upper bound */
6970 )
6971 {
6972 assert(set != NULL);
6973 assert(SCIPsetIsLE(set, oldlb, oldub));
6974
6975 /* if upper bound is moved to 0 or lower, always accept bound change */
6976 if( oldub > 0.0 && newub <= 0.0 )
6977 return TRUE;
6978
6979 return EPSLT(newub, oldub, set->num_boundstreps * MAX(MIN(oldub - oldlb, REALABS(oldub)), 1e-3)); /*lint !e666*/
6980 }
6981
6982 /** checks, if the given cut's efficacy is larger than the minimal cut efficacy */
6983 SCIP_Bool SCIPsetIsEfficacious(
6984 SCIP_SET* set, /**< global SCIP settings */
6985 SCIP_Bool root, /**< should the root's minimal cut efficacy be used? */
6986 SCIP_Real efficacy /**< efficacy of the cut */
6987 )
6988 {
6989 assert(set != NULL);
6990
6991 if( root )
6992 return EPSP(efficacy, set->sepa_minefficacyroot);
6993 else
6994 return EPSP(efficacy, set->sepa_minefficacy);
6995 }
6996
6997 /** checks, if relative difference of values is in range of epsilon */
6998 SCIP_Bool SCIPsetIsRelEQ(
6999 SCIP_SET* set, /**< global SCIP settings */
7000 SCIP_Real val1, /**< first value to be compared */
7001 SCIP_Real val2 /**< second value to be compared */
7002 )
7003 {
7004 SCIP_Real diff;
7005
7006 assert(set != NULL);
7007
7008 /* avoid to compare two different infinities; the reason for that is
7009 * that such a comparison can lead to unexpected results */
7010 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7011 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7012 || val1 == val2 ); /*lint !e777*/
7013
7014 diff = SCIPrelDiff(val1, val2);
7015
7016 return EPSZ(diff, set->num_epsilon);
7017 }
7018
7019 /** checks, if relative difference of val1 and val2 is lower than epsilon */
7020 SCIP_Bool SCIPsetIsRelLT(
7021 SCIP_SET* set, /**< global SCIP settings */
7022 SCIP_Real val1, /**< first value to be compared */
7023 SCIP_Real val2 /**< second value to be compared */
7024 )
7025 {
7026 SCIP_Real diff;
7027
7028 assert(set != NULL);
7029
7030 /* avoid to compare two different infinities; the reason for that is
7031 * that such a comparison can lead to unexpected results */
7032 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7033 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7034 || val1 == val2 ); /*lint !e777*/
7035
7036 diff = SCIPrelDiff(val1, val2);
7037
7038 return EPSN(diff, set->num_epsilon);
7039 }
7040
7041 /** checks, if relative difference of val1 and val2 is not greater than epsilon */
7042 SCIP_Bool SCIPsetIsRelLE(
7043 SCIP_SET* set, /**< global SCIP settings */
7044 SCIP_Real val1, /**< first value to be compared */
7045 SCIP_Real val2 /**< second value to be compared */
7046 )
7047 {
7048 SCIP_Real diff;
7049
7050 assert(set != NULL);
7051
7052 /* avoid to compare two different infinities; the reason for that is
7053 * that such a comparison can lead to unexpected results */
7054 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7055 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7056 || val1 == val2 ); /*lint !e777*/
7057
7058 diff = SCIPrelDiff(val1, val2);
7059
7060 return !EPSP(diff, set->num_epsilon);
7061 }
7062
7063 /** checks, if relative difference of val1 and val2 is greater than epsilon */
7064 SCIP_Bool SCIPsetIsRelGT(
7065 SCIP_SET* set, /**< global SCIP settings */
7066 SCIP_Real val1, /**< first value to be compared */
7067 SCIP_Real val2 /**< second value to be compared */
7068 )
7069 {
7070 SCIP_Real diff;
7071
7072 assert(set != NULL);
7073
7074 /* avoid to compare two different infinities; the reason for that is
7075 * that such a comparison can lead to unexpected results */
7076 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7077 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7078 || val1 == val2 ); /*lint !e777*/
7079
7080 diff = SCIPrelDiff(val1, val2);
7081
7082 return EPSP(diff, set->num_epsilon);
7083 }
7084
7085 /** checks, if relative difference of val1 and val2 is not lower than -epsilon */
7086 SCIP_Bool SCIPsetIsRelGE(
7087 SCIP_SET* set, /**< global SCIP settings */
7088 SCIP_Real val1, /**< first value to be compared */
7089 SCIP_Real val2 /**< second value to be compared */
7090 )
7091 {
7092 SCIP_Real diff;
7093
7094 assert(set != NULL);
7095
7096 /* avoid to compare two different infinities; the reason for that is
7097 * that such a comparison can lead to unexpected results */
7098 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7099 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7100 || val1 == val2 ); /*lint !e777*/
7101
7102 diff = SCIPrelDiff(val1, val2);
7103
7104 return !EPSN(diff, set->num_epsilon);
7105 }
7106
7107 /** checks, if relative difference of values is in range of sumepsilon */
7108 SCIP_Bool SCIPsetIsSumRelEQ(
7109 SCIP_SET* set, /**< global SCIP settings */
7110 SCIP_Real val1, /**< first value to be compared */
7111 SCIP_Real val2 /**< second value to be compared */
7112 )
7113 {
7114 SCIP_Real diff;
7115
7116 assert(set != NULL);
7117
7118 /* avoid to compare two different infinities; the reason for that is
7119 * that such a comparison can lead to unexpected results */
7120 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7121 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7122 || val1 == val2 ); /*lint !e777*/
7123
7124 diff = SCIPrelDiff(val1, val2);
7125
7126 return EPSZ(diff, set->num_sumepsilon);
7127 }
7128
7129 /** checks, if relative difference of val1 and val2 is lower than sumepsilon */
7130 SCIP_Bool SCIPsetIsSumRelLT(
7131 SCIP_SET* set, /**< global SCIP settings */
7132 SCIP_Real val1, /**< first value to be compared */
7133 SCIP_Real val2 /**< second value to be compared */
7134 )
7135 {
7136 SCIP_Real diff;
7137
7138 assert(set != NULL);
7139
7140 /* avoid to compare two different infinities; the reason for that is
7141 * that such a comparison can lead to unexpected results */
7142 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7143 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7144 || val1 == val2 ); /*lint !e777*/
7145
7146 diff = SCIPrelDiff(val1, val2);
7147
7148 return EPSN(diff, set->num_sumepsilon);
7149 }
7150
7151 /** checks, if relative difference of val1 and val2 is not greater than sumepsilon */
7152 SCIP_Bool SCIPsetIsSumRelLE(
7153 SCIP_SET* set, /**< global SCIP settings */
7154 SCIP_Real val1, /**< first value to be compared */
7155 SCIP_Real val2 /**< second value to be compared */
7156 )
7157 {
7158 SCIP_Real diff;
7159
7160 assert(set != NULL);
7161
7162 /* avoid to compare two different infinities; the reason for that is
7163 * that such a comparison can lead to unexpected results */
7164 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7165 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7166 || val1 == val2 ); /*lint !e777*/
7167
7168 diff = SCIPrelDiff(val1, val2);
7169
7170 return !EPSP(diff, set->num_sumepsilon);
7171 }
7172
7173 /** checks, if relative difference of val1 and val2 is greater than sumepsilon */
7174 SCIP_Bool SCIPsetIsSumRelGT(
7175 SCIP_SET* set, /**< global SCIP settings */
7176 SCIP_Real val1, /**< first value to be compared */
7177 SCIP_Real val2 /**< second value to be compared */
7178 )
7179 {
7180 SCIP_Real diff;
7181
7182 assert(set != NULL);
7183
7184 /* avoid to compare two different infinities; the reason for that is
7185 * that such a comparison can lead to unexpected results */
7186 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7187 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7188 || val1 == val2 ); /*lint !e777*/
7189
7190 diff = SCIPrelDiff(val1, val2);
7191
7192 return EPSP(diff, set->num_sumepsilon);
7193 }
7194
7195 /** checks, if relative difference of val1 and val2 is not lower than -sumepsilon */
7196 SCIP_Bool SCIPsetIsSumRelGE(
7197 SCIP_SET* set, /**< global SCIP settings */
7198 SCIP_Real val1, /**< first value to be compared */
7199 SCIP_Real val2 /**< second value to be compared */
7200 )
7201 {
7202 SCIP_Real diff;
7203
7204 assert(set != NULL);
7205
7206 /* avoid to compare two different infinities; the reason for that is
7207 * that such a comparison can lead to unexpected results */
7208 assert( ((!SCIPsetIsInfinity(set, val1) || !SCIPsetIsInfinity(set, val2))
7209 && (!SCIPsetIsInfinity(set, -val1) || !SCIPsetIsInfinity(set, -val2)))
7210 || val1 == val2 ); /*lint !e777*/
7211
7212 diff = SCIPrelDiff(val1, val2);
7213
7214 return !EPSN(diff, set->num_sumepsilon);
7215 }
7216
7217 /** returns the flag indicating whether sub-SCIPs that could cause recursion have been deactivated */
7218 SCIP_Bool SCIPsetGetSubscipsOff(
7219 SCIP_SET* set /**< global SCIP settings */
7220 )
7221 {
7222 assert(set != NULL);
7223
7224 return set->subscipsoff;
7225 }
7226
7227 /** Checks, if an iteratively updated value is reliable or should be recomputed from scratch.
7228 * This is useful, if the value, e.g., the activity of a linear constraint or the pseudo objective value, gets a high
7229 * absolute value during the optimization process which is later reduced significantly. In this case, the last digits
7230 * were canceled out when increasing the value and are random after decreasing it.
7231 * We dot not consider the cancellations which can occur during increasing the absolute value because they just cannot
7232 * be expressed using fixed precision floating point arithmetic, anymore.
7233 * The idea to get more reliable values is to always store the last reliable value, where increasing the absolute of
7234 * the value is viewed as preserving reliability. Then, after each update, the new absolute value can be compared
7235 * against the last reliable one with this method, checking whether it was decreased by a factor of at least
7236 * "lp/recompfac" and should be recomputed.
7237 */
7238 SCIP_Bool SCIPsetIsUpdateUnreliable(
7239 SCIP_SET* set, /**< global SCIP settings */
7240 SCIP_Real newvalue, /**< new value after update */
7241 SCIP_Real oldvalue /**< old value, i.e., last reliable value */
7242 )
7243 {
7244 SCIP_Real quotient;
7245
7246 assert(set != NULL);
7247
7248 quotient = ABS(oldvalue) / MAX(ABS(newvalue), set->num_epsilon);
7249
7250 return quotient >= set->num_recompfac;
7251 }
7252
7253 /** prints a debug message */
7254 void SCIPsetPrintDebugMessage(
7255 SCIP_SET* set, /**< global SCIP settings */
7256 const char* sourcefile, /**< name of the source file that called the function */
7257 int sourceline, /**< line in the source file where the function was called */
7258 const char* formatstr, /**< format string like in printf() function */
7259 ... /**< format arguments line in printf() function */
7260 )
7261 {
7262 const char* filename;
7263 int subscipdepth = 0;
7264 SCIP* scip;
7265 va_list ap;
7266
7267 assert( sourcefile != NULL );
7268 assert( set != NULL );
7269
7270 scip = set->scip;
7271 assert( scip != NULL );
7272
7273 /* strip directory from filename */
7274 #if defined(_WIN32) || defined(_WIN64)
7275 filename = strrchr(sourcefile, '\\');
7276 #else
7277 filename = strrchr(sourcefile, '/');
7278 #endif
7279 if ( filename == NULL )
7280 filename = sourcefile;
7281 else
7282 ++filename;
7283
7284 if ( scip->stat != NULL )
7285 subscipdepth = scip->stat->subscipdepth;
7286
7287 if ( subscipdepth > 0 )
7288 SCIPmessageFPrintInfo(scip->messagehdlr, NULL, "%d: [%s:%d] debug: ", subscipdepth, filename, sourceline);
7289 else
7290 SCIPmessageFPrintInfo(scip->messagehdlr, NULL, "[%s:%d] debug: ", filename, sourceline);
7291
7292 va_start(ap, formatstr); /*lint !e838*/
7293 SCIPmessageVFPrintInfo(scip->messagehdlr, NULL, formatstr, ap);
7294 va_end(ap);
7295 }
7296
7297 /** prints a debug message without precode */
7298 void SCIPsetDebugMessagePrint(
7299 SCIP_SET* set, /**< global SCIP settings */
7300 const char* formatstr, /**< format string like in printf() function */
7301 ... /**< format arguments line in printf() function */
7302 )
7303 {
7304 va_list ap;
7305
7306 assert( set != NULL );
7307 assert( set->scip != NULL );
7308
7309 va_start(ap, formatstr); /*lint !e838*/
7310 SCIPmessageVFPrintInfo(set->scip->messagehdlr, NULL, formatstr, ap);
7311 va_end(ap);
7312 }
7313
7314 /** modifies an initial seed value with the global shift of random seeds */
7315 unsigned int SCIPsetInitializeRandomSeed(
7316 SCIP_SET* set, /**< global SCIP settings */
7317 unsigned int initialseedvalue /**< initial seed value to be modified */
7318 )
7319 {
7320 assert(set != NULL);
7321
7322 return (unsigned int)(initialseedvalue + (unsigned) set->random_randomseedshift);
7323 }
7324