Scippy

    SCIP

    Solving Constraint Integer Programs

    type_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-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 type_benders.h
    26 * @ingroup TYPEDEFINITIONS
    27 * @brief type definitions for Benders' decomposition methods
    28 * @author Stephen J. Maher
    29 */
    30
    31/** @defgroup DEFPLUGINS_BENDERS Default Benders handler plugins
    32 * @ingroup DEFPLUGINS
    33 * @brief implementation files (.c files) of the default benders handler plugins of SCIP
    34 */
    35
    36/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    37
    38#ifndef __SCIP_TYPE_BENDERS_H__
    39#define __SCIP_TYPE_BENDERS_H__
    40
    41#include "scip/def.h"
    42#include "scip/type_retcode.h"
    43#include "scip/type_scip.h"
    44
    45#ifdef __cplusplus
    46extern "C" {
    47#endif
    48
    50{
    51 SCIP_BENDERSENFOTYPE_LP = 1, /**< the Benders' subproblems are solved during the enforcement of an LP solution */
    52 SCIP_BENDERSENFOTYPE_RELAX = 2, /**< the Benders' subproblems are solved during the enforcement of a relaxation solution */
    53 SCIP_BENDERSENFOTYPE_PSEUDO = 3, /**< the Benders' subproblems are solved during the enforcement of a pseudo solution */
    54 SCIP_BENDERSENFOTYPE_CHECK = 4 /**< the Benders' subproblems are solved during the checking of a solution for feasibility */
    55};
    56typedef enum SCIP_BendersEnfoType SCIP_BENDERSENFOTYPE; /**< indicates the callback in cons_benders and cons_benderslp that triggered the subproblem solve */
    57
    59{
    60 SCIP_BENDERSSOLVELOOP_CONVEX = 0, /**< the relaxation is solved in this iteration of the loop */
    61 SCIP_BENDERSSOLVELOOP_CIP = 1, /**< the CIP is solved in this iteration of the loop */
    62 SCIP_BENDERSSOLVELOOP_USERCONVEX = 2, /**< the user defined solve function is called */
    63 SCIP_BENDERSSOLVELOOP_USERCIP = 3 /**< the user defined solve function is called */
    64};
    65typedef enum SCIP_BendersSolveLoop SCIP_BENDERSSOLVELOOP; /**< identifies the type of problem solved in each solve loop */
    66
    68{
    69 SCIP_BENDERSSUBSTATUS_UNKNOWN = 0, /**< the subsystem status is unknown */
    70 SCIP_BENDERSSUBSTATUS_OPTIMAL = 1, /**< the subsystem is solved to be optimal */
    71 SCIP_BENDERSSUBSTATUS_AUXVIOL = 2, /**< the subproblem is optimal, but the auxiliary variable is violated */
    72 SCIP_BENDERSSUBSTATUS_INFEAS = 3 /**< the subproblem is solved to be infeasible */
    73};
    75
    77{
    78 SCIP_BENDERSSUBTYPE_CONVEXCONT = 0, /**< the subproblem has convex constraints and continuous variables */
    79 SCIP_BENDERSSUBTYPE_CONVEXDIS = 1, /**< the subproblem has convex constraints and discrete variables */
    80 SCIP_BENDERSSUBTYPE_NONCONVEXCONT = 2, /**< the subproblem has non-convex constraints and continuous variables */
    81 SCIP_BENDERSSUBTYPE_NONCONVEXDIS = 3, /**< the subproblem has non-convex constraints and discrete variables */
    82 SCIP_BENDERSSUBTYPE_UNKNOWN = 4, /**< the default type before the type is known */
    83};
    85
    87{
    88 SCIP_BENDERSOBJTYPE_SUM = 0, /**< the individual subproblem objectives are summed in the master problem */
    89 SCIP_BENDERSOBJTYPE_MAX = 1, /**< the minimum of the maximum subproblem objectives is computed in the master problem */
    90};
    92
    93typedef struct SCIP_Benders SCIP_BENDERS; /**< Benders' decomposition data */
    94typedef struct SCIP_BendersData SCIP_BENDERSDATA; /**< locally defined Benders' decomposition data */
    95typedef struct SCIP_SubproblemSolveStat SCIP_SUBPROBLEMSOLVESTAT; /**< the solving statistics of the subproblems */
    96
    97
    98/** copy method for Benders' decomposition plugins (called when SCIP copies plugins). If there is an active Benders'
    99 * decomposition, all copies are not valid. As such, there is no valid parameter that is passed to the callback
    100 * function
    101 *
    102 * input:
    103 * - scip : SCIP main data structure
    104 * - benders : the Benders' decomposition itself
    105 * - threadsafe : must the Benders' decomposition copy be thread safe
    106 */
    107#define SCIP_DECL_BENDERSCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_Bool threadsafe)
    108
    109/** destructor of Benders' decomposition to free user data (called when SCIP is exiting)
    110 *
    111 * input:
    112 * - scip : SCIP main data structure
    113 * - benders : the Benders' decomposition itself
    114 */
    115#define SCIP_DECL_BENDERSFREE(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    116
    117/** initialization method of Benders' decomposition (called after problem was transformed and the Benders' decomposition
    118 * is active)
    119 *
    120 * input:
    121 * - scip : SCIP main data structure
    122 * - benders : the Benders' decomposition itself
    123 */
    124#define SCIP_DECL_BENDERSINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    125
    126/** deinitialization method of Benders' decomposition (called before transformed problem is freed and the Benders'
    127 * decomposition is active)
    128 *
    129 * input:
    130 * - scip : SCIP main data structure
    131 * - benders : the Benders' decomposition itself
    132 */
    133#define SCIP_DECL_BENDERSEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    134
    135/** presolving initialization method of the Benders' decomposition (called when presolving is about to begin)
    136 *
    137 * This function is called immediately after the auxiliary variables are created in the master problem. The callback
    138 * provides the user an opportunity to add variable data to the auxiliary variables.
    139 *
    140 * input:
    141 * - scip : SCIP main data structure
    142 * - benders : the Benders' decomposition itself
    143 */
    144#define SCIP_DECL_BENDERSINITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    145
    146/** presolving deinitialization method of the Benders' decomposition (called after presolving has been finished)
    147 *
    148 * input:
    149 * - scip : SCIP main data structure
    150 * - benders : the Benders' decomposition itself
    151 */
    152#define SCIP_DECL_BENDERSEXITPRE(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    153
    154/** solving process initialization method of Benders' decomposition (called when branch and bound process is about to begin)
    155 *
    156 * This method is called when the presolving was finished and the branch and bound process is about to begin.
    157 * The Benders' decomposition may use this call to initialize its branch and bound specific data.
    158 *
    159 * input:
    160 * - scip : SCIP main data structure
    161 * - benders : the Benders' decomposition itself
    162 */
    163#define SCIP_DECL_BENDERSINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    164
    165/** solving process deinitialization method of Benders' decomposition (called before branch and bound process data is freed)
    166 *
    167 * This method is called before the branch and bound process is freed.
    168 * The Benders' decomposition should use this call to clean up its branch and bound data.
    169 *
    170 * input:
    171 * - scip : SCIP main data structure
    172 * - benders : the Benders' decomposition itself
    173 */
    174#define SCIP_DECL_BENDERSEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders)
    175
    176/** the method for creating the Benders' decomposition subproblem. This method is called during the initialisation stage
    177 * (after the master problem was transformed).
    178 *
    179 * @note When the create subproblem callback is invoked, the mapping between the master problem and subproblem
    180 * variables must be available. The create subproblem callback is invoked immediately after BENDERSINIT. So, it is
    181 * possible to construct the variable mapping within the BENDERSINIT callback.
    182 *
    183 * This method must register the SCIP instance for the subproblem with the Benders' decomposition core by calling
    184 * SCIPaddBendersSubproblem. Typically, the user must create the SCIP instances for the subproblems. These can be
    185 * created within a reader or probdata and then registered with the Benders' decomposition core during the call of this
    186 * callback. If there are any settings required for solving the subproblems, then they should be set here. However,
    187 * some settings will be overridden by the standard solving method included in the Benders' decomposition framework.
    188 * If a special solving method is desired, the user can implement the bendersSolvesubXyz callback. In this latter case,
    189 * it is possible to provide a NULL pointer to SCIPaddBendersSubproblem. This will ensure that no internal solving
    190 * methods available within the Benders' decomposition core are invoked during the solving process.
    191 *
    192 * If the user defines a subproblem solving method, then in BENDERSCREATESUB, the user must explicitly specify the
    193 * subproblem type. This is necessary because the dual solutions from convex problems can be used to generate cuts.
    194 * The classical Benders' optimality and feasibility cuts require that the subproblems are convex. The subproblem type
    195 * is specified by calling SCIPbendersSetSubproblemType. The available subproblem types are defined in
    196 * SCIP_BENDERSSUBTYPE.
    197 *
    198 * If the user does NOT implement a subproblem solving method, then the convexity of the problem is determined
    199 * internally.
    200 *
    201 * input:
    202 * - scip : SCIP main data structure
    203 * - benders : the Benders' decomposition data structure
    204 * - probnumber : the subproblem problem number
    205 */
    206#define SCIP_DECL_BENDERSCREATESUB(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, int probnumber)
    207
    208/** called before the subproblem solving loop for Benders' decomposition. The pre subproblem solve function gives the
    209 * user an oppportunity to perform any global set up for the Benders' decomposition.
    210 *
    211 * input:
    212 * - scip : SCIP main data structure
    213 * - benders : the Benders' decomposition data structure
    214 * - sol : the solution that will be checked in the subproblem. Can be NULL.
    215 * - type : the enforcement type that called the Benders' decomposition solve.
    216 * - checkint : should the integer subproblems be checked.
    217 * - infeasible : flag to return whether the master problem in infeasible with respect to the added cuts
    218 * - auxviol : set to TRUE only if the solution is feasible but the aux vars are violated
    219 * - skipsolve : flag to return whether the current subproblem solving loop should be skipped
    220 * - result : a result to be returned to the Benders' constraint handler if the solve is skipped. If the
    221 * solve is not skipped, then the returned result is ignored.
    222 *
    223 * possible return values for *result (if more than one applies, the first in the list should be used):
    224 * - SCIP_DIDNOTRUN : the subproblem was not solved in this iteration. Other decompositions will be checked.
    225 * - SCIP_CONSADDED : a constraint has been added to the master problem. No other decompositions will be checked.
    226 * - SCIP_SEPARATED : a cut has been added to the master problem. No other decompositions will be checked.
    227 * - SCIP_FEASIBLE : feasibility of the solution is reported to SCIP. Other decompositions will be checked.
    228 * - SCIP_INFEASIBLE : infeasibility of the solution is reported to SCIP. No other decompositions will be checked.
    229 */
    230#define SCIP_DECL_BENDERSPRESUBSOLVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol,\
    231 SCIP_BENDERSENFOTYPE type, SCIP_Bool checkint, SCIP_Bool* infeasible, SCIP_Bool* auxviol, SCIP_Bool* skipsolve,\
    232 SCIP_RESULT* result)
    233
    234/** the solving method for a convex Benders' decomposition subproblem. This call back is provided to solve problems
    235 * for which the dual soluitons are used to generate Benders' decomposition cuts. In the classical Benders'
    236 * decomposition implementation, this would be an LP. However, it can be any convex problem where the dual solutions
    237 * are given by a single vector of reals.
    238 *
    239 * In the Benders' decomposition subproblem solving process, there are two solving loops. The first is where the convex
    240 * subproblems, and the convex relaxations of subproblems, are solved. If no cuts are generated after this solving
    241 * loop, then the second loop solves subproblems defined as CIPs. This callback is executed during the FIRST solving
    242 * loop only.
    243 *
    244 * In the classical Benders' decomposition implementation, if the subproblems are all LPs the only the
    245 * BENDERSSOLVESUBCONVEX need to be implemented. If the subproblems are MIPs, then it is useful to only implement a
    246 * single SCIP instance for the subproblem and then change the variable types of the appropriate variables to
    247 * CONTINUOUS for the CONVEX subproblem solve and to INTEGER for the CIP subproblem solve.
    248 *
    249 * The solving methods are separated so that they can be called in parallel.
    250 *
    251 * NOTE: The solving methods must be thread safe.
    252 *
    253 * This method is called from within the execution method.
    254 *
    255 * input:
    256 * - scip : SCIP main data structure
    257 * - benders : the Benders' decomposition data structure
    258 * - sol : the solution that will be checked in the subproblem. Can be NULL.
    259 * - probnumber : the subproblem problem number
    260 * - onlyconvexcheck : flag to indicate that only the convex relaxations will be checked in this solving loop. This is
    261 * a feature of the Large Neighbourhood Benders' Search
    262 * - objective : variable to return the objective function value of the subproblem
    263 * - result : the result from solving the subproblem
    264 *
    265 * possible return values for *result (if more than one applies, the first in the list should be used):
    266 * - SCIP_DIDNOTRUN : the subproblem was not solved in this iteration
    267 * - SCIP_FEASIBLE : the subproblem is solved and is feasible
    268 * - SCIP_INFEASIBLE : the subproblem is solved and is infeasible
    269 * - SCIP_UNBOUNDED : the subproblem is solved and is unbounded
    270 */
    271#define SCIP_DECL_BENDERSSOLVESUBCONVEX(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol,\
    272 int probnumber, SCIP_Bool onlyconvexcheck, SCIP_Real* objective, SCIP_RESULT* result)
    273
    274/** the solving method for a Benders' decomposition subproblem as a CIP. This call back is provided to solve problems
    275 * for which the dual solutions are not well defined. In this case, the cuts are typically generated from the primal
    276 * solution to the CIP. In the classical Benders' decomposition implementation, this would be a MIP. However, it can
    277 * be any CIP.
    278 *
    279 * In the Benders' decomposition subproblem solving process, there are two solving loops. The first is where the convex
    280 * subproblems, and the convex relaxations of subproblems, are solved. If no cuts are generated after this solving
    281 * loop, then the second loop solves subproblems defined as CIPs. This callback is executed during the SECOND solving
    282 * loop only.
    283 *
    284 * The solving methods are separated so that they can be called in parallel.
    285 *
    286 * NOTE: The solving methods must be thread safe.
    287 *
    288 * This method is called from within the execution method.
    289 *
    290 * input:
    291 * - scip : SCIP main data structure
    292 * - benders : the Benders' decomposition data structure
    293 * - sol : the solution that will be checked in the subproblem. Can be NULL.
    294 * - probnumber : the subproblem problem number
    295 * - objective : variable to return the objective function value of the subproblem
    296 * - result : the result from solving the subproblem
    297 *
    298 * possible return values for *result (if more than one applies, the first in the list should be used):
    299 * - SCIP_DIDNOTRUN : the subproblem was not solved in this iteration
    300 * - SCIP_FEASIBLE : the subproblem is solved and is feasible
    301 * - SCIP_INFEASIBLE : the subproblem is solved and is infeasible
    302 * - SCIP_UNBOUNDED : the subproblem is solved and is unbounded
    303 */
    304#define SCIP_DECL_BENDERSSOLVESUB(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol, int probnumber,\
    305 SCIP_Real* objective, SCIP_RESULT* result)
    306
    307/** the post-solve method for Benders' decomposition. The post-solve method is called after the subproblems have
    308 * been solved but before they have been freed. After the solving of the Benders' decomposition subproblems, the
    309 * subproblem solving data is freed in the SCIP_DECL_BENDERSFREESUB callback. However, it is not necessary to implement
    310 * SCIP_DECL_BENDERSFREESUB.
    311 *
    312 * If SCIP_DECL_BENDERSFREESUB is not implemented, then the Benders' decomposition framework will perform a default
    313 * freeing of the subproblems. If a subproblem is an LP, then they will be in probing mode for the subproblem
    314 * solve. So the freeing process involves ending the probing mode. If the subproblem is a MIP, then the subproblem is
    315 * solved by calling SCIPsolve. As such, the transformed problem must be freed after each subproblem solve.
    316 *
    317 * This callback provides the opportunity for the user to clean up any data structures that should not exist beyond the current
    318 * iteration.
    319 * The user has full access to the master and subproblems in this callback. So it is possible to construct solution for
    320 * the master problem in the method.
    321 * Additionally, if there are any subproblems that are infeasibility and this can not be resolved, then the it is
    322 * possible to merge these subproblems into the master problem. The subproblem indices are given in the mergecands
    323 * array. The merging can be perform by a user defined function or by calling SCIPmergeBendersSubproblemIntoMaster. If a
    324 * subproblem was merged into the master problem, then the merged flag must be set to TRUE.
    325 *
    326 * input:
    327 * - scip : SCIP main data structure
    328 * - benders : the Benders' decomposition data structure
    329 * - sol : the solution that was checked by solving the subproblems. Can be NULL.
    330 * - type : the enforcement type that called the Benders' decomposition solve.
    331 * - mergecands : the subproblems that are candidates for merging into the master problem, the first
    332 * npriomergecands are the priority candidates (they should be merged). The remaining
    333 * (nmergecands - npriomergecands) are subproblems that could be merged if desired.
    334 * - npriomergecands : the number of priority merge candidates.
    335 * - nmergecands : the total number of subproblems that are candidates for merging into the master problem
    336 * - checkint : should the integer subproblems be checked.
    337 * - infeasible : indicates whether at least one subproblem is infeasible
    338 * - merged : flag to indicate whether a subproblem was merged into the master problem.
    339 */
    340#define SCIP_DECL_BENDERSPOSTSOLVE(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_SOL* sol,\
    341 SCIP_BENDERSENFOTYPE type, int* mergecands, int npriomergecands, int nmergecands, SCIP_Bool checkint,\
    342 SCIP_Bool infeasible, SCIP_Bool* merged)
    343
    344/** frees the subproblem so that it can be resolved in the next iteration. As stated above, it is not necessary to
    345 * implement this callback. If the callback is implemented, the subproblems should be freed by calling
    346 * SCIPfreeTransform(). However, if the subproblems are LPs, then it could be more efficient to put the subproblem
    347 * into probing mode prior to solving and then exiting the probing mode during the callback. To put the subproblem into
    348 * probing mode, the subproblem must be in SCIP_STAGE_SOLVING. This can be achieved by using eventhandlers.
    349 *
    350 * If SCIP_DECL_BENDERSFREESUB is not implemented, then the Benders' decomposition framework will perform a default
    351 * freeing of the subproblems. If a subproblem is an LP, then they will be in probing mode for the subproblem
    352 * solve. So the freeing process involves ending the probing mode. If the subproblem is a MIP, then the subproblem is
    353 * solved by calling SCIPsolve. As such, the transformed problem must be freed after each subproblem solve.
    354 *
    355 * NOTE: The freeing methods must be thread safe.
    356 *
    357 * input:
    358 * - scip : SCIP main data structure
    359 * - benders : the Benders' decomposition data structure
    360 * - probnumber : the subproblem problem number
    361 */
    362#define SCIP_DECL_BENDERSFREESUB(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, int probnumber)
    363
    364/** the variable mapping from the subproblem to the master problem. It is neccessary to have a mapping between every
    365 * master problem variable and its counterpart in the subproblem. This mapping must go both ways: from master to sub
    366 * and sub to master.
    367 *
    368 * This method is called when generating the cuts. The cuts are generated by using the solution to the subproblem to
    369 * eliminate a solution to the master problem.
    370 *
    371 * input:
    372 * - scip : SCIP main data structure
    373 * - benders : the Benders' decomposition structure
    374 * - var : the variable for which the corresponding variable in the master or subproblem is required
    375 * - mappedvar : pointer to store the variable that is mapped to var
    376 * - probnumber : the number of the subproblem that the desired variable belongs to, -1 for the master problem
    377 */
    378#define SCIP_DECL_BENDERSGETVAR(x) SCIP_RETCODE x (SCIP* scip, SCIP_BENDERS* benders, SCIP_VAR* var,\
    379 SCIP_VAR** mappedvar, int probnumber)
    380
    381#ifdef __cplusplus
    382}
    383#endif
    384
    385#endif
    common defines and data types used in all packages of SCIP
    SCIP_BendersEnfoType
    Definition: type_benders.h:50
    @ SCIP_BENDERSENFOTYPE_RELAX
    Definition: type_benders.h:52
    @ SCIP_BENDERSENFOTYPE_LP
    Definition: type_benders.h:51
    @ SCIP_BENDERSENFOTYPE_CHECK
    Definition: type_benders.h:54
    @ SCIP_BENDERSENFOTYPE_PSEUDO
    Definition: type_benders.h:53
    enum SCIP_BendersObjectiveType SCIP_BENDERSOBJTYPE
    Definition: type_benders.h:91
    SCIP_BendersSubStatus
    Definition: type_benders.h:68
    @ SCIP_BENDERSSUBSTATUS_AUXVIOL
    Definition: type_benders.h:71
    @ SCIP_BENDERSSUBSTATUS_UNKNOWN
    Definition: type_benders.h:69
    @ SCIP_BENDERSSUBSTATUS_INFEAS
    Definition: type_benders.h:72
    @ SCIP_BENDERSSUBSTATUS_OPTIMAL
    Definition: type_benders.h:70
    SCIP_BendersObjectiveType
    Definition: type_benders.h:87
    @ SCIP_BENDERSOBJTYPE_SUM
    Definition: type_benders.h:88
    @ SCIP_BENDERSOBJTYPE_MAX
    Definition: type_benders.h:89
    SCIP_BendersSubType
    Definition: type_benders.h:77
    @ SCIP_BENDERSSUBTYPE_NONCONVEXDIS
    Definition: type_benders.h:81
    @ SCIP_BENDERSSUBTYPE_CONVEXCONT
    Definition: type_benders.h:78
    @ SCIP_BENDERSSUBTYPE_NONCONVEXCONT
    Definition: type_benders.h:80
    @ SCIP_BENDERSSUBTYPE_CONVEXDIS
    Definition: type_benders.h:79
    @ SCIP_BENDERSSUBTYPE_UNKNOWN
    Definition: type_benders.h:82
    enum SCIP_BendersSubType SCIP_BENDERSSUBTYPE
    Definition: type_benders.h:84
    SCIP_BendersSolveLoop
    Definition: type_benders.h:59
    @ SCIP_BENDERSSOLVELOOP_CIP
    Definition: type_benders.h:61
    @ SCIP_BENDERSSOLVELOOP_CONVEX
    Definition: type_benders.h:60
    @ SCIP_BENDERSSOLVELOOP_USERCONVEX
    Definition: type_benders.h:62
    @ SCIP_BENDERSSOLVELOOP_USERCIP
    Definition: type_benders.h:63
    enum SCIP_BendersSolveLoop SCIP_BENDERSSOLVELOOP
    Definition: type_benders.h:65
    enum SCIP_BendersEnfoType SCIP_BENDERSENFOTYPE
    Definition: type_benders.h:56
    enum SCIP_BendersSubStatus SCIP_BENDERSSUBSTATUS
    Definition: type_benders.h:74
    struct SCIP_BendersData SCIP_BENDERSDATA
    Definition: type_benders.h:94
    type definitions for return codes for SCIP methods
    type definitions for SCIP's main datastructure