Scippy

GCG

Branch-and-Price & Column Generation for Everyone

solver.c
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program */
4 /* GCG --- Generic Column Generation */
5 /* a Dantzig-Wolfe decomposition based extension */
6 /* of the branch-cut-and-price framework */
7 /* SCIP --- Solving Constraint Integer Programs */
8 /* */
9 /* Copyright (C) 2010-2021 Operations Research, RWTH Aachen University */
10 /* Zuse Institute Berlin (ZIB) */
11 /* */
12 /* This program is free software; you can redistribute it and/or */
13 /* modify it under the terms of the GNU Lesser General Public License */
14 /* as published by the Free Software Foundation; either version 3 */
15 /* of the License, or (at your option) any later version. */
16 /* */
17 /* This program is distributed in the hope that it will be useful, */
18 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
19 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
20 /* GNU Lesser General Public License for more details. */
21 /* */
22 /* You should have received a copy of the GNU Lesser General Public License */
23 /* along with this program; if not, write to the Free Software */
24 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.*/
25 /* */
26 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
27 
28 /**@file solver.c
29  * @brief methods for GCG pricing solvers
30  * @author Henri Lotze
31  * @author Christian Puchert
32  */
33 
34 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
35 
36 #include "pub_solver.h"
37 #include "solver.h"
38 #include "struct_solver.h"
39 
40 #include "gcg.h"
41 #include "pricer_gcg.h"
42 
43 #include <string.h>
44 
45 
46 /** compares two solvers w. r. t. their priorities */
47 SCIP_DECL_SORTPTRCOMP(GCGsolverComp)
48 { /*lint --e{715}*/
49  GCG_SOLVER* solver1 = (GCG_SOLVER*) elem1;
50  GCG_SOLVER* solver2 = (GCG_SOLVER*) elem2;
51 
52  assert(solver1 != NULL);
53  assert(solver2 != NULL);
54 
55  return solver2->priority - solver1->priority; /* prefer higher priorities */
56 }
57 
58 /** creates a GCG pricing solver */
59 SCIP_RETCODE GCGsolverCreate(
60  SCIP* scip, /**< SCIP data structure (master problem) */
61  GCG_SOLVER** solver, /**< pointer to pricing solver data structure */
62  const char* name, /**< name of solver */
63  const char* desc, /**< description of solver */
64  int priority, /**< priority of solver */
65  SCIP_Bool heurenabled, /**< flag to indicate whether heuristic solving method of the solver is enabled */
66  SCIP_Bool exactenabled, /**< flag to indicate whether exact solving method of the solver is enabled */
67  GCG_DECL_SOLVERUPDATE((*solverupdate)), /**< update method for solver */
68  GCG_DECL_SOLVERSOLVE ((*solversolve)), /**< solving method for solver */
69  GCG_DECL_SOLVERSOLVEHEUR((*solveheur)), /**< heuristic solving method for solver */
70  GCG_DECL_SOLVERFREE ((*solverfree)), /**< free method of solver */
71  GCG_DECL_SOLVERINIT ((*solverinit)), /**< init method of solver */
72  GCG_DECL_SOLVEREXIT ((*solverexit)), /**< exit method of solver */
73  GCG_DECL_SOLVERINITSOL((*solverinitsol)), /**< initsol method of solver */
74  GCG_DECL_SOLVEREXITSOL((*solverexitsol)), /**< exitsol method of solver */
75  GCG_SOLVERDATA* solverdata /**< pricing solver data */
76  )
77 {
78  char paramname[SCIP_MAXSTRLEN];
79  char paramdesc[SCIP_MAXSTRLEN];
80 
81  assert(scip != NULL);
82  assert(solver != NULL);
83 
84  if( solveheur == NULL && solversolve == NULL )
85  {
86  SCIPwarningMessage(scip, "Solver <%s> has neither heuristic nor exact solving method and will not be included.\n", name);
87  return SCIP_OKAY;
88  }
89 
90  SCIP_CALL( SCIPallocMemory(scip, solver) ); /*lint !e866*/
91 
92  SCIP_ALLOC( BMSduplicateMemoryArray(&(*solver)->name, name, strlen(name)+1) );
93  SCIP_ALLOC( BMSduplicateMemoryArray(&(*solver)->desc, desc, strlen(desc)+1) );
94 
95  (*solver)->solverupdate = solverupdate;
96  (*solver)->solversolve = solversolve;
97  (*solver)->solversolveheur = solveheur;
98  (*solver)->solverfree = solverfree;
99  (*solver)->solverinit = solverinit;
100  (*solver)->solverexit = solverexit;
101  (*solver)->solverinitsol = solverinitsol;
102  (*solver)->solverexitsol = solverexitsol;
103  (*solver)->solverdata = solverdata;
104 
105  SCIP_CALL( SCIPcreateCPUClock(scip, &((*solver)->optfarkasclock)) );
106  SCIP_CALL( SCIPcreateCPUClock(scip, &((*solver)->optredcostclock)) );
107  SCIP_CALL( SCIPcreateCPUClock(scip, &((*solver)->heurfarkasclock)) );
108  SCIP_CALL( SCIPcreateCPUClock(scip, &((*solver)->heurredcostclock)) );
109 
110  (*solver)->optfarkascalls = 0;
111  (*solver)->optredcostcalls = 0;
112  (*solver)->heurfarkascalls = 0;
113  (*solver)->heurredcostcalls = 0;
114 
115  if( solveheur != NULL )
116  {
117  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "pricingsolver/%s/heurenabled", name);
118  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "flag to indicate whether heuristic solving method of solver <%s> is enabled", name);
119  SCIP_CALL( SCIPaddBoolParam(GCGmasterGetOrigprob(scip), paramname, paramdesc,
120  &((*solver)->heurenabled), FALSE, heurenabled, NULL, NULL));
121  }
122  else
123  (*solver)->heurenabled = FALSE;
124 
125  if( solversolve != NULL )
126  {
127  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "pricingsolver/%s/exactenabled", name);
128  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "flag to indicate whether exact solving method of solver <%s> is enabled", name);
129  SCIP_CALL( SCIPaddBoolParam(GCGmasterGetOrigprob(scip), paramname, paramdesc,
130  &((*solver)->exactenabled), FALSE, exactenabled, NULL, NULL));
131  }
132  else
133  (*solver)->exactenabled = FALSE;
134 
135  (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "pricingsolver/%s/priority", name);
136  (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "priority of solver <%s>", name);
137  SCIP_CALL( SCIPaddIntParam(GCGmasterGetOrigprob(scip), paramname, paramdesc,
138  &((*solver)->priority), FALSE, priority, INT_MIN/4, INT_MAX/4, NULL, NULL));
139 
140  return SCIP_OKAY;
141 }
142 
143 /** calls destructor and frees memory of GCG pricing solver */
144 SCIP_RETCODE GCGsolverFree(
145  SCIP* scip, /**< SCIP data structure (master problem) */
146  GCG_SOLVER** solver /**< pointer to pricing solver data structure */
147  )
148 {
149  assert(scip != NULL);
150  assert(solver != NULL);
151  assert(*solver != NULL);
152 
153  if( (*solver)->solverfree != NULL )
154  {
155  SCIP_CALL( (*solver)->solverfree(scip, *solver) );
156  }
157 
158  BMSfreeMemoryArray(&(*solver)->name);
159  BMSfreeMemoryArray(&(*solver)->desc);
160 
161  SCIP_CALL( SCIPfreeClock(scip, &((*solver)->optfarkasclock)) );
162  SCIP_CALL( SCIPfreeClock(scip, &((*solver)->optredcostclock)) );
163  SCIP_CALL( SCIPfreeClock(scip, &((*solver)->heurfarkasclock)) );
164  SCIP_CALL( SCIPfreeClock(scip, &((*solver)->heurredcostclock)) );
165 
166  SCIPfreeMemory(scip, solver);
167 
168  return SCIP_OKAY;
169 }
170 
171 /** initializes GCG pricing solver */
172 SCIP_RETCODE GCGsolverInit(
173  SCIP* scip, /**< SCIP data structure (master problem) */
174  GCG_SOLVER* solver /**< pricing solver */
175  )
176 {
177  SCIP_Bool resetstat;
178 
179  assert(scip != NULL);
180  assert(solver != NULL);
181 
182  SCIP_CALL( SCIPgetBoolParam(scip, "misc/resetstat", &resetstat) );
183 
184  if( resetstat )
185  {
186  SCIP_CALL( SCIPresetClock(scip, solver->optfarkasclock) );
187  SCIP_CALL( SCIPresetClock(scip, solver->optredcostclock) );
188  SCIP_CALL( SCIPresetClock(scip, solver->heurfarkasclock) );
189  SCIP_CALL( SCIPresetClock(scip, solver->heurredcostclock) );
190 
191  solver->optfarkascalls = 0;
192  solver->optredcostcalls = 0;
193  solver->heurfarkascalls = 0;
194  solver->heurredcostcalls = 0;
195  }
196 
197  if( solver->solverinit != NULL )
198  {
199  SCIP_CALL( solver->solverinit(scip, solver) );
200  }
201 
202  return SCIP_OKAY;
203 }
204 
205 /** calls exit method of GCG pricing solver */
206 SCIP_RETCODE GCGsolverExit(
207  SCIP* scip, /**< SCIP data structure (master problem) */
208  GCG_SOLVER* solver /**< pricing solver */
209  )
210 {
211  assert(scip != NULL);
212  assert(solver != NULL);
213 
214  if( solver->solverexit != NULL )
215  {
216  SCIP_CALL( solver->solverexit(scip, solver) );
217  }
218 
219  return SCIP_OKAY;
220 }
221 
222 /** calls solving process initialization method of GCG pricing solver */
223 SCIP_RETCODE GCGsolverInitsol(
224  SCIP* scip, /**< SCIP data structure (master problem) */
225  GCG_SOLVER* solver /**< pricing solver */
226  )
227 {
228  assert(scip != NULL);
229  assert(solver != NULL);
230 
231  if( solver->solverinitsol != NULL )
232  {
233  SCIP_CALL( solver->solverinitsol(scip, solver) );
234  }
235 
236  return SCIP_OKAY;
237 }
238 
239 /** calls solving process deinitialization method of GCG pricing solver */
240 SCIP_RETCODE GCGsolverExitsol(
241  SCIP* scip, /**< SCIP data structure (master problem) */
242  GCG_SOLVER* solver /**< pricing solver */
243  )
244 {
245  assert(scip != NULL);
246  assert(solver != NULL);
247 
248  if( solver->solverexitsol != NULL )
249  {
250  SCIP_CALL( solver->solverexitsol(scip, solver) );
251  }
252 
253  return SCIP_OKAY;
254 }
255 
256 /** calls update method of GCG pricing solver */
257 SCIP_RETCODE GCGsolverUpdate(
258  SCIP* pricingprob, /**< the pricing problem that should be solved */
259  GCG_SOLVER* solver, /**< pricing solver */
260  int probnr, /**< number of the pricing problem */
261  SCIP_Bool varobjschanged, /**< have the objective coefficients changed? */
262  SCIP_Bool varbndschanged, /**< have the lower and upper bounds changed? */
263  SCIP_Bool consschanged /**< have the constraints changed? */
264  )
265 {
266  assert(pricingprob != NULL);
267  assert(solver != NULL);
268 
269  if( solver->solverupdate != NULL )
270  {
271  SCIP_CALL( solver->solverupdate(pricingprob, solver, probnr, varobjschanged, varbndschanged, consschanged) );
272  }
273 
274  return SCIP_OKAY;
275 }
276 
277 /** calls heuristic or exact solving method of GCG pricing solver
278  * @note This method has to be threadsafe!
279  */
280 SCIP_RETCODE GCGsolverSolve(
281  SCIP* scip, /**< SCIP data structure (master problem) */
282  SCIP* pricingprob, /**< the pricing problem that should be solved */
283  GCG_SOLVER* solver, /**< pricing solver */
284  SCIP_Bool redcost, /**< is reduced cost (TRUE) or Farkas (FALSE) pricing performed? */
285  SCIP_Bool heuristic, /**< shall the pricing problem be solved heuristically? */
286  int probnr, /**< number of the pricing problem */
287  SCIP_Real dualsolconv, /**< dual solution of the corresponding convexity constraint */
288  SCIP_Real* lowerbound, /**< pointer to store lower bound of pricing problem */
289  GCG_PRICINGSTATUS* status, /**< pointer to store the returned pricing status */
290  SCIP_Bool* solved /**< pointer to store whether the solution method was called */
291  )
292 {
293  SCIP_CLOCK* clock;
294 
295  assert(scip != NULL);
296  assert(pricingprob != NULL);
297  assert(solver != NULL);
298  assert(lowerbound != NULL);
299  assert(status != NULL);
300 
301  *solved = FALSE;
302 
303  if( heuristic )
304  {
305  if( solver->heurenabled )
306  {
307  assert(solver->solversolveheur != NULL);
308 
309  if( redcost )
310  clock = solver->heurredcostclock;
311  else
312  clock = solver->heurfarkasclock;
313 
314  #pragma omp critical (clock)
315  {
316  SCIP_CALL_ABORT( SCIPstartClock(scip, clock) );
317  }
318 
319  SCIP_CALL( solver->solversolveheur(scip, pricingprob, solver, probnr, dualsolconv, lowerbound, status) );
320  *solved = TRUE;
321 
322  #pragma omp critical (clock)
323  {
324  SCIP_CALL_ABORT( SCIPstopClock(scip, clock) );
325  }
326  }
327  }
328  else
329  {
330  if( solver->exactenabled )
331  {
332  assert(solver->solversolve != NULL);
333 
334  if( redcost )
335  clock = solver->optredcostclock;
336  else
337  clock = solver->optfarkasclock;
338 
339  #pragma omp critical (clock)
340  {
341  SCIP_CALL_ABORT( SCIPstartClock(scip, clock) );
342  }
343 
344  SCIP_CALL( solver->solversolve(scip, pricingprob, solver, probnr, dualsolconv, lowerbound, status) );
345  *solved = TRUE;
346 
347  #pragma omp critical (clock)
348  {
349  SCIP_CALL_ABORT( SCIPstopClock(scip, clock) );
350  }
351 
352  }
353  }
354 
355  if( *status != GCG_PRICINGSTATUS_NOTAPPLICABLE && *solved )
356  {
357  if( redcost )
358  if( heuristic )
359  #pragma omp atomic
360  ++solver->heurredcostcalls;
361  else
362  #pragma omp atomic
363  ++solver->optredcostcalls;
364  else
365  if( heuristic )
366  #pragma omp atomic
367  ++solver->heurfarkascalls;
368  else
369  #pragma omp atomic
370  ++solver->optfarkascalls;
371  }
372 
373  return SCIP_OKAY;
374 }
375 
376 /** gets user data of GCG pricing solver */
378  GCG_SOLVER* solver /**< pricing solver */
379  )
380 {
381  assert(solver != NULL);
382 
383  return solver->solverdata;
384 }
385 
386 /** sets user data of GCG pricing solver */
388  GCG_SOLVER* solver, /**< pricing solver */
389  GCG_SOLVERDATA* solverdata /**< pricing solver data */
390  )
391 {
392  assert(solver != NULL);
393 
394  solver->solverdata = solverdata;
395 }
396 
397 /** gets name of GCG pricing solver */
398 const char* GCGsolverGetName(
399  GCG_SOLVER* solver /**< pricing solver */
400  )
401 {
402  assert(solver != NULL);
403 
404  return solver->name;
405 }
406 
407 /** gets description of GCG pricing solver */
408 const char* GCGsolverGetDesc(
409  GCG_SOLVER* solver /**< pricing solver */
410  )
411 {
412  assert(solver != NULL);
413 
414  return solver->desc;
415 }
416 
417 /** gets priority of GCG pricing solver */
419  GCG_SOLVER* solver /**< pricing solver */
420  )
421 {
422  assert(solver != NULL);
423 
424  return solver->priority;
425 }
426 
427 /** gets whether heuristic solving method of GCG pricing solver is enabled */
429  GCG_SOLVER* solver /**< pricing solver */
430  )
431 {
432  assert(solver != NULL);
433 
434  return solver->heurenabled;
435 }
436 
437 /** gets whether exact solving method of GCG pricing solver is enabled */
439  GCG_SOLVER* solver /**< pricing solver */
440  )
441 {
442  assert(solver != NULL);
443 
444  return solver->exactenabled;
445 }
446 
447 /** gets number of exact Farkas pricing calls of pricing solver */
449  GCG_SOLVER* solver /**< pricing solver */
450  )
451 {
452  assert(solver != NULL);
453 
454  return solver->optfarkascalls;
455 }
456 
457 /** gets number of exact reduced cost pricing calls of pricing solver */
459  GCG_SOLVER* solver /**< pricing solver */
460  )
461 {
462  assert(solver != NULL);
463 
464  return solver->optredcostcalls;
465 }
466 
467 /** gets number of heuristic Farkas pricing calls of pricing solver */
469  GCG_SOLVER* solver /**< pricing solver */
470  )
471 {
472  assert(solver != NULL);
473 
474  return solver->heurfarkascalls;
475 }
476 
477 /** gets number of heuristic reduced cost pricing calls of pricing solver */
479  GCG_SOLVER* solver /**< pricing solver */
480  )
481 {
482  assert(solver != NULL);
483 
484  return solver->heurredcostcalls;
485 }
486 
487 /** gets exact Farkas pricing time of pricing solver */
489  SCIP* scip, /**< SCIP data structure (master problem) */
490  GCG_SOLVER* solver /**< pricing solver */
491  )
492 {
493  assert(scip != NULL);
494  assert(solver != NULL);
495 
496  return SCIPgetClockTime(scip, solver->optfarkasclock);
497 }
498 
499 /** gets exact reduced cost pricing time of pricing solver */
501  SCIP* scip, /**< SCIP data structure (master problem) */
502  GCG_SOLVER* solver /**< pricing solver */
503  )
504 {
505  assert(scip != NULL);
506  assert(solver != NULL);
507 
508  return SCIPgetClockTime(scip, solver->optredcostclock);
509 }
510 
511 /** gets heuristic Farkas pricing time of pricing solver */
513  SCIP* scip, /**< SCIP data structure (master problem) */
514  GCG_SOLVER* solver /**< pricing solver */
515  )
516 {
517  assert(scip != NULL);
518  assert(solver != NULL);
519 
520  return SCIPgetClockTime(scip, solver->heurfarkasclock);
521 }
522 
523 /** gets heuristic reduced cost pricing time of pricing solver */
525  SCIP* scip, /**< SCIP data structure (master problem) */
526  GCG_SOLVER* solver /**< pricing solver */
527  )
528 {
529  assert(scip != NULL);
530  assert(solver != NULL);
531 
532  return SCIPgetClockTime(scip, solver->heurredcostclock);
533 }
SCIP_RETCODE GCGsolverCreate(SCIP *scip, GCG_SOLVER **solver, const char *name, const char *desc, int priority, SCIP_Bool heurenabled, SCIP_Bool exactenabled, GCG_DECL_SOLVERUPDATE((*solverupdate)), GCG_DECL_SOLVERSOLVE((*solversolve)), GCG_DECL_SOLVERSOLVEHEUR((*solveheur)), GCG_DECL_SOLVERFREE((*solverfree)), GCG_DECL_SOLVERINIT((*solverinit)), GCG_DECL_SOLVEREXIT((*solverexit)), GCG_DECL_SOLVERINITSOL((*solverinitsol)), GCG_DECL_SOLVEREXITSOL((*solverexitsol)), GCG_SOLVERDATA *solverdata)
Definition: solver.c:59
public methods for GCG pricing solvers
SCIP_Bool GCGsolverIsExactEnabled(GCG_SOLVER *solver)
Definition: solver.c:438
#define GCG_DECL_SOLVERSOLVEHEUR(x)
Definition: type_solver.h:133
GCG interface methods.
SCIP_CLOCK * optredcostclock
Definition: struct_solver.h:65
SCIP_CLOCK * heurfarkasclock
Definition: struct_solver.h:66
const char * GCGsolverGetDesc(GCG_SOLVER *solver)
Definition: solver.c:408
SCIP_RETCODE GCGsolverSolve(SCIP *scip, SCIP *pricingprob, GCG_SOLVER *solver, SCIP_Bool redcost, SCIP_Bool heuristic, int probnr, SCIP_Real dualsolconv, SCIP_Real *lowerbound, GCG_PRICINGSTATUS *status, SCIP_Bool *solved)
Definition: solver.c:280
SCIP_Bool GCGsolverIsHeurEnabled(GCG_SOLVER *solver)
Definition: solver.c:428
SCIP_DECL_SORTPTRCOMP(GCGsolverComp)
Definition: solver.c:47
SCIP_RETCODE GCGsolverInit(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:172
SCIP_Real GCGsolverGetHeurRedcostTime(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:524
GCG variable pricer.
GCG_SOLVERDATA * GCGsolverGetData(GCG_SOLVER *solver)
Definition: solver.c:377
enum GCG_PricingStatus GCG_PRICINGSTATUS
SCIP_CLOCK * optfarkasclock
Definition: struct_solver.h:64
int GCGsolverGetHeurRedcostCalls(GCG_SOLVER *solver)
Definition: solver.c:478
#define GCG_DECL_SOLVERINITSOL(x)
Definition: type_solver.h:86
int GCGsolverGetPriority(GCG_SOLVER *solver)
Definition: solver.c:418
@ GCG_PRICINGSTATUS_NOTAPPLICABLE
void GCGsolverSetData(GCG_SOLVER *solver, GCG_SOLVERDATA *solverdata)
Definition: solver.c:387
int GCGsolverGetOptRedcostCalls(GCG_SOLVER *solver)
Definition: solver.c:458
SCIP_Real GCGsolverGetOptFarkasTime(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:488
SCIP_RETCODE GCGsolverExitsol(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:240
#define GCG_DECL_SOLVEREXIT(x)
Definition: type_solver.h:75
SCIP_CLOCK * heurredcostclock
Definition: struct_solver.h:67
SCIP_RETCODE GCGsolverFree(SCIP *scip, GCG_SOLVER **solver)
Definition: solver.c:144
int heurfarkascalls
Definition: struct_solver.h:70
int heurredcostcalls
Definition: struct_solver.h:71
SCIP * GCGmasterGetOrigprob(SCIP *scip)
const char * GCGsolverGetName(GCG_SOLVER *solver)
Definition: solver.c:398
int GCGsolverGetHeurFarkasCalls(GCG_SOLVER *solver)
Definition: solver.c:468
int optfarkascalls
Definition: struct_solver.h:68
#define GCG_DECL_SOLVEREXITSOL(x)
Definition: type_solver.h:97
#define GCG_DECL_SOLVERFREE(x)
Definition: type_solver.h:59
SCIP_Real GCGsolverGetHeurFarkasTime(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:512
#define GCG_DECL_SOLVERINIT(x)
Definition: type_solver.h:67
SCIP_RETCODE GCGsolverUpdate(SCIP *pricingprob, GCG_SOLVER *solver, int probnr, SCIP_Bool varobjschanged, SCIP_Bool varbndschanged, SCIP_Bool consschanged)
Definition: solver.c:257
SCIP_RETCODE GCGsolverInitsol(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:223
char * desc
Definition: struct_solver.h:49
int GCGsolverGetOptFarkasCalls(GCG_SOLVER *solver)
Definition: solver.c:448
SCIP_Real GCGsolverGetOptRedcostTime(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:500
#define GCG_DECL_SOLVERUPDATE(x)
Definition: type_solver.h:105
SCIP_Bool exactenabled
Definition: struct_solver.h:52
GCG_SOLVERDATA * solverdata
Definition: struct_solver.h:53
data structures for solvers
#define GCG_DECL_SOLVERSOLVE(x)
Definition: type_solver.h:119
SCIP_RETCODE GCGsolverExit(SCIP *scip, GCG_SOLVER *solver)
Definition: solver.c:206
int optredcostcalls
Definition: struct_solver.h:69
char * name
Definition: struct_solver.h:48
SCIP_Bool heurenabled
Definition: struct_solver.h:51