Scippy

SCIP

Solving Constraint Integer Programs

scip_benders.h
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-2024 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 scip_benders.h
26 * @ingroup PUBLICCOREAPI
27 * @brief public methods for Benders decomposition
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 * @author Thorsten Koch
31 * @author Alexander Martin
32 * @author Marc Pfetsch
33 * @author Kati Wolter
34 * @author Gregor Hendel
35 * @author Leona Gottwald
36 */
37
38/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
39
40#ifndef __SCIP_SCIP_BENDERS_H__
41#define __SCIP_SCIP_BENDERS_H__
42
43
44#include "scip/def.h"
46#include "scip/type_benders.h"
47#include "scip/type_cons.h"
48#include "scip/type_lp.h"
49#include "scip/type_misc.h"
50#include "scip/type_result.h"
51#include "scip/type_retcode.h"
52#include "scip/type_scip.h"
53#include "scip/type_sol.h"
54#include "scip/type_var.h"
55
56#ifdef __cplusplus
57extern "C" {
58#endif
59
60/**@addtogroup PublicBendersMethods
61 *
62 * @{
63 */
64
65/** creates a Benders' decomposition and includes it in SCIP
66 *
67 * To use the Benders' decomposition for solving a problem, it first has to be activated with a call to SCIPactivateBenders().
68 * This should be done during the problem creation stage.
69 *
70 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
71 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
72 *
73 * @pre This method can be called if SCIP is in one of the following stages:
74 * - \ref SCIP_STAGE_INIT
75 * - \ref SCIP_STAGE_PROBLEM
76 *
77 * @note method has all Benders' decomposition callbacks as arguments and is thus changed every time a new callback is
78 * added in future releases; consider using SCIPincludeBendersBasic() and setter functions
79 * if you seek for a method which is less likely to change in future releases
80 */
81SCIP_EXPORT
83 SCIP* scip, /**< SCIP data structure */
84 const char* name, /**< name of Benders' decomposition */
85 const char* desc, /**< description of Benders' decomposition */
86 int priority, /**< priority of the Benders' decomposition */
87 SCIP_Bool cutlp, /**< should Benders' cuts be generated for LP solutions */
88 SCIP_Bool cutpseudo, /**< should Benders' cuts be generated for pseudo solutions */
89 SCIP_Bool cutrelax, /**< should Benders' cuts be generated for relaxation solutions */
90 SCIP_Bool shareauxvars, /**< should this Benders' use the highest priority Benders aux vars */
91 SCIP_DECL_BENDERSCOPY ((*benderscopy)), /**< copy method of Benders' decomposition or NULL if you don't want to copy your plugin into sub-SCIPs */
92 SCIP_DECL_BENDERSFREE ((*bendersfree)), /**< destructor of Benders' decomposition */
93 SCIP_DECL_BENDERSINIT ((*bendersinit)), /**< initialize Benders' decomposition */
94 SCIP_DECL_BENDERSEXIT ((*bendersexit)), /**< deinitialize Benders' decomposition */
95 SCIP_DECL_BENDERSINITPRE((*bendersinitpre)),/**< presolving initialization method for Benders' decomposition */
96 SCIP_DECL_BENDERSEXITPRE((*bendersexitpre)),/**< presolving deinitialization method for Benders' decomposition */
97 SCIP_DECL_BENDERSINITSOL((*bendersinitsol)),/**< solving process initialization method of Benders' decomposition */
98 SCIP_DECL_BENDERSEXITSOL((*bendersexitsol)),/**< solving process deinitialization method of Benders' decomposition */
99 SCIP_DECL_BENDERSGETVAR((*bendersgetvar)),/**< returns the master variable for a given subproblem variable */
100 SCIP_DECL_BENDERSCREATESUB((*benderscreatesub)),/**< creates a Benders' decomposition subproblem */
101 SCIP_DECL_BENDERSPRESUBSOLVE((*benderspresubsolve)),/**< the execution method of the Benders' decomposition algorithm */
102 SCIP_DECL_BENDERSSOLVESUBCONVEX((*benderssolvesubconvex)),/**< the solving method for convex Benders' decomposition subproblems */
103 SCIP_DECL_BENDERSSOLVESUB((*benderssolvesub)),/**< the solving method for the Benders' decomposition subproblems */
104 SCIP_DECL_BENDERSPOSTSOLVE((*benderspostsolve)),/**< called after the subproblems are solved. */
105 SCIP_DECL_BENDERSFREESUB((*bendersfreesub)),/**< the freeing method for the Benders' decomposition subproblems */
106 SCIP_BENDERSDATA* bendersdata /**< Benders' decomposition data */
107 );
108
109/** creates a Benders' decomposition and includes it in SCIP with all non-fundamental callbacks set to NULL
110 *
111 * If needed, the non-fundamental callbacks can be added afterwards via setter functions SCIPsetBendersCopy(),
112 * SCIPsetBendersFree(), SCIPsetBendersInity(), SCIPsetBendersExit(), SCIPsetBendersInitsol(), SCIPsetBendersExitsol(),
113 * SCIPsetBendersFarkas().
114 *
115 * To use the Benders' decomposition for solving a problem, it first has to be activated with a call to SCIPactivateBenders().
116 * This should be done during the problem creation stage.
117 *
118 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
119 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
120 *
121 * @pre This method can be called if SCIP is in one of the following stages:
122 * - \ref SCIP_STAGE_INIT
123 * - \ref SCIP_STAGE_PROBLEM
124 *
125 * @note if you want to set all callbacks with a single method call, consider using SCIPincludeBenders() instead
126 */
127SCIP_EXPORT
129 SCIP* scip, /**< SCIP data structure */
130 SCIP_BENDERS** bendersptr, /**< reference to a benders, or NULL */
131 const char* name, /**< name of Benders' decomposition */
132 const char* desc, /**< description of Benders' decomposition */
133 int priority, /**< priority of the Benders' decomposition */
134 SCIP_Bool cutlp, /**< should Benders' cuts be generated for LP solutions */
135 SCIP_Bool cutpseudo, /**< should Benders' cuts be generated for pseudo solutions */
136 SCIP_Bool cutrelax, /**< should Benders' cuts be generated for relaxation solutions */
137 SCIP_Bool shareauxvars, /**< should this Benders' use the highest priority Benders aux vars */
138 SCIP_DECL_BENDERSGETVAR((*bendersgetvar)),/**< returns the master variable for a given subproblem variable */
139 SCIP_DECL_BENDERSCREATESUB((*benderscreatesub)),/**< creates a Benders' decomposition subproblem */
140 SCIP_BENDERSDATA* bendersdata /**< Benders' decomposition data */
141 );
142
143/** sets copy method of benders
144 *
145 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
146 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
147 *
148 * @pre This method can be called if SCIP is in one of the following stages:
149 * - \ref SCIP_STAGE_INIT
150 * - \ref SCIP_STAGE_PROBLEM
151 */
152SCIP_EXPORT
154 SCIP* scip, /**< SCIP data structure */
155 SCIP_BENDERS* benders, /**< Benders' decomposition */
156 SCIP_DECL_BENDERSCOPY((*benderscopy)) /**< copy method of Benders' decomposition or NULL if you don't want to copy your plugin into sub-SCIPs */
157 );
158
159/** sets destructor method of benders
160 *
161 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
162 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
163 *
164 * @pre This method can be called if SCIP is in one of the following stages:
165 * - \ref SCIP_STAGE_INIT
166 * - \ref SCIP_STAGE_PROBLEM
167 */
168SCIP_EXPORT
170 SCIP* scip, /**< SCIP data structure */
171 SCIP_BENDERS* benders, /**< Benders' decomposition */
172 SCIP_DECL_BENDERSFREE((*bendersfree)) /**< destructor of Benders' decomposition */
173 );
174
175/** sets initialization method of benders
176 *
177 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
178 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
179 *
180 * @pre This method can be called if SCIP is in one of the following stages:
181 * - \ref SCIP_STAGE_INIT
182 * - \ref SCIP_STAGE_PROBLEM
183 */
184SCIP_EXPORT
186 SCIP* scip, /**< SCIP data structure */
187 SCIP_BENDERS* benders, /**< Benders' decomposition */
188 SCIP_DECL_BENDERSINIT ((*bendersinit)) /**< initialize Benders' decomposition */
189 );
190
191/** sets deinitialization method of benders
192 *
193 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
194 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
195 *
196 * @pre This method can be called if SCIP is in one of the following stages:
197 * - \ref SCIP_STAGE_INIT
198 * - \ref SCIP_STAGE_PROBLEM
199 */
200SCIP_EXPORT
202 SCIP* scip, /**< SCIP data structure */
203 SCIP_BENDERS* benders, /**< Benders' decomposition */
204 SCIP_DECL_BENDERSEXIT ((*bendersexit)) /**< deinitialize Benders' decomposition */
205 );
206
207/** sets presolving initialization method of benders
208 *
209 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
210 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
211 *
212 * @pre This method can be called if SCIP is in one of the following stages:
213 * - \ref SCIP_STAGE_INIT
214 * - \ref SCIP_STAGE_PROBLEM
215 */
216SCIP_EXPORT
218 SCIP* scip, /**< SCIP data structure */
219 SCIP_BENDERS* benders, /**< Benders' decomposition */
220 SCIP_DECL_BENDERSINITPRE((*bendersinitpre))/**< presolving initialization method of Benders' decomposition */
221 );
222
223/** sets presolving deinitialization method of benders
224 *
225 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
226 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
227 *
228 * @pre This method can be called if SCIP is in one of the following stages:
229 * - \ref SCIP_STAGE_INIT
230 * - \ref SCIP_STAGE_PROBLEM
231 */
232SCIP_EXPORT
234 SCIP* scip, /**< SCIP data structure */
235 SCIP_BENDERS* benders, /**< Benders' decomposition */
236 SCIP_DECL_BENDERSEXITPRE((*bendersexitpre))/**< presolving deinitialization method of Benders' decomposition */
237 );
238
239/** sets solving process initialization method of benders
240 *
241 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
242 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
243 *
244 * @pre This method can be called if SCIP is in one of the following stages:
245 * - \ref SCIP_STAGE_INIT
246 * - \ref SCIP_STAGE_PROBLEM
247 */
248SCIP_EXPORT
250 SCIP* scip, /**< SCIP data structure */
251 SCIP_BENDERS* benders, /**< Benders' decomposition */
252 SCIP_DECL_BENDERSINITSOL((*bendersinitsol))/**< solving process initialization method of Benders' decomposition */
253 );
254
255/** sets solving process deinitialization method of benders
256 *
257 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
258 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
259 *
260 * @pre This method can be called if SCIP is in one of the following stages:
261 * - \ref SCIP_STAGE_INIT
262 * - \ref SCIP_STAGE_PROBLEM
263 */
264SCIP_EXPORT
266 SCIP* scip, /**< SCIP data structure */
267 SCIP_BENDERS* benders, /**< Benders' decomposition */
268 SCIP_DECL_BENDERSEXITSOL((*bendersexitsol))/**< solving process deinitialization method of Benders' decomposition */
269 );
270
271/** sets the method called prior to solving the subproblems for benders
272 *
273 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
274 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
275 *
276 * @pre This method can be called if SCIP is in one of the following stages:
277 * - \ref SCIP_STAGE_INIT
278 * - \ref SCIP_STAGE_PROBLEM
279 */
280SCIP_EXPORT
282 SCIP* scip, /**< SCIP data structure */
283 SCIP_BENDERS* benders, /**< Benders' decomposition */
284 SCIP_DECL_BENDERSPRESUBSOLVE((*benderspresubsolve))/**< method called prior to solving the subproblems */
285 );
286
287/** sets the subproblem solving and freeing methods for Benders' decomposition
288 *
289 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
290 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
291 *
292 * @pre This method can be called if SCIP is in one of the following stages:
293 * - \ref SCIP_STAGE_INIT
294 * - \ref SCIP_STAGE_PROBLEM
295 */
296SCIP_EXPORT
298 SCIP* scip, /**< SCIP data structure */
299 SCIP_BENDERS* benders, /**< Benders' decomposition */
300 SCIP_DECL_BENDERSSOLVESUBCONVEX((*benderssolvesubconvex)),/**< the solving method for convex Benders' decomposition subproblems */
301 SCIP_DECL_BENDERSSOLVESUB((*benderssolvesub)),/**< solving method for a Benders' decomposition subproblem */
302 SCIP_DECL_BENDERSFREESUB((*bendersfreesub))/**< the subproblem freeing method for Benders' decomposition */
303 );
304
305/** sets the post solving methods for benders
306 *
307 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
308 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
309 *
310 * @pre This method can be called if SCIP is in one of the following stages:
311 * - \ref SCIP_STAGE_INIT
312 * - \ref SCIP_STAGE_PROBLEM
313 */
314SCIP_EXPORT
316 SCIP* scip, /**< SCIP data structure */
317 SCIP_BENDERS* benders, /**< Benders' decomposition */
318 SCIP_DECL_BENDERSPOSTSOLVE((*benderspostsolve))/**< solving process deinitialization method of Benders' decomposition */
319 );
320
321/** sets the subproblem comparison method for determining the solving order in Benders' decomposition
322 *
323 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
324 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
325 *
326 * @pre This method can be called if SCIP is in one of the following stages:
327 * - \ref SCIP_STAGE_INIT
328 * - \ref SCIP_STAGE_PROBLEM
329 */
330SCIP_EXPORT
332 SCIP* scip, /**< SCIP data structure */
333 SCIP_BENDERS* benders, /**< Benders' decomposition */
334 SCIP_DECL_SORTPTRCOMP((*benderssubcomp)) /**< a comparator for defining the solving order of the subproblems */
335 );
336
337/** returns the Benders' decomposition of the given name, or NULL if not existing */
338SCIP_EXPORT
340 SCIP* scip, /**< SCIP data structure */
341 const char* name /**< name of Benders' decomposition */
342 );
343
344/** returns the array of currently available Benders' decomposition; active Benders' decomposition are in the first
345 * slots of the array
346 */
347SCIP_EXPORT
349 SCIP* scip /**< SCIP data structure */
350 );
351
352/** returns the number of currently available Benders' decomposition */
353SCIP_EXPORT
355 SCIP* scip /**< SCIP data structure */
356 );
357
358/** returns the number of currently active Benders' decomposition */
359SCIP_EXPORT
361 SCIP* scip /**< SCIP data structure */
362 );
363
364/** activates the Benders' decomposition to be used for the current problem
365 *
366 * This method should be called during the problem creation stage for all pricers that are necessary to solve
367 * the problem model.
368 *
369 * @note The Benders' decompositions are automatically deactivated when the problem is freed.
370 *
371 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
372 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
373 *
374 * @pre This method can be called if SCIP is in one of the following stages:
375 * - \ref SCIP_STAGE_PROBLEM
376 */
377SCIP_EXPORT
379 SCIP* scip, /**< SCIP data structure */
380 SCIP_BENDERS* benders, /**< the Benders' decomposition structure */
381 int nsubproblems /**< the number of subproblems in the Benders' decomposition */
382 );
383
384/** deactivates the Benders' decomposition
385 *
386 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
387 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
388 *
389 * @pre This method can be called if SCIP is in one of the following stages:
390 * - \ref SCIP_STAGE_PROBLEM
391 * - \ref SCIP_STAGE_EXITSOLVE
392 */
393SCIP_EXPORT
395 SCIP* scip, /**< SCIP data structure */
396 SCIP_BENDERS* benders /**< the Benders' decomposition structure */
397 );
398
399/** sets the priority of a Benders' decomposition */
400SCIP_EXPORT
402 SCIP* scip, /**< SCIP data structure */
403 SCIP_BENDERS* benders, /**< Benders' decomposition */
404 int priority /**< new priority of the Benders' decomposition */
405 );
406
407/** calls the exec method of Benders' decomposition to solve the subproblems
408 *
409 * The checkint flag indicates whether integer feasibility can be assumed. If it is not assumed, i.e. checkint ==
410 * FALSE, then only the convex relaxations of the subproblems are solved. If integer feasibility is assumed, i.e.
411 * checkint == TRUE, then the convex relaxations and the full CIP are solved to generate Benders' cuts and check
412 * solution feasibility.
413 *
414 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
415 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
416 *
417 * @pre This method can be called if SCIP is in one of the following stages:
418 * - \ref SCIP_STAGE_INITPRESOLVE
419 * - \ref SCIP_STAGE_PRESOLVING
420 * - \ref SCIP_STAGE_EXITPRESOLVE
421 * - \ref SCIP_STAGE_PRESOLVED
422 * - \ref SCIP_STAGE_INITSOLVE
423 * - \ref SCIP_STAGE_SOLVING
424 * - \ref SCIP_STAGE_SOLVED
425 */
426SCIP_EXPORT
428 SCIP* scip, /**< SCIP data structure */
429 SCIP_BENDERS* benders, /**< Benders' decomposition */
430 SCIP_SOL* sol, /**< primal CIP solution, can be NULL */
431 SCIP_RESULT* result, /**< result of the pricing process */
432 SCIP_Bool* infeasible, /**< is the master problem infeasible with respect to the Benders' cuts? */
433 SCIP_Bool* auxviol, /**< set to TRUE only if the solution is feasible but the aux vars are violated */
434 SCIP_BENDERSENFOTYPE type, /**< the type of solution being enforced */
435 SCIP_Bool checkint /**< should the integer solution be checked by the subproblems */
436 );
437
438/** returns the master problem variable for the given subproblem variable
439 *
440 * This function is used as part of the cut generation process.
441 *
442 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
443 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
444 *
445 * @pre This method can be called if SCIP is in one of the following stages:
446 * - \ref SCIP_STAGE_INITPRESOLVE
447 * - \ref SCIP_STAGE_PRESOLVING
448 * - \ref SCIP_STAGE_EXITPRESOLVE
449 * - \ref SCIP_STAGE_PRESOLVED
450 * - \ref SCIP_STAGE_INITSOLVE
451 * - \ref SCIP_STAGE_SOLVING
452 * - \ref SCIP_STAGE_SOLVED
453 */
454SCIP_EXPORT
456 SCIP* scip, /**< SCIP data structure */
457 SCIP_BENDERS* benders, /**< Benders' decomposition */
458 SCIP_VAR* var, /**< the subproblem variable */
459 SCIP_VAR** mappedvar /**< pointer to store the master variable that var is mapped to */
460 );
461
462/** returns the subproblem problem variable for the given master variable
463 *
464 * This function is used as part of the cut generation process.
465 *
466 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
467 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
468 *
469 * @pre This method can be called if SCIP is in one of the following stages:
470 * - \ref SCIP_STAGE_INITPRESOLVE
471 * - \ref SCIP_STAGE_PRESOLVING
472 * - \ref SCIP_STAGE_EXITPRESOLVE
473 * - \ref SCIP_STAGE_PRESOLVED
474 * - \ref SCIP_STAGE_INITSOLVE
475 * - \ref SCIP_STAGE_SOLVING
476 * - \ref SCIP_STAGE_SOLVED
477 */
478SCIP_EXPORT
480 SCIP* scip, /**< SCIP data structure */
481 SCIP_BENDERS* benders, /**< Benders' decomposition */
482 SCIP_VAR* var, /**< the master variable */
483 SCIP_VAR** mappedvar, /**< pointer to store the subproblem variable that var is mapped to */
484 int probnumber /**< the subproblem number */
485 );
486
487/** returns the number of subproblems that are stored in the given Benders' decomposition
488 *
489 * @return the number of subproblems in the Benders' decomposition
490 */
491SCIP_EXPORT
493 SCIP* scip, /**< SCIP data structure */
494 SCIP_BENDERS* benders /**< Benders' decomposition */
495 );
496
497/** registers the Benders' decomposition subproblem with the Benders' decomposition struct.
498 *
499 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
500 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
501 *
502 * @pre This method can be called if SCIP is in one of the following stages:
503 * - \ref SCIP_STAGE_INIT
504 * - \ref SCIP_STAGE_PROBLEM
505 */
506SCIP_EXPORT
508 SCIP* scip, /**< SCIP data structure */
509 SCIP_BENDERS* benders, /**< Benders' decomposition */
510 SCIP* subproblem /**< Benders' decomposition subproblem */
511 );
512
513/** calls the generic subproblem setup method for a Benders' decomposition subproblem
514 *
515 * This is called if the user requires to solve the Benders' decomposition subproblem separately from the main Benders'
516 * solving loop. This could be in the case of enhancement techniques.
517 *
518 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
519 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
520 *
521 * @pre This method can be called if SCIP is in one of the following stages:
522 * - \ref SCIP_STAGE_INITPRESOLVE
523 * - \ref SCIP_STAGE_PRESOLVING
524 * - \ref SCIP_STAGE_EXITPRESOLVE
525 * - \ref SCIP_STAGE_PRESOLVED
526 * - \ref SCIP_STAGE_INITSOLVE
527 * - \ref SCIP_STAGE_SOLVING
528 * - \ref SCIP_STAGE_SOLVED
529 */
530SCIP_EXPORT
532 SCIP* scip, /**< SCIP data structure */
533 SCIP_BENDERS* benders, /**< the Benders' decomposition data structure */
534 SCIP_SOL* sol, /**< primal solution used to setup tht problem, NULL for LP solution */
535 int probnumber, /**< the subproblem number */
536 SCIP_BENDERSENFOTYPE type /**< the enforcement type calling this function */
537 );
538
539/** calls the solving method for a single Benders' decomposition subproblem
540 *
541 * The method either calls the users solve subproblem method or calls the generic method. In the case of the generic
542 * method, the user must set up the subproblem prior to calling this method.
543 *
544 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
545 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
546 *
547 * @pre This method can be called if SCIP is in one of the following stages:
548 * - \ref SCIP_STAGE_INITPRESOLVE
549 * - \ref SCIP_STAGE_PRESOLVING
550 * - \ref SCIP_STAGE_EXITPRESOLVE
551 * - \ref SCIP_STAGE_PRESOLVED
552 * - \ref SCIP_STAGE_INITSOLVE
553 * - \ref SCIP_STAGE_SOLVING
554 * - \ref SCIP_STAGE_SOLVED
555 */
556SCIP_EXPORT
558 SCIP* scip, /**< SCIP data structure */
559 SCIP_BENDERS* benders, /**< Benders' decomposition */
560 SCIP_SOL* sol, /**< primal CIP solution, can be NULL for the current LP/Pseudo solution */
561 int probnumber, /**< the subproblem number */
562 SCIP_Bool* infeasible, /**< returns whether the current subproblem is infeasible */
563 SCIP_Bool solvecip, /**< directly solve the CIP subproblem */
564 SCIP_Real* objective /**< the objective function value of the subproblem, can be NULL */
565 );
566
567/** frees the subproblem after calling the solve subproblem method
568 *
569 * This will either call the user defined free
570 * subproblem callback for Benders' decomposition or the default freeing methods. In the default case, if the
571 * subproblem is an LP, then SCIPendProbing is called. If the subproblem is a MIP, then SCIPfreeTransform is called.
572 *
573 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
574 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
575 *
576 * @pre This method can be called if SCIP is in one of the following stages:
577 * - \ref SCIP_STAGE_INITPRESOLVE
578 * - \ref SCIP_STAGE_PRESOLVING
579 * - \ref SCIP_STAGE_EXITPRESOLVE
580 * - \ref SCIP_STAGE_PRESOLVED
581 * - \ref SCIP_STAGE_INITSOLVE
582 * - \ref SCIP_STAGE_SOLVING
583 * - \ref SCIP_STAGE_SOLVED
584 * - \ref SCIP_STAGE_EXITSOLVE
585 * - \ref SCIP_STAGE_FREETRANS
586 */
587SCIP_EXPORT
589 SCIP* scip, /**< SCIP data structure */
590 SCIP_BENDERS* benders, /**< Benders' decomposition */
591 int probnumber /**< the subproblem number */
592 );
593
594/** checks the optimality of a Benders' decomposition subproblem by comparing the objective function value against the
595 * value of the corresponding auxiliary variable
596 *
597 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
598 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
599 *
600 * @pre This method can be called if SCIP is in one of the following stages:
601 * - \ref SCIP_STAGE_PRESOLVING
602 * - \ref SCIP_STAGE_SOLVING
603 * - \ref SCIP_STAGE_SOLVED
604 *
605 * @pre This method can be called if requested subproblem is in one of the following stages:
606 * - \ref SCIP_STAGE_SOLVING
607 * - \ref SCIP_STAGE_SOLVED
608 */
609SCIP_EXPORT
611 SCIP* scip, /**< SCIP data structure */
612 SCIP_BENDERS* benders, /**< the benders' decomposition structure */
613 SCIP_SOL* sol, /**< primal CIP solution, can be NULL for the current LP solution */
614 int probnumber, /**< the number of the pricing problem */
615 SCIP_Bool* optimal /**< flag to indicate whether the current subproblem is optimal for the master */
616 );
617
618/** returns the value of the auxiliary variable for a given subproblem */
619SCIP_EXPORT
621 SCIP* scip, /**< SCIP data structure */
622 SCIP_BENDERS* benders, /**< the benders' decomposition structure */
623 SCIP_SOL* sol, /**< primal CIP solution, can be NULL for the current LP solution */
624 int probnumber /**< the number of the pricing problem */
625 );
626
627/** solves an independent subproblem to identify its lower bound and updates the lower bound of the corresponding
628 * auxiliary variable
629 *
630 * @pre This method can be called if SCIP is in one of the following stages:
631 * - \ref SCIP_STAGE_INITPRESOLVE
632 * - \ref SCIP_STAGE_PRESOLVING
633 * - \ref SCIP_STAGE_EXITPRESOLVE
634 * - \ref SCIP_STAGE_PRESOLVED
635 * - \ref SCIP_STAGE_INITSOLVE
636 * - \ref SCIP_STAGE_SOLVING
637 *
638 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
639 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
640 */
641SCIP_EXPORT
643 SCIP* scip, /**< the SCIP data structure */
644 SCIP_BENDERS* benders, /**< Benders' decomposition */
645 int probnumber, /**< the subproblem to be evaluated */
646 SCIP_Real* lowerbound, /**< the lowerbound for the subproblem */
647 SCIP_Bool* infeasible /**< was the subproblem found to be infeasible? */
648 );
649
650/** merges a subproblem into the master problem.
651 *
652 * This process just adds a copy of the subproblem variables and constraints to the master problem, but keeps the
653 * subproblem stored in the Benders' decomposition data structure. The reason for keeping the subproblem available is
654 * for when it is queried for solutions after the problem is solved.
655 *
656 * Once the subproblem is merged into the master problem, then the subproblem is flagged as disabled. This means that
657 * it will not be solved in the subsequent subproblem solving loops.
658 *
659 * The associated auxiliary variables are kept in the master problem. The objective function of the merged subproblem
660 * is added as an underestimator constraint.
661 *
662 * @pre This method can be called if SCIP is in one of the following stages:
663 * - \ref SCIP_STAGE_INITPRESOLVE
664 * - \ref SCIP_STAGE_PRESOLVING
665 * - \ref SCIP_STAGE_EXITPRESOLVE
666 * - \ref SCIP_STAGE_PRESOLVED
667 * - \ref SCIP_STAGE_INITSOLVE
668 * - \ref SCIP_STAGE_SOLVING
669 *
670 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
671 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
672 */
673SCIP_EXPORT
675 SCIP* scip, /**< the SCIP data structure */
676 SCIP_BENDERS* benders, /**< Benders' decomposition */
677 SCIP_HASHMAP* varmap, /**< a hashmap to store the mapping of subproblem variables corresponding
678 * to the newly created master variables, or NULL */
679 SCIP_HASHMAP* consmap, /**< a hashmap to store the mapping of subproblem constraints to the
680 corresponding newly created constraints, or NULL */
681 int probnumber /**< the number of the subproblem that will be merged into the master problem*/
682 );
683
684/** applies a Benders' decomposition to the selected decomposition from the decomposition store
685 *
686 * @pre This method can be called if SCIP is in one of the following stages:
687 * - \ref SCIP_STAGE_PROBLEM
688 * - \ref SCIP_STAGE_TRANSFORMED
689 * - \ref SCIP_STAGE_INITPRESOLVE
690 * - \ref SCIP_STAGE_PRESOLVING
691 * - \ref SCIP_STAGE_EXITPRESOLVE
692 * - \ref SCIP_STAGE_PRESOLVED
693 * - \ref SCIP_STAGE_INITSOLVE
694 *
695 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
696 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
697 */
698SCIP_EXPORT
700 SCIP* scip, /**< the SCIP data structure */
701 int decompindex /**< the index of the decomposition that will be applied */
702 );
703
704/** @} */
705
706/**@addtogroup PublicBenderscutsMethods
707 *
708 * @{
709 */
710
711/** creates a Benders' cut algorithms and includes it in the associated Benders' decomposition
712 *
713 * This should be called from the SCIPincludeBendersXyz for the associated Benders' decomposition. It is only possible
714 * to include a Benders' cut algorithm if a Benders' decomposition has already been included
715 * This should be done during the problem creation stage.
716 *
717 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
718 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
719 *
720 * @pre This method can be called if SCIP is in one of the following stages:
721 * - \ref SCIP_STAGE_INIT
722 * - \ref SCIP_STAGE_PROBLEM
723 *
724 * @note method has all Benders' decomposition callbacks as arguments and is thus changed every time a new callback is
725 * added in future releases; consider using SCIPincludeBendersBasic() and setter functions
726 * if you seek for a method which is less likely to change in future releases
727 */
728SCIP_EXPORT
730 SCIP* scip, /**< SCIP data structure */
731 SCIP_BENDERS* benders, /**< Benders' decomposition */
732 const char* name, /**< name of Benders' decomposition cuts */
733 const char* desc, /**< description of Benders' decomposition cuts */
734 int priority, /**< priority of the Benders' decomposition cuts */
735 SCIP_Bool islpcut, /**< indicates whether the cut is generated from the LP solution */
736 SCIP_DECL_BENDERSCUTCOPY((*benderscutcopy)),/**< copy method of Benders' decomposition cuts or NULL if you don't want to copy your plugin into sub-SCIPs */
737 SCIP_DECL_BENDERSCUTFREE((*benderscutfree)),/**< destructor of Benders' decomposition cuts */
738 SCIP_DECL_BENDERSCUTINIT((*benderscutinit)),/**< initialize Benders' decomposition cuts */
739 SCIP_DECL_BENDERSCUTEXIT((*benderscutexit)),/**< deinitialize Benders' decomposition cuts */
740 SCIP_DECL_BENDERSCUTINITSOL((*benderscutinitsol)),/**< solving process initialization method of Benders' decomposition cuts */
741 SCIP_DECL_BENDERSCUTEXITSOL((*benderscutexitsol)),/**< solving process deinitialization method of Benders' decomposition cuts */
742 SCIP_DECL_BENDERSCUTEXEC((*benderscutexec)),/**< execution method of Benders' decomposition cuts */
743 SCIP_BENDERSCUTDATA* benderscutdata /**< Benders' decomposition cuts data */
744 );
745
746/** creates a Benders' cut and includes it an associated Benders' decomposition with all non-fundamental callbacks set to NULL
747 *
748 * If needed, the non-fundamental callbacks can be added afterwards via setter functions SCIPsetBenderscutCopy(),
749 * SCIPsetBenderscutFree(), SCIPsetBenderscutInit(), SCIPsetBenderscutExit(), SCIPsetBenderscutInitsol(),
750 * SCIPsetBenderscutExitsol().
751 *
752 * This should be done during the problem creation stage.
753 *
754 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
755 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
756 *
757 * @pre This method can be called if SCIP is in one of the following stages:
758 * - \ref SCIP_STAGE_INIT
759 * - \ref SCIP_STAGE_PROBLEM
760 *
761 * @note if you want to set all callbacks with a single method call, consider using SCIPincludeBenders() instead
762 */
763SCIP_EXPORT
765 SCIP* scip, /**< SCIP data structure */
766 SCIP_BENDERS* benders, /**< Benders' decomposition */
767 SCIP_BENDERSCUT** benderscutptr, /**< reference to a Benders' decomposition cut, or NULL */
768 const char* name, /**< name of Benders' decomposition */
769 const char* desc, /**< description of Benders' decomposition */
770 int priority, /**< priority of the Benders' decomposition */
771 SCIP_Bool islpcut, /**< indicates whether the cut is generated from the LP solution */
772 SCIP_DECL_BENDERSCUTEXEC((*benderscutexec)),/**< the execution method of the Benders' cut algorithm */
773 SCIP_BENDERSCUTDATA* benderscutdata /**< Benders' cut data */
774 );
775
776/** sets copy method of Benders' decomposition cut
777 *
778 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
779 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
780 *
781 * @pre This method can be called if SCIP is in one of the following stages:
782 * - \ref SCIP_STAGE_INIT
783 * - \ref SCIP_STAGE_PROBLEM
784 */
785SCIP_EXPORT
787 SCIP* scip, /**< SCIP data structure */
788 SCIP_BENDERSCUT* benderscut, /**< Benders' decomposition cut */
789 SCIP_DECL_BENDERSCUTCOPY((*benderscutcopy))/**< copy method of benderscut or NULL if you don't want to copy your plugin into sub-SCIPs */
790 );
791
792/** sets destructor method of benderscut
793 *
794 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
795 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
796 *
797 * @pre This method can be called if SCIP is in one of the following stages:
798 * - \ref SCIP_STAGE_INIT
799 * - \ref SCIP_STAGE_PROBLEM
800 */
801SCIP_EXPORT
803 SCIP* scip, /**< SCIP data structure */
804 SCIP_BENDERSCUT* benderscut, /**< benderscut */
805 SCIP_DECL_BENDERSCUTFREE((*benderscutfree))/**< destructor of benderscut */
806 );
807
808/** sets initialization method of benderscut
809 *
810 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
811 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
812 *
813 * @pre This method can be called if SCIP is in one of the following stages:
814 * - \ref SCIP_STAGE_INIT
815 * - \ref SCIP_STAGE_PROBLEM
816 */
817SCIP_EXPORT
819 SCIP* scip, /**< SCIP data structure */
820 SCIP_BENDERSCUT* benderscut, /**< benderscut */
821 SCIP_DECL_BENDERSCUTINIT((*benderscutinit))/**< initialize benderscut */
822 );
823
824/** sets deinitialization method of benderscut
825 *
826 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
827 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
828 *
829 * @pre This method can be called if SCIP is in one of the following stages:
830 * - \ref SCIP_STAGE_INIT
831 * - \ref SCIP_STAGE_PROBLEM
832 */
833SCIP_EXPORT
835 SCIP* scip, /**< SCIP data structure */
836 SCIP_BENDERSCUT* benderscut, /**< benderscut */
837 SCIP_DECL_BENDERSCUTEXIT((*benderscutexit))/**< deinitialize benderscut */
838 );
839
840/** sets solving process initialization method of benderscut
841 *
842 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
843 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
844 *
845 * @pre This method can be called if SCIP is in one of the following stages:
846 * - \ref SCIP_STAGE_INIT
847 * - \ref SCIP_STAGE_PROBLEM
848 */
849SCIP_EXPORT
851 SCIP* scip, /**< SCIP data structure */
852 SCIP_BENDERSCUT* benderscut, /**< benderscut */
853 SCIP_DECL_BENDERSCUTINITSOL((*benderscutinitsol))/**< solving process initialization method of benderscut */
854 );
855
856/** sets solving process deinitialization method of benderscut
857 *
858 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
859 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
860 *
861 * @pre This method can be called if SCIP is in one of the following stages:
862 * - \ref SCIP_STAGE_INIT
863 * - \ref SCIP_STAGE_PROBLEM
864 */
865SCIP_EXPORT
867 SCIP* scip, /**< SCIP data structure */
868 SCIP_BENDERSCUT* benderscut, /**< benderscut */
869 SCIP_DECL_BENDERSCUTEXITSOL((*benderscutexitsol))/**< solving process deinitialization method of benderscut */
870 );
871
872/** sets the priority of a Benders' decomposition cut algorithm
873 *
874 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
875 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
876 *
877 * @pre This method can be called if SCIP is in one of the following stages:
878 * - \ref SCIP_STAGE_INIT
879 * - \ref SCIP_STAGE_PROBLEM
880 */
881SCIP_EXPORT
883 SCIP* scip, /**< SCIP data structure */
884 SCIP_BENDERSCUT* benderscut, /**< benderscut */
885 int priority /**< new priority of the Benders' decomposition */
886 );
887
888/** adds the generated cuts to the Benders' cut storage
889 *
890 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
891 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
892 *
893 * @pre This method can be called if SCIP is in one of the following stages:
894 * - \ref SCIP_STAGE_INITPRESOLVE
895 * - \ref SCIP_STAGE_PRESOLVING
896 * - \ref SCIP_STAGE_EXITPRESOLVE
897 * - \ref SCIP_STAGE_PRESOLVED
898 * - \ref SCIP_STAGE_INITSOLVE
899 * - \ref SCIP_STAGE_SOLVING
900 */
901SCIP_EXPORT
903 SCIP* scip, /**< the SCIP data structure */
904 SCIP_BENDERS* benders, /**< Benders' decomposition */
905 SCIP_VAR** vars, /**< the variables that have non-zero coefficients in the cut */
906 SCIP_Real* vals, /**< the coefficients of the variables in the cut */
907 SCIP_Real lhs, /**< the left hand side of the cut */
908 SCIP_Real rhs, /**< the right hand side of the cut */
909 int nvars /**< the number of variables with non-zero coefficients in the cut */
910 );
911
912/** applies the Benders' decomposition cuts in storage to the input SCIP instance
913 *
914 * When calling the function, the user must be sure that the variables are associated with the input SCIP instance.
915 * The main use of this method is to transfer Benders' cuts between solvers in ParaSCIP.
916 *
917 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
918 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
919 *
920 * @pre This method can be called if SCIP is in one of the following stages:
921 * - \ref SCIP_STAGE_INITPRESOLVE
922 * - \ref SCIP_STAGE_PRESOLVING
923 * - \ref SCIP_STAGE_EXITPRESOLVE
924 * - \ref SCIP_STAGE_PRESOLVED
925 * - \ref SCIP_STAGE_INITSOLVE
926 * - \ref SCIP_STAGE_SOLVING
927 */
929 SCIP* scip, /**< the SCIP data structure */
930 SCIP_BENDERS* benders /**< Benders' decomposition */
931 );
932
933/** @} */
934
935#ifdef __cplusplus
936}
937#endif
938
939#endif
common defines and data types used in all packages of SCIP
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:172
int SCIPgetNActiveBenders(SCIP *scip)
Definition: scip_benders.c:532
SCIP_RETCODE SCIPsetBendersFree(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSFREE((*bendersfree)))
Definition: scip_benders.c:221
SCIP_RETCODE SCIPsetBendersCopy(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSCOPY((*benderscopy)))
Definition: scip_benders.c:197
SCIP_RETCODE SCIPsetBendersExitsol(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSEXITSOL((*bendersexitsol)))
Definition: scip_benders.c:365
SCIP_RETCODE SCIPaddBendersSubproblem(SCIP *scip, SCIP_BENDERS *benders, SCIP *subproblem)
Definition: scip_benders.c:746
SCIP_RETCODE SCIPsetBendersInitpre(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSINITPRE((*bendersinitpre)))
Definition: scip_benders.c:293
int SCIPgetBendersNSubproblems(SCIP *scip, SCIP_BENDERS *benders)
Definition: scip_benders.c:722
SCIP_BENDERS ** SCIPgetBenders(SCIP *scip)
Definition: scip_benders.c:508
int SCIPgetNBenders(SCIP *scip)
Definition: scip_benders.c:521
SCIP_RETCODE SCIPcomputeBendersSubproblemLowerbound(SCIP *scip, SCIP_BENDERS *benders, int probnumber, SCIP_Real *lowerbound, SCIP_Bool *infeasible)
Definition: scip_benders.c:959
SCIP_RETCODE SCIPincludeBenders(SCIP *scip, const char *name, const char *desc, int priority, SCIP_Bool cutlp, SCIP_Bool cutpseudo, SCIP_Bool cutrelax, SCIP_Bool shareauxvars, SCIP_DECL_BENDERSCOPY((*benderscopy)), SCIP_DECL_BENDERSFREE((*bendersfree)), SCIP_DECL_BENDERSINIT((*bendersinit)), SCIP_DECL_BENDERSEXIT((*bendersexit)), SCIP_DECL_BENDERSINITPRE((*bendersinitpre)), SCIP_DECL_BENDERSEXITPRE((*bendersexitpre)), SCIP_DECL_BENDERSINITSOL((*bendersinitsol)), SCIP_DECL_BENDERSEXITSOL((*bendersexitsol)), SCIP_DECL_BENDERSGETVAR((*bendersgetvar)), SCIP_DECL_BENDERSCREATESUB((*benderscreatesub)), SCIP_DECL_BENDERSPRESUBSOLVE((*benderspresubsolve)), SCIP_DECL_BENDERSSOLVESUBCONVEX((*benderssolvesubconvex)), SCIP_DECL_BENDERSSOLVESUB((*benderssolvesub)), SCIP_DECL_BENDERSPOSTSOLVE((*benderspostsolve)), SCIP_DECL_BENDERSFREESUB((*bendersfreesub)), SCIP_BENDERSDATA *bendersdata)
Definition: scip_benders.c:76
SCIP_BENDERS * SCIPfindBenders(SCIP *scip, const char *name)
Definition: scip_benders.c:493
SCIP_RETCODE SCIPsetBendersPresubsolve(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSPRESUBSOLVE((*benderspresubsolve)))
Definition: scip_benders.c:389
SCIP_Real SCIPgetBendersAuxiliaryVarVal(SCIP *scip, SCIP_BENDERS *benders, SCIP_SOL *sol, int probnumber)
Definition: scip_benders.c:931
SCIP_RETCODE SCIPactivateBenders(SCIP *scip, SCIP_BENDERS *benders, int nsubproblems)
Definition: scip_benders.c:555
SCIP_RETCODE SCIPfreeBendersSubproblem(SCIP *scip, SCIP_BENDERS *benders, int probnumber)
Definition: scip_benders.c:861
SCIP_RETCODE SCIPsetBendersPostsolve(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSPOSTSOLVE((*benderspostsolve)))
Definition: scip_benders.c:453
SCIP_RETCODE SCIPsetupBendersSubproblem(SCIP *scip, SCIP_BENDERS *benders, SCIP_SOL *sol, int probnumber, SCIP_BENDERSENFOTYPE type)
Definition: scip_benders.c:780
void SCIPsetBendersPriority(SCIP *scip, SCIP_BENDERS *benders, int priority)
Definition: scip_benders.c:590
SCIP_RETCODE SCIPgetBendersMasterVar(SCIP *scip, SCIP_BENDERS *benders, SCIP_VAR *var, SCIP_VAR **mappedvar)
Definition: scip_benders.c:660
SCIP_RETCODE SCIPsetBendersSubproblemComp(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_SORTPTRCOMP((*benderssubcomp)))
Definition: scip_benders.c:477
SCIP_RETCODE SCIPsolveBendersSubproblem(SCIP *scip, SCIP_BENDERS *benders, SCIP_SOL *sol, int probnumber, SCIP_Bool *infeasible, SCIP_Bool solvecip, SCIP_Real *objective)
Definition: scip_benders.c:818
SCIP_RETCODE SCIPgetBendersSubproblemVar(SCIP *scip, SCIP_BENDERS *benders, SCIP_VAR *var, SCIP_VAR **mappedvar, int probnumber)
Definition: scip_benders.c:696
SCIP_RETCODE SCIPincludeBendersBasic(SCIP *scip, SCIP_BENDERS **bendersptr, const char *name, const char *desc, int priority, SCIP_Bool cutlp, SCIP_Bool cutpseudo, SCIP_Bool cutrelax, SCIP_Bool shareauxvars, SCIP_DECL_BENDERSGETVAR((*bendersgetvar)), SCIP_DECL_BENDERSCREATESUB((*benderscreatesub)), SCIP_BENDERSDATA *bendersdata)
Definition: scip_benders.c:151
SCIP_RETCODE SCIPdeactivateBenders(SCIP *scip, SCIP_BENDERS *benders)
Definition: scip_benders.c:577
SCIP_RETCODE SCIPsetBendersExit(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSEXIT((*bendersexit)))
Definition: scip_benders.c:269
SCIP_RETCODE SCIPsetBendersSolveAndFreesub(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSSOLVESUBCONVEX((*benderssolvesubconvex)), SCIP_DECL_BENDERSSOLVESUB((*benderssolvesub)), SCIP_DECL_BENDERSFREESUB((*bendersfreesub)))
Definition: scip_benders.c:413
SCIP_RETCODE SCIPsetBendersExitpre(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSEXITPRE((*bendersexitpre)))
Definition: scip_benders.c:317
SCIP_RETCODE SCIPsetBendersInit(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSINIT((*bendersinit)))
Definition: scip_benders.c:245
SCIP_RETCODE SCIPcheckBendersSubproblemOptimality(SCIP *scip, SCIP_BENDERS *benders, SCIP_SOL *sol, int probnumber, SCIP_Bool *optimal)
Definition: scip_benders.c:892
SCIP_RETCODE SCIPsetBendersInitsol(SCIP *scip, SCIP_BENDERS *benders, SCIP_DECL_BENDERSINITSOL((*bendersinitsol)))
Definition: scip_benders.c:341
SCIP_RETCODE SCIPapplyBendersDecomposition(SCIP *scip, int decompindex)
SCIP_RETCODE SCIPmergeBendersSubproblemIntoMaster(SCIP *scip, SCIP_BENDERS *benders, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, int probnumber)
Definition: scip_benders.c:999
SCIP_RETCODE SCIPsolveBendersSubproblems(SCIP *scip, SCIP_BENDERS *benders, SCIP_SOL *sol, SCIP_RESULT *result, SCIP_Bool *infeasible, SCIP_Bool *auxviol, SCIP_BENDERSENFOTYPE type, SCIP_Bool checkint)
Definition: scip_benders.c:622
SCIP_RETCODE SCIPincludeBenderscut(SCIP *scip, SCIP_BENDERS *benders, const char *name, const char *desc, int priority, SCIP_Bool islpcut, SCIP_DECL_BENDERSCUTCOPY((*benderscutcopy)), SCIP_DECL_BENDERSCUTFREE((*benderscutfree)), SCIP_DECL_BENDERSCUTINIT((*benderscutinit)), SCIP_DECL_BENDERSCUTEXIT((*benderscutexit)), SCIP_DECL_BENDERSCUTINITSOL((*benderscutinitsol)), SCIP_DECL_BENDERSCUTEXITSOL((*benderscutexitsol)), SCIP_DECL_BENDERSCUTEXEC((*benderscutexec)), SCIP_BENDERSCUTDATA *benderscutdata)
SCIP_RETCODE SCIPincludeBenderscutBasic(SCIP *scip, SCIP_BENDERS *benders, SCIP_BENDERSCUT **benderscutptr, const char *name, const char *desc, int priority, SCIP_Bool islpcut, SCIP_DECL_BENDERSCUTEXEC((*benderscutexec)), SCIP_BENDERSCUTDATA *benderscutdata)
SCIP_RETCODE SCIPsetBenderscutPriority(SCIP *scip, SCIP_BENDERSCUT *benderscut, int priority)
SCIP_RETCODE SCIPsetBenderscutExit(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTEXIT((*benderscutexit)))
SCIP_RETCODE SCIPsetBenderscutExitsol(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTEXITSOL((*benderscutexitsol)))
SCIP_RETCODE SCIPsetBenderscutInitsol(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTINITSOL((*benderscutinitsol)))
SCIP_RETCODE SCIPsetBenderscutInit(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTINIT((*benderscutinit)))
SCIP_RETCODE SCIPsetBenderscutFree(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTFREE((*benderscutfree)))
SCIP_RETCODE SCIPapplyBendersStoredCuts(SCIP *scip, SCIP_BENDERS *benders)
SCIP_RETCODE SCIPstoreBendersCut(SCIP *scip, SCIP_BENDERS *benders, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, int nvars)
SCIP_RETCODE SCIPsetBenderscutCopy(SCIP *scip, SCIP_BENDERSCUT *benderscut, SCIP_DECL_BENDERSCUTCOPY((*benderscutcopy)))
type definitions for Benders' decomposition methods
#define SCIP_DECL_BENDERSFREESUB(x)
Definition: type_benders.h:350
#define SCIP_DECL_BENDERSCREATESUB(x)
Definition: type_benders.h:194
#define SCIP_DECL_BENDERSCOPY(x)
Definition: type_benders.h:95
#define SCIP_DECL_BENDERSSOLVESUB(x)
Definition: type_benders.h:292
#define SCIP_DECL_BENDERSEXITPRE(x)
Definition: type_benders.h:140
#define SCIP_DECL_BENDERSSOLVESUBCONVEX(x)
Definition: type_benders.h:259
#define SCIP_DECL_BENDERSINIT(x)
Definition: type_benders.h:112
#define SCIP_DECL_BENDERSFREE(x)
Definition: type_benders.h:103
#define SCIP_DECL_BENDERSEXITSOL(x)
Definition: type_benders.h:162
#define SCIP_DECL_BENDERSPRESUBSOLVE(x)
Definition: type_benders.h:218
enum SCIP_BendersEnfoType SCIP_BENDERSENFOTYPE
Definition: type_benders.h:51
#define SCIP_DECL_BENDERSGETVAR(x)
Definition: type_benders.h:366
#define SCIP_DECL_BENDERSPOSTSOLVE(x)
Definition: type_benders.h:328
#define SCIP_DECL_BENDERSINITPRE(x)
Definition: type_benders.h:132
#define SCIP_DECL_BENDERSEXIT(x)
Definition: type_benders.h:121
#define SCIP_DECL_BENDERSINITSOL(x)
Definition: type_benders.h:151
struct SCIP_BendersData SCIP_BENDERSDATA
Definition: type_benders.h:82
type definitions for Benders' decomposition cut
#define SCIP_DECL_BENDERSCUTEXEC(x)
struct SCIP_BenderscutData SCIP_BENDERSCUTDATA
#define SCIP_DECL_BENDERSCUTEXITSOL(x)
#define SCIP_DECL_BENDERSCUTFREE(x)
#define SCIP_DECL_BENDERSCUTCOPY(x)
#define SCIP_DECL_BENDERSCUTINIT(x)
#define SCIP_DECL_BENDERSCUTINITSOL(x)
#define SCIP_DECL_BENDERSCUTEXIT(x)
type definitions for constraints and constraint handlers
type definitions for LP management
type definitions for miscellaneous datastructures
#define SCIP_DECL_SORTPTRCOMP(x)
Definition: type_misc.h:188
result codes for SCIP callback methods
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:61
type definitions for return codes for SCIP methods
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
type definitions for SCIP's main datastructure
type definitions for storing primal CIP solutions
type definitions for problem variables