Scippy

SCIP

Solving Constraint Integer Programs

heur_bound.c
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and library */
4/* SCIP --- Solving Constraint Integer Programs */
5/* */
6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
7/* */
8/* Licensed under the Apache License, Version 2.0 (the "License"); */
9/* you may not use this file except in compliance with the License. */
10/* You may obtain a copy of the License at */
11/* */
12/* http://www.apache.org/licenses/LICENSE-2.0 */
13/* */
14/* Unless required by applicable law or agreed to in writing, software */
15/* distributed under the License is distributed on an "AS IS" BASIS, */
16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17/* See the License for the specific language governing permissions and */
18/* limitations under the License. */
19/* */
20/* You should have received a copy of the Apache-2.0 license */
21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22/* */
23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24
25/**@file heur_bound.c
26 * @ingroup DEFPLUGINS_HEUR
27 * @brief heuristic which fixes all integer variables to a bound (lower/upper) and solves the remaining LP
28 * @author Gerald Gamrath
29 *
30 */
31
32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
33
34#include "scip/heur_bound.h"
35#include "scip/pub_heur.h"
36#include "scip/pub_message.h"
37#include "scip/pub_tree.h"
38#include "scip/pub_var.h"
39#include "scip/scip_branch.h"
41#include "scip/scip_exact.h"
42#include "scip/scip_general.h"
43#include "scip/scip_heur.h"
44#include "scip/scip_lp.h"
45#include "scip/scip_mem.h"
46#include "scip/scip_message.h"
47#include "scip/scip_numerics.h"
48#include "scip/scip_param.h"
49#include "scip/scip_prob.h"
50#include "scip/scip_probing.h"
51#include "scip/scip_sol.h"
53#include "scip/scip_timing.h"
54#include "scip/scip_tree.h"
55#include <string.h>
56
57#ifdef SCIP_STATISTIC
58#include "scip/clock.h"
59#endif
60
61#define HEUR_NAME "bound"
62#define HEUR_DESC "heuristic which fixes all integer variables to a bound and solves the remaining LP"
63#define HEUR_DISPCHAR SCIP_HEURDISPCHAR_PROP
64#define HEUR_PRIORITY -1107000
65#define HEUR_FREQ -1
66#define HEUR_FREQOFS 0
67#define HEUR_MAXDEPTH -1
68#define HEUR_TIMING SCIP_HEURTIMING_BEFORENODE
69#define HEUR_USESSUBSCIP FALSE /**< does the heuristic use a secondary SCIP instance? */
70
71#define DEFAULT_ONLYWITHOUTSOL TRUE /**< Should heuristic only be executed if no primal solution was found, yet? */
72#define DEFAULT_MAXPROPROUNDS 0 /* maximum number of propagation rounds during probing */
73#define DEFAULT_BOUND 'l' /**< to which bound should integer variables be fixed? */
74
75
76/*
77 * Data structures
78 */
79
80/** primal heuristic data */
81struct SCIP_HeurData
82{
83 SCIP_Bool onlywithoutsol; /**< Should heuristic only be executed if no primal solution was found, yet? */
84 int maxproprounds; /**< maximum number of propagation rounds during probing */
85 char bound; /**< to which bound should integer variables be fixed? */
86};
87
88/*
89 * Local methods
90 */
91
92/** main procedure of the bound heuristic */
93static
95 SCIP* scip, /**< original SCIP data structure */
96 SCIP_HEUR* heur, /**< heuristic */
97 SCIP_HEURDATA* heurdata, /**< heuristic data structure */
98 SCIP_Bool lower, /**< should integer variables be fixed to their lower bound? */
99 SCIP_RESULT* result /**< pointer to store the result */
100 )
101{
102 SCIP_VAR** vars = SCIPgetVars(scip);
103 SCIP_VAR* var;
104 SCIP_Bool infeasible = FALSE;
106 int maxproprounds;
107 int v;
108
109 assert(nvars >= 0);
110
111 maxproprounds = heurdata->maxproprounds;
112 if( maxproprounds == -2 )
113 maxproprounds = 0;
114
115 /* stop if we would have infinite fixings */
116 if( lower )
117 {
118 for( v = 0; v < nvars; ++v )
119 {
120 if( SCIPisInfinity(scip, -SCIPvarGetLbLocal(vars[v])) )
121 return SCIP_OKAY;
122 }
123 }
124 else
125 {
126 for( v = 0; v < nvars; ++v )
127 {
128 if( SCIPisInfinity(scip, SCIPvarGetUbLocal(vars[v])) )
129 return SCIP_OKAY;
130 }
131 }
132
133 /* start probing */
135
136 for( v = 0; v < nvars; ++v )
137 {
138 var = vars[v];
140
141 /* skip variables which are already fixed */
142 if( SCIPvarGetLbLocal(var) + 0.5 > SCIPvarGetUbLocal(var) )
143 continue;
144
145 /* fix variable to lower bound */
146 if( lower )
147 {
149 SCIPdebugMsg(scip, "fixing %d: variable <%s> to lower bound <%g> (%d pseudo cands)\n",
151 }
152 /* fix variable to upper bound */
153 else
154 {
156 SCIPdebugMsg(scip, "fixing %d: variable <%s> to upper bound <%g> (%d pseudo cands)\n",
158 }
159
160 /* propagate fixings */
161 if( heurdata->maxproprounds != 0 )
162 {
163 SCIP_CALL( SCIPpropagateProbing(scip, maxproprounds, &infeasible, NULL) );
164 }
165
166 /* todo: try to backtrack */
167 /* stop if infeasible */
168 if( infeasible )
169 break;
170 }
171
172 SCIPdebugMsg(scip, "probing ended with %sfeasible problem\n", infeasible ? "in" : "");
173
174 /*************************** Probing LP Solving ***************************/
175
176 /* solve lp only if the problem is still feasible */
177 if( !infeasible )
178 {
179 char strbuf[SCIP_MAXSTRLEN];
180 SCIP_LPSOLSTAT lpstatus;
181 SCIP_Bool lperror;
182 int ncols;
183
184 /* print message if relatively large LP is solved from scratch, since this could lead to a longer period during
185 * which the user sees no output; more detailed probing stats only in debug mode */
186 ncols = SCIPgetNLPCols(scip);
187 if( !SCIPisLPSolBasic(scip) && ncols > 1000 )
188 {
189 int nunfixedcols = SCIPgetNUnfixedLPCols(scip);
190
191 if( nunfixedcols > 0.5 * ncols )
192 {
194 "Heuristic " HEUR_NAME " solving LP from scratch with %.1f %% unfixed columns (%d of %d) ...\n",
195 100.0 * (nunfixedcols / (SCIP_Real)ncols), nunfixedcols, ncols);
196 }
197 }
198 SCIPdebugMsg(scip, "Heuristic " HEUR_NAME " probing LP: %s\n",
200
201 /* solve LP; errors in the LP solver should not kill the overall solving process, if the LP is just needed for a
202 * heuristic. hence in optimized mode, the return code is caught and a warning is printed, only in debug mode,
203 * SCIP will stop.
204 */
205 SCIPdebugMsg(scip, "starting solving bound-heur LP at time %g, LP iterations: %" SCIP_LONGINT_FORMAT "\n",
207#ifdef NDEBUG
208 {
209 SCIP_Bool retstat;
210 retstat = SCIPsolveProbingLP(scip, -1, &lperror, NULL);
211 if( retstat != SCIP_OKAY )
212 {
213 SCIPwarningMessage(scip, "Error while solving LP in bound heuristic; LP solve terminated with code <%d>\n",
214 retstat);
215 }
216 }
217#else
218 SCIP_CALL( SCIPsolveProbingLP(scip, -1, &lperror, NULL) );
219#endif
220 SCIPdebugMsg(scip, "ending solving bound-heur LP at time %g\n", SCIPgetSolvingTime(scip));
221
222 lpstatus = SCIPgetLPSolstat(scip);
223
224 SCIPdebugMsg(scip, " -> new LP iterations: %" SCIP_LONGINT_FORMAT "\n", SCIPgetNLPIterations(scip));
225 SCIPdebugMsg(scip, " -> error=%u, status=%d\n", lperror, lpstatus);
226
227 /* check if this is a feasible solution */
228 if( lpstatus == SCIP_LPSOLSTAT_OPTIMAL && !lperror )
229 {
230 SCIP_SOL* newsol;
231 SCIP_Bool stored;
232 SCIP_Bool success;
233
234 /* create temporary solution */
235 SCIP_CALL( SCIPcreateSol(scip, &newsol, heur) );
236
237 /* copy the current LP solution to the working solution */
238 SCIP_CALL( SCIPlinkLPSol(scip, newsol) );
239
240 SCIP_CALL( SCIProundSol(scip, newsol, &success) );
241
242 if( success )
243 {
244 SCIPdebugMsg(scip, "bound heuristic found roundable primal solution: obj=%g\n",
245 SCIPgetSolOrigObj(scip, newsol));
246
247 /* check solution for feasibility, and add it to solution store if possible.
248 * Neither integrality nor feasibility of LP rows have to be checked, because they
249 * are guaranteed by the heuristic at this stage.
250 */
251#ifdef SCIP_DEBUG
252 SCIP_CALL( SCIPtrySol(scip, newsol, TRUE, TRUE, TRUE, TRUE, TRUE, &stored) );
253#else
254 SCIP_CALL( SCIPtrySol(scip, newsol, FALSE, FALSE, TRUE, FALSE, FALSE, &stored) );
255#endif
256
257 if( stored )
258 {
259 SCIPdebugMsg(scip, "found feasible solution:\n");
260 *result = SCIP_FOUNDSOL;
261 }
262 }
263
264 /* free solution */
265 SCIP_CALL( SCIPfreeSol(scip, &newsol) );
266 }
267 }
268
269 /* exit probing mode */
271
272 return SCIP_OKAY;
273}
274
275
276/*
277 * Callback methods of primal heuristic
278 */
279
280/** copy method for primal heuristic plugins (called when SCIP copies plugins) */
281static
282SCIP_DECL_HEURCOPY(heurCopyBound)
283{ /*lint --e{715}*/
284 assert(scip != NULL);
285 assert(heur != NULL);
286 assert(strcmp(SCIPheurGetName(heur), HEUR_NAME) == 0);
287
288 /* call inclusion method of heuristic */
290
291 return SCIP_OKAY;
292}
293
294/** destructor of primal heuristic to free user data (called when SCIP is exiting) */
295static
296SCIP_DECL_HEURFREE(heurFreeBound)
297{ /*lint --e{715}*/
298 SCIP_HEURDATA* heurdata;
299
300 /* free heuristic data */
301 heurdata = SCIPheurGetData(heur);
302
303 SCIPfreeBlockMemory(scip, &heurdata);
304 SCIPheurSetData(heur, NULL);
305
306 return SCIP_OKAY;
307}
308
309/** execution method of primal heuristic */
310static
311SCIP_DECL_HEUREXEC(heurExecBound)
312{ /*lint --e{715}*/
313 SCIP_HEURDATA* heurdata;
314
315 assert(heur != NULL);
316 assert(scip != NULL);
317 assert(result != NULL);
318
319 *result = SCIP_DIDNOTRUN;
320
322 return SCIP_OKAY;
323
325 return SCIP_OKAY;
326
327 heurdata = SCIPheurGetData(heur);
328 assert(heurdata != NULL);
329
330 *result = SCIP_DIDNOTFIND;
331
332 if( SCIPisStopped(scip) )
333 return SCIP_OKAY;
334
335 /* stop execution method if there is already a primal feasible solution at hand */
336 if( SCIPgetBestSol(scip) != NULL && heurdata->onlywithoutsol )
337 return SCIP_OKAY;
338
339 SCIPdebugMsg(scip, "apply bound heuristic at node %lld\n",
341
343 {
344 SCIP_Bool cutoff;
345
346 SCIP_CALL( SCIPconstructLP(scip, &cutoff) );
347
348 /* manually cut off the node if the LP construction detected infeasibility (heuristics cannot return such a
349 * result); the cutoff result is safe to use in exact solving mode, but we don't have enough information to
350 * give a certificate for the cutoff
351 */
352 if( cutoff && !SCIPisCertified(scip) )
353 {
355 return SCIP_OKAY;
356 }
357
359 }
360
361 if( heurdata->bound == 'l' || heurdata->bound == 'b' )
362 {
363 SCIP_CALL( applyBoundHeur(scip, heur, heurdata, TRUE, result) );
364 }
365 if( heurdata->bound == 'u' || heurdata->bound == 'b' )
366 {
367 SCIP_CALL( applyBoundHeur(scip, heur, heurdata, FALSE, result) );
368 }
369
370 return SCIP_OKAY;
371}
372
373/*
374 * primal heuristic specific interface methods
375 */
376
377/** creates the bound primal heuristic and includes it in SCIP */
379 SCIP* scip /**< SCIP data structure */
380 )
381{
382 SCIP_HEURDATA* heurdata;
383 SCIP_HEUR* heur;
384
385 /* create bound primal heuristic data */
386 SCIP_CALL( SCIPallocBlockMemory(scip, &heurdata) );
387
388 /* include primal heuristic */
391 HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecBound, heurdata) );
392
393 assert(heur != NULL);
394
395 /* primal heuristic is safe to use in exact solving mode */
396 SCIPheurMarkExact(heur);
397
398 /* set non-NULL pointers to callback methods */
399 SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyBound) );
400 SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeBound) );
401
402 /* add bound heuristic parameters */
403
404 SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/" HEUR_NAME "/onlywithoutsol",
405 "Should heuristic only be executed if no primal solution was found, yet?",
406 &heurdata->onlywithoutsol, TRUE, DEFAULT_ONLYWITHOUTSOL, NULL, NULL) );
407
408 SCIP_CALL( SCIPaddIntParam(scip, "heuristics/" HEUR_NAME "/maxproprounds",
409 "maximum number of propagation rounds during probing (-1 infinity, -2 parameter settings)",
410 &heurdata->maxproprounds, TRUE, DEFAULT_MAXPROPROUNDS, -1, INT_MAX/4, NULL, NULL) );
411
412 SCIP_CALL( SCIPaddCharParam(scip, "heuristics/" HEUR_NAME "/bound",
413 "to which bound should integer variables be fixed? ('l'ower, 'u'pper, or 'b'oth)",
414 &heurdata->bound, FALSE, DEFAULT_BOUND, "lub", NULL, NULL) );
415
416 return SCIP_OKAY;
417}
static long bound
internal methods for clocks and timing issues
#define NULL
Definition: def.h:248
#define SCIP_MAXSTRLEN
Definition: def.h:269
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:156
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define SCIP_LONGINT_FORMAT
Definition: def.h:148
#define SCIP_CALL(x)
Definition: def.h:355
SCIP_Bool SCIPisStopped(SCIP *scip)
Definition: scip_general.c:759
int SCIPgetNContVars(SCIP *scip)
Definition: scip_prob.c:2569
int SCIPgetNVars(SCIP *scip)
Definition: scip_prob.c:2246
SCIP_VAR ** SCIPgetVars(SCIP *scip)
Definition: scip_prob.c:2201
int SCIPgetNContImplVars(SCIP *scip)
Definition: scip_prob.c:2522
void SCIPverbMessage(SCIP *scip, SCIP_VERBLEVEL msgverblevel, FILE *file, const char *formatstr,...)
Definition: scip_message.c:225
#define SCIPdebugMsg
Definition: scip_message.h:78
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
Definition: scip_message.c:120
SCIP_RETCODE SCIPaddCharParam(SCIP *scip, const char *name, const char *desc, char *valueptr, SCIP_Bool isadvanced, char defaultvalue, const char *allowedvalues, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: scip_param.c:167
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: scip_param.c:83
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition: scip_param.c:57
SCIP_RETCODE SCIPincludeHeurBound(SCIP *scip)
Definition: heur_bound.c:378
int SCIPgetNPseudoBranchCands(SCIP *scip)
Definition: scip_branch.c:766
SCIP_Bool SCIPisCertified(SCIP *scip)
SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURCOPY((*heurcopy)))
Definition: scip_heur.c:167
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
Definition: heur.c:1368
SCIP_RETCODE SCIPincludeHeurBasic(SCIP *scip, SCIP_HEUR **heur, const char *name, const char *desc, char dispchar, int priority, int freq, int freqofs, int maxdepth, SCIP_HEURTIMING timingmask, SCIP_Bool usessubscip, SCIP_DECL_HEUREXEC((*heurexec)), SCIP_HEURDATA *heurdata)
Definition: scip_heur.c:122
SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURFREE((*heurfree)))
Definition: scip_heur.c:183
void SCIPheurMarkExact(SCIP_HEUR *heur)
Definition: heur.c:1457
const char * SCIPheurGetName(SCIP_HEUR *heur)
Definition: heur.c:1467
void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
Definition: heur.c:1378
SCIP_RETCODE SCIPflushLP(SCIP *scip)
Definition: scip_lp.c:154
SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
Definition: scip_lp.c:87
SCIP_RETCODE SCIPconstructLP(SCIP *scip, SCIP_Bool *cutoff)
Definition: scip_lp.c:130
SCIP_Bool SCIPisLPConstructed(SCIP *scip)
Definition: scip_lp.c:105
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
Definition: scip_lp.c:174
int SCIPgetNUnfixedLPCols(SCIP *scip)
Definition: scip_lp.c:554
int SCIPgetNLPCols(SCIP *scip)
Definition: scip_lp.c:533
SCIP_Bool SCIPisLPSolBasic(SCIP *scip)
Definition: scip_lp.c:673
#define SCIPfreeBlockMemory(scip, ptr)
Definition: scip_mem.h:108
#define SCIPallocBlockMemory(scip, ptr)
Definition: scip_mem.h:89
SCIP_Longint SCIPnodeGetNumber(SCIP_NODE *node)
Definition: tree.c:8483
char * SCIPsnprintfProbingStats(SCIP *scip, char *strbuf, int len)
SCIP_RETCODE SCIPpropagateProbing(SCIP *scip, int maxproprounds, SCIP_Bool *cutoff, SCIP_Longint *ndomredsfound)
Definition: scip_probing.c:581
SCIP_RETCODE SCIPstartProbing(SCIP *scip)
Definition: scip_probing.c:120
SCIP_RETCODE SCIPsolveProbingLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
Definition: scip_probing.c:825
SCIP_RETCODE SCIPfixVarProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real fixedval)
Definition: scip_probing.c:419
SCIP_RETCODE SCIPendProbing(SCIP *scip)
Definition: scip_probing.c:261
SCIP_SOL * SCIPgetBestSol(SCIP *scip)
Definition: scip_sol.c:2981
SCIP_RETCODE SCIPcreateSol(SCIP *scip, SCIP_SOL **sol, SCIP_HEUR *heur)
Definition: scip_sol.c:516
SCIP_RETCODE SCIPfreeSol(SCIP *scip, SCIP_SOL **sol)
Definition: scip_sol.c:1252
SCIP_RETCODE SCIProundSol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool *success)
Definition: scip_sol.c:3123
SCIP_RETCODE SCIPtrySol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
Definition: scip_sol.c:4012
SCIP_RETCODE SCIPlinkLPSol(SCIP *scip, SCIP_SOL *sol)
Definition: scip_sol.c:1295
SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
Definition: scip_sol.c:1892
SCIP_Longint SCIPgetNLPIterations(SCIP *scip)
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
Definition: scip_timing.c:378
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPcutoffNode(SCIP *scip, SCIP_NODE *node)
Definition: scip_tree.c:436
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
Definition: scip_tree.c:91
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
Definition: var.c:24268
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
Definition: var.c:23453
const char * SCIPvarGetName(SCIP_VAR *var)
Definition: var.c:23267
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
Definition: var.c:24234
#define DEFAULT_ONLYWITHOUTSOL
Definition: heur_bound.c:71
#define HEUR_TIMING
Definition: heur_bound.c:68
#define HEUR_FREQOFS
Definition: heur_bound.c:66
#define HEUR_DESC
Definition: heur_bound.c:62
static SCIP_DECL_HEURCOPY(heurCopyBound)
Definition: heur_bound.c:282
#define HEUR_DISPCHAR
Definition: heur_bound.c:63
#define HEUR_MAXDEPTH
Definition: heur_bound.c:67
#define HEUR_PRIORITY
Definition: heur_bound.c:64
static SCIP_DECL_HEUREXEC(heurExecBound)
Definition: heur_bound.c:311
static SCIP_RETCODE applyBoundHeur(SCIP *scip, SCIP_HEUR *heur, SCIP_HEURDATA *heurdata, SCIP_Bool lower, SCIP_RESULT *result)
Definition: heur_bound.c:94
#define HEUR_NAME
Definition: heur_bound.c:61
static SCIP_DECL_HEURFREE(heurFreeBound)
Definition: heur_bound.c:296
#define DEFAULT_BOUND
Definition: heur_bound.c:73
#define HEUR_FREQ
Definition: heur_bound.c:65
#define HEUR_USESSUBSCIP
Definition: heur_bound.c:69
#define DEFAULT_MAXPROPROUNDS
Definition: heur_bound.c:72
heuristic which fixes all integer variables to a bound (lower/upper) and solves the remaining LP
public methods for primal heuristics
public methods for message output
public methods for branch and bound tree
public methods for problem variables
public methods for branching rule plugins and branching
public methods for certified solving
public methods for exact solving
general public methods
public methods for primal heuristic plugins and divesets
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for the probing mode
public methods for solutions
public methods for querying solving statistics
public methods for timing
public methods for the branch-and-bound tree
struct SCIP_HeurData SCIP_HEURDATA
Definition: type_heur.h:77
enum SCIP_LPSolStat SCIP_LPSOLSTAT
Definition: type_lp.h:52
@ SCIP_LPSOLSTAT_OPTIMAL
Definition: type_lp.h:44
@ SCIP_VERBLEVEL_FULL
Definition: type_message.h:62
@ SCIP_DIDNOTRUN
Definition: type_result.h:42
@ SCIP_DIDNOTFIND
Definition: type_result.h:44
@ SCIP_FOUNDSOL
Definition: type_result.h:56
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:61
@ SCIP_OKAY
Definition: type_retcode.h:42
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
@ SCIP_VARTYPE_CONTINUOUS
Definition: type_var.h:71