Scippy

    SCIP

    Solving Constraint Integer Programs

    xternal.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2026 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 xternal.c
    26 * @brief main document page
    27 * @author Tobias Achterberg
    28 * @author Timo Berthold
    29 * @author Tristan Gally
    30 * @author Gerald Gamrath
    31 * @author Stefan Heinz
    32 * @author Gregor Hendel
    33 * @author Mathias Kinder
    34 * @author Marc Pfetsch
    35 * @author Stefan Vigerske
    36 * @author Robert Waniek
    37 * @author Kati Wolter
    38 * @author Michael Winkler
    39 */
    40
    41/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    42
    43/** @mainpage Overview
    44 *
    45 * @section WHATISSCIP What is SCIP?
    46 *
    47 * \SCIP is a framework to solve constraint integer programs (CIPs) and mixed-integer nonlinear programs. In particular,
    48 *
    49 * - \SCIP incorporates a mixed-integer programming (MIP) solver as well as
    50 * - an LP based mixed-integer nonlinear programming (MINLP) solver, and
    51 * - is a framework for branch-cut-and-price.
    52 *
    53 * Since version 10, \SCIP can optionally be configured to solve mixed-integer linear programs in a numerically exact
    54 * solving mode and produce certificates that can be independently verified, see \ref EXACT "How to use the numerically exact solving mode" for details.
    55 *
    56 * See the web site of <a href="http://scipopt.org">\SCIP</a> for more information about licensing and how to download \SCIP.
    57 *
    58 * <b style="color: blue">If you are new to SCIP and don't know where to start you should have a look at the
    59 * @ref GETTINGSTARTED "first steps walkthrough"
    60 * .</b>
    61 *
    62 * @section TABLEOFCONTENTS Structure of this manual
    63 *
    64 * This manual gives an accessible introduction to the functionality of the SCIP code in the following chapters
    65 *
    66 * Setup and news
    67 * - @subpage INSTALL
    68 * - @subpage FAQ
    69 * - @subpage CHG
    70 *
    71 * Tutorials and guides
    72 * - @subpage GETTINGSTARTED
    73 * - @subpage SHELL
    74 * - @subpage PROGRAMMING "Important programming concepts for working with(in) SCIP"
    75 * - @subpage START
    76 * - @subpage DOC
    77 * - @subpage HOWTOADD "Detailed guides for adding user plugins"
    78 * - @subpage HOWTOUSESECTION "Detailed guides for advanced SCIP topics"
    79 *
    80 * Examples and applications
    81 * - @subpage EXAMPLES "Coding examples in C and C++ in the source code distribution"
    82 * - @subpage APPLICATIONS "Extensions of SCIP for specific applications"
    83 *
    84 * References
    85 * - @subpage WHATPROBLEMS "Supported types of optimization problems"
    86 * - @subpage FILEREADERS "Readable file formats"
    87 * - @subpage INTERFACES
    88 * - @subpage PARAMETERS
    89 * - @subpage AUTHORS "SCIP Authors"
    90 * - @subpage LICENSE
    91 * - @subpage EXTERNALDOC "Links to external documentation"
    92 *
    93 *
    94 * @section QUICKSTART Quickstart
    95 *
    96 * Let's consider the following minimal example in LP format. A 4-variable problem with a single, general integer
    97 * variable and three linear constraints
    98 *
    99 * \verbinclude simple.lp
    100 *
    101 * Saving this file as "simple.lp" allows to read it into SCIP and solve it by calling the scip binary with the `-f` flag to solve the problem from the provided file and exit.
    102 *
    103 * ```
    104 * scip -f simple.lp
    105 * ```
    106 * reads and optimizes this model in no time:
    107 *
    108 * \verbinclude output.log
    109 *
    110 * @version 10.0.1
    111 *
    112 * \image html scippy.png
    113 */
    114
    115/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    116
    117/** @page LPI Available implementations of the LP solver interface
    118 *
    119 * SCIP provides a range of different interfaces to LP solvers:
    120 *
    121 * LPI name | LP solver
    122 * ---------|----------
    123 * `spx` | SoPlex
    124 * `cpx` | IBM ILOG CPLEX
    125 * `xprs` | FICO XPress
    126 * `grb` | Gurobi (version at least 7.0.2 required)
    127 * `clp` | COIN-OR CLP (interface currently sometimes produces wrong results)
    128 * `glop` | Google Glop (contained in OR-tools)
    129 * `msk` | Mosek (version at least 7.0.0 required)
    130 * `qsopt` | QSopt (experimental)
    131 * `highs` | HiGHS (beta, sometimes failing)
    132 * `none` | disables LP solving entirely (not recommended; only for technical reasons)
    133 */
    134
    135/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    136
    137/** @page LPIEXACT Available implementations of the numerically exact LP solver interface
    138 *
    139 * SCIP provides the following interfaces to exact LP solvers:
    140 *
    141 * LPI name | LP solver
    142 * ---------|----------
    143 * `spx` | SoPlex
    144 * `qsoptex`| QSopt_ex (experimental)
    145 * `none` | no exact LP solver linked
    146 */
    147
    148/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    149
    150/** @page NLPISOLVERS Available implementations of the NLP solver interface
    151 *
    152 * SCIP implements the NLP solver interface for the solvers <a href="https://conopt.com">CONOPT</a>, <a href="https://github.com/coin-or/Ipopt">IPOPT</a>, <a
    153 * href="https://worhp.de/">WORHP</a>, and <a href="http://www.mcs.anl.gov/~leyffer/solvers.html">FilterSQP</a>. In
    154 * contrast to the implementations of the LP solver interface, SCIP can be compiled with multiple NLP solvers and selects
    155 * the solver with the highest priority at the beginning of the solving process.
    156 * Currently, the priorities are, in descending order: CONOPT, Ipopt, WORHP/IP, FilterSQP, WORHP/SQP.
    157 *
    158 * If more than one solver is available, then it is possible to solve all NLPs during the solving process with all
    159 * available NLP solvers by setting the parameter `nlpi/all/priority` to the highest value.
    160 * In this case, SCIP uses the solution from a solver that provides the best objective value. Other possible use
    161 * cases for the availability of multiple solvers have not been implemented yet.
    162 *
    163 * In the @ref MAKE "GNU make" based build system, building the implementations of the interface for CONOPT, FilterSQP, IPOPT, and
    164 * WORHP can be enabled by specifying `CONOPT=true`, `FILTERSQP=true`, `IPOPT=true`, and `WORHP=true`, respectively, as argument to the
    165 * `make` call.
    166 * In the @ref CMAKE "CMAKE" based build system, building the implementation of the interface for CONOPT, IPOPT and WORHP can be
    167 * enabled by specifying `CONOPT=on`, `IPOPT=on` and `WORHP=on`, respectively, as argument to the `cmake` call.
    168 *
    169 * @section NLPISOLVERS_CONOPT CONOPT
    170 *
    171 * <b>CONOPT</b> is a feasible path solver based on advanced active set methods. Originally developed by ARKI Consulting
    172 * & Development A/S in Denmark, CONOPT was acquired by GAMS in 2024. It is free for academic uses and is available at
    173 * <a href="https://www.conopt.com">https://www.conopt.com</a>.
    174 *
    175 * @section NLPISOLVERS_IPOPT IPOPT
    176 *
    177 * <b>IPOPT</b> implements a primal-dual interior point method and uses line searches based on filter methods. It has
    178 * been developed by Andreas W&auml;chter and Carl Laird and is available under the Eclipse Public License on <a
    179 * href="https://www.coin-or.org/">COIN-OR</a>.
    180 *
    181 * @section NLPISOLVERS_WORHP WORHP
    182 *
    183 * <b>WORHP</b> implements a sequential quadratic programming method and a penalty-interior point algorithm. It is
    184 * developed at the <a href="https://www.uni-bremen.de/en/">University of Bremen</a> and is free for academic
    185 * purposes.
    186 *
    187 * @section NLPISOLVERS_FILTERSQP FilterSQP
    188 *
    189 * <b>FilterSQP</b> implements a sequential quadratic programming method. It has been developed by Roger Fletcher
    190 * and Sven Leyffer. It is not publicly available, but may be obtained from Sven Leyffer on request.
    191 */
    192
    193/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    194
    195/**@page GETTINGSTARTED First Steps Walkthrough
    196 *
    197 * @section GETTINGSTARTED_BLACKBOX Use SCIP to solve a problem
    198 *
    199 * @subsection GETTINGSTARTED_BLACKBOX_WHY Why SCIP?
    200 *
    201 * Charlotte lectures at a university and she wants her students to get in touch with solving constraint integer programs (CIPs).
    202 * She would like to use SCIP for this purpose because it allows the students to look at the full source code
    203 * and SCIP comes with a permissive open source \ref LICENSE "license".
    204 * Also, her advisor told her that there are various \ref INTERFACES "interfaces" to SCIP.
    205 *
    206 * @subsection GETTINGSTARTED_BLACKBOX_PROBLEMS What Kinds Of Problems?
    207 *
    208 * As a first step she checks \ref WHATPROBLEMS "what types of problems" \SCIP can solve and
    209 * \ref FILEREADERS "what are readable formats", and is happy to find MIPs to be among them.
    210 *
    211 * @subsection GETTINGSTARTED_BLACKBOX_INSTALL Setup
    212 *
    213 * Charlotte now needs to \ref INSTALL "install SCIP".
    214 * She works on a recent computer with a windows system and already has the <a href="https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads">Visual C++ Redistributable Packages</a> and <a href="https://github.com/oneapi-src/oneTBB">TBB</a> installed.
    215 *
    216 * Having these prerequisites in place, Charlotte downloads the 64-bit windows exectuable from the <a href="https://scipopt.org/index.php#download">download page</a> and installs it without a problem.
    217 * They also read about the <a href="http://www.pokutta.com/blog/pages/scip/scip-teaching.html"> dockerized SCIP container</a> which she wants
    218 * to recommend to her students, in case they are unable to install SCIP on their own machines.
    219 *
    220 * @subsection GETTINGSTARTED_BLACKBOX_SOLVE Solve A First Problem
    221 *
    222 * To test her installation and get a first feeling for SCIP, Charlotte follows the steps described in the \ref QUICKSTART "quickstart" section to solve a first simple lp problem.
    223 *
    224 * She has just solved a problem, using SCIP in the command-based mode, by passing a command to the scip call via the `-c` flag.
    225 * These commands can also be typed into the interactive shell, that one uses by just calling the binary `scip`.
    226 *
    227 * After the first solution process worked like a charm, Charlotte downloads a more complicated problem file from the <a href="https://miplib.zib.de/instance_details_enlight_hard.html">MIPLIB 2017</a> page
    228 * and follows the \ref SHELL_AFTERINSTALL "interactive shell tutorial".
    229 * There, she already learns quite a lot about the solving process and how to work with the interactive shell.
    230 *
    231 * @subsection GETTINGSTARTED_BLACKBOX_HELP Getting Help
    232 *
    233 * Feeling happy about having already solved some instances and having worked in interactive mode, Charlotte is curious on what more options SCIP has.
    234 * She types `scip -h` to find out.
    235 *
    236 * She feels confident to being able to understand and use some of the other options, like `-l` to write the output to a logfile, or `-b` to pass a file containing the commands to be executed by scip.
    237 * There are some commands that do not yet make a lot of sense to her, but she doesn't worry about it for now.
    238 * She will familiarize herself with it over time and with experience.
    239 *
    240 * @section GETTINGSTARTED_DEVELOP Develop A Custom Plugin
    241 *
    242 * Alex is a researcher in Charlotte's group and is working on problems that have a very special structure that he hopes to be able to exploit in the solving process.
    243 *
    244 * Alex heard Charlotte talk about SCIP.
    245 * She explained that SCIP is plugin-based, that is, different components (plugins) are implemented using a generic interface and that it is very easy to write your own plugins, like constraint handlers, heuristics etc.
    246 * So Alex decides to give it a go and dive into SCIP.
    247 *
    248 * @subsection GETTINGSTARTED_DEVELOP_PREREQUISITES Prerequisites And Setup
    249 *
    250 * After some time of using SCIP, he feels confident enough to dig into the source code and decides to write his own plugin.
    251 * Alex likes to use his linux machine for developing code, because in his experience compilation is easiest there.
    252 *
    253 * He starts by downloading the latest <a href="http://scipopt.org/#download">source code tarball</a>,
    254 * unpacking it and compiling via \ref CMAKE "cmake", typing `mkdir build; cd build; cmake ..; make`.
    255 *
    256 * @subsection GETTINGSTARTED_DEVELOP_HELP Getting help
    257 *
    258 * Before writing any code, he quickly scans over the contents of the \ref PROGRAMMING "Programming with SCIP" page,
    259 * so that he knows about some of the pitfalls, best practices and mechanisms.
    260 * If a problem comes up later or he gets stuck, he knows what to look out for and where to find help.
    261 *
    262 * Whenever Alex gets stuck inside the code, he makes use of the extensive documentation to \ref DOC "search for interface functions".
    263 *
    264 * @subsection GETTINGSTARTED_DEVELOP_EXAMPLE Writing An Example
    265 *
    266 * Alex is now ready to write his very first example, he creates a new folder `MinEx` under `examples` and puts two files in there:
    267 * `CMakeLists.txt`:
    268 * ```
    269 * cmake_minimum_required(VERSION 3.11)
    270 *
    271 * project(minex)
    272 * find_package(SCIP REQUIRED)
    273 * include_directories(${SCIP_INCLUDE_DIRS})
    274 *
    275 * add_executable(minex
    276 * src/cmain.c)
    277 *
    278 * target_link_libraries(minex ${SCIP_LIBRARIES})
    279 *
    280 * if( TARGET examples )
    281 * add_dependencies( examples minex )
    282 * endif()
    283 * ```
    284 *
    285 * and `cmain.c` in a subfolder `src`:
    286 * ```
    287 * #include <string.h>
    288 * #include <scip/scip.h>
    289 *
    290 * int main( int argc, char** argv )
    291 * {
    292 * SCIP* scip = NULL;
    293 * SCIP_CALL( SCIPcreate(&scip) ); // initialize SCIP
    294 * SCIPinfoMessage(scip, NULL, "Hello world.\n"); // output greeting
    295 * SCIP_CALL( SCIPfree(&scip) ); // free SCIP
    296 * BMScheckEmptyMemory();
    297 * return 0;
    298 * }
    299 * ```
    300 *
    301 * This is a minimal example that just prints "Hello world." and exits.
    302 * Alex compiles and runs it via cmake with the following command:
    303 * ```
    304 * mkdir build; cd build; cmake .. -DSCIP_DIR=../../build/; make; ./minex
    305 * ```
    306 *
    307 * After having successfully written this minimal example, Alex follows the instructions to \ref START "start a new project" to start his actual project and extend this most basic code.
    308 *
    309 * @subsection GETTINGSTARTED_DEVELOP_CONSTRAINTHANDLER Writing A Plugin
    310 *
    311 * Alex now needs a custom constraint handler in his project, for that he will write a custom plugin.
    312 * He looks up the instructions in the \ref HOWTOADD "How to add..." page and is
    313 * very happy to find \ref CONS "a page with a detailed description" what he has to do.
    314 *
    315 * Furthermore he found exercises for implementing plugins for the example of the
    316 * linear ordering problem. The corresponding code framework
    317 * (<a href="https://scipopt.org/workshop2018/pyscipopt-exercises.tgz">Python</a> or
    318 * <a href="https://scipopt.org/workshop2018/exercise.pdf">C/C++</a>)
    319 * could form a good starting point for a new project as well.
    320 *
    321 * @subsection GETTINGSTARTED_DEVELOP_REOPTMIZATION Using Functionality In A Plugin
    322 *
    323 * After implementing his own constraint handler Alex realizes that he needs to use repotimization in his project.
    324 * He looks up the \ref HOWTOUSESECTION "How to use..." section and finds some more information about \ref REOPT "how to use reoptimization".
    325 *
    326 */
    327
    328/**@page INSTALL Installing SCIP
    329 *
    330 * There are two options to get a running SCIP on your system.
    331 * You can either use one of the installers or you can compile it yourself.
    332 *
    333 * Which one you choose depends on your use case and your level of expertise.
    334 * If you just want to use SCIP as a black box solver you should use an installer with a precompiled binary from the <a href="http://scipopt.org/#download">download section</a>.
    335 * This is highly recommended for new users.
    336 * If you are just curious and want to try it out you can use the <a href="http://www.pokutta.com/blog/pages/scip/scip-teaching.html"> dockerized SCIP container</a>.
    337 *
    338 * However, if you want to develop your own plugin for SCIP, you have to compile SCIP or the SCIPOptSuite from source code, which are available as a tarball from the <a href="http://scipopt.org/#download">download page</a>.
    339 * Note that you might need some level of experience to be able to do this, this is described in the following.
    340 *
    341 * SCIP lets you choose freely between its own, manually maintained Makefile system
    342 * or the CMake cross platform build system generator. For new users, we strongly
    343 * recommend to use CMake, if available on their targeted platform.
    344 *
    345 * Be aware that generated libraries and binaries of both systems might be different and incompatible.
    346 *
    347 * - @subpage md_INSTALL "Installation instructions"
    348 * - @subpage LPI "Available implementations of the LP solver interface"
    349 * - @subpage LPIEXACT "Available implementations of the exact LP solver interface"
    350 * - @subpage NLPISOLVERS "Available implementations of the NLP solver interface"
    351 * - @subpage INSTALL_APPLICATIONS_EXAMPLES "Installation of applications and examples"
    352 */
    353
    354/**@page PROGRAMMING Programming with SCIP
    355 *
    356 * - @subpage CODE "Coding style guidelines"
    357 * - @subpage SRCORGA "Organization of source code"
    358 * - @subpage OBJ "Creating, capturing, releasing, and adding data objects"
    359 * - @subpage MEMORY "Using the memory functions of SCIP"
    360 * - @subpage DEBUG "Debugging"
    361 * - @subpage STAGES "SCIP stages"
    362 */
    363
    364/**@page HOWTOADD How to add ...
    365 *
    366 * Below you find for most plugin types a detailed description of how to implement and add them to \SCIP.
    367 *
    368 * - @subpage CONS "Constraint handlers"
    369 * - @subpage PRICER "Variable pricers"
    370 * - @subpage PRESOL "Presolvers"
    371 * - @subpage SEPA "Separators"
    372 * - @subpage PROP "Propagators"
    373 * - @subpage BRANCH "Branching rules"
    374 * - @subpage CUTSEL "Cut selectors"
    375 * - @subpage NODESEL "Node selectors"
    376 * - @subpage HEUR "Primal heuristics"
    377 * - @subpage IISFINDER "IIS finders"
    378 * - @subpage DIVINGHEUR "Diving heuristics"
    379 * - @subpage RELAX "Relaxation handlers"
    380 * - @subpage READER "File readers"
    381 * - @subpage DIALOG "Dialogs"
    382 * - @subpage DISP "Display columns"
    383 * - @subpage EVENT "Event handler"
    384 * - @subpage EXPRHDLR "Expression handlers"
    385 * - @subpage NLHDLR "Nonlinear handlers"
    386 * - @subpage NLPI "Interfaces to NLP solvers"
    387 * - @subpage EXPRINT "Interfaces to expression interpreters"
    388 * - @subpage PARAM "additional user parameters"
    389 * - @subpage TABLE "Statistics tables"
    390 * - @subpage BENDER "Benders' decomposition"
    391 * + @subpage BENDERSCUT "Benders' decomposition cuts"
    392 */
    393
    394/**@page HOWTOUSESECTION How to use ...
    395 *
    396 * - @subpage TEST "How to run automated tests with SCIP"
    397 * - @subpage EXACT "How to use the numerically exact solving mode"
    398 * - @subpage CONF "How to use conflict analysis"
    399 * - @subpage COUNTER "How to use SCIP to count feasible solutions"
    400 * - @subpage REOPT "How to use reoptimization in SCIP"
    401 * - @subpage CONCSCIP "How to use the concurrent solving mode in SCIP"
    402 * - @subpage MINUCIIS "How to deduce reasons for infeasibility in SCIP"
    403 * - @subpage DECOMP "How to provide a problem decomposition"
    404 * - @subpage BENDDECF "How to use the Benders' decomposition framework"
    405 * - @subpage TRAINESTIMATION "How to train custom tree size estimation for SCIP"
    406 * - @subpage SYMMETRY "How to use symmetry handling in SCIP"
    407 * - @subpage PROBINGDIVING "How to use probing and diving mode"
    408 */
    409
    410/**@page AUTHORS SCIP Authors
    411 *
    412 * A list of all current and former developers as well as contributors can
    413 * be found on the
    414 * <a class="el" href="http://scipopt.org/#developers">Main Web Page</a>.
    415 *
    416 */
    417
    418/**@page EXTERNALDOC Links to external documentation
    419 *
    420 * <a class="el" href="https://www.cgudapati.com/integer-programming/2019/12/15/Getting-Started-With-SCIP-Optimization-Suite.html">Getting Started with SCIP optimization in C++: A toy example</a> by Chaitanya Gudapati.
    421 *
    422 */
    423
    424/**@page CHG Release notes and changes between different versions of SCIP
    425 *
    426 * New features, peformance improvements, and interface changes between different versions of SCIP are documented in the
    427 * release notes:
    428 *
    429 * - \subpage RN10 "SCIP 10"
    430 * - \subpage RN9 "SCIP 9"
    431 * - \subpage RN8 "SCIP 8"
    432 * - \subpage RN7 "SCIP 7.0"
    433 * - \subpage RN6 "SCIP 6.0"
    434 * - \subpage RN5 "SCIP 5.0"
    435 * - \subpage RN4 "SCIP 4.0"
    436 * - \subpage RN3_2 "SCIP 3.2"
    437 * - \subpage RN3_1 "SCIP 3.1"
    438 * - \subpage RN3_0 "SCIP 3.0"
    439 * - \subpage RN2_1 "SCIP 2.1"
    440 * - \subpage RN2_0 "SCIP 2.0"
    441 * - \subpage RN1_2 "SCIP 1.2"
    442 * - \subpage RN1_1 "SCIP 1.1"
    443 * - \subpage RN1_0 "SCIP 1.0"
    444 * - \subpage RN0_9 "SCIP 0.9"
    445 * - \subpage RN0_8 "SCIP 0.8"
    446 * - \subpage RN0_7 "SCIP 0.7"
    447 *
    448 */
    449
    450/**@page WHATPROBLEMS What types of optimization problems does SCIP solve?
    451 *
    452 * As a stand-alone solver, \SCIP can solve mixed-integer nonlinear programs \b (MINLPs), to which it applies
    453 * an LP based spatial branch-and-cut algorithm. This method is guaranteed to solve bounded MINLPs
    454 * within a given numerical tolerance in a finite amount of time. In particular, \SCIP is a stand-alone
    455 * solver for mixed-integer linear programs \b (MIPs).
    456 *
    457 * As a framework, \SCIP also provides the tools to solve constraint optimization problems defined over
    458 * integer and continuous variables. Therefore, the design of \SCIP
    459 * supports the easy integration of constraints of arbitrary type into the solver.
    460 * More precisely, \SCIP can handle the class of constraint integer programs \b (CIPs), which are constraint optimization problems
    461 * that become linear programs (LPs) after the integer variables are fixed.
    462 *
    463 * @section PROBLEMCLASSES Some important subclasses of CIP and MINLP
    464 *
    465 * The following table gives a non-exhaustive list of common types of mathematical optimization problems that can be solved
    466 * through \SCIP itself or one of its extensions. Some recommendations are given on how to compile \SCIP for a
    467 * certain problem class and how make best use of \SCIP. The file format column gives some common file
    468 * formats for every class. Note that since some of the mentioned problem classes are more general than others (like
    469 * every LP is a MIP is an MINLP), the formats for the superclass should always work just as fine, although they
    470 * may be less common for the class at hand.
    471 *
    472 * Please see also the pages on \ref EXAMPLES "SCIP Examples" and \ref APPLICATIONS "SCIP Applications" to learn more on how
    473 * to extend \SCIP for a particular MIP, MINLP, or CIP application.
    474 * All examples and applications use the C or C++ APIs of \SCIP. Please have a look at \ref INTERFACES "SCIP interfaces"
    475 * to see how to use \SCIP from within other programming languages.
    476 *
    477 * <table class="types">
    478 * <caption align="top">Some problem classes that can be solved by \SCIP</caption>
    479 * <tr style="border-bottom: medium solid black;">
    480 * <th>Problem class</th>
    481 * <th>Mathematical problem description</th>
    482 * <th>Supported file formats</th>
    483 * <th>Recommendations</th>
    484 * </tr>
    485 * <tr>
    486 * <td>Mixed-integer linear program (MIP)</td>
    487 * <td>\f{align*}{
    488 * \text{min} \quad& c^T x \\
    489 * \text{s.t.} \quad& Ax \geq b \\
    490 * &l_{j} \leq x_{j} \leq u_{j} && \forall j \in \mathcal{N} \\
    491 * &x_{j} \in \mathbb{Z} && \forall j \in \mathcal{I}
    492 * \f}
    493 * </td>
    494 * <td>
    495 * <ul>
    496 * <li>\ref reader_cip.h "CIP"</li>
    497 * <li>\ref reader_mps.h "MPS"</li>
    498 * <li>\ref reader_lp.h "LP"</li>
    499 * <li>\ref reader_zpl.h "ZPL"</li>
    500 * </ul>
    501 * </td>
    502 * <td>
    503 * <ul>
    504 * <li>\SCIP requires an external LP solver to solve LP relaxations, which needs to be specified
    505 * at compilation time. By default, it uses SoPlex (<code>LPS=spx</code>). See \ref MAKE for a
    506 * list of available LP solver interfaces and how to use them inside \SCIP.</li>
    507 * <li>Compile with Zimpl support (<code>ZIMPL=true</code>) to read in Zimpl models directly.</li>
    508 * <li>\SCIP comes with many different parameters. Use the provided emphasis settings (see \ref SHELL "this tutorial")
    509 * to change many parameters at once and boost the performance.</li>
    510 * <li>Test instances are available at <code>check/instances/MIP/</code>.</li>
    511 * </ul>
    512 * </td>
    513 * </tr>
    514 * <tr>
    515 * <td>Mixed-integer nonlinear program (MINLP)</td>
    516 * <td>\f{align*}{
    517 * \text{min} \quad& f(x) \\
    518 * \text{s.t.} \quad& g_{i}(x) \leq 0 && \forall i \in \mathcal{M} \\
    519 * &l_{j} \leq x_{j} \leq u_{j} && \forall j \in \mathcal{N} \\
    520 * &x_{j} \in \mathbb{Z} && \forall j \in \mathcal{I}
    521 * \f}
    522 * </td>
    523 * <td>
    524 * <ul>
    525 * <li>\ref reader_cip.h "CIP"</li>
    526 * <li>\ref reader_gms.h "GMS"</li>
    527 * <li>\ref reader_osil.h "OSiL"</li>
    528 * <li>\ref reader_pip.h "PIP"</li>
    529 * <li>\ref reader_zpl.h "ZPL"</li>
    530 * <li>For MIQCPS:
    531 * <ul>
    532 * <li>\ref reader_lp.h "LP"</li>
    533 * <li>\ref reader_mps.h "MPS"</li>
    534 * </ul>
    535 * </li>
    536 * </ul>
    537 * </td>
    538 * <td>
    539 * <ul>
    540 * <li>Compile with <code>CONOPT=true</code> for better performance.</li>
    541 * <li>Compile with <code>IPOPT=true</code> for better performance.</li>
    542 * <li>Compile with <code>WORHP=true</code> for better performance.</li>
    543 * <li>Compile with <code>FILTERSQP=true</code> for better performance.</li>
    544 * <li>See <a href="FAQ\FILEEXT#minlptypes"> Which kind of MINLPs are supported by \SCIP? </a> in the FAQ.</li>
    545 * <li>There is an interface for the modelling language AMPL, see \ref INTERFACES.</li>
    546 * <li>Mixed-integer quadratically constrained programs (MIQCP) can also be formulated in the file formats
    547 * <ul>
    548 * <li>\ref reader_lp.h "LP", and</li>
    549 * <li>\ref reader_mps.h "MPS".</li>
    550 * </ul>
    551 * </li>
    552 * <li>Test instances are available at <code>check/instances/MINLP/</code>.</li>
    553 * </ul>
    554 * </td>
    555 * </tr>
    556 * <tr>
    557 * <td>Constraint Integer Program (CIP)</td>
    558 * <td>\f{align*}{
    559 * \text{min} \quad& c^T x + d^T y \\
    560 * \text{s.t.} \quad& C_i(x,y) = \text{true} && \forall i \in \mathcal{M} \\
    561 * & x \in \mathbb{Z}^{p}, y \in \mathbb{R}^{n - p}
    562 * \f}
    563 * where \f$\forall i \in\mathcal{M}, \forall x^* \in \mathbb{Z}^{p},\f$ \f$ \{ y : C_i(x^*, y) = \text{true} \} \f$ is a polyhedron.
    564 * </td>
    565 * <td>
    566 * <ul>
    567 * <li>\ref reader_cip.h "CIP"</li>
    568 * <li>\ref reader_fzn.h "FlatZinc"</li>
    569 * </ul>
    570 * </td>
    571 * <td>
    572 * <ul>
    573 * <li>\SCIP supports a limited number of general constraints; see \ref CONS "How to add constraint handlers"
    574 * to learn how to extend the \SCIP framework to a given CIP.</li>
    575 * <li>Use the emphasis setting <code>set emphasis cpsolver</code> to completely disable LP solves and
    576 * use depth-first search with periodic restarts, see also
    577 * <a href="FAQ\FILEEXT#scipascpsolver"> Can I use \SCIP as a pure CP solver? </a> in the FAQ.</li>
    578 * <li>Test instances are available at <code>check/instances/CP</code>.</li>
    579 * </ul>
    580 * </td>
    581 * <tr>
    582 * <td>Convex MINLP</td>
    583 * <td>Like MINLP, \f$f\f$ and all \f$g_i\f$ are \b convex.</td>
    584 * <td>see MINLP formats</td>
    585 * <td>
    586 * <ul>
    587 * <li>See the comments for MINLP.</li>
    588 * <li>In addition, use <code>constraints/nonlinear/assumeconvex = TRUE</code> to inform \SCIP about a convex
    589 * problem in cases where the automated detection is not strong enough.</li>
    590 * <li>Test instances are available at <code>check/instances/MINLP/circle.lp</code>.</li>
    591 * </ul>
    592 * </td>
    593 * </tr>
    594 * <tr>
    595 * <td>Linear program (LP)</td>
    596 * <td>\f{align*}{
    597 * \text{min} \quad& c^T x \\
    598 * \text{s.t.} \quad& Ax \geq b \\
    599 * & x_{j} \geq 0 && \forall j \in \mathcal{N}
    600 * \f}
    601 * </td>
    602 * <td>see MIP formats</td>
    603 * <td>See <a href="FAQ\FILEEXT#scipaslpsolver">Can I use \SCIP as a pure LP solver</a> in the FAQ.</td>
    604 * </tr>
    605 * <tr>
    606 * <td>Pseudoboolean optimization</td>
    607 * <td>\f{align*}{
    608 * \text{min} \quad& c^T x \\
    609 * \text{s.t.} \quad& \sum_{k=0}^p a_{ik} \cdot \prod_{j \in \mathcal{N}_{ik}} x_j \leq b_i && \forall i \in \mathcal{M} \\
    610 * &x_{j} \in \{0,1\} && \forall j \in \mathcal{N}
    611 * \f}
    612 * </td>
    613 * <td>
    614 * <ul>
    615 * <li>\ref reader_wbo.h "WBO"</li>
    616 * <li>\ref reader_opb.h "OPB"</li>
    617 * </ul>
    618 * </td>
    619 * <td>
    620 * <ul>
    621 * <li>Test instances are available at <code>check/instances/PseudoBoolean/</code>.</li>
    622 * </ul>
    623 * </td>
    624 * </tr>
    625 * <tr>
    626 * <td>Satisfiability (SAT) and variants</td>
    627 * <td>\f{align*}{
    628 * \text{min} \quad& 0 \\
    629 * \text{s.t.} \quad&\bigvee\limits_{j \in B_i} x_j \vee \bigvee\limits_{j \in \bar{B}_i} \neg x_j = \text{true} && \forall i \in \mathcal{M}\\
    630 * &x_{j} \in \{\text{false},\text{true}\} && \forall j \in \mathcal{N}
    631 * \f}
    632 * </td>
    633 * <td>
    634 * <ul>
    635 * <li>\ref reader_cnf.h "CNF"</li>
    636 * </ul>
    637 * </td>
    638 * <td>
    639 * <ul>
    640 * <li>Use the emphasis setting <code>set emphasis cpsolver</code> to completely disable LP solves and
    641 * use depth-first search with periodic restarts, see also
    642 * <a href="FAQ\FILEEXT#scipascpsolver"> Can I use \SCIP as a pure CP/SAT solver? </a> in the FAQ.</li>
    643 * <li>Test instances are available at <code>check/instances/SAT/</code>.</li>
    644 * </ul>
    645 * </td>
    646 * </tr>
    647 * <tr>
    648 * <td>Multicriteria optimization</td>
    649 * <td>\f{align*}{
    650 * \text{min} \quad &(c_1^T x,\ldots,c_k^T x) \\
    651 * \text{s.t. } \quad& Ax \geq b \\
    652 * &x \in \mathbb{K}^n
    653 * \f}
    654 * where \f$\mathbb{K}\f$ is either \f$\mathbb{Z}\f$ or \f$\mathbb{R}\f$.
    655 * </td>
    656 * <td colspan="3"> see the <a href="http://polyscip.zib.de/">PolySCIP web page</a></td>
    657 * </tr>
    658 * <tr>
    659 * <td>Mixed-integer semidefinite program (MISDP)</td>
    660 * <td>\f{align*}{
    661 * \text{inf} \quad \thinspace & b^T y \\
    662 * \text{s.t.} \quad & \sum_{j=1}^m A_j\, y_j - A_0 \succeq 0 \\
    663 * & y_j \in \mathbb{Z} && \forall\, j \in \mathcal{I}
    664 * \f}
    665 * </td>
    666 * <td colspan="3"> see the <a href="http://www.opt.tu-darmstadt.de/scipsdp/">SCIP-SDP web page</a></td>
    667 * </tr>
    668 * </table>
    669 *
    670 *
    671 */
    672
    673/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    674
    675/**@page CODE Coding style guidelines
    676 *
    677 * We follow the following coding style guidelines and recommend them for all developers.
    678 *
    679 * @section CODESPACING Spacing:
    680 *
    681 * - Indentation is 3 spaces. No tabs anywhere in the code.
    682 * - Every opening parenthesis requires an additional indentation of 3 spaces.
    683 *
    684 * @refsnippet{src/scip/branch_relpscost.c,SnippetCodeStyleParenIndent}
    685 *
    686 * - Spaces around all operators.
    687 * - Spaces around the arguments inside an if/for/while-statement, as well as inside macros (e.g., SCIP_CALL).
    688 * - No spaces between control structure keywords like "if", "for", "while", "switch" and the corresponding brackets.
    689 * - No spaces between a function name and the parenthesis in both the definition and function calls.
    690 * - Braces are on a new line and not indented.
    691 * - Braces in if/for-statements should only be omitted if they enclose a single line.
    692 *
    693 * @refsnippet{src/scip/branch_relpscost.c,SnippetCodeStyleIfFor}
    694 *
    695 * - In function declarations, every parameter is on a new line. The name of the parameter starts at column 26,
    696 * the comment starts at column 46 (if column-count starts with 1).
    697 * - Maximal line length is 120 characters.
    698 * - Always only one declaration in a line.
    699 * - Joint declaration and initialization is possible at the top-level of a function and in the header of loops.
    700 *
    701 * @refsnippet{src/scip/cuts.c,SnippetCodeStyleInLoopDeclaration}
    702 *
    703 * - Variable names should be all lower case.
    704 *
    705 * @refsnippet{src/scip/branch_relpscost.c,SnippetCodeStyleDeclaration}
    706 *
    707 * - Blank lines are inserted where it improves readability.
    708 * - Multiple blank lines are used to structure the code where single blank lines are insufficient,
    709 * e.g., between differrent sections of the code.
    710 *
    711 * @refsnippet{src/scip/heur_xyz.c,SnippetCodeStyleBlanks}
    712 *
    713 * @section CODENAMING Naming:
    714 *
    715 * - Use assert() to show preconditions for the parameters, invariants, and postconditions.
    716 * - Make all functions that are not used outside the module 'static'.
    717 * - Naming should start with a lower case letter.
    718 *
    719 * @refsnippet{src/scip/branch_relpscost.c,SnippetCodeStyleStaticAsserts}
    720 *
    721 * - All global functions start with "SCIP". In the usual naming scheme this is followed by the object and a function name
    722 * like in SCIPlpAddRow(). Functions return TRUE or FALSE should be named like SCIPisFeasEQ().
    723 *
    724 * @refsnippet{src/scip/scip_numerics.h,SnippetCodeStyleNaming}
    725 *
    726 * - For each structure there is a typedef with the name in all upper case.
    727 * - Defines should be named all upper case.
    728 *
    729 * @refsnippet{src/scip/type_set.h,SnippetCodeStyleExample}
    730 *
    731 * @section CODEDOC Documentation:
    732 *
    733 * - Document functions, parameters, and variables in a doxygen conformed way.
    734 * - Please do not leave code in comments that has been commented out, don't use `#if
    735 * 0`. Instead put the code within defines `#ifdef SCIP_DISABLED_CODE` and add an explanation.
    736 * - Todos need double stars to be registered by doxygen.
    737 * - When documenting functions, the first brief description starts with lower case and is separated by semi-colons, if necessary
    738 * The longer description starts capitalized and consists of complete sentences.
    739 * If the documentation consists of multiple lines, the comment end must be on a new line.
    740 *
    741 * @refsnippet{src/scip/scip_datastructures.h,SnippetCodeStyleComment}
    742 *
    743 *
    744 * @section XEMACS Customize (x)emacs
    745 *
    746 * If you are using (x)emacs, you can use the following customization for the c++-mode. These settings satisfy the
    747 * coding guidelines of \SCIP.
    748 *
    749 * \include codestyle/emacs_scip_codestyle.el
    750 *
    751 *
    752 * @section ECLIPSE Customize eclipse
    753 *
    754 * Eclipse user can use the profile below. This profile does not match the \SCIP coding guideline completely.
    755 *
    756 * \include codestyle/eclipse_scip_codestyle.xml
    757 */
    758
    759/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    760
    761/**@page START How to start a new project
    762 *
    763 * Once you succeeded installing \SCIP together with an LP-solver on your system,
    764 * you have a powerful tool for solving MIPs, MIQCPs,
    765 * MINLPs, etc... at hand. \SCIP can also be customized to the type of problems you
    766 * are working on by additional plugins.
    767 * Instructions on how to write a new plugin and include it in \SCIP can be found in the corresponding
    768 * \ref HOWTOADD "How to add ... pages".
    769 *
    770 * \SCIP can also be used for writing your own branch-and-cut or branch-and-cut-and-price code. \SCIP already
    771 * provides a number of existing code examples which we suggest as both reference and starting point
    772 * for these kinds of projects.
    773 * Below, you find some hints of how to start such a project.
    774 *
    775 * @section START_CHOICE Choose an example project
    776 *
    777 * The example should be chosen depending on the programming language (<b>C</b> or <b>C++</b>) and the purpose
    778 * (<b>branch-and-cut</b> or <b>branch-and-cut-and-price</b>) of your project.
    779 * <br>
    780 * We suggest the use of one of the following examples:
    781 * - The \ref VRP_MAIN "Vehicle Routing Problem Example" is a <b>branch-and-cut-and-price</b> (column generation)-code
    782 * in <b>C++</b>.
    783 * - The \ref BINPACKING_MAIN "Binpacking Example"
    784 * and the \ref COLORING_MAIN "Coloring application" are
    785 * <b>branch-and-cut-and-price</b> (column generation)-codes in <b>C</b>.
    786 * - The \ref TSP_MAIN "TSP example"
    787 * is a <b>branch-and-cut</b>-code in <b>C++</b>.
    788 * - The \ref LOP_MAIN "LOP example"
    789 * is a <b>branch-and-cut</b>-code in <b>C</b>.
    790 *
    791 * More examples can be found in the \ref EXAMPLES "list of Examples".
    792 *
    793 * - Copy one of the examples in the <code>examples</code> directory (in the \SCIP root
    794 * directory). For instance, type
    795 * \verbatim
    796 cp -r examples/Binpacking/ ../SCIPProject/ ; cd ../SCIPProject
    797 \endverbatim
    798 * from the \SCIP root directory for copying the content of the <code>Binpacking</code>-example into a fresh
    799 * directory named SCIPProject in the parent directory of the \SCIP root directory and jumping to
    800 * the new SCIPProject directory rightafter.
    801 *
    802 * @section START_CMAKE Building with CMake
    803 *
    804 * It is recommended for all new users to use the CMake build system configuration, if available on their platform.
    805 *
    806 * - Open the <code>CMakeLists</code> (some examples projects have a subdirectory "check" for testing) via
    807 * \verbatim
    808 kate CMakeLists.txt & kate check/CMakeLists.txt # if check/CMakeLists.txt is available
    809 \endverbatim
    810 * and replace all instances of the copied project's name (e.g. <code>binpacking</code>) with your project name.
    811 * - Create a new subdirectory, jump to the new directory and use cmake specifying your \SCIP directory. For instance, type
    812 * \verbatim
    813 mkdir Release ; cd Release ; cmake .. -DSCIP_DIR=../scip/Release
    814 \endverbatim
    815 * and compile using the <code>make</code> command. For the CMake equivalents of all the flags that can be used in \SCIP, see \ref CMAKE.
    816 *
    817 *
    818 * @section START_MAKE Building with the Makefile system
    819 *
    820 * If CMake should be unavailable on your targeted platform, try the classic Makefile system of SCIP.
    821 *
    822 * - Open the <code>Makefile</code> via
    823 * \verbatim
    824 kate Makefile
    825 \endverbatim
    826 * and edit the following variables at the top to have a compilable code:
    827 *
    828 * - specify a correct path to the \SCIP root (<code>SCIPDIR</code>)
    829 * - rename the targets name (<code>MAINNAME</code>)
    830 * - adjust the source file names (<code>MAINOBJ</code>).
    831 * .
    832 * - Once you have edited the makefile, you can use all the flags that can be used in \SCIP to
    833 * compile your code, see \ref MAKE.
    834 *
    835 */
    836
    837/**@page EXAMPLES Example projects
    838 *
    839 * \SCIP contains several examples that demonstrate its usage. They are contained in the &quot;examples&quot; directory
    840 * in the source code distribution.
    841 *
    842 * <table>
    843 * <tr>
    844 * <td colspan="2">
    845 * <b>
    846 * Callable library
    847 * </b>
    848 * </td>
    849 * </tr>
    850 * <tr>
    851 * <td>
    852 * @subpage CALLABLELIBRARY_MAIN "Callable Library Example"
    853 * </td>
    854 * <td>
    855 * An example showing how to setup constraints (esp. nonlinear ones) when using \SCIP as callable library.
    856 * </td>
    857 * </tr>
    858 * <tr>
    859 * <td>
    860 * @subpage MIPSOLVER_MAIN "MIP solver"
    861 * </td>
    862 * <td>
    863 * A minimal implementation for using \SCIP included into another source code
    864 * </td>
    865 * </tr>
    866 * <tr>
    867 * <td>
    868 * @subpage QUEENS_MAIN "The n-Queens Problem"
    869 * </td>
    870 * <td>
    871 * Using SCIP's callable library for solving the n-queens problem.
    872 * </td>
    873 * </tr>
    874 * <tr>
    875 * <td colspan="2">
    876 * <b>
    877 * Extending SCIP by custom plugins
    878 * </b>
    879 * </td>
    880 * </tr>
    881 * <tr>
    882 * <td>
    883 * @subpage EVENTHDLR_MAIN "Event handler"
    884 * </td>
    885 * <td>
    886 * A small example illustrating the use of an event handler.
    887 * </td>
    888 * </tr>
    889 * <tr>
    890 * <td>
    891 * @subpage GMI_MAIN "Gomory mixed integer cut example"
    892 * </td>
    893 * <td>
    894 * An example about Gomory mixed-integer cuts.
    895 * </td>
    896 * </tr>
    897 * <tr>
    898 * <td>
    899 * @subpage RELAXATOR_MAIN "Relaxator example"
    900 * </td>
    901 * <td>
    902 * An example about using custom relaxators.
    903 * </td>
    904 * </tr>
    905 * <tr>
    906 * <td colspan="2">
    907 * <b>
    908 * Branch-and-cut
    909 * </b>
    910 * </td>
    911 * </tr>
    912 * <tr>
    913 * <td>
    914 * @subpage SUDOKU_MAIN "Sudoku example"
    915 * </td>
    916 * <td>
    917 * An example solving sudokus.
    918 * </td>
    919 * </tr>
    920 * <tr>
    921 * <td>
    922 * @subpage LOP_MAIN "Linear Ordering"
    923 * </td>
    924 * <td>
    925 * An example for implementing a constraint handler.
    926 * </td>
    927 * </tr>
    928 * <tr>
    929 * <td>
    930 * @subpage TSP_MAIN "The TSP example"
    931 * </td>
    932 * <td>
    933 * A short implementations of a constraint handler, two easy combinatorial heuristics, a file reader, etc. which
    934 * demonstrate the usage of \SCIP as a branch-and-cut-framework for solving traveling salesman problem instances.
    935 * </td>
    936 * </tr>
    937 * <tr>
    938 * <td colspan="2">
    939 * <b>
    940 * Branch-and-price
    941 * </b>
    942 * </td>
    943 * </tr>
    944 * <tr>
    945 * <td>
    946 * @subpage BINPACKING_MAIN "Binpacking"
    947 * </td>
    948 * <td>
    949 * An implementation of the column generation approach for the binpacking problem. It includes a customized reader,
    950 * Ryan/Foster branching rule, (global) problem data, variable data, and constraint handler.
    951 * </td>
    952 * </tr>
    953 * <tr>
    954 * <td>
    955 * @subpage VRP_MAIN "Vehicle Routing"
    956 * </td>
    957 * <td>
    958 * A solver for a simple capacity-constrained vehicle routing problem, which is based on pricing tours via a dynamic
    959 * programming algorithm.
    960 * </td>
    961 * </tr>
    962 * <tr>
    963 * <td colspan="2">
    964 * <b>
    965 * Benders' decomposition
    966 * </b>
    967 * </td>
    968 * </tr>
    969 * <tr>
    970 * <td>
    971 * @subpage SCFLP_MAIN "Stochastic capacitated facility location problem"
    972 * </td>
    973 * <td>
    974 * A stochastic programming problem that demonstrates the use of the Benders' decomposition framework within SCIP.
    975 * </td>
    976 * </tr>
    977 * </table>
    978 */
    979
    980/** @page APPLICATIONS Application projects
    981 *
    982 * There are several extensions of \SCIP for particular applications included in the release. They are contained in the &quot;applications&quot; directory
    983 * in the source code distribution.
    984 *
    985 * <table>
    986 * <tr>
    987 * <td>
    988 * @subpage COLORING_MAIN
    989 * </td>
    990 * <td>
    991 * An implementation of the column generation approach for graph coloring of Mehrotra and Trick.
    992 * </td>
    993 * </tr>
    994 * <tr>
    995 * <td>
    996 * @subpage CYCLECLUSTERING_MAIN
    997 * </td>
    998 * <td>
    999 * Branch-and-cut implementation of a graph partitioning problem used for Markov state models.
    1000 * </td>
    1001 * </tr>
    1002 * <tr>
    1003 * <td>
    1004 * @subpage MINIISC_MAIN
    1005 * </td>
    1006 * <td>
    1007 * A solver that computes irreducible infeasible subsystems using Benders decomposition
    1008 * </td>
    1009 * </tr>
    1010 * <tr>
    1011 * <td>
    1012 * @subpage PBSOLVER_MAIN
    1013 * </td>
    1014 * <td>
    1015 * A solver for pseudoboolean problems in OPB or WBO format. It complies by default with the technical regulations of
    1016 * PB competition. Therefore, it includes a message handler to produce a valid general log and for optimization
    1017 * problems an event handler to signal achievements of best primal solutions.
    1018 * </td>
    1019 * </tr>
    1020 * <tr>
    1021 * <td>
    1022 * @subpage RINGPACKING_MAIN "Ringpacking"
    1023 * </td>
    1024 * <td>
    1025 * An implementation of the column generation approach for the Ringpacking Problem. It includes a customized reader,
    1026 * (global) problem data, variable data, and constraint handler.
    1027 * </td>
    1028 * </tr>
    1029 * <tr>
    1030 * <td>
    1031 * @subpage SCHEDULER_MAIN
    1032 * </td>
    1033 * <td>
    1034 * A solver for scheduling problems.
    1035 * </td>
    1036 * </tr>
    1037 * </table>
    1038 *
    1039 */
    1040
    1041
    1042/**@page SHELL Tutorial: the interactive shell
    1043 *
    1044 * If you are using \SCIP as a black box solver, here you will find some tips and tricks what you can do.
    1045 *
    1046 * @section TUTORIAL_OPTIMIZE Read and optimize a problem instance
    1047 *
    1048 * @subsection SHELL_PREREQUISITES "Prerequisites"
    1049 *
    1050 * First of all, we need a \SCIP binary and an example problem file to work with.
    1051 * For installation we refer you to the \ref INSTALL section.
    1052 *
    1053 * Therefore, you can either download the \SCIP standard distribution (which includes problem files) and compile it on your own or you can download a
    1054 * precompiled binary and an example problem separately. \SCIP can read files in LP, MPS, ZPL, WBO, FZN, PIP, OSiL, and
    1055 * other formats (see \ref FILEREADERS).
    1056 *
    1057 * If you want to download the source code of the \SCIP standard distribution, we recommend to go to the <a
    1058 * href="https://scipopt.org/#download">SCIP download section</a>, download the latest release,
    1059 * inflate the tarball (e.g., with "tar xzf scipoptsuite-[version].tgz"), and follow the instructions
    1060 * in the INSTALL file. The instance stein27, which will serve as an example in this tutorial, can be found under
    1061 * scipoptsuite-[version]/scip-[version]/check/instances/MIP/stein27.fzn.
    1062 * Alternatively you can download an instance file from the <a href="https://miplib.zib.de/tag_benchmark.html">MIPLIB 2017 page</a>.
    1063 *
    1064 * If you want to download a precompiled binary, go to the <a href="http://scipopt.org/#download">SCIP download
    1065 * section</a> and download an appropriate binary for your operating system. The \SCIP source code distribution already comes with
    1066 * the example instance used throughout this tutorial. To follow this tutorial with a precompiled binary, we recommend downloading the instance
    1067 * <a href="http://miplib2010.zib.de/miplib3/miplib3/stein27.mps.gz">stein27</a> from
    1068 * the <a href="http://miplib2010.zib.de/miplib3/miplib.html">MIPLIB 3.0</a> homepage.
    1069 *
    1070 * @subsection SHELL_AFTERINSTALL "After installation"
    1071 *
    1072 * Now start your binary, without any arguments. This opens the interactive shell, which should look somehow like this:
    1073 *
    1074 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetVersion
    1075 *
    1076 * First of all "help" shows you a list of all available shell commands. Brackets indicate a submenu with further options.
    1077 *
    1078 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetHelp
    1079 *
    1080 * Okay, let's solve the example instance... use "read check/instances/MIP/stein27.fzn" (or the problem file of your choice) to parse the instance file, "optimize" to solve it and "display
    1081 * solution" to show the nonzero variables of the best found solution.
    1082 *
    1083 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetOpt1
    1084 *
    1085 * What do we see here? After "optimize", SCIP first goes into presolving. Not much is happening for this instance, just
    1086 * the linear constraints get upgraded to more specific types. Each round of presolving will be displayed in a single
    1087 * line, with a short summary at the end. Then, we see the actual solving process. The table output of the branch-and-cut
    1088 * solving process is very detailed during the root node. Afterwards, a new line is displayed every 100th node.
    1089 * Furthermore, every new incumbent solution triggers a new table row, starting with a character to indicate the
    1090 * heuristic that found the solution. Which letter represents which heuristic can be seen with the
    1091 * "display heuristics" command, see \ref TUTORIAL_STATISTICS for an example.
    1092 *
    1093 * After some lines the root node processing is finished. From now on, we will see an output line every hundredth node or
    1094 * whenever a new incumbent is found. After some more nodes, the "dualbound" starts
    1095 * moving, too. At one point, both will be the same, and the solving process terminates, showing us some wrap-up
    1096 * information.
    1097 *
    1098 * The exact performance may of course vary among different architectures and operating systems. Do not be worried if
    1099 * your installation needs more or less time or nodes to solve. Also, this instance has more than 2000 different optimal
    1100 * solutions. The optimal objective value always has to be 18, but the solution vector may differ. If you are interested
    1101 * in this behavior, which is called "performance variability", you may have a look at the MIPLIB2010 paper.
    1102 *
    1103 * @section TUTORIAL_FILEIO Writing problems and solutions to a file
    1104
    1105 * \SCIP can also write information to files. E.g., we could store the incumbent solution to a file, or output the
    1106 * problem instance in another file format (the LP format is much more human readable than the MPS format, for example).
    1107 * Since stein27.fzn has many constraints with the same name, which would result in an unusable LP file, we write out
    1108 * the problem with generic variable and constraint names (x1, x2, x3, ...; c1, c2, c3, ...) here.
    1109 *
    1110 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetWriteSolutions
    1111 *
    1112 * Passing starting solutions can increase the solving performance so that \SCIP does not need to construct an initial feasible solution
    1113 * by itself. After reading the problem instance, use the "read" command again, this time with a file containing solution information.
    1114 * Solutions can be specified in a raw or xml-format and must have the file extension ".sol", see the documentation of the
    1115 * \ref reader_sol.h "solution reader of SCIP" for further information.
    1116 *
    1117 * Customized settings are not written or read with the "write" and "read" commands, but with the three commands
    1118 *
    1119 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetSaveSettingsOverview
    1120 *
    1121 * See the section on parameters \ref TUTORIAL_PARAMETERS for more information.
    1122 *
    1123 * @section TUTORIAL_STATISTICS Displaying detailed solving statistics
    1124 *
    1125 * We might want to have some more information now. Which of the heuristics found solutions? Which plugins
    1126 * were called during the solutions process and how much time did they spend?
    1127 * Information on certain plugin types (e.g., heuristics, branching rules, separators) is displayed via
    1128 * "display <plugin-type>", information on the solution process via "display statistics", and "display problem"
    1129 * shows the current instance.
    1130 *
    1131 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetDisplayStatistics
    1132 *
    1133 * The statistics obtained via "display statistics" are quite comprehensive,
    1134 * thus, we just explain a few lines here. Information is grouped by the plugin type. For the primal heuristics,
    1135 * the execution time in seconds is shown as well as the number of calls to the heuristic, and its success regarding
    1136 * the number of (best) solutions found by that heuristic. Appropriate statistics are also shown for presolvers, constraint handlers,
    1137 * separators, propagators, the search tree, etc. User-written plugins will appear automatically in these statistics,
    1138 * after they were included into \SCIP.
    1139 *
    1140 * @section TUTORIAL_PARAMETERS Changing parameters from the interactive shell
    1141 *
    1142 * Now, we can start playing around with parameters. The primal heuristics Rounding and shifting seem to be quite successful on this instance,
    1143 * wondering what happens if we disable them? Or what happens, if we are even more rigorous and disable all heuristics?
    1144 * Or if we do the opposite and use aggressive heuristics?
    1145 *
    1146 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetSetSettings
    1147 *
    1148 * We can navigate through the menus step-by-step and get a list of available options and submenus. Therefore, we select
    1149 * "set" to change settings, "heuristics" to change settings of primal heuristics, and "shifting" for that particular
    1150 * heuristic. Then we see a list of parameters (and yet another submenu for advanced parameters), and disable this
    1151 * heuristic by setting its calling frequency to -1. If we already know the path to a certain setting, we can directly
    1152 * type it (as for the rounding heuristic in the above example). Note that we do not have to use the full names, but we
    1153 * may use short versions, as long as they are unique.
    1154 *
    1155 * To solve a problem a second time, we have to read it in again before starting the optimization process.
    1156 *
    1157 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetOpt2
    1158 *
    1159 * Okay, what happened here? First, we reset all parameters to their default values, using "set default". Next, we
    1160 * loaded some meta-parameter settings (also see <a href="FAQ.php#howtochangebehaviour">the FAQ</a>), to apply primal heuristics
    1161 * more aggressively. \SCIP shows us, which single parameters it changed therefore. Additionally, for pedagogical purposes,
    1162 * we set the node limit to 200. Now, the optimal solution is already found at the root node, by a heuristic which is
    1163 * deactivated by default. Then, after node 200, the user defined node limit is reached which interrupts the solving
    1164 * process, We see that now in the short status report, primal and dual bound are different, thus, the problem is not solved
    1165 * yet. Nevertheless, we could access statistics, see the current incumbent solution, change parameters and so on.
    1166 * Entering "optimize" we continue the solving process from the point on at which it has been interrupted.
    1167 *
    1168 * Once you found a non-default parameter setting that you wish to save and use in the future, use either the command
    1169 *
    1170 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetSaveSettingsFull
    1171 *
    1172 * to save <b>all</b> parameter values to the specified file, or
    1173 *
    1174 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetSaveSettingsDiff
    1175 *
    1176 * in order to save only the nondefault parameters. The latter has several advantages, you can, e.g., combine parameter
    1177 * settings from multiple settings files stored by the latter command, as long as they only affect mutually exclusive
    1178 * parameter values.
    1179 *
    1180 * For loading a previously stored settings file, use the "load" command:
    1181 *
    1182 * @snippet shelltutorial/shelltutorialannotated.tmp SnippetLoadSettings
    1183 *
    1184 * Special attention should be drawn to the reserved settings file name "scip.set"; whenever the \SCIP interactive shell
    1185 * is started from a working directory that contains a settings file with the name "scip.set", it will be automatically
    1186 * replace the default settings.
    1187 *
    1188 * For using special settings for automated tests as described in \ref TEST, save your custom settings in a subdirectory
    1189 * "SCIP_HOME/settings".
    1190 *
    1191 *
    1192 * We hope this tutorial gave you an overview of what is possible using the \SCIP interactive shell. Please also read our
    1193 * \ref FAQ, in particular the section "Using SCIP as a standalone MIP/MINLP-Solver".
    1194 *
    1195 */
    1196
    1197/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    1198
    1199/**@page DOC How to search the documentation and source files structure for public interface functions
    1200 *
    1201 * If you are looking for a function in order to perform a specific task, the public \ref PUBLICAPI "SCIP C-API" is the place to look.
    1202 * - It contains interface functions for all SCIP structs, both in the solver core or in one of the plugins.
    1203 * - Plugins are mostly independent from each other, so to use them it is usually enough to browse the \ref PUBLICCOREAPI "Core API".
    1204 * - If you want to add your own plugins, see the \ref HOWTOADD pages for exhaustive information for each plugin type.
    1205 * - If you are learning SCIP with a concrete project in mind, looking at the available \ref EXAMPLES page may help you
    1206 * getting started.
    1207 * - See also \ref START "How to start a new project"
    1208 *
    1209 * Header file names of SCIP obey a consistent naming scheme: Type definitions and related objects such as enums are found in headers starting with "type_",
    1210 * such as \ref type_var.h , which contains enums and type definitions related to \ref PublicVariableMethods "SCIP problem variables".
    1211 * Definitions of the actual structs can be found in separate header files starting with "struct_".
    1212 * All function definitions of the public SCIP API are split across header files starting with "pub_" such as \ref pub_cons.h
    1213 * or headers starting with "scip_" such as \ref scip_cons.h .
    1214 * The latter headers starting with "scip_" contain more complex functions, which always receive a scip pointer as first argument.
    1215 * Those functions may affect several individual components controlled by SCIP. Such a function is SCIPbranchVar(), which
    1216 * affects the search tree, which is controlled by SCIP itself and not meant to be accessed by user plugins.
    1217 *
    1218 * It should be sufficient to include scip/scip.h and scip/scipdefplugins.h for having all
    1219 * needed functionality available in a project.
    1220 *
    1221 * If, for example, you are looking for information on how to create a problem instance, here are some steps you can take:
    1222 *
    1223 * 1. Browse the SCIP Core API and follow the path \ref PUBLICAPI > \ref PUBLICCOREAPI > \ref PublicProblemMethods > \ref GlobalProblemMethods > SCIPcreateProb()
    1224 * 2. Here you can find information on the function's return value, preconditions, postconditions, parameters, as well as related functions.
    1225 * 3. If you are unsure of how to use some of the parameters, it is worth looking for a basic version of the function.
    1226 * This and other related functions may be found by either browsing neighboring functions and groups in the navigation tree to the left, or in the
    1227 * 'References' and 'Referenced by' section of the function documentation. In this case, you can find `SCIPcreateProbBasic()`.
    1228 *
    1229 * The opposite case is that you already know the name of a function as, e.g., SCIPbranchVar().
    1230 *
    1231 * 1. Type the name of the function into the search bar to find the function documentation.
    1232 * 2. In addition, you can find related functions by browsing the neighboring functions of the same group.
    1233 * 3. In this example, you may now learn about SCIPgetNLPBranchCands() to query all integer
    1234 * variables with fractional LP solution value, which are good candidates for classical branching on variables.
    1235 *
    1236 * Note that the \ref INTERNALAPI "private SCIP API" contains more complex functions and data structures that fill specialized roles and
    1237 * is only for developers.
    1238 * Those functions are **not** exported to the library and are therefore **not available in user projects** using the \ref PUBLICAPI "public SCIP API".
    1239 */
    1240
    1241/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    1242
    1243/**@page CONS How to add constraint handlers
    1244 *
    1245 * A constraint handler defines the semantics and the algorithms to process constraints of a certain class. A single
    1246 * constraint handler is responsible for all constraints belonging to its constraint class. For example, there is
    1247 * one \ref cons_knapsack.h "knapsack constraint handler" that ensures solutions are only accepted if they satisfy all
    1248 * knapsack constraints in the model. \n A complete list of all constraint handlers contained in this release can be
    1249 * found \ref CONSHDLRS "here".
    1250 *
    1251 * We now explain how users can add their own constraint handlers.
    1252 * For an example, look into the subtour constraint handler (examples/TSP/src/ConshdlrSubtour.cpp) of the
    1253 * \ref TSP_MAIN project.
    1254 * The example is written in C++ and uses the C++ wrapper classes.
    1255 * However, we will explain the implementation of a constraint handler using the C interface.
    1256 * It is very easy to transfer the C explanation to C++; whenever a function should be implemented using the
    1257 * SCIP_DECL_CONS... notion, reimplement the corresponding virtual member method of the abstract scip::ObjConshdlr
    1258 * base class.
    1259 *
    1260 * Additional documentation for the callbacks of a constraint handler can be found in the file
    1261 * type_cons.h.
    1262 *
    1263 * Here is what you have to do (assuming your constraint handler should be named "subtour"):
    1264 * -# Copy the template files src/scip/cons_xyz.c and src/scip/cons_xyz.h into files "cons_subtour.c"
    1265 * and "cons_subtour.h".
    1266 * \n
    1267 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    1268 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    1269 * -# Use `SCIPincludeConshdlrSubtour()` in order to include the constraint handler into your SCIP instance,
    1270 * e.g., in the main file of your project (see, e.g., src/cppmain.cpp in the TSP example). \n
    1271 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    1272 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "subtour".
    1273 * -# Adjust the \ref CONS_PROPERTIES "properties of the constraint handler".
    1274 * -# Define the \ref CONS_DATA "constraint data and the constraint handler data". This is optional.
    1275 * -# Implement the \ref CONS_INTERFACE "interface functions".
    1276 * -# Implement the \ref CONS_FUNDAMENTALCALLBACKS "fundamental callbacks".
    1277 * -# Implement the \ref CONS_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    1278 *
    1279 *
    1280 * @section CONS_PROPERTIES Properties of a Constraint Handler
    1281 *
    1282 * At the top of the new file "cons_subtour.c" you can find the constraint handler properties.
    1283 * These are given as compiler defines. Some of them are optional, as, e.g., separation-related properties,
    1284 * which only have to be defined if the constraint handler supports the related callbacks.
    1285 * In the C++ wrapper class, you have to provide the constraint handler properties by calling the constructor
    1286 * of the abstract base class scip::ObjConshdlr from within your constructor (see the TSP example).
    1287 * The properties you have to set have the following meaning:
    1288 *
    1289 * @subsection CONS_FUNDAMENTALPROPERTIES Fundamental Constraint Handler properties
    1290 *
    1291 * \par CONSHDLR_NAME: the name of the constraint handler.
    1292 * This name is used in the interactive shell to address the constraint handler.
    1293 * Additionally, if you are searching for a constraint handler with SCIPfindConshdlr(), this name is looked up.
    1294 * Names have to be unique: no two constraint handlers may have the same name.
    1295 *
    1296 * \par CONSHDLR_DESC: the description of the constraint handler.
    1297 * This string is printed as a description of the constraint handler in the interactive shell of SCIP.
    1298 *
    1299 * \par CONSHDLR_ENFOPRIORITY: the priority of the constraint handler for constraint enforcing.
    1300 * Like the separation priority, the enforcement priorities define the order in which the different constraint handlers
    1301 * are called in the constraint enforcement step of the subproblem processing.
    1302 * The constraint enforcement is called after the price-and-cut loop is executed (in the case that the LP is solved
    1303 * at the current subproblem).
    1304 * \n
    1305 * The integrality constraint handler has an enforcement priority of 0.
    1306 * That means, if a constraint handler has negative enforcement priority, it only has to deal with integral solutions
    1307 * in its enforcement functions, because for fractional solutions, the integrality constraint handler would have
    1308 * created a branching, thereby aborting the enforcement step.
    1309 * If you want to implement a constraint-depending branching rule (for example, SOS branching on special ordered
    1310 * set constraints), you have to assign a positive enforcement priority to your constraint handler.
    1311 * In this case, you have to be able to deal with fractional solutions.
    1312 * \n
    1313 * See \ref CONSENFOLP and \ref CONSENFOPS for further details of the separation callback.
    1314 *
    1315 * \par CONSHDLR_CHECKPRIORITY: the priority of the constraint handler for checking feasibility.
    1316 * Like the separation priority, the checking priorities define the order in which the different constraint handlers
    1317 * are called to check the feasibility of a given primal solution candidate.
    1318 * The integrality constraint handler has a checking priority of 0.
    1319 * That means, constraint handlers with negative checking priorities only have to deal with integral solutions.
    1320 *
    1321 * \par CONSHDLR_EAGERFREQ: the default frequency for using all instead of only the useful constraints in separation, propagation and enforcement.
    1322 * If \em constraint \em aging is activated, some constraints that were not useful in the past for propagation or
    1323 * separation are marked to be \em obsolete.
    1324 * Usually, the obsolete constraints are not presented to the separation and propagation functions of the constraint
    1325 * handlers, such that the constraint handlers only process the non-obsolete constraints.
    1326 * However, every n'th call, with n being the EAGERFREQ of the constraint handler, all constraints are presented to the
    1327 * separation and propagation functions of the constraint handler.
    1328 * This gives obsolete constraints the chance of becoming non-obsolete again.
    1329 * \n
    1330 * If the eager evaluation frequency is set to -1, obsolete constraints are never presented to the separation and
    1331 * propagation functions.
    1332 * A frequency of 0 means, that obsolete constraints are only used in the first call of each function.
    1333 *
    1334 * \par CONSHDLR_NEEDSCONS: indicates whether the constraint handler should be skipped, if no constraints are available.
    1335 * Usually, a constraint handler is only executed if there are constraints of its corresponding class in the model.
    1336 * For those constraint handlers, the NEEDSCONS flag should be set to TRUE.
    1337 * However, some constraint handlers must be called without having a constraint of the class in the model, because
    1338 * the constraint is only implicitly available.
    1339 * For example, the integrality constraint handler has the NEEDSCONS flag set to FALSE, because there is no explicit
    1340 * integrality constraint in the model.
    1341 * The integrality conditions are attached to the variables, and the integrality constraint handler has to check
    1342 * all variables that are marked to be integer for integral values.
    1343 *
    1344 * @subsection CONS_ADDITIONALPROPERTIES Optional Constraint Handler properties
    1345 *
    1346 * The following properties are optional and only need to be defined if the constraint handlers support
    1347 * separation, presolving, propagation, and/or upgrade functionality.
    1348 *
    1349 * \par LINCONSUPGD_PRIORITY: priority of the constraint handler for upgrading of linear constraints
    1350 * This property is only needed if a certain linear constraint can be upgraded to a more specific one. In one of
    1351 * the first presolving rounds SCIP tries to upgrade linear constraints to more specialized constraints, such as
    1352 * knapsack constraints. The upgrading calls are processed in the order of decreasing priority.
    1353 *
    1354 * \par NONLINCONSUPGD_PRIORITY: priority of the constraint handler for upgrading of nonlinear constraints
    1355 * This property has the same effect as the LINCONSUPGD_PRIORITY parameter, see above, and should be set whenever
    1356 * an upgrade functionality from a general nonlinear constraint to the more specific one is defined.
    1357 *
    1358 * \par CONSHDLR_SEPAFREQ: the default frequency for separating cuts.
    1359 * The separation frequency defines the depth levels at which the constraint handler's separation functions \ref CONSSEPALP
    1360 * and \ref CONSSEPASOL are called.
    1361 * For example, a separation frequency of 7 means, that the separation callback is executed for subproblems that are
    1362 * in depth 0, 7, 14, ... of the branching tree.
    1363 * A separation frequency of 0 means, that the separation function is only called at the root node.
    1364 * A separation frequency of -1 disables the separation function of the constraint handler.
    1365 * \n
    1366 * The separation frequency can be adjusted by the user.
    1367 * This property of the constraint handler only defines the default value of the frequency.
    1368 * If you want to have a more flexible control of when to execute the separation algorithm, you have to assign
    1369 * a separation frequency of 1 and implement a check at the beginning of your separation algorithm whether you really
    1370 * want to execute the separator or not.
    1371 * If you do not want to execute the function, set the result code to SCIP_DIDNOTRUN.
    1372 *
    1373 * \par CONSHDLR_SEPAPRIORITY: the priority of the constraint handler for separation. (optional: to be set only if the constraint handler supports separation)
    1374 * In each separation round during the price-and-cut loop of the subproblem processing or during the separation loop
    1375 * of the primal solution separation, the separators and separation functions of the constraint handlers are called in
    1376 * a predefined order, which is given by the priorities of the separators and the separation priorities of the
    1377 * constraint handlers.
    1378 * First, the separators with non-negative priority are called in the order of decreasing priority.
    1379 * Next, the separation functions of the different constraint handlers are called in the order of decreasing separation
    1380 * priority.
    1381 * Finally, the separators with negative priority are called in the order of decreasing priority.
    1382 * \n
    1383 * The separation priority of the constraint handler should be set according to the complexity of the cut separation
    1384 * algorithm and the impact of the resulting cuts:
    1385 * Constraint handlers that provide fast algorithms that usually have a high impact (i.e., cut off a large portion of
    1386 * the LP relaxation) should have a high priority.
    1387 * See \ref CONSSEPALP and \ref CONSSEPASOL for further details of the separation callbacks.
    1388 *
    1389 * \par CONSHDLR_DELAYSEPA: the default for whether the separation function should be delayed, if other separators found cuts.
    1390 * If the constraint handler's separation function is marked to be delayed, it is only executed after no other separator
    1391 * or constraint handler found a cut during the price-and-cut loop.
    1392 * If the separation function of the constraint handler is very expensive, you may want to mark it to be delayed until all
    1393 * cheap separation methods have been executed.
    1394 *
    1395 * \par CONSHDLR_PROPFREQ: the default frequency for propagating domains.
    1396 * This default frequency has the same meaning as the CONSHDLR_SEPAFREQ with respect to the domain propagation
    1397 * callback of the constraint handler.
    1398 * A propagation frequency of 0 means that propagation is only applied in preprocessing and at the root node.
    1399 * A propagation frequency of -1 disables the propagation function of the constraint handler.
    1400 *
    1401 * \par CONSHDLR_DELAYPROP: the default for whether the propagation function should be delayed, if other propagators found reductions.
    1402 * This property is analogous to the DELAYSEPA flag, but deals with the propagation function of the constraint handler.
    1403 *
    1404 * \par CONSHDLR_PROP_TIMING: the propagation timing mask of the constraint handler.
    1405 * SCIP calls the domain propagation routines at different places in the node processing loop.
    1406 * This property indicates at which places the propagation routine of the constraint handler is called.
    1407 * Possible values are defined in type_timing.h and can be concatenated, e.g., as in SCIP_PROPTIMING_ALWAYS.
    1408 *
    1409 * \par CONSHDLR_PRESOLTIMING: the timing of the constraint handler's presolving function (FAST, MEDIUM, or EXHAUSTIVE).
    1410 * Every presolving round starts with the FAST presolving timing. MEDIUM presolving functions are only called, if FAST presolvers did not find
    1411 * enough reductions in this round so far, and EXHAUSTIVE presolving steps are only performed if all presolvers called before
    1412 * in this round were unsuccessful.
    1413 * Presolving functions should be assigned a timing based on how expensive they are, e.g., presolvers that provide fast algorithms that
    1414 * usually have a high impact (i.e., remove lots of variables or tighten bounds of many variables) should have a timing FAST.
    1415 * If a presolving function implements different algorithms of different complexity, it may also get multiple timings and check the timing
    1416 * internally in the \ref CONSPRESOL callback to decide which algorithms to run.
    1417 *
    1418 * \par CONSHDLR_MAXPREROUNDS: the default maximal number of presolving rounds the constraint handler participates in.
    1419 * The preprocessing is executed in rounds.
    1420 * If enough changes have been applied to the model, an additional preprocessing round is performed.
    1421 * The MAXPREROUNDS parameter of a constraint handler denotes the maximal number of preprocessing rounds the constraint
    1422 * handler participates in.
    1423 * A value of -1 means that there is no limit on the number of rounds.
    1424 * A value of 0 means the preprocessing callback of the constraint handler is disabled.
    1425 *
    1426 *
    1427 *
    1428 * @section CONS_DATA Constraint Data and Constraint Handler Data
    1429 *
    1430 * Below the header "Data structures" you can find two structs called "struct SCIP_ConsData" and
    1431 * "struct SCIP_ConshdlrData".
    1432 * If you are using C++, you only need to define the "struct SCIP_ConsData".
    1433 * The constraint handler data must be implemented as member variables of your constraint handler class.
    1434 * \n
    1435 * The constraint data are the information that is needed to define a single constraint of the constraint handler's
    1436 * constraint class.
    1437 * For example, the data of a knapsack constraint would consist of a list of variables, a list of weights, and
    1438 * the capacity of the knapsack.
    1439 * The data of a subtour constraint consists of the graph on which the problem is defined.
    1440 * In the graph, each edge should be linked to the corresponding binary problem variable.
    1441 * \n
    1442 * The constraint handler data are additional variables, that belong to the constraint handler itself and which are
    1443 * not specific to a single constraint.
    1444 * For example, you can use these data to store parameters of the constraint handler or statistical information.
    1445 * The constraint handler data are optional.
    1446 * You can leave the struct empty.
    1447 *
    1448 *
    1449 * @section CONS_INTERFACE Interface Functions
    1450 *
    1451 * At the bottom of "cons_subtour.c" you can find three interface functions, that also appear in "cons_subtour.h".
    1452 * These are SCIPincludeConshdlrSubtour(), SCIPcreateConsSubtour(), and SCIPcreateConsSubtourBasic().
    1453 * \n
    1454 * The function SCIPincludeConshdlrSubtour() only has to be adjusted slightly.
    1455 * It is responsible for notifying SCIP of the presence of the constraint handler by calling the function
    1456 * SCIPincludeConshdlr().
    1457 * It is called by the user, if (s)he wants to include the constraint handler, i.e., if (s)he wants to make
    1458 * the constraint handler available to the model, and looks like this:
    1459 * \dontinclude src/scip/cons_knapsack.c
    1460 * -# If you are using constraint handler data, you have to <b>allocate the memory for the data</b> at this point.
    1461 * You also have to initialize the fields in struct SCIP_ConshdlrData afterwards.
    1462 *
    1463 * \skip SCIP_RETCODE SCIPincludeConshdlrKnapsack(
    1464 * \until SCIPallocBlockMemory
    1465 *
    1466 * -# Now, <b>SCIP gets notified</b> of the presence of the constraint handler together with its \ref CONS_FUNDAMENTALCALLBACKS "basic callbacks".
    1467 *
    1468 * \skip SCIPincludeConshdlrBasic
    1469 * \until assert
    1470 *
    1471 * -# All \ref CONS_ADDITIONALCALLBACKS "additional callbacks" are added via their setter functions.
    1472 *
    1473 * \skip SCIPsetConshdlrCopy
    1474 * \until SCIPsetConshdlrExit
    1475 *
    1476 * -# If the constraint handler is a specialization of a general linear or nonlinear constraint, we want to include an
    1477 * <b>automatic upgrading mechanism</b> by calling the interface function
    1478 *
    1479 * \skip SCIPfindConshdlr
    1480 * \until SCIPincludeLinconsUpgrade
    1481 * or
    1482 * \code
    1483 * SCIP_CALL( SCIPincludeNonlinconsUpgrade(scip, nonlinconsUpgdSubtour, NULL, NONLINCONSUPGD_PRIORITY, TRUE, CONSHDLR_NAME) );
    1484 * \endcode
    1485 *
    1486 * in the nonlinear case. See also cons_nonlinear.h for further information about the general upgrade procedure in the nonlinear case.
    1487 * -# You may also add <b>user parameters</b> for your constraint handler.
    1488 * Some parameters which are important to play with are added to every constraint automatically, as, e.g.,
    1489 * propagation or separation frequency.
    1490 * \skip SCIPaddIntParam
    1491 * \until DEFAULT_SEPACARDFREQ
    1492 * \skip SCIP_OKAY
    1493 * \until }
    1494 *
    1495 *
    1496 * The functions SCIPcreateConsSubtour() and SCIPcreateConsSubtourBasic() are called to create a single constraint of the constraint
    1497 * handler's constraint class.
    1498 * It should allocate and fill the constraint data, and call SCIPcreateCons().
    1499 * Take a look at the following example from the \ref cons_knapsack.h "knapsack constraint handler":
    1500 *
    1501 * @refsnippet{src/scip/cons_knapsack.c,SnippetConsCreationKnapsack}
    1502 *
    1503 * In this example, consdataCreate() is a local function that allocates memory for the given consdata
    1504 * and fills the data with the given <code>vars</code> array. For allocating memory for the constraint data, you
    1505 * can use SCIP memory allocation:
    1506 * \code
    1507 * SCIP_CALL( SCIPallocBlockMemory(scip, consdata) );
    1508 * \endcode
    1509 *
    1510 *
    1511 * @section CONS_CALLBACKS Callbacks of Constraint handlers
    1512 *
    1513 * Besides the various functions which you will implement inside your constraint handler there exists a number
    1514 * of <b> callbacks </b> associated with your constraint handler. Callbacks can be regarded as
    1515 * tasks which your constraint handler is able to provide to the solver. They are grouped into two
    1516 * categories:
    1517 *
    1518 * \ref CONS_FUNDAMENTALCALLBACKS "Fundamental Callbacks" are mandatory to implement
    1519 * such that your code will work. For example, every constraint handler has to provide the
    1520 * functionality to state whether all of its constraints are
    1521 * fulfilled by a given variable assignment. Hence, the \ref CONSCHECK "CONSCHECK" callback is
    1522 * one of the fundamental (or \a basic) callbacks of a constraint handler.
    1523 *
    1524 * Callbacks which are not necessarily implemented are grouped together as
    1525 * \ref CONS_ADDITIONALCALLBACKS "additional callbacks". Such callbacks can be used to allocate and free memory
    1526 * at different stages of the solving process. Although not mandatory, it might be useful to implement
    1527 * some of these callbacks, e.g., to extend your constraint handler by a
    1528 * \ref CONSSEPALP "separation" or \ref CONSPRESOL "presolving" functionality.
    1529 *
    1530 * All callbacks should be passed to SCIP during the SCIPinclude<PLUGINTYPE><PLUGINNAME> function
    1531 * (e.g., SCIPincludeConshdlrKnapsack() for the \ref cons_knapsack.h "knapsack constraint handler").
    1532 * Since SCIP version 3.0, two ways of setting callbacks can be used, either via SCIPincludeConshdlr()
    1533 * (all at once, as it always was), or via SCIPincludeConshdlrBasic() and setter functions for additional callbacks.
    1534 * Since the basic inclusion functions are very unlikely to change and will thus
    1535 * make your code more stable towards future versions of SCIP with more callbacks,
    1536 * we recommend the latter choice, as explained in the \ref CONS_INTERFACE "interface" section.
    1537 *
    1538 * @section CONS_FUNDAMENTALCALLBACKS Fundamental Callbacks
    1539 *
    1540 * By implementing the fundamental callbacks, you define the semantics of the constraint class the constraint handler
    1541 * deals with.
    1542 * If these functions are implemented, the resulting code is already correct and finds the optimal solution to the
    1543 * given problem instance.
    1544 * However, it might be very slow because the additional features, like cut separation and domain propagation, are
    1545 * missing.
    1546 * In the C++ wrapper class scip::ObjConshdlr, the fundamental callbacks are virtual abstract member functions.
    1547 * You have to implement them in order to be able to construct an object of your constraint handler class.
    1548 *
    1549 * There are three fundamental callbacks that are all dealing with the feasibility of a given solution.
    1550 * They are called at different places in the algorithm and have slightly different meaning.
    1551 * However, it is usually reasonable to implement a single local function that is called by all of the three callback
    1552 * functions with slightly modified parameters.
    1553 * The fourth function provides dual information that is used for example in preprocessing.
    1554 *
    1555 * Additional documentation for the callbacks can be found in type_cons.h.
    1556 *
    1557 * @subsection CONSCHECK
    1558 *
    1559 * The CONSCHECK callback gets a primal solution candidate in a SCIP_SOL* data structure
    1560 * and has to check this solution for global feasibility.
    1561 * It has to return a result SCIP_FEASIBLE, if the solution satisfies all the constraints of the constraint handler,
    1562 * and a result SCIP_INFEASIBLE if there is at least one constraint that is violated.
    1563 *
    1564 * If the solution is not NULL, SCIP should also be informed about the constraint violation with a call to
    1565 * SCIPupdateSolConsViolation() and additionally SCIPupdateSolLPRowViolation() for every row of the constraint's current
    1566 * representation in the LP relaxation, if any such rows exist.
    1567 * As a convenience function, SCIPupdateSolLPConsViolation() can be used if the constraint
    1568 * is represented completely by a set of LP rows, meaning that the current constraint violation is equal to the maximum
    1569 * of the contraint violations of the corresponding LP rows.
    1570 *
    1571 * The callback is used by primal heuristics to check a constructed solution for feasibility.
    1572 * That means, the constraint handler has to deal with arbitrary solutions that do not necessarily satisfy the bounds
    1573 * and constraints of the local subproblem.
    1574 *
    1575 * The value of a variable \em var in the given solution \em sol can be accessed by calling
    1576 * \code
    1577 * SCIPgetSolVal(scip, sol, var)
    1578 * \endcode
    1579 *
    1580 * For example, the \ref cons_knapsack.h "knapsack constraint handler" loops over its constraints and
    1581 * calculates the scalar product \f$w^T x\f$ of weights \f$w\f$ with the solution vector \f$x\f$.
    1582 * This scalar product is compared with the capacity of the knapsack constraint.
    1583 * If it exceeds the capacity, the CONSCHECK function is immediately aborted with the result SCIP_INFEASIBLE.
    1584 * If all knapsack constraints are satisfied, a result SCIP_FEASIBLE is returned.
    1585 *
    1586 * @subsection CONSENFOLP
    1587 *
    1588 * The CONSENFOLP function is called after the price-and-cut loop was finished and an LP solution is available.
    1589 * Like the CHECK call, the ENFOLP function should return a result SCIP_FEASIBLE, if the solution satisfies all the
    1590 * constraints.
    1591 * However, the behavior should be different, if the solution violates some of the associated constraints.
    1592 * The constraint handler may return a result SCIP_INFEASIBLE in this situation, but this is not the best what
    1593 * one can do.
    1594 * The ENFOLP function has the possibility of \em resolving the infeasibility by
    1595 * - stating that the current subproblem is infeasible (result SCIP_CUTOFF),
    1596 * - adding an additional constraint that resolves the infeasibility (result SCIP_CONSADDED),
    1597 * - reducing the domain of a variable (result SCIP_REDUCEDDOM),
    1598 * - adding a cutting plane (result SCIP_SEPARATED),
    1599 * - tightening the LP primal feasibility tolerance and requesting to solve the LP again (result SCIP_SOLVELP),
    1600 * - performing a branching (result SCIP_BRANCHED).
    1601 *
    1602 * Note that in case SCIP_CONSADDED, the added constraints must be created with flag initial=TRUE.
    1603 *
    1604 * However, the solution is not given as a SCIP_SOL* data structure.
    1605 *
    1606 * The value of a variable <code>var</code> in the LP solution can be accessed by calling
    1607 * \code
    1608 * SCIPgetVarSol(scip, var)
    1609 * \endcode
    1610 * or by
    1611 * \code
    1612 * SCIPgetSolVal(scip, NULL, var)
    1613 * \endcode
    1614 * By using the latter function, you can have a single local function to check a solution for feasibility by passing
    1615 * the given <code>sol</code> to the CONSCHECK call and by passing a NULL pointer as <code>sol</code> to
    1616 * the CONSENFOLP and CONSENFOPS calls.
    1617 *
    1618 *
    1619 * @subsection CONSENFOPS
    1620 *
    1621 * The CONSENFOPS callback is similar to the CONSENFOLP callback, but deals with \em pseudo \em solutions instead
    1622 * of LP solutions.
    1623 *
    1624 * If the LP was not solved at the current subproblem (either because the user did not want to solve it, or because
    1625 * numerical difficulties in the LP solving process were detected) no LP solution is available.
    1626 * In this situation, the pseudo solution is used instead.
    1627 * In this solution, the variables are set to the local bound which is best with respect to the objective function.
    1628 * You can think of the pseudo solution as solution to the LP relaxation with all constraints except the bounds
    1629 * being removed.
    1630 *
    1631 * Like the ENFOLP callback, the ENFOPS callback has to check whether the pseudo solution satisfies all the constraints
    1632 * of the constraint handler.
    1633 * The pseudo solution can be accessed by the same functions as the LP solution (SCIP knows, if the LP was solved at the
    1634 * current subproblem, and returns either the LP solution or the pseudo solution).
    1635 *
    1636 * Unlike the ENFOLP callback, the ENFOPS callback must not add cuts and cannot return the result SCIP_SEPARATED.
    1637 * It is, however, possible to force the solving of the LP by returning the result SCIP_SOLVELP.
    1638 * For example, the infeasibility of a linear constraint that contains continuous variables cannot be resolved,
    1639 * if all integer variables in the constraint are already fixed.
    1640 * In this case, the LP has to be solved in order to get a solution that satisfies the linear constraint.
    1641 *
    1642 * @subsection CONSENFORELAX
    1643 *
    1644 * The CONSENFORELAX callback is similar to the CONSENFOLP and CONSENFOPS callbacks, but deals with relaxation solutions.
    1645 *
    1646 * If the best bound computed by a relaxator that includes the whole LP is strictly better than the bound of the LP itself,
    1647 * the corresponding relaxation solution will get enforced. Therefore the CONSENFORELAX callback will only be called for
    1648 * solutions that satisfy all active LP-constraints.
    1649 *
    1650 * Like the ENFOLP and ENFOPS callbacks, the ENFORELAX callback has to check whether the solution given in sol satisfies
    1651 * all the constraints of the constraint handler. Since the callback is only called for relaxators including the whole LP,
    1652 * cuts may be added with a result of SCIP_SEPARATED, like in the ENFOLP callback. It is also possible to return
    1653 * SCIP_SOLVELP if the relaxation solution is invalid for some reason and the LP should be solved instead.
    1654 *
    1655 * Note that the CONSENFORELAX callback is only relevant if relaxators are used. Since the basic distribution of the
    1656 * SCIP Optimization Suite does not contain any relaxators, this callback can be ignored unless any relaxators are added
    1657 * via user-plugins.
    1658 *
    1659 * @subsection CONSLOCK
    1660 *
    1661 * The CONSLOCK callback provides dual information for a single constraint.
    1662 * It has to tell SCIP, which variables are existing in the given constraint, and in which way modifications of these
    1663 * variables may affect the feasibility of the constraint.
    1664 *
    1665 * For each variable that is affected by the constraint, the callback should call SCIPaddVarLocks():
    1666 * - If the constraint may become violated by decreasing the value of a variable, it should call
    1667 * SCIPaddVarLocks(scip, var, nlockspos, nlocksneg), saying that rounding down is potentially rendering the
    1668 * (positive) constraint infeasible and rounding up is potentially rendering the negation of the constraint
    1669 * infeasible.
    1670 * - If the constraint may become violated by increasing the value of a variable, it should call
    1671 * SCIPaddVarLocks(scip, var, nlocksneg, nlockspos), saying that rounding up is potentially rendering the
    1672 * constraint's negation infeasible and rounding down is potentially rendering the constraint itself
    1673 * infeasible.
    1674 * - If the constraint may become violated by changing the variable in any direction, it should call
    1675 * SCIPaddVarLocks(scip, var, nlockspos + nlocksneg, nlockspos + nlocksneg).
    1676 *
    1677 * <b>Note:</b> You do not have to worry about nlockspos and nlocksneg. These integer values are given as
    1678 * parameter of the CONSLOCK callback (see type_cons.h). Just use these variables in the above described
    1679 * fashion <b>without</b> adding or subtracting anything to them. In case of the knapsack constraints this
    1680 * function looks like this.
    1681 *
    1682 * @refsnippet{src/scip/cons_knapsack.c,SnippetConsLockKnapsack}
    1683 *
    1684 * To give same more intuition, consider the linear constraint \f$3x -5y +2z \leq 7\f$ as an example.
    1685 * The CONSLOCK callback of the linear constraint handler should call
    1686 * SCIPaddVarLocks(scip, x, nlocksneg, nlockspos), SCIPaddVarLocks(scip, y, nlockspos, nlocksneg),
    1687 * and SCIPaddVarLocks(scip, z, nlocksneg, nlockspos) to tell SCIP, that rounding up of \f$x\f$
    1688 * and \f$z\f$ and rounding down of \f$y\f$ can destroy the feasibility of the constraint, while rounding
    1689 * down of \f$x\f$ and \f$z\f$ and rounding up of \f$y\f$ can destroy the feasibility of the
    1690 * constraint's negation \f$3x -5y +2z > 7\f$.
    1691 * \n
    1692 * A linear constraint \f$2 \leq 3x -5y +2z \leq 7\f$ should call
    1693 * SCIPaddVarLocks(scip, ..., nlockspos + nlocksneg, nlockspos + nlocksneg) on all variables,
    1694 * since rounding in both directions of each variable can destroy both the feasibility of the
    1695 * constraint and it's negation \f$3x -5y +2z < 2\f$ or \f$3x -5y +2z > 7\f$.
    1696 *
    1697 *
    1698 * @section CONS_ADDITIONALCALLBACKS Additional Callbacks
    1699 *
    1700 * The additional callbacks do not need to be implemented in every case, but provide useful functionality
    1701 * for many applications. They can be added to your constraint handler via setter functions, see
    1702 * \ref CONS_INTERFACE "here".
    1703 *
    1704 * @subsection CONSFREE
    1705 *
    1706 * If you are using constraint handler data, you have to implement this function in order to free the
    1707 * constraint handler data. This can be done by the following procedure (which is taken from the
    1708 * \ref cons_knapsack.h "knapsack constraint handler"):
    1709 *
    1710 * @refsnippet{src/scip/cons_knapsack.c,SnippetConsFreeKnapsack}
    1711 *
    1712 * If you have allocated memory for fields in your constraint handler data, remember to free this memory
    1713 * before freeing the constraint handler data itself.
    1714 * If you are using the C++ wrapper class, this function is not available.
    1715 * Instead, just use the destructor of your class to free the member variables of your class.
    1716 *
    1717 * @subsection CONSHDLRCOPY
    1718 *
    1719 * The CONSHDLRCOPY callback is executed when the SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this
    1720 * callback as <code>NULL</code> the user disables the inclusion of the specified constraint handler into all copied SCIP
    1721 * instances. This may deteriorate the performance of primal heuristics solving sub-SCIPs, since these constitute only
    1722 * relaxations of the original problem if constraint handlers are missing.
    1723 *
    1724 * A usual implementation just
    1725 * calls the interface function which includes the constraint handler to the model. For example, this callback is
    1726 * implemented for the \ref cons_knapsack.c "knapsack constraint handler" as follows:
    1727 *
    1728 * @refsnippet{src/scip/cons_knapsack.c,SnippetConsCopyKnapsack}
    1729 *
    1730 * <b>Note:</b> If you implement this callback, take care when setting the valid pointer.
    1731 *
    1732 * A problem copy is called valid if it is valid in both the primal and the dual sense, i.e., if
    1733 *
    1734 * - it is a relaxation of the source problem
    1735 * - it does not enlarge the feasible region.
    1736 *
    1737 * A constraint handler may choose to not copy a constraint and still declare the resulting copy as valid. It must ensure
    1738 * the feasibility of any solution to the problem copy in the original (source) space.
    1739 *
    1740 * <b>Note:</b> If you implement this callback and the constraint handler needs constraints (see CONSHDLR_NEEDSCONS),
    1741 * then you also need to implement the callback \ref CONSCOPY.
    1742 *
    1743 * @subsection CONSINIT
    1744 *
    1745 * The CONSINIT callback is executed after the problem is transformed.
    1746 * The constraint handler may, e.g., use this call to replace the original variables in its constraints by transformed
    1747 * variables, or to initialize its statistical constraint handler data.
    1748 *
    1749 * @subsection CONSEXIT
    1750 *
    1751 * The CONSEXIT callback is executed before the transformed problem is freed.
    1752 * In this function, the constraint handler should free all resources that were allocated for the solving process.
    1753 *
    1754 * @subsection CONSINITPRE
    1755 *
    1756 * The CONSINITPRE callback is executed before the preprocessing is started, even if presolving is turned off.
    1757 * The constraint handler may use this call to initialize its presolving data, or to modify its constraints
    1758 * before the presolving process begins.
    1759 * Necessary constraint modifications that have to be performed even if presolving is turned off should be done here
    1760 * or in the presolving deinitialization call.
    1761 *
    1762 * @subsection CONSEXITPRE
    1763 *
    1764 * The CONSEXITPRE callback is executed after the preprocessing has been finished, even if presolving is turned off.
    1765 * The constraint handler may use this call e.g. to clean up its presolving data, or to finally modify its constraints
    1766 * before the branch-and-bound process begins.
    1767 * Necessary constraint modifications that have to be performed even if presolving is turned off should be done here
    1768 * or in the presolving initialization call.
    1769 * Besides necessary modifications and clean up, no time consuming operations should be done.
    1770 *
    1771 * @subsection CONSINITSOL
    1772 *
    1773 * The CONSINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    1774 * begin.
    1775 * The constraint handler may use this call to initialize its branch-and-bound specific data.
    1776 *
    1777 * @subsection CONSEXITSOL
    1778 *
    1779 * The CONSEXITSOL callback is executed before the branch-and-bound process is freed.
    1780 * The constraint handler should use this call to clean up its branch-and-bound data, in particular to release
    1781 * all LP rows that it has created or captured.
    1782 *
    1783 * @subsection CONSDELETE
    1784 *
    1785 * The CONSDELETE callback is executed if a constraint should be freed.
    1786 * You can think of it as the destructor of a single constraint.
    1787 * In the callback, you have to free the given constraint data.
    1788 * The CONSDELETE callback is therefore the counterpart of the SCIPcreateCons...() interface function and the CONSTRANS
    1789 * function.
    1790 *
    1791 * @subsection CONSTRANS
    1792 *
    1793 * The CONSTRANS function is called for each constraint of the constraint handler, when the user starts the solving
    1794 * process.
    1795 * It has to copy the original constraint data of the constraint to the memory for the transformed problem.
    1796 * You can think of it as a copy constructor for a single constraint.
    1797 *
    1798 * The original model is copied in order to protect it from transformations that are applied during the solving process,
    1799 * in particular during preprocessing.
    1800 * Preprocessing and solving always operates on the transformed problem.
    1801 * If the solving process data are freed, the original data still exist and the user can, e.g., modify the problem and
    1802 * restart the solving process.
    1803 *
    1804 * If you do not implement the CONSTRANS function, a transformed constraint is created with the same flags and the
    1805 * same constraint data pointer.
    1806 * That means, the transformed constraint points to the original constraint data.
    1807 * This is okay, as long as the constraint data is not changed during the solving process.
    1808 * If you want to implement preprocessing functions or other functions that modify the constraint data, you have to
    1809 * implement the CONSTRANS function and create a copy of the constraint data.
    1810 *
    1811 * Here is an example, which is taken from the \ref cons_knapsack.h "knapsack constraint handler":
    1812 *
    1813 * @refsnippet{src/scip/cons_knapsack.c,SnippetConsTransKnapsack}
    1814 *
    1815 * @subsection CONSINITLP
    1816 *
    1817 * The CONSINITLP callback is executed before the first LP relaxation is solved.
    1818 * It should add the LP relaxations of all "initial" constraints to the LP. The function should scan the constraints
    1819 * array for constraints that are marked initial via calls to SCIPconsIsInitial() and put the LP relaxation
    1820 * of all initial constraints to the LP with calls to SCIPaddRow().
    1821 *
    1822 * @subsection CONSSEPALP
    1823 *
    1824 * The CONSSEPALP callback is executed during the price-and-cut loop of the subproblem processing.
    1825 * It should try to generate cutting planes for the constraints of the constraint handler in order to separate
    1826 * the current LP solution.
    1827 * The function is called in the LP solution loop, which means that a valid LP solution exists.
    1828 *
    1829 * Usually, a separation callback searches and produces cuts, that are added with a call to SCIPaddRow().
    1830 * If the cut should be remembered in the global cut pool, it may also call SCIPaddPoolCut().
    1831 * If the cut is constructed via multiple calls to SCIPaddVarToRow(), then performance can be improved by calling
    1832 * SCIPcacheRowExtensions() before these additions and SCIPflushRowExtensions() after.
    1833 * However, the callback may also produce domain reductions or add other constraints.
    1834 *
    1835 * The CONSSEPALP callback has the following options:
    1836 * - detecting that the node is infeasible in the variables' bounds and can be cut off (result SCIP_CUTOFF)
    1837 * - adding an additional constraint (result SCIP_CONSADDED)
    1838 * - reducing a variable's domain (result SCIP_REDUCEDDOM)
    1839 * - adding a cutting plane to the LP (result SCIP_SEPARATED)
    1840 * - stating that the separator searched, but did not find domain reductions, cutting planes, or cut constraints
    1841 * (result SCIP_DIDNOTFIND)
    1842 * - stating that the separator was skipped (result SCIP_DIDNOTRUN)
    1843 * - stating that the separator was skipped, but should be called again (result SCIP_DELAYED)
    1844 * - stating that a new separation round should be started without calling the remaining separator functions (result SCIP_NEWROUND)
    1845 *
    1846 * Please see also the @ref CONS_ADDITIONALPROPERTIES section to learn about the properties
    1847 * CONSHDLR_SEPAFREQ, CONSHDLR_SEPAPRIORITY, and CONSHDLR_DELAYSEPA, which influence the behaviour of SCIP
    1848 * calling CONSSEPALP.
    1849 *
    1850 * @subsection CONSSEPASOL
    1851 *
    1852 * The CONSSEPASOL callback is executed during separation loop on arbitrary primal solutions.
    1853 * It should try to generate cutting planes for the constraints of the constraint handler in order to separate
    1854 * the given primal solution.
    1855 * The function is not called in the LP solution loop, which means that there is no valid LP solution.
    1856 *
    1857 * Usually, a separation callback searches and produces cuts, that are added with a call to SCIPaddRow().
    1858 * If the cut should be remembered in the global cut pool, it may also call SCIPaddPoolCut().
    1859 * If the cut is constructed via multiple calls to SCIPaddVarToRow(), then performance can be improved by calling
    1860 * SCIPcacheRowExtensions() before these additions and SCIPflushRowExtensions() after.
    1861 * However, the callback may also produce domain reductions or add other constraints.
    1862 *
    1863 * The CONSSEPASOL callback has the following options:
    1864 * - detecting that the node is infeasible in the variables' bounds and can be cut off (result SCIP_CUTOFF)
    1865 * - adding an additional constraint (result SCIP_CONSADDED)
    1866 * - reducing a variable's domain (result SCIP_REDUCEDDOM)
    1867 * - adding a cutting plane to the LP (result SCIP_SEPARATED)
    1868 * - stating that the separator searched, but did not find domain reductions, cutting planes, or cut constraints
    1869 * (result SCIP_DIDNOTFIND)
    1870 * - stating that the separator was skipped (result SCIP_DIDNOTRUN)
    1871 * - stating that the separator was skipped, but should be called again (result SCIP_DELAYED)
    1872 * - stating that a new separation round should be started without calling the remaining separator functions (result SCIP_NEWROUND)
    1873 *
    1874 * Please see also the @ref CONS_ADDITIONALPROPERTIES section to learn about the properties
    1875 * CONSHDLR_SEPAFREQ, CONSHDLR_SEPAPRIORITY, and CONSHDLR_DELAYSEPA, which influence the behaviour of SCIP
    1876 * calling CONSSEPASOL.
    1877 *
    1878 * @subsection CONSPROP
    1879 *
    1880 * The CONSPROP callback is called during the subproblem processing.
    1881 * It should propagate the constraints, which means that it should infer reductions in the variables' local bounds
    1882 * from the current local bounds.
    1883 * This technique, which is the main workhorse of constraint programming, is called "node preprocessing" in the
    1884 * Integer Programming community.
    1885 *
    1886 * The CONSPROP callback has the following options:
    1887 * - detecting that the node is infeasible in the variables' bounds and can be cut off (result SCIP_CUTOFF)
    1888 * - reducing a variable's domain (result SCIP_REDUCEDDOM)
    1889 * - stating that the propagator searched, but did not find domain reductions, cutting planes, or cut constraints
    1890 * (result SCIP_DIDNOTFIND)
    1891 * - stating that the propagator was skipped (result SCIP_DIDNOTRUN)
    1892 * - stating that the propagator was skipped, but should be called again (result SCIP_DELAYED)
    1893 *
    1894 * Please see also the @ref CONS_ADDITIONALPROPERTIES section to learn about the properties
    1895 * CONSHDLR_PROPFREQ, CONSHDLR_DELAYPROP, and CONSHDLR_PROP_TIMING, which influence the behaviour of SCIP
    1896 * calling CONSPROP.
    1897 *
    1898 * @subsection CONSRESPROP
    1899 *
    1900 * If the constraint handler should support \ref CONF "conflict analysis", it has to supply a CONSRESPROP function.
    1901 * It also should call SCIPinferVarLbCons() or SCIPinferVarUbCons() in domain propagation instead of SCIPchgVarLb() or
    1902 * SCIPchgVarUb() in order to deduce bound changes on variables.
    1903 * In the SCIPinferVarLbCons() and SCIPinferVarUbCons() calls, the handler provides the constraint that deduced the
    1904 * variable's bound change, and an integer value <code>inferinfo</code> that can be arbitrarily chosen.
    1905 *
    1906 * The propagation conflict resolving function CONSRESPROP must then be implemented to provide the "reasons" for the bound
    1907 * changes, i.e., the bounds of variables at the time of the propagation, which forced the constraint to set the
    1908 * conflict variable's bound to its current value. It can use the <code>inferinfo</code> tag to identify its own propagation rule
    1909 * and thus identify the "reason" bounds. The bounds that form the reason of the assignment must then be provided by
    1910 * calls to SCIPaddConflictLb() and SCIPaddConflictUb() in the propagation conflict resolving function.
    1911 *
    1912 * <b>Note:</b> The fact that <code>inferinfo</code> is an integer, as opposed to an arbitrary data object, is a compromise between space and speed. Sometimes a propagator would
    1913 * need more information to efficiently infer the original propagation steps that lead to the conflict. This would,
    1914 * however, require too much space. In the extreme, the original propagation steps have to be repeated.
    1915 *
    1916 * For example, the \ref cons_logicor.h "logicor constraint" \f$c = x \vee y \vee z\f$ fixes variable \f$z\f$ to TRUE (i.e., changes the lower
    1917 * bound of \f$z\f$ to 1.0), if both, \f$x\f$ and \f$y\f$, are assigned to FALSE (i.e., if the upper bounds of these
    1918 * variables are 0.0). It uses <code>SCIPinferVarLbCons(scip, z, 1.0, c, 0)</code> to apply this assignment (an
    1919 * inference information tag is not needed by the constraint handler and is set to 0). In the conflict analysis, the
    1920 * constraint handler may be asked to resolve the lower bound change on \f$z\f$ with constraint \f$c\f$, that was
    1921 * applied at a time given by a bound change index "bdchgidx". With a call to <code>SCIPgetVarLbAtIndex(z,
    1922 * bdchgidx)</code>, the handler can find out, that the lower bound of variable \f$z\f$ was set to 1.0 at the given
    1923 * point of time, and should call <code>SCIPaddConflictUb(scip, x, bdchgidx)</code> and <code>SCIPaddConflictUb(scip, y,
    1924 * bdchgidx)</code> to tell SCIP, that the upper bounds of \f$x\f$ and \f$y\f$ at this point of time were the reason for
    1925 * the deduction of the lower bound of \f$z\f$.
    1926 *
    1927 * If conflict analysis should not be supported, the function has to set the result code to SCIP_DIDNOTFIND. Although
    1928 * this is a viable approach to circumvent the implementation of the usually rather complex conflict resolving function, it
    1929 * will make the conflict analysis less effective. We suggest to first omit the conflict resolving function and check how
    1930 * effective the \ref CONSPROP "propagation function" is. If it produces a lot of propagations for your application, you definitely should
    1931 * consider implementing the conflict resolving function.
    1932 *
    1933 * @subsection CONSPRESOL
    1934 *
    1935 * The CONSPRESOL callback is called during preprocessing.
    1936 * It should try to tighten the domains of the variables, tighten the coefficients of the constraints of the constraint
    1937 * handler, delete redundant constraints, aggregate and fix variables if possible, and upgrade constraints to more
    1938 * specific types.
    1939 *
    1940 * If the CONSPRESOL callback applies changes to the constraint data, you also have to implement the \ref CONSTRANS callback
    1941 * in order to copy the constraint data to the transformed problem space and protect the original problem from the
    1942 * preprocessing changes.
    1943 *
    1944 * To inform SCIP that the presolving function found a reduction the result pointer has to be set in a proper way.
    1945 * The following options are possible:
    1946 *
    1947 * - SCIP_UNBOUNDED : at least one variable is not bounded by any constraint in objective direction
    1948 * - SCIP_CUTOFF : at least one constraint is infeasible in the variable's bounds
    1949 * - SCIP_SUCCESS : the presolver found a reduction
    1950 * - SCIP_DIDNOTFIND : the presolver searched, but did not find a presolving change
    1951 * - SCIP_DIDNOTRUN : the presolver was skipped
    1952 * - SCIP_DELAYED : the presolver was skipped, but should be called again
    1953 *
    1954 * Please see also the @ref CONS_ADDITIONALPROPERTIES section to learn about the properties
    1955 * CONSHDLR_PRESOLTIMING and CONSHDLR_MAXPREROUNDS, which influence the behaviour of SCIP
    1956 * calling CONSPRESOL.
    1957 *
    1958 * @subsection CONSACTIVE
    1959 *
    1960 * The CONSACTIVE callback is called each time a constraint of the constraint handler is activated.
    1961 * For example, if a constraint is added locally to a subproblem, the CONSACTIVE callback is called whenever the
    1962 * search enters the subtree where the constraint exists.
    1963 *
    1964 * @subsection CONSDEACTIVE
    1965 *
    1966 * The CONSDEACTIVE callback is called each time a constraint of the constraint handler is deactivated.
    1967 * For example, if a constraint is added locally to a subproblem, the CONSDEACTIVE callback is called whenever the
    1968 * search leaves the subtree where the constraint exists.
    1969 *
    1970 * @subsection CONSENABLE
    1971 *
    1972 * The CONSENABLE callback is called each time a constraint of the constraint handler is enabled.
    1973 * Constraints might be active without being enabled. In this case, only the feasibility checks are executed,
    1974 * but domain propagation and separation is skipped.
    1975 *
    1976 * @subsection CONSDISABLE
    1977 *
    1978 * The CONSDISABLE callback is called each time a constraint of the constraint handler is disabled.
    1979 *
    1980 * @subsection CONSPRINT
    1981 *
    1982 * The CONSPRINT callback is called, when the user asks SCIP to display the problem to the screen
    1983 * or save the problem into a file. This is, however, only the case if the user requested the CIP format.
    1984 * For more details about reading and writing with SCIP we refer to the \ref READER "file readers". In this
    1985 * callback the constraint handler should display the data of the constraint in an appropriate form.
    1986 * The output format that is defined by the CONSPRINT callbacks is called CIP format.
    1987 * In later versions of SCIP, the constraint handlers should also be able to parse (i.e., read) constraints
    1988 * which are given in CIP format.
    1989 *
    1990 * @subsection CONSCOPY
    1991 *
    1992 * The CONSCOPY callback is used whenever constraints should be copied from one SCIP instance into another SCIP
    1993 * instance. This function comes with the necessary parameters to do so, most importantly with a mapping of the variables of the
    1994 * source SCIP instance to the corresponding variables of the target SCIP instance, and a mapping for the constraints
    1995 * in the same way. For a complete list of all arguments of this callback see type_cons.h.
    1996 *
    1997 * To get the corresponding target variable of a given source variable, you can use the variable map directly:
    1998 *
    1999 * \code
    2000 * targetvar = (SCIP_VAR*) SCIPhashmapGetImage(varmap, sourcevar);
    2001 * \endcode
    2002 *
    2003 * We recommend, however, to use the function SCIPgetVarCopy() which gets besides others the variable map and the constraint map as input
    2004 * and returns the requested target variable. The advantage of using SCIPgetVarCopy() is that in the case
    2005 * the required variable does not yet exist, it is created and added to the copy automatically:
    2006 *
    2007 * \code
    2008 * SCIP_CALL( SCIPgetVarCopy(sourcescip, scip, sourcevar, &targetvar, varmap, consmap, global) );
    2009 * \endcode
    2010 *
    2011 * Finally, the result pointer <code>valid</code> has to be set to TRUE if (and only if!) the copy process was successful.
    2012 *
    2013 * <b>Note:</b> Be careful when setting the valid pointer.
    2014 * A problem copy is called valid if it is valid in both the primal and the dual sense, i.e., if
    2015 *
    2016 * - it is a relaxation of the source problem
    2017 * - it does not enlarge the feasible region.
    2018 *
    2019 * A constraint handler may choose to not copy a constraint and still declare the resulting copy as valid. Therefore, it must ensure
    2020 * the feasibility of any solution to the problem copy in the original (source) space.
    2021 *
    2022 * For an example implementation we refer to cons_linear.h. Additional documentation and the complete list of all
    2023 * parameters can be found in the file in type_cons.h.
    2024 *
    2025 * @subsection CONSPARSE
    2026 *
    2027 * This function is the counterpart to CONSPRINT. The ideal idea is that a constraint handler is able to parse the output
    2028 * which it generated via the CONSPRINT function and creates the corresponding constraint. If the parsing was successfully
    2029 * the result pointer success should be set to TRUE. An example implementation can be found in the \ref cons_linear.h
    2030 * "linear constraint handler".
    2031 *
    2032 * @subsection CONSDELVARS
    2033 *
    2034 * This function should iterate over the given constraints and delete all variables that were marked for deletion by SCIPdelVar().
    2035 * Variable deletion is especially interesting for branch-cut-and-price applications. If your constraint handler allows
    2036 * the addition of variables during the solving process (see "modifiable" attribute of constraints), then you might also want to
    2037 * implement this callback. This would allow you to not only create variables during solving, but also remove them dynamically
    2038 * from the problem to reduce memory consumption in case they are no longer necessary.
    2039 * During presolving, SCIP may also find that some variables are not needed anymore and then try
    2040 * to delete them. Thus, if you do not implement this callback, the constraint handler should capture its variables via
    2041 * SCIPcaptureVar() to prevent SCIP from erroneously deleting them.
    2042 *
    2043 * Additional documentation and the complete list of all parameters can be found in the file type_cons.h.
    2044 *
    2045 * @subsection CONSGETVARS
    2046 *
    2047 * The CONSGETVARS callback of a constraint handler can be implemented to give access to the constraint variables
    2048 * as array, independently from the internal data structure of the constraint. The buffer array
    2049 * is already passed, together with its length. Consider implementing @ref CONSGETNVARS, too, to have
    2050 * information about the number of variables in this constraint.
    2051 *
    2052 * @subsection CONSGETNVARS
    2053 *
    2054 * This callback can be implemented to return the number of variables involved into a particular constraint.
    2055 * In order to have access to the variable pointers, consider implementing @ref CONSGETVARS.
    2056 *
    2057 * @refsnippet{src/scip/cons_linear.c,Callback for the number of variables}
    2058 *
    2059 * @subsection CONSGETDIVEBDCHGS
    2060 *
    2061 * This callback is used inside the various diving heuristics of SCIP and does not affect the normal branching
    2062 * of the actual search.
    2063 * The constraint handler can provide this callback to render a current working solution (even more) infeasible by
    2064 * suggesting one or several variable bound changes.
    2065 *
    2066 * @section CONS_FURTHERINFO Further documentation
    2067 *
    2068 * Further documentation can be found in @ref type_cons.h for callback descriptions and a complete
    2069 * list of all callback parameters, or in @ref scip.h
    2070 * for globally available functions.
    2071 */
    2072
    2073/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    2074
    2075/**@page PRICER How to add variable pricers
    2076 *
    2077 * A pricer performs the dynamic generation of new variables in a column generation algorithm.
    2078 * It is an algorithmic representation of a (usually exponential) number of variables.
    2079 * The \ref PRICERREDCOST and \ref PRICERFARKAS functions are called after each LP solve to generate additional
    2080 * variables which may improve the objective value or decrease the LP infeasibility, respectively.
    2081 * \n
    2082 * A complete list of all pricers contained in this release can be found \ref PRICERS "here".
    2083 *
    2084 * If the pricer finds one or more variables with negative reduced costs or negative Farkas value, it should
    2085 * call SCIPcreateVar() and SCIPaddPricedVar() to create and add the variable to the problem. Additionally,
    2086 * the pricer has to add the variable to all constraints in which it appears. Therefore, a pricer needs to
    2087 * know the constraints of the model and their meaning. Note that all constraints for which additional variables
    2088 * are generated by a pricer have to be flagged as "modifiable" in the SCIPcreateCons() call.
    2089 *
    2090 * We now explain how users can add their own pricers.
    2091 * For example, look into the variable pricer for the binpacking problem (examples/Binpacking/src/pricer_binpacking.c) of the
    2092 * Binpacking example project.
    2093 * The example is written in C. C++ users can easily adapt the code by using the scip::scip::ObjPricer wrapper base class and
    2094 * implement the scip_...() virtual methods instead of the SCIP_DECL_PRICER... callbacks.
    2095 *
    2096 * Additional documentation for the callbacks of a pricer can be found in the file
    2097 * type_pricer.h.
    2098 *
    2099 * Notice that if your pricer cannot cope with variable bounds other than 0 and infinity, you have to mark
    2100 * all constraints containing priced variables as modifiable, and you may have to disable reduced cost
    2101 * strengthening by setting propagating/rootredcost/freq to -1.
    2102 *
    2103 * Here is what you have to do to implement a pricer:
    2104 * -# Copy the template files src/scip/pricer_xyz.c and src/scip/pricer_xyz.h into files "pricer_mypricer.c"
    2105 * and "pricer_mypricer.h".
    2106 * \n
    2107 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    2108 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    2109 * -# Use `SCIPincludePricerMypricer()` in order to include the pricer into your SCIP instance,
    2110 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    2111 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    2112 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mypricer".
    2113 * -# Adjust the properties of the pricer (see \ref PRICER_PROPERTIES).
    2114 * -# Define the pricer data (see \ref PRICER_DATA). This is optional.
    2115 * -# Implement the interface functions (see \ref PRICER_INTERFACE).
    2116 * -# Implement the fundamental callbacks (see \ref PRICER_FUNDAMENTALCALLBACKS).
    2117 * -# Implement the additional callbacks (see \ref PRICER_ADDITIONALCALLBACKS). This is optional.
    2118 *
    2119 *
    2120 * @section PRICER_PROPERTIES Properties of a Pricer
    2121 *
    2122 * At the top of the new file "pricer_mypricer.c" you can find the pricer properties.
    2123 * These are given as compiler defines.
    2124 * In the C++ wrapper class, you have to provide the pricer properties by calling the constructor
    2125 * of the abstract base class scip::ObjPricer from within your constructor.
    2126 * The properties you have to set have the following meaning:
    2127 *
    2128 * \par PRICER_NAME: the name of the pricer.
    2129 * This name is used in the interactive shell to address the pricer.
    2130 * Additionally, if you are searching for a pricer with SCIPfindPricer(), this name is looked up.
    2131 * Names have to be unique: no two pricers may have the same name.
    2132 *
    2133 * \par PRICER_DESC: the description of the pricer.
    2134 * This string is printed as a description of the pricer in the interactive shell.
    2135 *
    2136 * \par PRICER_PRIORITY: the priority of the pricer.
    2137 * In each pricing round during the price-and-cut loop of the subproblem processing, the included pricers are
    2138 * called in a predefined order, which is given by the priorities of the pricers.
    2139 * The higher the priority, the earlier the pricer is called.
    2140 * Usually, you will have only one pricer in your application and the priority is therefore irrelevant.
    2141 *
    2142 * \par PRICER_DELAY: the default for whether the pricer should be delayed, if other variables with negative reduced
    2143 * costs have already been found in the current pricing round.
    2144 * Variables may be declared to be "removable" in the SCIPcreateVar() call. This means that SCIP may remove the variable
    2145 * from the LP if it was inactive (i.e., sitting at zero) for a number of LP solves. Nevertheless, after the removal of the
    2146 * column from the LP, the variable still exists, and SCIP can calculate reduced costs and add it to the LP again if
    2147 * necessary.
    2148 * \n
    2149 * If the PRICER_DELAY flag is set to TRUE (which is the common setting), all those existing variables with negative reduced costs
    2150 * are added to the LP, and the LP is resolved before the pricer is called. Thus, the pricer can assume that all existing variables
    2151 * have non-negative reduced costs if the \ref PRICERREDCOST function is called or non-positive Farkas value if the \ref PRICERFARKAS
    2152 * function is called.
    2153 * \n
    2154 * In some applications, this inner pricing loop on the already existing variables can significantly slow down the solving process,
    2155 * since it may lead to the addition of only very few variables in each pricing round. If this is an issue in your application,
    2156 * you should consider setting the PRICER_DELAY flag to FALSE. You must, however, be aware of the fact that there may be already
    2157 * existing variables with negative reduced costs. For example, this may lead to the issue that your pricer generates the same
    2158 * variable twice. In some models, this is not critical because an optimal solution would choose only one of the two identical
    2159 * variables anyway, but for other models this can lead to wrong results because the duplication of a variable essentially doubles
    2160 * the upper bound of the variable.
    2161 *
    2162 *
    2163 * @section PRICER_DATA Pricer Data
    2164 *
    2165 * Below the header "Data structures" you can find a struct which is called "struct SCIP_PricerData".
    2166 * In this data structure, you can store the data of your pricer. For example, it may be convenient to store pointers to the
    2167 * constraints of the problem instance here, because the pricer has to add variables to those constraints.
    2168 * If you are using C++, you can add pricer data, as usual, as object variables to your class.
    2169 * \n
    2170 * Defining pricer data is optional. You can leave the struct empty.
    2171 *
    2172 *
    2173 * @section PRICER_INTERFACE Interface Functions
    2174 *
    2175 * At the bottom of "pricer_mypricer.c" you can find the interface function SCIPincludePricerMypricer(), which also appears in "pricer_mypricer.h".
    2176 * It is called by the user, if (s)he wants to include the pricer, i.e., if (s)he wants to solve a model for which variables should
    2177 * be generated by this pricer.
    2178 *
    2179 * This function only has to be adjusted slightly.
    2180 * It is responsible for notifying SCIP of the presence of the pricer. For this, you can either call SCIPincludePricer(),
    2181 * or SCIPincludePricerBasic() since SCIP version 3.0. In the latter variant, \ref PRICER_ADDITIONALCALLBACKS "additional callbacks"
    2182 * must be added via setter functions as, e.g., SCIPsetPricerCopy(). We recommend this latter variant because
    2183 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    2184 * variant must be manually adjusted with every SCIP release containing new callbacks for pricers in order to compile.
    2185 *
    2186 *
    2187 * In addition, the pricer has to be activated before the solution process starts, like it is done
    2188 * in the pricer of the Coloring application (applications/Coloring/src/reader_col.c) by calling
    2189 * \code
    2190 * SCIP_CALL( SCIPactivatePricer(scip, SCIPfindPricer(scip, "coloring")) );
    2191 * \endcode
    2192 *
    2193 * If you are using pricer data, you have to allocate the memory for the data at this point.
    2194 * You can do this by calling:
    2195 * \code
    2196 * SCIP_CALL( SCIPallocBlockMemory(scip, &pricerdata) );
    2197 * \endcode
    2198 * You also have to initialize the fields in struct SCIP_PricerData afterwards.
    2199 *
    2200 * You may also add user parameters for your pricer, see the function SCIPincludePricerColoring() in the pricer of the Coloring application
    2201 * for an example of how to add user parameters.
    2202 *
    2203 *
    2204 * @section PRICER_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Pricer
    2205 *
    2206 * The fundamental callbacks have to be implemented in order to obtain an operational algorithm.
    2207 * They are passed together with the pricer itself to SCIP using SCIPincludePricer() or SCIPincludePricerBasic(),
    2208 * see @ref PRICER_INTERFACE.
    2209 *
    2210 * In the case of a pricer, there are two fundamental callbacks, namely the @ref PRICERREDCOST and the
    2211 * @ref PRICERFARKAS callbacks, which both search for new variables and add them to the problem.
    2212 * These functions have to be implemented for every pricer; the other callbacks are optional.
    2213 * In the C++ wrapper class scip::ObjPricer, the scip_redcost() method (which corresponds to the PRICERREDCOST callback)
    2214 * is a virtual abstract member function. You have to implement it in order to be able to construct an object of your
    2215 * pricer class.
    2216 *
    2217 * Additional documentation for the callbacks can be found in type_pricer.h.
    2218 *
    2219 * @subsection PRICERREDCOST
    2220 *
    2221 * The PRICERREDCOST callback is called inside the price-and-cut loop of the subproblem solving process if the current LP relaxation
    2222 * is feasible.
    2223 * It should search for additional variables that can contribute to improve the current LP's solution value.
    2224 * In standard branch-and-price, these are variables with negative dual feasibility, that is negative
    2225 * reduced costs for non-negative variables, positive reduced costs for non-positive variables,
    2226 * and non-zero reduced costs for variables that can be negative and positive.
    2227 *
    2228 * Whenever the pricer finds a variable with negative dual feasibility, it should call SCIPcreateVar()
    2229 * and SCIPaddPricedVar() to add the variable to the problem. Furthermore, it should call the appropriate
    2230 * functions of the constraint handlers to add the necessary variable entries to the constraints, see pub_cons.h.
    2231 *
    2232 * In the usual case that the pricer either adds a new variable or ensures that there are no further variables with negative dual feasibility,
    2233 * the result pointer should be set to SCIP_SUCCESS. Only if the pricer aborts pricing without creating a new variable, but
    2234 * there might exist additional variables with negative dual feasibility, the result pointer should be set to SCIP_DIDNOTRUN.
    2235 * In this case, which sometimes is referred to as "early branching", the LP solution will not be used as a lower bound.
    2236 * The pricer can, however, store a valid lower bound in the <code>lowerbound</code> pointer.
    2237 *
    2238 * Pricers usually need the dual LP solution as input for the pricing algorithm.
    2239 * Since SCIP does not know the semantics of the individual constraints in the problem, the dual solution
    2240 * has to be provided by the constraint handlers.
    2241 * For example, the \ref cons_setppc.h "setppc constraint handler", which deals with set partitioning, packing, and covering constraints, provides
    2242 * the function SCIPgetDualsolSetppc() to access the dual solution value for a single constraint.
    2243 * Similarly, the dual solution of a linear constraint can be queried with the function SCIPgetDualsolLinear() of cons_linear.h.
    2244 * The reduced costs of the existing variables can be accessed with the function SCIPgetVarRedcost().
    2245 *
    2246 * @subsection PRICERFARKAS
    2247 *
    2248 * If the current LP relaxation is infeasible, it is the task of the pricer to generate additional variables that can
    2249 * potentially render the LP feasible again. In standard branch-and-price, these are variables with positive Farkas values,
    2250 * and the PRICERFARKAS function should identify those variables.
    2251 *
    2252 * If the LP was proven to be infeasible, we have an infeasibility proof by the dual Farkas multipliers \f$y\f$.
    2253 * With the values of \f$y\f$, an implicit inequality \f$y^T A x \ge y^T b\f$ is associated, with \f$b\f$ given
    2254 * by the sides of the LP rows and the sign of \f$y\f$:
    2255 * - if \f$y_i\f$ is positive, \f$b_i\f$ is the left hand side of the row,
    2256 * - if \f$y_i\f$ is negative, \f$b_i\f$ is the right hand side of the row.
    2257 *
    2258 * \f$y\f$ is chosen in a way, such that the valid inequality \f$y^T A x \ge y^T b\f$ is violated by all \f$x\f$,
    2259 * especially by the (for this inequality least infeasible solution) \f$x'\f$ defined by
    2260 * - \f$x'_i := ub_i\f$, if \f$y^T A_i \ge 0\f$
    2261 * - \f$x'_i := lb_i\f$, if \f$y^T A_i < 0\f$.
    2262 * Pricing in this case means to add variables \f$i\f$ with positive Farkas value, i.e., \f$y^T A_i x'_i > 0\f$.
    2263 *
    2264 * To apply Farkas pricing, the pricer needs to know the Farkas values of the constraints. Like the dual solution values for
    2265 * feasible LP solutions, the dual Farkas values for infeasible solutions can be obtained by constraint handler interface
    2266 * functions such as the SCIPgetDualfarkasLinear() function of the linear constraint handler.
    2267 * The Farkas values for the bounds of the variables can be accessed with SCIPgetVarFarkasCoef().
    2268 *
    2269 * It is useful to note that Farkas pricing is the same as the regular pricing with a zero objective function.
    2270 * Therefore, a typical implementation of a pricer would consist of a generic pricing algorithm that gets a dual solution and an
    2271 * objective function vector as input and generates variables by calling SCIPcreateVar() and SCIPaddPricedVar().
    2272 * The PRICERREDCOST callback would call this function with the regular objective function and the regular dual solution vector,
    2273 * while the PRICERFARKAS callback would call this function with a zero objective function and the Farkas vector.
    2274 * From a practical point of view, it is usually the simplest approach to provide just one Boolean flag to the generic pricing
    2275 * algorithm in order to identify whether it is reduced cost or Farkas pricing. Then, the algorithm would just call the appropriate
    2276 * functions to access the dual solution or objective function, depending on the Boolean flag.
    2277 *
    2278 * @section PRICER_ADDITIONALCALLBACKS Additional Callbacks of a Pricer
    2279 *
    2280 * The additional callbacks do not need to be implemented in every case.
    2281 * However, some of them have to be implemented for most applications. They can either be passed directly with
    2282 * SCIPincludePricer() to SCIP or via specific <b>setter functions</b> after a call of SCIPincludePricerBasic(),
    2283 * see also @ref PRICER_INTERFACE.
    2284 *
    2285 * @subsection PRICERFREE
    2286 *
    2287 * If you are using pricer data, you have to implement this function in order to free the pricer data.
    2288 * This can be done by the procedure described in stp/src/pricer_stp.c,
    2289 * see https://scipjack.zib.de/.
    2290 *
    2291 * If you have allocated memory for fields in your pricer data, remember to free this memory
    2292 * before freeing the pricer data itself.
    2293 * If you are using the C++ wrapper class, this function is not available.
    2294 * Instead, just use the destructor of your class to free the member variables of your class.
    2295 *
    2296 * @subsection PRICERCOPY
    2297 *
    2298 * The PRICERCOPY callback is executed when the SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this
    2299 * callback as <code>NULL</code> the user disables the inclusion of the pricer into all copied SCIP
    2300 * instances. This means that primal heuristics will work on a sub-SCIP that contains only a part of the variables
    2301 * and no variables are priced in during the solving process of the sub-SCIP. Therefore, primal solutions found in the
    2302 * copied problem are typically still valid for the original problem and used for its solving process,
    2303 * but dual reductions cannot be transferred to the original problem.
    2304 *
    2305 * <b>Note:</b> If you implement this callback, be careful when setting the valid pointer. The valid pointer should be
    2306 * set to TRUE if (and only if!) you can make sure that all necessary data of the pricer are copied
    2307 * correctly. If the complete problem is validly copied, i.e. if the copy functions of all problem defining plugins
    2308 * (constraint handlers and pricers) return <code>*valid = TRUE</code>, then dual reductions found for the copied problem can be
    2309 * transferred to the original SCIP instance. Thus, if the valid pointer is wrongly set to TRUE, it might happen that
    2310 * optimal solutions are cut off.
    2311 *
    2312 * @subsection PRICERINIT
    2313 *
    2314 * The PRICERINIT callback is executed after the problem is transformed.
    2315 * The pricer may, e.g., use this call to replace the original constraints stored in its pricer data by transformed
    2316 * constraints, or to initialize other elements of its pricer data.
    2317 *
    2318 * @subsection PRICEREXIT
    2319 *
    2320 * The PRICEREXIT callback is executed before the transformed problem is freed.
    2321 * In this function, the pricer should free all resources that have been allocated for the solving process in PRICERINIT.
    2322 *
    2323 * @subsection PRICERINITSOL
    2324 *
    2325 * The PRICERINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to begin.
    2326 * The pricer may use this call to initialize its branch-and-bound specific data.
    2327 *
    2328 * @subsection PRICEREXITSOL
    2329 *
    2330 * The PRICEREXITSOL callback is executed before the branch-and-bound process is freed.
    2331 * The pricer should use this call to clean up its branch-and-bound data, which was allocated in PRICERINITSOL.
    2332 *
    2333 * @section PRICER_REMARKS Further remarks
    2334 *
    2335 * If you use your own branching rule (e.g., to branch on constraints), make sure that it is able to branch on \a "pseudo solutions".
    2336 * Otherwise, SCIP will use its default branching rules, if necessary (which all branch on variables). This
    2337 * could disturb the pricing problem or branching might not even be possible, e.g., if all variables created thus far have already been fixed.
    2338 *
    2339 * Note that if the original problem is a maximization problem, SCIP will transform the problem into a minimization
    2340 * problem by multiplying the objective function by -1. The pricer has to take care of this by multiplying
    2341 * the original objective function value of all variables created during the solving process by -1.
    2342 *
    2343 * In some cases, bounds on variables are implicitly enforced by constraints of the problem and the objective function.
    2344 * Therefore, these bounds do not need to be added to the LP explicitly, which has the advantage that the pricing routine does not need to
    2345 * care about the corresponding dual values.
    2346 * We call these bounds lazy bounds, they may be set by SCIPchgVarLbLazy() and SCIPchgVarUbLazy() for upper or lower bounds, respectively.
    2347 * If the lazy bound equals the local bound, the corresponding bound is not put into the LP.
    2348 * In diving mode, lazy bounds are explicitly put into the LP, because changing the objective (which is only possible in diving)
    2349 * might reverse the implicitly given bounds. When diving is finished, the bounds are again removed from the LP.
    2350 */
    2351
    2352/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    2353
    2354/**@page PRESOL How to add presolvers
    2355 *
    2356 * Presolvers are used to reduce the size of the model by removing irrelevant information like redundant constraints,
    2357 * to strengthen the LP relaxation by exploiting integrality information, and to extract useful information in the
    2358 * presolving step.
    2359 * Constraint based presolving is done in the CONSPRESOL callbacks of the constraint handlers, see \ref CONSPRESOL.
    2360 * Some propagation steps can already be applied in presolving via the PROPRESOL callbacks of propagators, see \ref PROPPRESOL.
    2361 * The presolver plugins complement these by additional, usually optimality based, presolving reductions.
    2362 * \n
    2363 * A complete list of all presolvers contained in this release can be found \ref PRESOLVERS "here".
    2364 *
    2365 * We now explain how users can add their own presolvers.
    2366 * Take the trivial presolver (src/scip/presol_trivial.c) as an example.
    2367 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjPresol wrapper
    2368 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_PRESOL... callbacks.
    2369 *
    2370 * Additional documentation for the callbacks of a presolver, in particular for their input parameters,
    2371 * can be found in the file type_presol.h.
    2372 *
    2373 * Here is what you have to do to implement a presolver:
    2374 * -# Copy the template files src/scip/presol_xyz.c and src/scip/presol_xyz.h into files named "presol_mypresolver.c"
    2375 * and "presol_mypresolver.h".
    2376 * \n
    2377 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    2378 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    2379 * -# Use `SCIPincludePresolMypresolver()` in order to include the presolver into your SCIP instance,
    2380 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    2381 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    2382 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mypresolver".
    2383 * -# Adjust the properties of the presolver (see \ref PRESOL_PROPERTIES).
    2384 * -# Define the presolver data (see \ref PRESOL_DATA). This is optional.
    2385 * -# Implement the interface functions (see \ref PRESOL_INTERFACE).
    2386 * -# Implement the fundamental callbacks (see \ref PRESOL_FUNDAMENTALCALLBACKS).
    2387 * -# Implement the additional callbacks (see \ref PRESOL_ADDITIONALCALLBACKS). This is optional.
    2388 *
    2389 *
    2390 * @section PRESOL_PROPERTIES Properties of a Presolver
    2391 *
    2392 * At the top of the new file "presol_mypresolver.c", you can find the presolver properties.
    2393 * These are given as compiler defines.
    2394 * In the C++ wrapper class, you have to provide the presolver properties by calling the constructor
    2395 * of the abstract base class scip::ObjPresol from within your constructor.
    2396 * The properties you have to set have the following meaning:
    2397 *
    2398 * \par PRESOL_NAME: the name of the presolver.
    2399 * This name is used in the interactive shell to address the presolver.
    2400 * Additionally, if you are searching for a presolver with SCIPfindPresol(), this name is looked up.
    2401 * Names have to be <b>unique</b>: no two presolvers may have the same name.
    2402 *
    2403 * \par PRESOL_DESC: the description of the presolver.
    2404 * This string is printed as a description of the presolver in the interactive shell.
    2405 *
    2406 * \par PRESOL_TIMING: the default timing of the presolver.
    2407 * There are three presolving timings: FAST, MEDIUM, and EXHAUSTIVE.
    2408 * Every presolving round starts with the FAST presolvers. MEDIUM presolvers are only called, if FAST presolvers did not find
    2409 * enough reductions in this round so far, and EXHAUSTIVE presolving steps are only performed if all presolvers called before
    2410 * in this round were unsuccessful.
    2411 * Presolvers should be assigned a timing based on how expensive they are, e.g., presolvers that provide fast algorithms that
    2412 * usually have a high impact (i.e., remove lots of variables or tighten bounds of many variables) should have a timing FAST.
    2413 * If a presolver implements different algorithms of different complexity, it may also get multiple timings and check the timing
    2414 * internally in the \ref PRESOLEXEC callback to decide which algorithms to run.
    2415 *
    2416 * \par PRESOL_PRIORITY: the priority of the presolver.
    2417 * Within a presolving round, when calling all presolvers and presolving functions of propagators and constraint handlers
    2418 * with a given timing, those are called in
    2419 * a predefined order, which is given by the priorities of the presolvers and the check priorities of the
    2420 * constraint handlers, see \ref CONS_PROPERTIES.
    2421 * First, the presolvers with non-negative priority are called in the order of decreasing priority.
    2422 * Next, the presolving functions of the different constraint handlers are called in the order of decreasing check
    2423 * priority.
    2424 * Finally, the presolvers with negative priority are called in the order of decreasing priority.
    2425 * \n
    2426 * Again, presolvers that provide fast algorithms that usually have a high impact (i.e., remove lots of variables or tighten
    2427 * bounds of many variables) should have a high priority.
    2428 * An easy way to list the timings and
    2429 * priorities of all presolvers, propagators, and constraint handlers is to type "display presolvers", "display propagators",
    2430 * and "display conshdlrs" in the interactive shell of SCIP.
    2431 *
    2432 * \par PRESOL_MAXROUNDS: the default maximal number of rounds the presolver participates in.
    2433 * The presolving is conducted in rounds: the presolvers and presolving functions of the constraint handlers
    2434 * are called iteratively until no more reductions have been found or some other abort criterion applies.
    2435 * The "maxrounds" parameter of a presolver imposes a limit on the number of presolving rounds in which the
    2436 * presolver is called. The PRESOL_MAXROUNDS property specifies the default value for this parameter.
    2437 * A value of -1 represents an unlimited number of rounds.
    2438 *
    2439 *
    2440 * @section PRESOL_DATA Presolver Data
    2441 *
    2442 * Below the header "Data structures" you can find a struct which is called "struct SCIP_PresolData".
    2443 * In this data structure, you can store the data of your presolver. For example, you should store the adjustable parameters
    2444 * of the presolver in this data structure.
    2445 * If you are using C++, you can add presolver data as usual as object variables to your class.
    2446 * \n
    2447 * Defining presolver data is optional. You can leave this struct empty.
    2448 *
    2449 *
    2450 * @section PRESOL_INTERFACE Interface Functions
    2451 *
    2452 * At the bottom of "presol_mypresolver.c", you can find the interface function SCIPincludePresolMypresolver(),
    2453 * which also appears in "presol_mypresolver.h"
    2454 * SCIPincludePresolMypresolver() is called by the user, if (s)he wants to include the presolver,
    2455 * i.e., if (s)he wants to use the presolver in his/her application.
    2456 *
    2457 * This function only has to be adjusted slightly.
    2458 * It is responsible for notifying SCIP of the presence of the presolver. For this, you can either call SCIPincludePresol(),
    2459 * or SCIPincludePresolBasic() since SCIP version 3.0. In the latter variant, \ref PRESOL_ADDITIONALCALLBACKS "additional callbacks"
    2460 * must be added via setter functions as, e.g., SCIPsetPresolCopy(). We recommend this latter variant because
    2461 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    2462 * variant must be manually adjusted with every SCIP release containing new callbacks for presolvers in order to compile.
    2463 *
    2464 * If you are using presolver data, you have to allocate the memory for the data at this point.
    2465 * You can do this by calling:
    2466 * \code
    2467 * SCIP_CALL( SCIPallocBlockMemory(scip, &presoldata) );
    2468 * \endcode
    2469 * You also have to initialize the fields in struct SCIP_PresolData afterwards. For freeing the
    2470 * presolver data, see \ref PRESOLFREE.
    2471 *
    2472 * You may also add user parameters for your presolver, see \ref PARAM for how to add user parameters and
    2473 * the function SCIPincludePresolTrivial() in src/scip/presol_trivial.c for an example.
    2474 *
    2475 *
    2476 * @section PRESOL_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Presolver
    2477 *
    2478 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    2479 * an operational algorithm.
    2480 * They are passed together with the presolver itself to SCIP using SCIPincludePresol() or SCIPincludePresolBasic(),
    2481 * see @ref PRESOL_INTERFACE.
    2482 *
    2483 * Presolver plugins have only one fundamental callback, namely the @ref PRESOLEXEC function.
    2484 * This function has to be implemented for every presolver; the other callbacks are optional.
    2485 * In the C++ wrapper class scip::ObjPresol, the scip_exec() method (which corresponds to the PRESOLEXEC callback) is a virtual
    2486 * abstract member function.
    2487 * You have to implement it in order to be able to construct an object of your presolver class.
    2488 *
    2489 * Additional documentation for the callbacks, in particular to their input parameters,
    2490 * can be found in type_presol.h.
    2491 *
    2492 * @subsection PRESOLEXEC
    2493 *
    2494 * The PRESOLEXEC callback is called inside the presolving loop and should perform the actual presolving reductions.
    2495 * It should inspect the problem instance at hand and simplify it by tightening bounds of variables, aggregating or fixing
    2496 * variables, changing the type of variables, modifying the graph that represents the instance of your application, and
    2497 * the like.
    2498 *
    2499 * Typical functions called by a presolver are, for example, SCIPchgVarType(), SCIPfixVar(), SCIPaggregateVars(), SCIPtightenVarLb(),
    2500 * and SCIPtightenVarUb().
    2501 *
    2502 *
    2503 * @section PRESOL_ADDITIONALCALLBACKS Additional Callbacks of a Presolver
    2504 *
    2505 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    2506 * implemented for most applications, they can be used, for example, to initialize and free private data.
    2507 * Additional callbacks can either be passed directly with SCIPincludePresol() to SCIP or via specific
    2508 * <b>setter functions</b> after a call of SCIPincludePresolBasic(), see also @ref PRESOL_INTERFACE.
    2509 *
    2510 * @subsection PRESOLFREE
    2511 *
    2512 * If you are using presolver data (see \ref PRESOL_DATA and \ref PRESOL_INTERFACE), you have to implement this function in order to free the presolver data.
    2513 * This can be done by the following procedure:
    2514 *
    2515 * @refsnippet{src/scip/presol_boundshift.c,SnippetPresolFreeBoundshift}
    2516 *
    2517 * If you have allocated memory for fields in your presolver data, remember to free this memory
    2518 * before freeing the presolver data itself.
    2519 * If you are using the C++ wrapper class, this function is not available.
    2520 * Instead, just use the destructor of your class to free the member variables of your class.
    2521 *
    2522 * @subsection PRESOLINIT
    2523 *
    2524 * The PRESOLINIT callback is executed after the problem is transformed.
    2525 * The presolver may, e.g., use this call to initialize its presolver data.
    2526 * The difference between the original and the transformed problem is explained in
    2527 * "What is this thing with the original and the transformed problem about?" on \ref FAQ.
    2528 *
    2529 * @subsection PRESOLCOPY
    2530 *
    2531 * The PRESOLCOPY callback is executed when a SCIP instance is copied, e.g. to
    2532 * solve a sub-SCIP. By
    2533 * defining this callback as
    2534 * <code>NULL</code> the user disables the execution of the specified
    2535 * presolver for all copied SCIP instances. This may deteriorate the performance
    2536 * of primal heuristics using sub-SCIPs.
    2537 *
    2538 * @subsection PRESOLEXIT
    2539 *
    2540 * The PRESOLEXIT callback is executed before the transformed problem is freed.
    2541 * In this function, the presolver should free all resources that have been allocated for the solving process in PRESOLINIT.
    2542 *
    2543 * @subsection PRESOLINITPRE
    2544 *
    2545 * The PRESOLINITPRE callback is executed when the presolving is about to begin.
    2546 * The presolver may use this call to initialize its presolving data which only need to exist during the presolving stage.
    2547 *
    2548 * @subsection PRESOLEXITPRE
    2549 *
    2550 * The PRESOLEXITPRE callback is executed after presolving finishes and before the branch-and-bound process begins.
    2551 * The presolver should use this call to clean up its presolving data, which was allocated in PRESOLINITPRE.
    2552 */
    2553
    2554/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    2555
    2556/**@page SEPA How to add separators
    2557 *
    2558 * Separators are used to generate cutting planes that strengthen the LP relaxation of the problem formulation, but are
    2559 * not required for a completeness and correctness of the model.
    2560 * In contrast, constraint-based cutting planes, the second type of cutting planes in SCIP, are separated in the CONSSEPALP and
    2561 * CONSSEPASOL callbacks of the constraint handlers, see \ref CONSSEPALP and \ref CONSSEPASOL. These cuts are
    2562 * valid inequalities or even facets of the polyhedron described by a single constraint or a subset of the constraints of
    2563 * a single constraint class. See also
    2564 * "When should I implement a constraint handler, when should I implement a separator?" on \ref FAQ.
    2565 * \n
    2566 * A complete list of all separators contained in this release can be found \ref SEPARATORS "here".
    2567 *
    2568 * We now explain how users can add their own separators.
    2569 * Take the separator for the class of Gomory mixed integer inequalities (src/scip/sepa_gomory.c) as an example.
    2570 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjSepa wrapper
    2571 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_SEPA... callbacks.
    2572 *
    2573 * Additional documentation for the callbacks of a separator, in particular for the input parameters,
    2574 * can be found in the file type_sepa.h.
    2575 *
    2576 * Here is what you have to do to implement a separator:
    2577 * -# Copy the template files src/scip/sepa_xyz.c and src/scip/sepa_xyz.h into files "sepa_myseparator.c"
    2578 * and "sepa_myseparator.h".
    2579 \n
    2580 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    2581 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    2582 * -# Use `SCIPincludeSepaMyseparator()` in order to include the separator into your SCIP instance,
    2583 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    2584 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    2585 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myseparator".
    2586 * -# Adjust the properties of the separator (see \ref SEPA_PROPERTIES).
    2587 * -# Define the separator data (see \ref SEPA_DATA). This is optional.
    2588 * -# Implement the interface functions (see \ref SEPA_INTERFACE).
    2589 * -# Implement the fundamental callbacks (see \ref SEPA_FUNDAMENTALCALLBACKS).
    2590 * -# Implement the additional callbacks (see \ref SEPA_ADDITIONALCALLBACKS). This is optional.
    2591 *
    2592 *
    2593 * @section SEPA_PROPERTIES Properties of a Separator
    2594 *
    2595 * At the top of the new file "sepa_myseparator.c", you can find the separator properties.
    2596 * These are given as compiler defines.
    2597 * In the C++ wrapper class, you have to provide the separator properties by calling the constructor
    2598 * of the abstract base class scip::ObjSepa from within your constructor.
    2599 * The properties you have to set have the following meaning:
    2600 *
    2601 * \par SEPA_NAME: the name of the separator.
    2602 * This name is used in the interactive shell to address the separator.
    2603 * Additionally, if you are searching for a separator with SCIPfindSepa(), this name is looked up.
    2604 * Names have to be unique: no two separators may have the same name.
    2605 *
    2606 * \par SEPA_DESC: the description of the separator.
    2607 * This string is printed as a description of the separator in the interactive shell.
    2608 *
    2609 * \par SEPA_PRIORITY: the priority of the separator.
    2610 * In each separation round during the price-and-cut loop of the subproblem processing or the separation loop
    2611 * of the primal solution separation, the separators and separation functions of the constraint handlers are called in
    2612 * a predefined order, which is given by the priorities of the separators and the separation priorities
    2613 * of the constraint handlers (see \ref CONS_PROPERTIES).
    2614 * First, the separators with non-negative priority are called in the order of decreasing priority.
    2615 * Next, the separation functions of the constraint handlers are called in the order of decreasing separation
    2616 * priority.
    2617 * Finally, the separators with negative priority are called in the order of decreasing priority. An easy way to list the
    2618 * priorities of all separators and constraint handlers is to type "display separators" and "display conshdlrs" in
    2619 * the interactive shell.
    2620 * \n
    2621 * The priority of the separator should be set according to the complexity of the cut separation algorithm and the
    2622 * impact of the resulting cuts: separators that provide fast algorithms that usually have a high impact (i.e., cut off
    2623 * a large portion of the LP relaxation) should have a high priority.
    2624 * See \ref SEPAEXECLP and \ref SEPAEXECSOL for further details of the separation callbacks.
    2625 *
    2626 * \par SEPA_FREQ: the default frequency for separating cuts.
    2627 * The frequency defines the depth levels at which the separation functions \ref SEPAEXECLP and \ref SEPAEXECSOL are called.
    2628 * For example, a frequency of 7 means, that the separation callback is executed for subproblems that are in depth
    2629 * 0, 7, 14, ... of the branching tree. A frequency of 0 means, that the separation function is only called at the root node.
    2630 * A frequency of -1 disables the separator.
    2631 * \n
    2632 * The frequency can be adjusted by the user. This property of the separator only defines the default value of the frequency.
    2633 * If you want to have a more flexible control of when to execute the separation algorithm, you have to assign
    2634 * a frequency of 1 and implement a check at the beginning of your separation functions whether you really want to execute
    2635 * the separation or not. If you do not want to execute it, set the result code of
    2636 * \ref SEPAEXECLP and \ref SEPAEXECSOL to SCIP_DIDNOTRUN.
    2637 *
    2638 * \par SEPA_MAXBOUNDDIST: the default maximal relative distance from the current node's dual bound to primal bound compared to best node's dual bound for applying separation.
    2639 * At the current branch-and-bound node, the relative distance from its dual bound (local dual bound)
    2640 * to the primal bound compared to the best node's dual bound (global dual bound) is considered. The separation function
    2641 * of the separator will only be applied at the current node if this relative distance does not exceed SEPA_MAXBOUNDDIST.
    2642 * \n
    2643 * For example, if the global dual bound is 50 and the primal bound is 60, SEPA_MAXBOUNDDIST = 0.25 means that separation
    2644 * is only applied if the current node's dual bound is in the first quarter of the interval [50,60], i.e., if it is less
    2645 * than or equal to 52.5.
    2646 * \n
    2647 * In particular, the values 0.0 and 1.0 mean that separation is applied at the current best node only or at all
    2648 * nodes, respectively. Since separation seems to be most important to apply at nodes that define to the global
    2649 * dual bound, 0.0 is probably a good choice for SEPA_MAXBOUNDDIST.
    2650 * Note that separators with a frequency of SEPA_FREQ = 0 are only applied at the root node.
    2651 * Obviously, at the root node the local dual bound is equal to the global dual bound and thus, the separator is called
    2652 * for any value of SEPA_MAXBOUNDDIST.
    2653 *
    2654 * \par SEPA_USESSUBSCIP: Does the separator use a secondary SCIP instance?
    2655 * Some heuristics and separators solve MIPs or SAT problems and use a secondary SCIP instance. Examples are
    2656 * Large Neighborhood Search heuristics such as RINS and Local Branching or the CGMIP separator. To avoid recursion,
    2657 * these plugins usually deactivate all other plugins that solve MIPs. If a separator uses a secondary SCIP instance,
    2658 * this parameter has to be TRUE and it is recommended to call SCIPsetSubscipsOff() for the secondary SCIP instance.
    2659 *
    2660 * \par SEPA_DELAY: the default for whether the separation function should be delayed, if other separators or constraint handlers found cuts.
    2661 * If the separator's separation function is marked to be delayed, it is only executed after no other separator
    2662 * or constraint handler found a cut during the price-and-cut loop, and in the last separation or stalling round,
    2663 * either in the end, or in an additional round if only the maximal subsequent round is exceeded.
    2664 * If the separation function of the separator is very expensive, you may want to mark it to be delayed until all cheap
    2665 * separation functions have been executed.
    2666 *
    2667 * @section SEPA_DATA Separator Data
    2668 *
    2669 * Below the header "Data structures" you can find a struct which is called "struct SCIP_SepaData".
    2670 * In this data structure, you can store the data of your separator. For example, you should store the adjustable
    2671 * parameters of the separator in this data structure. In a separator, user parameters for the maximal number of
    2672 * separation rounds per node and for the maximal number of cuts separated per separation round might be useful.
    2673 * If you are using C++, you can add separator data as usual as object variables to your class.
    2674 * \n
    2675 * Defining separator data is optional. You can leave the struct empty.
    2676 *
    2677 * @section SEPA_INTERFACE Interface Functions
    2678 *
    2679 * At the bottom of "sepa_myseparator.c", you can find the interface function SCIPincludeSepaMyseparator(),
    2680 * which also appears in "sepa_myseparator.h"
    2681 * SCIPincludeSepaMyseparator() is called by the user, if (s)he wants to include the separator,
    2682 * i.e., if (s)he wants to use the separator in his/her application.
    2683 *
    2684 * This function only has to be adjusted slightly.
    2685 * It is responsible for notifying SCIP of the presence of the separator. For this, you can either call SCIPincludeSepa(),
    2686 * or SCIPincludeSepaBasic() since SCIP version 3.0. In the latter variant, \ref SEPA_ADDITIONALCALLBACKS "additional callbacks"
    2687 * must be added via setter functions as, e.g., SCIPsetSepaCopy(). We recommend this latter variant because
    2688 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    2689 * variant must be manually adjusted with every SCIP release containing new callbacks for separators in order to compile.
    2690 *
    2691 * If you are using separator data, you have to allocate the memory
    2692 * for the data at this point. You can do this by calling:
    2693 * \code
    2694 * SCIP_CALL( SCIPallocBlockMemory(scip, &sepadata) );
    2695 * \endcode
    2696 * You also have to initialize the fields in "struct SCIP_SepaData" afterwards. For freeing the
    2697 * separator data, see \ref SEPAFREE.
    2698 *
    2699 * You may also add user parameters for your separator, see \ref PARAM for how to add user parameters and
    2700 * the function SCIPincludeSepaGomory() in src/scip/sepa_gomory.c for an example.
    2701 *
    2702 *
    2703 * @section SEPA_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Separator
    2704 *
    2705 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    2706 * an operational algorithm.
    2707 * They are passed together with the separator itself to SCIP using SCIPincludeSepa() or SCIPincludeSepaBasic(),
    2708 * see @ref SEPA_INTERFACE.
    2709 *
    2710 * Separator plugins have two callbacks, @ref SEPAEXECLP and @ref SEPAEXECSOL, of which at least one must be implemented.
    2711 *
    2712 * Additional documentation for the callbacks, in particular to their input parameters,
    2713 * can be found in type_sepa.h.
    2714 *
    2715 * @subsection SEPAEXECLP
    2716 *
    2717 * The SEPAEXECLP callback is executed during the price-and-cut loop of the subproblem processing.
    2718 * It should try to generate general purpose cutting planes in order to separate the current LP solution.
    2719 * The function is called in the LP solution loop, which means that a valid LP solution exists.
    2720 *
    2721 * Usually, the callback searches and produces cuts, that are added with a call to SCIPaddRow().
    2722 * If the cut should be added to the global cut pool, it calls SCIPaddPoolCut().
    2723 * If the cut is constructed via multiple calls to SCIPaddVarToRow(), then performance can be improved by calling
    2724 * SCIPcacheRowExtensions() before these additions and SCIPflushRowExtensions() after.
    2725 * In addition to LP rows, the callback may also produce domain reductions or add additional constraints.
    2726 *
    2727 * Overall, the SEPAEXECLP callback has the following options, which is indicated by the possible return values of
    2728 * the 'result' variable (see type_sepa.h):
    2729 * - detecting that the node is infeasible in the variable's bounds and can be cut off (result SCIP_CUTOFF)
    2730 * - adding an additional constraint (result SCIP_CONSADDED)
    2731 * - reducing a variable's domain (result SCIP_REDUCEDDOM)
    2732 * - adding a cutting plane to the LP (result SCIP_SEPARATED)
    2733 * - stating that the separator searched, but did not find domain reductions, cutting planes, or cut constraints
    2734 * (result SCIP_DIDNOTFIND)
    2735 * - stating that the separator was skipped (result SCIP_DIDNOTRUN)
    2736 * - stating that the separator was skipped, but should be called again (result SCIP_DELAYED)
    2737 * - stating that a new separation round should be started without calling the remaining separator functions (result SCIP_NEWROUND)
    2738 *
    2739 * @subsection SEPAEXECSOL
    2740 *
    2741 * The SEPAEXECSOL callback is executed during the separation loop on arbitrary primal solutions.
    2742 * It should try to generate general purpose cutting planes in order to separate the given primal solution.
    2743 * The function is not called in the LP solution loop, which means that there is no valid LP solution.
    2744 *
    2745 * In the standard SCIP environment, the SEPAEXECSOL callback is not used because only LP solutions are
    2746 * separated. The SEPAEXECSOL callback provides means to support external relaxation handlers like semidefinite
    2747 * relaxations that want to separate an intermediate primal solution vector. Thus, if you do not want to support
    2748 * such external plugins, you do not need to implement this callback.
    2749 *
    2750 * Usually, the callback searches and produces cuts, that are added with a call to SCIPaddRow().
    2751 * If the cut should be added to the global cut pool, it calls SCIPaddPoolCut().
    2752 * If the cut is constructed via multiple calls to SCIPaddVarToRow(), then performance can be improved by calling
    2753 * SCIPcacheRowExtensions() before these additions and SCIPflushRowExtensions() after.
    2754 * In addition to LP rows, the callback may also produce domain reductions or add other constraints.
    2755 *
    2756 * Overall, the SEPAEXECSOL callback has the following options, which is indicated by the possible return values of
    2757 * the 'result' variable (see type_sepa.h):
    2758 * - detecting that the node is infeasible in the variable's bounds and can be cut off (result SCIP_CUTOFF)
    2759 * - adding an additional constraint (result SCIP_CONSADDED)
    2760 * - reducing a variable's domain (result SCIP_REDUCEDDOM)
    2761 * - adding a cutting plane to the LP (result SCIP_SEPARATED)
    2762 * - stating that the separator searched, but did not find domain reductions, cutting planes, or cut constraints
    2763 * (result SCIP_DIDNOTFIND)
    2764 * - stating that the separator was skipped (result SCIP_DIDNOTRUN)
    2765 * - stating that the separator was skipped, but should be called again (result SCIP_DELAYED)
    2766 * - stating that a new separation round should be started without calling the remaining separator functions (result SCIP_NEWROUND)
    2767 *
    2768 *
    2769 * @section SEPA_ADDITIONALCALLBACKS Additional Callbacks of a Separator
    2770 *
    2771 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    2772 * implemented for most applications, they can be used, for example, to initialize and free private data.
    2773 * Additional callbacks can either be passed directly with SCIPincludeSepa() to SCIP or via specific
    2774 * <b>setter functions</b> after a call of SCIPincludeSepaBasic(), see also @ref SEPA_INTERFACE.
    2775 *
    2776 * @subsection SEPAFREE
    2777 *
    2778 * If you are using separator data (see \ref SEPA_DATA and \ref SEPA_INTERFACE), you have to implement this function
    2779 * in order to free the separator data. This can be done by the following procedure:
    2780 *
    2781 * @refsnippet{src/scip/sepa_gomory.c,SnippetSepaFreeGomory}
    2782 *
    2783 * If you have allocated memory for fields in your separator data, remember to free this memory
    2784 * before freeing the separator data itself.
    2785 * If you are using the C++ wrapper class, this function is not available.
    2786 * Instead, just use the destructor of your class to free the member variables of your class.
    2787 *
    2788 * @subsection SEPACOPY
    2789 *
    2790 * The SEPACOPY callback is executed when a SCIP instance is copied, e.g. to
    2791 * solve a sub-SCIP. By
    2792 * defining this callback as
    2793 * <code>NULL</code> the user disables the execution of the specified
    2794 * separator for all copied SCIP instances. This may deteriorate the performance
    2795 * of primal heuristics using sub-SCIPs.
    2796 *
    2797 * @subsection SEPAINIT
    2798 *
    2799 * The SEPAINIT callback is executed after the problem is transformed.
    2800 * The separator may, e.g., use this call to initialize its separator data.
    2801 * The difference between the original and the transformed problem is explained in
    2802 * "What is this thing with the original and the transformed problem about?" on \ref FAQ.
    2803 *
    2804 * @subsection SEPAEXIT
    2805 *
    2806 * The SEPAEXIT callback is executed before the transformed problem is freed.
    2807 * In this function, the separator should free all resources that have been allocated for the solving process in SEPAINIT.
    2808 *
    2809 * @subsection SEPAINITSOL
    2810 *
    2811 * The SEPAINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    2812 * begin. The separator may use this call to initialize its branch-and-bound specific data.
    2813 *
    2814 * @subsection SEPAEXITSOL
    2815 *
    2816 * The SEPAEXITSOL callback is executed before the branch-and-bound process is freed. The separator should use this call
    2817 * to clean up its branch-and-bound data, in particular to release all LP rows that it has created or captured.
    2818 */
    2819
    2820/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    2821
    2822/**@page PROP How to add propagators
    2823 *
    2824 * Propagators are used to tighten the domains of the variables. Like for cutting planes, there are two different types
    2825 * of domain propagations. Constraint based (primal) domain propagation algorithms are part of the corresponding
    2826 * constraint handlers, see \ref CONSPROP. In contrast, domain propagators usually provide dual propagations, i.e.,
    2827 * propagations that can be applied using the objective function and the current best known primal solution. This
    2828 * section deals with such propagators.
    2829 *
    2830 * A complete list of all propagators contained in this release can be found \ref PROPAGATORS "here".
    2831 *
    2832 * We now explain how users can add their own propagators. Take the pseudo objective function propagator
    2833 * (src/scip/prop_pseudoobj.c) as an example. As all other default plugins, it is written in C. C++ users can easily
    2834 * adapt the code by using the scip::ObjProp wrapper base class and implement the @c scip_...() virtual methods instead
    2835 * of the @c SCIP_DECL_PROP... callbacks.
    2836 *
    2837 * Additional documentation for the callbacks of a propagator can be found in the file type_prop.h.
    2838 *
    2839 * Here is what you have to do to implement a propagator:
    2840 * -# Copy the template files src/scip/prop_xyz.c and src/scip/prop_xyz.h into files named "prop_mypropagator.c"
    2841 * and "prop_mypropagator.h".
    2842 * \n
    2843 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    2844 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    2845 * -# Use `SCIPincludePropMypropagator()` in order to include the propagator into your SCIP instance,
    2846 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    2847 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    2848 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mypropagator".
    2849 * -# Adjust the properties of the propagator (see \ref PROP_PROPERTIES).
    2850 * -# Define the propagator data (see \ref PROP_DATA). This is optional.
    2851 * -# Implement the interface functions (see \ref PROP_INTERFACE).
    2852 * -# Implement the fundamental callbacks (see \ref PROP_FUNDAMENTALCALLBACKS).
    2853 * -# Implement the additional callbacks (see \ref PROP_ADDITIONALCALLBACKS). This is optional.
    2854 *
    2855 * @section PROP_PROPERTIES Properties of a Propagator
    2856 *
    2857 * At the top of the new file "prop_mypropagator.c" you can find the propagator properties. These are given as compiler
    2858 * defines. The presolving-related properties are optional,
    2859 * they only have to be defined if the propagator supports presolving routines.
    2860 * In the C++ wrapper class, you have to provide the propagator properties by calling the constructor of the
    2861 * abstract base class scip::ObjProp from within your constructor. The properties you have the following meaning:
    2862 *
    2863 * @subsection PROP_FUNDAMENTALPROPERTIES Fundamental properties of a propagator
    2864 *
    2865 * \par PROP_NAME: the name of the propagator.
    2866 * This name is used in the interactive shell to address the propagator. Additionally, if you are searching for a
    2867 * propagator with SCIPfindProp(), this name is searched for. Names have to be unique: no two propagators may have the
    2868 * same name.
    2869 *
    2870 * \par PROP_DESC: the description of the propagator.
    2871 * This string is printed as a description of the propagator in the interactive shell.
    2872 *
    2873 * \par PROP_PRIORITY: the priority of the propagator.
    2874 * In each propagation round, the propagators and propagation functions of the constraint handlers are called in a
    2875 * predefined order, which is given by the priorities of the propagators and the check priorities of the constraint
    2876 * handlers. First, the propagators with non-negative priority are called in order of decreasing priority. Next, the
    2877 * propagation functions of the different constraint handlers are called in order of decreasing check priority. Finally,
    2878 * the propagators with negative priority are called in order of decreasing priority. \n The priority of the
    2879 * propagators should be set according to the complexity of the propagation algorithm and the impact of the domain
    2880 * propagations: propagators providing fast algorithms that usually have a high impact (i.e., tighten many bounds)
    2881 * should have a high priority.
    2882 *
    2883 * \par PROP_FREQ: the default frequency for propagating domains.
    2884 * The frequency defines the depth levels at which the propagation function \ref PROPEXEC is called. For example, a
    2885 * frequency of 7 means, that the propagation callback is executed for subproblems that are in depth 0, 7, 14, ... of
    2886 * the branching tree. A frequency of 0 means that propagation is only applied in preprocessing and at the root node. A
    2887 * frequency of -1 disables the propagator.
    2888 * \n
    2889 * The frequency can be adjusted by the user. This property of the propagator only defines the default value of the
    2890 * frequency.\n
    2891 * <b>Note:</b> If you want to have a more flexible control of when to execute the propagation algorithm, you have to
    2892 * assign a frequency of 1 and implement a check at the beginning of your propagation algorithm whether you really want
    2893 * to execute the domain propagation or not. If you do not want to execute it, set the result code to SCIP_DIDNOTRUN.
    2894 *
    2895 * \par PROP_DELAY: the default for whether the propagation function should be delayed, if other propagators or constraint handlers found domain reductions.
    2896 * If the propagator's propagation function is marked to be delayed, it is only executed after no other propagator or
    2897 * constraint handler found a domain reduction in the current iteration of the domain propagation loop. If the
    2898 * propagation function of the propagator is very expensive, you may want to mark it to be delayed until all cheap
    2899 * propagation functions have been executed.
    2900 *
    2901 * \par PROP_TIMING: the timing mask of the propagator.
    2902 * SCIP calls the domain propagation routines at different places in the node processing loop.
    2903 * This property indicates at which places the propagator is called.
    2904 * Possible values are defined in type_timing.h and can be concatenated, e.g., as in SCIP_PROPTIMING_ALWAYS.
    2905 *
    2906 * @subsection PROP_ADDITIONALPROPERTIES Optional propagator properties
    2907 *
    2908 * The following properties are optional and only need to be defined if the propagator supports
    2909 * presolving, that is, if the \ref PROPPRESOL "presolving callback" is implemented.
    2910
    2911 * \par PROP_PRESOLTIMING: the timing of the presolving function (FAST, MEDIUM, or EXHAUSTIVE).
    2912 * Every presolving round starts with the FAST presolvers. MEDIUM presolvers are only called, if FAST presolvers did not find
    2913 * enough reductions in this round so far, and EXHAUSTIVE presolving steps are only performed if all presolvers called before
    2914 * in this round were unsuccessful.
    2915 * Presolving functions should be assigned a timing based on how expensive they are, e.g., presolvers that provide fast algorithms that
    2916 * usually have a high impact (i.e., remove lots of variables or tighten bounds of many variables) should have a timing FAST.
    2917 * If a presolving function implements different algorithms of different complexity, it may also get multiple timings and check the timing
    2918 * internally in the \ref PROPPRESOL callback to decide which algorithms to run.
    2919 *
    2920 * \par PROP_PRESOL_PRIORITY: the priority of the presolving function.
    2921 * This attribute is analogous to the PROP_PRIORITY flag, but deals with the preprocessing function of the presolver.
    2922 *
    2923 * \par PROP_PRESOL_MAXROUNDS: the default maximal number of presolving rounds the propagator participates in.
    2924 * The preprocessing is executed in rounds.
    2925 * If enough changes have been applied to the model, an additional preprocessing round is performed.
    2926 * The MAXROUNDS parameter of a propagator denotes the maximal number of preprocessing rounds, the propagator
    2927 * participates in.
    2928 * A value of -1 means, that there is no limit on the number of rounds.
    2929 * A value of 0 means, the preprocessing callback of the propagator is disabled.
    2930 *
    2931 * @section PROP_DATA Propagator Data
    2932 *
    2933 * Below the title "Data structures" you can find a struct called <code>struct SCIP_PropData</code>. In this data
    2934 * structure, you can store the data of your propagator. For example, you should store the adjustable parameters of the
    2935 * propagator in this data structure. If you are using C++, you can add propagator data as object variables to your
    2936 * class as usual .
    2937 * \n
    2938 * Defining propagator data is optional. You can leave the struct empty.
    2939 *
    2940 *
    2941 * @section PROP_INTERFACE Interface Functions
    2942 *
    2943 * At the bottom of "prop_mypropagator.c", you can find the interface function SCIPincludeSepaMypropagator(),
    2944 * which also appears in "prop_mypropagator.h"
    2945 * SCIPincludePropMypropagator() is called by the user, if (s)he wants to include the propagator,
    2946 * i.e., if (s)he wants to use the propagator in his/her application.
    2947 *
    2948 * This function only has to be adjusted slightly.
    2949 * It is responsible for notifying SCIP of the presence of the propagator. For this, you can either call SCIPincludeProp(),
    2950 * or SCIPincludePropBasic() since SCIP version 3.0. In the latter variant, \ref PROP_ADDITIONALCALLBACKS "additional callbacks"
    2951 * must be added via setter functions as, e.g., SCIPsetPropCopy(). We recommend this latter variant because
    2952 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    2953 * variant must be manually adjusted with every SCIP release containing new callbacks for separators in order to compile.
    2954 *
    2955 *
    2956 * If you are using propagator data, you have to allocate the memory for the data at this point. You can do this by
    2957 * calling
    2958 * \code
    2959 * SCIP_CALL( SCIPallocBlockMemory(scip, &propdata) );
    2960 * \endcode
    2961 * You also have to initialize the fields in <code>struct SCIP_PropData</code> afterwards.
    2962 *
    2963 * You may also add user parameters for your propagator, see the function SCIPincludePropPseudoobj() in
    2964 * src/scip/prop_pseudoobj.c for an example.
    2965 *
    2966 *
    2967 * @section PROP_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Propagator
    2968 *
    2969 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    2970 * an operational algorithm.
    2971 * They are passed together with the propagator itself to SCIP using SCIPincludeProp() or SCIPincludePropBasic(),
    2972 * see @ref PROP_INTERFACE.
    2973 *
    2974 * Propagator plugins have one fundamental callback, namely the \ref PROPEXEC function.
    2975 * This function has to be implemented for every propagator; the other callbacks are optional. In the
    2976 * C++ wrapper class scip::ObjProp, the scip_exec() method (which corresponds to the \ref PROPEXEC
    2977 * callback) is a virtual abstract member function. You have to
    2978 * implement it in order to be able to construct an object of your propagator class.
    2979 *
    2980 * Additional documentation for the callbacks can be found in type_prop.h.
    2981 *
    2982 * @subsection PROPEXEC
    2983 *
    2984 * The PROPEXEC callback is called during presolving and during the subproblem processing. It should perform the actual
    2985 * domain propagation, which means that it should tighten the variables' bounds. The technique of domain propagation,
    2986 * which is the main workhorse of constraint programming, is called "node preprocessing" in the Integer Programming
    2987 * community.
    2988 *
    2989 * The PROPEXEC callback has the following options:
    2990 * - detecting that the node is infeasible in the variables' bounds and can be cut off (result SCIP_CUTOFF)
    2991 * - reducing (i.e, tightening) the domains of some variables (result SCIP_REDUCEDDOM)
    2992 * - stating that the propagator searched, but did not find domain reductions, cutting planes, or cut constraints
    2993 * (result SCIP_DIDNOTFIND)
    2994 * - stating that the propagator was skipped (result SCIP_DIDNOTRUN)
    2995 * - stating that the propagator was skipped, but should be called again (result SCIP_DELAYED)
    2996 *
    2997 *
    2998 *
    2999 * @section PROP_ADDITIONALCALLBACKS Additional Callbacks of a Propagator
    3000 *
    3001 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    3002 * implemented for most applications, they can be used, for example, to initialize and free private data.
    3003 * Additional callbacks can either be passed directly with SCIPincludeProp() to SCIP or via specific
    3004 * <b>setter functions</b> after a call of SCIPincludePropBasic(), see also @ref PROP_INTERFACE.
    3005 *
    3006 * @subsection PROPRESPROP
    3007 *
    3008 * If the propagator wants to support \ref CONF "conflict analysis", it has to supply the PROPRESPROP function. It also should call
    3009 * SCIPinferVarLbProp() or SCIPinferVarUbProp() in the domain propagation instead of SCIPchgVarLb() or SCIPchgVarUb() in
    3010 * order to deduce bound changes on variables. In the SCIPinferVarLbProp() and SCIPinferVarUbProp() calls, the
    3011 * propagator provides a pointer to itself and an integer value "inferinfo" that can be arbitrarily chosen.
    3012 *
    3013 * The propagation conflict resolving function PROPRESPROP must then be implemented to provide the "reasons" for the bound
    3014 * changes, i.e., the bounds of variables at the time of the propagation, which forced the propagator to set the
    3015 * conflict variable's bound to its current value. It can use the "inferinfo" tag to identify its own propagation rule
    3016 * and thus identify the "reason" bounds. The bounds that form the reason of the assignment must then be provided by
    3017 * calls to SCIPaddConflictLb() and SCIPaddConflictUb() in the propagation conflict resolving function.
    3018 *
    3019 * See the description of the propagation conflict resolving function \ref CONSRESPROP of constraint handlers for
    3020 * further details.
    3021 *
    3022 * Omitting the PROPRESPROP callback circumvents the implementation of the usually rather complex conflict resolving function.
    3023 * Yet, it
    3024 * will make the conflict analysis less effective. We suggest to first omit the conflict resolving function and check how
    3025 * effective the propagation function is. If it produces a lot of propagations for your application, you definitely should
    3026 * consider implementing the conflict resolving function.
    3027 *
    3028 *
    3029 * @subsection PROPFREE
    3030 *
    3031 * If you are using propagator data, you have to implement this function in order to free the propagator data.
    3032 * This can be done by the following procedure:
    3033 *
    3034 * @refsnippet{src/scip/prop_redcost.c,SnippetPropFreeRedcost}
    3035 *
    3036 * If you have allocated memory for fields in your propagator data, remember to free this memory
    3037 * before freeing the propagator data itself.
    3038 * If you are using the C++ wrapper class, this function is not available.
    3039 * Instead, just use the destructor of your class to free the member variables of your class.
    3040 *
    3041 * @subsection PROPINIT
    3042 *
    3043 * The PROPINIT callback is executed after the problem is transformed. The propagator may, e.g., use this call to
    3044 * initialize its propagator data.
    3045 *
    3046 * @subsection PROPCOPY
    3047 *
    3048 * The PROPCOPY callback is executed when a SCIP instance is copied, e.g. to
    3049 * solve a sub-SCIP. By
    3050 * defining this callback as
    3051 * <code>NULL</code> the user disables the execution of the specified
    3052 * propagator for all copied SCIP instances. This may deteriorate the performance
    3053 * of primal heuristics using sub-SCIPs.
    3054 *
    3055 * @subsection PROPEXIT
    3056 *
    3057 * The PROPEXIT callback is executed before the transformed problem is freed.
    3058 * In this function, the propagator should free all resources that have been allocated for the solving process in PROPINIT.
    3059 *
    3060 * @subsection PROPINITPRE
    3061 *
    3062 * The PROPINITPRE callback is executed before the preprocessing is started, even if presolving is turned off.
    3063 * The propagator may use this call to initialize its presolving data before the presolving process begins.
    3064 *
    3065 * @subsection PROPEXITPRE
    3066 *
    3067 * The PROPEXITPRE callback is executed after the preprocessing has been finished, even if presolving is turned off.
    3068 * The propagator may use this call, e.g., to clean up its presolving data.
    3069 * Besides clean up, no time consuming operations should be done.
    3070 *
    3071 * @subsection PROPINITSOL
    3072 *
    3073 * The PROPINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    3074 * begin.
    3075 * The propagator may use this call to initialize its branch-and-bound specific data.
    3076 *
    3077 * @subsection PROPEXITSOL
    3078 *
    3079 * The PROPEXITSOL callback is executed before the branch-and-bound process is freed.
    3080 * The propagator should use this call to clean up its branch-and-bound data.
    3081 *
    3082 * @subsection PROPPRESOL
    3083 *
    3084 * Seaches for domain propagations, analogous to the \ref PROPEXEC callback.
    3085 * However, this callback is called during preprocessing.
    3086 *
    3087 * To inform SCIP that the presolving function found a reduction the result pointer has to be set in a proper way.
    3088 * The following options are possible:
    3089 *
    3090 * - SCIP_UNBOUNDED : at least one variable is not bounded by any constraint in objective direction
    3091 * - SCIP_CUTOFF : at least one domain reduction that renders the problem infeasible has been found
    3092 * - SCIP_SUCCESS : the presolver found a domain reduction
    3093 * - SCIP_DIDNOTFIND : the presolver searched, but did not find a presolving change
    3094 * - SCIP_DIDNOTRUN : the presolver was skipped
    3095 * - SCIP_DELAYED : the presolver was skipped, but should be called again
    3096 *
    3097 *
    3098 * Please see also the @ref PROP_ADDITIONALPROPERTIES section to learn about the properties
    3099 * PROP_PRESOLTIMING and PROP_PRESOL_MAXROUNDS, which influence the behaviour of SCIP
    3100 * calling PROPPRESOL.
    3101 *
    3102 */
    3103
    3104/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    3105
    3106/**@page BRANCH How to add branching rules
    3107 *
    3108 * Branching rules are used to split the problem at the current node into smaller subproblems. Branching rules can be called at three
    3109 * different occasions, which is why they have three different execution functions (see \ref
    3110 * BRANCHRULE_ADDITIONALCALLBACKS). Branching is performed if:
    3111 * - the LP solution of the current problem is fractional. In this case, the integrality constraint handler calls the
    3112 * \ref BRANCHEXECLP functions of the branching rules.
    3113 * - the list of external branching candidates is not empty. This will only be the case if branching candidates were added
    3114 * by a user's \ref RELAX "relaxation handler" or \ref CONS "constraint handler" plugin, calling SCIPaddExternBranchCand().
    3115 * These branching candidates should be processed by the \ref BRANCHEXECEXT function.
    3116 * - if an integral solution violates one or more constraints and this infeasibility could not be resolved in the callbacks
    3117 * \ref CONSENFOLP and \ref CONSENFOPS of the corresponding constraint handlers. In this case, the \ref BRANCHEXECPS function will be called. This is the
    3118 * standard case, if you use SCIP as a pure CP or SAT solver. If the LP or any other type of relaxation is used, then
    3119 * branching on pseudo solutions works as a last resort.
    3120 *
    3121 * The idea of branching rules is to take a global view on the problem. In contrast, branching paradigms which are
    3122 * specific to one type of constraint are best implemented within the enforcement callbacks of your constraint handler.
    3123 * See, e.g., the constraint specific branching rules provided by the constraint handlers for special ordered sets
    3124 * (src/scip/cons_sos{1,2}.c)).
    3125 * \n
    3126 * All branching rules that come with the default distribution of SCIP create two subproblems by splitting a single
    3127 * variable's domain. It is, however, fully supported to implement much more general branching schemes, for example by
    3128 * creating more than two subproblems, or by adding additional constraints to the subproblems instead of tightening the
    3129 * domains of the variables.
    3130 * \n
    3131 * A complete list of all branching rules contained in this release can be found \ref BRANCHINGRULES "here".
    3132 * However, note that constraint handlers can implement their own branching when enforcing constraints.
    3133 * In particular the handler for nonlinear constraints currently does not use the branching plugins for spatial branching
    3134 * by default. Its behavior can be adjusted with the parameters in category constraints/nonlinear/branching.
    3135 *
    3136 * We now explain how users can add their own branching rules. Take the most infeasible LP branching rule
    3137 * (src/scip/branch_mostinf.c) as an example. As all other default plugins, it is written in C. C++ users can easily
    3138 * adapt the code by using the scip::ObjBranchrule wrapper base class and implement the scip_...() virtual methods instead of
    3139 * the SCIP_DECL_BRANCH... callbacks.
    3140 *
    3141 * Additional documentation for the callbacks of a branching rule can be found in the file type_branch.h.
    3142 *
    3143 * Here is what you have to do to implement a branching rule:
    3144 * -# Copy the template files src/scip/branch_xyz.c and src/scip/branch_xyz.h into files named
    3145 * "branch_mybranchingrule.c" and "branch_mybranchingrule.h".
    3146 * \n
    3147 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    3148 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    3149 * -# Use `SCIPincludeBranchruleMybranchingrule()` in order to include the branching rule into your SCIP instance,
    3150 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    3151 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    3152 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mybranchingrule".
    3153 * -# Adjust the properties of the branching rule (see \ref BRANCHRULE_PROPERTIES).
    3154 * -# Define the branching rule data (see \ref BRANCHRULE_DATA). This is optional.
    3155 * -# Implement the interface functions (see \ref BRANCHRULE_INTERFACE).
    3156 * -# Implement the fundamental callbacks (see \ref BRANCHRULE_FUNDAMENTALCALLBACKS).
    3157 * -# Implement the additional callbacks (see \ref BRANCHRULE_ADDITIONALCALLBACKS). This is optional.
    3158 *
    3159 *
    3160 * @section BRANCHRULE_PROPERTIES Properties of a Branching Rule
    3161 *
    3162 * At the top of the new file "branch_mybranchingrule.c" you can find the branching rule properties.
    3163 * These are given as compiler defines.
    3164 * In the C++ wrapper class, you have to provide the branching rule properties by calling the constructor
    3165 * of the abstract base class scip::ObjBranchrule from within your constructor.
    3166 * The properties you have to set have the following meaning:
    3167 *
    3168 * \par BRANCHRULE_NAME: the name of the branching rule.
    3169 * This name is used in the interactive shell to address the branching rule.
    3170 * Additionally, if you are searching for a branching rule with SCIPfindBranchrule(), this name is looked up.
    3171 * Names have to be unique: no two branching rules may have the same name.
    3172 *
    3173 * \par BRANCHRULE_DESC: the description of the branching rule.
    3174 * This string is printed as a description of the branching rule in the interactive shell.
    3175 *
    3176 * \par BRANCHRULE_PRIORITY: the default value for the priority of the branching rule.
    3177 * In the subproblem processing, the branching rules are called in decreasing order of their priority until
    3178 * one succeeded to branch. Since most branching rules are able to generate a branching in all situations,
    3179 * only the rule of highest priority is used. In combination with the BRANCHRULE_MAXDEPTH and
    3180 * BRANCHRULE_MAXBOUNDDIST settings, however, interesting strategies can be easily employed. For example,
    3181 * the user can set the priority of the "full strong branching" strategy to the highest value and assign the
    3182 * second highest value to the "reliable pseudo cost" rule. If (s)he also sets the maximal depth for the
    3183 * "full strong branching" to 5, in the top 5 depth levels of the search tree the "full strong branching" is
    3184 * applied, while in the deeper levels "reliable pseudo cost branching" is used.
    3185 * \n
    3186 * Note that the BRANCHRULE_PRIORITY property only specifies the default value of the priority. The user can
    3187 * change this value arbitrarily.
    3188 *
    3189 * \par BRANCHRULE_MAXDEPTH: the default value for the maximal depth level of the branching rule.
    3190 * This parameter denotes the maximal depth level in the branch-and-bound tree up to which the branching function of the
    3191 * branching rule will be applied. Use -1 for no limit.
    3192 * \n
    3193 * Note that this property only specifies the default value. The user can change this value arbitrarily.
    3194 *
    3195 * \par BRANCHRULE_MAXBOUNDDIST: the default value for the maximal relative distance from current node's dual bound to primal bound compared to best node's dual bound for applying branching.
    3196 * At the current branch-and-bound node, the relative distance from its dual bound (local dual bound)
    3197 * to the primal bound compared to the best node's dual bound (global dual bound) is considered. The branching function of
    3198 * the branching rule will only be applied at the node if this relative distance does not exceed BRANCHRULE_MAXBOUNDDIST.
    3199 * \n
    3200 * For example, if the global dual bound is 50 and the primal bound is 60, BRANCHRULE_MAXBOUNDDIST = 0.25 means that
    3201 * branching is only applied if the current node's dual bound is in the first quarter of the interval [50,60], i.e., if it
    3202 * is less than or equal to 52.5. In particular, the values 0.0 and 1.0 mean that the branching rule is applied at the
    3203 * current best node only or at all nodes, respectively.
    3204 * \n
    3205 * Note that the BRANCHRULE_MAXBOUNDDIST property only specifies the default value of the maximal bound distance.
    3206 * The user can change this value arbitrarily.
    3207 *
    3208 *
    3209 * @section BRANCHRULE_DATA Branching Rule Data
    3210 *
    3211 * Below the header "Data structures" you can find a struct which is called "struct SCIP_BranchruleData".
    3212 * In this data structure, you can store the data of your branching rule. For example, you should store the adjustable
    3213 * parameters of the branching rule in this data structure.
    3214 * If you are using C++, you can add branching rule data as usual as object variables to your class.
    3215 * \n
    3216 * Defining branching rule data is optional. You can leave the struct empty.
    3217 *
    3218 *
    3219 * @section BRANCHRULE_INTERFACE Interface Functions
    3220 *
    3221 * At the bottom of "branch_mybranchingrule.c", you can find the interface function SCIPincludeBranchruleMybranchingrule(),
    3222 * which also appears in "branch_mybranchingrule.h"
    3223 * SCIPincludeBranchruleMybranchingrule() is called by the user, if (s)he wants to include the branching rule,
    3224 * i.e., if (s)he wants to use the branching rule in his/her application.
    3225 *
    3226 * This function only has to be adjusted slightly.
    3227 * It is responsible for notifying SCIP of the presence of the branching rule. For this, you can either call
    3228 * SCIPincludeBranchrule(),
    3229 * or SCIPincludeBranchruleBasic() since SCIP version 3.0. In the latter variant, \ref BRANCHRULE_ADDITIONALCALLBACKS "additional callbacks"
    3230 * must be added via setter functions as, e.g., SCIPsetBranchruleCopy(). We recommend this latter variant because
    3231 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    3232 * variant must be manually adjusted with every SCIP release containing new callbacks for branchrule in order to compile.
    3233 *
    3234 *
    3235 * If you are using branching rule data, you have to allocate the memory for the data at this point.
    3236 * You can do this by calling:
    3237 * \code
    3238 * SCIP_CALL( SCIPallocBlockMemory(scip, &branchruledata) );
    3239 * \endcode
    3240 * You also have to initialize the fields in struct SCIP_BranchruleData afterwards.
    3241 *
    3242 * You may also add user parameters for your branching rule, see the function SCIPincludeBranchruleRelpscost() in
    3243 * src/scip/branch_relpscost.c for an example.
    3244 *
    3245 *
    3246 * @section BRANCHRULE_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Branching Rule
    3247 *
    3248 * Branching rules do not have any fundamental callbacks, i.e., all callbacks are optional.
    3249 * In most cases, however, you want to implement the \ref BRANCHEXECLP function and sometimes the \ref BRANCHEXECPS function.
    3250 *
    3251 *
    3252 * @section BRANCHRULE_ADDITIONALCALLBACKS Additional Callbacks of a Branching Rule
    3253 *
    3254 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    3255 * implemented for most applications, they can be used, for example, to initialize and free private data.
    3256 * Additional callbacks can either be passed directly with SCIPincludeBranchrule() to SCIP or via specific
    3257 * <b>setter functions</b> after a call of SCIPincludeBranchruleBasic(), see also @ref BRANCHRULE_INTERFACE.
    3258 *
    3259 * The most important callbacks are the \ref BRANCHEXECLP, \ref BRANCHEXECEXT,
    3260 * and \ref BRANCHEXECPS functions, which perform the actual task of generating a branching.
    3261 *
    3262 * Additional documentation for the callbacks can be found in type_branch.h.
    3263 *
    3264 * @subsection BRANCHEXECLP
    3265 *
    3266 * The BRANCHEXECLP callback is executed during node processing if a fractional LP solution is available. It should
    3267 * split the current problem into smaller subproblems. Usually, the branching is done in a way such that the current
    3268 * fractional LP solution is no longer feasible in the relaxation of the subproblems. It is, however, possible to
    3269 * create a child node for which the fractional LP solution is still feasible in the relaxation, for example, by
    3270 * branching on a variable with integral LP value. In every case, you have to make sure that each subproblem is a
    3271 * proper restriction of the current problem. Otherwise, you risk to produce an infinite path in the search tree.
    3272 *
    3273 * The user gains access to the branching candidates, i.e., to the fractional variables, and their LP solution values by
    3274 * calling the function SCIPgetLPBranchCands(). Furthermore, SCIP provides two functions for performing the actual
    3275 * branching, namely SCIPbranchVar() and SCIPcreateChild().
    3276 *
    3277 * Given an integral variable \f$x\f$ with fractional LP solution value \f$x^*\f$, the function SCIPbranchVar() creates
    3278 * two child nodes; one contains the bound \f$x \le \lfloor x^* \rfloor\f$ and the other one contains the bound \f$x \ge
    3279 * \lceil x^* \rceil\f$, see the BRANCHEXECLP callback in src/scip/branch_mostinf.c for an example. In addition, if a
    3280 * proven lower objective bound of a created child node is known, like after strong branching has been applied, the user
    3281 * may call the function SCIPupdateNodeLowerbound() in order to update the child node's lower bound.
    3282 *
    3283 * Please also see the \ref BRANCHEXEC "further information for the three execution functions".
    3284 *
    3285 * @subsection BRANCHEXECEXT
    3286 *
    3287 * The BRANCHEXECEXT callback is executed during node processing if no LP solution is available and the list of
    3288 * external branching candidates is not empty. It should split the current problem into smaller subproblems. If you
    3289 * do not use relaxation handlers or constraints handlers that provide external branching candidates, you do not need to
    3290 * implement this callback.
    3291 *
    3292 * In contrast to the LP branching candidates and the pseudo branching candidates, the list of external branching
    3293 * candidates will not be generated automatically. The user has to add all variables to the list by calling
    3294 * SCIPaddExternBranchCand() for each of them. Usually, this will happen in the execution function of a relaxation handler or in the
    3295 * enforcement functions of a constraint handler.
    3296 *
    3297 * The user gains access to these branching candidates by calling the function SCIPgetExternBranchCands(). Furthermore,
    3298 * SCIP provides two functions for performing the actual branching with a given solution value, namely SCIPbranchVarVal()
    3299 * and SCIPcreateChild(). SCIPbranchVarVal() allows users to specify the branching point for a variable in contrast to
    3300 * SCIPbranchVar(), which will always use the current LP or pseudo solution.
    3301 *
    3302 * This paragraph contains additional information regarding how the function SCIPbranchVarVal() works. For external branching candidates,
    3303 * there are three principle possibilities:
    3304 * - Given a continuous variable \f$x\f$ with solution value \f$x^*\f$, the function SCIPbranchVarVal() creates
    3305 * two child nodes; one contains the bound \f$x \le x^* \f$ and the other one contains the bound \f$x \ge x^* \f$.
    3306 * - Given an integer variable \f$x\f$ with fractional solution value \f$x^*\f$, the function
    3307 * SCIPbranchVarVal() creates two child nodes; one contains the bound \f$x \le \lfloor x^* \rfloor\f$ and the other
    3308 * one contains the bound \f$x \ge \lceil x^* \rceil\f$.
    3309 * - Given an integer variable \f$x\f$ with integral solution value \f$x^*\f$, the function SCIPbranchVarVal()
    3310 * creates three child nodes; one contains the bound \f$x \le x^* -1\f$, one contains the bound \f$x \ge x^* +1\f$,
    3311 * one contains the fixing \f$x = x^*\f$.
    3312 *
    3313 * See the BRANCHEXECEXT callback in src/scip/branch_random.c for an example. In addition, if a proven lower bound of a
    3314 * created child node is known the user may call the function SCIPupdateNodeLowerbound() in order to update the child
    3315 * node's lower bound.
    3316 *
    3317 * Please also see the \ref BRANCHEXEC "further information for the three execution functions".
    3318 *
    3319 * @subsection BRANCHEXECPS
    3320 *
    3321 * The BRANCHEXECPS callback is executed during node processing if no LP solution is available and at least one of the
    3322 * integer variables is not yet fixed. It should split the current problem into smaller subproblems. PS stands for
    3323 * pseudo solution which is the vector of all variables set to their locally best (w.r.t. the objective function)
    3324 * bounds.
    3325 *
    3326 * The user gains access to the branching candidates, i.e., to the non-fixed integer variables, by calling the function
    3327 * SCIPgetPseudoBranchCands(). Furthermore, SCIP provides two functions for performing the actual branching, namely
    3328 * SCIPbranchVar() and SCIPcreateChild().
    3329 *
    3330 * Given an integer variable \f$x\f$ with bounds \f$[l,u]\f$ and not having solved the LP, the function SCIPbranchVar()
    3331 * creates two child nodes:
    3332 * - If both bounds are finite, then the two children will contain the domain reductions \f$x \le x^*\f$, and \f$x \ge
    3333 * x^*+1\f$ with \f$x^* = \lfloor \frac{l + u}{2}\rfloor\f$. The current pseudo solution will remain feasible in one
    3334 * of the branches, but the hope is that halving the domain's size leads to good propagations.
    3335 * - If only one of the bounds is finite, the variable will be fixed to that bound in one of the child nodes. In the
    3336 * other child node, the bound will be shifted by one.
    3337 * - If both bounds are infinite, three children will be created: \f$x \le 1\f$, \f$x \ge 1\f$, and \f$x = 0\f$.
    3338
    3339 *
    3340 * See the BRANCHEXECPS callback in src/scip/branch_random.c for an example. In addition, if a proven lower bound of a
    3341 * created child node is known, the user may call the function SCIPupdateNodeLowerbound() in order to update the child
    3342 * node's lower bound.
    3343 *
    3344 * Please also see the \ref BRANCHEXEC "further information for the three execution functions".
    3345 *
    3346 * @subsection BRANCHEXEC Further information for the three execution functions
    3347 *
    3348 * In order to apply more general branching schemes, one should use the function SCIPcreateChild().
    3349 * After having created a child node, the additional restrictions of the child node have to be added with calls to
    3350 * SCIPaddConsNode(), SCIPchgVarLbNode(), or SCIPchgVarUbNode().
    3351 * \n
    3352 * In the function SCIPcreateChild(), the branching rule has to assign two values to the new nodes: a node selection
    3353 * priority for each node and an estimate for the objective value of the best feasible solution contained in the subtree
    3354 * after applying the branching. If the function SCIPbranchVar() is used, these values are automatically assigned. For
    3355 * variable based branching schemes, one might use the functions SCIPcalcNodeselPriority() and the function
    3356 * SCIPcalcChildEstimate().
    3357 *
    3358 * In some cases, the branching rule can tighten the current subproblem instead of producing a branching. For example,
    3359 * strong branching might have proven that rounding up a variable would lead to an infeasible LP relaxation and thus,
    3360 * the variable must be rounded down. Therefore, the BRANCHEXECLP, BRANCHEXECPS and BRANCHEXECREL callbacks may also
    3361 * produce domain reductions or add additional constraints to the current subproblem.
    3362 *
    3363 * The execution callbacks have the following options:
    3364 * - detecting that the node is infeasible and can be cut off (result SCIP_CUTOFF)
    3365 * - adding an additional constraint (e.g. a conflict constraint) (result SCIP_CONSADDED; note that this action
    3366 * must not be performed if the input "allowaddcons" is FALSE)
    3367 * - reducing the domain of a variable such that the current LP solution becomes infeasible (result SCIP_REDUCEDDOM)
    3368 * - applying a branching (result SCIP_BRANCHED)
    3369 * - stating that the branching rule was skipped (result SCIP_DIDNOTRUN).
    3370 *
    3371 * Only the BRANCHEXECLP callback has the possibility to add a cutting plane to the LP (result SCIP_SEPARATED).
    3372 *
    3373 * @subsection BRANCHFREE
    3374 *
    3375 * If you are using branching rule data, you have to implement this function in order to free the branching rule data.
    3376 * This can be done by the following procedure:
    3377 *
    3378 * @refsnippet{src/scip/branch_random.c,SnippetBranchFreeRandom}
    3379 *
    3380 * If you have allocated memory for fields in your branching rule data, remember to free this memory
    3381 * before freeing the branching rule data itself.
    3382 * If you are using the C++ wrapper class, this function is not available.
    3383 * Instead, just use the destructor of your class to free the member variables of your class.
    3384 *
    3385 * @subsection BRANCHINIT
    3386 *
    3387 * The BRANCHINIT callback is executed after the problem is transformed.
    3388 * The branching rule may, e.g., use this call to initialize its branching rule data.
    3389 *
    3390 * @subsection BRANCHCOPY
    3391 *
    3392 * The BRANCHCOPY callback is executed when a SCIP instance is copied, e.g. to
    3393 * solve a sub-SCIP. By
    3394 * defining this callback as
    3395 * <code>NULL</code> the user disables the execution of the specified
    3396 * branching rule for all copied SCIP instances. This may deteriorate the performance
    3397 * of primal heuristics using sub-SCIPs.
    3398 *
    3399 * @subsection BRANCHEXIT
    3400 *
    3401 * The BRANCHEXIT callback is executed before the transformed problem is freed.
    3402 * In this function, the branching rule should free all resources that have been allocated for the solving process in
    3403 * BRANCHINIT.
    3404 *
    3405 * @subsection BRANCHINITSOL
    3406 *
    3407 * The BRANCHINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    3408 * begin.
    3409 * The branching rule may use this call to initialize its branch-and-bound specific data.
    3410 *
    3411 * @subsection BRANCHEXITSOL
    3412 *
    3413 * The BRANCHEXITSOL callback is executed before the branch-and-bound process is freed.
    3414 * The branching rule should use this call to clean up its branch-and-bound data.
    3415 */
    3416
    3417
    3418/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    3419
    3420/**@page CUTSEL How to add cut selectors
    3421 *
    3422 * Cut selectors are used to select the cuts that are going to be added to the relaxation.
    3423 * For more information on how SCIP manages cuts, see "What is the difference between a sepastore and the cutpool?" in the
    3424 * \ref FAQ.
    3425 * \n
    3426 * A complete list of all cut selectors contained in this release can be found \ref CUTSELECTORS "here".
    3427 *
    3428 * We now explain how users can add their own cut selectors.
    3429 * Take the hybrid cut selector (src/scip/cutsel_hybrid.c) as an example.
    3430 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjCutsel wrapper
    3431 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_CUTSEL... callbacks.
    3432 *
    3433 * Additional documentation for the callbacks of a cut selector can be found in the file type_cutsel.h.
    3434 *
    3435 * Here is what you have to do to implement a cut selector:
    3436 * -# Copy the template files src/scip/cutsel_xyz.c and src/scip/cutsel_xyz.h into files named "cutsel_mycutselector.c"
    3437 * and "cutsel_mycutselector.h".
    3438 * \n
    3439 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    3440 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    3441 * -# Use SCIPincludeCutselMycutselector() in order to include the cut selector into your SCIP instance,
    3442 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    3443 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    3444 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mycutselector".
    3445 * -# Adjust the properties of the cut selector (see \ref CUTSEL_PROPERTIES).
    3446 * -# Define the cut selector data (see \ref CUTSEL_DATA). This is optional.
    3447 * -# Implement the interface functions (see \ref CUTSEL_INTERFACE).
    3448 * -# Implement the fundamental callbacks (see \ref CUTSEL_FUNDAMENTALCALLBACKS).
    3449 * -# Implement the additional callbacks (see \ref CUTSEL_ADDITIONALCALLBACKS). This is optional.
    3450 *
    3451 *
    3452 * @section CUTSEL_PROPERTIES Properties of a Cut Selector
    3453 *
    3454 * At the top of the new file "cutsel_mycutselector.c" you can find the cut selector properties.
    3455 * These are given as compiler defines.
    3456 * In the C++ wrapper class, you have to provide the cut selector properties by calling the constructor
    3457 * of the abstract base class scip::ObjCutsel from within your constructor.
    3458 * The properties you have to set have the following meaning:
    3459 *
    3460 * \par CUTSEL_NAME: the name of the cut selector.
    3461 * This name is used in the interactive shell to address the cut selector.
    3462 * Additionally, if you are searching for a cut selector with SCIPfindCutsel(), this name is looked up.
    3463 * Names have to be unique: no two cut selectors may have the same name.
    3464 *
    3465 * \par CUTSEL_DESC: the description of the cut selector.
    3466 * This string is printed as a description of the cut selector in the interactive shell.
    3467 *
    3468 * \par CUTSEL_PRIORITY: the priority of the cut selector.
    3469 * After all cuts have been collected in the sepastore, SCIP asks the cut selectors to select cuts.
    3470 * The cut selectors are sorted by priority (highest goes first) and are called, in this order, until the first one
    3471 * succeeds.
    3472 * \n
    3473 * Note that this property only defines the default value of the priority. The user may change this value arbitrarily by
    3474 * adjusting the corresponding parameter setting. Whenever, even during solving, the priority of a cut selector is
    3475 * changed, the cut selectors are re-sorted by the new priorities.
    3476 *
    3477 *
    3478 * @section CUTSEL_DATA Cut Selector Data
    3479 *
    3480 * Below the header "Data structures" you can find a struct which is called "struct SCIP_CutselData".
    3481 * In this data structure, you can store the data of your cut selector. For example, you should store the adjustable
    3482 * parameters of the cut selector in this data structure.
    3483 * If you are using C++, you can add cut selector data as usual as object variables to your class.
    3484 * \n
    3485 * Defining cut selector data is optional. You can leave the struct empty.
    3486 *
    3487 *
    3488 * @section CUTSEL_INTERFACE Interface Functions
    3489 *
    3490 * At the bottom of "cutsel_mycutselector.c", you can find the interface function SCIPincludeCutselMycutselector(),
    3491 * which also appears in "cutsel_mycutselector.h"
    3492 * SCIPincludeCutselMycutselector() is called by the user, if they want to include the cut selector, i.e., if they want
    3493 * to use the cut selector in their application.
    3494 *
    3495 * This function only has to be adjusted slightly.
    3496 * It is responsible for notifying SCIP of the presence of the cut selector. For this, you can either call
    3497 * SCIPincludeCutsel()
    3498 * or SCIPincludeCutselBasic(). In the latter variant, \ref CUTSEL_ADDITIONALCALLBACKS "additional callbacks"
    3499 * must be added via setter functions as, e.g., SCIPsetCutselCopy(). We recommend this latter variant because
    3500 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    3501 * variant must be manually adjusted with every SCIP release containing new callbacks for cut selectors in order to compile.
    3502 *
    3503 *
    3504 * If you are using cut selector data, you have to allocate the memory for the data at this point.
    3505 * You can do this by calling:
    3506 * \code
    3507 * SCIP_CALL( SCIPallocBlockMemory(scip, &cutseldata) );
    3508 * \endcode
    3509 * You also have to initialize the fields in struct SCIP_CutselData afterwards.
    3510 *
    3511 * You may also add user parameters for your cut selector, see the function SCIPincludeCutselHybrid() in
    3512 * src/scip/cutsel_hybrid.c for an example.
    3513 *
    3514 *
    3515 * @section CUTSEL_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Cut Selector
    3516 *
    3517 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    3518 * an operational algorithm.
    3519 * They are passed together with the cut selector itself to SCIP using SCIPincludeCutsel() or SCIPincludeCutselBasic(),
    3520 * see @ref CUTSEL_INTERFACE.
    3521 *
    3522 * Cut selector plugins have a single fundamental callback, namely the CUTSELSELECT function.
    3523 * This function has to be implemented for every cut selector; the other callbacks are optional.
    3524 * It implements the single contribution every selector has to provide: Selecting cuts to be added to the relaxation.
    3525 * In the C++ wrapper class scip::ObjCutsel, the scip_select() function is a virtual abstract member function.
    3526 * You have to implement it in order to be able to construct an object of your cut selector class.
    3527 *
    3528 * @subsection CUTSELSELECT
    3529 *
    3530 * The CUTSELSELECT callback should decide which cuts should be added to the relaxation.
    3531 * The callback receives the arrays of cuts to select from. This array must be re-sorted and the first nselectedcuts from
    3532 * the sorted array are going to be selected.
    3533 * In addition to the aforementioned cuts, the list of forced cuts is also given as an argument. This array can be used
    3534 * to help with the selection algorithm. Note, however, that this array should not be tampered with.
    3535 *
    3536 * Additional documentation for this callback can be found in type_cutsel.h.
    3537 *
    3538 * @section CUTSEL_ADDITIONALCALLBACKS Additional Callbacks of a Cut Selector
    3539 *
    3540 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    3541 * implemented for most applications. They can be used, for example, to initialize and free private data.
    3542 * Additional callbacks can either be passed directly with SCIPincludeCutsel() to SCIP or via specific
    3543 * <b>setter functions</b> after a call of SCIPincludeCutselBasic(), see also @ref CUTSEL_INTERFACE.
    3544 *
    3545 * @subsection CUTSELFREE
    3546 *
    3547 * If you are using cut selector data, you have to implement this function in order to free the cut selector data.
    3548 * This can be done by the following procedure:
    3549 *
    3550 * @refsnippet{src/scip/cutsel_hybrid.c,SnippetCutselFreeHybrid}
    3551 *
    3552 * If you have allocated memory for fields in your cut selector data, remember to free this memory
    3553 * before freeing the cut selector data itself.
    3554 * If you are using the C++ wrapper class, this function is not available.
    3555 * Instead, just use the destructor of your class to free the member variables of your class.
    3556 *
    3557 * @subsection CUTSELINIT
    3558 *
    3559 * The CUTSELINIT callback is executed after the problem is transformed.
    3560 * The cut selector may, for example, use this call to initialize its cut selector data.
    3561 *
    3562 * @subsection CUTSELCOPY
    3563 *
    3564 * The CUTSELCOPY callback is executed when a SCIP instance is copied, e.g., to solve a sub-SCIP. By defining this
    3565 * callback as <code>NULL</code> the user disables the execution of the specified cut selector for all copied SCIP
    3566 * instances.
    3567 *
    3568 * @subsection CUTSELEXIT
    3569 *
    3570 * The CUTSELEXIT callback is executed before the transformed problem is freed.
    3571 * In this function, the cut selector should free all resources that have been allocated for the solving process
    3572 * in CUTSELINIT.
    3573 *
    3574 * @subsection CUTSELINITSOL
    3575 *
    3576 * The CUTSELINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    3577 * begin.
    3578 * The cut selector may use this call to initialize its branch-and-bound specific data.
    3579 *
    3580 * @subsection CUTSELEXITSOL
    3581 *
    3582 * The CUTSELEXITSOL callback is executed before the branch-and-bound process is freed.
    3583 * The cut selector should use this call to clean up its branch-and-bound data.
    3584 */
    3585
    3586/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    3587
    3588/**@page NODESEL How to add node selectors
    3589 *
    3590 * Node selectors are used to decide which of the leaves in the current branching tree is selected as next subproblem
    3591 * to be processed. The ordering relation of the tree's leaves for storing them in the leaf priority queue is also
    3592 * defined by the node selectors.
    3593 * \n
    3594 * A complete list of all node selectors contained in this release can be found \ref NODESELECTORS "here".
    3595 *
    3596 * We now explain how users can add their own node selectors.
    3597 * Take the node selector for depth first search (src/scip/nodesel_dfs.c) as an example.
    3598 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjNodesel wrapper
    3599 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_NODESEL... callbacks.
    3600 *
    3601 * Additional documentation for the callbacks of a node selector can be found in the file type_nodesel.h.
    3602 *
    3603 * Here is what you have to do to implement a node selector:
    3604 * -# Copy the template files src/scip/nodesel_xyz.c and src/scip/nodesel_xyz.h into files named "nodesel_mynodeselector.c"
    3605 * and "nodesel_mynodeselector.h".
    3606 * \n
    3607 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    3608 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    3609 * -# Use SCIPincludeNodeselMynodeselector() in order to include the node selector into your SCIP instance,
    3610 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    3611 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    3612 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mynodeselector".
    3613 * -# Adjust the properties of the node selector (see \ref NODESEL_PROPERTIES).
    3614 * -# Define the node selector data (see \ref NODESEL_DATA). This is optional.
    3615 * -# Implement the interface functions (see \ref NODESEL_INTERFACE).
    3616 * -# Implement the fundamental callbacks (see \ref NODESEL_FUNDAMENTALCALLBACKS).
    3617 * -# Implement the additional callbacks (see \ref NODESEL_ADDITIONALCALLBACKS). This is optional.
    3618 *
    3619 *
    3620 * @section NODESEL_PROPERTIES Properties of a Node Selector
    3621 *
    3622 * At the top of the new file "nodesel_mynodeselector.c" you can find the node selector properties.
    3623 * These are given as compiler defines.
    3624 * In the C++ wrapper class, you have to provide the node selector properties by calling the constructor
    3625 * of the abstract base class scip::ObjNodesel from within your constructor.
    3626 * The properties you have to set have the following meaning:
    3627 *
    3628 * \par NODESEL_NAME: the name of the node selector.
    3629 * This name is used in the interactive shell to address the node selector.
    3630 * Additionally, if you are searching for a node selector with SCIPfindNodesel(), this name is looked up.
    3631 * Names have to be unique: no two node selectors may have the same name.
    3632 *
    3633 * \par NODESEL_DESC: the description of the node selector.
    3634 * This string is printed as a description of the node selector in the interactive shell.
    3635 *
    3636 * \par NODESEL_STDPRIORITY: the default priority of the node selector in the standard mode.
    3637 * The first step of each iteration of the main solving loop is the selection of the next subproblem to be processed.
    3638 * The node selector of highest priority (the active node selector) is called to do this selection.
    3639 * In particular, if you implemented your own node selector plugin which you want to be applied, you should choose a priority
    3640 * which is greater then all priorities of the SCIP default node selectors.
    3641 * Note that SCIP has two different operation modes: the standard mode and the memory saving mode. If the memory
    3642 * limit - given as a parameter by the user - is almost reached, SCIP switches from the standard mode to the memory saving
    3643 * mode in which different priorities for the node selectors are applied. NODESEL_STDPRIORITY is the priority of the
    3644 * node selector used in the standard mode.
    3645 * \n
    3646 * Note that this property only defines the default value of the priority. The user may change this value arbitrarily by
    3647 * adjusting the corresponding parameter setting.
    3648 *
    3649 * \par NODESEL_MEMSAVEPRIORITY: the default priority of the node selector in the memory saving mode.
    3650 * The priority NODESEL_MEMSAVEPRIORITY of the node selector has the same meaning as the priority NODESEL_STDPRIORITY, but
    3651 * is used in the memory saving mode.
    3652 * Usually, you want the best performing node selector, for example best estimate search, to have maximal
    3653 * standard priority, while you want a node selector which tends to keep the growth of the search tree limited, for example
    3654 * depth first search, to have maximal memory saving priority.
    3655 * \n
    3656 * Note that this property only defines the default value of the priority. The user may change this value arbitrarily by
    3657 * adjusting the corresponding parameter setting.
    3658 *
    3659 *
    3660 * @section NODESEL_DATA Node Selector Data
    3661 *
    3662 * Below the header "Data structures" you can find a struct which is called "struct SCIP_NodeselData".
    3663 * In this data structure, you can store the data of your node selector. For example, you should store the adjustable
    3664 * parameters of the node selector in this data structure.
    3665 * If you are using C++, you can add node selector data as usual as object variables to your class.
    3666 * \n
    3667 * Defining node selector data is optional. You can leave the struct empty.
    3668 *
    3669 *
    3670 * @section NODESEL_INTERFACE Interface Functions
    3671 *
    3672 * At the bottom of "nodesel_mynodeselector.c", you can find the interface function SCIPincludeNodeselMynodeselector(),
    3673 * which also appears in "nodesel_mynodeselector.h"
    3674 * SCIPincludeNodeselMynodeselector() is called by the user, if (s)he wants to include the node selector,
    3675 * i.e., if (s)he wants to use the node selector in his/her application.
    3676 *
    3677 * This function only has to be adjusted slightly.
    3678 * It is responsible for notifying SCIP of the presence of the node selector. For this, you can either call
    3679 * SCIPincludeNodesel(),
    3680 * or SCIPincludeNodeselBasic() since SCIP version 3.0. In the latter variant, \ref NODESEL_ADDITIONALCALLBACKS "additional callbacks"
    3681 * must be added via setter functions as, e.g., SCIPsetNodeselCopy(). We recommend this latter variant because
    3682 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    3683 * variant must be manually adjusted with every SCIP release containing new callbacks for node selectors in order to compile.
    3684 *
    3685 *
    3686 * If you are using node selector data, you have to allocate the memory for the data at this point.
    3687 * You can do this by calling:
    3688 * \code
    3689 * SCIP_CALL( SCIPallocBlockMemory(scip, &nodeseldata) );
    3690 * \endcode
    3691 * You also have to initialize the fields in struct SCIP_NodeselData afterwards.
    3692 *
    3693 * You may also add user parameters for your node selector, see the function SCIPincludeNodeselRestartdfs() in
    3694 * src/scip/nodesel_restartdfs.c for an example.
    3695 *
    3696 *
    3697 * @section NODESEL_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Node Selector
    3698 *
    3699 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    3700 * an operational algorithm.
    3701 * They are passed together with the node selector itself to SCIP using SCIPincludeNodesel() or SCIPincludeNodeselBasic(),
    3702 * see @ref NODESEL_INTERFACE.
    3703 *
    3704 * Node selector plugins have two fundamental callbacks, namely the NODESELSELECT function and the NODESELCOMP function.
    3705 * These functions have to be implemented for every node selector; the other callbacks are optional.
    3706 * They implement the two requirements every node selector has to fulfill: Selecting a node from the queue to be processed
    3707 * next and, given two nodes, deciding which of both is favored by the node selector's selection rule. The first
    3708 * task is implemented in the NODESELSELECT callback, the second one in the NODESELCOMP callback.
    3709 * In the C++ wrapper class scip::ObjNodesel, the scip_select() function and the scip_comp() function (which correspond to the
    3710 * NODESELSELECT callback and the NODESELCOMP callback, respectively) are virtual abstract member functions.
    3711 * You have to implement them in order to be able to construct an object of your node selector class.
    3712 *
    3713 * Additional documentation for the callbacks can be found in type_nodesel.h.
    3714 *
    3715 * @subsection NODESELSELECT
    3716 *
    3717 * The NODESELSELECT callback is the first function called in each iteration in the main solving loop. It should decide
    3718 * which of the leaves in the current branching tree is selected as the next subproblem to be processed.
    3719 * It can arbitrarily decide between all leaves stored in the tree, but for performance reasons,
    3720 * the current node's children and siblings are often treated different from the remaining leaves.
    3721 * This is mainly due to the warm start capabilities of the simplex algorithm and the expectation that the bases of
    3722 * neighboring vertices in the branching tree very similar.
    3723 * The node selector's choice of the next node to process can
    3724 * have a large impact on the solver's performance, because it influences the finding of feasible solutions and the
    3725 * development of the global dual bound.
    3726 *
    3727 * Besides the ranking of the node selector, every node gets assigned a node selection priority by the branching rule
    3728 * that created the node. See the \ref BRANCHEXECLP and \ref BRANCHEXECPS callbacks of the branching rules for details.
    3729 * For example, the node where the branching went in the same way as the deviation from the branching variable's
    3730 * root solution could be assigned a higher priority than the node where the branching went in the opposite direction.
    3731 *
    3732 * The following functions provide access to the various types of leaf nodes:
    3733 * - SCIPgetPrioChild() returns the child of the current node with the largest node selection priority, as assigned by the
    3734 * branching rule.
    3735 * If no child is available (for example, because the current node was pruned), a NULL pointer is returned.
    3736 * - SCIPgetBestChild() returns the best child of the current node with respect to the node selector's ordering relation as
    3737 * defined by the \ref NODESELCOMP callback. If no child is available, a NULL pointer is returned.
    3738 * - SCIPgetPrioSibling() returns the sibling of the current node with the largest node selection priority.
    3739 * If no sibling is available (for example, because all siblings of the current node have already been processed), a NULL
    3740 * pointer is returned.
    3741 * Note that in binary branching every node has at most one sibling, but since SCIP supports arbitrary branching rules,
    3742 * this might not always be the case.
    3743 * - SCIPgetBestSibling() returns the best sibling of the current node with respect to the node selector's ordering relation
    3744 * as defined by the \ref NODESELCOMP callback. If no sibling is available, a NULL pointer is returned.
    3745 * - SCIPgetBestNode() returns the best leaf from the tree (children, siblings, or other leaves) with respect to the node
    3746 * selector's ordering relation as defined by the \ref NODESELCOMP callback. If no open leaf exists, a NULL pointer is
    3747 * returned. In this case, the optimization is finished, and the node selector should return a NULL pointer as 'selnode'.
    3748 * - SCIPgetBestboundNode() returns a leaf from the tree (children, siblings, or other leaves) with the smallest lower (dual)
    3749 * objective bound. If the queue is empty, a NULL pointer is returned. In this case, the optimization is finished, and the
    3750 * node selector should return a NULL pointer as 'selnode'.
    3751 *
    3752 *
    3753 * @subsection NODESELCOMP
    3754 *
    3755 * The NODESELCOMP callback is called to compare two leaves of the current branching tree (say node 1 and node 2)
    3756 * regarding their ordering relation.
    3757 *
    3758 * The NODESELCOMP should return the following values:
    3759 * - value < 0, if node 1 comes before (is better than) node 2
    3760 * - value = 0, if both nodes are equally good
    3761 * - value > 0, if node 1 comes after (is worse than) node 2.
    3762 *
    3763 * @section NODESEL_ADDITIONALCALLBACKS Additional Callbacks of a Node Selector
    3764 *
    3765 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    3766 * implemented for most applications, they can be used, for example, to initialize and free private data.
    3767 * Additional callbacks can either be passed directly with SCIPincludeNodesel() to SCIP or via specific
    3768 * <b>setter functions</b> after a call of SCIPincludeNodeselBasic(), see also @ref NODESEL_INTERFACE.
    3769 *
    3770 * @subsection NODESELFREE
    3771 *
    3772 * If you are using node selector data, you have to implement this function in order to free the node selector data.
    3773 * This can be done by the following procedure:
    3774 *
    3775 * @refsnippet{src/scip/nodesel_bfs.c,SnippetNodeselFreeBfs}
    3776 *
    3777 * If you have allocated memory for fields in your node selector data, remember to free this memory
    3778 * before freeing the node selector data itself.
    3779 * If you are using the C++ wrapper class, this function is not available.
    3780 * Instead, just use the destructor of your class to free the member variables of your class.
    3781 *
    3782 * @subsection NODESELINIT
    3783 *
    3784 * The NODESELINIT callback is executed after the problem is transformed.
    3785 * The node selector may, e.g., use this call to initialize its node selector data.
    3786 *
    3787 * @subsection NODESELCOPY
    3788 *
    3789 * The NODESELCOPY callback is executed when a SCIP instance is copied, e.g. to
    3790 * solve a sub-SCIP. By
    3791 * defining this callback as
    3792 * <code>NULL</code> the user disables the execution of the specified
    3793 * node selector for all copied SCIP instances. This may deteriorate the performance
    3794 * of primal heuristics using sub-SCIPs.
    3795 *
    3796 * @subsection NODESELEXIT
    3797 *
    3798 * The NODESELEXIT callback is executed before the transformed problem is freed.
    3799 * In this function, the node selector should free all resources that have been allocated for the solving process
    3800 * in NODESELINIT.
    3801 *
    3802 * @subsection NODESELINITSOL
    3803 *
    3804 * The NODESELINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    3805 * begin.
    3806 * The node selector may use this call to initialize its branch-and-bound specific data.
    3807 *
    3808 * @subsection NODESELEXITSOL
    3809 *
    3810 * The NODESELEXITSOL callback is executed before the branch-and-bound process is freed.
    3811 * The node selector should use this call to clean up its branch-and-bound data.
    3812 */
    3813
    3814
    3815/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    3816
    3817/**@page HEUR How to add primal heuristics
    3818 *
    3819 * Feasible solutions can be found in two different ways during the traversal of the branch-and-bound tree. On one
    3820 * hand, the solution of a node's relaxation may be feasible with respect to the constraints (including the integrality).
    3821 * On the other hand, feasible solutions can be discovered by primal heuristics.
    3822 * \n
    3823 * A complete list of all primal heuristics contained in this release can be found \ref PRIMALHEURISTICS "here".
    3824 * \n
    3825 * Diving heuristics are primal heuristics that explore an auxiliary search tree in a depth-first manner. Since SCIP
    3826 * version 3.2, it is easy to integrate further diving heuristics by using a special controller for the scoring,
    3827 * see \ref DIVINGHEUR "here" for information on how to implement a diving heuristic.
    3828 * \n
    3829 * We now explain how users can add their own primal heuristics.
    3830 * Take the simple and fast LP rounding heuristic (src/scip/heur_simplerounding.c) as an example.
    3831 * The idea of simple rounding is to iterate over all fractional variables of an LP solution and round them down,
    3832 * if the variables appears only with nonnegative coefficients in the system Ax <= b and round them up if
    3833 * the variables appears only with nonpositive coefficients.
    3834 * If one of both conditions applies for each of the fractional variables, this will give a feasible solution.
    3835 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjHeur wrapper
    3836 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_HEUR... callbacks.
    3837 *
    3838 * Additional documentation for the callbacks of a primal heuristic can be found in the file type_heur.h.
    3839 *
    3840 * Here is what you have to do to implement a primal heuristic:
    3841 * -# Copy the template files src/scip/heur_xyz.c and src/scip/heur_xyz.h into files named "heur_myheuristic.c"
    3842 * and "heur_myheuristic.h".
    3843 * \n
    3844 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    3845 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    3846 * -# Use `SCIPincludeHeurMyheuristic()` in order to include the heuristic into your SCIP instance,
    3847 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    3848 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    3849 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myheuristic".
    3850 * -# Adjust the properties of the primal heuristic (see \ref HEUR_PROPERTIES).
    3851 * -# Define the primal heuristic data (see \ref HEUR_DATA). This is optional.
    3852 * -# Implement the interface functions (see \ref HEUR_INTERFACE).
    3853 * -# Implement the fundamental callbacks (see \ref HEUR_FUNDAMENTALCALLBACKS).
    3854 * -# Implement the additional callbacks (see \ref HEUR_ADDITIONALCALLBACKS). This is optional.
    3855 *
    3856 *
    3857 * @section HEUR_PROPERTIES Properties of a Primal Heuristic
    3858 *
    3859 * At the top of the new file "heur_myheuristic.c" you can find the primal heuristic properties.
    3860 * These are given as compiler defines.
    3861 * In the C++ wrapper class, you have to provide the primal heuristic properties by calling the constructor
    3862 * of the abstract base class scip::ObjHeur from within your constructor.
    3863 * Of course, all of them are of relevant, but the most important ones for controlling the performance
    3864 * are usually HEUR_FREQ and HEUR_TIMING.
    3865 * The properties you have to set have the following meaning:
    3866 *
    3867 * \par HEUR_NAME: the name of the primal heuristic.
    3868 * This name is used in the interactive shell to address the primal heuristic.
    3869 * Additionally, if you are searching for a primal heuristic with SCIPfindHeur(), this name is looked up.
    3870 * Names have to be unique: no two primal heuristics may have the same name.
    3871 *
    3872 * \par HEUR_DESC: the description of the primal heuristic.
    3873 * This string is printed as a description of the primal heuristic in the interactive shell when you call "display heuristics".
    3874 *
    3875 * \par HEUR_DISPCHAR: the display character of the primal heuristic.
    3876 * In the interactive shell, this character is printed in the first column of a status information row, if the primal
    3877 * heuristic found the feasible solution belonging to the primal bound. Note that a star '*' stands for an integral
    3878 * LP-relaxation.
    3879 * It is recommended to select a lower or upper case letter as display character. The default primal heuristics of
    3880 * SCIP use characters that describe the class to which the heuristic belongs. As an example all LP rounding heuristics
    3881 * have an 'r' and all Large Neighborhood Search heuristics use the letter 'L'.
    3882 * Users find commonly used display characters in type_heur.h.
    3883 *
    3884 *
    3885 * \par HEUR_PRIORITY: the priority of the primal heuristic.
    3886 * At each of the different entry points of the primal heuristics during the solving process (see HEUR_TIMING), they are
    3887 * called in decreasing order of their priority.
    3888 * \n
    3889 * The priority of a primal heuristic should be set according to the complexity of the heuristic and the likelihood to find
    3890 * feasible solutions: primal heuristics that provide fast algorithms that often succeed in finding a feasible solution should have
    3891 * a high priority (like simple rounding). In addition, the interaction between different types of primal heuristics should be taken into account.
    3892 * For example, improvement heuristics, which try to generate improved solutions by inspecting one or more of the feasible
    3893 * solutions that have already been found, should have a low priority (like Crossover which by default needs at least 3 feasible solutions).
    3894 *
    3895 * \par HEUR_FREQ: the default frequency for executing the primal heuristic.
    3896 * The frequency together with the frequency offset (see HEUR_FREQOFS) defines the depth levels at which the execution
    3897 * function of the primal heuristic \ref HEUREXEC is called. For example, a frequency of 7 together with a frequency offset
    3898 * of 5 means, that the \ref HEUREXEC callback is executed for subproblems that are in depth 5, 12, 19, ... of the branching tree. A
    3899 * frequency of 0 together with a frequency offset of 3 means, that the execution function is only called at those nodes that are in
    3900 * depth level 3 (i.e., at most for \f$2^3 = 8\f$ nodes if binary branching is applied).
    3901 * Typical cases are: A frequency of 0 and an offset of 0 which means that
    3902 * the heuristic is only called at the root node and a frequency of -1 which disables the heuristic.
    3903 * \n
    3904 * The frequency can be adjusted by the user. This property of the primal heuristic only defines the default value of the
    3905 * frequency. If you want to have a more flexible control of when to execute the primal heuristic, you have to assign
    3906 * a frequency of 1 and implement a check at the beginning of your execution function whether you really want to search for feasible
    3907 * solutions or not. If you do not want to execute the function, set the result code to SCIP_DIDNOTRUN.
    3908 *
    3909 * \par HEUR_FREQOFS: the frequency offset for executing the primal heuristic.
    3910 * The frequency offset defines the depth of the branching tree at which the primal heuristic is executed for the first
    3911 * time. For example, a frequency of 7 (see HEUR_FREQ) together with a frequency offset of 10 means, that the
    3912 * callback is executed for subproblems that are in depth 10, 17, 24, ... of the branching tree. In particular, assigning
    3913 * different offset values to heuristics of the same type, like diving heuristics, can be useful for evenly spreading the
    3914 * application of these heuristics across the branch-and-bound tree.
    3915 * Note that if the frequency is equal to 1, the heuristic is applied for all nodes with depth level larger or equal to
    3916 * the frequency offset.
    3917 *
    3918 * \par HEUR_MAXDEPTH: the maximal depth level for executing the primal heuristic.
    3919 * This parameter denotes the maximal depth level in the branching tree up to which the execution function of the primal
    3920 * heuristic is called. Use -1 for no limit (a usual case).
    3921 *
    3922 * \par HEUR_TIMING: the execution timing of the primal heuristic.
    3923 * Primal heuristics have different entry points during the solving process and the execution timing parameter defines the
    3924 * entry point at which the primal heuristic is executed first.
    3925 * \n
    3926 * The primal heuristic can be called first:
    3927 * - before the processing of the node starts (SCIP_HEURTIMING_BEFORENODE)
    3928 * - after each LP solve during the cut-and-price loop (SCIP_HEURTIMING_DURINGLPLOOP)
    3929 * - after the cut-and-price loop was finished (SCIP_HEURTIMING_AFTERLPLOOP)
    3930 * - after the processing of a node <em>with solved LP</em> was finished (SCIP_HEURTIMING_AFTERLPNODE)
    3931 * - after the processing of a node <em>without solved LP</em> was finished (SCIP_HEURTIMING_AFTERPSEUDONODE)
    3932 * - after the processing of the last node in the current plunge was finished, <em>and only if the LP was solved for
    3933 * this node</em> (SCIP_HEURTIMING_AFTERLPPLUNGE)
    3934 * - after the processing of the last node in the current plunge was finished, <em>and only if the LP was not solved
    3935 * for this node</em> (SCIP_HEURTIMING_AFTERPSEUDOPLUNGE).
    3936 * \par
    3937 * A plunge is the successive solving of child and sibling nodes in the search tree.
    3938 * The flags listed above can be combined to call the heuristic at multiple times by concatenating them with a bitwise OR.
    3939 * Two useful combinations are already predefined:
    3940 * - after the processing of a node was finished (SCIP_HEURTIMING_AFTERNODE; combines SCIP_HEURTIMING_AFTERLPNODE and
    3941 * SCIP_HEURTIMING_AFTERPSEUDONODE)
    3942 * - after the processing of the last node in the current plunge was finished (SCIP_HEURTIMING_AFTERPLUNGE; combines
    3943 * SCIP_HEURTIMING_AFTERLPPLUNGE and SCIP_HEURTIMING_AFTERPSEUDOPLUNGE)
    3944 * \par
    3945 * Calling a primal heuristic "before the processing of the node starts" is particularly useful for heuristics
    3946 * that do not need to access the LP solution of the current node. If such a heuristic finds a feasible solution, the
    3947 * leaves of the branching tree exceeding the new primal bound are pruned. It may happen that even the current node can
    3948 * be cut off without solving the LP relaxation. Combinatorial heuristics, like the farthest insert heuristic for the TSP
    3949 * (see examples/TSP/src/HeurFarthestInsert.cpp), are often applicable at this point.
    3950 * \n
    3951 * Very fast primal heuristics that require an LP solution can also be called "after each LP solve during the
    3952 * cut-and-price loop". Rounding heuristics, like the simple and fast LP rounding heuristic
    3953 * (src/scip/heur_simplerounding.c), belong to this group of primal heuristics.
    3954 * \n
    3955 * Most heuristics, however, are called either after a node was completely processed
    3956 * (e.g. expensive rounding heuristics like RENS), or even only after a full plunge was finished (e.g., diving heuristics).
    3957 *
    3958 * \par HEUR_USESSUBSCIP: Does the heuristic use a secondary SCIP instance?
    3959 * Some heuristics and separators solve MIPs or SAT problems using a secondary SCIP instance. Examples are
    3960 * Large Neighborhood Search heuristics such as RINS and Local Branching or the CGMIP separator. To avoid recursion,
    3961 * these plugins usually deactivate all other plugins that solve MIPs. If a heuristic uses a secondary SCIP instance,
    3962 * this parameter has to be TRUE and it is recommended to call SCIPsetSubscipsOff() for the secondary SCIP instance.
    3963 *
    3964 * Computational experiments indicate that for the overall performance of a MIP solver, it is important to evenly
    3965 * spread the application of the heuristics across the branch-and-bound tree. Thus, the assignment of the parameters
    3966 * HEUR_FREQ, HEUR_FREQOFS, and HEUR_TIMING should contribute to this aim.
    3967 *
    3968 * Note that all diving heuristics in the SCIP distribution (see, e.g., src/scip/heur_guideddiving.c) check whether other diving
    3969 * heuristics have already been called at the current node. This can be done by comparing SCIPgetLastDivenode(scip) and
    3970 * SCIPgetNNodes(scip). If the two are equal, and if the current node is not the root node (SCIPgetDepth(scip) > 0), diving
    3971 * heuristics should be delayed by returning the result code 'SCIP_DELAYED'. This is an additional contribution to the goal of
    3972 * not calling multiple similar heuristics at the same node.
    3973 *
    3974 *
    3975 * @section HEUR_DATA Primal Heuristic Data
    3976 *
    3977 * Below the header "Data structures" you can find a struct which is called "struct SCIP_HeurData".
    3978 * In this data structure, you can store the data of your primal heuristic. For example, you should store the adjustable
    3979 * parameters of the primal heuristic or a working solution in this data structure.
    3980 * If you are using C++, you can add primal heuristic data as usual as object variables to your class.
    3981 * \n
    3982 * Defining primal heuristic data is optional. You can leave the struct empty.
    3983 *
    3984 *
    3985 * @section HEUR_INTERFACE Interface Functions
    3986 *
    3987 * At the bottom of "heur_myheuristic.c", you can find the interface function SCIPincludeHeurMyheuristic(),
    3988 * which also appears in "heur_myheuristic.h"
    3989 * SCIPincludeHeurMyheuristic() is called by the user, if (s)he wants to include the heuristic,
    3990 * i.e., if (s)he wants to use the heuristic in his/her application.
    3991 *
    3992 * This function only has to be adjusted slightly.
    3993 * It is responsible for notifying SCIP of the presence of the heuristic. For this, you can either call
    3994 * SCIPincludeHeur(),
    3995 * or SCIPincludeHeurBasic() since SCIP version 3.0. In the latter variant, \ref HEUR_ADDITIONALCALLBACKS "additional callbacks"
    3996 * must be added via setter functions as, e.g., SCIPsetHeurCopy(). We recommend this latter variant because
    3997 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    3998 * variant must be manually adjusted with every SCIP release containing new callbacks for heuristics in order to compile.
    3999 *
    4000 * If you are using primal heuristic data, you have to allocate the memory for the data at this point.
    4001 * You can do this by calling:
    4002 * \code
    4003 * SCIP_CALL( SCIPallocBlockMemory(scip, &heurdata) );
    4004 * \endcode
    4005 * You also have to initialize the fields in struct SCIP_HeurData afterwards.
    4006 *
    4007 * You may also add user parameters for your primal heuristic, see the function SCIPincludeHeurFeaspump() in
    4008 * src/scip/heur_oneopt.c for an example where a single Boolean parameter is added.
    4009 *
    4010 *
    4011 * @section HEUR_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Primal Heuristic
    4012 *
    4013 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    4014 * an operational algorithm.
    4015 * They are passed together with the primal heuristic itself to SCIP using SCIPincludeHeur() or SCIPincludeHeurBasic(),
    4016 * see @ref HEUR_INTERFACE.
    4017 *
    4018 *
    4019 * Primal heuristic plugins have only one fundamental callback, namely the HEUREXEC function.
    4020 * This function has to be implemented for every primal heuristic; the other callbacks are optional.
    4021 * In the C++ wrapper class scip::ObjHeur, the scip_exec() method (which corresponds to the HEUREXEC callback) is a virtual
    4022 * abstract member function. You have to implement it in order to be able to construct an object of your primal heuristic
    4023 * class.
    4024 *
    4025 * Additional documentation for the callbacks can be found in type_heur.h.
    4026 *
    4027 * @subsection HEUREXEC
    4028 *
    4029 * The HEUREXEC callback is called at different positions during the node processing loop, see HEUR_TIMING. It should
    4030 * search for feasible solutions and add them to the solution pool. For creating a new feasible solution, the
    4031 * functions SCIPcreateSol() and SCIPsetSolVal() can be used. Afterwards, the solution can be added to the storage by
    4032 * calling the function SCIPtrySolFree() (or SCIPtrySol() and SCIPfreeSol()).
    4033 *
    4034 * The HEUREXEC callback gets a SCIP pointer, a pointer to the heuristic itself, the current point in the
    4035 * solve loop and a result pointer as input (see type_heur.h).
    4036 *
    4037 * The heuristic has to set the result pointer appropriately!
    4038 * Therefore it has the following options:
    4039 * - finding at least one feasible solution (result SCIP_FOUNDSOL)
    4040 * - stating that the primal heuristic searched, but did not find a feasible solution (result SCIP_DIDNOTFIND)
    4041 * - stating that the primal heuristic was skipped (result SCIP_DIDNOTRUN)
    4042 * - stating that the primal heuristic was skipped, but should be called again (result SCIP_DELAYED).
    4043 *
    4044 *
    4045 * @section HEUR_ADDITIONALCALLBACKS Additional Callbacks of a Primal Heuristic
    4046 *
    4047 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    4048 * implemented for most applications, they can be used, for example, to initialize and free private data.
    4049 * Additional callbacks can either be passed directly with SCIPincludeHeur() to SCIP or via specific
    4050 * <b>setter functions</b> after a call of SCIPincludeHeurBasic(), see also @ref HEUR_INTERFACE.
    4051 *
    4052 * @subsection HEURFREE
    4053 *
    4054 * If you are using primal heuristic data, you have to implement this function in order to free the primal heuristic data.
    4055 * This can be done by the following procedure:
    4056 *
    4057 * @refsnippet{applications/Coloring/src/heur_init.c,SnippetHeurFreeInit}
    4058 *
    4059 * If you have allocated memory for fields in your primal heuristic data, remember to free this memory
    4060 * before freeing the primal heuristic data itself.
    4061 * If you are using the C++ wrapper class, this function is not available.
    4062 * Instead, just use the destructor of your class to free the member variables of your class.
    4063 *
    4064 * @subsection HEURINIT
    4065 *
    4066 * The HEURINIT callback is executed after the problem is transformed.
    4067 * The primal heuristic may, e.g., use this call to initialize its primal heuristic data.
    4068 *
    4069 * @subsection HEURCOPY
    4070 *
    4071 * The HEURCOPY callback is executed when a SCIP instance is copied, e.g. to
    4072 * solve a sub-SCIP. By
    4073 * defining this callback as
    4074 * <code>NULL</code> the user disables the execution of the specified
    4075 * heuristic for all copied SCIP instances. This may deteriorate the performance
    4076 * of primal heuristics using sub-SCIPs.
    4077 *
    4078 * @subsection HEUREXIT
    4079 *
    4080 * The HEUREXIT callback is executed before the tDIVINGHEURransformed problem is freed.
    4081 * In this function, the primal heuristic should free all resources that have been allocated for the solving process in
    4082 * HEURINIT.
    4083 *
    4084 * @subsection HEURINITSOL
    4085 *
    4086 * The HEURINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    4087 * begin. The primal heuristic may use this call to initialize its branch-and-bound specific data.
    4088 *
    4089 * @subsection HEUREXITSOL
    4090 *
    4091 * The HEUREXITSOL callback is executed before the branch-and-bound process is freed. The primal heuristic should use this
    4092 * call to clean up its branch-and-bound data, which was allocated in HEURINITSOL.
    4093 */
    4094
    4095/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    4096
    4097/**@page IISFINDER How to add IIS finders
    4098 *
    4099 * IIS finders are used to generate an (I)IS ((irreducible) infeasible subsystem) for an infeasible instance.
    4100 * \n
    4101 * A complete list of all iis finders contained in this release can be found \ref IISFINDERS "here".
    4102 *
    4103 * We now explain how users can add their own iis finders.
    4104 * Take the greedy iis finder (src/scip/iisfinder_greedy.c) as an example.
    4105 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjIISfinder wrapper
    4106 * base class and implement the `scip_...()` virtual methods instead of the `SCIP_DECL_IISFINDER...` callbacks.
    4107 *
    4108 * Additional documentation for the callbacks of an iis finder can be found in the file type_iisfinder.h.
    4109 *
    4110 * Here is what you have to do to implement an iis finder:
    4111 * -# Copy the template files `src/scip/iisfinder_xyz.c` and `src/scip/iisfinder_xyz.h` into files named `iisfinder_myiisfinder.c`
    4112 * and `iisfinder_myiisfinder.h`.
    4113 * \n
    4114 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    4115 * If you are adding a new default plugin for SCIP, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    4116 * -# Use `SCIPincludeIIsfinderMyiisfinder()` in order to include the iis finder into your SCIP instance,
    4117 * e.g., in the main file of your project (see, e.g., `src/cmain.c` in the Binpacking example). \n
    4118 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    4119 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myiisfinder".
    4120 * -# Adjust the properties of the iis finder (see \ref IISFINDER_PROPERTIES).
    4121 * -# Define the iis finder data (see \ref IISFINDER_DATA). This is optional.
    4122 * -# Implement the interface functions (see \ref IISFINDER_INTERFACE).
    4123 * -# Implement the fundamental callbacks (see \ref IISFINDER_FUNDAMENTALCALLBACKS).
    4124 * -# Implement the additional callbacks (see \ref IISFINDER_ADDITIONALCALLBACKS). This is optional.
    4125 *
    4126 *
    4127 * @section IISFINDER_PROPERTIES Properties of an IIS finder
    4128 *
    4129 * At the top of the new file `iisfinder_myiisfinder.c` you can find the iis finder properties.
    4130 * These are given as compiler defines.
    4131 * In the C++ wrapper class, you have to provide the iis finder properties by calling the constructor
    4132 * of the abstract base class scip::ObjIISfinder from within your constructor.
    4133 * The properties you have to set have the following meaning:
    4134 *
    4135 * \par IISFINDER_NAME: the name of the iis finder.
    4136 * This name is used in the interactive shell to address the iis finder.
    4137 * Additionally, if you are searching for an iis finder with SCIPfindIISfinder(), this name is looked up.
    4138 * Names have to be unique: no two iis finders may have the same name.
    4139 *
    4140 * \par IISFINDER_DESC: the description of the iis finder.
    4141 * This string is printed as a description of the iis finder in the interactive shell.
    4142 *
    4143 * \par IISFINDER_PRIORITY: the priority of the iis finder.
    4144 * When an IIS is desired, SCIP orders the IIS finders by priority.
    4145 * The iis finders are then called in this order (highest goes first), until depending on the users settings,
    4146 * one succeeds in finding an infeasible subsystem, an irreducible infeasible subsystem is found,
    4147 * all iis finders have been run, or some limit has been hit.
    4148 * \n
    4149 * Note that this property only defines the default value of the priority. The user may change this value arbitrarily by
    4150 * adjusting the corresponding parameter setting. Whenever, even during solving, the priority of an iis finder is
    4151 * changed, then when a call is made to generate an IIS, the iis finders are resorted by the new priorities.
    4152 *
    4153 *
    4154 * @section IISFINDER_DATA IIS Finder Data
    4155 *
    4156 * Below the header "Data structures" you can find a struct which is called `struct SCIP_IISfinderData`.
    4157 * In this data structure, you can store the data of your iis finder. For example, you should store the adjustable
    4158 * parameters of the iis finder in this data structure.
    4159 * If you are using C++, you can add iis finder data as usual as object variables to your class.
    4160 * \n
    4161 * Defining iis finder data is optional. You can leave the struct empty.
    4162 *
    4163 *
    4164 * @section IISFINDER_INTERFACE Interface Functions
    4165 *
    4166 * At the bottom of `iisfinder_myiisfinder.c`, you can find the interface function `SCIPincludeIISfinderMyiisfinder()`,
    4167 * which also appears in `iisfinder_myiisfinder.h`
    4168 * `SCIPincludeIISfinderMyiisfinder()` is called by the users, if they want to include the iis finder, i.e., if they want
    4169 * to use the iis finder in their application.
    4170 *
    4171 * This function only has to be adjusted slightly.
    4172 * It is responsible for notifying SCIP of the presence of the iis finder. For this, you can either call
    4173 * SCIPincludeIISfinder()
    4174 * or SCIPincludeIISfinderBasic(). In the latter variant, \ref IISFINDER_ADDITIONALCALLBACKS "additional callbacks"
    4175 * must be added via setter functions as, e.g., SCIPsetIISfinderCopy(). We recommend this latter variant because
    4176 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    4177 * variant must be manually adjusted with every SCIP release containing new callbacks for iis finders in order to compile.
    4178 *
    4179 *
    4180 * If you are using iis finder data, you have to allocate the memory for the data at this point.
    4181 * You can do this by calling:
    4182 * \code
    4183 * SCIP_CALL( SCIPallocBlockMemory(scip, &iisfinderdata) );
    4184 * \endcode
    4185 * You also have to initialize the fields in struct SCIP_IISfinderData afterwards.
    4186 *
    4187 * You may also add user parameters for your iis finder, see the function SCIPincludeIISfinderGreedy() in
    4188 * src/scip/iisfinder_greedy.c for an example.
    4189 *
    4190 *
    4191 * @section IISFINDER_FUNDAMENTALCALLBACKS Fundamental Callbacks of an IIS Finder
    4192 *
    4193 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    4194 * an operational algorithm.
    4195 * They are passed together with the iis finder itself to SCIP using SCIPincludeIISfinder() or SCIPincludeIISfinderBasic(),
    4196 * see @ref IISFINDER_INTERFACE.
    4197 *
    4198 * IIS finder plugins have a single fundamental callback, namely the IISFINDEREXEC function.
    4199 * This function has to be implemented for every iis funder; the other callbacks are optional.
    4200 * It implements the single contribution every iis finder has to provide: Generating an (I)IS from an infeasible instance.
    4201 * In the C++ wrapper class scip::ObjIISfinder, the scip_exec() method is a virtual abstract member function.
    4202 * You have to implement it in order to be able to construct an object of your iis finder class.
    4203 *
    4204 * @subsection IISFINDEREXEC
    4205 *
    4206 * The IISFINDEREXEC callback should generate an (I)IS from an infeasible instance.
    4207 * The callback receives the IIS object, which contains the infeasible subscip that should be reduced in size,
    4208 * as well as multiple parameters that limit how the IIS finder procedure should be performed.
    4209 * The contained subscip should be transformed such that it remains infeasible and decreases in size,
    4210 * and information about the current state of the subscip, e.g., is it still infeasible, should be recorded.
    4211 *
    4212 * Additional documentation for this callback can be found in type_iisfinder.h.
    4213 *
    4214 * @section IISFINDER_ADDITIONALCALLBACKS Additional Callbacks of an IIS Finder
    4215 *
    4216 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    4217 * implemented for most applications. They can be used, for example, to initialize and free private data.
    4218 * Additional callbacks can either be passed directly with SCIPincludeIISfinder() to SCIP or via specific
    4219 * <b>setter functions</b> after a call of SCIPincludeIISfinderBasic(), see also @ref IISFINDER_INTERFACE.
    4220 *
    4221 * @subsection IISFINDERFREE
    4222 *
    4223 * If you are using iis finder data, you have to implement this function in order to free the iis finder data.
    4224 * This can be done by the following procedure:
    4225 *
    4226 * @refsnippet{src/scip/iisfinder_greedy.c,SnippetIISfinderFreeGreedy}
    4227 *
    4228 * If you have allocated memory for fields in your iis finder data, remember to free this memory
    4229 * before freeing the iis finder data itself.
    4230 * If you are using the C++ wrapper class, this function is not available.
    4231 * Instead, just use the destructor of your class to free the member variables of your class.
    4232 *
    4233 * @subsection IISFINDERCOPY
    4234 *
    4235 * The IISFINDERCOPY callback is executed when a SCIP instance is copied, e.g., to solve a sub-SCIP. By defining this
    4236 * callback as `NULL` the user disables the execution of the specified iis finder for all copied SCIP
    4237 * instances
    4238 */
    4239
    4240/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    4241
    4242/**@page EXPRHDLR How to add expression handlers
    4243 *
    4244 * Expression handlers define basic expression types and provide additional functionality to work with expressions,
    4245 * e.g., differentiation, simplification, estimation, hashing, copying, printing, parsing.
    4246 * A complete list of all expression handlers contained in this release can be found \ref EXPRHDLRS "here".
    4247 * In addition to expression handlers, higher level nonlinear structures are handled by nonlinear handlers, see \ref NLHDLR.
    4248 *
    4249 * Here is what you have to do to implement an own expression handler:
    4250 * -# Copy the template files `src/scip/expr_xyz.c` and `src/scip/expr_xyz.h` into files `expr_myfunc.c` and `expr_myfunc.h`, respectively. \n
    4251 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    4252 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    4253 * -# Use `SCIPincludeExprhdlrMyfunc()` in order to include the expression handler into your SCIP instance,
    4254 * e.g., in the main file of your project. \n
    4255 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    4256 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myfunc".
    4257 * -# Adjust the properties of the expression handler (see \ref EXPRHDLR_PROPERTIES).
    4258 * -# Define the expression handler data and expression data (see \ref EXPRHDLR_DATA). This is optional.
    4259 * -# Implement the interface functions (see \ref EXPRHDLR_INTERFACE).
    4260 * -# Implement the fundamental callbacks (see \ref EXPRHDLR_FUNDAMENTALCALLBACKS).
    4261 * -# Implement the additional callbacks (see \ref EXPRHDLR_ADDITIONALCALLBACKS), where necessary.
    4262 *
    4263 * Additional documentation for the callbacks of an expression handler, in particular for the input parameters,
    4264 * can be found in the file \ref type_expr.h.
    4265 *
    4266 * For a complete implementation of an expression handler, take the one for exponential expressions (src/scip/expr_exp.c) as an example.
    4267 *
    4268 * It is very easy to transfer the C explanation to C++; whenever a function should be implemented using the
    4269 * SCIP_DECL_EXPRHDLR... notion, reimplement the corresponding virtual member function of the abstract scip::ObjExprhdlr
    4270 * base class.
    4271 *
    4272 * @section EXPRHDLR_PROPERTIES Properties of an Expression Handler
    4273 *
    4274 * At the top of the new file `expr_myfunc.c`, you can find the expression handler properties.
    4275 * These are given as compiler defines.
    4276 * In the C++ wrapper class, you have to provide the expression handler properties by calling the constructor
    4277 * of the abstract base class scip::ObjExprhdlr from within your constructor.
    4278 * The properties you have to set have the following meaning:
    4279 *
    4280 * \par EXPRHDLR_NAME: the name of the expression handler.
    4281 * This name is used in the interactive shell to address the expression handler.
    4282 * Additionally, if you or a parsing routine is searching for an expression handler with SCIPfindExprhdlr(), this name is looked up.
    4283 * Names have to be unique: no two expression handlers may have the same name.
    4284 *
    4285 * \par EXPRHDLR_DESC: the description of the expression handler.
    4286 * This string is printed as a description of the expression handler in the interactive shell.
    4287 *
    4288 * \par EXPRHDLR_PRECEDENCE: the precedence of the expression handler.
    4289 * Precedence of the expression operation relative to other expressions when printing the expression.
    4290 *
    4291 * @section EXPRHDLR_DATA Expression Handler Data and Expression Data
    4292 *
    4293 * Below the header "Data structures" you can find structs called `struct SCIP_ExprhdlrData` and `struct SCIP_ExprData`.
    4294 * In this first data structure, you can store the data of your expression handler.
    4295 * For example, you should store the adjustable parameters of the expression handler in this data structure.
    4296 * In the second data structure, you can store data that is unique to an expression.
    4297 * For example, the pow expression handler stores the exponent in this data structure.
    4298 * \n
    4299 * Defining expression handler data and expression data is optional. You can leave these structs empty.
    4300 *
    4301 * @section EXPRHDLR_INTERFACE Interface Functions
    4302 *
    4303 * @subsection EXPRHDLR_INCLUDE SCIPincludeExprhdlrMyfunc()
    4304 *
    4305 * At the bottom of `expr_myfunc.c`, you can find the interface function `SCIPincludeExprhdlrMyfunc()`,
    4306 * which also appears in `expr_myfunc.h`.
    4307 * `SCIPincludeExprhdlrMyfunc()` is called by the user, if (s)he wants to include the expression handler,
    4308 * i.e., if (s)he wants to use the expression handler in his/her application.
    4309 *
    4310 * This function is responsible for notifying SCIP of the presence of the expression handler.
    4311 * For this, you must call SCIPincludeExprhdlr() from SCIPincludeExprhdlrMyfunc().
    4312 * The function only expects the properties and fundamental callbacks of the expression handler as arguments.
    4313 * \ref EXPRHDLR_ADDITIONALCALLBACKS "Additional callbacks" must be added via setter functions as, e.g., SCIPexprhdlrSetCopyFreeHdlr().
    4314 *
    4315 * If you are using expression handler data, you have to allocate the memory for the data at this point.
    4316 * You can do this by calling:
    4317 * \code
    4318 * SCIP_CALL( SCIPallocBlockMemory(scip, &exprhdlrdata) );
    4319 * \endcode
    4320 * You also have to initialize the fields in `struct SCIP_ExprhdlrData` afterwards.
    4321 * For freeing the expression handler data, see \ref EXPRFREEHDLR.
    4322 *
    4323 * You may also add user parameters for your expression handler, see \ref PARAM for how to add user parameters.
    4324 *
    4325 * For the logarithm expression handler, the include function is as follows:
    4326 * @refsnippet{src/scip/expr_log.c,SnippetIncludeExprhdlrLog}
    4327 *
    4328 * @subsection EXPRHDLR_CREATEEXPR SCIPcreateExprMyfunc()
    4329 *
    4330 * Another interface function that can be found in `expr_myfunc.c` is `SCIPcreateExprMyfunc()`.
    4331 * This function is called by the user, if (s)he wants to create an expression that is handled by this expression handler.
    4332 * Typically, the creation function takes the operands of the expression (the children) as arguments.
    4333 * `SCIPcreateExprMyfunc()` may further be extended to take parameters of an expression into account.
    4334 * For example, SCIPcreateExprPow() receives the exponent as argument.
    4335 *
    4336 * In the implementation of `SCIPcreateExprMyfunc()`, the expression data shall be allocated and initialized, if the expression has data
    4337 * (like the exponent of pow expressions).
    4338 * Then the expression shall be created by a call to SCIPcreateExpr().
    4339 * This function takes the expression handler, expression data, children, and ownercreate callback as arguments.
    4340 * For freeing the expression data, see \ref EXPRFREEDATA.
    4341 *
    4342 * The `ownercreate` and `ownercreatedata` that are passed to `SCIPcreateExprMyfunc()` need to be passed on to SCIP.
    4343 * The owner of the expression that is created uses these arguments to store additional data in an expression.
    4344 * For most usecases, these arguments will be set to `NULL`.
    4345 * However, if the \ref EXPRPARSE callback is implemented, then `SCIPcreateExprMyfunc()` may need to be called with a non-NULL value
    4346 * for `ownercreate` and `ownercreatedata`.
    4347 * This will be the case if, for example, the constraint handler for nonlinear constraint parses an expression.
    4348 * The constraint handler will then own the expression and needs to store some data in the expression.
    4349 *
    4350 * For the product expression handler, the expression create function is as follows:
    4351 * @refsnippet{src/scip/expr_product.c,SnippetCreateExprProduct}
    4352 *
    4353 *
    4354 * @section EXPRHDLR_FUNDAMENTALCALLBACKS Fundamental Callbacks of an Expression Handler
    4355 *
    4356 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    4357 * an operational algorithm.
    4358 * They are passed to SCIP when the expression handler is created and included in SCIP via SCIPincludeExprhdlr(),
    4359 * see @ref EXPRHDLR_INTERFACE.
    4360 * In the C++ wrapper class scip::ObjExprhdlr, the fundamental callbacks are virtual abstract member functions.
    4361 * You have to implement them in order to be able to construct an object of your expression handler class.
    4362 *
    4363 * Expression handlers have one fundamental callback, @ref EXPREVAL, that needs to be implemented.
    4364 * However, expression handlers with stateful expressions (expressions that have data) need to implement also the
    4365 * @ref EXPRCOPYDATA, @ref EXPRFREEDATA, and @ref EXPRCOMPARE callbacks.
    4366 *
    4367 * Additional documentation for the callbacks, in particular relating to their input parameters,
    4368 * can be found in \ref type_expr.h.
    4369 *
    4370 * @subsection EXPREVAL
    4371 *
    4372 * The expression evaluation callback defines the mathematical operation that the expression handler represents.
    4373 * Its purpose is to evaluate an expression by taking the values of its children (operands) into account.
    4374 *
    4375 * The children of the expression can be retrieved via SCIPexprGetChildren() and SCIPexprGetNChildren().
    4376 * The value (a `SCIP_Real`) for each child can be retrieved via function SCIPexprGetEvalValue().
    4377 * The value of the expression should be stored in the argument `val` that is passed to the callback.
    4378 * For example, the evaluation in the expression handler for sum is doing the following:
    4379 * @refsnippet{src/scip/expr_sum.c,SnippetExprEvalSum}
    4380 *
    4381 * When an expression cannot be evaluated w.r.t. the values of its children, such a domain error must be signaled
    4382 * to SCIP by setting `*val` to `SCIP_INVALID`.
    4383 * SCIP then aborts evaluation. It is thus not necessary to check in the evaluation callback whether any child
    4384 * has value `SCIP_INVALID`.
    4385 * For example, the evaluation in the expression handler for logarithm expressions is doing the following:
    4386 * @refsnippet{src/scip/expr_log.c,SnippetExprEvalLog}
    4387 *
    4388 * The solution (`sol`) that is passed to EXPREVAL can usually be ignored.
    4389 * It is used by the expression handler for variables to retrieve the value of a variable expression.
    4390 *
    4391 *
    4392 * @section EXPRHDLR_ADDITIONALCALLBACKS Additional Callbacks of an Expression Handler
    4393 *
    4394 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    4395 * implemented for most applications; they can be used, for example, to initialize and free private data.
    4396 * Additional callbacks can be passed via specific
    4397 * <b>setter functions</b> after a call of SCIPincludeExprhdlr(), see also @ref EXPRHDLR_INCLUDE.
    4398 *
    4399 * @subsection EXPRCOPYHDLR
    4400 *
    4401 * This function should include the expression handler into a given SCIP instance.
    4402 * It is usually called when a copy of SCIP is generated.
    4403 *
    4404 * By not implementing this callback, the expression handler will not be available in copied SCIP instances.
    4405 * If a nonlinear constraint uses expressions of this type, it will not be possible to copy them.
    4406 * This may deteriorate the performance of primal heuristics using sub-SCIPs.
    4407 *
    4408 * @subsection EXPRFREEHDLR
    4409 *
    4410 * If you are using expression handler data (see \ref EXPRHDLR_DATA and \ref EXPRHDLR_INCLUDE), you have to implement this function
    4411 * in order to free the expression handler data.
    4412 *
    4413 * @subsection EXPRCOPYDATA
    4414 *
    4415 * This function is called when creating copies of an expression within
    4416 * the same or between different SCIP instances. It is given the
    4417 * source expression, whose data shall be copied, and expects that
    4418 * the data for the target expression is returned. This data will then be used
    4419 * to create a new expression.
    4420 *
    4421 * If expressions that are handled by this expression handler have no data,
    4422 * then this callback can be omitted.
    4423 *
    4424 * @subsection EXPRFREEDATA
    4425 *
    4426 * This function is called when freeing an expression that has data.
    4427 * It is given an expression and shall free its expression data.
    4428 * It shall then call `SCIPexprSetData(expr, NULL)`.
    4429 *
    4430 * This callback must be implemented for expressions that have data.
    4431 *
    4432 * @subsection EXPRPRINT
    4433 *
    4434 * This callback is called when an expression is printed.
    4435 * It is called while DFS-iterating over the expression at different stages, that is,
    4436 * when the expression is visited the first time, before each child of the expression is visited,
    4437 * after each child of the expression has been visited, and when the iterator leaves the expression
    4438 * for its parent.
    4439 * At the various stages, the expression may print a string.
    4440 * The given precedence of the parent expression can be used to decide whether parenthesis need to be printed.
    4441 *
    4442 * For example, the pow expression prints `(f(x))^p` where `f(x)` is a print of the child of the pow expression and `p` is the exponent:
    4443 * @refsnippet{src/scip/expr_pow.c,SnippetExprPrintPow}
    4444 *
    4445 * The pow expression handler does not yet take expression precedence into account to decide whether the parenthesis around `f(x)` can be omitted.
    4446 * For the sum expression handler, this has been implemented:
    4447 * @refsnippet{src/scip/expr_sum.c,SnippetExprPrintSum}
    4448 *
    4449 * If this callback is not implemented, the expression is printed as `<hdlrname>(<child1>, <child2>, ...)`.
    4450 *
    4451 * @subsection EXPRPARSE
    4452 *
    4453 * This callback is called when an expression is parsed from a string and an operator with the name of the expression handler is found.
    4454 * The given string points to the beginning of the arguments of the expression, that is, the beginning of "..." in the string `myfunc(...)`.
    4455 * The callback shall interpret "..." and create an expression, probably via `SCIPcreateExprMyfunc()`, and return this created expression
    4456 * and the position of the last character in "..." to SCIP.
    4457 * When creating an expression, the given `ownercreate` and `ownercreatedata` shall be passed on.
    4458 *
    4459 * The string "..." likely contains one or several other expressions that will be the children of the `myfunc` expression.
    4460 * `SCIPparseExpr()` shall be used to parse these expressions.
    4461 *
    4462 * For an expression that takes only one argument and has no parameters, the parsing routine is straightforward.
    4463 * For example:
    4464 * @refsnippet{src/scip/expr_exp.c,SnippetExprParseExp}
    4465 *
    4466 * For an expression that has additional data, the parsing routine is slightly more complex.
    4467 * For the signpower expression, this parses `signpower(<child>,<exponent>)`:
    4468 * @refsnippet{src/scip/expr_pow.c,SnippetExprParseSignpower}
    4469 *
    4470 * If this callback is not implemented, the expression cannot be parsed.
    4471 * For instance, `.cip` files with nonlinear constraints that use this expression cannot be read.
    4472 *
    4473 * @subsection EXPRCURVATURE
    4474 *
    4475 * This callback is called when an expression is checked for convexity or concavity.
    4476 * It is important to note that the callback is given a desired curvature (convex, concave, or both (=linear))
    4477 * and the callback is required to return whether the given expression has the desired curvature.
    4478 * In addition, it can state conditions on the curvature of the children under which the desired curvature
    4479 * can be achieved and it can take bounds on the children into account.
    4480 * SCIPevalExprActivity() and SCIPexprGetActivity() shall be used to evaluate and get bounds on a child expression.
    4481 *
    4482 * The implementation in the absolute-value expression handler serves as an example:
    4483 * @refsnippet{src/scip/expr_abs.c,SnippetExprCurvatureAbs}
    4484 *
    4485 * If this callback is not implemented, the expression is assumed to be indefinite.
    4486 *
    4487 * @subsection EXPRMONOTONICITY
    4488 *
    4489 * This callback is called when an expression is checked for its monotonicity with respect to a given child.
    4490 * It is given the index of the child and shall return whether the expression is monotonically increasing or decreasing with respect to this child,
    4491 * that is, when assuming that all other children are fixed.
    4492 * Bounds on the children can be taken into account.
    4493 * These can be evaluated and obtained via SCIPevalExprActivity() and SCIPexprGetActivity().
    4494 *
    4495 * The implementation in the absolute value expression handler serves as an example:
    4496 * @refsnippet{src/scip/expr_abs.c,SnippetExprMonotonicityAbs}
    4497 *
    4498 * If this callback is not implemented, the expression is assumed to be not monotone in any child.
    4499 *
    4500 * @subsection EXPRINTEGRALITY
    4501 *
    4502 * This callback is called when an expression is checked for integrality, that is,
    4503 * whether the expression evaluates always to an integral value in a feasible solution.
    4504 * An implementation usually uses SCIPexprGetIntegrality() or SCIPexprIsIntegral() to evaluate the integrality of a
    4505 * feasible child expression. The function SCIPexprGetIntegrality() distinguishes the integrality types none, weak, and strong. Weak
    4506 * integrality occurs if one of the variables in the expression is weakly implied integral.
    4507 *
    4508 * For example, a sum expression is returned to be integral if all coefficients and all children are integral:
    4509 * @refsnippet{src/scip/expr_sum.c,SnippetExprIntegralitySum}
    4510 *
    4511 * If this callback is not implemented, the expression is assumed to be not integral.
    4512 *
    4513 * @subsection EXPRHASH
    4514 *
    4515 * This callback is called when a hash value is computed for an expression.
    4516 * The hash is used to quickly identify expressions that may be equal (or better: to identify expressions that cannot be pairwise equal).
    4517 *
    4518 * The hash shall be unique to the expression as likely as positive.
    4519 * To achieve this, the hashing algorithm shall use the expression type, expression data, and hash of children as input.
    4520 * It must also be deterministic in this input.
    4521 *
    4522 * For example, for the sum expression, the coefficients and the hashes of all children are taken into account:
    4523 * @refsnippet{src/scip/expr_sum.c,SnippetExprHashSum}
    4524 *
    4525 * `EXPRHDLR_HASHKEY` is a constant that is unique to the sum expression handler.
    4526 *
    4527 * If this callback is not implemented, a hash is computed from the expression handler name and the hashes of all children.
    4528 *
    4529 * @subsection EXPRCOMPARE
    4530 *
    4531 * This callback is called when two expressions (expr1 and expr2) that are handled by the expression handlers need to be compared.
    4532 * The function shall impose an order on expressions and thus must return
    4533 * - -1 if expr1 < expr2, or
    4534 * - 0 if expr1 = expr2, or
    4535 * - 1 if expr1 > expr2.
    4536 *
    4537 * The callback may use SCIPcompareExpr() to compare children of expr1 and expr2.
    4538 *
    4539 * For example, for pow expressions, the order is given by the order of the children.
    4540 * If the children are equal, then the order of the exponents is used:
    4541 * @refsnippet{src/scip/expr_pow.c,SnippetExprComparePow}
    4542 *
    4543 * If this callback is not implemented, a comparison is done based on the children of expr1 and expr2 only.
    4544 * If the expression is stateful, it must implement this callback.
    4545 *
    4546 * @subsection EXPRBWDIFF
    4547 *
    4548 * This callback is called when the gradient or Hessian of a function that is represented by an expression is computed.
    4549 *
    4550 * The function shall compute the partial derivative of the expression w.r.t. a child with specified childidx.
    4551 * That is, it should return
    4552 * \f[
    4553 * \frac{\partial \text{expr}}{\partial \text{child}_{\text{childidx}}}
    4554 * \f]
    4555 *
    4556 * See also \ref SCIP_EXPR_DIFF "Differentiation functions in scip_expr.h" for more details on automatic differentiation of expressions.
    4557 *
    4558 * For the product expression, backward differentiation is implemented as follows:
    4559 * @refsnippet{src/scip/expr_product.c,SnippetExprBwdiffProduct}
    4560 *
    4561 * If this callback is not implemented, gradients and Hessian of functions that involve this expression cannot be computed.
    4562 * This can be hurtful for performance because linear relaxation routines that rely on gradient evaluation (e.g., nlhdlr_convex) cannot be used.
    4563 *
    4564 * @subsection EXPRFWDIFF
    4565 *
    4566 * This callback is called when the Hessian of a function that is represented by an expression is computed.
    4567 * It may also be used to compute first derivatives.
    4568 *
    4569 * The function shall evaluate the directional derivative of the expression when interpreted as an operator
    4570 * \f$ f(c_1, \ldots, c_n) \f$, where \f$ c_1, \ldots, c_n \f$ are the children.
    4571 * The directional derivative is
    4572 * \f[
    4573 * \sum_{i = 1}^n \frac{\partial f}{\partial c_i} D_u c_i,
    4574 * \f]
    4575 * where \f$ u \f$ is the direction (given to the callback) and \f$ D_u c_i \f$ is the directional derivative of the i-th child,
    4576 * which can be accessed via SCIPexprGetDot().
    4577 * The point at which to compute the derivative is given by SCIPexprGetEvalValue().
    4578 *
    4579 * See also \ref SCIP_EXPR_DIFF "Differentiation functions in scip_expr.h" for more details on automatic differentiation of expressions.
    4580 *
    4581 * For a product, \f$f(x) = c\prod_i x_i\f$, the directional derivative is \f$c\sum_j \prod_{i\neq j} x_i x^{\text{dot}}_j\f$:
    4582 * @refsnippet{src/scip/expr_product.c,SnippetExprFwdiffProduct}
    4583 *
    4584 * If this callback is not implemented, routines (in particular primal heuristics) that rely on solving NLPs cannot be used, as they currently rely on using forward differentiation for gradient computations.
    4585 *
    4586 * @subsection EXPRBWFWDIFF
    4587 *
    4588 * This callback is called when the Hessian of a function that is represented by an expression is computed.
    4589 *
    4590 * The function computes the total derivative, w.r.t. its children, of the partial derivative of expr w.r.t. childidx.
    4591 * Equivalently, it computes the partial derivative w.r.t. childidx of the total derivative.
    4592 *
    4593 * The expression should be interpreted as an operator \f$ f(c_1, \ldots, c_n) \f$, where \f$ c_1, \ldots, c_n \f$ are the children,
    4594 * and the function should return
    4595 * \f[
    4596 * \sum_{i = 1}^n \frac{\partial^2 f}{\partial c_i} \partial c_{\text{childidx}} D_u c_i,
    4597 * \f]
    4598 * where \f$ u \f$ is the direction (given to the callback) and \f$ D_u c_i \f$ is the directional derivative of the i-th child,
    4599 * which can be accessed via SCIPexprGetDot().
    4600 *
    4601 * Thus, if \f$ n = 1 \f$ (i.e., the expression represents a univariate operator), the function should return
    4602 * \f[
    4603 * f^{\prime \prime}(\text{SCIPexprGetEvalValue}(c)) D_u c.
    4604 * \f]
    4605 *
    4606 * See also \ref SCIP_EXPR_DIFF "Differentiation functions in scip_expr.h" for more details on automatic differentiation of expressions.
    4607 *
    4608 * For a product, \f$f(x) = c\prod_i x_i\f$, the directional derivative is
    4609 * \f$c\partial_k \sum_j \prod_{i \neq j} x_i x^{\text{dot}}_j = c\sum_{j \neq k} \prod_{i \neq j, k} x_i x^{\text{dot}}_j\f$:
    4610 * @refsnippet{src/scip/expr_product.c,SnippetExprBwfwdiffProduct}
    4611 *
    4612 * If this callback is not implemented, there is currently no particular performance impact.
    4613 * In a future version, not implementing this callback would mean that Hessians are not available for NLP solvers, in which case they may have to work with approximations.
    4614 *
    4615 * @subsection EXPRINTEVAL
    4616 *
    4617 * This callback is called when bounds on an expression need to be computed.
    4618 * It shall compute an (as tight as possible) overestimate on the range that the expression values take w.r.t. bounds (given as \ref SCIP_INTERVAL) for the children.
    4619 * The latter can be accessed via SCIPexprGetActivity().
    4620 *
    4621 * Often, interval evaluation is implemented analogous to evaluation with numbers.
    4622 * For example, for products:
    4623 * @refsnippet{src/scip/expr_product.c,SnippetExprIntevalProduct}
    4624 *
    4625 * If this callback is not implemented, the performance of domain propagation for nonlinear constraints and other routines that rely on bounds of expressions will be impacted severely.
    4626 *
    4627 * @subsection EXPRESTIMATE
    4628 *
    4629 * While \ref EXPRINTEVAL computes constant under- and overestimators,
    4630 * this callback is called when linear under- or overestimators need to be computed.
    4631 * The estimator shall be as tight as possible at a given point and must be valid w.r.t. given (local) bounds.
    4632 * If the value of the estimator in the reference point is smaller (larger) than a given targetvalue
    4633 * when underestimating (overestimating), then no estimator needs to be computed.
    4634 * Note, that targetvalue can be infinite if any estimator will be accepted.
    4635 *
    4636 * The callback shall also indicate whether the estimator is also valid w.r.t. given global bounds and for which
    4637 * child a reduction in the local bounds (usually by branching) would improve the estimator.
    4638 *
    4639 * For the absolute-value expression, the under- and overestimators are computed as follows:
    4640 * @refsnippet{src/scip/expr_abs.c,SnippetExprEstimateAbs}
    4641 *
    4642 * If this callback is not implemented, updating the linear relaxation for nonlinear constraints that use this expression will not be possible, which has a severe impact on performance.
    4643 *
    4644 * @subsection EXPRINITESTIMATES
    4645 *
    4646 * This callback is similar to \ref EXPRESTIMATE, but is not given a reference point.
    4647 * It can also return several (up to \ref SCIP_EXPR_MAXINITESTIMATES many) estimators.
    4648 * A usecase for this callback is the construction of an initial linear relaxation of nonlinear constraints.
    4649 *
    4650 * For the absolute-value expression, the following initial under- and overestimators are computed:
    4651 * @refsnippet{src/scip/expr_abs.c,SnippetExprInitestimatesAbs}
    4652 *
    4653 * If this callback is not implemented, the initial linear relaxation for nonlinear constraints may be less tight.
    4654 * This can have a minor effect on performance, as long as \ref EXPRESTIMATE has been implemented and the linear relaxation
    4655 * is still bounded (e.g., when all nonlinear variables have finite bounds).
    4656 *
    4657 * @subsection EXPRSIMPLIFY
    4658 *
    4659 * This callback shall try to simplify an expression by applying algebraic transformations.
    4660 * It shall return the simplified (and equivalent) expression.
    4661 * It can assume that children have been simplified.
    4662 * If no simplification is possible, then it can return the original expression, but needs to capture it.
    4663 * When creating a new expression, it shall pass on the given ownerdata creation callback and its data.
    4664 *
    4665 * A simplification that should be implemented by every expression handler at the moment is constant-folding, i.e.,
    4666 * returning a value-expression if every child is a value expression.
    4667 * For an example, the simplification for the exponentiation expression is implemented as
    4668 * @refsnippet{src/scip/expr_exp.c,SnippetExprSimplifyExp}
    4669 *
    4670 * See also SCIPsimplifyExpr() for more information on implemented simplification rules.
    4671 *
    4672 * If this callback is not implemented, reducing the problem size when variables are fixed may not be possible, which can have an impact on performance.
    4673 * (Also bugs may show up as this situation is untested.)
    4674 *
    4675 * @subsection EXPRREVERSEPROP
    4676 *
    4677 * This callback is called when given bounds on an expression shall be propagated over the children of an expression.
    4678 * Already existing bounds on the children (see \ref EXPRINTEVAL) shall be used.
    4679 * That is, the function shall compute an interval overestimate on
    4680 * \f[
    4681 * \{ x_i : f(c_1,\ldots,c_{i-1},x_i,c_{i+1},\ldots,c_n) \in \text{bounds} \}
    4682 * \f]
    4683 * for each child \f$i\f$, given bounds on f and initial intervals \f$c_i, i=1,\ldots,n,\f$, for the children.
    4684 *
    4685 * For univariate expressions, the implementation can be rather straightforward, e.g., for absolute value:
    4686 * @refsnippet{src/scip/expr_abs.c,SnippetExprReversepropAbs}
    4687 *
    4688 * For multivariate expressions, it can be more complicated, e.g., for products:
    4689 * @refsnippet{src/scip/expr_product.c,SnippetExprReversepropProduct}
    4690 *
    4691 * If this callback is not implemented, the performance of domain propagation for nonlinear constraints will be impacted severely.
    4692 */
    4693
    4694/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    4695
    4696/**@page NLHDLR How to add nonlinear handlers
    4697 *
    4698 * Nonlinear handlers define the extended formulations of nonlinear constraints and provide domain propagation and separation routines on this extended formulation.
    4699 * In difference to \ref EXPRHDLR "expression handlers", they do not define a function, but instead identify a
    4700 * structure in an existing expression and provide bound tightening and separation on this structure similar to \ref EXPRINTEVAL, \ref EXPRREVERSEPROP, \ref EXPRINITESTIMATES, and \ref EXPRESTIMATE.
    4701 * The structure typically consists of a composition of expressions.
    4702 *
    4703 * Nonlinear handlers are a new plugin type in SCIP and may still have some rough edges.
    4704 * They resemble constraint handlers in some sense, but are specific to the handling of nonlinear constraints.
    4705 * We suggest to read section "New Handler for Nonlinear Constraints" in the SCIP 8.0 release report (2021)
    4706 * to understand the role and use of nonlinear handlers before attempting to implement one.
    4707 *
    4708 * A complete list of all nonlinear handlers contained in this release can be found \ref NLHDLRS "here".
    4709 * In difference to many other plugins in SCIP, nonlinear handlers are not handled by the SCIP core but by the constraint handler for nonlinear constraints.
    4710 *
    4711 * Here is what you have to do to implement a nonlinear handler:
    4712 * -# Copy the template files `src/scip/nlhdlr_xyz.c` and `src/scip/nlhdlr_xyz.h` into files `nlhdlr_mystruct.c` and `nlhdlr_mystruct.h`, respectively. \n
    4713 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    4714 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    4715 * -# Use `SCIPincludeNlhdlrMystruct()` in order to include the nonlinear handler into your SCIP instance, e.g., in the main file of your project. \n
    4716 If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    4717 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mystruct".
    4718 * -# Adjust the properties of the nonlinear handler (see \ref NLHDLR_PROPERTIES).
    4719 * -# Define the nonlinear handler data and nonlinear handler expression data (see \ref NLHDLR_DATA). This is optional.
    4720 * -# Implement the interface functions (see \ref NLHDLR_INTERFACE).
    4721 * -# Implement the fundamental callbacks (see \ref NLHDLR_FUNDAMENTALCALLBACKS).
    4722 * -# Implement the additional callbacks (see \ref NLHDLR_ADDITIONALCALLBACKS), where necessary.
    4723 *
    4724 * Additional documentation for the callbacks of a nonlinear handler, in particular for the input parameters,
    4725 * can be found in the file \ref type_nlhdlr.h.
    4726 *
    4727 * @section NLHDLR_PROPERTIES Properties of a Nonlinear Handler
    4728 *
    4729 * At the top of the new file `nlhdlr_mystruct.c`, you can find the nonlinear handler properties.
    4730 * These are given as compiler defines.
    4731 * The properties you have to set have the following meaning:
    4732 *
    4733 * \par NLHDLR_NAME: the name of the nonlinear handler.
    4734 * This name is used in the interactive shell to address the nonlinear handler.
    4735 * Additionally, if you are searching for a nonlinear handler with SCIPfindNlhdlrNonlinear(), this name is looked up.
    4736 * Names have to be unique: no two nonlinear handlers may have the same name.
    4737 *
    4738 * \par NLHDLR_DESC: the description of the nonlinear handler.
    4739 * This string is printed as a description of the nonlinear handler in the interactive shell.
    4740 *
    4741 * \par NLHDLR_DETECTPRIORITY: the priority of the nonlinear handler when detecting structure.
    4742 * This priority decides when the \ref NLHDLRDETECT callback of the nonlinear handler is called, relative to other nonlinear handlers, on an expression.
    4743 * Typically, the priority should be strictly positive.
    4744 * This is because the nonlinear handler "default" (having detection priority 0) will not become active on expressions that are already handled by other nonlinear handlers.
    4745 *
    4746 * \par NLHDLR_ENFOPRIORITY: the priority of the nonlinear handler when enforcing constraints in the extended formulations.
    4747 * This priority decides when the callbacks that help on domain propagation and separation are called for an expression for which the nonlinear handler detected a structure.
    4748 * A high priority means that the nonlinear handler will be called before others.
    4749 * The nonlinear handler "default" has enforcement priority 0.
    4750 *
    4751 * @section NLHDLR_DATA Nonlinear Handler Data and Nonlinear Handler Expression Data
    4752 *
    4753 * Below the header "Data structures" you can find structs called `struct SCIP_NlhdlrData` and `struct SCIP_NlhdlrExprData`.
    4754 * In this first data structure, you can store the data of your nonlinear handler.
    4755 * For example, you should store the adjustable parameters of the nonlinear handler in this data structure.
    4756 * In the second data structure, you can store data that is unique to an expression for which the nonlinear handler detected a structure.
    4757 * For example, the nonlinear handler for quotients stores a representation of a detected quotient in this data structure.
    4758 * \n
    4759 * Defining nonlinear handler data and nonlinear handler expression data is optional. You can leave these structs empty.
    4760 *
    4761 * @section NLHDLR_INTERFACE Interface Functions
    4762 *
    4763 * At the bottom of `nlhdlr_mystruct.c`, you can find the interface function `SCIPincludeNlhdlrXyz()`,
    4764 * which also appears in `nlhdlr_mystruct.h`.
    4765 * `SCIPincludeNlhdlrXyz()` is called by the user, if (s)he wants to include the nonlinear handler,
    4766 * i.e., if (s)he wants to use the nonlinear handler in his/her application.
    4767 *
    4768 * This function is responsible for notifying SCIP of the presence of the nonlinear handler.
    4769 * For this, you must call SCIPincludeNlhdlrNonlinear() from SCIPincludeNlhdlrMystruct().
    4770 * The function only expects the properties and fundamental callbacks of the nonlinear handler as arguments.
    4771 * \ref NLHDLR_ADDITIONALCALLBACKS "Additional callbacks" must be added via setter functions as, e.g., SCIPnlhdlrSetCopyHdlr().
    4772 *
    4773 * If you are using nonlinear handler data, you have to allocate the memory for the data at this point and initialize it.
    4774 * For freeing the nonlinear handler data, see \ref NLHDLRFREEHDLRDATA.
    4775 * You may also add user parameters or statistic tables for your nonlinear handler, see \ref PARAM for how to add user parameters.
    4776 *
    4777 * For the bilinear nonlinear handler, the include function is as follows:
    4778 * @refsnippet{src/scip/nlhdlr_bilinear.c,SnippetIncludeNlhdlrBilinear}
    4779 *
    4780 *
    4781 * @section NLHDLR_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Nonlinear Handler
    4782 *
    4783 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    4784 * an operational algorithm.
    4785 * They are passed to SCIP when the nonlinear handler is created and included in SCIP via SCIPincludeNlhdlrNonlinear(),
    4786 * see @ref NLHDLR_INTERFACE.
    4787 *
    4788 * Nonlinear handlers have two fundamental callbacks that need to be implemented.
    4789 * Additional documentation for the callbacks, in particular to their input parameters,
    4790 * can be found in \ref type_nlhdlr.h.
    4791 *
    4792 * @subsection NLHDLRDETECT
    4793 *
    4794 * This callback is called by the handler for nonlinear constraints when extended formulations are constructed.
    4795 * The result of this callback determines the extended formulation.
    4796 *
    4797 * The nonlinear handler shall analyze the given expression (`expr`) and decide whether it wants to contribute
    4798 * in enforcing the relation between bounds or an auxiliary variable (`auxvar`) associated with this expression and
    4799 * its descendants (e.g., children) via linear under- or overestimation, cut generation, and/or activity computation and propagation.
    4800 * For linear under- or overestimation and cut generation, an auxiliary variable can be assumed to
    4801 * be associated with the expression and auxiliary variables may be requested for descendant expressions.
    4802 *
    4803 * We distinguish the following enforcement methods:
    4804 * - \ref SCIP_NLHDLR_METHOD_SEPABELOW : linear underestimation of `expr` or cut generation for the relation `expr` &le; `auxvar` (denoted as "below")
    4805 * - \ref SCIP_NLHDLR_METHOD_SEPAABOVE : linear overestimation of `expr` or cut generation for the relation `expr` &ge; `auxvar` (denoted as "above")
    4806 * - \ref SCIP_NLHDLR_METHOD_ACTIVITY : domain propagation (i.e., constant under/overestimation) for `expr`.
    4807 *
    4808 * On input, parameter `enforcing` indicates for any of these methods, whether
    4809 * - it is not necessary to have such a method, e.g., because no `auxvar` will exist for `expr`, or no one uses or sets activities of this expression,
    4810 * or because analysis of the expression has shown that a relation like `expr` &ge; `auxvar` is not necessary to be satisfied,
    4811 * - or there already exists a nonlinear handler that will provide this method in an "enforcement" sense, that is,
    4812 * it believes that no one else could provide this method in a stronger sense. (This is mainly used by the nonlinear handler "default" to check whether
    4813 * it should still reach out to the expression handler or whether it would be dominated by some nonlinear handler.)
    4814 *
    4815 * The DETECT callback shall augment the `enforcing` bitmask by setting the enforcement methods it wants to provide in an "enforcement" sense.
    4816 *
    4817 * Additionally, the `participating` bitmask shall be set if the nonlinear handler wants to be called on this expression at all.
    4818 * Here, it shall set all methods that it wants to provide, which are those set in `enforcing`, but additionally those where it wants
    4819 * to participate but leave enforcement to another nonlinear handler.
    4820 * This can be useful for nonlinear handlers that do not implement a complete enforcement, e.g., a handler that only contributes
    4821 * cutting planes in some situations only.
    4822 *
    4823 * A nonlinear handler will be called only for those callbacks that it mentioned in `participating`, which is
    4824 * - \ref NLHDLRENFO and/or \ref NLHDLRESTIMATE will be called with `overestimate==FALSE` if \ref SCIP_NLHDLR_METHOD_SEPABELOW has been set
    4825 * - \ref NLHDLRENFO and/or \ref NLHDLRESTIMATE will be called with `overestimate==TRUE` if \ref SCIP_NLHDLR_METHOD_SEPAABOVE has been set
    4826 * - \ref NLHDLRINTEVAL and/or \ref NLHDLRREVERSEPROP will be called if \ref SCIP_NLHDLR_METHOD_ACTIVITY has been set
    4827 *
    4828 * If \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE has been set, then at least one of the
    4829 * callbacks \ref NLHDLRENFO and \ref NLHDLRESTIMATE needs to be implemented.
    4830 * Also \ref NLHDLREVALAUX will be called in this case.
    4831 * If \ref SCIP_NLHDLR_METHOD_ACTIVITY has been set, then at least one of \ref NLHDLRINTEVAL and \ref NLHDLRREVERSEPROP needs to be implemented.
    4832 * If the nonlinear handler chooses not to participate, then it must not set `nlhdlrexprdata` and can leave `participating` at its
    4833 * initial value (\ref SCIP_NLHDLR_METHOD_NONE).
    4834 *
    4835 * Additionally, a nonlinear handler that decides to participate in any of the enforcement methods must call
    4836 * @ref SCIPregisterExprUsageNonlinear() for every subexpression that it will use and indicate whether
    4837 * - it will use an auxiliary variable in \ref NLHDLRENFO or \ref NLHDLRESTIMATE,
    4838 * - it will use activity for some subexpressions when computing estimators or cuts, and
    4839 * - it will use activity for some subexpressions when in \ref NLHDLRINTEVAL or \ref NLHDLRREVERSEPROP.
    4840 *
    4841 * Note that auxiliary variables do not exist in subexpressions during DETECT and are not created by a call to @ref SCIPregisterExprUsageNonlinear().
    4842 * They will be available when the \ref NLHDLRINITSEPA callback is called.
    4843 *
    4844 * For an example, see the implementation of the DETECT callback for the nonlinear handler for quotients (src/scip/nlhdlr_quotient.c).
    4845 *
    4846 * @subsection NLHDLREVALAUX
    4847 *
    4848 * This callback is called by the constraint handler for nonlinear constraints when the violation of constraints in the extended formulation
    4849 * (`expr` &le;/&ge; `auxvar`) needs to be evaluated.
    4850 * During constraint enforcement, this violation value is used to decide whether estimation and separation callbacks should be called.
    4851 *
    4852 * The function shall evaluate the expression w.r.t. the auxiliary variables that were introduced by the nonlinear handler (if any).
    4853 * It can be assumed that the expression itself has been evaluated in the given sol.
    4854 *
    4855 * For an example, see the evaluation for the quotient nonlinear handler:
    4856 * @refsnippet{src/scip/nlhdlr_quotient.c,SnippetNlhdlrEvalauxQuotient}
    4857*
    4858 * @section NLHDLR_ADDITIONALCALLBACKS Additional Callbacks of a Nonlinear Handler
    4859 *
    4860 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    4861 * implemented for most applications, they can be used, for example, to initialize and free private data.
    4862 * Additional callbacks can be passed via specific
    4863 * <b>setter functions</b> after a call of SCIPincludeNlhdlrNonlinear(), see also @ref NLHDLR_INTERFACE.
    4864 *
    4865 * @subsection NLHDLRCOPYHDLR
    4866 *
    4867 * This callback is called when doing a copy of the constraint handler for nonlinear constraints.
    4868 * It shall include the nonlinear handler into the copy of the constraint handler.
    4869 *
    4870 * @subsection NLHDLRFREEHDLRDATA
    4871 *
    4872 * If you are using nonlinear handler data (see \ref NLHDLR_DATA and \ref NLHDLR_INTERFACE), you have to implement this function
    4873 * in order to free the nonlinear handler data.
    4874 *
    4875 * @subsection NLHDLRFREEEXPRDATA
    4876 *
    4877 * If you are using nonlinear handler expression data (see \ref NLHDLR_DATA and \ref NLHDLRDETECT), you have to implement this function
    4878 * in order to free the nonlinear handler expression data.
    4879 * This function is called when an extended formulation is freed.
    4880 *
    4881 * @subsection NLHDLRINIT
    4882 *
    4883 * This callback is called when the constraint handler for nonlinear constraints is initialized, that is, after the problem was transformed.
    4884 * The nonlinear handler can use this callback to initialize or reset some data for the upcoming solve.
    4885 *
    4886 * @subsection NLHDLREXIT
    4887 *
    4888 * This callback is called when the constraint handler for nonlinear constraints is deinitialized, that is, before the transformed problem is freed.
    4889 * The nonlinear handler can use this callback to free some data that was used for the previous solve only.
    4890 *
    4891 * @subsection NLHDLRINTEVAL
    4892 *
    4893 * This callback is called when bounds on a given expression shall be computed.
    4894 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_ACTIVITY in \ref NLHDLRDETECT.
    4895 * The function is given the currently available bounds to the expression and can return possibly tighter bounds.
    4896 *
    4897 * For a univariate quotient ((ax+b)/(cx+d)), the interval evaluation is implemented as follows:
    4898 * @refsnippet{src/scip/nlhdlr_quotient.c,SnippetNlhdlrIntevalQuotient}
    4899 *
    4900 * @subsection NLHDLRREVERSEPROP
    4901 *
    4902 * This callback is called when bounds on a given expression shall be propagated to its successors.
    4903 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_ACTIVITY in \ref NLHDLRDETECT.
    4904 * The tighter intervals should be passed to the corresponding expression via SCIPtightenExprIntervalNonlinear().
    4905 *
    4906 * For a univariate quotient ((ax+b)/(cx+d)), reverse propagation is implemented as follows:
    4907 * @refsnippet{src/scip/nlhdlr_quotient.c,SnippetNlhdlrReversepropQuotient}
    4908 *
    4909 * @subsection NLHDLRINITSEPA
    4910 *
    4911 * This callback is called when the constraint handler for nonlinear constraints initializes the LP relaxation (@ref CONSINITLP).
    4912 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE in \ref NLHDLRDETECT.
    4913 * The function shall initialize the separation data of the nonlinear handler, if any, and add initial cuts to the LP relaxation.
    4914 * It can assume that auxiliary variables are available for expressions for which auxiliary variables were requested via SCIPregisterExprUsageNonlinear() in \ref NLHDLRDETECT.
    4915 *
    4916 * @subsection NLHDLREXITSEPA
    4917 *
    4918 * This callback is called when the solving process is finished and the branch and bound process data is freed (@ref CONSEXITSOL).
    4919 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE in \ref NLHDLRDETECT and \ref NLHDLRINITSEPA was called.
    4920 * The function shall deinitialize the separation data of the nonlinear handler, if any.
    4921 *
    4922 * @subsection NLHDLRENFO
    4923 *
    4924 * This callback is called when the constraint handler requires that the relation between the given expression and its auxiliary variable
    4925 * (`expr` &le; `auxvar` or `expr` &ge; `auxvar`) is violated by a given solution and this solution needs to be separated.
    4926 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE in \ref NLHDLRDETECT.
    4927 *
    4928 * The nonlinear handler can enforce `expr` &le;/&ge; `auxvar` by
    4929 * - separation, i.e., finding an affine hyperplane (a cut) that separates the given point, or
    4930 * - bound tightening, i.e., changing bounds on a variable so that the given point is outside the updated domain, or
    4931 * - adding branching scores to potentially split the current problem into two subproblems.
    4932 *
    4933 * If parameter `inenforcement` is FALSE, then only the first option (separation) is allowed.
    4934 *
    4935 * If the nonlinear handler always separates by computing a linear under- or overestimator of `expr`,
    4936 * then it is usually easier to implement the \ref NLHDLRESTIMATE callback instead.
    4937 *
    4938 * Note, that the nonlinear handler may also choose to separate for a relaxation of the mentioned sets,
    4939 * e.g., `expr` &le; upperbound(`auxvar`) or `expr` &ge; lowerbound(`auxvar`).
    4940 * This is especially useful in situations where `expr` is the root expression of a constraint
    4941 * and it is sufficient to satisfy `lhs` &le; `expr` &le; `rhs`.
    4942 * The constraint handler ensures that `lhs` &le; lowerbound(`auxvar`) and upperbound(`auxvar`) &le; `rhs`.
    4943 *
    4944 * The constraint handler may call this callback first with `allowweakcuts` = FALSE and repeat later with
    4945 * `allowweakcuts` = TRUE, if it didn't succeed to enforce a solution without using weak cuts.
    4946 * If in enforcement and the nonlinear handler cannot enforce by separation or bound tightening, it should register
    4947 * branching scores for those expressions where branching may help to compute tighter cuts in children.
    4948 *
    4949 * The nonlinear handler must set `result` to \ref SCIP_SEPARATED if it added a cut,
    4950 * to \ref SCIP_REDUCEDDOM if it added a bound change, and
    4951 * to \ref SCIP_BRANCHED if it added branching scores.
    4952 * Otherwise, it may set result to \ref SCIP_DIDNOTRUN or \ref SCIP_DIDNOTFIND.
    4953 *
    4954 * @subsection NLHDLRESTIMATE
    4955 *
    4956 * This callback is called when the constraint handler requires that the relaxation between the given expression and its auxiliary variable
    4957 * (`expr` &le; `auxvar` or `expr` &ge; `auxvar`) is violated by a given solution and this solution needs to be separated.
    4958 * It is called for expressions for which the nonlinear handler registered to participate in \ref SCIP_NLHDLR_METHOD_SEPABELOW or \ref SCIP_NLHDLR_METHOD_SEPAABOVE in \ref NLHDLRDETECT.
    4959 * This function is a simpler alternative to \ref NLHDLRENFO and is called if \ref NLHDLRENFO is not implemented or does not succeed.
    4960 *
    4961 * The function shall compute one or several linear under- or overestimator of `expr` that are as tight as possible at a given point.
    4962 * If the value of the estimator in the solution is smaller (larger) than a given targetvalue
    4963 * when underestimating (overestimating), then no estimator needs to be computed.
    4964 * Note, that targetvalue can be infinite if any estimator will be accepted.
    4965 * If successful, it shall store the estimators in the given `rowpreps` data structure and set the
    4966 * `rowprep->local` flag accordingly (SCIProwprepSetLocal()).
    4967 * The sidetype of a rowprep must be set to \ref SCIP_SIDETYPE_LEFT if overestimating and
    4968 * \ref SCIP_SIDETYPE_RIGHT if underestimating.
    4969 *
    4970 * The callback may also be required to indicate for which expression a reduction in the local bounds (usually by branching) would improve the estimator.
    4971 * This is done by a call to SCIPaddExprsViolScoreNonlinear().
    4972 *
    4973 * For the quotient nonlinear handler, the estimators are computed as follows:
    4974 * @refsnippet{src/scip/nlhdlr_quotient.c,SnippetNlhdlrEstimateQuotient}
    4975 *
    4976 * @subsection NLHDLRSOLLINEARIZE
    4977 *
    4978 * This callback is called by the constraint handler when it has caught a solution event from SCIP and option constraints/nonlinear/linearizeheursol has been enabled.
    4979 * The constraint handler then calls the nonlinear handlers for all expressions they currently handle.
    4980 * The nonlinear handler may use this opportunity to add a cut that supports its nonlinear function in the given solution to the cutpool.
    4981 * For convex functions, this may help to accellerate proving optimality for a solution found by a NLP solver.
    4982 */
    4983
    4984/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    4985
    4986/**@page DIVINGHEUR How to implement a diving heuristic
    4987 *
    4988 * Diving heuristics are an important addon to the branch-and-cut search. A diving heuristic explores a single probing
    4989 * path down the search tree. In contrast to the regular search guided by branching rule(s) and the selected
    4990 * node selector, the diving is performed in an auxiliary tree originating from the focus node of the main
    4991 * search tree where the heuristic was called. The advantage of this approach is that many different scoring mechanisms
    4992 * can be safely tried as diving heuristic and may probably lead to better solutions. SCIP has a lot of diving heuristics
    4993 * included in its default plugin set.
    4994 * \n
    4995 *
    4996 * Since SCIP version 3.2, the diving heuristics have been redesigned to contain mainly the scoring function used by the
    4997 * heuristic. In order to implement a user-defined diving heuristic, it is possible to create one (or several)
    4998 * divesets that control the scoring mechanism and add them to the primal heuristic. This has the advantage that
    4999 * less code is necessary to create a working diving heuristic. The SCIP statistics now also display some interesting statistics
    5000 * about every diveset together in the section 'Diving Statistics'.
    5001 * \n
    5002 *
    5003 * This page contains the necessary steps to understand and include a diveset into ones primal diving heuristic plugin. As
    5004 * a prerequisite, you should understand the basic implementation steps for a primal heuristic, see \ref HEUR.
    5005 * In order to make use of divesets, they must be included _after_ the primal heuristic to which they should belong
    5006 * has been included, by using SCIPincludeDiveset(). This will create the data structure for the diveset and
    5007 * append it to the list of divesets belonging to the heuristic, which can be retrieved later together with their number
    5008 * by using SCIPheurGetDivesets() and SCIPheurGetNDivesets(), respectively. No further memory allocation or deletion is needed;
    5009 * As a member of the heuristic, SCIP automatically takes care of freeing the diveset when it is exiting.
    5010 * \n
    5011 *
    5012 * Before the inclusion, one may think of adjusting the various properties that a diveset offers to control
    5013 * the behavior of the algorithm. These are subject to the following section.
    5014 * \n
    5015 *
    5016 * It is mandatory to implement the fundamental scoring callback of the diveset, which is explained in more detail
    5017 * in Section \ref DIVING_FUNDAMENTALCALLBACKS.
    5018 * \n
    5019 *
    5020 * Once the properties have been carefully adjusted and the scoring
    5021 * has been defined, use the function SCIPperformGenericDivingAlgorithm() inside the execution callback (\ref HEUREXEC) of the primal
    5022 * heuristic to which the diveset belongs, after checking possible preliminaries that may not be met at all times of the search.
    5023 * \n
    5024 *
    5025 * For a code example, we refer to \ref heur_guideddiving.h, which guides the diving into the direction of the current incumbent solution.
    5026 * Before it calls SCIPperformGenericDivingAlgorithm(), it checks whether an incumbent is available, and returns if there is none.
    5027 *
    5028 *
    5029 * @section DIVING_PARAMETERS User parameters and properties for every diveset
    5030 *
    5031 * Every diveset controls the diving behavior through a set of user-defined parameters, which are explained in the following:
    5032 *
    5033 * \par MINRELDEPTH
    5034 * the minimal relative depth (to the maximum depth explored during regular search) of the current focus node to start diving
    5035 *
    5036 * \par MAXRELDEPTH
    5037 * the maximal relative depth (to the maximum depth explored during regular search) of the current focus node to start diving
    5038 *
    5039 * \par MAXLPITERQUOT
    5040 * maximal fraction of diving LP iterations compared to node LP iterations that this dive controller may consume
    5041 *
    5042 * \par MAXLPITEROFS
    5043 * an additional number of allowed LP iterations
    5044 *
    5045 * \par MAXDIVEUBQUOT
    5046 * maximal quotient (curlowerbound - lowerbound)/(cutoffbound - lowerbound)
    5047 * where diving is performed (0.0: no limit)
    5048 *
    5049 * \par MAXDIVEAVGQUOT
    5050 * maximal quotient (curlowerbound - lowerbound)/(avglowerbound - lowerbound)
    5051 * where diving is performed (0.0: no limit)
    5052 *
    5053 * \par MAXDIVEUBQUOTNOSOL
    5054 * maximal UBQUOT when no solution was found yet (0.0: no limit)
    5055 *
    5056 * \par MAXDIVEAVGQUOTNOSOL
    5057 * maximal AVGQUOT when no solution was found yet (0.0: no limit)
    5058 *
    5059 * \par BACKTRACK
    5060 * use one level of backtracking if infeasibility is encountered?
    5061 *
    5062 * \par LPRESOLVEDOMCHGQUOT
    5063 * parameter to control LP resolve dynamically based on this percentage of observed bound changes relative to all variables or
    5064 * the LP branching candidates (integer variables with fractional solution values) from the last node where an LP has been solved.
    5065 * This property has no effect when the LPSOLVEFREQ is set to 1.
    5066 *
    5067 * \par LPSOLVEFREQ
    5068 * LP solve frequency for diveset, use a positive integer k to solve an LP at every k'th depth of the diving search (ie. 1 causes the
    5069 * diveset to solve _all_ intermediate LPs) or 0 to only resolve the LP relaxation after propagation found at least a certain percentage
    5070 * domain changes, see also the previous LPRESOLVEDOMCHGQUOT parameter.
    5071 *
    5072 * \par ONLYLPBRANCHCANDS
    5073 * Set this property to TRUE if only LP branching candidates be considered for the execution of the diving algorithm instead of the slower but
    5074 * more general constraint handler diving variable selection.
    5075 *
    5076 * \par DIVETYPES
    5077 * bit mask that represents all supported dive types. Irrelevant if only LP branching candidates should be scored, otherwise, different
    5078 * constraint handlers may ask the diveset if it supports their preferred divetype. See \ref type_heur.h for a list of
    5079 * available dive types.
    5080 *
    5081 * @section DIVING_FUNDAMENTALCALLBACKS Fundamental callbacks of a diveset
    5082 *
    5083 * Only one callback is necessary to complete a diveset to guide the diving search performed:
    5084 *
    5085 * @subsection DIVESETGETSCORE
    5086 *
    5087 * The scoring callback expects a candidate variable and calculates a score value and a preferred direction. The selected
    5088 * variable for diving will be one that _maximizes_ the score function provided by the diveset.
    5089 * If the diveset should support more than one possible type of diving, it may use the divetype argument as a hint how
    5090 * the caller of the score function (could be the diving algorithm itself or one of the constraint handlers that
    5091 * implement diving variable selection) intends to perform the search.
    5092 *
    5093 * @section DIVING_FURTHERINFO Further information
    5094 *
    5095 * This is all there is to extend the SCIP set of diving heuristics by a new one. For further information, please see
    5096 * diveset related functions in \ref type_heur.h, \ref pub_heur.h, \ref heuristics.h, and \ref heur_guideddiving.h or
    5097 * other diving heuristics that implement diving through a diveset.
    5098 */
    5099
    5100/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    5101
    5102/**@page RELAX How to add relaxation handlers
    5103 *
    5104 * SCIP provides specific support for LP relaxations of constraint integer programs. In addition, relaxation handlers,
    5105 * also called relaxators, can be used to include other relaxations, e.g. Lagrange relaxations or semidefinite
    5106 * relaxations. The relaxation handler manages the necessary data structures and calls the relaxation solver to generate dual
    5107 * bounds and primal solution candidates.
    5108 * \n
    5109 * However, the data to define a single relaxation must either be extracted by the relaxation handler itself (e.g., from
    5110 * the user defined problem data, the LP information, or the integrality conditions), or it must be provided by the constraint
    5111 * handlers. In the latter case, the constraint handlers have to be extended to support this specific relaxation.
    5112 * \n
    5113 *
    5114 * We now explain how users can add their own relaxation handlers using the C interface. As an example, look into the NLP
    5115 * relaxation handler of the \ref RELAXATOR_MAIN "Relaxator example" (examples/Relaxator/src/relax_nlp.c). It is very easy to
    5116 * transfer the C explanation to C++: whenever a function should be implemented using the SCIP_DECL_RELAX... notion,
    5117 * reimplement the corresponding virtual member method of the abstract scip::ObjRelax wrapper base class.
    5118 *
    5119 * Additional documentation for the callbacks of a relaxation handler can be found in the file type_relax.h.
    5120 *
    5121 * Here is what you have to do to implement a relaxation handler:
    5122 * -# Copy the template files src/scip/relax_xyz.c and src/scip/relax_xyz.h into files named "relax_myrelaxator.c"
    5123 * and "relax_myrelaxator.h".
    5124 * \n
    5125 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    5126 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    5127 * -# Use `SCIPincludeRelaxMyrelaxator()` in order to include the relaxation handler into your SCIP instance,
    5128 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    5129 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    5130 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myrelaxator".
    5131 * -# Adjust the properties of the relaxation handler (see \ref RELAX_PROPERTIES).
    5132 * -# Define the relaxation handler data (see \ref RELAX_DATA). This is optional.
    5133 * -# Implement the interface functions (see \ref RELAX_INTERFACE).
    5134 * -# Implement the fundamental callbacks (see \ref RELAX_FUNDAMENTALCALLBACKS).
    5135 * -# Implement the additional callbacks (see \ref RELAX_ADDITIONALCALLBACKS). This is optional.
    5136 *
    5137 *
    5138 * @section RELAX_PROPERTIES Properties of a Relaxation Handler
    5139 *
    5140 * At the top of the new file "relax_myrelaxator.c" you can find the relaxation handler properties,
    5141 * which are given as compiler defines.
    5142 * In the C++ wrapper class, you have to provide the relaxation handler properties by calling the constructor
    5143 * of the abstract base class scip::ObjRelax from within your constructor.
    5144 * The properties have the following meaning:
    5145 *
    5146 * \par RELAX_NAME: the name of the relaxation handler.
    5147 * This name is used in the interactive shell to address the relaxation handler.
    5148 * Additionally, if you are searching for a relaxation handler with SCIPfindRelax(), this name is looked up.
    5149 * Names have to be unique: no two relaxation handlers may have the same name.
    5150 *
    5151 * \par RELAX_DESC: the description of the relaxation handler.
    5152 * This string is printed as a description of the relaxation handler in the interactive shell.
    5153 *
    5154 * \par RELAX_PRIORITY: the priority of the relaxation handler.
    5155 * During each relaxation solving round, the included relaxation handlers and the
    5156 * price-and-cut loop for solving the LP relaxation are called in a predefined order, which is given by the priorities
    5157 * of the relaxation handlers.
    5158 * First, the relaxation handlers with non-negative priority are called in the order of decreasing priority.
    5159 * Next, the price-and-cut loop for solving the LP relaxation is executed.
    5160 * Finally, the relaxation handlers with negative priority are called in the order of decreasing priority.
    5161 * \n
    5162 * Usually, you will have only one relaxation handler in your application and thus only have to decide whether it should
    5163 * be called before or after solving the LP relaxation. For this decision you should consider the complexity of
    5164 * the relaxation solving algorithm and the impact of the resulting solution: if your relaxation handler provides a fast
    5165 * algorithm that usually has a high impact (i.e. the relaxation is a good approximation of the
    5166 * feasible region of the subproblem and the solution severely improves the dual bound), it should have a non-negative
    5167 * priority.
    5168 * \n
    5169 * Note that for certain applications, it is useful to disable the LP relaxation and only use your custom relaxation.
    5170 * This can easily be achieved by setting the "lp/solvefreq" parameter to -1.
    5171 *
    5172 * \par RELAX_FREQ: the default frequency for solving the relaxation.
    5173 * The frequency defines the depth levels at which the relaxation solving function \ref RELAXEXEC is called.
    5174 * For example, a frequency of 7 means, that the relaxation solving callback is executed for subproblems that are in depth
    5175 * 0, 7, 14, ... of the branching tree. A frequency of 0 means that the callback is only executed at the root node, i.e.,
    5176 * only the relaxation of the root problem is solved. A frequency of -1 disables the relaxation handler.
    5177 *
    5178 *
    5179 *
    5180 * @section RELAX_DATA Relaxation Handler Data
    5181 *
    5182 * Below the header "Data structures" you can find a struct which is called "struct SCIP_RelaxData".
    5183 * In this data structure, you can store the data of your relaxation handler. For example, you should store the adjustable
    5184 * parameters of the relaxation handler in this data structure.
    5185 * If you are using C++, you can add relaxation handler data as usual as object variables to your class.
    5186 * \n
    5187 * Defining relaxation handler data is optional. You can leave the struct empty.
    5188 *
    5189 *
    5190 * @section RELAX_INTERFACE Interface Functions
    5191 *
    5192 * At the bottom of "relax_myrelaxator.c", you can find the interface function SCIPincludeRelaxMyrelaxator(),
    5193 * which also appears in "relax_myrelaxator.h".
    5194 * SCIPincludeRelaxMyrelaxator() is called by the user, if (s)he wants to include the relaxation handler,
    5195 * i.e., if (s)he wants to use the relaxation handler in his/her application.
    5196 *
    5197 * This function only has to be adjusted slightly.
    5198 * It is responsible for notifying SCIP of the presence of the relaxation handler. For this, you can either call
    5199 * SCIPincludeRelax(),
    5200 * or SCIPincludeRelaxBasic() since SCIP version 3.0. In the latter variant, \ref RELAX_ADDITIONALCALLBACKS "additional callbacks"
    5201 * must be added via setter functions as, e.g., SCIPsetRelaxCopy(). We recommend this latter variant because
    5202 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    5203 * variant must be manually adjusted with every SCIP release containing new callbacks for relaxation handlers in order to compile.
    5204 *
    5205 * If you are using relaxation handler data, you have to allocate the memory for the data at this point.
    5206 * You can do this by calling:
    5207 * \code
    5208 * SCIP_CALL( SCIPallocBlockMemory(scip, &relaxdata) );
    5209 * \endcode
    5210 * You also have to initialize the fields in struct SCIP_RelaxData afterwards.
    5211 *
    5212 * You may also add user parameters for your relaxation handler, see the function SCIPincludeConshdlrKnapsack() in
    5213 * the \ref cons_knapsack.h "knapsack constraint handler" for an example of how to add user parameters.
    5214 *
    5215 *
    5216 * @section RELAX_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Relaxation Handler
    5217 *
    5218 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    5219 * an operational algorithm.
    5220 * They are passed together with the relaxation handler itself to SCIP using SCIPincludeRelax() or SCIPincludeRelaxBasic(),
    5221 * see @ref RELAX_INTERFACE.
    5222 *
    5223 *
    5224 * Relaxation handler plugins have only one fundamental callback, namely the \ref RELAXEXEC function.
    5225 * This function has to be implemented for every relaxation handler; the other callbacks are optional.
    5226 * In the C++ wrapper class scip::ObjRelax, the scip_exec() method (which corresponds to the \ref RELAXEXEC callback) is a virtual
    5227 * abstract member function.
    5228 * You have to implement it in order to be able to construct an object of your relaxation handler class.
    5229 *
    5230 * Additional documentation for the callbacks can be found in type_relax.h.
    5231 *
    5232 * @subsection RELAXEXEC
    5233 * The RELAXEXEC is called in each relaxation solving round. It should solve the current
    5234 * subproblem's relaxation.
    5235 *
    5236 * Note that, like the LP relaxation, the relaxation handler should only operate on variables for which the corresponding
    5237 * column exists in the transformed problem. Typical functions called by a relaxation handler are SCIPconstructLP() and SCIPflushLP() to
    5238 * make sure that the LP of the current node is constructed and its data can be accessed via calls to SCIPgetLPRowsData()
    5239 * and SCIPgetLPColsData(), and SCIPseparateSol() to call the cutting plane separators for a given primal solution.
    5240 *
    5241 * The lowerbound computed by the relaxation should be returned in the lowerbound pointer. If the relaxation improves on the best
    5242 * relaxation already computed (either <code>SCIPisRelaxSolValid()</code> returns FALSE, meaning that no relaxation solution
    5243 * is available so far, or the lowerbound is larger than the value returned by <code>SCIPgetRelaxSolObj()</code>), then the primal
    5244 * solution of the relaxation should be stored inside the data structures of SCIP with <code>SCIPsetRelaxSolVal()</code>,
    5245 * <code>SCIPsetRelaxSolVals()</code> or <code>SCIPsetRelaxSolValsSol()</code>. If you set the values one by one, you will need to call
    5246 * <code>SCIPmarkRelaxSolValid()</code> to inform SCIP that the solution is complete and valid. With the "includeslp" argument of
    5247 * <code>SCIPsetRelaxSolVals()</code>, <code>SCIPsetRelaxSolValsSol()</code> and <code>SCIPmarkRelaxSolValid()</code> you need to tell SCIP
    5248 * whether the relaxation included all lp rows. In this case, the solution will be enforced and, if feasible, added to the solution storage if the
    5249 * lowerbound of this relaxator is larger than the LP's. You may also call SCIPtrySolFree() directly from the
    5250 * relaxation handler to make sure that a solution is added to the solution storage if it is feasible, even if the relaxator does not
    5251 * include the LP or another relaxator produced a stronger bound. Also note that when setting the values of the relaxation solution one by one,
    5252 * the objective value of the relaxation solution will be updated incrementally. If the whole solution should be updated, using SCIPsetRelaxSolVals()
    5253 * instead or calling SCIPclearRelaxSolVals() before setting the first value to reset the solution and the objective value to 0 may help the numerics.
    5254 * Furthermore, there is a list of external branching candidates, that can be filled by relaxation handlers and constraint handlers,
    5255 * allowing branching rules to take these candidates as a guide on how to split the problem into subproblems. If the relaxation
    5256 * solution is enforced, the integrality constraint handler will add external branching candidates for the relaxation solution
    5257 * automatically, but the relaxation handler can also directly call <code>SCIPaddExternBranchCand()</code>.
    5258 *
    5259 * Usually, the RELAXEXEC callback only solves the relaxation and provides a lower (dual) bound through the corresponding pointer and
    5260 * possibly a solution through <code>SCIPsetRelaxSolVal()</code> calls.
    5261 * However, it may also produce domain reductions, add additional constraints or generate cutting planes. It has the
    5262 * following options:
    5263 * - detecting that the node is infeasible in the variable's bounds and can be cut off (result SCIP_CUTOFF)
    5264 * - adding an additional constraint and stating that the relaxation handler should not be called again on the same
    5265 * relaxation (result SCIP_CONSADDED)
    5266 * - reducing a variable's domain and stating that the relaxation handler should not be called again on the same
    5267 * relaxation (result SCIP_REDUCEDDOM)
    5268 * - adding a cutting plane to the LP and stating that the relaxation handler should not be called again on the same
    5269 * relaxation (result SCIP_SEPARATED)
    5270 * - stating that the relaxation handler solved the relaxation and should not be called again on the same relaxation
    5271 * (result SCIP_SUCCESS)
    5272 * - interrupting the solving process to wait for additional input, e.g., cutting planes (result SCIP_SUSPENDED)
    5273 * - stating that the separator was skipped (result SCIP_DIDNOTRUN).
    5274 *
    5275 * In the above criteria, "the same relaxation" means that the LP relaxation stayed unmodified. This means in particular
    5276 * that no row has been added and no bounds have been modified. For example, changing the bounds of a variable will, as
    5277 * long as it was a COLUMN variable, lead to a modification in the LP such that the relaxation handler is called again
    5278 * after it returned with the result code SCIP_REDUCEDDOM. If the relaxation solution should be enforced, the relaxation
    5279 * handler has to produce a new solution in this case which satisfies the updated LP. If a relaxation handler should only run
    5280 * once per node to compute a lower bound, it should store the node of the last relaxation call itself and return
    5281 * SCIP_DIDNOTRUN for subsequent calls in the same node.
    5282 *
    5283 *
    5284 * @section RELAX_ADDITIONALCALLBACKS Additional Callbacks of a Relaxation Handler
    5285 *
    5286 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    5287 * implemented for most applications, they can be used, for example, to initialize and free private data.
    5288 * Additional callbacks can either be passed directly with SCIPincludeRelax() to SCIP or via specific
    5289 * <b>setter functions</b> after a call of SCIPincludeRelaxBasic(), see also @ref RELAX_INTERFACE.
    5290 *
    5291 * @subsection RELAXFREE
    5292 *
    5293 * If you are using relaxation handler data, you have to implement this function in order to free the relaxation handler
    5294 * data. This can be done by the following procedure:
    5295 *
    5296 * @refsnippet{tests/src/relax/relax.c,SnippetRelaxFreeUnittest}
    5297 *
    5298 * If you have allocated memory for fields in your relaxation handler data, remember to free this memory
    5299 * before freeing the relaxation handler data itself.
    5300 * If you are using the C++ wrapper class, this function is not available.
    5301 * Instead, just use the destructor of your class to free the member variables of your class.
    5302 *
    5303 * @subsection RELAXINIT
    5304 *
    5305 * The RELAXINIT callback is executed after the problem is transformed.
    5306 * The relaxation handler may, e.g., use this call to initialize its relaxation handler data.
    5307 *
    5308 * @subsection RELAXCOPY
    5309 *
    5310 * The RELAXCOPY callback is executed when a SCIP instance is copied, e.g. to
    5311 * solve a sub-SCIP. By
    5312 * defining this callback as
    5313 * <code>NULL</code> the user disables the execution of the specified
    5314 * relaxation handler for all copied SCIP instances. This may deteriorate the performance
    5315 * of primal heuristics using sub-SCIPs.
    5316 *
    5317 * @subsection RELAXEXIT
    5318 *
    5319 * The RELAXEXIT callback is executed before the transformed problem is freed.
    5320 * In this function, the relaxation handler should free all resources that have been allocated for the solving process in
    5321 * RELAXINIT.
    5322 *
    5323 * @subsection RELAXINITSOL
    5324 *
    5325 * The RELAXINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    5326 * begin. The relaxation handler may use this call to initialize its branch-and-bound specific data.
    5327 *
    5328 * @subsection REALXEXITSOL
    5329 *
    5330 * The RELAXEXITSOL callback is executed before the branch-and-bound process is freed.
    5331 * The relaxation handler should use this call to clean up its branch-and-bound data.
    5332 */
    5333
    5334/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    5335
    5336/**@page READER How to add file readers
    5337 *
    5338 * Mainly, file readers are called to parse an input file and generate a constraint integer programming model. They
    5339 * create constraints and variables and activate variable pricers if necessary. However, they can also be called, for
    5340 * example, to parse an input file containing information about a primal solution or fixing of variables. Besides that
    5341 * it is possible to use some of them for writing (exporting) the problem in a specific format. \n A complete list of
    5342 * all file readers contained in this release can be found \ref FILEREADERS "here".
    5343 *
    5344 * Since a file reader is also responsible for writing a file, the user may
    5345 * ask why the readers have not the name "filehandler". This name would
    5346 * represent this plugin much better than the used one.
    5347 * \n
    5348 * The used name "readers" is historically grown. In the beginning of SCIP
    5349 * there was no need to write/export problems. Therefore, the the plugin
    5350 * name "readers" was best fitting for this plugin since only reading was essential.
    5351 * It turned out, however, that it is quite nice to write/export certain subproblem during
    5352 * the solving process mainly for debugging. Therefore, a writing callback
    5353 * was added to the "readers" plugin.
    5354 *
    5355 * We now explain how users can add their own file readers.
    5356 * Take the file reader for MIPs in IBM's Mathematical Programming System format (src/scip/reader_mps.c) as an example.
    5357 * As all other default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjReader wrapper
    5358 * base class and implement the scip_...() virtual methods instead of the SCIP_DECL_READER... callbacks.
    5359 *
    5360 * Additional documentation for the callbacks of a file reader can be found in the file type_reader.h.
    5361 *
    5362 * Here is what you have to do to implement a file reader named "myreader" in C:
    5363 * -# Copy the template files src/scip/reader_xyz.c and src/scip/reader_xyz.h into files named
    5364 * "reader_myreader.c" and "reader_myreader.h".
    5365 * \n
    5366 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    5367 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    5368 * -# Use `SCIPincludeReaderMyreader()` in order to include the reader into your SCIP instance,
    5369 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    5370 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    5371 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "myreader".
    5372 * -# Adjust the \ref READER_PROPERTIES "properties of the file reader".
    5373 * -# Define the \ref READER_DATA "file reader data". This is optional.
    5374 * -# Implement the \ref READER_INTERFACE "interface functions".
    5375 * -# Implement the \ref READER_FUNDAMENTALCALLBACKS "fundamental callbacks".
    5376 * -# Implement the \ref READER_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    5377 *
    5378 *
    5379 * @section READER_PROPERTIES Properties of a File Reader
    5380 *
    5381 * At the top of the new file "reader_myreader.c" you can find the file reader properties.
    5382 * These are given as compiler defines.
    5383 * In the C++ wrapper class, you have to provide the file reader properties by calling the constructor
    5384 * of the abstract base class scip::ObjReader from within your constructor.
    5385 * The properties you have to set have the following meaning:
    5386 *
    5387 * \par READER_NAME: the name of the file reader.
    5388 * This name is used in the interactive shell to address the file reader.
    5389 * Additionally, if you are searching for a file reader with SCIPfindReader(), this name is looked up.
    5390 * Names have to be unique: no two file readers may have the same name.
    5391 *
    5392 * \par READER_DESC: the description of the file reader.
    5393 * This string is printed as a description of the file reader in the interactive shell.
    5394 *
    5395 * \par READER_EXTENSION: the file name extension of the file reader.
    5396 * Each file reader is hooked to a single file name extension. It is automatically called if the user wants to read in a
    5397 * file of corresponding name. The extensions of the different file readers have to be unique.
    5398 * Note that the additional extension '.gz', '.z', or '.Z' (indicating a gzip compressed file) are ignored for assigning
    5399 * an input file to a reader.
    5400 * \n
    5401 * It is not possible to hook up a (single) file reader with more than one file extension.
    5402 * It is, however, not necessary to implement the same (parsing/writing) functions more than once, if you want to
    5403 * support several file extension with the same parser. To do so look at the files reader_lp.c
    5404 * and reader_rlp.c. Both support the LP format.
    5405 *
    5406 *
    5407 * @section READER_DATA File Reader Data
    5408 *
    5409 * Below the header "Data structures" you can find a struct which is called "struct SCIP_ReaderData".
    5410 * In this data structure, you can store the data of your file reader. For example, you should store the adjustable
    5411 * parameters of the file reader in this data structure.
    5412 * If you are using C++, you can add file reader data as usual as object variables to your class.
    5413 * \n
    5414 * Defining file reader data is optional. You can leave the struct empty.
    5415 *
    5416 *
    5417 * @section READER_INTERFACE Interface Functions
    5418 *
    5419 * At the bottom of "reader_myreader.c", you can find the interface function SCIPincludeReaderMyreader(),
    5420 * which also appears in "reader_myreader.h".
    5421 * SCIPincludeReaderMyreader() is called by the user, if (s)he wants to include the reader,
    5422 * i.e., if (s)he wants to use the reader in his/her application.
    5423 *
    5424 * This function only has to be adjusted slightly.
    5425 * It is responsible for notifying SCIP of the presence of the reader. For this, you can either call
    5426 * SCIPincludeReader(),
    5427 * or SCIPincludeReaderBasic() since SCIP version 3.0. In the latter variant, \ref READER_ADDITIONALCALLBACKS "additional callbacks"
    5428 * must be added via setter functions as, e.g., SCIPsetReaderCopy(). We recommend this latter variant because
    5429 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    5430 * variant must be manually adjusted with every SCIP release containing new callbacks for readers in order to compile.
    5431 *
    5432 * If you are using file reader data, you have to allocate the memory for the data at this point.
    5433 * You can do this by calling:
    5434 * \code
    5435 * SCIP_CALL( SCIPallocBlockMemory(scip, &readerdata) );
    5436 * \endcode
    5437 * You also have to initialize the fields in struct SCIP_ReaderData afterwards.
    5438 *
    5439 * You may also add user parameters for your file reader, see the function SCIPincludeReaderLp() in
    5440 * src/scip/reader_lp.c for an example.
    5441 *
    5442 *
    5443 * @section READER_FUNDAMENTALCALLBACKS Fundamental Callbacks of a File Reader
    5444 *
    5445 * File reader plugins have no fundamental callbacks. This is due to
    5446 * the fact that a file reader can be used for reading and/or writing a
    5447 * file. A file reader is only useful if the reader function \ref READERREAD
    5448 * and/or the writing function \ref READERWRITE is implemented. One of these
    5449 * functions should be implemented for every file reader; the other callback
    5450 * functions \ref READERCOPY and \ref READERFREE are optional. In the C++ wrapper class scip::ObjReader, the
    5451 * scip_read() and scip_write() methods (which corresponds to the \ref
    5452 * READERREAD and \ref READERWRITE callback) are virtual member
    5453 * functions. At least one of them should be implemented.
    5454 *
    5455 * Additional documentation for the callbacks can be found in type_reader.h.
    5456 *
    5457 *
    5458 * @section READER_ADDITIONALCALLBACKS Additional Callbacks of a File Reader
    5459 *
    5460 * Additional callbacks can either be passed directly with SCIPincludeReader() to SCIP or via specific
    5461 * <b>setter functions</b> after a call of SCIPincludeReaderBasic(), see also @ref READER_INTERFACE.
    5462 *
    5463 *
    5464 * File reader plugins contain only additional callbacks, namely the functions \ref READERREAD,
    5465 * \ref READERWRITE, \ref READERFREE, and \ref READERCOPY. Therefore, these are not needed to be implemented. However,
    5466 * at least \ref READERREAD and/or \ref READERWRITE should be implemented (see notes
    5467 * \ref READER_FUNDAMENTALCALLBACKS "above").
    5468 *
    5469 *
    5470 * @subsection READERREAD
    5471 *
    5472 * The READERREAD callback is called when the user invokes SCIP to read in a file with file name extension
    5473 * corresponding to the READER_EXTENSION property of the file reader. This is usually triggered by a call to the function
    5474 * SCIPreadProb() or by an interactive shell command.
    5475 * The READERREAD callback should parse the input file and perform the desired action, which usually means
    5476 * generating a constraint integer programming model, adding a primal solution, fixing variables
    5477 * in an existing model.
    5478 * \n
    5479 * Typical functions called by a file reader that is used to read/generate constraint
    5480 * integer programming models are, for example,
    5481 *
    5482 * - creating an empty problem: SCIPcreateProb()
    5483 * - creating the variables: SCIPcreateVar(), SCIPchgVarType(), SCIPchgVarLb(), SCIPchgVarUb(), SCIPaddVar(), and
    5484 * SCIPreleaseVar()
    5485 * - modifying the objective function: SCIPchgVarObj() and SCIPsetObjsense().
    5486 * - creating the constraints: SCIPcreateConsLinear(), SCIPaddCoefLinear(), SCIPchgLhsLinear(), SCIPchgRhsLinear(),
    5487 * SCIPaddCons(), and SCIPreleaseCons()
    5488 *
    5489 * Primal solutions can only be created for the transformed problem. Therefore, the user has to call SCIPtransformProb()
    5490 * before (s)he reads in the file containing the solution and adds it to the solution pool via the function SCIPreadSol().
    5491 *
    5492 *
    5493 * @subsection READERWRITE
    5494 *
    5495 * The READERWRITE callback is called when the user invokes SCIP to write a problem (original or transformed)
    5496 * in the format the reader supports. This is only possible if this callback is implemented. To write the problem
    5497 * all necessary information is given through the parameters of this callback (see type_reader.h). This
    5498 * information should be used to output the problem in the requested format. This callback is usually
    5499 * triggered by the call of the functions SCIPwriteOrigProblem(), SCIPwriteTransProblem(), SCIPprintOrigProblem(),
    5500 * or SCIPprintTransProblem().
    5501 * \n
    5502 * A typical function called by a file reader which is used to write/export a constraint
    5503 * integer programming model is SCIPinfoMessage(). This function outputs a given string into a file
    5504 * or into stdout.
    5505 * \n
    5506 * For an example we refer to the writing function of the MPS reader (see reader_mps.c).
    5507 *
    5508 *
    5509 * @subsection READERCOPY
    5510 *
    5511 * The READERCOPY callback is executed when a SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this
    5512 * callback as <code>NULL</code> the user disables the execution of the specified reader for all copied SCIP
    5513 * instances. The question might arise why to copy that plugin. In case of debugging it is nice to be able to
    5514 * write/display the copied instances. Since the reader is in charge of that, you might want to copy the plugin. Below
    5515 * you see a standard implementation.
    5516 *
    5517 * @refsnippet{src/scip/reader_mps.c,SnippetReaderCopyMps}
    5518 *
    5519 * @subsection READERFREE
    5520 *
    5521 * If you are using file reader data, you have to implement this function in order to free the file reader data.
    5522 * This can be done by the following procedure:
    5523 *
    5524 * @refsnippet{src/scip/reader_mps.c,SnippetReaderFreeMps}
    5525 *
    5526 * If you have allocated memory for fields in your file reader data, remember to free this memory
    5527 * before freeing the file reader data itself.
    5528 * If you are using the C++ wrapper class, this function is not available.
    5529 * Instead, just use the destructor of your class to free the member variables of your class.
    5530 *
    5531 */
    5532
    5533/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    5534
    5535/**@page DIALOG How to add dialogs
    5536 *
    5537 * SCIP comes with a command line shell which allows the user to read in problem instances, modify the solver's
    5538 * parameters, initiate the optimization and display certain statistics and solution information. This shell consists
    5539 * of dialogs, which are organized as a tree in SCIP. A node of this tree which is not a leaf represents a menu in
    5540 * the shell and the children of this node correspond to the entries of this menu (which can again be menus). All
    5541 * different dialogs are managed by a dialog handler, which, in particular, is responsible for executing the dialog
    5542 * corresponding to the user's command in the shell. The concept of a dialog handler is different to that
    5543 * of a constraint handler, which is used to manage objects of the same structure, see \ref CONS. In particular, SCIP
    5544 * features only one dialog handler (dialog_default.h), whereas there may exist different constraint handlers.
    5545 * \n
    5546 * A complete list of all dialogs contained in this release can be found \ref DIALOGS "here".
    5547 *
    5548 * We now explain how users can extend the interactive shell by adding their own dialog.
    5549 * We give the explanation for creating your own source file for each additional dialog. Of course, you can collect
    5550 * different dialogs in one source file. Take src/scip/dialog_default.c, where all default dialog plugins are collected, as an
    5551 * example.
    5552 * As all other default plugins, the default dialog plugin and the template dialog are written in C. C++ users can easily
    5553 * adapt the code by using the scip::ObjDialog wrapper base class and implement the scip_...() virtual methods instead of the
    5554 * SCIP_DECL_DIALOG... callbacks.
    5555 *
    5556 * Additional documentation for the callbacks of a dialog can be found in the file type_dialog.h.
    5557 *
    5558 * Here is what you have to do to add a dialog (assuming your dialog is named "mydialog"):
    5559 * -# Copy the template files src/scip/dialog_xyz.c and src/scip/dialog_xyz.h into files named "dialog_mydialog.c"
    5560 * and "dialog_mydialog.h".
    5561 * \n
    5562 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    5563 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    5564 * -# Use `SCIPincludeDialogMydialog()` in order to include the dialog handler into your SCIP instance,
    5565 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    5566 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    5567 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mydialog".
    5568 * -# Adjust the \ref DIALOG_PROPERTIES "properties of the dialog".
    5569 * -# Define the \ref DIALOG_DATA "dialog data". This is optional.
    5570 * -# Implement the \ref DIALOG_INTERFACE "interface functions".
    5571 * -# Implement the \ref DIALOG_FUNDAMENTALCALLBACKS "fundamental callbacks".
    5572 * -# Implement the \ref DIALOG_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    5573 *
    5574 *
    5575 * @section DIALOG_PROPERTIES Properties of a Dialog
    5576 *
    5577 * At the top of the new file "dialog_mydialog.c" you can find the dialog properties.
    5578 * These are given as compiler defines.
    5579 * In the C++ wrapper class, you have to provide the dialog properties by calling the constructor
    5580 * of the abstract base class scip::ObjDialog from within your constructor.
    5581 * The properties you have to set have the following meaning:
    5582 *
    5583 * \par DIALOG_NAME: the name of the dialog.
    5584 * In the interactive shell, this name appears as the command name of the dialog in the parent dialog.
    5585 * Additionally, if you are searching an entry in a menu with SCIPdialogFindEntry(), this name is looked up.
    5586 * Names within one menu have to be unique: no two dialogs in the same menu may have the same name.
    5587 *
    5588 * \par DIALOG_DESC: the description of the dialog.
    5589 * This string is printed as a description of the dialog in the interactive shell if the additional
    5590 * callback \ref DIALOGDESC is not implemented.
    5591 *
    5592 * \par DIALOG_ISSUBMENU: whether the dialog is a (sub)menu.
    5593 * This parameter states whether the dialog is a menu in the interactive shell, i.e., is the parent of further
    5594 * dialogs.
    5595 *
    5596 *
    5597 * @section DIALOG_DATA Dialog Data
    5598 *
    5599 * Below the header "Data structures" you can find a struct which is called "struct SCIP_DialogData".
    5600 * In this data structure, you can store the data of your dialog.
    5601 * If you are using C++, you can add dialog data as usual as object variables to your class.
    5602 * \n
    5603 * Defining dialog data is optional. You can leave the struct empty.
    5604 *
    5605 *
    5606 * @section DIALOG_INTERFACE Interface Functions
    5607 *
    5608 * At the bottom of "dialog_mydialog.c" you can find the interface function SCIPincludeDialogMydialog(), which also appears
    5609 * in "dialog_mydialog.h".
    5610 * \n
    5611 * This function only has to be adjusted slightly.
    5612 * It is responsible for notifying SCIP of the presence of the dialog, which can be done by the following lines of code:
    5613 *
    5614 * @refsnippet{src/scip/dialog_xyz.c,SnippetDialogAddXyz}
    5615 *
    5616 * Here "parentdialog" has to be an existing dialog which is defined to be a menu (see DIALOG_ISSUBMENU), e.g.,
    5617 * the default root dialog. The function SCIPgetRootDialog() returns the root dialog.
    5618 *
    5619 * The interface function is called by the user, if (s)he wants to include the dialog, i.e., if (s)he wants to use the dialog in
    5620 * his/her application.
    5621 * Note that in order to be able to link the new dialog to an existing default dialog
    5622 * (except the root dialog) it has to be included <b>after the
    5623 * default dialogs plugin</b>, i.e., the SCIPincludeDialogMydialog() call has to occur after the
    5624 * SCIPincludeDialogDefault() call. The SCIPincludeDialogDefault() function is called from within the SCIPincludeDefaultPlugins()
    5625 * function. Therefore, it suffices to include your dialog plugins after you have called SCIPincludeDefaultPlugins().
    5626 * In case you want to add a dialog to the <b>root dialog</b>, you just use the following
    5627 * lines of code to get/create the root dialog.
    5628 *
    5629 * @refsnippet{tests/src/misc/snippets.c,SnippetDialogCreate}
    5630 *
    5631 * Therefore, in this case you do not have to worry about the calls of
    5632 * SCIPincludeDialogDefault() and SCIPincludeDefaultPlugins() .
    5633 *
    5634 * If you are using dialog data, you have to allocate the memory for the data at this point.
    5635 * You can do this by calling:
    5636 * \code
    5637 * SCIP_CALL( SCIPallocBlockMemory(scip, &dialogdata) );
    5638 * \endcode
    5639 * You also have to initialize the fields in struct SCIP_DialogData afterwards.
    5640 *
    5641 * Consider the following example. The user wants to add a "drawgraph" command to the root menu of SCIP.
    5642 * (S)he copies the "dialog_xyz.c" and "dialog_xyz.h" files into files "dialog_drawgraph.c" and "dialog_drawgraph.h", respectively.
    5643 * Then, (s)he puts the following code into the SCIPincludeDialogDrawgraph() function, compare SCIPincludeDialogDefault() in
    5644 * src/scip/dialog_default.c:
    5645 * @refsnippet{tests/src/misc/snippets.c,SnippetDialogInclude}
    5646 *
    5647 * Using this code, it is even possible to call SCIPincludeDialogDrawgraph() before including the default dialog plugins,
    5648 * and you can also call it multiple times without causing inconsistencies in the dialog structure.
    5649 *
    5650 *
    5651 * @section DIALOG_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Dialog
    5652 *
    5653 * Dialogs have only one fundamental callback, namely the \ref DIALOGEXEC function.
    5654 * This function has to be implemented for every dialog; the other callbacks are optional.
    5655 * In the C++ wrapper class scip::ObjDialog, the scip_exec() method (which corresponds to the \ref DIALOGEXEC callback) is a virtual
    5656 * abstract member function.
    5657 * You have to implement it in order to be able to construct an object of your dialog class.
    5658 *
    5659 * Additional documentation for the callbacks can be found in type_dialog.h.
    5660 *
    5661 * @subsection DIALOGEXEC
    5662 *
    5663 * The DIALOGEXEC function is invoked, if the user selected the dialog's command name in the parent's menu. It should
    5664 * execute what is stated in DIALOG_DESC, e.g., the display constraint handlers dialog should display information about
    5665 * the constraint handlers included in SCIP, see src/scip/dialog_default.c.
    5666 *
    5667 * For typical functions called by the execution function, have a look at src/scip/dialog_default.c.
    5668 *
    5669 * The callback has to return which dialog should be processed next. This can be, for example, the root dialog
    5670 * (SCIPdialoghdlrGetRoot()), the parent dialog (SCIPdialogGetParent()) or NULL, which stands for closing the interactive
    5671 * shell.
    5672 *
    5673 *
    5674 * @section DIALOG_ADDITIONALCALLBACKS Additional Callbacks of a Dialog
    5675 *
    5676 * The additional callbacks do not need to be implemented in every case.
    5677 * They can be used, for example, to free private data.
    5678 *
    5679 * @subsection DIALOGFREE
    5680 *
    5681 * If you are using dialog data, you have to implement this function in order to free the dialog data.
    5682 * This can be done by the following procedure:
    5683 * @refsnippet{tests/src/misc/snippets.c,SnippetDialogFree}
    5684 *
    5685 * If you have allocated memory for fields in your dialog data, remember to free this memory
    5686 * before freeing the dialog data itself.
    5687 * If you are using the C++ wrapper class, this function is not available.
    5688 * Instead, just use the destructor of your class to free the member variables of your class.
    5689 *
    5690 * @subsection DIALOGDESC
    5691 *
    5692 * This function is called when the help menu of the parent is displayed. It should output (usually a single line of)
    5693 * information describing the meaning of the dialog.
    5694 * \n
    5695 * If this callback is not implemented, the description string of the dialog (DIALOG_DESC) is displayed instead.
    5696 *
    5697 * @subsection DIALOGCOPY
    5698 *
    5699 * The DIALOGCOPY callback is executed when a SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this
    5700 * callback as <code>NULL</code> the user disables the execution of this dialog for all copied SCIP instances. In
    5701 * general there is no need to copy any dialog since it is most unlikely to start the interactive shell of the copied
    5702 * instances.
    5703 *
    5704 */
    5705
    5706/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    5707
    5708/**@page DISP How to add display columns
    5709 *
    5710 * While solving a constraint integer program, SCIP displays status information in a column-like fashion. The current
    5711 * number of processed branching tree nodes, the solving time, and the relative gap between primal and dual bound are
    5712 * examples of such display columns. There already exists a wide variety of display columns which can be activated or
    5713 * deactivated on demand, see src/scip/disp_default.c. Additionally, the user can implement his/her own display columns
    5714 * in order to track problem or algorithm specific values.
    5715 * \n
    5716 * A complete list of all displays contained in this release can be found \ref DISPLAYS "here".
    5717 *
    5718 * We now explain how users can add their own display columns.
    5719 * We give the explanation for creating your own source file for each additional display column. Of course, you can collect
    5720 * different additional display columns in one source file.
    5721 * Take src/scip/disp_default.c, where all default display columns are collected, as an example.
    5722 * As all other default plugins, the default display column plugins and the display column template are written in C.
    5723 * C++ users can easily adapt the code by using the scip::ObjDisp wrapper base class and implement the scip_...() virtual methods
    5724 * instead of the SCIP_DECL_DISP... callbacks.
    5725 *
    5726 *
    5727 * Additional documentation for the callbacks of a display column can be found in the file type_disp.h.
    5728 *
    5729 * Here is what you have to do to implement a display column (assuming your display column is named "mydisplaycolumn"):
    5730 * -# Copy the template files src/scip/disp_xyz.c and src/scip/disp_xyz.h into files named "disp_mydisplaycolumn.c"
    5731 * and "disp_mydisplaycolumn.h".
    5732 \n
    5733 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    5734 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    5735 * -# Use `SCIPincludeDispMydisplaycolumn()` in order to include the display column into your SCIP instance,
    5736 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    5737 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    5738 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mydisplaycolumn".
    5739 * -# Adjust the \ref DISP_PROPERTIES "properties of the display column".
    5740 * -# Define the \ref DISP_DATA "display column data". This is optional.
    5741 * -# Implement the \ref DISP_INTERFACE "interface functions".
    5742 * -# Implement the \ref DISP_FUNDAMENTALCALLBACKS "fundamental callbacks".
    5743 * -# Implement the \ref DISP_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    5744 *
    5745 *
    5746 * @section DISP_PROPERTIES Properties of a Display Column
    5747 *
    5748 * At the top of the new file "disp_mydisplaycolumn.c" you can find the display column properties.
    5749 * These are given as compiler defines.
    5750 * In the C++ wrapper class, you have to provide the display column properties by calling the constructor
    5751 * of the abstract base class scip::ObjDisp from within your constructor.
    5752 * The properties you have to set have the following meaning:
    5753 *
    5754 * \par DISP_NAME: the name of the display column.
    5755 * This name is used in the interactive shell to address the display column.
    5756 * Additionally, if you are searching for a display column with SCIPfindDisp(), this name is looked up.
    5757 * Names have to be unique: no two display columns may have the same name.
    5758 *
    5759 * \par DISP_DESC: the description of the display column.
    5760 * This string is printed as a description of the display column in the interactive shell.
    5761 *
    5762 * \par DISP_HEADER: the header of the display column.
    5763 * This string is printed as the header of the display column in the status information display.
    5764 *
    5765 * \par DISP_WIDTH: the width of the display column.
    5766 * This parameter defines the width (number of characters) of the display column. The value of the parameter has to be
    5767 * greater than or equal to the number of characters in the header string.
    5768 *
    5769 * \par DISP_PRIORITY: the priority of the display column.
    5770 * The total width of status information lines is bounded by the parameter "display width". The display columns actually contained
    5771 * in the status information display are selected in decreasing order of their priority. Furthermore, the user can force
    5772 * columns to be displayed or not to be displayed in the status information display. For that, (s)he has to switch the value
    5773 * of the display column's parameter "active" from "auto" (its default value) to "on" or "off", respectively.
    5774 *
    5775 * \par DISP_POSITION: the relative position of the display column.
    5776 * In the status information display, the display columns are arranged from left to right in increasing order of their
    5777 * relative position.
    5778 *
    5779 * \par DISP_STRIPLINE: the default for whether the display column should be separated with a line from its right neighbor.
    5780 * This parameter states whether the display column should be separated with the string "|" from its right neighbor. In so
    5781 * doing, the clearness of the status information display may improve.
    5782 *
    5783 * @section DISP_DATA Display Column Data
    5784 *
    5785 * Below the header "Data structures" you can find a struct which is called "struct SCIP_DispData".
    5786 * In this data structure, you can store the data of your display column. For example, you should store the adjustable
    5787 * parameters of the display column in this data structure.
    5788 * If you are using C++, you can add display column data as usual as object variables to your class.
    5789 * \n
    5790 * Defining display column data is optional. You can leave the struct empty.
    5791 *
    5792 *
    5793 * @section DISP_INTERFACE Interface Functions
    5794 *
    5795 * At the bottom of "disp_mydisplaycolumn.c" you can find the interface function SCIPincludeDispMydisplaycolumn(), which also
    5796 * appears in "disp_mydisplaycolumn.h".
    5797 * \n
    5798 * This function only has to be adjusted slightly.
    5799 * It is responsible for notifying SCIP of the presence of the display column by calling the function
    5800 * SCIPincludeDisp().
    5801 *
    5802 * The interface function is called by the user, if (s)he wants to include the display column, i.e., if (s)he wants to use the display column in his
    5803 * application.
    5804 *
    5805 * If you are using display column data, you have to allocate the memory for the data at this point.
    5806 * You can do this by calling:
    5807 * \code
    5808 * SCIP_CALL( SCIPallocBlockMemory(scip, &dispdata) );
    5809 * \endcode
    5810 * You also have to initialize the fields in struct SCIP_DispData afterwards.
    5811 *
    5812 * Although this is very uncommon, you may also add user parameters for your display column, see the function
    5813 * SCIPincludeConshdlrKnapsack() in the \ref cons_knapsack.h "knapsack constraint handler" for an example.
    5814 *
    5815 *
    5816 * @section DISP_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Display Column
    5817 *
    5818 * Display column plugins have only one fundamental callback, namely the \ref DISPOUTPUT function.
    5819 * This function has to be implemented for every display column; the other callbacks are optional.
    5820 * In the C++ wrapper class scip::ObjDisp, the scip_output() method (which corresponds to the \ref DISPOUTPUT callback) is a virtual
    5821 * abstract member function.
    5822 * You have to implement it in order to be able to construct an object of your display column class.
    5823 *
    5824 * Additional documentation for the callbacks can be found in type_disp.h.
    5825 *
    5826 * @subsection DISPOUTPUT
    5827 *
    5828 * The DISPOUTPUT callback is called after each pricing loop during node processing and after a node has been processed.
    5829 * In addition, at the root node, the callback is executed after each iteration of the price-and-cut loop.
    5830 * It should write the display column information for the current node to a given output file stream.
    5831 *
    5832 * Typical functions called by a display column are, for example, SCIPdispLongint(), SCIPdispInt(), SCIPdispTime(), and
    5833 * SCIPinfoMessage().
    5834 *
    5835 *
    5836 * @section DISP_ADDITIONALCALLBACKS Additional Callbacks of a Display Column
    5837 *
    5838 * The additional callbacks do not need to be implemented in every case.
    5839 * They can be used, for example, to initialize and free private data.
    5840 *
    5841 * @subsection DISPCOPY
    5842 *
    5843 * The DISPCOPY callback is executed when a SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this callback
    5844 * as <code>NULL</code> the user disables the execution of the specified column. In general it is probably not needed to
    5845 * implement that callback since the output of the copied instance is usually suppressed. In the other case or for
    5846 * debugging the callback should be implement.
    5847 *
    5848 *
    5849 * @subsection DISPFREE
    5850 *
    5851 * If you are using display column data, you have to implement this function in order to free the display column data.
    5852 * This can be done by the following procedure:
    5853 * @refsnippet{tests/src/misc/snippets.c,SnippetDispFree}
    5854 *
    5855 * If you have allocated memory for fields in your display column data, remember to free this memory
    5856 * before freeing the display column data itself.
    5857 * If you are using the C++ wrapper class, this function is not available.
    5858 * Instead, just use the destructor of your class to free the member variables of your class.
    5859 *
    5860 * @subsection DISPINIT
    5861 *
    5862 * The DISPINIT callback is executed after the problem is transformed.
    5863 * The display column may, e.g., use this call to initialize its display column data.
    5864 *
    5865 * @subsection DISPEXIT
    5866 *
    5867 * The DISPEXIT callback is executed before the transformed problem is freed.
    5868 * In this function, the display column should free all resources that have been allocated for the solving process in
    5869 * \ref DISPINIT.
    5870 *
    5871 * @subsection DISPINITSOL
    5872 *
    5873 * The DISPINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    5874 * begin. The display column may use this call to initialize its branch-and-bound specific data.
    5875 *
    5876 * @subsection DISPEXITSOL
    5877 *
    5878 * The DISPEXITSOL callback is executed before the branch-and-bound process is freed. The display column should use this
    5879 * call to clean up its branch-and-bound specific data.
    5880 */
    5881
    5882/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    5883
    5884/**@page EVENT How to add event handler
    5885 *
    5886 * While solving a constraint integer program, SCIP drops thousands of events such as SCIP_EVENTTYPE_VARFIXED (a
    5887 * complete list of all events is given in type_event.h). These events can be caught and used to do something after a
    5888 * certain event happens. Events can be used to speed up the solution process. For example, the set partitioning
    5889 * constraint is only worth propagating if one of the involved variables is fixed. This can be detected by
    5890 * catching the event SCIP_EVENTTYPE_VARFIXED. To be able to catch an event it is necessary to write an event handler
    5891 * which defines what to do after a certain event was caught.
    5892 *
    5893 * We now explain how users can add their own event handlers. We give the explanation for creating your own
    5894 * source file for each additional event handler. Of course, you can collect different event handlers in one source file
    5895 * or you can put the event handler directly into the constraint handler. In a \ref EVENTUSAGE "second step" we discuss
    5896 * the usage of an event handler. This means how to catch and drop events. \ref EVENTTYPES "Finally", we give some notes on the existing
    5897 * types of events.
    5898 *
    5899 * Take src/scip/cons_logior.c, where the event handler is directly included into the constraint handler. As all other
    5900 * default plugins, the event handlers are written in C. C++ users can easily adapt the code by using the scip::ObjEventhdlr
    5901 * wrapper base class and implement the scip_...() virtual methods instead of the SCIP_DECL_EVENT... callbacks.
    5902 *
    5903 * Additional documentation for the callbacks of an event handler can be found in the file type_event.h. There is
    5904 * also an example written in C which deals with an event handler. You find this example in the directory
    5905 * "examples/Eventhdlr/". An C++ example can be found within the TSP project (examples/TSP/src/EventhdlrNewSol.cpp).
    5906 *
    5907 * Here is what you have to do to implement an event handler (assuming your event handler is named "bestsol"):
    5908 * -# Copy the template files src/scip/event_xyz.c and src/scip/event_xyz.h into files named "event_bestsol.c"
    5909 * and "event_bestsol.h".
    5910 \n
    5911 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    5912 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    5913 * -# Use `SCIPincludeEventBestsol()` in order to include the event handler into your SCIP instance,
    5914 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    5915 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    5916 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "bestsol".
    5917 * -# Adjust the \ref EVENTHDLR_PROPERTIES "properties of the event handler".
    5918 * -# Implement the \ref EVENT_INTERFACE "interface functions".
    5919 * -# Implement the \ref EVENT_FUNDAMENTALCALLBACKS "fundamental callbacks".
    5920 * -# Implement the \ref EVENT_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    5921 *
    5922 *
    5923 * @section EVENTHDLR_PROPERTIES Properties of a Event Handler
    5924 *
    5925 * At the top of the new file "event_bestsol.c" you can find the event handler properties.
    5926 * These are given as compiler defines.
    5927 * In the C++ wrapper class, you have to provide the event handler properties by calling the constructor
    5928 * of the abstract base class scip::ObjEventhdlr from within your constructor.
    5929 * The properties you have to set have the following meaning:
    5930 *
    5931 * \par EVENT_NAME: the name of the event handler.
    5932 * This name has to be unique with respect to all other event handlers. If you are searching for an event handler with
    5933 * SCIPfindEventhdlr(), this name is looked up.
    5934 *
    5935 * \par EVENT_DESC: the description of the event handler.
    5936 * This string is printed as a description of the event handler.
    5937 *
    5938 * @section EVENTHDLR_DATA Event Handler Data
    5939 *
    5940 * Below the header "Data structures" you can find a struct which is called "struct SCIP_EventhdlrData".
    5941 * In this data structure, you can store the data of your event handler. For example, you should store the adjustable
    5942 * parameters of the event handler in this data structure.
    5943 * If you are using C++, you can add event handler data as usual as object variables to your class.
    5944 * \n
    5945 * Defining event handler data is optional. You can leave the struct empty.
    5946 *
    5947 *
    5948 * @section EVENT_INTERFACE Interface Functions
    5949 *
    5950 * At the bottom of "event_bestsol.c", you can find the interface function SCIPincludeEventBestsol(),
    5951 * which also appears in "event_bestsol.h".
    5952 * SCIPincludeEventBestsol() is called by the user, if (s)he wants to include the event handler,
    5953 * i.e., if (s)he wants to use the event handler in his/her application.
    5954 *
    5955 * This function only has to be adjusted slightly.
    5956 * It is responsible for notifying SCIP of the presence of the event handler. For this, you can either call
    5957 * SCIPincludeEventhdlr(),
    5958 * or SCIPincludeEventhdlrBasic() since SCIP version 3.0. In the latter variant, \ref EVENT_ADDITIONALCALLBACKS "additional callbacks"
    5959 * must be added via setter functions as, e.g., SCIPsetReaderCopy(). We recommend this latter variant because
    5960 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    5961 * variant must be manually adjusted with every SCIP release containing new callbacks for event handlers in order to compile.
    5962 *
    5963 * If you are using event handler data, you have to allocate the memory for the data at this point.
    5964 * You can do this by calling:
    5965 * \code
    5966 * SCIP_CALL( SCIPallocBlockMemory(scip, &eventhdlrdata) );
    5967 * \endcode
    5968 * You also have to initialize the fields in struct SCIP_EventhdlrData afterwards.
    5969 *
    5970 * Although this is very uncommon, you may also add user parameters for your event handler, see the function
    5971 * SCIPincludeConshdlrKnapsack() in the \ref cons_knapsack.h "knapsack constraint handler" for an example.
    5972 *
    5973 *
    5974 * @section EVENT_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Event Handler
    5975 *
    5976 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    5977 * an operational algorithm.
    5978 * They are passed together with the event handler itself to SCIP using SCIPincludeEventhdlr() or SCIPincludeEventhdlrBasic(),
    5979 * see @ref EVENT_INTERFACE.
    5980 *
    5981 *
    5982 * Event handler plugins have only one fundamental callback, namely the \ref EVENTEXEC function. This function has
    5983 * to be implemented for every event handler; the other callbacks are optional. In the C++ wrapper class
    5984 * scip::ObjEventhdlr, the scip_exec() method (which corresponds to the \ref EVENTEXEC callback) is a virtual abstract member
    5985 * function. You have to implement it in order to be able to construct an object of your event handler class.
    5986 *
    5987 * Additional documentation for the callbacks can be found in type_event.h.
    5988 *
    5989 * @subsection EVENTEXEC
    5990 *
    5991 * The EVENTEXEC callback is called after the requested event happened. Then the event handler can do some action in
    5992 * reaction to the event.
    5993 *
    5994 * Typical the execution function sets a parameter to TRUE to indicate later in solving process that something happened
    5995 * which should be analyzed further. In the \ref cons_knapsack.h "knapsack constraint handler" you find such a typical
    5996 * example.
    5997 *
    5998 * @section EVENT_ADDITIONALCALLBACKS Additional Callbacks of a Event Handler
    5999 *
    6000 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    6001 * implemented for most applications, they can be used, for example, to initialize and free private data.
    6002 * Additional callbacks can either be passed directly with SCIPincludeEventhdlr() to SCIP or via specific
    6003 * <b>setter functions</b> after a call of SCIPincludeEventhdlrBasic(), see also @ref EVENT_INTERFACE.
    6004 *
    6005 * @subsection EVENTCOPY
    6006 *
    6007 * The EVENTCOPY callback is executed when a SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this
    6008 * callback as <code>NULL</code> the user disables the execution of the specified event handler for all copied SCIP
    6009 * instances. Note that in most cases the event handler in the copied instance will be initialize by those objects (such
    6010 * as constraint handlers or propagators) which need this event handler (see \ref cons_knapsack.h). In these cases the copy
    6011 * callback can be ignored. In case of general events, such as a new best solution being found
    6012 * (SCIP_EVENTTYPE_BESTSOLFOUND), you might want to implement that callback. The event handler example which you find
    6013 * in the directory "examples/Eventhdlr/" uses that callback.
    6014 *
    6015 * @refsnippet{src/scip/event_softtimelimit.c,SnippetEventCopySofttimelimit}
    6016 *
    6017 * @subsection EVENTFREE
    6018 *
    6019 * If you are using event handler data, you have to implement this function in order to free the event handler data.
    6020 * This can be done by the following procedure:
    6021 *
    6022 * @refsnippet{src/scip/event_softtimelimit.c,SnippetEventFreeSofttimelimit}
    6023 *
    6024 * If you have allocated memory for fields in your event handler data, remember to free this memory
    6025 * before freeing the event handler data itself.
    6026 * If you are using the C++ wrapper class, this function is not available.
    6027 * Instead, just use the destructor of your class to free the member variables of your class.
    6028 *
    6029 *
    6030 * @subsection EVENTINIT
    6031 *
    6032 * The EVENTINIT callback is executed after the problem is transformed.
    6033 * The event handler may, e.g., use this call to initialize its event handler data.
    6034 *
    6035 * @subsection EVENTEXIT
    6036 *
    6037 * The EVENTEXIT callback is executed before the transformed problem is freed.
    6038 * In this function, the event handler should free all resources that have been allocated for the solving process in
    6039 * \ref EVENTINIT.
    6040 *
    6041 * @subsection EVENTINITSOL
    6042 *
    6043 * The EVENTINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    6044 * begin. The event handler may use this call to initialize its branch-and-bound specific data.
    6045 *
    6046 * @subsection EVENTEXITSOL
    6047 *
    6048 * The EVENTEXITSOL callback is executed before the branch-and-bound process is freed. The event handler should use this
    6049 * call to clean up its branch-and-bound specific data.
    6050 *
    6051 * @section EVENTUSAGE Catching and Dropping Events
    6052 *
    6053 * After you have implemented the event handler, you have to tell SCIP for which events this event handler should be
    6054 * used. This can be a general events, such as <code>SCIP_EVENTTYPE_BESTSOLFOUND</code>, or a variable event which is the most common
    6055 * way.
    6056 *
    6057 * In case of a general (not variable) event you use the function SCIPcatchEvent() to attach to an event and
    6058 * SCIPdropEvent() to release this event later.
    6059 *
    6060 * \code
    6061 * SCIP_CALL( SCIPcatchEvent( scip, SCIP_EVENTTYPE_BESTSOLFOUND, eventhdlr, NULL, NULL) );
    6062 * \endcode
    6063 *
    6064 * \code
    6065 * SCIP_CALL( SCIPdropEvent( scip, SCIP_EVENTTYPE_BESTSOLFOUND, eventhdlr, NULL, NULL) );
    6066 * \endcode
    6067 *
    6068 * If you want trigger some variable event, you use the function SCIPcatchVarEvent() to attach the variable event and
    6069 * SCIPdropVarEvent() to drop it later.
    6070 *
    6071 * \code
    6072 * SCIP_CALL( SCIPcatchVarEvent( scip, var, SCIP_EVENTTYPE_VARFIXED, eventhdlr, NULL, NULL) );
    6073 * \endcode
    6074 *
    6075 * \code
    6076 * SCIP_CALL( SCIPdropVarEvent( scip, var, SCIP_EVENTTYPE_VARFIXED, eventhdlr, NULL, NULL) );
    6077 * \endcode
    6078 *
    6079 * @section EVENTTYPES Event types
    6080 *
    6081 * All available events are listed in type_event.h. There are atomic events such as <code>SCIP_EVENTTYPE_VARFIXED</code>
    6082 * and combined events such as <code>SCIP_EVENTTYPE_VARCHANGED</code>. The events are encoded via bit masks. Each atomic
    6083 * event has a unique power of two. This enables combination of the atomic events.
    6084 *
    6085 * SCIP only throws atomic events. However, an event handler might be interested in bunch of events. Through the
    6086 * underlying bit masks it is possible to combine the atomic events. For example, <code>SCIP_EVENTTYPE_VARCHANGED</code>
    6087 * is an event which combines the events <code>SCIP_EVENTTYPE_VARFIXED</code>, <code>SCIP_EVENTTYPE_VARUNLOCKED</code>,
    6088 * <code>SCIP_EVENTTYPE_OBJCHANGED</code>, <code>SCIP_EVENTTYPE_GBDCHANGED</code>,
    6089 * <code>SCIP_EVENTTYPE_DOMCHANGED</code>, and <code>SCIP_EVENTTYPE_IMPLADDED</code>.
    6090 *
    6091 * \code
    6092 * #define SCIP_EVENTTYPE_VARCHANGED (SCIP_EVENTTYPE_VARFIXED | SCIP_EVENTTYPE_VARUNLOCKED | SCIP_EVENTTYPE_OBJCHANGED
    6093 * | SCIP_EVENTTYPE_GBDCHANGED | SCIP_EVENTTYPE_DOMCHANGED | SCIP_EVENTTYPE_IMPLADDED)
    6094 * \endcode
    6095 *
    6096 * Depending on the event type, the event offers different information. The functions which can be used to gain
    6097 * access to this information are given in pub_event.h.
    6098 *
    6099 */
    6100
    6101/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    6102
    6103/**@page NLPI How to add interfaces to nonlinear programming solvers
    6104 *
    6105 * NLPIs are used to interface a solver for nonlinear programs (NLP).
    6106 * It is used, e.g., to solve convex relaxations of the problem or to find locally optimal solutions of
    6107 * nonlinear relaxations or subproblems.
    6108 * The NLPI has been designed such that it can be used independently of a SCIP problem.
    6109 *
    6110 * While the NLPI itself corresponds to the solver interface, the NLPIPROBLEM corresponds to the
    6111 * (solver specific) representation of a concrete nonlinear program.
    6112 * An NLP is specified as a set of indexed variables with variable bounds, an objective function,
    6113 * and a set of constraints, where each constraint is specified as a function which is restricted to lie
    6114 * between given left and right hand sides (possibly infinite).
    6115 * A function consists of a linear and a nonlinear part.
    6116 * The linear part is specified via variable indices and coefficients, while the nonlinear part is specified via an expression.
    6117 * That is, the user of the NLPI does not provide function evaluation callbacks but an algebraic representation of the NLP.
    6118 * Interfaces for solvers that require function evaluations can make use of the \ref NLPIOracle "NLPIORACLE", which
    6119 * provides functionality to store a NLP and compute functions values, gradients, Jacobians, and Hessians.
    6120 * See the interface to Ipopt for an example on how to use the NLPIORACLE.
    6121 *
    6122 * A complete list of all NLPIs contained in this release can be found \ref NLPIS "here".
    6123 *
    6124 * We now explain how users can add their own NLP solver interface.
    6125 * Take the interface to Ipopt (src/scip/nlpi_ipopt.cpp) as an example.
    6126 * Unlike most other plugins, it is written in C++.
    6127 * Additional documentation for the callbacks of an NLPI, in particular for their input parameters,
    6128 * can be found in the file \ref type_nlpi.h.
    6129 *
    6130 * Here is what you have to do to implement an NLPI:
    6131 * -# Copy the template files src/scip/nlpi_xyz.c and src/scip/nlpi_xyz.h into files named "nlpi_mysolver.c" and "nlpi_mysolver.h".
    6132 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    6133 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    6134 * -# Use `SCIPincludeNlpSolverMysolver()` in order to include the NLPI into your SCIP instance,
    6135 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    6136 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    6137 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mysolver".
    6138 * -# Adjust the properties of the nlpi (see \ref NLPI_PROPERTIES).
    6139 * -# Define the NLPI and NLPIPROBLEM data (see \ref NLPI_DATA).
    6140 * -# Implement the interface functions (see \ref NLPI_INTERFACE).
    6141 * -# Implement the fundamental callbacks (see \ref NLPI_FUNDAMENTALCALLBACKS).
    6142 * -# Implement the additional callbacks (see \ref NLPI_ADDITIONALCALLBACKS). This is optional.
    6143 *
    6144 *
    6145 * @section NLPI_PROPERTIES Properties of an NLPI
    6146 *
    6147 * At the top of the new file "nlpi_mysolver.c", you can find the NLPI properties.
    6148 * These are given as compiler defines.
    6149 * The properties you have to set have the following meaning:
    6150 *
    6151 * \par NLPI_NAME: the name of the NLP solver interface.
    6152 * This name is used in the interactive shell to address the NLPI.
    6153 * Additionally, if you are searching for an NLPI with SCIPfindNlpi(), this name is looked up.
    6154 * Names have to be unique: no two NLPIs may have the same name.
    6155 *
    6156 * \par NLPI_DESC: the description of the NLPI.
    6157 * This string is printed as a description of the NLPI in the interactive shell.
    6158 *
    6159 * \par NLPI_PRIORITY: the priority of the NLPI.
    6160 * If an NLP has to be solved, an NLP solver has to be selected.
    6161 * By default, the solver with the NLPI with highest priority is selected.
    6162 * The priority of an NLPI should be set according to performance of the solver:
    6163 * solvers that provide fast algorithms that are usually successful on a wide range of problems should have a high priority.
    6164 * An easy way to list the priorities of all NLPIs is to type "display nlpis" in the interactive shell of SCIP.
    6165 *
    6166 * @section NLPI_DATA NLPI Data
    6167 *
    6168 * Below the header "Data structures" you can find structs which are called `struct SCIP_NlpiData` and `struct SCIP_NlpiProblem`.
    6169 * In these data structures, you can store the data of your solver interface and of a specific NLP problem.
    6170 * For example, you could store a pointer to your NLP solver environment object in the `SCIP_NlpiData` data structure
    6171 * and store a pointer to an NLPIORACLE in the `SCIP_NlpiProblem` data structure.
    6172 *
    6173 * @section NLPI_INTERFACE Interface Functions
    6174 *
    6175 * At the bottom of "nlpi_mysolver.c", you can find the interface function SCIPincludeNlpSolverXyz(),
    6176 * which also appears in "nlpi_mysolver.h".
    6177 *
    6178 * This function only has to be adjusted slightly.
    6179 * It is responsible for creating an NLPI that contains all properties and callbacks of your
    6180 * solver interface and included it into SCIP by calling the function SCIPincludeNlpi().
    6181 * SCIPincludeNlpSolverXyz() is called by the user (e.g., SCIP), if (s)he wants to use this solver interface in his/her application.
    6182 *
    6183 * If you are using NLPI data, you have to allocate the memory for the data at this point.
    6184 * You can do this by calling:
    6185 * \code
    6186 * SCIP_CALL( SCIPallocBlockMemory(scip, &nlpidata) );
    6187 * \endcode
    6188 * You also have to initialize the fields in struct SCIP_NlpiData afterwards. For freeing the
    6189 * NLPI data, see \ref NLPIFREE.
    6190 *
    6191 *
    6192 * @section NLPI_FUNDAMENTALCALLBACKS Fundamental Callbacks of an NLPI
    6193 *
    6194 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    6195 * an operational algorithm. Most NLPI callbacks are fundamental.
    6196 *
    6197 * Additional documentation of the callbacks, in particular to their input parameters,
    6198 * can be found in \ref type_nlpi.h.
    6199 *
    6200 * @subsection NLPIFREE
    6201 *
    6202 * The NLPIFREE callback is executed if the NLP solver interface data structure should be freed, e.g., when a SCIP instance is freed.
    6203 *
    6204 * @subsection NLPICREATEPROBLEM
    6205 *
    6206 * The NLPICREATEPROBLEM callback is executed if a particular NLP problem is to be created.
    6207 * The callback should initialize a SCIP_NlpiProblem struct here that corresponds to an empty NLP.
    6208 *
    6209 * @subsection NLPIFREEPROBLEM
    6210 *
    6211 * The NLPIFREEPROBLEMPOINTER callback is executed if a particular NLP problem is to be freed.
    6212 * The callback should free a SCIP_NlpiProblem struct here.
    6213 *
    6214 * @subsection NLPIADDVARS
    6215 *
    6216 * The NLPIADDVARS callback is executed if a set of variables with lower and upper bounds and names should be added to a particular NLP.
    6217 * The callback must add the new variables behind the previously added variables, if any.
    6218 * If NULL is given for the lower bounds arguments, -infinity is assumed as lower bound for each new variable.
    6219 * If NULL is given for the upper bounds arguments, +infinity is assumed as upper bound for each new variable.
    6220 * It is also permitted to use NULL for the names argument.
    6221 *
    6222 * @subsection NLPIADDCONSTRAINTS
    6223 *
    6224 * The NLPIADDCONSTRAINTS callback is executed if a set of constraints should be added to a particular NLP.
    6225 * Constraints are specified by providing left- and right-hand-sides, linear coefficients, expressions, and constraint names.
    6226 * All of these arguments are optional, giving NULL for left-hand-sides corresponds to -infinity, giving NULL for right-hand-sides corresponds to +infinity.
    6227 *
    6228 * @subsection NLPISETOBJECTIVE
    6229 *
    6230 * The NLPISETOBJECTIVE callback is executed to set the objective function of a particular NLP.
    6231 *
    6232 * @subsection NLPICHGVARBOUNDS
    6233 *
    6234 * The NLPICHGVARBOUNDS callback is executed to change the bounds on a set of variables of an NLP.
    6235 *
    6236 * @subsection NLPICHGCONSSIDES
    6237 *
    6238 * The NLPICHGCONSSIDES callback is executed to change the sides on a set of constraints of an NLP.
    6239 *
    6240 * @subsection NLPIDELVARSET
    6241 *
    6242 * The NLPIDELVARSET callback is executed to delete a set of variables from an NLP.
    6243 * The caller provides an array in which for each variable it is marked whether it should be deleted.
    6244 * In the same array, the function should return the new position of each variable in the NLP, or -1 if it was deleted.
    6245 *
    6246 * @subsection NLPIDELCONSSET
    6247 *
    6248 * The NLPIDELCONSSET callback is executed to delete a set of constraints from an NLP.
    6249 * The caller provides an array in which for each constraint it is marked whether it should be deleted.
    6250 * In the same array, the function should return the new position of each constraint in the NLP, or -1 if it was deleted.
    6251 *
    6252 * @subsection NLPICHGLINEARCOEFS
    6253 *
    6254 * The NLPICHGLINEARCOEFS callback is executed to change the coefficients in the linear part of the objective function or a constraint of an NLP.
    6255 *
    6256 * @subsection NLPICHGEXPR
    6257 *
    6258 * The NLPICHGEXPR callback is executed to replace the expression of the objective function or a constraint of an NLP.
    6259 *
    6260 * @subsection NLPICHGOBJCONSTANT
    6261 *
    6262 * The NLPICHGOBJCONSTANT callback is executed to change the constant offset of the objective function of an NLP.
    6263 *
    6264 * @subsection NLPISOLVE
    6265 *
    6266 * The NLPISOLVE callback is executed when an NLP should be solved.
    6267 * The solver may use the initial guess provided by \ref NLPISETINITIALGUESS as starting point.
    6268 * The status of the solving process and solution can be requested by
    6269 * \ref NLPIGETSOLSTAT, \ref NLPIGETTERMSTAT, \ref NLPIGETSOLUTION, and \ref NLPIGETSTATISTICS.
    6270 *
    6271 * @subsection NLPIGETSOLSTAT
    6272 *
    6273 * The NLPIGETSOLSTAT callback can be used to request the solution status (solved, infeasible, ...) after an NLP has been solved.
    6274 *
    6275 * @subsection NLPIGETTERMSTAT
    6276 *
    6277 * The NLPIGETTERMSTAT callback can be used to request the termination reason (normal, iteration limit, ...) after an NLP has been solved.
    6278 *
    6279 * @subsection NLPIGETSOLUTION
    6280 *
    6281 * The NLPIGETSOLUTION callback can be used to request the primal and dual solution values after an NLP solve.
    6282 * The function should pass pointers to arrays of variable values to the caller.
    6283 * It is possible to return only primal values for the variables, but no values for the dual variables, e.g., if a solver does not compute such values.
    6284 *
    6285 * @subsection NLPIGETSTATISTICS
    6286 *
    6287 * The NLPIGETSTATISTICS callback can be used to request the statistical values (number of iterations, time, ...) after an NLP solve.
    6288 * The function should fill the provided NLPSTATISTICS data structure.
    6289 *
    6290 * @section NLPI_ADDITIONALCALLBACKS Additional Callbacks of an NLPI
    6291 *
    6292 * The additional callbacks do not need to be implemented in every case.
    6293 *
    6294 * @subsection NLPICOPY
    6295 *
    6296 * The NLPICOPY callback is executed if the plugin should be copied, e.g., when a SCIP instance is copied.
    6297 *
    6298 * It is advisable to implement this callback to make the NLP solver available in sub-SCIPs.
    6299 * Note that the sub-NLP heuristic solves NLPs in a sub-SCIP.
    6300 *
    6301 * @subsection NLPIGETSOLVERPOINTER
    6302 *
    6303 * The NLPIGETSOLVERPOINTER callback can be used to pass a pointer to a solver specific data structure to the user.
    6304 * Return NULL if you do not have a pointer to return.
    6305 *
    6306 * @subsection NLPIGETPROBLEMPOINTER
    6307 *
    6308 * The NLPIGETPROBLEMPOINTER callback can be used to pass a pointer to a solver specific data structure of the NLP to the user.
    6309 *
    6310 * @subsection NLPISETINITIALGUESS
    6311 *
    6312 * The NLPISETINITIALGUESS callback is executed to provide primal and dual initial values for the variables and constraints of an NLP.
    6313 * For a local solver, it is strongly advisable to implement this callback, as these values should be used as a starting point for the search.
    6314 * It is possible to pass a NULL pointer for any of the arguments (primal values of variables, dual values of variable bounds, dual values of constraints).
    6315 * In this case, the solver should clear previously set starting values and setup its own starting point.
    6316 *
    6317 */
    6318
    6319/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    6320
    6321/**@page EXPRINT How to add interfaces to expression interpreters
    6322 *
    6323 * An expression interpreter is a tool to compute point-wise the function values, gradients, and
    6324 * Hessians of algebraic expressions which are given in the form of an expression.
    6325 * Typically, this is done via automatic differentiation.
    6326 * It is used, e.g., by an NLP solver interface to compute Jacobians and Hessians for the solver.
    6327 *
    6328 * The expression interpreter interface in SCIP has been implemented similar to those of the LP solver interface (LPI).
    6329 * For one binary, exactly one expression interpreter has to be linked.
    6330 * The expression interpreter API has been designed such that it can be used independently from a SCIP problem.
    6331 *
    6332 * A complete list of all expression interpreters contained in this release can be found \ref EXPRINTS "here".
    6333 *
    6334 * We now explain how users can add their own expression interpreters.
    6335 * Take the interface to CppAD (\ref exprinterpret_cppad.cpp) as an example.
    6336 * Unlike most other plugins, it is written in C++.
    6337 *
    6338 * Additional documentation for the callbacks of an expression interpreter, in particular for their input parameters,
    6339 * can be found in the file \ref exprinterpret.h.
    6340 *
    6341 * Here is what you have to do to implement an expression interpreter:
    6342 * -# Copy the file \ref exprinterpret_none.c into a file named "exprinterpret_myad.c".
    6343 * Make sure to adjust your build system such that this file is compiled and linked to your project instead of exprinterpret implementations. \n
    6344 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    6345 * -# Open the new file with a text editor.
    6346 * -# Define the expression interpreter data (see \ref EXPRINT_DATA).
    6347 * -# Implement the interface functions (see \ref EXPRINT_INTERFACE).
    6348 *
    6349 *
    6350 * @section EXPRINT_DATA Expression Interpreter Data
    6351 *
    6352 * In `struct SCIP_ExprInt`, you can store the general data of your expression interpreter.
    6353 * For example, you could store the environment of your automatic differentiation code.
    6354 *
    6355 * @section EXPRINT_INTERFACE Interface Functions
    6356 *
    6357 * The expression interpreter has to implement a set of interface function.
    6358 * In your "exprinterpret_myad.c", these functions are mostly dummy functions that return error codes.
    6359 *
    6360 * @subsection SCIPexprintGetName
    6361 *
    6362 * The SCIPexprintGetName() function should return the name of the expression interpreter.
    6363 *
    6364 * @subsection SCIPexprintGetDesc
    6365 *
    6366 * The SCIPexprintGetDesc() function should return a short description of the expression interpreter, e.g., the name of the developer of the code.
    6367 *
    6368 * @subsection SCIPexprintGetCapability
    6369 *
    6370 * The SCIPexprintGetCapability() function should return a bitmask that indicates the capabilities of the expression interpreter,
    6371 * i.e., whether it can compute gradients and Hessians.
    6372 *
    6373 * @subsection SCIPexprintCreate
    6374 *
    6375 * The SCIPexprintCreate() function is called to create an expression interpreter data structure.
    6376 * The function should initialize a `struct SCIP_ExprInt` here.
    6377 *
    6378 * @subsection SCIPexprintFree
    6379 *
    6380 * The SCIPexprintFree() function is called to free an expression interpreter data structure.
    6381 * The function should free a `struct SCIP_ExprInt` here.
    6382 *
    6383 * @subsection SCIPexprintCompile
    6384 *
    6385 * The SCIPexprintCompile() function is called to initialize the data structures that are required to evaluate a particular expression.
    6386 * The expression interpreter can create and return data that is particular to a given expression in the argument `exprintdata`.
    6387 *
    6388 * @subsection SCIPexprintFreeData
    6389 *
    6390 * The SCIPexprintFreeData() function is called to free the data that is particular to a given expression and was possibly created in SCIPexprintCompile().
    6391 *
    6392 * @subsection SCIPexprintGetExprCapability
    6393 *
    6394 * The SCIPexprintGetExprCapability() function is called to request the capability to evaluate a specific expression by the expression interpreter.
    6395 *
    6396 * In cases of user-given expressions, higher order derivatives may not be available for the user-expression,
    6397 * even if the expression interpreter could handle these. This function allows to recognize that, e.g., the
    6398 * Hessian for an expression is not available because it contains a user expression that does not provide
    6399 * Hessians.
    6400 *
    6401 * @subsection SCIPexprintEval
    6402 *
    6403 * The SCIPexprintEval() function is called when the value of an expression should be computed for a point.
    6404 *
    6405 * @subsection SCIPexprintGrad
    6406 *
    6407 * The SCIPexprintGrad() function is called when the gradient of an expression represented by an expression should be computed for a point.
    6408 *
    6409 * @subsection SCIPexprintHessianSparsity
    6410 *
    6411 * The SCIPexprintHessianSparsity() function is called when the sparsity structure of the Hessian matrix should be computed and returned.
    6412 * Only the position of nonzero entries in the lower-triangular part of Hessian should be reported.
    6413 *
    6414 * @subsection SCIPexprintHessian
    6415 *
    6416 * The SCIPexprintHessian() function is called when the Hessian of an expression should be computed for a point.
    6417 */
    6418
    6419/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    6420
    6421/**@page TABLE How to add statistics tables
    6422 *
    6423 * After solving a constraint integer program, SCIP can display statistics tables with information about, e.g., the solving time,
    6424 * number of nodes, LP iterations or the number of calls and successes of different plugins via "display statistics" in the shell
    6425 * or via SCIPprintStatistics() in the C-interface. There already exists a wide variety of statistics tables which can be activated
    6426 * or deactivated on demand, see src/scip/table_default.c. Additionally, the user can implement his/her own statistics tables
    6427 * in order to display problem or algorithm specific values.
    6428 * \n
    6429 * A complete list of all statistics tables contained in this release can be found \ref TABLES "here".
    6430 *
    6431 * We now explain how users can add their own statistics tables.
    6432 * We give the explanation for creating your own source file for each additional statistics table. Of course, you can collect
    6433 * different additional statistics tables in one source file.
    6434 * Take src/scip/table_default.c, where all default statistics tables are collected, as an example.
    6435 * As all other default plugins, the default statistics table plugins and the statistics table template are written in C.
    6436 * C++ users can easily adapt the code by using the scip::ObjTable wrapper base class and implement the scip_...() virtual methods
    6437 * instead of the SCIP_DECL_TABLE... callbacks.
    6438 *
    6439 *
    6440 * Additional documentation for the callbacks of a statistics table can be found in the file type_table.h.
    6441 *
    6442 * Here is what you have to do to implement a statistics table (assuming your statistics table is named "mystatisticstable"):
    6443 * -# Copy the template files src/scip/table_xyz.c and src/scip/table_xyz.h into files named "table_mystatisticstable.c"
    6444 * and "table_mystatisticstable.h".
    6445 * \n
    6446 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    6447 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    6448 * -# Use SCIPincludeTableMystatisticstable() in order to include the statistics table into your SCIP instance,
    6449 * e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    6450 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    6451 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mystatisticstable".
    6452 * -# Adjust the \ref TABLE_PROPERTIES "properties of the statistics table".
    6453 * -# Define the \ref TABLE_DATA "statistics table data". This is optional.
    6454 * -# Implement the \ref TABLE_INTERFACE "interface functions".
    6455 * -# Implement the \ref TABLE_FUNDAMENTALCALLBACKS "fundamental callbacks".
    6456 * -# Implement the \ref TABLE_ADDITIONALCALLBACKS "additional callbacks". This is optional.
    6457 *
    6458 *
    6459 * @section TABLE_PROPERTIES Properties of a Statistics Table
    6460 *
    6461 * At the top of the new file "table_mystatisticstable.c" you can find the statistics table properties.
    6462 * These are given as compiler defines.
    6463 * In the C++ wrapper class, you have to provide the statistics table properties by calling the constructor
    6464 * of the abstract base class scip::ObjTable from within your constructor.
    6465 * The properties you have to set have the following meaning:
    6466 *
    6467 * \par TABLE_NAME: the name of the statistics table.
    6468 * This name is used in the interactive shell to address the statistics table.
    6469 * Additionally, if you are searching for a statistics table with SCIPfindTable(), this name is looked up.
    6470 * Names have to be unique: no two statistic tables may have the same name.
    6471 *
    6472 * \par TABLE_DESC: the description of the statistics table.
    6473 * This string is printed as a description of the statistics table in the interactive shell.
    6474 *
    6475 * \par TABLE_POSITION: the position of the statistics table.
    6476 * In the statistics output, the statistics tables will be ordered by increasing position. Compare with the
    6477 * default statistics tables in "table_default.c" to find a value which will give you the desired position
    6478 * between the default statistics tables. If you give your table a negative position value, it will appear
    6479 * before all SCIP statistcs, with a value larger than 20000 it will appear after all default statistics.
    6480 *
    6481 * \par TABLE_EARLIEST_STAGE: output of the statistics table is only printed from this stage onwards
    6482 * The output routine of your statistics table will only be called if SCIP has reached this stage. For
    6483 * example, the default table "tree" will only output information starting from SCIP_STAGE_SOLVING, because
    6484 * there is no meaningful information available before, while the "presolver" table can already be called
    6485 * in SCIP_STAGE_TRANSFORMED.
    6486 *
    6487 * @section TABLE_DATA Statistics Table Data
    6488 *
    6489 * Below the header "Data structures" you can find a struct which is called "struct SCIP_TableData".
    6490 * In this data structure, you can store the data of your statistics table. For example, you should store the adjustable
    6491 * parameters of the statistics table in this data structure.
    6492 * If you are using C++, you can add statistics table data as usual as object variables to your class.
    6493 * \n
    6494 * Defining statistics table data is optional. You can leave the struct empty.
    6495 *
    6496 *
    6497 * @section TABLE_INTERFACE Interface Functions
    6498 *
    6499 * At the bottom of "table_mystatisticstable.c" you can find the interface function SCIPincludeTableMystatisticstable(), which also
    6500 * appears in "table_mystatisticstable.h".
    6501 * \n
    6502 * This function only has to be adjusted slightly.
    6503 * It is responsible for notifying SCIP of the presence of the statistics table by calling the function
    6504 * SCIPincludeTable().
    6505 *
    6506 * The interface function is called by the user, if (s)he wants to include the statistics table, i.e., if (s)he wants to use the statistics table in an
    6507 * application.
    6508 *
    6509 * If you are using statistics table data, you have to allocate the memory for the data at this point.
    6510 * You can do this by calling:
    6511 * \code
    6512 * SCIP_CALL( SCIPallocBlockMemory(scip, &tabledata) );
    6513 * \endcode
    6514 * You also have to initialize the fields in struct SCIP_TableData afterwards.
    6515 *
    6516 * Although this is very uncommon, you may also add user parameters for your statistics table, see the function
    6517 * SCIPincludeConshdlrKnapsack() in the \ref cons_knapsack.h "knapsack constraint handler" for an example.
    6518 *
    6519 *
    6520 * @section TABLE_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Statistics Table
    6521 *
    6522 * Statistics table plugins have callbacks that output and collect data.
    6523 * One or both of these functions have to be implemented for every table.
    6524 * If the output function is not implemented, then SCIP tries to print the data that is retrieved from the collect callback in table form.
    6525 * In the C++ wrapper class scip::ObjTable, the scip_output() method (which corresponds to the \ref TABLEOUTPUT callback) and
    6526 * scip_collect() method (which corresponds to the \ref TABLECOLLECT callback) are virtual member functions.
    6527 * One or both of them should be overwritten.
    6528 *
    6529 * Additional documentation for the callbacks can be found in type_table.h.
    6530 *
    6531 * @subsection TABLEOUTPUT
    6532 *
    6533 * The TABLEOUTPUT callback is called whenever SCIP is asked to print statistics (because the user typed "display statistics"
    6534 * in the shell or called SCIPprintStatistics()). In this callback, the table should print all of its information to the given file
    6535 * (which may be NULL if the output should be printed to the console).
    6536 *
    6537 * Typical functions called by a statistics table are, for example, SCIPdispLongint(), SCIPdispInt(), SCIPdispTime(), and
    6538 * SCIPinfoMessage().
    6539 *
    6540 * @subsection TABLECOLLECT
    6541 *
    6542 * The TABLECOLLECT callback is called when the statistics table should collect its information in a SCIP_DATATREE.
    6543 * This is used, for example, to write statistics to a JSON file (SCIPprintStatisticsJson()).
    6544 * To implement the TABLECOLLECT callback, `SCIPinsertDatatree*()` functions should be used to insert information
    6545 * into the given SCIP_DATATREE. Currently, inserting data of different types is supported: long, double, char*,
    6546 * another SCIP_DATATREE*, or arrays of long, double, and char*. See also scip_datatree.h and pub_datatree.h.
    6547 *
    6548 *
    6549 * @section TABLE_ADDITIONALCALLBACKS Additional Callbacks of a Statistics Table
    6550 *
    6551 * The additional callbacks do not need to be implemented in every case.
    6552 * They can be used, for example, to initialize and free private data.
    6553 *
    6554 * @subsection TABLECOPY
    6555 *
    6556 * The TABLECOPY callback is executed when a SCIP instance is copied, e.g. to solve a sub-SCIP. By defining this callback
    6557 * as <code>NULL</code> the user disables the execution of the specified column. In general it is probably not needed to
    6558 * implement that callback since the output of the copied instance is usually suppressed. In the other case or for
    6559 * debugging the callback should be implement.
    6560 *
    6561 *
    6562 * @subsection TABLEFREE
    6563 *
    6564 * If you are using statistics table data, you have to implement this function in order to free the statistics table data.
    6565 * This can be done by the following procedure:
    6566 * @refsnippet{tests/src/misc/snippets.c,SnippetTableFree}
    6567 *
    6568 * If you have allocated memory for fields in your statistics table data, remember to free this memory
    6569 * before freeing the statistics table data itself.
    6570 * If you are using the C++ wrapper class, this function is not available.
    6571 * Instead, just use the destructor of your class to free the member variables of your class.
    6572 *
    6573 * @subsection TABLEINIT
    6574 *
    6575 * The TABLEINIT callback is executed after the problem is transformed.
    6576 * The statistics table may, e.g., use this call to initialize its statistics table data.
    6577 *
    6578 * @subsection TABLEEXIT
    6579 *
    6580 * The TABLEEXIT callback is executed before the transformed problem is freed.
    6581 * In this function, the statistics table should free all resources that have been allocated for the solving process in
    6582 * \ref TABLEINIT.
    6583 *
    6584 * @subsection TABLEINITSOL
    6585 *
    6586 * The TABLEINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    6587 * begin. The statistics table may use this call to initialize its branch-and-bound specific data.
    6588 *
    6589 * @subsection TABLEEXITSOL
    6590 *
    6591 * The TABLEEXITSOL callback is executed before the branch-and-bound process is freed. The statistics table should use this
    6592 * call to clean up its branch-and-bound specific data.
    6593 */
    6594
    6595/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    6596
    6597/**@page BENDER How to add custom Benders' decomposition implementations
    6598 *
    6599 * Benders' decomposition is a very popular mathematical programming technique that is applied to solve structured
    6600 * problems. Problems that display a block diagonal structure are particularly amenable to the application of Benders'
    6601 * decomposition. Such problems are given by
    6602 *
    6603 * \f[
    6604 * \begin{array}[t]{rllclcl}
    6605 * \min & \displaystyle & c^{T}x & + & d^{T}y \\
    6606 * & \\
    6607 * subject \ to & \displaystyle & Ax & & & = & b \\
    6608 * & \\
    6609 * & \displaystyle & Tx & + & Hy & = & h \\
    6610 * & \\
    6611 * & & x & & & \in & \mathbb{Z}^{p}\times\mathbb{R}^{n - p} \\
    6612 * & & & & y & \in & \mathbb{R}^{m} \\
    6613 * \end{array}
    6614 * \f]
    6615 *
    6616 * The variables \f$x\f$ and \f$y\f$ are described as the first and second stage variables respectively. In the
    6617 * classical use of Benders' decomposition, it is a requirement that the all second stage variables are continuous.
    6618 * Extensions to the classical Benders' decomposition approach have permitted the use of more general second stage
    6619 * problems.
    6620 *
    6621 * The application of Benders' decomposition to the above problem results in a subproblem, given by
    6622 *
    6623 * \f[
    6624 * \begin{array}[t]{rll}
    6625 * \min & \displaystyle & d^{T}y \\
    6626 * & \\
    6627 * subject \ to & \displaystyle & Hy = h - T\bar{x} \\
    6628 * & \\
    6629 * & & y \in \mathbb{R}^{m} \\
    6630 * \end{array}
    6631 * \f]
    6632 *
    6633 * where \f$\bar{x}\f$ is a solution vector of the first stage variables. As such, the subproblem is a problem only in
    6634 * \f$y\f$. The dual solution to the subproblem, either an extreme point or extreme ray, is used to generate cuts that
    6635 * are added to the master problem. Let \f$\lambda\f$ be the vector of dual variables associated with the set of
    6636 * constraints from the subproblem. If, for a given \f$\bar{x}\f$, the subproblem is infeasible, then \f$\lambda\f$
    6637 * corresponds to a dual ray and is used to produce the cut
    6638 *
    6639 * \f[
    6640 * 0 \geq \lambda(h - Tx)
    6641 * \f]
    6642 *
    6643 * which eliminates \f$\bar{x}\f$ from the master problem. If, for a given \f$\bar{x}\f$, the subproblem is feasible,
    6644 * then \f$\lambda\f$ corresponds to a dual extreme point and is used to produce the cut
    6645 *
    6646 * \f[
    6647 * \varphi \geq \lambda(h - Tx)
    6648 * \f]
    6649 *
    6650 * where \f$\varphi\f$ is an auxiliary variable added to the master problem as an underestimator of the optimal
    6651 * subproblem objective function value.
    6652 *
    6653 * Given \f$\Omega^{p}\f$ and \f$\Omega^{r}\f$ as the sets of dual extreme points and rays of the subproblem,
    6654 * respectively, the Benders' decomposition master problem is given by
    6655 *
    6656 * \f[
    6657 * \begin{array}[t]{rll}
    6658 * \min & \displaystyle & c^{T}x + \varphi \\
    6659 * & \\
    6660 * subject \ to & \displaystyle & Ax = b \\
    6661 * & \\
    6662 * & \displaystyle & \varphi \geq \lambda(h - Tx) \quad \forall \lambda \in \Omega^{r}\\
    6663 * & \\
    6664 * & \displaystyle & 0 \geq \lambda(h - Tx) \quad \forall \lambda \in \Omega^{r} \\
    6665 * & \\
    6666 * & & x \in \mathbb{Z}^{p}\times\mathbb{R}^{n - p} \\
    6667 * & & \varphi \in \mathbb{R} \\
    6668 * \end{array}
    6669 * \f]
    6670 *
    6671 * The Benders' decomposition framework of SCIP allows the user to provide a custom implementation of many aspects of
    6672 * the Benders' decomposition algorithm. It is possible to implement multiple Benders' decompositions that work in
    6673 * conjunction with each other. Such a situation is where you may have different formulations of the Benders'
    6674 * decomposition subproblem.
    6675 *
    6676 * The current list of all Benders' decomposition implementations available in this release can be found \ref BENDERS
    6677 * "here".
    6678 *
    6679 * We now explain how users can add their own Benders' decomposition implementations.
    6680 * Take the default Benders' decomposition implementation (src/scip/benders_default.c) as an example. Same as all other
    6681 * default plugins, it is written in C. C++ users can easily adapt the code by using the scip::ObjBenders wrapper base
    6682 * class and implement the scip_...() virtual methods instead of the SCIP_DECL_BENDERS... callbacks.
    6683 *
    6684 * Additional documentation for the callbacks of a Benders' decomposition implementation, in particular for the
    6685 * input parameters, can be found in the file type_benders.h.
    6686 *
    6687 * Here is what you have to do to implement a custom Benders' decomposition:
    6688 * -# Copy the template files src/scip/benders_xyz.c and src/scip/benders_xyz.h into files "benders_mybenders.c" and
    6689 * "benders_mybenders.h".
    6690 \n
    6691 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    6692 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    6693 * -# Use SCIPincludeBendersMybenders() in order to include the Benders' decomposition into your SCIP instance, e.g., in
    6694 * the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    6695 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    6696 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mybenders".
    6697 * -# Adjust the properties of the Benders' decomposition (see \ref BENDERS_PROPERTIES).
    6698 * -# Define the Benders' decomposition data (see \ref BENDERS_DATA). This is optional.
    6699 * -# Implement the interface functions (see \ref BENDERS_INTERFACE).
    6700 * -# Implement the fundamental callbacks (see \ref BENDERS_FUNDAMENTALCALLBACKS).
    6701 * -# Implement the additional callbacks (see \ref BENDERS_ADDITIONALCALLBACKS). This is optional.
    6702 *
    6703 *
    6704 * @section BENDERS_PROPERTIES Properties of a Benders' decomposition
    6705 *
    6706 * At the top of the new file "benders_mybenders.c", you can find the Benders' decomposition properties.
    6707 * These are given as compiler defines.
    6708 * In the C++ wrapper class, you have to provide the Benders' decomposition properties by calling the constructor
    6709 * of the abstract base class scip::ObjBenders from within your constructor.
    6710 * The properties you have to set have the following meaning:
    6711 *
    6712 * \par BENDERS_NAME: the name of the Benders' decomposition.
    6713 * This name is used in the interactive shell to address the Benders' decomposition.
    6714 * Additionally, if you are searching for a Benders' decomposition with SCIPfindBenders(), this name is looked up.
    6715 * Names have to be unique: no two Benders' decompositions may have the same name.
    6716 *
    6717 * \par BENDERS_DESC: the description of the Benders' decomposition.
    6718 * This string is printed as a description of the Benders' decomposition in the interactive shell.
    6719 *
    6720 * \par BENDERS_PRIORITY: the priority of the Benders' decomposition.
    6721 * During the enforcement and checking of solutions in src/scip/cons_benders.c and src/scip/cons_benderslp.c, every
    6722 * active Benders' decompositions are called. The execution function of the Benders' decomposition calls each of the
    6723 * subproblems and generates cuts from their solutions. So the active Benders' decompositions are called in order of
    6724 * priority until a cut is generated or feasibility is proven.
    6725 * \n
    6726 * The priority of the Benders' decomposition should be set according to the difficulty of solving the subproblems and
    6727 * the generation of cuts. However, it is possible to prioritise the Benders' decompositions with respect to the
    6728 * strength of the subproblem formulation and the resulting cuts.
    6729 *
    6730 * \par BENDERS_CUTLP: should Benders' decomposition cuts be generated during the enforcement of LP solutions.
    6731 * This is a flag that is used by src/scip/cons_benders.c and src/scip/cons_benderslp.c to idicate whether the
    6732 * enforcement of LP solutions should involve solving the Benders' decomposition subproblems. This should be set to TRUE
    6733 * to have an exact solution algorithm. In the presence of multiple Benders' decomposition, it may be desired to enforce
    6734 * the LP solutions for only a subset of those implemented.
    6735 *
    6736 * \par BENDERS_CUTRELAX: should Benders' decomposition cuts be generated during the enforcement of relaxation solutions.
    6737 * This is a flag that is used by src/scip/cons_benders.c and src/scip/cons_benderslp.c to idicate whether the
    6738 * enforcement of relaxation solutions should involve solving the Benders' decomposition subproblems. This should be
    6739 * set to TRUE to have an exact solution algorithm. In the presence of multiple Benders' decomposition, it may be desired
    6740 * to enforce the relaxation solutions for only a subset of those implemented. This parameter will only take effect if
    6741 * external relaxation have been implemented.
    6742 *
    6743 * \par BENDERS_CUTPSEUDO: should Benders' decomposition subproblems be solved during the enforcement of pseudo solutions.
    6744 * This is a flag that is used by src/scip/cons_benders.c and src/scip/cons_benderslp.c to indicate whether the
    6745 * enforcement of pseudo solutions should involve solving the Benders' decomposition subproblems. This should be set to
    6746 * TRUE, since not enforcing pseudo solutions could result in an error or suboptimal result. During the enforcement of
    6747 * pseudo solutions, no cuts are generated. Only a flag to indicate whether the solution is feasible or if the LP should
    6748 * be solved again is returned.
    6749 *
    6750 * \par BENDERS_SHAREAUXVARS: should this Benders' decomposition use the auxiliary variables from the highest priority
    6751 * Benders' decomposition.
    6752 * This parameter only takes effect if multiple Benders' decompositions are implemented. Consider the case that two Benders'
    6753 * decompositions are implemented with different formulations of the subproblem. Since the subproblems in each of the
    6754 * decomposition will have the same optimal solution, then it is useful to only have a single auxiliary variable for the
    6755 * two different subproblems. This means that when an optimality cut is generated in the lower priority Benders'
    6756 * decomposition, the auxiliary variable from the highest priority Benders' decomposition will be added to the right
    6757 * hand side.
    6758 *
    6759 * @section BENDERS_DATA Benders' decomposition Data
    6760 *
    6761 * Below the header "Data structures" you can find a struct which is called "struct SCIP_BendersData".
    6762 * In this data structure, you can store the data of your Benders' decomposition. For example, you should store the adjustable
    6763 * parameters of the Benders' decomposition in this data structure. In a Benders' decomposition, user parameters for the
    6764 * number of subproblems and an array to store the subproblem SCIP instances could be useful.
    6765 * \n
    6766 * Defining Benders' decomposition data is optional. You can leave the struct empty.
    6767 *
    6768 * @section BENDERS_INTERFACE Interface Functions
    6769 *
    6770 * At the bottom of "benders_mybenders.c", you can find the interface function SCIPincludeBendersMybenders(),
    6771 * which also appears in "benders_mybenders.h"
    6772 * SCIPincludeBendersMybenders() is called by the user, if (s)he wants to include the Benders' decomposition,
    6773 * i.e., if (s)he wants to use the Benders' decomposition in his/her application.
    6774 *
    6775 * This function only has to be adjusted slightly.
    6776 * It is responsible for notifying SCIP of the presence of the Benders' decomposition. For this, you can either call SCIPincludeBenders(),
    6777 * or SCIPincludeBendersBasic() since SCIP version 3.0. In the latter variant, \ref BENDERS_ADDITIONALCALLBACKS "additional callbacks"
    6778 * must be added via setter functions as, e.g., SCIPsetBendersCopy(). We recommend this latter variant because
    6779 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    6780 * variant must be manually adjusted with every SCIP release containing new callbacks for Benders' decompositions in order to compile.
    6781 *
    6782 * If you are using Benders' decomposition data, you have to allocate the memory
    6783 * for the data at this point. You can do this by calling:
    6784 * \code
    6785 * SCIP_CALL( SCIPallocBlockMemory(scip, &bendersdata) );
    6786 * \endcode
    6787 * You also have to initialize the fields in "struct SCIP_BendersData" afterwards. For freeing the
    6788 * Benders' decomposition data, see \ref BENDERSFREE.
    6789 *
    6790 * You may also add user parameters for your Benders' decomposition, see \ref PARAM for how to add user parameters and
    6791 * the function SCIPincludeBendersDefault() in src/scip/benders_default.c for an example.
    6792 *
    6793 * It is advised to disable presolving for the Benders' decomposition master problem by calling SCIPsetPresolving() with
    6794 * the parameter SCIP_PARAMSETTING_OFF. Presolving should be disabled because reductions on the master problem could be
    6795 * invalid since constraints have been transferred to the subproblems. It is not necessary to disable all presolving,
    6796 * but care must be taken when it is used for the Benders' decomposition master problem.
    6797 *
    6798 * The Benders' decomposition constraint handler, see src/scip/cons_benders.c, includes a presolver for tightening the
    6799 * bound on the auxiliary variables. This presolver can be enabled with by setting "presolving/maxround" to 1 and
    6800 * "constraints/benders/maxprerounds" to 1. This presolver solves the Benders' decomposition subproblems without fixing
    6801 * the master problem variables to find a lower bound for the auxiliary variable.
    6802 *
    6803 *
    6804 * @section BENDERS_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Benders' decomposition
    6805 *
    6806 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    6807 * an operational algorithm.
    6808 * They are passed together with the Benders' decomposition itself to SCIP using SCIPincludeBenders() or SCIPincludeBendersBasic(),
    6809 * see @ref BENDERS_INTERFACE.
    6810 *
    6811 * Benders' decomposition plugins have two callbacks, @ref BENDERSGETVAR and @ref BENDERSCREATESUB that must be implemented.
    6812 *
    6813 * Additional documentation for the callbacks, in particular to their input parameters,
    6814 * can be found in type_benders.h.
    6815 *
    6816 * @subsection BENDERSGETVAR
    6817 *
    6818 * The BENDERSGETVAR callback provides a mapping between the master problem variables and their corresponding subproblem
    6819 * variables, and vice versa. The parameters of this function include the variable for which the mapped variable is
    6820 * desired and the problem number for the mapped variable. When requesting a subproblem variable for a given master
    6821 * problem variable, the master variable is input with the appropriate subproblem index. If a master problem variable is
    6822 * requested for a given subproblem variable, then the subproblem variable is input with the subproblem index given as
    6823 * -1.
    6824 *
    6825 * An example of how to implement the mapping between the master and subproblem variables is shown by
    6826 *
    6827 * @refsnippet{src/scip/benders_default.c,SnippetBendersGetvarDefault}
    6828 *
    6829 * In the above code snippet, the hashmaps providing the mapping between the master and subproblem variables are
    6830 * constructed in the <code>SCIP_STAGE_INIT</code> stage (see \ref BENDERSINIT).
    6831 *
    6832 * The requested variable is returned via the mappedvar parameter. There may not exist a corresponding master
    6833 * (subproblem) variable for every input subproblem (master) variable. In such cases were no corresponding variable
    6834 * exists, mappedvar must be returned as NULL.
    6835 *
    6836 * The mapped variables are retrieved by calling SCIPgetBendersMasterVar() and SCIPgetBendersSubproblemVar().
    6837 *
    6838 * The variable mapping must be created before <code>SCIP_STAGE_PRESOLVE</code> stage. This is because the variable
    6839 * mapping is required for checking solutions found by heuristics during presolving.
    6840 *
    6841 * @subsection BENDERSCREATESUB
    6842 *
    6843 * The BENDERSCREATESUB callback is executed during the <code>SCIP_STAGE_INIT</code> stage. In this function, the
    6844 * user must register the SCIP instances for each subproblem. The BENDERSCREATESUB callback is executed once for each
    6845 * subproblem. The user registers a subproblem by calling SCIPbendersAddSubproblem().
    6846 *
    6847 * It is possible to build the SCIP instance for the subproblem during the execution of this callback. However, it may
    6848 * be more convenient to build the subproblem instances during the problem creation stage of the master problem and
    6849 * store the subproblem SCIP instances in SCIP_BendersData. This approach is used in src/scip/benders_default.c.
    6850 *
    6851 * @section BENDERS_ADDITIONALCALLBACKS Additional Callbacks of a Benders' decomposition implementation
    6852 *
    6853 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    6854 * implemented for most applications, they can be used, for example, to initialize and free private data.
    6855 * Additional callbacks can either be passed directly with SCIPincludeBenders() to SCIP or via specific
    6856 * <b>setter functions</b> after a call of SCIPincludeBendersBasic(), see also @ref BENDERS_INTERFACE.
    6857 *
    6858 * @subsection BENDERSFREE
    6859 *
    6860 * If you are using Benders' decomposition data (see \ref BENDERS_DATA and \ref BENDERS_INTERFACE), you have to
    6861 * implement this function in order to free the Benders' decomposition data. This can be done by the following procedure:
    6862 *
    6863 * @refsnippet{src/scip/benders_default.c,SnippetBendersFreeDefault}
    6864 *
    6865 * If you have allocated memory for fields in your Benders' decomposition data, remember to free this memory
    6866 * before freeing the Benders' decomposition data itself.
    6867 * If you are using the C++ wrapper class, this function is not available.
    6868 * Instead, just use the destructor of your class to free the member variables of your class.
    6869 *
    6870 * @subsection BENDERSCOPY
    6871 *
    6872 * The BENDERSCOPY callback is executed when a SCIP instance is copied, e.g. to
    6873 * solve a sub-SCIP. By
    6874 * defining this callback as
    6875 * <code>NULL</code> the user disables the execution of the specified
    6876 * separator for all copied SCIP instances. This may deteriorate the performance
    6877 * of primal heuristics using sub-SCIPs.
    6878 *
    6879 * If a user wishes to employ the Large Neighbourhood Benders' Search, it is necessary for the BENDERSCOPY callback to
    6880 * be implemented. This is required because the sub-SCIP instances of large neighbourhood search heuristics can only
    6881 * access the implemented Benders' decomposition if it is copied via the BENDERSCOPY callback.
    6882 *
    6883 * @subsection BENDERSINIT
    6884 *
    6885 * The BENDERSINIT callback is executed after the problem is transformed.
    6886 * The Benders' decomposition implementation may, e.g., use this call to initialize its Benders' decomposition data. In
    6887 * src/scip/benders_default.c BENDERSINIT is used to create the mapping between the master and subproblem variables.
    6888 * The difference between the original and the transformed problem is explained in
    6889 * "What is this thing with the original and the transformed problem about?" on \ref FAQ.
    6890 *
    6891 * @subsection BENDERSEXIT
    6892 *
    6893 * The BENDERSEXIT callback is executed before the transformed problem is freed.
    6894 * In this function, the Benders' decomposition implementation should free all resources that have been allocated for
    6895 * the solving process in BENDERSINIT.
    6896 *
    6897 * @subsection BENDERSINITPRE
    6898 *
    6899 * The BENDERSINITPRE callback is executed before the preprocessing is started, even if presolving is turned off.
    6900 * The Benders' decomposition may use this call to initialize its presolving data before the presolving process begins.
    6901 *
    6902 * @subsection BENDERSEXITPRE
    6903 *
    6904 * The BENDERSEXITPRE callback is executed after the preprocessing has been finished, even if presolving is turned off.
    6905 * The Benders' decomposition implementation may use this call, e.g., to clean up its presolving data.
    6906 * Besides clean up, no time consuming operations should be done.
    6907 *
    6908 * @subsection BENDERSINITSOL
    6909 *
    6910 * The BENDERSINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    6911 * begin. The Benders' decomposition implementation may use this call to initialize its branch-and-bound specific data.
    6912 *
    6913 * @subsection BENDERSEXITSOL
    6914 *
    6915 * The BENDERSEXITSOL callback is executed before the branch-and-bound process is freed. The Benders' decomposition
    6916 * implementation should use this call to clean up its branch-and-bound data.
    6917 *
    6918 * @subsection BENDERSPRESUBSOLVE
    6919 *
    6920 * The BENDERSPRESUBSOLVE callback is provided to give the user an opportunity in each iteration to perform any setup
    6921 * operations prior to solving the subproblems. This callback also allows the user to skip the subproblem solve for the
    6922 * current iteration. In this case, the user must set the result parameter appropriately
    6923 * - the subproblem was not solved in this iteration. Other decompositions will be checked (SCIP_DIDNOTRUN).
    6924 * - a constraint has been added to the master problem. No other decompositions will be checked (SCIP_CONSADDED).
    6925 * - a cut has been added to the master problem. No other decompositions will be checked (SCIP_SEPARATED).
    6926 * - feasibility of the solution is reported to SCIP. Other decompositions will be checked (SCIP_FEASIBLE).
    6927 * - infeasibility of the solution is reported to SCIP. No other decompositions will be checked (SCIP_INFEASIBLE).
    6928 *
    6929 * @subsection BENDERSSOLVESUBCONVEX
    6930 *
    6931 * Two different subproblem solving functions are provide in the Benders' decomposition framework, BENDERSSOLVESUBCONVEX
    6932 * and BENDERSSOLVESUB. These two solving functions are used in the two solving loops of the Benders' decomposition
    6933 * framework. The first solving loop solves convex subproblems and convex relaxations of CIPs. The BENDERSSOLVESUBCONVEX
    6934 * callback is executed only during the FIRST solving loop. Benders' cut generating functions suitable for convex
    6935 * subproblems are executed during this solving loop. If a cut is found, then the second solve loop is not executed. If
    6936 * your decomposition does not have any convex subproblems, then it is not necessary to implement the
    6937 * BENDERSSOLVESUBCONVEX callback. However, it may be computationally beneficial to solve the convex relaxation of CIP
    6938 * subproblems, such as the LP relaxation of a MIP subproblem.
    6939 *
    6940 * The second solve loop expects that the CIP subproblems are solved to optimality.
    6941 *
    6942 * If you implement the BENDERSSOLVESUBCONVEX callback, it is necessary to implement the BENDERSFREESUB callback.
    6943 *
    6944 * The objective function value after the subproblem solve and the result must be returned. The permissible results
    6945 * are:
    6946 * - the subproblem was not solved in this iteration (SCIP_DIDNOTRUN)
    6947 * - the subproblem is solved and is feasible (SCIP_FEASIBLE)
    6948 * - the subproblem is solved and is infeasible (SCIP_INFEASIBLE)
    6949 * - the subproblem is solved and is unbounded (SCIP_UNBOUNDED)
    6950 *
    6951 * @subsection BENDERSSOLVESUB
    6952 *
    6953 * The BENDERSSOLVESUB is executed only during the SECOND solve loop. This callback is used to solve CIP
    6954 * subproblems. If your decomposition does not have any CIP subproblems, then it is not necessary to implement the
    6955 * BENDERSSOLVESUB callback.
    6956 *
    6957 * If you implement the BENDERSSOLVESUB callback, it is necessary to implement the BENDERSFREESUB callback.
    6958 *
    6959 * The objective function value after the subproblem solve and the result must be returned. The permissible results
    6960 * are:
    6961 * - the subproblem was not solved in this iteration (SCIP_DIDNOTRUN)
    6962 * - the subproblem is solved and is feasible (SCIP_FEASIBLE)
    6963 * - the subproblem is solved and is infeasible (SCIP_INFEASIBLE)
    6964 * - the subproblem is solved and is unbounded (SCIP_UNBOUNDED)
    6965 *
    6966 * @subsection BENDERSPOSTSOLVE
    6967 *
    6968 * The BENDERSPOSTSOLVE callback is executed after the subproblems have been solved and any required cuts have been
    6969 * generated, but before the subproblems are freed. This callback provides the user an opportunity to interact the
    6970 * subproblems at a global level. For example, the user is able to construct a solution to the original problem by
    6971 * combining the solutions from the master problem and all subproblems.
    6972 *
    6973 * Additionally, the user is able to merge subproblems into the master problem during the execution of this callback.
    6974 * The merging of subproblems into the master problem could be desired if it is too time consuming to satisfy the
    6975 * feasibility of a subproblem or the appropriate cutting functions are not available for the provided subproblem. A list
    6976 * of indicies of subproblems suitable for merging are given in the mergecands array. The first npriomergecands are the
    6977 * merge candidates that must be merged into the master problem. If they are not, then the solution process will
    6978 * terminate with an error. These merge candidates arise if a cut could not be generated due to numerical difficulties.
    6979 * The remaining nmergecands - npriomergecands are subproblems that could be merged into the master problem if desired
    6980 * by the user.
    6981 *
    6982 * @subsection BENDERSFREESUB
    6983 *
    6984 * The BENDERSFREESUB callback is executed to clean up the subproblems after the solving process and prepare them for
    6985 * the next iteration. Typically, SCIPfreeTransform() is called for each subproblem to free the transformed problem.
    6986 *
    6987 */
    6988
    6989/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    6990
    6991/**@page BENDERSCUT How to add custom Benders' decomposition cut generation functions
    6992 *
    6993 * The Benders' decomposition framework of SCIP allows the user to provide a custom implementation of cut generation
    6994 * method. The Benders' decomposition cut methods are linked to the Benders' decomposition implementations, not the
    6995 * master problem SCIP instance. As such, you are able to have different Benders' decomposition cut methods for each
    6996 * included Benders' decomposition.
    6997 * The current list of all Benders' decomposition cut generation methods available in this release can be found
    6998 * \ref BENDERSCUTS "here".
    6999 *
    7000 * We now explain how users can add their own Benders' decomposition cut methods. Take the default Benders'
    7001 * decomposition cut method (src/scip/benderscut_opt.c) as an example. This Benders' decomposition cut method generates
    7002 * a classical optimality cut from the optimal dual solution to the convex relaxation of the Benders' decomposition
    7003 * subproblem. Same as all other default plugins, it is written in C. C++ users can easily adapt the code by using the
    7004 * scip::ObjBenderscut wrapper base class and implement the scip_...() virtual methods instead of the
    7005 * SCIP_DECL_BENDERSCUT... callbacks.
    7006 *
    7007 * Additional documentation for the callbacks of a Benders' decomposition cut methods, in particular for the
    7008 * input parameters, can be found in the file type_benderscut.h.
    7009 *
    7010 * Here is what you have to do to implement a custom Benders' decomposition cut method:
    7011 * -# Copy the template files src/scip/benderscut_xyz.c and src/scip/benderscut_xyz.h into files "benderscut_mybenderscut.c" and
    7012 * "benderscut_mybenderscut.h".
    7013 \n
    7014 * Make sure to adjust your build system such that these files are compiled and linked to your project. \n
    7015 * If you are adding a new default plugin, this means updating the `src/CMakeLists.txt` and `Makefile` files in the SCIP distribution.
    7016 * -# Use SCIPincludeBenderscutMybenderscut() in order to include the Benders' decomposition cut method into your SCIP
    7017 * instance, e.g., in the main file of your project (see, e.g., src/cmain.c in the Binpacking example). \n
    7018 * If you are adding a new default plugin, this include function must be added to `src/scipdefplugins.c`.
    7019 * -# Open the new files with a text editor and replace all occurrences of "xyz" by "mybenderscut".
    7020 * -# Adjust the properties of the Benders' decomposition (see \ref BENDERSCUT_PROPERTIES).
    7021 * -# Define the Benders' decomposition data (see \ref BENDERSCUT_DATA). This is optional.
    7022 * -# Implement the interface functions (see \ref BENDERSCUT_INTERFACE).
    7023 * -# Implement the fundamental callbacks (see \ref BENDERSCUT_FUNDAMENTALCALLBACKS).
    7024 * -# Implement the additional callbacks (see \ref BENDERSCUT_ADDITIONALCALLBACKS). This is optional.
    7025 *
    7026 *
    7027 * @section BENDERSCUT_PROPERTIES Properties of a Benders' decomposition
    7028 *
    7029 * At the top of the new file "benderscut_mybenderscut.c", you can find the Benders' decomposition cut methods
    7030 * properties. These are given as compiler defines.
    7031 * In the C++ wrapper class, you have to provide the Benders' decomposition properties by calling the constructor
    7032 * of the abstract base class scip::ObjBenderscut from within your constructor.
    7033 * The properties you have to set have the following meaning:
    7034 *
    7035 * \par BENDERSCUT_NAME: the name of the Benders' decomposition cut method.
    7036 * This name is used in the interactive shell to address the Benders' decomposition cut method.
    7037 * Additionally, if you are searching for a Benders' decomposition cut method with SCIPfindBenderscut(), this name is
    7038 * looked up. Names have to be unique: no two Benders' decomposition cut methods linked to the same Benders'
    7039 * decomposition may have the same name.
    7040 *
    7041 * \par BENDERSCUT_DESC: the description of the Benders' decomposition cut method.
    7042 * This string is printed as a description of the Benders' decomposition cut method in the interactive shell.
    7043 *
    7044 * \par BENDERSCUT_PRIORITY: the priority of the Benders' decomposition cut method.
    7045 * In each of the Benders' decomposition subproblem solving loops, the included Benders' decomposition cut methods are
    7046 * called in order of priority. The priority is important because once a cut is generated for a subproblem, no other
    7047 * cuts are generated for that subproblem for that solving loop.
    7048 * \n
    7049 * The priority of the Benders' decomposition should be set according to the order in which the cut should be generated.
    7050 * For example, the priority of the included cuts attempt to generation feasibility cuts (src/scip/benderscut_feas.c
    7051 * and src/scip/benderscut_nogood.c) prior to attempting to generate optimality cuts.
    7052 *
    7053 * \par BENDERSCUT_LPCUT: Can this cut be applied to convex subproblems and convex relaxations of CIP subproblems?
    7054 * Since the Benders' decomposition framework executes two different solving loops, one for convex subproblems and the
    7055 * other for CIP subproblems, the Benders' decomposition cut methods must be partitioned by their suitability for each
    7056 * subproblem type. If BENDERSCUT_LPCUT is set to TRUE, then this cut is only applied to convex subproblems and convex
    7057 * relaxations of CIP subproblems.
    7058 *
    7059 * @section BENDERSCUT_DATA Benders' decomposition Data
    7060 *
    7061 * Below the header "Data structures" you can find a struct which is called "struct SCIP_BenderscutData".
    7062 * In this data structure, you can store the data of your Benders' decomposition. For example, you should store the adjustable
    7063 * parameters of the Benders' decomposition in this data structure. In a Benders' decomposition, user parameters for the
    7064 * number of subproblems and an array to store the subproblem SCIP instances could be useful.
    7065 * \n
    7066 * Defining Benders' decomposition data is optional. You can leave the struct empty.
    7067 *
    7068 * @section BENDERSCUT_INTERFACE Interface Functions
    7069 *
    7070 * At the bottom of "benderscut_mybenderscut.c", you can find the interface function SCIPincludeBenderscutMybenderscut(),
    7071 * which also appears in "benderscut_mybenderscut.h"
    7072 * SCIPincludeBenderscutMybenderscut() is called by the user, if (s)he wants to include the Benders' decomposition,
    7073 * i.e., if (s)he wants to use the Benders' decomposition in his/her application.
    7074 *
    7075 * This function only has to be adjusted slightly.
    7076 * It is responsible for notifying SCIP of the presence of the Benders' decomposition. For this, you can either call SCIPincludeBenderscut(),
    7077 * or SCIPincludeBenderscutBasic() since SCIP version 3.0. In the latter variant, \ref BENDERSCUT_ADDITIONALCALLBACKS "additional callbacks"
    7078 * must be added via setter functions as, e.g., SCIPsetBenderscutCopy(). We recommend this latter variant because
    7079 * it is more stable towards future SCIP versions which might have more callbacks, whereas source code using the first
    7080 * variant must be manually adjusted with every SCIP release containing new callbacks for Benders' decompositions in order to compile.
    7081 *
    7082 * If you are using Benders' decomposition cut data, you have to allocate the memory
    7083 * for the data at this point. You can do this by calling:
    7084 * \code
    7085 * SCIP_CALL( SCIPallocBlockMemory(scip, &benderscutdata) );
    7086 * \endcode
    7087 * You also have to initialize the fields in "struct SCIP_BenderscutData" afterwards. For freeing the
    7088 * Benders' decomposition cut data, see \ref BENDERSCUTFREE.
    7089 *
    7090 * You may also add user parameters for your Benders' decomposition, see \ref PARAM for how to add user parameters and
    7091 * the function SCIPincludeBenderscutOpt() in src/scip/benderscut_opt.c for an example.
    7092 *
    7093 *
    7094 * @section BENDERSCUT_FUNDAMENTALCALLBACKS Fundamental Callbacks of a Benders' decomposition cut function
    7095 *
    7096 * The fundamental callbacks of the plugins are the ones that have to be implemented in order to obtain
    7097 * an operational algorithm.
    7098 * They are passed together with the Benders' decomposition itself to SCIP using SCIPincludeBenderscut() or SCIPincludeBenderscutBasic(),
    7099 * see @ref BENDERSCUT_INTERFACE.
    7100 *
    7101 * Benders' decomposition cut methods have only one callback, @ref BENDERSCUTEXEC, that must be implemented.
    7102 *
    7103 * Additional documentation for the callbacks, in particular to their input parameters,
    7104 * can be found in type_benderscut.h.
    7105 *
    7106 * @subsection BENDERSCUTEXEC
    7107 *
    7108 * The BENDERSCUTEXEC callback is called during the cut generation process within the Benders' decomposition subproblem
    7109 * solving loop. This function must generate a cut for the given subproblem if the associated subsystem is not optimal
    7110 * with respect to the checked master problem solution.
    7111 *
    7112 * When generating cuts, it is possible to store these within the SCIP_BendersData of the associated Benders'
    7113 * decomposition. This is achieved by calling SCIPstoreBenderscutCons() (SCIPstoreBenderscutCut() if the Benders'
    7114 * decomposition cut is added as a cutting plane instead as a constraint). The storing of cuts can be useful when using
    7115 * the large neighbourhood Benders' search, where the cut generated in the sub-SCIP solve are transferred to the main
    7116 * SCIP instance.
    7117 *
    7118 * The BENDERSCUTEXEC callback must return the result of the cut generation. The permissable results are:
    7119 * - if the Benders' cut was not run (SCIP_DIDNOTRUN).
    7120 * - if the Benders' cut was run, but there was an error in generating the cut (SCIP_DIDNOTFIND).
    7121 * - if the Benders' decomposition cut algorithm has not generated a constraint or cut (SCIP_FEASIBLE).
    7122 * - an additional constraint for the Benders' decomposition cut was generated (SCIP_CONSADDED).
    7123 * - a cutting plane representing the Benders' decomposition cut was generated (SCIP_SEPARATED).
    7124 *
    7125 * If the BENDERSCUTEXEC callback returns SCIP_DIDNOTFIND due to an error in the cut generation, if no other subproblems
    7126 * generate a cut during the same iteration of the Benders' decomposition algorithm, then this could result in an
    7127 * error. It is possible to avoid the error by merging the subproblem into the master problem (see \ref
    7128 * BENDERSPOSTSOLVE).
    7129 *
    7130 * @section BENDERSCUT_ADDITIONALCALLBACKS Additional Callbacks of a Separator
    7131 *
    7132 * The additional callbacks do not need to be implemented in every case. However, some of them have to be
    7133 * implemented for most applications, they can be used, for example, to initialize and free private data.
    7134 * Additional callbacks can either be passed directly with SCIPincludeBenderscut() to SCIP or via specific
    7135 * <b>setter functions</b> after a call of SCIPincludeBenderscutBasic(), see also @ref BENDERSCUT_INTERFACE.
    7136 *
    7137 * @subsection BENDERSCUTFREE
    7138 *
    7139 * If you are using Benders' decomposition cut data (see \ref BENDERSCUT_DATA and \ref BENDERSCUT_INTERFACE), you have
    7140 * to implement this function in order to free the Benders' decomposition cut data.
    7141 *
    7142 * If you have allocated memory for fields in your Benders' decomposition cut data, remember to free this memory
    7143 * before freeing the Benders' decomposition data itself.
    7144 * If you are using the C++ wrapper class, this method is not available.
    7145 * Instead, just use the destructor of your class to free the member variables of your class.
    7146 *
    7147 * @subsection BENDERSCUTCOPY
    7148 *
    7149 * The BENDERSCUTCOPY callback is executed when a SCIP instance is copied, e.g. to
    7150 * solve a sub-SCIP. By
    7151 * defining this callback as
    7152 * <code>NULL</code> the user disables the execution of the specified
    7153 * separator for all copied SCIP instances. This may deteriorate the performance
    7154 * of primal heuristics using sub-SCIPs.
    7155 *
    7156 * If the Benders' decomposition cuts are included by calling SCIPincludeBendersDefaultCuts() in the include function of
    7157 * the Benders' decomposition implementation, such as SCIPincludeBendersDefault(), then it is not necessary to implement
    7158 * BENDERSCUTCOPY. The copy function could be implemented to copy Benders' decomposition cut data from the original SCIP
    7159 * instance to the sub-SCIP.
    7160 *
    7161 *
    7162 * @subsection BENDERSCUTINIT
    7163 *
    7164 * The BENDERSCUTINIT callback is executed after the problem is transformed The Benders' decomposition cut method may,
    7165 * e.g., use this call to initialize its Benders' decomposition cut data. The difference between the original and the
    7166 * transformed problem is explained in "What is this thing with the original and the transformed problem about?" on \ref
    7167 * FAQ.
    7168 *
    7169 * @subsection BENDERSCUTEXIT
    7170 *
    7171 * The BENDERSCUTEXIT callback is executed before the transformed problem is freed. In this function, the Benders'
    7172 * decomposition cut method should free all resources that have been allocated for the solving process in
    7173 * BENDERSCUTINIT.
    7174 *
    7175 * @subsection BENDERSCUTINITSOL
    7176 *
    7177 * The BENDERSCUTINITSOL callback is executed when the presolving is finished and the branch-and-bound process is about to
    7178 * begin. The Benders' decomposition implementation may use this call to initialize its branch-and-bound specific data.
    7179 *
    7180 * @subsection BENDERSCUTEXITSOL
    7181 *
    7182 * The BENDERSCUTEXITSOL callback is executed before the branch-and-bound process is freed. The Benders' decomposition
    7183 * implementation should use this call to clean up its branch-and-bound data.
    7184 *
    7185 */
    7186/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7187
    7188/**@page CONF How to use conflict analysis
    7189 *
    7190 * Conflict analysis is a way to automatically use the information obtained from infeasible nodes
    7191 * in the branch-and-bound tree.
    7192 *
    7193 * Once a node is declared infeasible, SCIP automatically tries to infer a constraint that explains the reason for the
    7194 * infeasibility, in order to avoid similar situations later in the search. This explanation essentially consists of a
    7195 * constraint stating that at least one of its variables should have a bound different from the current infeasible node,
    7196 * because the current setting led to infeasibility. Clearly, all variables that are fixed in the current infeasible
    7197 * node would yield such a constraint (since this leads to infeasibility). The key point rather is to infer a "small"
    7198 * constraint that does the same job. SCIP handles this by several heuristics. For this, SCIP sets up a
    7199 * so-called (directed) conflict graph. The nodes in this graph correspond to bound changes of variables and an arc (@a
    7200 * u, @a v) means that the bound change corresponding to @a v is based on the bound change of @a u. In general, a node
    7201 * will have several ingoing arcs which represent all bound changes that have been used to infer (propagate) the bound
    7202 * change in question. The graph also contains source nodes for each bound that has been changed during branching and an
    7203 * artificial target node representing the conflict, i.e., the infeasibility. Essentially, SCIP heuristically constructs
    7204 * a cut in this graph that involves few "branching nodes". For details on the techniques that SCIP uses,
    7205 * we refer to the paper @par
    7206 * Tobias Achterberg, Conflict Analysis in Mixed Integer Programming@n
    7207 * Discrete Optimization, 4, 4-20 (2007)
    7208 *
    7209 * For conflict analysis to work well, the author of a \ref CONS "Constraint Handler" or a
    7210 * \ref PROP "Propagator" has to implement three kinds of functionality:
    7211 *
    7212 * -# If one detects infeasibility, one should initiate conflict analysis, see \ref INITCONFS "below".
    7213 * -# During propagation, one should call the right functions to fix variables.
    7214 * -# One should implement the <em>so-called reverse propagation</em>.
    7215 *
    7216 * If this functionality is not implemented, SCIP will still work correctly, but cannot use the information of the constraint
    7217 * handler or the propagator for conflict analysis. In this case, each bound reduction performed by the constraint
    7218 * handler/propagator will be treated as if it had been a branching decision.
    7219 *
    7220 * @section INITCONFS Initiating Conflict Analysis
    7221 *
    7222 * If one detects infeasibility within propagation, one should do the following:
    7223 * -# Call SCIPinitConflictAnalysis().
    7224 * -# Inform SCIP about the variable bounds that are the reason for the detection of infeasibility
    7225 * via the functions SCIPaddConflictLb(), SCIPaddConflictUb(), SCIPaddConflictBd(), or
    7226 * SCIPaddConflictBinvar(). If there is more than one valid explanation of infeasibility, either one can be used.
    7227 * Typically, smaller explanations tend to be better.
    7228 * -# Call SCIPanalyzeConflict() from a propagator or SCIPanalyzeConflictCons() from a constraint
    7229 * handler.
    7230 *
    7231 * This functionality allows SCIP to set up the conflict graph and perform a conflict analysis.
    7232 *
    7233 * @section Propagation
    7234 *
    7235 * When propagating variable domains, SCIP needs to be informed that the deduced variable bounds should be
    7236 * used in conflict analysis. This can be done by the functions SCIPinferVarLbCons(),
    7237 * SCIPinferVarUbCons(), and SCIPinferBinvarCons() for constraint handlers and SCIPinferVarLbProp(),
    7238 * SCIPinferVarUbProp(), and SCIPinferBinvarProp() for propagators. You can pass one integer of
    7239 * information that should indicate the reason of the propagation and can be used in reverse
    7240 * propagation, see the next section.
    7241 *
    7242 * @section RESPROP Reverse Propagation
    7243 *
    7244 * Reverse Propagation is used to build up the conflict graph. Essentially, it provides an algorithm to detect the arcs
    7245 * leading to a node in the conflict graph, i.e., the bound changes responsible for the new bound change deduced during
    7246 * propagation. Reverse Propagation needs to be implemented in the RESPROP callbacks of
    7247 * \ref CONSRESPROP "constraint handlers" or \ref PROPRESPROP "propagators".
    7248 * These callbacks receive the following information: the variable which is under investigation (@p
    7249 * infervar), the corresponding bound change (@p bdchgidx, @p boundtype), and the integer (@p inferinfo) that has been
    7250 * supplied during propagation.
    7251 *
    7252 * One can use SCIPgetVarUbAtIndex() or SCIPgetVarLbAtIndex() to detect the bounds before or after the propagation that
    7253 * should be investigated. Then the bounds that were involved should be passed to SCIP via SCIPaddConflictLb() and
    7254 * SCIPaddConflictUb(). If there is more than one valid explanation of infeasibility, either one can be used.
    7255 * Typically, smaller explanations tend to be better.
    7256 *
    7257 * Details and (more) examples are given in Sections @ref CONSRESPROP and @ref PROPRESPROP.
    7258 *
    7259 *
    7260 * @section Example
    7261 *
    7262 * Consider the constraint handler @p cons_linearordering.c in the
    7263 * \ref LOP_MAIN "linear ordering example"
    7264 * (see @p example/LOP directory). This constraint handler propagates the equations \f$x_{ij} + x_{ji} =
    7265 * 1\f$ and triangle inequalities \f$x_{ij} + x_{jk} + x_{ki} \leq 2\f$.
    7266 *
    7267 * When propagating the equation and <code>vars[i][j]</code> is fixed to 1, the constraint handler uses
    7268 * \code
    7269 * SCIP_CALL( SCIPinferBinvarCons(scip, vars[j][i], FALSE, cons, i*n + j, &infeasible, &tightened) );
    7270 * \endcode
    7271 * Thus, variable <code>vars[j][i]</code> is fixed to 0 (@p FALSE), and it passes <code>i*n + j </code> as @p inferinfo.
    7272 *
    7273 * When it propagates the triangle inequality and both <code>vars[i][j]</code> and <code>vars[j][k]</code>
    7274 * are fixed to 1, the constraint handler uses
    7275 * \code
    7276 * SCIP_CALL( SCIPinferBinvarCons(scip, vars[k][i], FALSE, cons, n*n + i*n*n + j*n + k, &infeasible, &tightened) );
    7277 * \endcode
    7278 * Thus, in this case, variable <code>vars[k][i]</code> is fixed to 0 and <code>n*n + i*n*n + j*n + k</code> is
    7279 * passed as <code>inferinfo</code>.
    7280 *
    7281 * In reverse propagation, the two cases can be distinguished by @p inferinfo: if it is less than @p n*n,
    7282 * we deal with an equation, otherwise with a triangle inequality. The constraint handler can then extract the
    7283 * indices @p i, @p j (and @p k in the second case) from inferinfo.
    7284 *
    7285 * In the first case, it has to distinguish whether <code>vars[i][j]</code> is fixed to 0 or 1 &ndash;
    7286 * by calling SCIPaddConflictLb()
    7287 * or SCIPaddConflictUb(), respectively, with variable <code>vars[j][i]</code>. In the second case, it is clear that the only
    7288 * possible propagation is to fix <code>vars[i][j]</code> to 0 when both <code>vars[k][i]</code> and <code>vars[j][k]</code>
    7289 * are fixed to 1. It then calls
    7290 * SCIPaddConflictLb() for both <code>vars[k][i]</code> and <code>vars[j][k]</code>.
    7291 */
    7292
    7293/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7294
    7295/**@page REOPT How to use reoptimization
    7296 *
    7297 * The reoptimization feature of SCIP can be used to solve a sequence of optimization problems \f$(P_{i})_{i \in I}\f$ with
    7298 * \f[
    7299 * (P_i) \quad \min \{ c_i^T x \;|\; A^ix \geq b^i,\; x_{j} \in \mathbb{Z}\;\forall j \in \mathcal{I} \}
    7300 * \f]
    7301 * such that between two problems \f$P_i\f$ and \f$P_{i+1}\f$ the space of solutions gets restricted and/or the objective
    7302 * function changes. To use reoptimization the user has to change the parameter <code>reoptimization/enable</code> to
    7303 * <code>TRUE</code> before the solving process of the first problem of the sequence starts, i.e., in stage
    7304 * <code>SCIP_STAGE_INIT</code> or <code>SCIP_STAGE_PROBLEM</code>. This can be done via the interactive shell or by
    7305 * calling SCIPenableReoptimization(). In both cases SCIP changes some parameters and fixes them:
    7306 * -# disable conflict analysis based on dual information
    7307 * -# set the limit <code>maxorigsol</code> of stored solutions to zero because this is handled by a special solution tree provided
    7308 * by the reoptimization feature itself
    7309 * -# disable restarts (<code>presolving/maxrestarts = 0</code>)
    7310 * -# disable multi-aggegations (<code>presolving/donotmultaggr = TRUE</code>)
    7311 * -# disable dual reductions within presolvers and propagators (<code>misc/allowdualreds = FALSE</code>)
    7312 * -# disable propagation with current cutoff bound (<code>misc/allowobjprop = FALSE</code>)
    7313 *
    7314 * In contrast to the presolving and propagating functions that are using dual information, performing strong branching is
    7315 * allowed. The bound tightenings resulting from strong branching are handeled in a special way. After changing the objective
    7316 * function and solving the modified problem the feasible region that was pruned by strong branching will be reconstructed
    7317 * within the tree.
    7318 *
    7319 * If the reoptimization feature is enabled SCIP tries to reuse the search tree, especially the search frontier at the end
    7320 * of the solving process, to speed up the solving process of the following problems. Therefore, the current release
    7321 * provides the branching rule <code>branch_nodereopt</code> to reconstruct the tree. SCIP triggers a restart of the
    7322 * reoptimization, i.e., solving the problem from scratch, if
    7323 *
    7324 * -# the stored search tree is too large,
    7325 * -# the objective functions changed too much, or
    7326 * -# the last \f$n\f$ optimal solution are updated solution of previous runs.
    7327 *
    7328 * The thresholds to trigger a restart can be set by the user:
    7329 *
    7330 * -# <code>reoptimization/maxsavednodes</code>
    7331 * -# <code>reoptimization/delay</code>
    7332 * -# <code>reoptimization/forceheurrestart</code>
    7333 *
    7334 * Before SCIP discards all the stored information and solves the problem from scratch it tries to compress the search
    7335 * tree. Therefore, the current release provides compression heuristics that try to find a good and much smaller
    7336 * representation of the current search tree.
    7337 *
    7338 * After a problem in the sequence of optimization problems was solved, the objective function can be changed in two ways:
    7339 * -# Using the provided reader <code>reader_diff</code> the objective function can be changed via using the interactive
    7340 * shell
    7341 * \code
    7342 * SCIP> read new_obj.diff
    7343 * \endcode
    7344 * or by calling SCIPreadDiff().
    7345 * -# The objective function can be changed within the code. Therefore, the transformed problem needs to be freed by
    7346 * calling SCIPfreeReoptSolve(). Afterwards, the new objective function can be installed by calling
    7347 * SCIPchgReoptObjective().
    7348 *
    7349 * After changing the objective function the modified problem can be solved as usal.
    7350 *
    7351 * \note Currently, the compression heuristics used between two successive reoptimization runs only support pure binary
    7352 * and mixed binary programs.
    7353 *
    7354 * For more information on reoptimization we refer to@par
    7355 * Jakob Witzig@n
    7356 * Reoptimization Techniques in MIP Solvers@n
    7357 * Master's Thesis, Technical University of Berlin, 2014.
    7358 */
    7359
    7360/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7361
    7362/**@page CONCSCIP How to use the concurrent solving mode
    7363 *
    7364 * @section Overview
    7365 *
    7366 * In \SCIP 4.0 a new feature has been added that allows to run multiple \SCIP instances with different settings
    7367 * on one problem in parallel. To use this feature \SCIP has to be compiled with an additional make option to
    7368 * enable the threading functionality (e.g. TPI=tny, see \ref MAKE).
    7369 * Then, a concurrent solve can be started by using the <code>concurrentopt</code> command instead of the <code>optimize</code> command
    7370 * in the \SCIP shell, or by calling the interface function SCIPsolveConcurrent().
    7371 * To configure the behavior of the concurrent solving mode there are new parameters in the category <code>concurrent/</code>
    7372 * and <code>parallel/</code> which will be explained here shortly.
    7373 *
    7374 * @section CONTROLNTHREADS Controlling the number of threads
    7375 *
    7376 * The parameters <code>parallel/maxnthreads</code> and <code>parallel/minnthreads</code> can be used to configure the number of threads
    7377 * that sould be used for solving. \SCIP will try to use the configured maximum number of threads. If the
    7378 * problem that is currently read is too large \SCIP will automatically use fewer threads, but never
    7379 * go below the configured minimum number of threads.
    7380 *
    7381 * @section USEEMPHSETTINGS Using emphasis settings
    7382 *
    7383 * The parameters <code>concurrent/scip.../prefprio</code> configure which concurrent solvers should be used.
    7384 * The concurrent solver <code>scip</code> will use the same settings as the \SCIP instance configured by the user.
    7385 * The other concurrent solvers, e.g. <code>scip-feas</code>, will load the corresponding emphasis setting.
    7386 * The behavior of the prefprio parameter is as follows: If it is set to 1.0 for <code>scip-feas</code> and
    7387 * <code>scip-opti</code>, and to 0.0 for every other concurrent solver, then the threads will be evenly
    7388 * distributed between the two types <code>scip-feas</code> and <code>scip-opti</code>. An example: if 4 threads are used each of these concurrent
    7389 * solvers will use 2 threads. If the <code>prefprio</code> for one solver is set to 0.33 and the other is set to 1.0, then the former will use 1 thread
    7390 * and the latter will use 3 threads of the 4 available threads.
    7391 *
    7392 * @section CUSTOMCONCSOLVERS Running custom solvers
    7393 *
    7394 * To use custom settings for the concurrent solvers there is the parameter <code>concurrent/paramsetprefix</code>. If custom parameters
    7395 * should be loaded by the concurrent solvers, then it must point to the folder where they are located (including a path separator at the end).
    7396 * The parameter settings must be named after the concurrent solvers, e.g. if only the concurrent solver <code>scip</code> is used
    7397 * they should be named <code>scip-1</code>, <code>scip-2</code>, <code>scip-3</code>. When different types of concurrent solvers are used the counter
    7398 * starts at one for each of them, e.g. <code>scip-1</code> and <code>scip-feas-1</code>.
    7399 */
    7400
    7401/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7402
    7403/**@page MINUCIIS How to deduce reasons for infeasibility in SCIP
    7404 *
    7405 * It is a common problem for integer programming practitioners to (unexpectedly) encounter infeasible instances.
    7406 * Often it desirable to better understand exactly why the instance is infeasible. Was it an error in the
    7407 * input data, was the underlying formulation incorrect, or is my model simply infeasible by construction?
    7408 * There are two main ways to analyse infeasible instances using SCIP:
    7409 *
    7410 * Firstly, there is IIS (irreducible infeasible subsystem) functionality in SCIP.
    7411 * This produces an infeasible problem, which contains a subset of constraints and variable bounds from
    7412 * the original problem. The infeasible problem is also irreducible, in that removing any additional
    7413 * constraints results in the problem becoming feasible. This is a fantastic method for debugging
    7414 * problems, and for determining what needs to be changed in the formulation. To use this functionality
    7415 * in the SCIP shell do the following
    7416 * \code
    7417 * SCIP> read path_to_instance
    7418 * SCIP> iis
    7419 * \endcode
    7420 * This will read in your instance and then compute an IIS of your infeasible instance.
    7421 * To display or print the subscip that contains the modified instance that is still
    7422 * infeasible, and hopefully substantially smaller, do the following
    7423 * \code
    7424 * SCIP> display/iis
    7425 * SCIP> write/iis path_to_where_iis_should_be_printed
    7426 * \endcode
    7427 *
    7428 * Secondly there is the MinUC (minimize number of unsatisfied constraints) functionality in SCIP.
    7429 * This produces a minimum set of constraints, such that if those constraints were relaxed, the original
    7430 * problem would be feasible. To use this functionality in the SCIP shell do the following
    7431 * \code
    7432 * SCIP> read path_to_instance
    7433 * SCIP> change/minuc
    7434 * SCIP> optimize
    7435 * \endcode
    7436 * The second command changes the loaded problem to now minimize the number of
    7437 * unsatisfied constraints. The primal bound during solving corresponds to current best solution,
    7438 * i.e., a set of constraints which when removed or relaxed will induce feasibility.
    7439 * One can view the constraints that art part of the MinUC by seeing which of the variables
    7440 * have value 1. The variables in the new problem have naming conventions `originalconsname_master`.
    7441 * The solution can be displayed in the shell with the command
    7442 * \code
    7443 * SCIP> display/solution
    7444 * \endcode
    7445 *
    7446 */
    7447
    7448/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7449
    7450/**@page DECOMP How to provide a problem decomposition
    7451 *
    7452 * Most mixed-integer programs have sparse constraint matrices in the sense that most columns and rows have only very few nonzero entries,
    7453 * maybe except for a few outlier columns/rows with many nonzeros.
    7454 * A decomposition identifies subproblems (subsets of rows and columns) that are only linked to each other via a set of linking rows and/or linking
    7455 * columns, but are otherwise independent.
    7456 * The special case of completely independent subproblems (with no linking rows and columns), for example, can be solved by solving
    7457 * the much smaller subproblems and concatenating their optimal solutions.
    7458 * This case has already been integrated into SCIP as a successful presolving technique (see @ref cons_components.c).
    7459 * Another use of decomposition within SCIP is the @ref BENDDECF "Benders Decomposition framework".
    7460 *
    7461 * Since SCIP 7.0, it is easier to pass user decompositions to SCIP that can be used within Benders decomposition or by user algorithms.
    7462 * This page introduces the struct SCIP_DECOMP and gives examples how to create and use it.
    7463 *
    7464 * @section DECOMP_OVERVIEW Overview
    7465 *
    7466 * In the following, we present decompositions of mixed-integer programs. However, the generalization to Constraint Integer Programs is straightforward.
    7467 *
    7468 * Concretely, for \f$k \geq 0\f$ we call a partition \f$\mathcal{D}=(D^{\text{row}},D^{\text{col}})\f$ of the rows and columns of the constraint matrix \f$A\f$ into \f$k + 1\f$ pieces each,
    7469 *
    7470 * \f[
    7471 * D^{\text{row}} = (D^{\text{row}}_{1},\dots,D^{\text{row}}_{k},L^{\text{row}}), \quad D^{\text{col}} = (D^{\text{col}}_{1},\dots,D^{\text{col}}_{k},L^{\text{col}})
    7472 * \f]
    7473 * a decomposition of \f$A\f$ if \f$D^{\text{row}}_{q} \neq \emptyset\f$, \f$D^{\text{col}}_{q} \neq \emptyset\f$ for \f$q \in \{1,\dots,k\}\f$ and if it holds for all \f$i\in D^{\text{row}}_{q_{1}}, j\in D^{\text{col}}_{q_{2}}\f$ that \f$a_{i,j} \neq 0 \Rightarrow q_{1} = q_{2}\f$.
    7474 * The special rows \f$L^{\text{row}}\f$ and columns \f$L^{\text{col}}\f$, which may be empty, are called linking rows and linking columns, respectively.
    7475 * In other words, the inequality system \f$A x \geq b\f$ can be rewritten
    7476 * with respect to a decomposition \f$\mathcal{D}\f$ by a suitable permutation of the rows
    7477 * and columns of \f$A\f$ as equivalent system
    7478 * \f[
    7479 * \left(
    7480 * \begin{matrix}
    7481 * A_{[D^{\text{row}}_{1},D^{\text{col}}_{1}]} &
    7482 * 0 &
    7483 * \cdots &
    7484 * 0 &
    7485 * A_{[D^{\text{row}}_{1},L^{\text{col}}]}\\
    7486 * 0 &
    7487 * A_{[D^{\text{row}}_{2},D^{\text{col}}_{2}]} &
    7488 * 0 &
    7489 * 0 &
    7490 * A_{[D^{\text{row}}_{2},L^{\text{col}}]}\\
    7491 * \vdots &
    7492 * 0 &
    7493 * \ddots &
    7494 * 0 &
    7495 * \vdots\\
    7496 * 0 &
    7497 * \cdots &
    7498 * 0 &
    7499 * A_{[D^{\text{row}}_{k},D^{\text{col}}_{k}]} &
    7500 * A_{[D^{\text{row}}_{k},L^{\text{col}}]}\\
    7501 * A_{[L^{\text{row}},D^{\text{col}}_{1}]} &
    7502 * A_{[L^{\text{row}},D^{\text{col}}_{2}]} &
    7503 * \cdots &
    7504 * A_{[L^{\text{row}},D^{\text{col}}_{k}]} &
    7505 * A_{[L^{\text{row}},L^{\text{col}}]}
    7506 * \end{matrix}
    7507 * \right)
    7508 * \left(
    7509 * \begin{matrix}
    7510 * x_{[D^{\text{col}}_{1}]}\\
    7511 * x_{[D^{\text{col}}_{2}]}\\
    7512 * \vdots\\
    7513 * x_{[D^{\text{col}}_{k}]}\\
    7514 * x_{[L^{\text{col}}]}
    7515 * \end{matrix}
    7516 * \right)
    7517 * \geq
    7518 * \left(
    7519 * \begin{matrix}
    7520 * b_{[D^{\text{row}}_{1}]}\\
    7521 * b_{[D^{\text{row}}_{2}]}\\
    7522 * \vdots\\
    7523 * b_{[D^{\text{row}}_{k}]}\\
    7524 * b_{[L^{\text{row}}]}
    7525 * \end{matrix}
    7526 * \right)
    7527 * % A= \left(\begin{matrix}4&8&\frac{1}{2}\\\frac{3}{2}&4&1\\1&3&7\end{matrix}\right)
    7528 * \f]
    7529 * where we use the short hand syntax \f$A_{[I,J]}\f$ to denote
    7530 * the \f$|I|\f$-by-\f$|J|\f$ submatrix that arises from the deletion of all entries
    7531 * from \f$A\f$ except for rows \f$I\f$ and columns \f$J\f$,
    7532 * for nonempty row
    7533 * and column subsets \f$I\subseteq\{1,\dots,m\}\f$ and \f$J\subseteq\{1,\dots,n\}\f$.
    7534 *
    7535 *
    7536 * @section DECOMP_USING Using a decomposition
    7537 *
    7538 * After passing one or more decompositions, see below, one can access all available decompositions with SCIPgetDecomps().
    7539 * The labels can be obtained by calling SCIPdecompGetVarsLabels() and SCIPdecompGetConsLabels().
    7540 * If some variables/constraints are not labeled, these functions will mark them as linking variables/constraints.
    7541 * There are several functions to get more information about one decomposition, see @ref DecompMethods.
    7542 *
    7543 * A decomposition can be used to split the problem into several subproblems which, in general, are easier to solve.
    7544 * For \f$q \in \{1,\dots,k\}\f$ the system
    7545 * \f[
    7546 * A_{[D^{\text{row}}_{q},D^{\text{col}}_{q}]}\; x_{[D^{\text{col}}_{q}]} \geq b_{[D^{\text{row}}_{q}]}
    7547 * \f]
    7548 * is part of subproblem \f$q\f$, the handling of the linking variables/constraints depends on the chosen application context.
    7549 * For example, in the heuristic @ref heur_padm.c several smaller subproblems are solved multiple times to get a feasible solution.
    7550 * Also the @ref BENDDECF "Benders' decomposition framework" was extended with release 7.0 to use user decompositions.
    7551 *
    7552 * @section DECOMP_CREATION Creation via SCIP-API
    7553 *
    7554 * There are two different ways to provide a decomposition in SCIP.
    7555 * It can be created with the SCIP-API or it can be read from a file.
    7556 *
    7557 * To create it with the API, the user must first create a decomposition with SCIPcreateDecomp() specifying
    7558 * whether the decomposition belongs to the original or transformed problem and the number of blocks.
    7559 * Then the variables and constraints can be assigned to one block or to the linking rows/columns by calling
    7560 * SCIPdecompSetVarsLabels() and SCIPdecompSetConsLabels(), respectively.
    7561 * To complete the decomposition or to ensure that it is internally consistent, SCIPcomputeDecompVarsLabels() or
    7562 * SCIPcomputeDecompConsLabels() can be called.
    7563 * Note that SCIPcomputeDecompVarsLabels() will ignore the existing variable labels and computes again the labels based on the constraint labels only;
    7564 * SCIPcomputeDecompConsLabels() works in the same way and ignores the existing constraint labels.
    7565 *
    7566 * After the decomposition has been successfully created, it can be saved for later use in the DecompStore using SCIPaddDecomp().
    7567 * Access to all decompositions in the DecompStore is possible with SCIPgetDecomps().
    7568 *
    7569 * @section DECOMP_READDEC Reading a decomposition from a file
    7570 *
    7571 * Alternatively, after a problem has been read, a related decomposition can be read from a dec-file.
    7572 * Please refer to the @ref reader_dec.h "DEC file reader" for further information about the required file format.
    7573 * Upon reading a valid dec-file, a decomposition structure is created, where the corresponding variable labels are inferred from the constraint labels, giving precedence to block over linking constraints.
    7574 *
    7575 * @section DECOMP_BENDERS Use for Benders
    7576 *
    7577 * If the variables should be labeled for the application of @ref BENDDECF "Benders' decomposition", the decomposition must be explicitly flagged by setting the parameter decomposition/benderslabels to TRUE.
    7578 * With this setting, the variable's labeling takes place giving precedence to its presence in linking constraints over its presence in named blocks.
    7579 *
    7580 * @section DECOMP_TRANS Decomposition after problem transformation
    7581 *
    7582 * As the problem's constraints are constantly changing, or possibly deleted, during presolving, the constraints' labeling must be triggered again.
    7583 * Therefore, SCIP automatically transforms all user decompositions at the beginning of the root node based on the variables' labels.
    7584 *
    7585 * @section DECOMP_STATS Decomposition statistics
    7586 *
    7587 * Further useful measures and statistics about the decomposition are computed within SCIPcomputeDecompStats().
    7588 * When the labeling process is concluded, the following measures are computed and printed:
    7589 * - the number of blocks;
    7590 * - the number of linking variables and linking constraints;
    7591 * - the size of the largest as well as the smallest block;
    7592 * - the area score:
    7593 * This score is also used by GCG to rank decompositions during the automatic detection procedure.
    7594 * For a decomposition
    7595 * \f$\mathcal{D}=(D^{\text{row}},D^{\text{col}})\f$,
    7596 * the area score is defined as
    7597 * \f[
    7598 * \text{areascore}(\mathcal{D}) = 1 - \frac{ \sum_{q=1}^k \lvert D^{\text{row}}_{q} \rvert
    7599 * \lvert D^{\text{col}}_{q} \rvert + n\lvert L^{\text{row}} \rvert + m\lvert L^{\text{col}} \rvert -
    7600 * \lvert L^{\text{row}} \rvert \lvert L^{\text{col}} \rvert }{mn}
    7601 * \enspace.
    7602 * \f]
    7603 * In the case of a mixed-integer program, the area score intuitively measures the coverage of the rearranged matrix by 0's.
    7604 * Decompositions with few linking variables and/or constraints and many small blocks \f$A_{[D^{\text{row}}_{q},D^{\text{col}}_{q}]}\f$
    7605 * will have an area score close to \f$1\f$, whereas coarse decompositions of a matrix have smaller area scores.
    7606 * The trivial decomposition with a single block has the worst possible area score of 0.
    7607 * - the modularity:
    7608 * This measure is used to assess the quality of the community structure within a decomposition.
    7609 * The modularity of the decomposition is computed as follows:
    7610 * \f[
    7611 * \begin{aligned}
    7612 * \sum_{q=1}^{k} \dfrac{e_{q}}{m} \left(1-\dfrac{e_{q}}{m}\right),
    7613 * \end{aligned}
    7614 * \f]
    7615 * where \f$e_{q}\f$ is the number of inner edges within block \f$q\f$ and \f$m\f$ is the total number of edges.
    7616 * The presence of an inner edge is identified through the presence of a variable in a constraint,
    7617 * both—the variable and the constraint—belonging to the same block.
    7618 * - the block graph statistics: A block graph is constructed with the aim of depicting the connection between the different blocks in a decomposition through the existing linking variables in the constraints.
    7619 * Note that the linking constraints are intentionally skipped in this computation.
    7620 * \f$ G = (V,E) \f$ denotes a block graph, with vertex set \f$V\f$ and edge set \f$E\f$.
    7621 * Each vertex in the graph represents a block in the decomposition; \f$V = \{v_{1},\dots,v_{k}\}\f$.
    7622 * An edge \f$e = \{ v_{s},v_{t} \}\f$ is added to \f$G\f$, if and only if there exists a column \f$\ell \in L^{\text{col}}\f$, a row \f$i \in D^{\text{row}}_{s}\f$
    7623 * and a row \f$j \in D^{\text{row}}_{t}\f$, such that \f$a_{i,\ell} \neq 0\f$ and \f$a_{j,\ell} \neq 0\f$.
    7624 * From the constructed graph, the number of edges, articulation points and connected components are computed, together with the maximum and minimum degree.
    7625 * Note that building the block graph can become computationally expensive with large and dense decompositions.
    7626 * Thus, it is possible through a user parameter <code>decomposition/maxgraphedge</code> to define a maximum edge limit.
    7627 * The construction process will be interrupted once this limit is reached, in which case only approximate estimations of the block graph statistics will be displayed and accompanied with a warning message.
    7628 *
    7629 */
    7630
    7631/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7632
    7633
    7634/**@page BENDDECF How to use the Benders' decomposition framework
    7635 *
    7636 * Benders' decomposition is a very popular mathematical programming technique that is applied to solve structured
    7637 * problems. Problems that display a block diagonal structure are particularly amenable to the application of Benders'
    7638 * decomposition. In a purely mixed-integer linear setting, such problems are given by
    7639 *
    7640 * \f[
    7641 * \begin{array}[t]{rllclcl}
    7642 * \min & \displaystyle & c^{T}x & + & d^{T}y \\
    7643 * & \\
    7644 * \text{subject to} & \displaystyle & Ax & & & = & b \\
    7645 * & \\
    7646 * & \displaystyle & Tx & + & Hy & = & h \\
    7647 * & \\
    7648 * & & x & & & \in & \mathbb{Z}^{p}\times\mathbb{R}^{n - p} \\
    7649 * & & & & y & \in & \mathbb{R}^{m} \\
    7650 * \end{array}
    7651 * \f]
    7652 *
    7653 * The variables \f$x\f$ and \f$y\f$ are described as the first and second stage variables respectively. In the
    7654 * classical use of Benders' decomposition, it is a requirement that the all second stage variables are continuous.
    7655 * Extensions to the classical Benders' decomposition approach have permitted the use of more general second stage
    7656 * problems.
    7657 *
    7658 * The application of Benders' decomposition to the above problem results in a subproblem, given by
    7659 *
    7660 * \f[
    7661 * \begin{array}[t]{rll}
    7662 * \min & \displaystyle & d^{T}y \\
    7663 * & \\
    7664 * \text{subject to} & \displaystyle & Hy = h - T\bar{x} \\
    7665 * & \\
    7666 * & & y \in \mathbb{R}^{m} \\
    7667 * \end{array}
    7668 * \f]
    7669 *
    7670 * where \f$\bar{x}\f$ is a solution vector of the first stage variables. As such, the subproblem is a problem only in
    7671 * \f$y\f$. The dual solution to the subproblem, either an extreme point or extreme ray, is used to generate cuts that
    7672 * are added to the master problem. Let \f$\lambda\f$ be the vector of dual variables associated with the set of
    7673 * constraints from the subproblem. If, for a given \f$\bar{x}\f$, the subproblem is infeasible, then \f$\lambda\f$
    7674 * corresponds to a dual ray and is used to produce the cut
    7675 *
    7676 * \f[
    7677 * 0 \geq \lambda(h - Tx)
    7678 * \f]
    7679 *
    7680 * which eliminates \f$\bar{x}\f$ from the master problem. If, for a given \f$\bar{x}\f$, the subproblem is feasible,
    7681 * then \f$\lambda\f$ corresponds to a dual extreme point and is used to produce the cut
    7682 *
    7683 * \f[
    7684 * \varphi \geq \lambda(h - Tx)
    7685 * \f]
    7686 *
    7687 * where \f$\varphi\f$ is an auxiliary variable added to the master problem as an underestimator of the optimal
    7688 * subproblem objective function value.
    7689 *
    7690 * Given \f$\Omega^{p}\f$ and \f$\Omega^{r}\f$ as the sets of dual extreme points and rays of the subproblem,
    7691 * respectively, the Benders' decomposition master problem is given by
    7692 *
    7693 * \f[
    7694 * \begin{array}[t]{rll}
    7695 * \min & \displaystyle & c^{T}x + \varphi \\
    7696 * & \\
    7697 * \text{subject to} & \displaystyle & Ax = b \\
    7698 * & \\
    7699 * & \displaystyle & \varphi \geq \lambda(h - Tx) \quad \forall \lambda \in \Omega^{r}\\
    7700 * & \\
    7701 * & \displaystyle & 0 \geq \lambda(h - Tx) \quad \forall \lambda \in \Omega^{r} \\
    7702 * & \\
    7703 * & & x \in \mathbb{Z}^{p}\times\mathbb{R}^{n - p} \\
    7704 * & & \varphi \in \mathbb{R} \\
    7705 * \end{array}
    7706 * \f]
    7707 *
    7708 * @section BENDERFRAMEWORK Overview
    7709 *
    7710 * In \SCIP 6.0 a Benders' decomposition framework has been implemented.
    7711 *
    7712 * The current framework can be used to handle a Benders Decomposition of CIPs of the form
    7713 *
    7714 * \f[
    7715 * \begin{array}[t]{rllclcl}
    7716 * \min & \displaystyle & c^{T}x & + & d^{T}y \\
    7717 * \text{subject to} & \displaystyle & g(x & , & y) & \in & [\ell,u] \\
    7718 * & & x & & & \in & X \\
    7719 * & & & & y & \in & Y \\
    7720 * \end{array}
    7721 * \f]
    7722 * when either
    7723 * - the subproblem is convex: \f$g_i(x,y)\f$ convex on \f$X\times Y\f$ if \f$u_i<\infty\f$, \f$g_i(x,y)\f$ concave on \f$X\times Y\f$ if \f$\ell_i>-\infty\f$, and \f$Y=\mathbb{R}^m\f$, or
    7724 * - the first stage variables are of binary type: \f$ X \subseteq \{0,1\}^n \f$.
    7725 *
    7726 * This framework can be used in four different
    7727 * ways: inputting an instance in the SMPS file format, using the default Benders' decomposition implementation
    7728 * (see src/scip/benders_default.c), implementing a custom Benders' decomposition plugin (see \ref BENDER), or by using
    7729 * the Benders' decomposition mode of GCG.
    7730 * An overview of how to use each of these functions will be provided in this section.
    7731 *
    7732 * @section BENDERSSMPS Inputting an instance in the SMPS file format.
    7733 *
    7734 * As part of the Benders' decomposition framework development, a reader for instances in the SMPS file format has been
    7735 * implemented (see src/scip/reader_smps.c). The details regarding the SMPS file format can be found at:
    7736 *
    7737 * Birge, J. R.; Dempster, M. A.; Gassmann, H. I.; Gunn, E.; King, A. J. & Wallace, S. W.
    7738 * A standard input format for multiperiod stochastic linear programs
    7739 * IIASA, Laxenburg, Austria, WP-87-118, 1987
    7740 *
    7741 * In brief, the SMPS file format involves three different files:
    7742 * - A core file (.cor): a problem instance in MPS format that is the core problem of a stochastic program.
    7743 * - A time file (.tim): partitions the variables and constraints into the different stages of the stochastic program
    7744 * - A stochastic file (.sto): describes the scenarios for each stage.
    7745 *
    7746 * The STO reader (see src/scip/reader_sto.c) constructs the stochastic program using the information from the core and
    7747 * time files. By default, the STO reader will construct the deterministic equivalent of the stochastic program. A
    7748 * parameter is provided "reading/sto/usebenders" that will inform the STO reader to apply Benders' decomposition to the
    7749 * input stochastic program.
    7750 *
    7751 * @section BENDERSDECSTRUCTURE Inputting a user-defined decomposition structure
    7752 *
    7753 * Benders' decomposition can be applied from a user-provided decomposition structure. Details about the decomposition
    7754 * structure and how to provide it to SCIP can be found at @ref DECOMP. Prior to reading the decomposition structure
    7755 * into SCIP, it is necessary to inform SCIP that the variables and constraints must be labelled for Benders'
    7756 * decomposition. This is achieved by setting the parameter "decomposition/benderslabels" to "TRUE". Following this,
    7757 * Benders' decomposition will be applied if the parameter "decomposition/applybenders" is set to "TRUE".
    7758 *
    7759 * When Benders' decomposition is applied using the decomposition structure, the Benders' decomposition algorithm is
    7760 * executed within a relaxator (see @ref RELAX). The relaxator is called when processing the root node of the original
    7761 * SCIP instance, before the first LP solve. Within the relaxator, a sub-SCIP is created, upon which the Benders'
    7762 * decomposition is applied. The default Benders' decomposition plugin (see @ref BENDERSDEFAULT) is used for applying
    7763 * the decomposition. The master problem sub-SCIP is solved and then the solution from the Benders' decomposition
    7764 * algorithm is returned.
    7765 *
    7766 * If the problem is solved to optimality by the Benders' decomposition algorithm, then the original SCIP instance
    7767 * terminates. There are cases where the Benders' decomposition algorithm terminates without an optimal solution. As a
    7768 * result, the original SCIP instance would continue solving. These cases are: reaching node, memory or solution limits,
    7769 * or numerical issues meaning that the Benders' solution is not optimal for the original problem. The parameter
    7770 * "relaxing/benders/continueorig" is provided to inform SCIP whether the original SCIP instance should continue solving
    7771 * following the completion of the Benders' algorithm. By default, solving in the original SCIP instance is interrupted
    7772 * when the relaxator finishes.
    7773 *
    7774 * The parameter setting and limits from the original SCIP instance are copied across to the master problem
    7775 * sub-SCIP in the Benders' decomposition relaxator. It is possible to set a separate node limit for the Benders'
    7776 * algorithm within the relaxator. This is achieved by using the parameter "relaxing/benders/nodelimit". A possible use
    7777 * case for a separate Benders' node limit is that the Benders' algorithm could be used as an initial heuristics for the
    7778 * original SCIP instance.
    7779 *
    7780 * An advantage over using the decomposition structure compared to an instance in the SMPS format is that the solution
    7781 * to the original problem is easily accessible. At the completion of the Benders' decomposition algorithm, the best
    7782 * know solution is copied back to the original SCIP instance. Note that using a decomposition structure is not the only
    7783 * way to get the original problem solution from the Benders' decomposition algorithm. Whichever method you use, it is
    7784 * possible to solve the Benders' decomposition subproblems by calling SCIPsetupBendersSubproblem() and then
    7785 * SCIPsolveBendersSubproblem() for each subproblem using the best solution from the master problem. An example of this
    7786 * can be found in solveBendersSubproblems() of `src/scip/relax_benders.c`.
    7787 *
    7788 * @section BENDERSDEFAULT Using the default Benders' decomposition plugin.
    7789 *
    7790 * A default implementation of a Benders' decomposition plugin has been included in \SCIP 6.0 (see
    7791 * src/scip/benders_default.c). In order to use the default plugin, the user must create SCIP instances of the master
    7792 * problem and subproblems. The subproblems must also contain a copy of the master problem variables, since these are
    7793 * fixed to the master problem solution values during the subproblem solving loop. These SCIP instances for the master
    7794 * and subproblems are passed to the default plugin by calling SCIPcreateBendersDefault().
    7795 *
    7796 * The mapping between the master and subproblem variables is performed automatically. The default solving and cut
    7797 * generation methods are applied to solve the input problem. It is important to note that the mapping between the
    7798 * master and subproblem variables relies on the variable names. The variables of the subproblem corresponding to
    7799 * master problem variables must have the same name in both problems.
    7800 *
    7801 * The CAP (stochastic capacitated facility location problem) example demonstrates the use of the default Benders'
    7802 * decomposition implementation within a project.
    7803 *
    7804 * @section BENDERSCUSTOM Implementing a custom Benders' decomposition implementation.
    7805 *
    7806 * A custom Benders' decomposition requires the implementation of a Benders' decomposition plugin. The key aspects for
    7807 * implementing a custom Benders' decomposition plugin are explained in \ref BENDER.
    7808 *
    7809 * @section BENDERSGCG Using the Benders' decomposition mode of GCG
    7810 *
    7811 * In GCG 3.0, a Benders' decomposition mode has been implemented. This mode takes the decomposition found by the
    7812 * detection schemes of GCG and applies Benders' decomposition. Using GCG it is possible to apply Benders' decomposition
    7813 * to general problem without having to manually construct the decompositions.
    7814 *
    7815 * @section BENDERSOBJTYPE Objective type options for the Benders' decomposition
    7816 *
    7817 * Classically, the application of Benders' decomposition results in the inclusion of an auxiliary variable to provide an
    7818 * underestimation of the subproblem objective value. If the subproblem can be separated into disjoint problems, then
    7819 * this auxiliary variable can be substituted with the sum of auxiliary variables (one for each subproblem).
    7820 *
    7821 * While the summation of auxiliary variables is theoretically possible for all applications of Benders' decomposition,
    7822 * there are problems where an alternative objective may be beneficial. An example is a multiple machine scheduling
    7823 * problem with a makespan objective. To accommodate different objective types, the Benders' decomposition framework
    7824 * allows for the objective types of summation (the classical method) or the minimum of the maximum subproblem auxiliary
    7825 * variables. The objective type can be set using the function SCIPsetBendersObjectiveType(). Note that the different
    7826 * objective types only have an impact if more than one subproblem is used in the Benders' decomposition.
    7827 *
    7828 */
    7829
    7830/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7831
    7832/**@page PROBINGDIVING How to use probing and diving mode
    7833 *
    7834 * SCIP contains two methods to perform a temporary dive in the branch-and-bound tree: the diving mode and the probing mode.
    7835 * Both methods enable the modification of variable bounds, addition of new constraints, or adjustments to the objective function.
    7836 * Whereas the diving mode works directly on the LP structure, the probing mode creates temporary branch-and-bound nodes, which makes it possible to perform backtracks during a dive.
    7837 * Probing allows to perform domain propagation at the temporary nodes and provides the ability to solve the LP by column generation if a pricer plugin is implemented; neither is possible in diving mode.
    7838 *
    7839 * After entering diving or probing mode by calling SCIPstartDive() and SCIPstartProbing(), respectively, there exist various functions that allow the user to temporarily change the LP.
    7840 * An overview for diving can be found here[https://www.scipopt.org/doc/html/group__PublicLPDivingMethods.php] and for the probing mode here[https://scipopt.org/doc/html/group__PublicProbingMethods.php].
    7841 * To reset all changes, the respective mode needs to be ended by calling SCIPendDive() and SCIPendProbing(), respectively.
    7842 *
    7843 * Note that, although the state of the LP and the problem is reset after ending probing and diving, both modes can have several effects on the subsequent solving process.
    7844 * In some situations, when the LP is infeasible for example, conflict analysis will be run in both probing and diving modes, which can lead to globally valid conflict constraints that are then added to the main solving process.
    7845 * Similarly, the function SCIPpropagateProbing() might find globally valid bound changes, which are added to the main SCIP and considered in the subsequent solving process.
    7846 * Another way to leverage insights found during probing or diving is to update pseudo costs during both modes, helping make better branching decisions.
    7847 * This is controlled by setting the parameter "divingpscosts" to TRUE, which is done in the default settings of SCIP.
    7848 * Moreover, if the LP was not solved to optimality before entering diving mode (or the parameter "resolverestore" is set to TRUE), the LP is resolved to reset the solution.
    7849 * In some cases, such as when dealing with a numerically difficult instance, this might lead to a different LP state.
    7850 * Finally, during probing, global variable statistics can be collected by calling SCIPenableVarHistory() after starting probing.
    7851 * Since these statistics can be used for decision-making in SCIP, enabling their collection can have an effect on the solving process after probing ends.
    7852 *
    7853 */
    7854/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7855
    7856/**@page EXACT How to use the numerically exact solving mode
    7857 *
    7858 * As a feature standing out among today's MIP solvers, \SCIP offers the option to solve mixed-integer linear programs
    7859 * in a numerically exact solving mode, in which it uses rational, extended-precision, and safe floating-point
    7860 * computation in order to guarantee that results are not affected by roundoff errors from unsafe floating-point
    7861 * arithmetic.
    7862 *
    7863 * Exact solving mode requires \SCIP to be built with
    7864 *
    7865 * - [GMP](https://gmplib.org/) for rational arithmetic in ZIMPL, SoPlex, SCIP, and PaPILO,
    7866 * - [Boost](https://www.boost.org/) multiprecision library for rationals in SCIP (and PaPILO, if linked),
    7867 * - [MPFR](https://www.mpfr.org/) for approximating rationals with floating-point numbers in SCIP,
    7868 * - and an exact LP solver such as SoPlex.
    7869 *
    7870 * Enabling the exact solving mode is done by setting the parameter `exact/enable = TRUE` or calling the API function
    7871 * `SCIPenableExactSolving()`. Note that this has to be done <b>before</b> reading a problem instance. Further advanced
    7872 * parameters for exact solving can be set in the `exact` submenu.
    7873 *
    7874 * Optionally, the output of a certificate (also known as proof logging) can be enabled by specifying
    7875 * `certificate/filename`. The resulting certificate can be checked with the proof checker
    7876 * [VIPR](https://github.com/scipopt/vipr) or a formally verified version in [CakeML](https://cakeml.org/checkers.html).
    7877 * Note that certificate files are incomplete if cutting plane separation is enabled (as by default). In this case, the
    7878 * certificate needs to be completed using the `viprcomp` script prior to verification.
    7879 *
    7880 * All plugins that want to participate in exact solving mode need to be marked as safe to use when included.
    7881 *
    7882 * For further details we refer to the release report of SCIP 10.
    7883 */
    7884
    7885/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7886
    7887/**@page OBJ Creating, capturing, releasing, and adding data objects
    7888 *
    7889 * Data objects (variables, constraints, rows, ... ) are subject to reference counting
    7890 * to avoid expensive copying operations. This concept is similar to smart pointers.
    7891 * Creating such an object (e.g., by calling SCIPcreateVar()) will set the
    7892 * reference counter to one. Capturing an object (e.g., by calling SCIPcaptureVar()) increases the reference counter,
    7893 * releasing it (e.g., by calling SCIPreleaseVar()) decreases the counter. If the reference counter gets zero, the
    7894 * object will be destroyed automatically.
    7895 *
    7896 * Remember that a created data object is automatically captured. If the user
    7897 * doesn't need the object anymore, (s)he has to call the object's release function.
    7898 *
    7899 * When a data object is added to SCIP (e.g., by calling SCIPaddVar()) , it is captured again, such that a
    7900 * release call does not destroy the object. If SCIP doesn't need the object
    7901 * anymore, it is automatically released.
    7902 *
    7903 * E.g., if the user calls
    7904 * \code
    7905 * SCIPcreateVar(); // reference counter 1
    7906 * SCIPaddVar(); // reference counter 2
    7907 * SCIPreleaseVar(); // reference counter 1
    7908 * \endcode
    7909 * the reference counter will be 1 afterwards, and the variable will be destroyed, if SCIP frees the problem.
    7910 * If the user wants to use this variable, e.g. for extracting statistics after SCIP was finished, the user must not call
    7911 * SCIPreleaseVar() right after adding the variable, but before terminating the program.
    7912 */
    7913
    7914/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7915
    7916/**@page PARAM How to add additional user parameters
    7917 *
    7918 * Users may add their own parameters to SCIP by calling SCIPaddXyzParam(). Using
    7919 * this function, there are two possibilities for where to store the actual parameter value:
    7920 * - If the given valueptr is NULL, SCIP stores the parameter value internally, and
    7921 * the user can only access the value with the SCIPgetXyzParam() and
    7922 * SCIPsetXyzParam() calls.
    7923 * - If the given valueptr is not NULL, SCIP stores the parameter value at the given
    7924 * address, and the user can directly manipulate the value at this address.
    7925 * (S)he has to be careful with memory management in string parameters: when the
    7926 * SCIPaddStringParam() function is called, the given address must hold a char*
    7927 * pointer with value NULL. The default value is then copied into this pointer,
    7928 * allocating memory with BMSallocMemoryArray(). If the parameter is changed, the
    7929 * old string is freed with BMSfreeMemoryArray() and the new one is copied to a new
    7930 * memory area allocated with BMSallocMemoryArray(). When the parameter is freed,
    7931 * the memory is freed with BMSfreeMemoryArray().
    7932 * The user should not interfere with this internal memory management. Accessing
    7933 * the string parameter through the given valueptr is okay as long as it does not
    7934 * involve reallocating memory for the string.
    7935 *
    7936 * In some cases, it is necessary to keep track of changes in a parameter.
    7937 * If this is the case, the user can define a function by the PARAMCHGD callback and use this function as
    7938 * the @c paramchgd parameter of the @c SCIPaddXyzParam() function, also giving a pointer to the data, which is
    7939 * needed in this function, as @c paramdata. If this function is not NULL, it is called every time
    7940 * the value of the parameter is changed.
    7941 */
    7942
    7943/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    7944
    7945/**@page MEMORY Using the memory functions of SCIP
    7946 *
    7947 * SCIP provides three ways for allocating memory:
    7948 * -# <b>block memory:</b> efficient handling of memory blocks of similar small sizes
    7949 * -# <b>buffer memory:</b> efficient handling of memory that needs to locally be allocated and freed
    7950 * -# <b>standard memory:</b> access to standard malloc/free
    7951 *
    7952 * <em>Whenever possible, the first two should be used, because of reasons detailed below.</em>
    7953 *
    7954 * In the following, we provide a brief description of these methods. We refer the reader to the dissertation of Tobias
    7955 * Achterberg for more details. We also present best practice models.
    7956 *
    7957 * @section MEMBACK Background
    7958 *
    7959 * The main goals for providing such particular methods are:
    7960 * - <em>Accounting:</em> Using its own functions, SCIP knows the total size of memory allocated internally and can change its
    7961 * behavior: for instance, it can change to "memory saving mode" (using depth first search (DFS) and possibly do a garbage
    7962 * collection). It also allows for keeping a memory limit.
    7963 * - <em>Speed:</em> SCIP often needs to allocate a very large number of small blocks of similar sizes (often powers of
    7964 * two). Depending on the operating system and compiler, the methods implemented in SCIP can be faster, since blocks
    7965 * of the same size are grouped together. Especially at the end of the 1990ies the standard malloc/free methods were
    7966 * quite ineffective. The experiments of Tobias Achterberg in 2007 show a speed improvement of 11 % when using block
    7967 * memory.
    7968 * - <em>Efficiency:</em> Since blocks are groups in sizes, the blocks do not need to store their sizes within each
    7969 * block. In comparison, standard malloc/free stores the size using one word for each memory chunk. The price to pay
    7970 * is that one needs to pass the size to the functions that free a block. In any case, the methods in SCIP can save
    7971 * memory. Moreover, buffer memory is stored in similar places and not spread out, which also might help cache.
    7972 * - <em>Debugging:</em> All of the possibilities provide methods to detect memory leaks. Together with tools like
    7973 * valgrind, this can be quite effective in avoiding such problems.
    7974 *
    7975 * @n
    7976 * @section BLKMEM Block memory
    7977 *
    7978 * SCIP offers its own block memory handling, which allows efficient handling of smaller blocks of memory in cases in
    7979 * which many blocks of the same (small) size appear. This is adequate for branch-and-cut codes in which small blocks
    7980 * of the same size are allocated and freed very often (for data structures used to store rows or branch-and-bound
    7981 * nodes). Actually, most blocks allocated within SCIP have small sizes like 8, 16, 30, 32, 64. The idea is simple:
    7982 * There is a separate list of memory blocks for each interesting small size. When allocating memory, the list is
    7983 * checked for a free spot in the list; if no such spot exists, the list is enlarged. Freeing just sets the block to be
    7984 * available. Very large blocks are handled separately. See the dissertation of Tobias Achterberg for more details.
    7985 *
    7986 * One important comment is that freeing block memory requires the size of the block in order to find the right list.
    7987 *
    7988 * The most important functions are
    7989 * - SCIPallocBlockMemory(), SCIPallocBlockMemoryArray() to allocate memory
    7990 * - SCIPfreeBlockMemory(), SCIPfreeBlockMemoryArray() to free memory
    7991 *
    7992 * An example code is:
    7993 * @refsnippet{tests/src/misc/snippets.c,SnippetArrayAllocAndFree}
    7994 * @n
    7995 *
    7996 * @section BUFMEM Buffer memory
    7997 *
    7998 * @subsection BUFMEMSTD Standard Buffer Memory
    7999 *
    8000 * In addition to block memory, SCIP offers buffer memory. This should be used if memory is locally used within a
    8001 * function and freed within the same function. For this purpose, SCIP has a list of memory buffers that are reused for
    8002 * this purpose. In this way, a very efficient allocation/freeing is possible.
    8003 *
    8004 * Note that the buffers are organized in a stack, i.e., freeing buffers in reverse order of allocation is faster.
    8005 *
    8006 * The most important functions are
    8007 * - SCIPallocBuffer(), SCIPallocBufferArray() to allocate memory,
    8008 * - SCIPfreeBuffer(), SCIPfreeBufferArray() to free memory.
    8009 *
    8010 * @subsection BUFMEMCLEAN Clean Buffer Memory
    8011 *
    8012 * SCIP 3.2 introduced a new type of buffer memory, the <em>clean buffer</em>. It provides memory which is initialized to zero
    8013 * and requires the user to reset the memory to zero before freeing it. This can be used at performance-critical
    8014 * places where only few nonzeros are added to a dense array and removing these nonzeros individually is much faster
    8015 * than clearing the whole array. Similar to the normal buffer array, the clean buffer should be used for temporary memory
    8016 * allocated and freed within the same function.
    8017 *
    8018 * The most important functions are
    8019 * - SCIPallocCleanBufferArray() to allocate memory,
    8020 * - SCIPfreeCleanBufferArray() to free memory.
    8021 *
    8022 * @n
    8023 * @section STDMEM Standard memory
    8024 *
    8025 * SCIP provides an access to the standard C functions @c malloc and @c free with the additional feature of tracking
    8026 * memory in debug mode. In this way, memory leaks can be easily detected. This feature is automatically activated in
    8027 * debug mode.
    8028 *
    8029 * The most important functions are
    8030 * - SCIPallocMemory(), SCIPallocMemoryArray() to allocate memory,
    8031 * - SCIPfreeMemory(), SCIPfreeMemoryArray() to free memory.
    8032 *
    8033 * @section REALLOCATION Reallocating memory
    8034 *
    8035 * - `SCIPensureBlockMemoryArray()`: Extends a dynamically allocated block memory array to be able to store at least the given
    8036 * number of elements. This function ensures that the array is resized efficiently by calculating an appropriate new size. This can be
    8037 * useful to build data structures that grow dynamically.
    8038 *
    8039 * - `SCIPreallocBlockMemoryArray()`, `SCIPreallocBufferArray()`, `SCIPreallocMemoryArray()`: Reallocate memory arrays to a specific
    8040 * new size. These are useful when you already know the exact new size needed, for instance when managing multiple arrays of the
    8041 * same size or when you want to compute the new size once and apply it to multiple arrays. Unlike the ensure* functions, these
    8042 * give you direct control over the array size.
    8043 *
    8044 * @n
    8045 * @section MEMBESTPRACTICE Best Practice of Using Memory Functions
    8046 *
    8047 * Since allocating and freeing memory is very crucial for the speed and memory consumption of a program, it is
    8048 * important to keep the following notes and recommendations in mind.
    8049 *
    8050 * @subsection GEN General Notes
    8051 *
    8052 * The following holds for all three types of memory functions:
    8053 * - In debug mode, the arguments are checked for overly large allocations (usually arising from a bug). Note that all
    8054 * arguments are converted to unsigned values of type @c size_t, such that negative sizes are converted into very
    8055 * large values.
    8056 * - The functions always allocate at least one byte and return non-NULL pointers if memory is available. In particular,
    8057 * freeing is always possible.
    8058 * - The freeing functions set the pointer to the memory to NULL.
    8059 * - Debugging can be supported by using the compiler flags @p NOBLKMEM=true, @p NOBUFMEM=true, @p NOBLKBUFMEM=true
    8060 * that turn off the usage of block memory, buffer memory, as well as block and buffer memory, respectively. Since,
    8061 * the internal block and buffer memory is freed at the end (leaving no memory leaks), turning them off allows tools
    8062 * like valgrind to find memory leaks.
    8063 * - Moreover, additional checks can be turned on by defining @p CHECKMEM in memory.c.
    8064 *
    8065 * @n
    8066 * @subsection DOS Things to do ...
    8067 *
    8068 * - Use buffer memory if your memory chunk can be allocated and freed within the same function.
    8069 * - Use buffer and block memory wherever possible, because of the reasons explained above.
    8070 * - Free memory in the reverse order in which it was allocated! For block and buffer memory this @b significantly
    8071 * speeds up the code.
    8072 * - Use as few memory allocations/freeing operations as possible, since these functions take a significant amount of time.
    8073 *
    8074 * @n
    8075 * @subsection DONTS Things to avoid ...
    8076 *
    8077 * - Avoid the usage of standard memory, since SCIP is unaware of the size used in such blocks.
    8078 * - Avoid reallocation with only slightly increased size, rather use a geometrically growing
    8079 * size allocation. SCIPcalcMemGrowSize() is one way to calculate new sizes.
    8080 * - Be careful with buffer memory reallocation: For single buffers, the memory is reallocated (using malloc); since
    8081 * the actual space might be larger than what was needed at allocation time, reallocation sometimes comes without
    8082 * extra cost. Note that reallocating block memory in most cases implies moving memory arround.
    8083 */
    8084
    8085/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8086
    8087/**@page DEBUG Debugging
    8088 *
    8089 * If you need to debug your own code that uses SCIP, here are some tips and tricks:
    8090 *
    8091 * - Use <b>asserts</b> in your code to show preconditions for the parameters, invariants and postconditions.
    8092 * Assertions are boolean expressions which inevitably have to evaluate to <code>TRUE</code>. Consider the
    8093 * following example:
    8094 *
    8095 * @refsnippet{src/scip/cons_linear.c,SnippetDebugAssertions}
    8096 *
    8097 * As you can see, both pointers and integers are checked for valid values at the beginning of the
    8098 * function <code>consCatchEvent()</code>. This is particularly important for, e.g., array indices like
    8099 * the variable <code>pos</code> in this example, where using the <code>consdata->vars[pos]</code>
    8100 * pointer could result in unexspected behaviour
    8101 * if the asserted precondition on <code>pos</code> were not matched and <code>pos</code> were an arbitrary index
    8102 * outside the array range.
    8103 *
    8104 * - In order to activate assertions, use the <b>Debug mode</b> by compiling SCIP via
    8105 * \code
    8106 * cmake -DCMAKE_BUILD_TYPE=Debug
    8107 * \endcode
    8108 * or the Makefile equivalent
    8109 * \code
    8110 * make OPT=dbg
    8111 * \endcode and run the code. See \ref CMAKE and \ref MAKE for further information about compiler options for SCIP.
    8112 * As a rule of thumb, Spending only little extra time on
    8113 * asserting preconditions saves most of the time spent on debugging!
    8114 *
    8115 * - Turn on <b>additional debug output</b> by adding the line
    8116 * \code
    8117 * #define SCIP_DEBUG
    8118 * \endcode
    8119 * at the top of SCIP files you want to analyze. This will output messages included in the code using
    8120 * <code>SCIPdebugMsg(scip, ...)</code> (or <code>SCIPdebugMessage()</code>), see \ref EXAMPLE_1.
    8121 * We recommend to also use <code>SCIPdebugMsg(scip, ...)</code> in your own code for being able to activate
    8122 * debug output in the same way.
    8123 * - If available on your system, we recommend to use a debugger like <code>gdb</code>
    8124 * to trace all function calls on the stack,
    8125 * display values of certain expressions, manually break the running code, and so forth.
    8126 * - If available on your system, you can use software like <a href="http://valgrind.org">valgrind</a> to check for uninitialized
    8127 * values or segmentation faults.
    8128 * - For checking the usage of SCIP memory, you can use
    8129 * <code>SCIPprintMemoryDiagnostic()</code>. This outputs memory that is currently in use,
    8130 * which can be useful after a <code>SCIPfree()</code> call.
    8131 * - If there are memory leaks for which you cannot detect the origin, you can recompile your code with the option <code>cmake -DNOBLKBUFMEM=on</code>
    8132 * (or <code>make NOBLKBUFMEM=true</code> if you are using the Makefile system.
    8133 * Also for the Makefile system, do not forget to clean your code before with <code>make OPT=... LPS=... clean</code>)
    8134 * Only with that change, valgrind (or similar) reliably helps
    8135 * to detect leaked memory.
    8136 * - If your code cuts off a feasible solution, but you do not know which component is responsible,
    8137 * you can use the debugging mechanism (see \ref EXAMPLE_2). Therefore, a given solution is read and it
    8138 * is checked for every reduction, whether the solution will be pruned globally.
    8139 *
    8140 * @section EXAMPLE_1 How to activate debug messages
    8141 * For example, if we include a <code>\#define SCIP_DEBUG</code> at the top of \ref heur_oneopt.c, recompile SCIP
    8142 * in Debug mode, and run the SCIP interactive shell to solve p0033.mps from the
    8143 * <a href="http://miplib2010.zib.de/miplib3/miplib.html">MIPLIB 3.0</a> , we get some output like:
    8144 *
    8145 * \include debugexamples/example1.txt
    8146 *
    8147 * @section EXAMPLE_2 How to add a debug solution
    8148 *
    8149 * Continuing the example above, we finish the solving process.
    8150 * The optimal solution can now be written to a file:
    8151 * \include debugexamples/example2_1.txt
    8152 *
    8153 * If we afterwards recompile SCIP with the additional compiler flag <code>cmake -DDEBUGSOL=on</code> (<code>make DEBUGSOL=true</code> in the Makefile system),
    8154 * set the parameter <code>misc/debugsol = check/p0033.sol</code>, and run SCIP again it will output:
    8155 * \include debugexamples/example2_2.txt
    8156 * Further debug output would only appear, if the solution was cut off in the solving process.
    8157 */
    8158
    8159/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8160
    8161/**@page STAGES SCIP stages
    8162 *
    8163 * The SCIP object goes through different stages during the solving process, the transitions from one to the next are presented in the following diagram.
    8164 * \image html stages.png
    8165 * More exhaustively, the stages are:
    8166 * \code
    8167 * SCIP_STAGE_INIT = 0, /**< SCIP data structures are initialized, no problem exists
    8168 * SCIP_STAGE_PROBLEM = 1, /**< the problem is being created and modified
    8169 * SCIP_STAGE_TRANSFORMING = 2, /**< the problem is being transformed into solving data space
    8170 * SCIP_STAGE_TRANSFORMED = 3, /**< the problem was transformed into solving data space
    8171 * SCIP_STAGE_INITPRESOLVE = 4, /**< presolving is initialized
    8172 * SCIP_STAGE_PRESOLVING = 5, /**< the problem is being presolved
    8173 * SCIP_STAGE_EXITPRESOLVE = 6, /**< presolving is exited
    8174 * SCIP_STAGE_PRESOLVED = 7, /**< the problem was presolved
    8175 * SCIP_STAGE_INITSOLVE = 8, /**< the solving process data is being initialized
    8176 * SCIP_STAGE_SOLVING = 9, /**< the problem is being solved
    8177 * SCIP_STAGE_SOLVED = 10, /**< the problem was solved
    8178 * SCIP_STAGE_EXITSOLVE = 11, /**< the solving process data is being freed
    8179 * SCIP_STAGE_FREETRANS = 12, /**< the transformed problem is being freed
    8180 * SCIP_STAGE_FREE = 13 /**< SCIP data structures are being freed
    8181 * \endcode
    8182 * Most functions can be called in a subset of the stages, this is then documented, a runtime check is often added and will throw a \ref SCIP_INVALIDCALL if the stage is not allowed.
    8183 */
    8184
    8185/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8186
    8187/**@page SRCORGA Organization of Source Code
    8188 *
    8189 * The SCIP source code has different types of files, distinguished by their naming style. The following list gives an overview of the most important file types and their purpose.
    8190 *
    8191 * @section SRCORGA_CORE SCIP core components
    8192 *
    8193 * - Each core component has an implementation with an internal API and a public API.
    8194 * - The internal implementation should be in a file `<component>.c,h` and should not be included in the public API.
    8195 * - Internal API functions usually do not take a `SCIP*` parameter, but a pointer to the component as first argument and pointers to internal structures like `SCIP_SET*` or `SCIP_STAT*`, where necessary.
    8196 * - The name of internal API functions follows the style `SCIP<component><operation>...`, e.g., <code>SCIPvarCreateOriginal()</code> or <code>SCIPvarAddLocks()</code>.
    8197 * - `pub_<component>.h` declares the functions of the public API that do not need a SCIP pointer.
    8198 * Often, these are getter-functions.
    8199 * For example, \ref pub_var.h contains public variable API functions.
    8200 * - Functions in `pub_<component>.h` follow the same naming style as those in `<component>.h` and are used by the implementation of the internal API as well.
    8201 * - `scip_<component>.h` declares the functions of the public API that need a SCIP instance (`SCIP*`), e.g., \ref scip_var.h for public variable manipulation functions.
    8202 * Functions declared in `scip_<component>.h` are often thin wrappers that call the internal API functions from `<component>.h`.
    8203 * These functions should follow the naming style `SCIP<operation><component>...`, e.g., <code>SCIPcreateVarOriginal()</code> or <code>SCIPaddVarLocks()</code>.
    8204 * - To ensure functions of the public API being reachable in shared libraries, their declaration needs to contain the <code>SCIP_EXPORT</code> attribute.
    8205 * - Public types (typedef's, enumerations) are defined in file `type_<component>.h`.
    8206 * Type names follow the style `SCIP_<COMPONENT>...`. For every struct, we have a typedef that shortens the name
    8207 * (so one could for instance use `SCIP_PARAM` instead of `struct SCIP_Param`).
    8208 * The convention is to have the mixed-casing for the struct name, and then all-capital for the typedef's type. Similar for enums.
    8209 * - Structs that need to be accessed by several source files are defined in `struct_<component>.h`.
    8210 * `struct_<component>.h` is usually included only by `<component>.c` and maybe `scip_<component>.c`.
    8211 * Exceptions are due to manual inlining of functions via macros when compiling for optimized mode.
    8212 * - All types, structs, and functions are documented with Doxygen-style comments.
    8213 * The documentation of the implementation of a function must repeat the documentation of the function declaration exactly (for doxygen to treat them as identical).
    8214 *
    8215 * @section SRCORGA_PLUGINS Plugins
    8216 * - Each plugin is defined in files `<type>_<name>.c,h`, e.g.,
    8217 * \ref cons_knapsack.c implements the Knapsack constraint handler plugin and
    8218 * \ref cons_knapsack.h declares its public API functions.
    8219 * - Public types that belong to a plugin are declared in its header, `<type>_<name>.h`.
    8220 * - API functions of plugins are named as `SCIP<operation>...<Name>`, e.g., <code>SCIPincludeConshdlrAnd()</code>, <code>SCIPcreateConsAnd()</code>, or <code>SCIPgetNVarsAnd()</code>.
    8221 * - Plugins access only the public API.
    8222 * - Plugins that need to be included by default should be registered in <code>src/scip/scipdefplugins.c</code>.
    8223 */
    8224
    8225/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8226
    8227/**@page TEST How to run automated tests with SCIP
    8228 *
    8229 * SCIP comes along with a set of useful tools that allow to perform automated tests. The
    8230 * following is a step-by-step guide from setting up the test environment for evaluation and
    8231 * customization of test runs.
    8232 *
    8233 *
    8234 * @section SETUP Setting up the test environment
    8235 *
    8236 * At first you should create a file listing all problem instances that should be part of the test.
    8237 * This file has to be located in the the directory <code>scip/check/testset/</code>
    8238 * and has to have the file extension <code>.test</code>, e.g., <code>testrun.test</code>,
    8239 * in order to be found by the <code>scip/check/check.sh</code> script.
    8240 * \n
    8241 * All test problems can be listed in the <code>test</code>-file by a relative path,
    8242 * e.g., <code>../../problems/instance1.lp</code> or absolute path, e.g., <code>/home/problems/instance2.mps</code>
    8243 * in this file. Only one problem should be listed on every line (since the command <code>cat</code> is used to parse this file).
    8244 * Note that these problems have to be readable for SCIP in order to solve them.
    8245 * However, you can use different file formats.
    8246 *
    8247 * Optionally, you can provide a solution file in the <code>scip/check/testset/</code> directory containing
    8248 * known information about the feasibility and the best known objective values for the test instances.
    8249 * SCIP can use these values to verify the results. The file has to have the same basename as the
    8250 * <code>.test</code>-file, i.e., in our case <code>testrun.solu</code>. One line can only contain
    8251 * information about one test instance. A line has to start with the type of information given:
    8252 *
    8253 * - <code>=opt=</code> stating that a problem name with an optimal objective value follows
    8254 * - <code>=best=</code> stating that a problem name with a best know objective value follows
    8255 * - <code>=inf=</code> stating that a problem name follows which is infeasible
    8256 *
    8257 * With these information types you can encode for an instance named <code>instance1.lp</code> the following
    8258 * information:
    8259 * - The instance has a known optimal (objective) value of 10.
    8260 * \code
    8261 * =opt= instance1 10
    8262 * \endcode
    8263 * - The instance has a best known solution with objective value 15.
    8264 * \code
    8265 * =best= instance1 15
    8266 * \endcode
    8267 * - The instance is feasible (but has no objective function or we don't know a solution value)
    8268 * \code
    8269 * =feas= instance1
    8270 * \endcode
    8271 * - The instance is infeasible.
    8272 * \code
    8273 * =inf= instance1
    8274 * \endcode
    8275 *
    8276 * If you don't know whether the instance is feasible or not (so the status is unknown),
    8277 * you can omit the instance in the <code>solu</code>-file or write
    8278 * \code
    8279 * =unkn= instance1
    8280 * \endcode
    8281 *
    8282 * <b>Note that in all lines the file extension of the file name is omitted.</b>
    8283 * \n
    8284 * See the files <code>scip/check/testset/short.test</code> and <code>scip/check/testset/short.solu</code>
    8285 * for an example of a <code>test</code>-file and its corresponding <code>solu</code>-file.
    8286 *
    8287 *
    8288 *
    8289 * @section STARTING Starting a test run
    8290 *
    8291 *
    8292 * \code
    8293 * make TEST=testrun test
    8294 * \endcode
    8295 *
    8296 * in the SCIP root directory. Note that <code>testrun</code> is exactly the basename of our
    8297 * <code>test</code>-file (<code>testrun.test</code>). This will cause SCIP to solve our test instances
    8298 * one after another and to create various output files (see \ref EVAL).
    8299 *
    8300 *
    8301 * @section EVAL Evaluating a test run
    8302 *
    8303 * During computation, SCIP automatically creates the directory <code>scip/check/results/</code>
    8304 * (if it does not already exist) and stores the following output files there.
    8305 *
    8306 * \arg <code>*.out</code> - output of <code>stdout</code>
    8307 * \arg <code>*.err</code> - output of <code>stderr</code>
    8308 * \arg <code>*.set</code> - copy of the used settings file
    8309 *
    8310 * \arg <code>*.res</code> - ASCII table containing a summary of the computational results
    8311 * \arg <code>*.tex</code> - TeX table containing a summary of the computational results
    8312 * \arg <code>*.pav</code> - <a href="http://www.gamsworld.org/performance/paver/">PAVER</a> output
    8313 *
    8314 * The last three files in the above list, i.e., the files containing a summary of the computational results,
    8315 * can also be generated manually. Therefore the user has to call the <code>evalcheck.sh</code> script in the
    8316 * @c check directory with the corresponding @c out file as argument. For example, this may be useful if the user stopped the
    8317 * test before it was finished, in which case the last three files will not be automatically generated by SCIP.
    8318 *
    8319 * The last column of the ASCII summary table contains the solver status. We distinguish the following statuses: (in order of priority)
    8320 *
    8321 * \arg abort: solver broke before returning solution
    8322 * \arg fail: solver cut off a known feasible solution (value of the <code>solu</code>-file is beyond the dual bound;
    8323 * especially if problem is claimed to be solved but solution is not the optimal solution)
    8324 * <b>or</b> if a final solution check revealed a violation of one of the original constraints.
    8325 * \arg ok: solver solved problem with the value in solu-file
    8326 * \arg solved: solver solved problem which has no (optimal) value in solu-file (since we here cannot detect the direction
    8327 * of optimization, it is possible that a solver claims an optimal solution which contradicts a known feasible solution)
    8328 * \arg better: solver found solution better than known best solution (or no solution was noted in the <code>solu</code>-file so far)
    8329 * \arg gaplimit, sollimit: solver reached gaplimit or limit of number of solutions (at present: only in SCIP)
    8330 * \arg timeout: solver reached any other limit (like time or nodes)
    8331 * \arg unknown: otherwise
    8332 *
    8333 * Additionally the <code>evalcheck.sh</code> script can generate a <code>solu</code>-file by calling
    8334 * \code
    8335 * ./evalcheck.sh writesolufile=1 NEWSOLUFILE=<solu-file> <out-file>
    8336 * \endcode
    8337 * where <code><solu-file></code> denotes the filename of the new file where the solutions shall be
    8338 * (and <code><out-file></code> denotes the output (<code>.out</code>) files to evaluate).
    8339 *
    8340 * Another feature can be enabled by calling:
    8341 * \code
    8342 * ./evalcheck.sh printsoltimes=1 ...
    8343 * \endcode
    8344 * The output has two additional columns containing the solving time until the first and the best solution was found.
    8345 *
    8346 *
    8347 * @b Note: The @em basename of all these files is the same and has the following structure
    8348 * which allows us to reconstruct the test run:
    8349 *
    8350 * \code
    8351 * check.<test name>.<binary>.<machine name>.<setting name>
    8352 * \endcode
    8353 *
    8354 * \arg <<code>test name</code>> indicates the name of the the test file, e.g., <code>testrun</code>
    8355 * \arg <<code>binary</code>> defines the used binary, e.g., <code>scip-3.2.0.linux.x86_64.gnu.opt.spx</code>
    8356 * \arg <<code>machine name</code>> tells the name of the machine, e.g., <code>mycomputer</code>
    8357 * \arg <<code>setting name</code>> denotes the name of the used settings, e.g., <code>default</code>
    8358 * means the (SCIP) default settings were used
    8359 *
    8360 * Using the examples out of the previous listing the six file names would have the name:
    8361 *
    8362 * \code
    8363 * check.testrun.scip-1.1.0.linux.x86.gnu.opt.spx.mycomputer.default.<out,err,set,res,tex,pav>
    8364 * \endcode
    8365 *
    8366 *
    8367 * @section USING Using customized setting files
    8368 *
    8369 * It is possible to use customized settings files for the test run instead of testing SCIP with default settings.
    8370 * These have to be placed in the directory <code>scip/settings/</code>.
    8371 *
    8372 * @b Note: Several common user parameters such as, e.g., the time limit and node limit parameters,
    8373 * <b>cannot</b> be controlled by the settings file, whose specifications would be overwritten
    8374 * by optional command line arguments to the <code>make test</code> command, see @ref ADVANCED
    8375 * for a list of available advanced testing options that have to be specified from the command line.
    8376 *
    8377 * @b Note: Accessing settings files in subfolders of the @c settings directory is currently not supported.
    8378 *
    8379 * To run SCIP with a custom settings file, say for example <code>fast.set</code>, we call
    8380 *
    8381 * \code
    8382 * make TEST=testrun SETTINGS=fast test
    8383 * \endcode
    8384 *
    8385 * in the SCIP root directory. It is possible to enter a list of settings files as a double-quoted,
    8386 * comma-separated list of settings names as <code>fast</code> above, i.e. <code>SETTINGS="fast,medium,slow"</code>
    8387 * will invoke the solution process for every instance with the three settings <code>fast.set, medium.set, slow.set</code>
    8388 * before continuing with the next instance from the <code>.test</code>-file. This may come in handy if the
    8389 * whole test runs for a longer time and partial results are already available.
    8390 *
    8391 *
    8392 * @section ADVANCED Advanced options
    8393 *
    8394 * We can further customize the test run by specifying the following options in the <code>make</code> call:
    8395 *
    8396 * \arg <code>CONTINUE</code> - continue the test run if it was previously aborted [default: "false"]
    8397 * \arg <code>DISPFREQ</code> - display frequency of the output [default: 10000]
    8398 * \arg <code>FEASTOL</code> - LP feasibility tolerance for constraints [default: "default"]
    8399 * \arg <code>LOCK</code> - should the test run be locked to prevent other machines from performing the same test run [default: "false"]
    8400 * \arg <code>MAXJOBS=n</code> - run tests on 'n' cores in parallel. Note that several instances are solved in parallel, but
    8401 * only one thread is used per job (parallelization is not that easy) [default: 1]
    8402 * \arg <code>MEM</code> - memory limit in MB [default: 6144]
    8403 * \arg <code>NODES</code> - node limit [default: 2100000000]
    8404 * \arg <code>TIME</code> - time limit for each test instance in seconds [default: 3600]
    8405 * \arg <code>SETCUTOFF</code> - if set to '1', an optimal solution value (from the <code>.solu</code>-file) is used as objective limit [default: 0]
    8406 * \arg <code>THREADS</code> - the number of threads used for solving LPs, if the linked LP solver supports multithreading [default: 1]
    8407 * \arg <code>VALGRIND</code> - run valgrind on the SCIP binary; errors and memory leaks found by valgrind are reported as fails [default: "false"]
    8408 *
    8409 *
    8410 * @section COMPARE Comparing test runs for different settings
    8411 *
    8412 * Often test runs are performed on the basis of different settings. In this case, it is useful to
    8413 * have a performance comparison. For this purpose, we can use the <code>allcmpres.sh</code> script in
    8414 * the @c check directory.
    8415 *
    8416 * Suppose, we performed our test run with two different settings, say <code>fast.set</code> and
    8417 * <code>slow.set</code>. Assuming that all other parameters (including the SCIP binary), were the same,
    8418 * we may have the following <code>res</code>-files in the directory <code>scip/check/results/</code>
    8419 *
    8420 * \code
    8421 * check.testrun.scip-3.2.0.linux.x86_64.gnu.opt.spx.mycomputer.fast.res
    8422 * check.testrun.scip-3.2.0.linux.x86_64.gnu.opt.spx.mycomputer.slow.res
    8423 * \endcode
    8424 *
    8425 * For a comparison of both computations, we simply call
    8426 *
    8427 * \code
    8428 * allcmpres.sh results/check.testrun.scip-3.2.0.linux.x86_64.gnu.opt.spx.mycomputer.fast.res \
    8429 * results/check.testrun.scip-3.2.0.linux.x86_64.gnu.opt.spx.mycomputer.slow.res
    8430 * \endcode
    8431 *
    8432 * in the @c check directory. This produces an ASCII table on the console that provide a detailed
    8433 * performance comparison of both test runs. Note that the first <code>res</code>-file serves as reference
    8434 * computation. The following list explains the output.
    8435 * (The term "solver" can be considered as the combination of SCIP with a specific setting file.)
    8436 *
    8437 * \arg <code>Nodes</code> - Number of processed branch-and-bound nodes.
    8438 * \arg <code>Time</code> - Computation time in seconds.
    8439 * \arg <code>F</code> - If no feasible solution was found, then '#', empty otherwise.
    8440 * \arg <code>NodQ</code> - Equals Nodes(i) / Nodes(0), where 'i' denotes the current solver and '0' stands for the reference solver.
    8441 * \arg <code>TimQ</code> - Equals Time(i) / Time(0).
    8442 * \arg <code>bounds check</code> - Status of the primal and dual bound check.
    8443 *
    8444 * \arg <code>proc</code> - Number of instances processed.
    8445 * \arg <code>eval</code> - Number of instances evaluated (bounds check = "ok", i.e., solved to optimality
    8446 * within the time and memory limit and result is correct). Only these instances are used in the calculation
    8447 * of the mean values.
    8448 * \arg <code>fail</code> - Number of instances with bounds check = "fail".
    8449 * \arg <code>time</code> - Number of instances with timeout.
    8450 * \arg <code>solv</code> - Number of instances correctly solved within the time limit.
    8451 * \arg <code>wins</code> - Number of instances on which the solver won (i.e., the
    8452 * solver was at most 10% slower than the fastest solver OR had the best
    8453 * primal bound in case the instance was not solved by any solver within
    8454 * the time limit).
    8455 * \arg <code>bett</code> - Number of instances on which the solver was better than the
    8456 * reference solver (i.e., more than 10% faster).
    8457 * \arg <code>wors</code> - Number of instances on which the solver was worse than the
    8458 * reference solver (i.e., more than 10% slower).
    8459 * \arg <code>bobj</code> - Number of instances on which the solver had a better primal
    8460 * bound than the reference solver (i.e., a difference larger than 10%).
    8461 * \arg <code>wobj</code> - Number of instances on which the solver had a worse primal
    8462 * bound than the reference solver (i.e., a difference larger than 10%).
    8463 * \arg <code>feas</code> - Number of instances for which a feasible solution was found.
    8464 * \arg <code>gnodes</code> - Geometric mean of the processed nodes over all evaluated instances.
    8465 * \arg <code>shnodes</code> - Shifted geometric mean of the processed nodes over all evaluated instances.
    8466 * \arg <code>gnodesQ</code> - Equals nodes(i) / nodes(0), where 'i' denotes the current
    8467 * solver and '0' stands for the reference solver.
    8468 * \arg <code>shnodesQ</code> - Equals shnodes(i) / shnodes(0).
    8469 * \arg <code>gtime</code> - Geometric mean of the computation time over all evaluated instances.
    8470 * \arg <code>shtime</code> - Shifted geometric mean of the computation time over all evaluated instances.
    8471 * \arg <code>gtimeQ</code> - Equals time(i) / time(0).
    8472 * \arg <code>shtimeQ</code> - Equals shtime(i) / shtime(0).
    8473 * \arg <code>score</code> - N/A
    8474 *
    8475 * \arg <code>all</code> - All solvers.
    8476 * \arg <code>optimal auto settings</code> - Theoretical result for a solver that performed 'best of all' for every instance.
    8477 * \arg <code>diff</code> - Solvers with instances that differ from the reference solver in the number of
    8478 * processed nodes or in the total number of simplex iterations.
    8479 * \arg <code>equal</code> - Solvers with instances whose number of processed nodes and total number of
    8480 * simplex iterations is equal to the reference solver (including a 10% tolerance) and where no timeout
    8481 * occured.
    8482 * \arg <code>all optimal</code> - Solvers with instances that could be solved to optimality by
    8483 * <em>all</em> solvers; in particular, no timeout occurred.
    8484 *
    8485 * Since this large amount of information is not always needed, one can generate a narrower table by calling:
    8486 * \code
    8487 * allcmpres.sh short=1 ...
    8488 * \endcode
    8489 * where <code>NodQ</code>, <code>TimQ</code> and the additional comparison tables are omitted.
    8490 *
    8491 * If the <code>res</code>-files were generated with the parameter <code>printsoltimes=1</code>
    8492 * we can enable the same feature here as well by calling:
    8493 * \code
    8494 * allcmpres.sh printsoltimes=1 ...
    8495 * \endcode
    8496 * As in the evaluation, the output contains the two additional columns of the solving time until the first and the best solution was found.
    8497 *
    8498 * @section STATISTICS Statistical tests
    8499 *
    8500 * The \c allcmpres script also performs two statistical tests for comparing different settings: For deciding whether
    8501 * more feasible solutions have been found or more instances have been solved to optimality or not, we use a McNemar
    8502 * test. For comparing the running time and number of nodes, we use a variant of the Wilcoxon signed rank test. A
    8503 * detailed explanation can be found in the PhD thesis of Timo Berthold (Heuristic algorithms in global MINLP solvers).
    8504 *
    8505 * @subsection McNemar McNemar test
    8506 *
    8507 * Assume that we compare two settings \c S1 and \c S2 with respect to the number of instances solved to optimality
    8508 * within the timelimit. The null hypothesis would be "Both settings lead to an equal number of instances being solved
    8509 * to optimality", which we would like to disprove. Let \f$n_1\f$ be the number of instances solved by setting \c S1
    8510 * but not by \c S2, and let \f$n_2\f$ be the number of instances solved by setting \c S2 but not by \c S1. The
    8511 * McNemar test statistic is
    8512 * \f[
    8513 * \chi^2 = \frac{(n_1 - n_2)^2}{n_1 + n_2}.
    8514 * \f]
    8515 * Under the null hypothesis, \f$\chi^2\f$ is chi-squared distributed with one degree of freedom. This allows to compute
    8516 * a \f$p\f$-value as the probability for obtaining a similar or even more extreme result under the null hypothesis.
    8517 * More explicitly, \c allcmpres uses the following evaluation:
    8518 * - \f$0.05 < p\f$: The null hypothesis is accepted (marked by "X").
    8519 * - \f$0.005 < p \leq 0.05\f$: The null hypothesis might be false (marked by "!").
    8520 * - \f$0.0005 < p \leq 0.005\f$: The null hypothesis can be false (marked by "!!").
    8521 * - \f$p \leq 0.0005\f$: The null hypothesis is very likely false (marked by "!!!").
    8522 *
    8523 * As an example consider the following output:
    8524 * \code
    8525 * McNemar (feas) x2 0.0000, 0.05 < p X
    8526 * McNemar (opt) x2 6.0000, p ~ (0.005, 0.05] !
    8527 * \endcode
    8528 * Here, \c x2 represents \f$\chi^2\f$.
    8529 *
    8530 * In this case, the test with respect to the number of found feasible solutions is irrelevant, since their number is
    8531 * equal. In particular, the null hypothesis gets accepted (i.e., there is no difference in the settings - this is
    8532 * marked by "X").
    8533 *
    8534 * With respect to the number of instances solved to optimality within the timelimit, we have that \f$0.005 < p <=
    8535 * 0.05\f$ (marked by <tt>p ~ (0.005, 0.05)</tt>). Thus, there is some evidence that the null hypothesis is false, i.e., the
    8536 * settings perform differently; this is marked by "!". In the concrete case, we have 230 instances, all of which are
    8537 * solved by setting \c S2, but only 224 by setting \c S1.
    8538 *
    8539 * @subsection Wilcoxon Wilcoxon signed rank test
    8540 *
    8541 * Assume that we compare two settings \c S1 and \c S2 with respect to their solution times (within the time limit). We
    8542 * generate a sorted list of the ratios of the run times, where ratios that are (absolutely or relatively) within 1\%
    8543 * of 1.0 are discarded, and ratios between 0.0 and 0.99 are replaced with their negative inverse in order to
    8544 * obtain a symmetric distribution for the ratios around the origin.
    8545 * We then assign ranks 1 to \c N to the remaining \c N data points in nondecreasing
    8546 * order of their absolute ratio. This yields two groups \c G1
    8547 * and \c G2 depending on whether the ratios are smaller than -1.0 or larger than 1.0 (\c G1 contains the instances for which
    8548 * setting \c S1 is faster). Then the sums of the ranks in groups \c G1 and \c G2 are computed, yielding values \c R1
    8549 * and \c R2, respectively.
    8550 *
    8551 * The Wilcoxon test statistic is then
    8552 * \f[
    8553 * z = \frac{\min(R1, R2) - \frac{N(N+1)}{4}}{\sqrt{\frac{N(N+1)(2N+1)}{24}}},
    8554 * \f]
    8555 * which we assume to be (approximately) normally distributed (with zero mean) and allows to compute the probability
    8556 * \f$p\f$ that one setting is faster than the other. (Note that for \f$N \leq 60\f$, we apply a correction by
    8557 * subtracting 0.5 from the numerator).
    8558 *
    8559 * As an example consider the following output:
    8560 * \code
    8561 * Wilcoxon (time) z -0.1285, 0.05 <= p X
    8562 * Wilcoxon (nodes) z -11.9154, p < 0.0005 !!!
    8563 * \endcode
    8564 * While the \f$z\f$-value is close to zero for the run time, it is extremely negative regarding the solving nodes. This latter
    8565 * tendency for the number of nodes is significant on a 0.05 % level, i.e., the probability \f$p\f$ that setting \c S1 uses more
    8566 * nodes than setting \c S2 is negligible (this null hypothesis is rejected - marked by "!!!").
    8567 *
    8568 * However, the null hypothesis is not rejected with respect to the run time. In the concrete case, setting \c S1 has a
    8569 * shifted geometric mean of its run times (over 230 instances) of 248.5, for \c S2 it is 217.6. This makes a ratio of
    8570 * 0.88. Still - the null hypothesis is not rejected.
    8571 *
    8572 * @section SOLVER Testing and Evaluating using GAMS
    8573 *
    8574 * Analogously to the target <code>test</code> there is another target to run automated tests with <a href="http://www.gams.com/">gams</a>
    8575 * \code
    8576 * make testgams GAMSSOLVER=xyz
    8577 * \endcode
    8578 * For this target, the option GAMSSOLVER has to be given to specify the name of a GAMS solver to run, e.g. GAMSSOLVER=SCIP.
    8579 * Additional advanced options specific to this target are:
    8580 * GAMS to specify the GAMS executable (default: gams),
    8581 * GAP to specify a gap limit (default: 0.0),
    8582 * CLIENTTMPDIR to specify a directory where GAMS should put its scratch files (default: /tmp),
    8583 * CONVERTSCIP to specify a SCIP which can be used to convert non-gams files into gams format (default: bin/scip, if existing; set to "no" to disable conversion).
    8584 * The following options are NOT supported (and ignored): DISPFREQ, FEASTOL, LOCK.
    8585 * A memory limit (MEM option) is only passed as workspace option to GAMS, but not enforced via ulimit (it's up to the solver to regard and obey the limit).
    8586 *
    8587 * Note: This works only if the referred programs are installed globally on your machine.
    8588 *
    8589 * The above options like <code>TIME</code> are also available for gams.
    8590 *
    8591 * After the testrun there should be an <code>.out</code>, an <code>.err</code> and a <code>.res</code> file
    8592 * with the same basename as described above.
    8593 *
    8594 * Furthermore you can also use the script <code>allcmpres.sh</code> for comparing results.
    8595 *
    8596 * @section PYTHON Testing using PySCIPOpt
    8597 *
    8598 * To run a python script that uses PySCIPOpt with <code>make test</code> or <code>make testcluster</code>, one has to
    8599 * specify the python code to execute with the option <code>EXECUTABLE=/full/path/to/python-script.py</code>.
    8600 * Note that <code>python-script.py</code> must be an executable file.
    8601 * In addition, one <b>must</b> specify which python it should run with the option <code>PYTHON=my-python</code>.
    8602 * The reason for this is that one usually installs PySCIPOpt in a virtual environment, thus only the python of the
    8603 * virtual environment will work with the python script.
    8604 *
    8605 * The scripts work in such a way that they pass information to SCIP like the setting files, the instance name, and some other options.
    8606 * It is the responsability of the python script <code>python-script.py</code> to parse this information.
    8607 * Thus, you need to modify your python script to read the setting files and the other options provided by the testing scripts.
    8608 * An example of how to do this is provided in <code>scip/check/scip-runner.py</code>.
    8609 * One should either modify <code>scip/check/scip-runner.py</code> or include the <code>build_model()</code> function
    8610 * into your script to correctly read the options passed by the scripts.
    8611 *
    8612 * An example of how to run the tests is
    8613 * \code
    8614 * make test EXECUTABLE=/full/path/to/scip/check/scip-runner.py PYTHON=python
    8615 * \endcode
    8616 */
    8617
    8618/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8619
    8620/**@page COUNTER How to use SCIP to count/enumerate feasible solutions
    8621 *
    8622 * SCIP is capable of computing (count or enumerate) the number of feasible solutions of a given constraint integer
    8623 * program. In case continuous variables are present, the number of feasible solutions for the projection to the
    8624 * integral variables is counted/enumerated. This means, an assignment to the integer variables is counted if the
    8625 * remaining problem (this is the one after fixing the integer variables w.r.t. to this assignment) is feasible.
    8626 *
    8627 * As a first step you have to load or create your problem in the usual way. In case of using the
    8628 * interactive shell, you use the <code>read</code> command:
    8629 *
    8630 * <code>SCIP&gt; read &lt;file name&gt;</code>
    8631 *
    8632 * Afterwards you can count the number of feasible solution with the command <code>count</code>.
    8633 *
    8634 * <code>SCIP&gt; count</code>
    8635 *
    8636 * @note After completing the counting process, SCIP will terminate with status <tt>infeasible</tt>. This is intended
    8637 * behavior, because SCIP counts solutions by the following internal mechanism. Each feasible solution that is found is
    8638 * reported as infeasible to the SCIP core. This avoids that SCIP performs reductions based on the primal bound that
    8639 * could cut off suboptimal feasible solutions, which would then be missing in the count. However, as a result, the
    8640 * SCIP core has not found any feasible solutions during the search and reports status <tt>infeasible</tt>.
    8641 *
    8642 * By default, SCIP only counts the number of solutions but does not store (enumerate) them. If you are interested in
    8643 * that see \ref COLLECTALLFEASEBLES.
    8644 *
    8645 * @note Since SCIP version 2.0.0 you do not have to worry about the impact of dual reductions anymore. These are
    8646 * automatically turned off. The only thing you should switch off are restarts. These restarts can lead to a wrong
    8647 * counting process. We recommend using the counting settings which can be set in the interactive shell as follows:
    8648 *
    8649 * <code>SCIP&gt; set emphasis counter</code>
    8650 *
    8651 * The SCIP callable library provides an interface function SCIPcount() which allows users to count the number of feasible
    8652 * solutions to their problem. The function SCIPsetParamsCountsols(), which is also located in cons_countsols.h, loads the
    8653 * predefined counting settings to ensure a safe count. The complete list of all functions that can be used for counting
    8654 * via the callable library can be found in cons_countsols.h.
    8655 *
    8656 *
    8657 * @section COUNTLIMIT Limit the number of solutions which should be counted
    8658 *
    8659 * It is possible to give a (soft) upper bound on the number solutions that should be counted. If this upper bound is
    8660 * exceeded, SCIP will be stopped. The name of this parameter is <code>constraints/countsols/sollimit</code>. In
    8661 * the interactive shell this parameter can be set as follows:
    8662 *
    8663 * <code>SCIP&gt; set constraints countsols sollimit 1000</code>
    8664 *
    8665 * In case you are using the callable library, this upper bound can be assigned by calling SCIPsetLongintParam() as follows:
    8666 *
    8667 * \code
    8668 * SCIP_CALL( SCIPsetLongintParam( scip, "constraints/countsols/sollimit", 1000) );
    8669 * \endcode
    8670 *
    8671 *
    8672 * The reason why this upper bound is soft comes from the fact that, by default, SCIP uses a technique called unrestricted
    8673 * subtree detection. Using this technique it is possible to detect several solutions at once. Therefore, it can happen
    8674 * that the solution limit is exceeded before SCIP is stopped.
    8675 *
    8676 * @section COLLECTALLFEASEBLES Collect all feasible solutions
    8677 *
    8678 * Per default SCIP only counts all feasible solutions. This means, these solutions are not stored. If you switch the
    8679 * parameter <code>constraints/countsols/collect</code> to TRUE (the default value is FALSE) the detected solutions are
    8680 * stored. Changing this parameter can be done in the interactive shell
    8681 *
    8682 * <code>SCIP&gt; set constraints countsols collect TRUE</code>
    8683 *
    8684 * as well as via the callable library
    8685 *
    8686 * \code
    8687 * SCIP_CALL( SCIPsetBoolParam( scip, "constraints/countsols/collect", TRUE) );
    8688 * \endcode
    8689 *
    8690 * @note The solution which are collected are stored w.r.t. the active variables. These are the variables which got not
    8691 * removed during presolving.
    8692 *
    8693 * In case you are using the interactive shell you can write all collected solutions to a file as follows
    8694 *
    8695 * <code>SCIP&gt; write allsolutions &lt;file name&gt;</code>
    8696 *
    8697 * In that case the sparse solutions are unrolled and lifted back into the original variable space.
    8698 *
    8699 * The callable library provides a function which gives access to all collected sparse solutions. That is,
    8700 * SCIPgetCountedSparseSolutions(). The sparse solutions you get are defined w.r.t. active variables. To get solutions
    8701 * w.r.t. to the original variables. You have to do two things:
    8702 *
    8703 * -# unroll each sparse solution
    8704 * -# lift each solution into original variable space by extending the solution by those variable which got removed
    8705 * during presolving
    8706 *
    8707 * The get the variables which got removed during presolving, you can use the functions SCIPgetFixedVars() and
    8708 * SCIPgetNFixedVars(). The function SCIPgetProbvarLinearSum() transforms given variables, scalars and constant to the
    8709 * corresponding active variables, scalars and constant. Using this function for a single variable gives a representation
    8710 * for that variable w.r.t. the active variables which can be used to compute the value for the considered solution (which
    8711 * is defined w.r.t. active variables).
    8712 *
    8713 * For that complete procedure you can also check the source code of
    8714 * \ref SCIP_DECL_DIALOGEXEC(SCIPdialogExecWriteAllsolutions) "SCIPdialogExecWriteAllsolutions()" cons_countsols.c which
    8715 * does exactly that.
    8716 *
    8717 *
    8718 * @section COUNTOPTIMAL Count number of optimal solutions
    8719 *
    8720 * If you are interested in counting the number of optimal solutions, this can be done with SCIP using the
    8721 * <code>count</code> command by applying the following steps:
    8722 *
    8723 * -# Solve the original problem to optimality and let \f$c^*\f$ be the optimal value
    8724 * -# Added the objective function as constraint with left and right hand side equal to \f$c^*\f$
    8725 * -# load the adjusted problem into SCIP
    8726 * -# use the predefined counting settings
    8727 * -# start counting the number of feasible solutions
    8728 *
    8729 * If you do this, SCIP will collect all optimal solutions of the original problem.
    8730 *
    8731 */
    8732
    8733/*--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    8734
    8735/** @page SYMMETRY How to use symmetry handling in SCIP
    8736 *
    8737 * Symmetry handling is an important feature of SCIP that allows to discard symmetric subproblems from the
    8738 * branch-and-bound tree, and thus, can substantially reduce the running time. To handle symmetries, SCIP
    8739 * automatically detects symmetries and then applies (combinations of) symmetry handling methods.
    8740 *
    8741 * @section SYMDETECT Symmetry detection
    8742 *
    8743 * SCIP can detect two types of symmetries: permutation symmetries and signed permutation symmetries.
    8744 * In a purely integer linear setting
    8745 * \f[
    8746 * \max \{ c^{\top} x : Ax \leq b,\; x \in \mathbb{Z}^n \},
    8747 * \f]
    8748 * a permutation symmetry is a permutation \f$\gamma\f$ of \f$\{1,\dots,n\}\f$ that acts on vector \f$x\f$ by
    8749 * permuting its coordinates via \f$\gamma(x) = (x_{\gamma^{-1}(1)}, \dots, x_{\gamma^{-1}(n)})\f$
    8750 * such that
    8751 *
    8752 * -# \f$\gamma\f$ leaves the objective invariant, i.e., \f$c^{\top}x = c^{\top}\gamma(x)\f$, and
    8753 * -# \f$\gamma\f$ maps feasible solutions onto feasible solutions, i.e., \f$Ax \leq b\f$ if and only
    8754 * if \f$A\gamma(x) \leq b\f$.
    8755 *
    8756 * Signed permutation symmetries are defined similarly and allow to also handle symmetries arising from
    8757 * reflections of the feasible region along standard hyperplanes, e.g., mapping \f$x_i\f$ to \f$-x_i\f$
    8758 * and keeping the remaining entries of a solution vector \f$x\f$ invariant. Formally, a signed permutation \f$\gamma\f$
    8759 * is a permutation of the set \f$\{\pm 1, \dots, \pm n\}\f$ such that \f$\gamma(-i) = - \gamma(i)\f$
    8760 * for all \f$i \in \{1,\dots,n\}\f$. A signed permutation acts on a vector \f$x\f$ as
    8761 * \f$\gamma(x) = (\mathrm{sgn}(\gamma^{-1}(1))x_{|\gamma^{-1}(1)|},\dots,
    8762 * \mathrm{sgn}(\gamma^{-1}(n))x_{|\gamma^{-1}(n)|})\f$,
    8763 * where \f$\mathrm{sgn}(\cdot)\f$ is the sign function. The remaining properties of a symmetry are the same.
    8764 * It is possible to switch between these two types of symmetries via the
    8765 * parameter <code>propagating/symmetry/symtype</code>.
    8766 * Moreover, to detect more general signed permutations, one can shift variables with a
    8767 * bounded domain to be centered at the origin. This way, also variables with, e.g., domains \f$[1,2]\f$
    8768 * and \f$[0,1]\f$ can be symmetric. In SCIP, we implement this shift only within symmetry detection
    8769 * to find generalized signed permutations; the variable bounds of the problem itself remain unchanged.
    8770 *
    8771 * Since both definitions depend on the feasible region of the integer program, which is unknown
    8772 * in general, SCIP only computes symmetries that leave the formulation of the optimization problem
    8773 * invariant. To detect such formulation symmetries, SCIP builds an auxiliary colored graph whose
    8774 * color-preserving automorphisms correspond to symmetries of the integer program. The symmetries of
    8775 * the graph, and thus of the integer program, are then computed by an external graph automorphism
    8776 * library that needs to be linked to SCIP. Currently, SCIP can use three such libraries: The graph
    8777 * automorphism libraries bliss, nauty/traces, and dejavu. They are the basic workhorses to detect symmetries. Moreover, one can use
    8778 * sassy, a graph symmetry preprocessor which passes the preprocessed graphs to bliss or nauty/traces; sassy is automatically included in dejavu.
    8779 * The current default is to use nauty in combination with sassy for symmetry detection.
    8780 * To use other symmetry packages, options <code>SYM</code> and <code>-DSYM</code> in the Makefile and CMake
    8781 * system, respectively, need to be set.
    8782 *
    8783 * Besides purely integer linear problems, SCIP also supports symmetry detection for general
    8784 * constraint mixed-integer programs containing most of the constraint types that can be handled
    8785 * by SCIP. In particular, symmetries of mixed-integer nonlinear problems can be detected.
    8786 * Moreover, symmetries can also be detected in code containing customized constraints.
    8787 * To this end, a suitable callback needs to be implemented, see \ref SYMDETECTCUSTOM.
    8788 *
    8789 * The (generators of the) symmetry group detected by SCIP can be printed to the terminal
    8790 * by querying <code>display symmetry</code> in SCIP's interactive shell.
    8791 *
    8792 * @subsection SYMPROCESS Processing symmetry information
    8793 *
    8794 * After symmetries have been computed, SCIP has access to a list \f$\gamma_1,\dots,\gamma_m\f$ of
    8795 * (signed) permutations that generate a group \f$\Gamma\f$ of symmetries of the optimization problem. That
    8796 * is, SCIP has not access to all permutations in \f$\Gamma\f$, but only a set of generators. Based
    8797 * on these generators, SCIP analyzes the group \f$\Gamma\f$ and checks whether it can be split into
    8798 * independent factors. That is, whether there exist subgroups \f$\Gamma_1,\dots,\Gamma_k\f$ of
    8799 * \f$\Gamma\f$ that act on pairwise independent sets of variables such that \f$\bigcup_{i=1}^k \Gamma_i = \Gamma\f$.
    8800 * In this case, SCIP can handle the symmetries of the different subgroups independently. In particular,
    8801 * different subgroups can be treated by different symmetry handling methods.
    8802 *
    8803 * @section SYMMETHODS Symmetry handling methods
    8804 *
    8805 * Most symmetry handling methods available in SCIP have only been implemented for ordinary permutation symmetries,
    8806 * and not for signed permutation symmetries. In the following, we silently assume that the described methods
    8807 * deal with ordinary permutation symmetries if not mentioned differently.
    8808 * To handle symmetries, SCIP uses three different classes of methods, which we detail below.
    8809 *
    8810 * @subsection SYMCONSS Static symmetry handling constraints for binary variable domains
    8811 *
    8812 * SCIP contains three constraint handlers for handling symmetries of binary variables: the symresack,
    8813 * orbisack, and orbitope constraint handler. Given a symmetry \f$\gamma\f$,
    8814 * the symresack constraint handler enforces that a solution vector \f$x\f$ is not lexicographically
    8815 * smaller than its image \f$\gamma(x)\f$. This constraint is enforced by a propagation algorithm
    8816 * and separating inequalities. Moreover, given the disjoint cycle decomposition of \f$\gamma\f$,
    8817 * SCIP checks, for each cycle of \f$\gamma\f$, whether all variables in the cycle are contained
    8818 * in set packing or partitioning constraints. If this is the case, specialized inequalities can
    8819 * be separated.
    8820 *
    8821 * In case the permutation \f$\gamma\f$ is an involution, i.e., \f$\gamma(\gamma(x)) = x\f$,
    8822 * specialized separation and propagation algorithms can be used, which are implemented in the
    8823 * orbisack constraint handler. For orbisack constraints, also facet-defining inequalities of the
    8824 * convex hull of all binary points \f$x\f$ being not lexicographically smaller than \f$\gamma(x)\f$
    8825 * can be separated. Since the coefficients in these inequalities grow exponentially large which might
    8826 * cause numerical instabilities, the separation of these inequalities is disabled by default, but can be
    8827 * enabled via the parameter <code>constraints/orbisack/orbiSeparation</code>. Furthermore, to avoid
    8828 * numerical instabilities, the parameter <code>constraints/orbisack/coeffbound</code> controls the
    8829 * maximum absolute value of a coefficient in separated facet-defining inequalities.
    8830 *
    8831 * Finally, the orbitope constraint handler is able to handle symmetries of special symmetric groups \f$\Gamma\f$.
    8832 * For orbitopes to be applicable, the affected variables need to be arranged in a matrix \f$X\f$ such that
    8833 * the symmetries in \f$\Gamma\f$ permute the columns of \f$X\f$. Symmetries are then handled by orbitope
    8834 * constraints by enforcing to only compute solution matrices \f$X\f$ whose columns are sorted lexicographically
    8835 * non-increasingly. To this end, a propagation algorithm is used and inequalities are separated. In case
    8836 * the variables of each row of the matrix \f$X\f$ are contained in a set packing or partitioning constraint,
    8837 * specialized propagation and separation routines are used.
    8838 *
    8839 * @subsection SYMPROP Dynamic symmetry handling by propagation
    8840 *
    8841 * Static symmetry handling enforces a lexicographic ordering on the variable solution vectors.
    8842 * The pro of that approach, is that throughout the solving process, the same lexicographic ordering constraint
    8843 * is used. This means that already during presolving certain symmetry reductions can be made.
    8844 * The con of this approach is that an ordering of the variables for lexicographic comparisons have to be made
    8845 * before solving. Consequently, if reductions of certain variable domains are found, but these variables are compared
    8846 * late by the lexicographic comparison order, the effect for symmetry handling is very slim.
    8847 *
    8848 * Dynamic symmetry handling addresses this issue by propagating symmetry handling constraints, where the variable
    8849 * comparison ordering are determined while solving, attempting to make strong symmetry handling reductions early on.
    8850 * Dynamic symmetry handling removes feasible solutions of the problem, while it is guaranteed that at least one
    8851 * symmetric solution remains feasible.
    8852 *
    8853 * Whether dynamic or static symmetry handling methods are used, is determined by the boolean parameter
    8854 * <code>propagating/symmetry/usedynamicprop</code>.
    8855 * SCIP features three dynamic symmetry handling methods.
    8856 * SCIP only provides propagation methods for handling these symmetries,
    8857 * and the methods work on variables with arbitrary (so also non-binary) variable domains.
    8858 *
    8859 * -# Orbitopal reduction is the dynamic counterpart of orbitopal fixing. This method can be used if the variables
    8860 * can be arranged without duplicates in a matrix, and symmetries permute the columns of this matrix. This method
    8861 * propagates the variable domains such that solutions in matrix-form have lexicographically decreasing columns,
    8862 * with respect to the dynamically chosen row and column order.
    8863 * Orbitopal reduction respects the parameter <code>propagating/symmetry/detectorbitopes</code>.
    8864 * -# Lexicographic reduction is the dynamic counterpart of symresack and orbisack propagation.
    8865 * Lexicographic reduction respects the parameter <code>propagating/symmetry/addsymresacks</code>.
    8866 * At the moment, the implementation of this method is the only one that allows to also handle signed permutation
    8867 * symmetries.
    8868 * -# Orbital reduction is a generalization of orbital fixing that also works for non-binary variable domains.
    8869 * Orbital reduction respects the 2-bit of the bitset <code>misc/usesymmetry</code>.
    8870 * See \ref SYMMETHODSELECT "method selection". Since there is no static counterpart, this method ignores
    8871 * <code>propagating/symmetry/usedynamicprop</code>.
    8872 *
    8873 * In all cases, the dynamic variable ordering is derived from the branching decisions.
    8874 * In particular, at different branch-and-bound tree nodes, a different variable ordering can be active.
    8875 * Since the symmetries are handled for independent factors of the symmetry group, a different variable ordering method
    8876 * can be used for handling symmetries in different factors. In SCIP, the same method is used for orbital reduction and
    8877 * for lexicographic reduction, which means that these two methods are compatible and can be used simultaneously in the
    8878 * same factor. Orbitopal reduction uses a different method.
    8879 *
    8880 * As SCIP might restart the branch-and-bound process, which removes information regarding the branching decisions,
    8881 * we need to make sure that correct reductions are found after a restart.
    8882 * If a restart occurs, static symmetry handling methods are preserved. Since dynamic symmetry handling methods
    8883 * depend on the branch-and-bound tree structure, and because the prior branch-and-bound tree is removed,
    8884 * the dynamic symmetry handling methods are disabled after a restart.
    8885 *
    8886 * @subsection SYMSST SST cuts
    8887 *
    8888 * The Schreier-Sims table (SST) is a table that contains certain information about symmetry groups
    8889 * and can be used, among others, to derive symmetry handling inequalities. The corresponding SST cuts
    8890 * are symmetry handling inequalities that are defined iteratively in rounds \f$r = 1,\dots,R\f$.
    8891 * In each round \f$r\f$, a leader variable \f$\ell_r\f$ is selected and the group
    8892 * \f$\Gamma_r = \{ \gamma \in \Gamma : \gamma(\ell_i) = \ell_i \text{ for all } i = 1,\dots,r-1\}\f$
    8893 * is considered. Then, the symmetry handling inequalities of round \f$r\f$ are defined as
    8894 * \f$x_{\ell_r} \geq x_j\f$ for all \f$j \in \{\gamma(i) : i \in \{1,\dots,n\}\}\f$.
    8895 * The latter set is called the orbit of leader \f$\ell_r\f$.
    8896 *
    8897 * SST cuts admit many degrees of freedom. In particular, they are not limited to binary variables
    8898 * but can be used for arbitrary variable types. A user can gain control over the selection process of
    8899 * SST cuts via several parameters. For instance,
    8900 *
    8901 * - <code>sstleadervartype</code> is a bitset encoding the variable types of leaders: the 1-bit models binary,
    8902 * the 2-bit integer, the 4-bit implied integral of any type, and the 8-bit continuous variables. That is, a value
    8903 * of 9 models that the leader can be a binary or continuous variable.
    8904 * - <code>sstleaderrule</code> ranges from 0 to 2 and models whether a leader is the first variable in
    8905 * its orbit, the last variable in its orbit, or a variable with most conflicts with other variables in
    8906 * the orbit, respectively.
    8907 * - <code>ssttiebreakrule</code> ranges from 0 to 2 and models whether an orbit of minimum size, maximum
    8908 * size or with most variables being in conflict to the leader is selected, respectively.
    8909 * - <code>sstmixedcomponents</code> whether SST cuts are also applied if a symmetries do not only affect
    8910 * variables of a single type.
    8911 * - <code>sstaddcuts</code> whether SST cuts are added to the problem. If no cuts are added, only
    8912 * binary variables might be fixed to 0 if they are in conflict with the leader.
    8913 *
    8914 * @subsection SYMMETHODSELECT Selecting symmetry handling methods
    8915 *
    8916 * The symmetry handling methods explained above can be enabled and disabled via the parameter
    8917 * <code>misc/usesymmetry</code>, which encodes the enabled methods via a bitset that ranges between 0
    8918 * and 7: the 1-bit encodes symmetry handling constraints, the 2-bit encodes orbital reduction, and the
    8919 * 4-bit encodes SST cuts. For example, <code>misc/usesymmetry = 3</code> enables symmetry handling
    8920 * constraints and orbital reduction, whereas <code>misc/usesymmetry = 0</code> disables symmetry handling.
    8921 * In the following, we explain how the combination of different symmetry handling methods works.
    8922 *
    8923 * The default strategy of SCIP is to handle symmetries via the bitset value 7, i.e., symmetry handling
    8924 * constraints, orbital reduction, and SST cuts are enabled. To make sure that the different methods are
    8925 * compatible, the following steps are carried out:
    8926 *
    8927 * -# SCIP determines independent subgroups \f$\Gamma_1,\dots,\Gamma_k\f$ as described in \ref SYMPROCESS.
    8928 * Then, for each subgroup \f$\Gamma_i\f$, different symmetry handling methods can be applied.
    8929 * -# For each subgroup \f$\Gamma_i\f$, a heuristic is called that checks whether orbitopes are applicable
    8930 * to handle the entire subgroup. If yes, this subgroup is handled by orbitopes and no other
    8931 * symmetry handling methods.
    8932 * -# Otherwise, if parameter <code>propagating/symmetry/detectsubgroups</code> is <code>TRUE</code>
    8933 * and <code>propagating/symmetry/usedynamicprop</code> is <code>FALSE</code>, a
    8934 * heuristic is called to detect whether "hidden" orbitopes are present. That is, whether some but not
    8935 * all symmetries of \f$\Gamma_i\f$ can be handled by orbitopes. If sufficiently many symmetries can
    8936 * be handled by orbitopes, orbitopes are applied and, if parameter <code>propagating/symmetry/addweaksbcs</code>
    8937 * is TRUE, some compatible SST cuts are added, too. Besides this, no further symmetry handling methods
    8938 * are applied for \f$\Gamma_i\f$.
    8939 * -# Otherwise, orbital reduction is used. If <code>propagating/symmetry/usedynamicprop</code> and
    8940 * <code>propagating/symmetry/addsymresacks</code> are <code>TRUE</code>, then also the dynamic lexicographic
    8941 * reduction method is used.
    8942 * -# Otherwise, if the majority of variables affected by \f$\Gamma_i\f$ are non-binary, SST cuts are applied
    8943 * to handle \f$\Gamma_i\f$. No further symmetry handling methods are applied for \f$\Gamma_i\f$.
    8944 *
    8945 * @note If orbital reduction is enabled, a factor \f$\Gamma_i\f$ can always be handled by this method.
    8946 * As such, by default, no SST cuts will be added.
    8947 *
    8948 * @note Depending on the setting of <code>misc/usesymmetry</code>, it might be possible that a symmetry component is
    8949 * not handled. For instance, if only orbitopal reduction is used
    8950 * (i.e., <code>propagating/symmetry/detectorbitopes</code> is set to 1),
    8951 * and if a symmetry component is no orbitope, no symmetry is handled for that component at all.
    8952 *
    8953 *
    8954 * @subsection SYMTIMING Controlling the timing of symmetry computation
    8955 *
    8956 * Since presolving might both remove and introduce formulation symmetries, the timing of computing symmetries
    8957 * can be changed via the parameter <code>propagating/symmetry/symtiming</code>.
    8958 * The parameter takes value 0, 1, or 2, corresponding to computing symmetries before presolving,
    8959 * during presolving, or at the end of presolving, respectively.
    8960 * Based on the computed symmetries, SCIP enables some symmetry handling methods as explained above.
    8961 *
    8962 * @subsection SYMDETECTCUSTOM Symmetry detection for customized constraints
    8963 *
    8964 * To detect (signed) permutation symmetries, SCIP requests from each constraint present in the problem to be solved
    8965 * a node and edge colored graph whose symmetries correspond to the symmetries of the corresponding constraint.
    8966 * This information is provided by two callbacks, the SCIP_DECL_CONSGETPERMSYMGRAPH callback for permutation
    8967 * symmetries and the SCIP_DECL_CONSGETSIGNEDPERMSYMGRAPH callback for signed permutation symmetries. If a
    8968 * constraint handler does not implement one of these callbacks, SCIP will not detect symmetries of the corresponding
    8969 * type.
    8970 *
    8971 * In the following, we briefly describe how such a symmetry detection graph looks like for linear constraints.
    8972 * Afterwards, we mention the basic setup of the symmetry detection graphs and how the callbacks could be implemented
    8973 * for customized constraints.
    8974 *
    8975 * @subsubsection SYMDETECTLINEAR Symmetry detection graphs for linear constraints
    8976 *
    8977 * Simple permutation symmetries of a linear constraint \f$\sum_{i = 1}^n a_ix_i \leq \beta\f$ are given
    8978 * by permutations that exchange equivalent variables with the same coefficients. These symmetries can be encoded
    8979 * by a graph with the following structure. For every variable \f$x_i\f$, the graph contains a node \f$v_i\f$
    8980 * that receives a color that uniquely determines the type of the variable (lower/upper bound, objective coefficient,
    8981 * integrality). Moreover, the graph contains a node \f$w\f$ that receives a color corresponding to the right-hand side
    8982 * \f$\beta\f$. Node \f$w\f$ is then connected with all nodes corresponding to variables. Edge \f$\{w,v_i\}\f$ then
    8983 * receives a color corresponding to the coefficient \f$a_i\f$. Then, every automorphism of this graph corresponds to a
    8984 * permutation symmetry of the linear constraint.
    8985 *
    8986 * For signed permutation symmetries, almost the same construction can be used. The only difference is that also
    8987 * nodes \f$v_{-i}\f$ need to be introduced that correspond to the negation of variable \f$x_i\f$. These negated
    8988 * variable nodes are then also connected with node \f$\beta\f$ and the corresponding edge receives color \f$-a_i\f$.
    8989 * Finally, to make sure that the corresponding symmetry corresponds to a signed permutation \f$\gamma\f$, i.e.,
    8990 * \f$\gamma(-i) = - \gamma(i)\f$, one also needs to add the edges \f$\{v_i,v_{-i}\}\f$ that remain uncolored.
    8991 * Note that the color of node \f$v_{-i}\f$ also needs to uniquely determine the negated variable bounds and
    8992 * objective coefficient.
    8993 *
    8994 * @subsubsection SYMDETECTRULES Principles for building symmetry detection graphs
    8995 *
    8996 * A symmetry detection graph of a constraint needs to have the property that each of its automorphisms corresponds
    8997 * to a (signed) permutation of the constraint. Moreover, the corresponding constraint handler of the constraints
    8998 * needs to be encoded in the graph to make sure that only symmetries between equivalent constraints can be computed.
    8999 * Among others, this can be achieved by assigning the nodes and edges appropriate colors. To make sure that the
    9000 * colors are compatible between the different symmetry detection graphs, SCIP automatically determines the colors of
    9001 * nodes and edges based on information that is provided by the user (or the creator of the graph).
    9002 *
    9003 * A pointer to a globally maintained symmetry detection graph is provided to the callbacks. The nodes and edges of the
    9004 * graph of a constraint are added to this global graph.
    9005 * The nodes of the graph need to be added via the functions <code>SCIPaddSymgraphValnode()</code>
    9006 * and <code>SCIPaddSymgraphConsnode()</code>. The first function can be used to create nodes corresponding to
    9007 * a numerical value like \f$\beta\f$ in the above example, the latter function creates a node corresponding to
    9008 * a provided constraint. This ensures that only symmetry detection graphs from the same constraint handler
    9009 * can be isomorphic. The colors of the nodes are then computed automatically by SCIP based on the information
    9010 * that is provided the functions creating these nodes. This ensures that node colors are compatible.
    9011 *
    9012 * Edges are created via the function <code>SCIPaddSymgraphEdge()</code> which receives, among others, the
    9013 * indices of created nodes. Note that there is no function for creating variable nodes as SCIP automatically
    9014 * creates nodes for variables. Their indices can be accessed via <code>SCIPgetSymgraphVarnodeidx()</code> for
    9015 * original variables and <code>SCIPgetSymgraphNegatedVarnodeidx()</code> for negated variables used for
    9016 * signed permutations. The edges between variables \f$x_i\f$ and \f$-x_i\f$ are also automatically present
    9017 * in the symmetry detection graph for signed permutation symmetries. The function <code>SCIPaddSymgraphEdge()</code>
    9018 * also takes a numerical value as argument, which allows to assign an edge a weight (e.g., \f$a_i\f$
    9019 * as in the above example).
    9020 *
    9021 * Moreover, special nodes, so-called operator nodes, can be added via <code>SCIPaddSymgraphOpnode()</code>.
    9022 * Such nodes allow to model special structures of a constraint, which allow to have more degrees of freedom in
    9023 * creating symmetry detection graphs. Different operators are distinguished by an integral value.
    9024 * Their encoding is thus similar to the one of nodes created by <code>SCIPaddSymgraphValnode()</code>.
    9025 * In computing colors, operator nodes are treated differently though, which allows to distinguish
    9026 * operator 2 from the numerical value 2.
    9027 *
    9028 * @subsubsection SYMDETECTEXAMPLES Example for creating symmetry detection callbacks
    9029 *
    9030 * Let \f$G = (V,E)\f$ be an undirected graph with node weights \f$c_v\f$, \f$v \in C\f$. The maximum weight
    9031 * stable set problem can be modeled via the integer program
    9032 * \f\[ \max\Big\{ \sum_{v \in V} c_vx_v : x_u + x_v \leq 1 \text{ for all } \{u,v\} \in E,\; x \in \{0,1\}^V\Big\}.\f\]
    9033 * Suppose a user wants to implement a constraint handler <code>cons_stableset</code> that enforces a solution to define
    9034 * a stable set in \f$G\f$, e.g., by propagation methods and separating edge and clique inequalities.
    9035 * Then, the symmetries of the constraint are the weight-preserving automorphisms of the underlying graph \f$G\f$.
    9036 * The symmetry detection graph thus can be almost a copy of \f$G\f$.
    9037 *
    9038 * In our construction, we introduce for each node \f$v\f$ of the graph an operator node \f$v'\f$.
    9039 * Moreover, for each edge \f$\{u,v\}\in E\f$, we add the edges \f$\{u',v'\}\f$ to the symmetry detection graph.
    9040 * To identify the symmetry detection graph as derived from <code>cons_stableset</code>, we add a constraint node
    9041 * that is connected with all operator nodes, which preserves the automorphisms of \f$G\f$. Finally, each
    9042 * node \f$v'\f$ is connected with the corresponding variable node for \f$x_v\f$ by an edge.
    9043 *
    9044 * In the following, we present a code snippet showing how to implement the above mentioned symmetry detection graph.
    9045 * We assume that the constraint data <code>consdata</code> contains the following fields
    9046 *
    9047 * - <code>nnodes</code> number of nodes in graph;
    9048 * - <code>nedges</code> number of edges in graph;
    9049 * - <code>first</code> array containing the first nodes of each edge;
    9050 * - <code>second</code> array containing the second nodes of each edge;
    9051 * - <code>weights</code> array containing for each node its corresponding weight;
    9052 * - <code>vars</code> array containing a binary variable for each node modeling whether node is present in stable set.
    9053 *
    9054 * The code for creating the symmetry detection callback could then look like this.
    9055 *
    9056 * \code{.c}
    9057 * #define NODEOP 1
    9058 * static
    9059 * SCIP_DECL_CONSGETPERMSYMGRAPH(consGetPermsymGraphStableSet)
    9060 * {
    9061 * SCIP_CONSDATA* consdata;
    9062 * int* idx;
    9063 * int vidx;
    9064 * int nnodes;
    9065 * int v;
    9066 *
    9067 * consdata = SCIPconsGetData(cons);
    9068 * nnodes = consdata->nnodes;
    9069 *
    9070 * SCIP_CALL( SCIPallocBufferArray(scip, &idx, nnodes + 1) );
    9071 *
    9072 * // create operator nodes and constraint node
    9073 * for( v = 0; v < nnodes; ++v )
    9074 * {
    9075 * SCIP_CALL( SCIPaddSymgraphOpnode(scip, graph, NODEOP, &idx[v]) );
    9076 * }
    9077 * SCIP_CALL( SCIPaddSymgraphConsnode(scip, graph, cons, 0.0, 0.0, &idx[nnodes]) );
    9078 *
    9079 * // add edges of underlying graph
    9080 * for( v = 0; v < consdata->nedges; ++v )
    9081 * {
    9082 * SCIP_CALL( SCIPaddSymgraphEdge(scip, graph, idx[consdata->first[v]], idx[consdata->second[v]], FALSE, 0.0) );
    9083 * }
    9084 *
    9085 * // connect nodes with constraint node
    9086 * for( v = 0; v < nnodes; ++v )
    9087 * {
    9088 * SCIP_CALL( SCIPaddSymgraphEdge(scip, graph, idx[v], nodeidx[nnodes], FALSE, 0.0) );
    9089 * }
    9090 *
    9091 * // connect operator nodes with variable nodes, assign edges weight of node
    9092 * for( v = 0; v < nnodes; ++v )
    9093 * {
    9094 * vidx = SCIPgetSymgraphVarnodeidx(scip, graph, consdata->vars[v]);
    9095 * SCIP_CALL( SCIPaddSymgraphEdge(scip, graph, idx[v], vidx, TRUE, consdata->weights[v]) );
    9096 * }
    9097 *
    9098 * SCIPfreeBufferArray(scip, &idx);
    9099 *
    9100 * return SCIP_OKAY;
    9101 * }
    9102 * \endcode
    9103 */
    9104
    9105/**@page LICENSE License
    9106 *
    9107 * \verbinclude LICENSE
    9108 */
    9109
    9110/**@page FAQ Frequently Asked Questions (FAQ)
    9111 * \htmlinclude faq/faq.inc
    9112 */
    9113
    9114
    9115/**@page PARAMETERS List of all SCIP parameters
    9116 *
    9117 * This page list all parameters of the current SCIP version. This list can
    9118 * easily be generated by SCIP via the interactive shell using the following command:
    9119 *
    9120 * <code>SCIP&gt; set save &lt;file name&gt;</code>
    9121 *
    9122 * or via the function call:
    9123 *
    9124 * <code>SCIP_CALL( SCIPwriteParams(scip, &lt;file name&gt;, TRUE, FALSE) );</code>
    9125 *
    9126 * \verbinclude parameters.set
    9127 */
    9128
    9129/**@page INTERFACES Interfaces
    9130 *
    9131 * There are several ways of accessing the \SCIP Optimization Suite from other software packages or programming
    9132 * platforms.
    9133 *
    9134 *
    9135 * @section FILEFORMATS File formats
    9136 *
    9137 * The easiest way to load a problem into SCIP is via an input file, given in a format that SCIP can parse directly,
    9138 * see \ref SHELL "the tutorial on how to use the interactive shell".
    9139 * \SCIP is capable of reading more than ten different file formats, including formats for nonlinear
    9140 * problems and constraint programs. This gives researchers from different communities an easy access to the
    9141 * \SCIP Optimization Suite. See also the \ref AVAILABLEFORMATS "list of readable file formats".
    9142 *
    9143 * @section C_API C API
    9144 *
    9145 * The main access point for \SCIP is its API to C. Please refer to the \ref PUBLICAPI documentation
    9146 * for further details.
    9147 *
    9148 * @section CPLUSPLUS C++ wrapper classes
    9149 *
    9150 * Since \SCIP is written in C, its callable library can be directly accessed from C++. If a user wants to program own
    9151 * plugins in C++, there are wrapper classes for all different types of plugins available in the <code>src/objscip</code>
    9152 * directory of the \SCIP standard distribution. SCIP provides several examples that were written in C++, see
    9153 * \ref EXAMPLES "Examples".
    9154 *
    9155 * @section SCIPINTERFACES Interfaces for other programming languages
    9156 *
    9157 * Interfaces for other programming languages are developed and maintained independently from the SCIP Optimization Suite
    9158 * on <a href="https://github.com/scipopt">GitHub</a> in order to provide extensions and patches faster
    9159 * and to collaborate on them more easily.
    9160 *
    9161 * - <a href="https://github.com/scipopt/PySCIPOpt">PySCIPOpt</a> provides an extensive open-source interface for Python.
    9162 * PySCIPOpt can be installed via <a href="https://anaconda.org/conda-forge/pyscipopt">conda-forge</a>,
    9163 * which automatically includes \SCIP.
    9164 * PySCIPOpt uses wrappers to allow users to build
    9165 * their own plugins without accessing the C code of \SCIP itself.
    9166 * Since Python is one of the most commonly used programming languages, especially in the field of
    9167 * machine learning, the API gives easy access to the solvers functionality to incorporate \SCIP
    9168 * into any python project pipeline, extract data for further analysis and computation as well as allow
    9169 * customizing the solving process.
    9170 * - <a href="https://github.com/scipopt/SCIP.jl">SCIP.jl</a> is a
    9171 * Julia interface that exposes an API identical to the SCIP-C_API and implements the
    9172 * MathOptInterface used by most constrained solvers in Julia.
    9173 * It can be accessed through the Julia package manager and will install a pre-built version of
    9174 * \SCIP if none is provided by the user.
    9175 * - There is a <a href="https://github.com/scipopt/MatlabSCIPInterface">Matlab interface</a>
    9176 * to use SCIP and SCIP-SDP from Matlab and Octave.
    9177 * - <a href="https://github.com/scipopt/JSCIPOpt">JSCIPOpt</a> is an interface for Java.
    9178 * - <a href="https://github.com/scipopt/russcip">Russcip</a> is an interface for Rust.
    9179 * - <a href="https://github.com/scipopt/SCIPpp">SCIP++</a> is a modeling interface for C++.
    9180 *
    9181 * Contributions to these projects are very welcome.
    9182 *
    9183 * There are also many third-party python interfaces to the \SCIP Optimization Suite, for example:
    9184 * - <a href="https://github.com/eomahony/Numberjack">NUMBERJACK</a> is a constraint programming platform implemented in python.
    9185 * It supports a variety of different solvers, one of them being the \SCIP Optimization Suite .
    9186 * - <a href="http://code.google.com/p/python-zibopt/">python-zibopt</a> was developed
    9187 * by Ryan J. O'Neil and is a python extension of the \SCIP Optimization Suite (not maintained anymore).
    9188 * - <a href="http://picos.zib.de/">PICOS</a> is a python interface for conic optimization,
    9189 * provided by Guillaume Sagnol.
    9190 *
    9191 * @section MODELLING Modeling languages
    9192 *
    9193 * A natural way of formulating an optimization problem is to use a modeling language.
    9194 * Besides ZIMPL, which is part of the \SCIP Optimization Suite,
    9195 * there are several other modeling tools with a direct interface to \SCIP:
    9196 *
    9197 * - <a href="https://zimpl.zib.de">ZIMPL</a>, a modeling language for constraint programming,
    9198 * - both <a href="http://www.ampl.com/">AMPL</a> and <a href="http://www.gams.com">GAMS</a>,
    9199 * are well-suited for modeling mixed-integer linear and nonlinear optimization problems,
    9200 * - and <a href="https://coliop.org/">CMPL</a> for mixed-integer linear problems.
    9201 * - <a href="https://jump.dev/JuMP.jl/stable/">JuMP</a> accesses SCIP through the Julia interface.
    9202 * - <a href="http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Main.HomePage">YALMIP</a> by Johan L&ouml;fberg provides a
    9203 * free modeling language.
    9204 *
    9205 * The AMPL and ZIMPL interfaces are included in the \SCIP distribution,
    9206 * the GAMS interface is available <a href="https://github.com/coin-or/GAMSlinks">here</a>.
    9207 *
    9208 * @subsection AMPL AMPL Interface
    9209 *
    9210 * The AMPL interface is part of the main \SCIP executable.
    9211 * It is activated when the executable is called with the name of the AMPL `.nl` file as first argument and `-AMPL` as second argument.
    9212 * In this case, \SCIP will employ the \ref reader_nl.h "NL reader" to read the `.nl` file (and `.col` and `.row` files with variable and constraint names, if available),
    9213 * read parameter settings from a `scip.set` file (if present), attempt to solve the problem, write an AMPL solution file with the solve output, and exit.
    9214 * However, if `-i` is given as third argument, then solving the problem is replaced by opening the \ref SHELL "interactive shell".
    9215 *
    9216 * Next to a `scip.set` file, parameter settings can also be given via an `option` command in AMPL, e.g.,
    9217 * ```
    9218 * option scip_options 'limits/gap = 1e-4 display/statistics = TRUE';
    9219 * ```
    9220 * Parameter `display/statistics` is specific to using \SCIP via the AMPL interface and triggers a call to \ref SCIPprintStatistics after the problem has been solved (or the interactive shell has been exited).
    9221 * In addition, a parameter `display/logfile` is available to specify a file to which to print \SCIP output in addition to stdout.
    9222 *
    9223 * For most problems, \SCIP computes a primal solution only.
    9224 * A dual solution is written to an AMPL solution file only if an LP has been solved with presolve disabled.
    9225 *
    9226 * \SCIP is also able to write AMPL `.nl` files (and `.col` and `.row` files with variable and constraint names). See \ref reader_nl.h for currently supported constraint types.
    9227 */
    9228
    9229 /**@defgroup PUBLICAPI Public API of SCIP
    9230 * @brief functions and headers of the public C-API of \SCIP. Please refer to \ref DOC "" for information how to use the reference manual.
    9231 *
    9232 * \PUBLICAPIDESCRIPTION
    9233 *
    9234 *
    9235 */
    9236
    9237/**@defgroup PUBLICCOREAPI Core API
    9238 * @ingroup PUBLICAPI
    9239 * @brief functions and headers of the plugin-independent C-API provided by the \SCIP header file scip.h.
    9240 *
    9241 * This module comprises functions provided by the header file scip.h. Including this header into a user-written extension
    9242 * suffices to have all plugin-independent functionality of \SCIP available. Plugin-independent
    9243 * user functionality includes the
    9244 *
    9245 * - creation of problems that \SCIP should solve
    9246 * - fine-grained access to initiate the solving process of \SCIP
    9247 * - access to all sorts of solving process statistics
    9248 * - commonly used data structures and algorithms
    9249 * - the management of plugins
    9250 * - ...
    9251 *
    9252 * In order facilitate the navigation through the core API of \SCIP, it is structured into different modules.
    9253 */
    9254
    9255/**@defgroup TYPEDEFINITIONS Type Definitions
    9256 * @ingroup PUBLICCOREAPI
    9257 * @brief type definitions and callback declarations
    9258 *
    9259 * This page lists headers which contain type definitions of callbacks.
    9260 *
    9261 * All headers below include the descriptions of callbacks of
    9262 * certain plugins. For more detail see the corresponding header.
    9263 */
    9264
    9265/**@defgroup PublicProblemMethods Problem Creation
    9266 * @ingroup PUBLICCOREAPI
    9267 * @brief functions to create a problem that \SCIP should solve
    9268 *
    9269 * This module summarizes the main functions needed to create a problem for \SCIP, and access its most important members:
    9270 * - Declaring, adding, accessing, and changing variables of the problem
    9271 * - Declaring, adding, accessing, and changing constraints of the problem
    9272 * - Creating, adding, accessing, changing, and checking of solutions to the problem
    9273 *
    9274 * @note These core functions are not sufficient to create constraints of a certain type that is provided by the default plugins of \SCIP.
    9275 * An example would be the creation of a linear constraint for which the functions provided by the
    9276 * \ref cons_linear.h "linear constraint handler" must be used. Such functions are provided by the default plugins of \SCIP
    9277 * and can be found in the \ref PUBLICPLUGINAPI.
    9278 */
    9279
    9280/**@defgroup GeneralSCIPMethods SCIP
    9281 * @ingroup PublicProblemMethods
    9282 * @brief functions to manipulate a SCIP object
    9283 */
    9284
    9285/**@defgroup GlobalProblemMethods Global Problem
    9286 * @ingroup PublicProblemMethods
    9287 * @brief functions to create, read and modify a global problem together with its callbacks
    9288 */
    9289
    9290/**@defgroup PublicVariableMethods Problem Variables
    9291 * @ingroup PublicProblemMethods
    9292 * @brief public functions for problem variables
    9293 */
    9294
    9295/**@defgroup PublicConstraintMethods Problem Constraints
    9296 * @ingroup PublicProblemMethods
    9297 * @brief Public functions for constraints
    9298 */
    9299
    9300/**@defgroup PublicSolutionMethods Primal Solution
    9301 * @ingroup PublicProblemMethods
    9302 * @brief functions to create and change primal solutions of \SCIP
    9303 */
    9304
    9305/**@defgroup CopyMethods Problem Copies
    9306 * @ingroup PublicProblemMethods
    9307 * @brief functions to copy problems between a source and a target \SCIP
    9308 */
    9309
    9310
    9311 /**@defgroup PublicSolveMethods Solving Process
    9312 * @ingroup PUBLICCOREAPI
    9313 * @brief functions to control the solving process of \SCIP
    9314 *
    9315 * This large group of functions and modules comprises the solving process related API of \SCIP. This includes
    9316 *
    9317 * -# changing parameters to control the solver behavior
    9318 * -# access search tree related information
    9319 * -# access relaxation information
    9320 * -# access various solving process statistics
    9321 * -# solve auxiliary relaxations and subproblems using LP/NLP diving or probing mode
    9322 */
    9323
    9324/**@defgroup PublicSolvingStatsMethods Solving Statistics
    9325 * @ingroup PublicSolveMethods
    9326 * @brief functions to query statistics about the solving process
    9327 */
    9328
    9329/**@defgroup ParameterMethods Parameter
    9330 * @ingroup PublicSolveMethods
    9331 * @brief functions to create, query, and print user parameters
    9332 */
    9333
    9334/**@defgroup PublicEventMethods Event Handling
    9335 * @ingroup PublicSolveMethods
    9336 * @brief functions to create, catch, process, and drop events during the solving process of \SCIP
    9337 *
    9338 * Events can only be caught during the operation on the transformed problem.
    9339 * Events on variables can only be caught for transformed variables.
    9340 * If you want to catch an event for an original variable, you have to get the corresponding transformed variable
    9341 * with a call to SCIPgetTransformedVar() and catch the event on the transformed variable.
    9342 */
    9343
    9344/**@defgroup PublicLPMethods LP Relaxation
    9345 * @ingroup PublicSolveMethods
    9346 * @brief functions to build and access LP relaxation information
    9347 * @see functions to interact with \ref PublicColumnMethods "LP columns" and \ref PublicRowMethods "LP rows"
    9348 */
    9349
    9350/**@defgroup PublicColumnMethods LP Column
    9351 * @ingroup PublicLPMethods
    9352 * @brief public functions for LP columns
    9353 */
    9354
    9355/**@defgroup PublicRowMethods LP Row
    9356 * @ingroup PublicLPMethods
    9357 * @brief public functions for LP rows
    9358 */
    9359
    9360/**@defgroup PublicCutMethods Cuts and Cutpools
    9361 * @ingroup PublicLPMethods
    9362 * @brief common functions used to manipulate, generate, and strengthen cuts and to organize the cutpool
    9363 */
    9364
    9365/**@defgroup PublicLPDivingMethods LP Diving
    9366 * @ingroup PublicLPMethods
    9367 * @brief functions to initiate and conduct LP diving
    9368 */
    9369
    9370/**@defgroup PublicLPExactMethods Exact LP Relaxation
    9371 * @ingroup PublicSolveMethods
    9372 * @brief functions to manage exact LP relaxation
    9373 */
    9374
    9375/**@defgroup PublicExactMethods Exact Solving Mode
    9376 * @ingroup PublicSolveMethods
    9377 * @brief general functions for numerically exact solving
    9378 */
    9379
    9380/**@defgroup PublicCertificateMethods Certificate Output
    9381 * @ingroup PublicSolveMethods
    9382 * @brief functions for certified solving
    9383 */
    9384
    9385/**@defgroup PublicNLPMethods NLP Relaxation
    9386 * @ingroup PublicSolveMethods
    9387 * @brief functions for the nonlinear relaxation
    9388 */
    9389
    9390/**@defgroup PublicNLRowMethods Nonlinear Rows
    9391 * @ingroup PublicNLPMethods
    9392 * @brief functions for the creation and interaction with rows of the NLP relaxation
    9393 */
    9394
    9395/**@defgroup PublicNLPDiveMethods NLP Diving
    9396 * @ingroup PublicNLPMethods
    9397 * @brief functions to initiate and conduct NLP Diving
    9398 */
    9399
    9400/**@defgroup PublicConflictMethods Conflict Analysis
    9401 * @ingroup PublicSolveMethods
    9402 * @brief public functions for conflict analysis
    9403 */
    9404
    9405/**@defgroup PublicBranchingMethods Branching
    9406 * @ingroup PublicSolveMethods
    9407 * @brief functions for branching on LP solutions, relaxation solutions, and pseudo solutions
    9408 *
    9409 * @see \ref PublicVariableMethods "Public Variable functions" contains some typical variable branching score functions
    9410 */
    9411
    9412/**@defgroup LocalSubproblemMethods Local Subproblem
    9413 * @ingroup PublicSolveMethods
    9414 * @brief functions to query information about or strengthen the problem at the current local search node
    9415 */
    9416
    9417/**@defgroup PublicTreeMethods Search Tree
    9418 * @ingroup PublicSolveMethods
    9419 * @brief functions to query search tree related information
    9420 * @see \ref PublicNodeMethods "Public functions for nodes"
    9421 */
    9422
    9423/**@defgroup PublicNodeMethods Nodes
    9424 * @ingroup PublicTreeMethods
    9425 * @brief functions for nodes of the search tree of \SCIP
    9426 */
    9427
    9428/**@defgroup PublicProbingMethods Probing
    9429 * @ingroup PublicSolveMethods
    9430 * @brief functions to initiate and control the probing mode of \SCIP
    9431 */
    9432
    9433/**@defgroup PublicReoptimizationMethods Reoptimization
    9434 * @ingroup PublicSolveMethods
    9435 * @brief functions for reoptimization related tasks
    9436 */
    9437
    9438/** @defgroup DataStructures Data Structures
    9439 * @ingroup PUBLICCOREAPI
    9440 * @brief commonly used data structures
    9441 *
    9442 * Below you find a list of available data structures
    9443 */
    9444
    9445/** @defgroup DisjointSet Disjoint Set (Union Find)
    9446 * @ingroup DataStructures
    9447 * @brief weighted disjoint set (union find) data structure with path compression
    9448 *
    9449 * Weighted Disjoint Set is a data structure to quickly update and query connectedness information
    9450 * between nodes of a graph. Disjoint Set is also known as Union Find.
    9451 */
    9452
    9453/**@defgroup PublicDynamicArrayMethods Dynamic Arrays
    9454 * @ingroup DataStructures
    9455 * @brief functions for the creation and access of dynamic arrays
    9456 */
    9457
    9458/**@defgroup DirectedGraph Directed Graph
    9459 * @ingroup DataStructures
    9460 * @brief graph structure with common algorithms for directed and undirected graphs
    9461 */
    9462
    9463/**@defgroup PublicDatatreeMethods Data Tree
    9464 * @ingroup DataStructures
    9465 * @brief functions for managing data trees
    9466 */
    9467
    9468/**@defgroup DecompMethods Decomposition data structure
    9469 * @ingroup DataStructures
    9470 * @brief functions for creating and accessing user decompositions
    9471 */
    9472
    9473/**@defgroup NetworkMatrix Network Matrix
    9474 * @ingroup DataStructures
    9475 * @brief functions for detecting network matrices and converting them to the underlying graphs
    9476 */
    9477
    9478/**@defgroup PublicRationalMethods Rational Arithmetic
    9479 * @ingroup DataStructures
    9480 * @brief wrapper for rational number arithmetic
    9481 */
    9482
    9483/**@defgroup SymGraph Symmetry Detection Graph
    9484 * @ingroup DataStructures
    9485 * @brief functions for creating and manipulating symmetry detection graphs
    9486 *
    9487 * Below you find a list of functions to create and manipulate symmetry detection graphs.
    9488 */
    9489
    9490/**@defgroup MiscellaneousMethods Miscellaneous Methods
    9491 * @ingroup PUBLICCOREAPI
    9492 * @brief commonly used functions from different categories
    9493 *
    9494 * Below you find a list of miscellaneous functions grouped by different categories.
    9495 */
    9496
    9497/**@defgroup PublicValidationMethods Validation
    9498 * @ingroup PUBLICCOREAPI
    9499 * @brief functions for validating the correctness of a solving process
    9500 */
    9501
    9502/**@defgroup PublicMemoryMethods Memory Management
    9503 * @ingroup MiscellaneousMethods
    9504 * @brief functions and macros to use the \SCIP memory management
    9505 *
    9506 * @see \ref MEMORY "Using the memory functions of SCIP" for more information
    9507 */
    9508
    9509/**@defgroup PublicTimingMethods Timing
    9510 * @ingroup MiscellaneousMethods
    9511 * @brief functions for timing
    9512 */
    9513
    9514/**@defgroup PublicBanditMethods Bandit Algorithms
    9515 * @ingroup MiscellaneousMethods
    9516 * @brief functions for bandit algorithms
    9517 */
    9518
    9519
    9520
    9521/**@defgroup DebugSolutionMethods Debug Solution
    9522 * @ingroup PUBLICCOREAPI
    9523 * @brief functions to control the SCIP debug solution mechanism, see also \ref DEBUG
    9524 */
    9525
    9526/**@defgroup MessageOutputMethods Messaging
    9527 * @ingroup PUBLICCOREAPI
    9528 * @brief message output functions
    9529 */
    9530
    9531/**@defgroup PluginManagementMethods Methods for managing plugins
    9532 * @ingroup PUBLICCOREAPI
    9533 * @brief Functions for the inclusion and management of SCIP plugins and callbacks
    9534 *
    9535 */
    9536
    9537/**@defgroup PublicBendersMethods Benders' decomposition
    9538 * @ingroup PluginManagementMethods
    9539 * @brief functions for Benders' decomposition plugins
    9540 */
    9541
    9542/**@defgroup PublicBenderscutsMethods Benders' decomposition cuts
    9543 * @ingroup PluginManagementMethods
    9544 * @brief functions for Benders' decomposition cuts plugins
    9545 */
    9546
    9547/**@defgroup PublicBranchRuleMethods Branching Rules
    9548 * @ingroup PluginManagementMethods
    9549 * @brief functions for branching rule plugins
    9550 */
    9551
    9552/**@defgroup PublicCompressionMethods Tree Compression
    9553 * @ingroup PluginManagementMethods
    9554 * @brief public functions for tree compressions
    9555 */
    9556
    9557/**@defgroup PublicConflicthdlrMethods Conflict Analysis
    9558 * @ingroup PluginManagementMethods
    9559 * @brief public functions for conflict handlers
    9560 */
    9561
    9562/**@defgroup PublicConshdlrMethods Constraint handlers
    9563 * @ingroup PluginManagementMethods
    9564 * @brief functions for constraint handlers
    9565 */
    9566
    9567/**@defgroup PublicCutSelectorMethods Cut Selector
    9568 * @ingroup PluginManagementMethods
    9569 * @brief functions for cut selectors
    9570 */
    9571
    9572/**@defgroup PublicDialogMethods Dialogs
    9573 * @ingroup PluginManagementMethods
    9574 * @brief public functions for user interface dialogs
    9575 */
    9576
    9577/**@defgroup PublicDisplayMethods Displays
    9578 * @ingroup PluginManagementMethods
    9579 * @brief functions for the inclusion and access of display plugins
    9580 */
    9581
    9582/**@defgroup PublicEventHandlerMethods Event Handler
    9583 * @ingroup PluginManagementMethods
    9584 * @brief functions for event handlers
    9585 */
    9586
    9587/**@defgroup PublicExprHandlerMethods Expression Handler
    9588 * @ingroup PluginManagementMethods
    9589 * @brief functions for expression handlers
    9590 */
    9591
    9592/**@defgroup PublicHeuristicMethods Primal Heuristics
    9593 * @ingroup PluginManagementMethods
    9594 * @brief functions for primal heuristic plugins
    9595 */
    9596
    9597/**@defgroup PublicDivesetMethods Dive sets
    9598 * @ingroup PublicSpecialHeuristicMethods
    9599 * @brief functions for dive sets to control the generic diving algorithm
    9600 */
    9601
    9602/**@defgroup PublicIISfinderMethods IIS Finders
    9603 * @ingroup PluginManagementMethods
    9604 * @brief functions for irreducible infeasible subsystems (IIS) finders
    9605 */
    9606
    9607/**@defgroup PublicNodeSelectorMethods Node Selector
    9608 * @ingroup PluginManagementMethods
    9609 * @brief functions for node selector plugin management
    9610 */
    9611
    9612/**@defgroup PublicNlhdlrInterfaceMethods Nonlinear Handlers
    9613 * @ingroup PluginManagementMethods
    9614 * @brief functions for the management of nonlinear handlers
    9615 */
    9616
    9617/**@defgroup PublicPresolverMethods Presolver
    9618 * @ingroup PluginManagementMethods
    9619 * @brief functions for presolver plugins
    9620 */
    9621
    9622/**@defgroup PublicPricerMethods Pricer
    9623 * @ingroup PluginManagementMethods
    9624 * @brief functions to include and access pricer plugins of \SCIP
    9625 */
    9626
    9627/**@defgroup PublicPropagatorMethods Propagators
    9628 * @ingroup PluginManagementMethods
    9629 * @brief functions for propagator plugins
    9630 */
    9631
    9632/**@defgroup PublicReaderMethods Reader
    9633 * @ingroup PluginManagementMethods
    9634 * @brief functions for the inclusion and access to reader plugins of \SCIP
    9635 */
    9636
    9637/**@defgroup PublicRelaxatorMethods Relaxation Handlers
    9638 * @ingroup PluginManagementMethods
    9639 * @brief public functions for relaxation handlers
    9640 */
    9641
    9642/**@defgroup PublicSeparatorMethods Separators
    9643 * @ingroup PluginManagementMethods
    9644 * @brief functions for separator plugins
    9645 */
    9646
    9647/**@defgroup PublicTableMethods Tables
    9648 * @ingroup PluginManagementMethods
    9649 * @brief functions for the inclusion and access of statistics tables
    9650 */
    9651
    9652/**@defgroup PublicConcsolverTypeMethods Concurrent Solver Types
    9653 * @ingroup PluginManagementMethods
    9654 * @brief functions for concurrent solver type plugins
    9655 */
    9656
    9657/**@defgroup PublicNLPIInterfaceMethods NLP solver interfaces
    9658 * @ingroup PluginManagementMethods
    9659 * @brief functions for the management of NLP solver interfaces
    9660 */
    9661
    9662/**@defgroup PublicExternalCodeMethods External Codes
    9663 * @ingroup PluginManagementMethods
    9664 * @brief functions to access information about external codes used by \SCIP
    9665 */
    9666
    9667/**@defgroup PublicParallelMethods Parallel Interface
    9668 * @ingroup PUBLICCOREAPI
    9669 * @brief functions to construct the parallel interface of \SCIP
    9670 */
    9671
    9672 /**@defgroup PUBLICPLUGINAPI Plugin API of SCIP
    9673 * @ingroup PUBLICAPI
    9674 * @brief core API extensions provided by the default plugins of \SCIP, includable via scipdefplugins.h.
    9675 *
    9676 * All default plugins of \SCIP, especially the default \ref CONSHDLRS "constraint handlers", provide
    9677 * valuable extensions to the \ref PUBLICCOREAPI "core API" of \SCIP. These functions are made available
    9678 * by including scipdefplugins.h to user-written extensions.
    9679 *
    9680 * For a better overview, this page lists all default plugin headers structured into modules based on their individual
    9681 * topic.
    9682 *
    9683 * All of the modules listed below provide functions that are allowed to be used by user-written extensions of \SCIP.
    9684 */
    9685 /**@defgroup INTERNALAPI Internal API of SCIP
    9686 * @brief internal API functions that should only be used by the core of \SCIP
    9687 *
    9688 * This page lists the header files of internal API functions. In contrast to the public API, these internal functions
    9689 * should not be used by user plugins and extensions of SCIP. Please consult
    9690 * \ref PUBLICCOREAPI "the Core API" and \ref PUBLICPLUGINAPI "Plugin API" for the complete API available to user plugins.
    9691 *
    9692 */
    9693
    9694/**@defgroup BENDERS Benders' decomposition implementations
    9695 * @ingroup PUBLICPLUGINAPI
    9696 * @brief functions and files provided by the default Benders' decomposition implementations of \SCIP
    9697 *
    9698 * A detailed description what a Benders' decomposition implementation does and how to add a Benders' decomposition
    9699 * implementations to SCIP can be found
    9700 * \ref BENDER "here".
    9701 */
    9702
    9703/**@defgroup BendersIncludes Inclusion functions
    9704 * @ingroup BENDERS
    9705 * @brief functions to include specific Benders' decomposition implementations into \SCIP
    9706 *
    9707 * This module contains functions to include specific Benders' decomposition implementations into \SCIP.
    9708 *
    9709 * @note All default plugins can be included at once (including all Benders' decomposition implementations) using
    9710 * SCIPincludeDefaultPlugins()
    9711 *
    9712 */
    9713
    9714/**@defgroup BENDERSCUTS Benders' decomposition cut function
    9715 * @ingroup PUBLICPLUGINAPI
    9716 * @brief functions and files provided by the default Benders' decomposition cut method of \SCIP
    9717 *
    9718 * A detailed description what a Benders' decomposition cut method does and how to add a Benders' decomposition
    9719 * cut method to SCIP can be found
    9720 * \ref BENDERSCUT "here".
    9721 */
    9722
    9723/**@defgroup BenderscutIncludes Inclusion functions
    9724 * @ingroup BENDERSCUTS
    9725 * @brief functions to include specific Benders' decomposition cut methods into \SCIP
    9726 *
    9727 * This module contains functions to include specific Benders' decomposition cut methods into \SCIP.
    9728 *
    9729 * @note The Benders' decomposition cut methods are linked to each Benders' decomposition implementation. Thus, the
    9730 * default Benders' decomposition implementations automatically include the necessary Benders' decomposition cut
    9731 * methods. For custom Benders' decomposition implementations, you can call SCIPincludeDefaultBendersCuts() in the
    9732 * SCIPincludeBendersMybenders() include function.
    9733 *
    9734 */
    9735
    9736/**@defgroup BRANCHINGRULES Branching Rules
    9737 * @ingroup PUBLICPLUGINAPI
    9738 * @brief functions and files provided by the default branching rules of \SCIP
    9739 *
    9740 * A detailed description what a branching rule does and how to add a branching rule to SCIP can be found
    9741 * \ref BRANCH "here".
    9742 */
    9743
    9744/**@defgroup BranchingRuleIncludes Inclusion functions
    9745 * @ingroup BRANCHINGRULES
    9746 * @brief functions to include specific branching rules into \SCIP
    9747 *
    9748 * This module contains functions to include specific branching rules into \SCIP.
    9749 *
    9750 * @note All default plugins can be included at once (including all branching rules) using SCIPincludeDefaultPlugins()
    9751 *
    9752 */
    9753
    9754/**@defgroup CONSHDLRS Constraint Handlers
    9755 * @ingroup PUBLICPLUGINAPI
    9756 * @brief functions and files provided by the default constraint handlers of \SCIP
    9757 *
    9758 * A detailed description what a constraint handler does and how to add a constraint handler to SCIP can be found
    9759 * \ref CONS "here".
    9760 */
    9761
    9762/**@defgroup ConshdlrIncludes Inclusion functions
    9763 * @ingroup CONSHDLRS
    9764 * @brief functions to include specific constraint handlers into \SCIP
    9765 *
    9766 * This module contains functions to include specific constraint handlers into \SCIP.
    9767 *
    9768 * @note All default plugins can be included at once (including all default constraint handlers) using SCIPincludeDefaultPlugins()
    9769 *
    9770 */
    9771
    9772/**@defgroup CUTSELECTORS Cut Selectors
    9773 * @ingroup PUBLICPLUGINAPI
    9774 * @brief functions and files provided by the default cut selectors of \SCIP
    9775 *
    9776 * A detailed description what a cut selector does and how to add a cut selector to SCIP can be found
    9777 * \ref CUTSEL "here".
    9778 */
    9779
    9780/**@defgroup CutSelectorIncludes Inclusion functions
    9781 * @ingroup CUTSELECTORS
    9782 * @brief functions to include specific cut selectors into \SCIP
    9783 *
    9784 * This module contains functions to include specific cut selectors into \SCIP.
    9785 *
    9786 * @note All default plugins can be included at once (including all default cut selectors) using SCIPincludeDefaultPlugins()
    9787 *
    9788 */
    9789
    9790/**@defgroup DIALOGS Dialogs
    9791 * @ingroup PUBLICPLUGINAPI
    9792 * @brief functions and files provided by the default dialogs of \SCIP
    9793 *
    9794 * A detailed description what a dialog does and how to add a dialog to SCIP can be found
    9795 * \ref DIALOG "here".
    9796 */
    9797
    9798/**@defgroup DialogIncludes Inclusion functions
    9799 * @ingroup DIALOGS
    9800 * @brief functions to include specific dialogs into \SCIP
    9801 *
    9802 * This module contains functions to include specific dialogs into \SCIP.
    9803 *
    9804 * @note All default plugins can be included at once (including all default dialogs) using SCIPincludeDefaultPlugins()
    9805 *
    9806 */
    9807
    9808/**@defgroup DISPLAYS Displays
    9809 * @ingroup PUBLICPLUGINAPI
    9810 * @brief functions and files provided by the default displays (output columns) of \SCIP
    9811 *
    9812 * A detailed description what a display does and how to add a display to SCIP can be found
    9813 * \ref DISP "here".
    9814 *
    9815 */
    9816
    9817/**@defgroup DisplayIncludes Inclusion functions
    9818 * @ingroup DISPLAYS
    9819 * @brief functions to include specific displays into \SCIP
    9820 *
    9821 * This module contains functions to include specific displays into \SCIP.
    9822 *
    9823 * @note All default plugins can be included at once (including all default displays) using SCIPincludeDefaultPlugins()
    9824 *
    9825 */
    9826
    9827/**@defgroup EXPRHDLRS Expression Handlers
    9828 * @ingroup PUBLICPLUGINAPI
    9829 * @brief functions and files provided by the default expressions handlers of \SCIP
    9830 */
    9831
    9832/**@defgroup ExprhdlrIncludes Inclusion functions
    9833 * @ingroup EXPRHDLRS
    9834 * @brief functions to include specific expression handlers into \SCIP
    9835 *
    9836 * This module contains functions to include specific expression handlers into \SCIP.
    9837 *
    9838 * @note All default plugins can be included at once (including all default expression handlers) using SCIPincludeDefaultPlugins()
    9839 *
    9840 */
    9841
    9842/**@defgroup EXPRINTS Expression Interpreter
    9843 * @ingroup PUBLICPLUGINAPI
    9844 * @brief functions and files provided by the default expression interpreters of \SCIP
    9845 *
    9846 * A detailed description what a expression interpreter does and how to add a expression interpreter to SCIP can be found
    9847 * \ref EXPRINT "here".
    9848 */
    9849
    9850/**@defgroup FILEREADERS File Readers
    9851 * @ingroup PUBLICPLUGINAPI
    9852 * @brief This page contains a list of all file readers which are currently available.
    9853 *
    9854 * @section AVAILABLEFORMATS List of readable file formats
    9855 *
    9856 * The \ref SHELL "interactive shell" and the callable library are capable of reading/parsing several different file
    9857 * formats.
    9858 *
    9859 * <table>
    9860 * <tr><td>\ref reader_bnd.h "BND format"</td> <td>for variable bounds</td></tr>
    9861 * <tr><td>\ref reader_cip.h "CIP format"</td> <td>for SCIP's constraint integer programming format</td></tr>
    9862 * <tr><td>\ref reader_cnf.h "CNF format"</td> <td>DIMACS CNF (conjunctive normal form) file format used for example for SAT problems</td></tr>
    9863 * <tr><td>\ref reader_diff.h "DIFF format"</td> <td>for reading a new objective function for mixed-integer programs</td></tr>
    9864 * <tr><td>\ref reader_fzn.h "FZN format"</td> <td>FlatZinc is a low-level solver input language that is the target language for MiniZinc</td></tr>
    9865 * <tr><td>\ref reader_lp.h "LP format"</td> <td>for mixed-integer (quadratically constrained quadratic) programs (CPLEX)</td></tr>
    9866 * <tr><td>\ref reader_mps.h "MPS format"</td> <td>for mixed-integer (quadratically constrained quadratic) programs</td></tr>
    9867 * <tr><td>\ref reader_nl.h "NL format"</td> <td>for <a href="http://www.ampl.com">AMPL</a> .nl files, e.g., mixed-integer linear and nonlinear
    9868 * <tr><td>\ref reader_opb.h "OPB format"</td> <td>for pseudo-Boolean optimization instances</td></tr>
    9869 * <tr><td>\ref reader_osil.h "OSiL format"</td> <td>for mixed-integer nonlinear programs</td></tr>
    9870 * <tr><td>\ref reader_pip.h "PIP format"</td> <td>for <a href="http://polip.zib.de/pipformat.php">mixed-integer polynomial programming problems</a></td></tr>
    9871 * <tr><td>\ref reader_sol.h "SOL format"</td> <td>for solutions; XML-format (read-only) or raw SCIP format</td></tr>
    9872 * <tr><td>\ref reader_wbo.h "WBO format"</td> <td>for weighted pseudo-Boolean optimization instances</td></tr>
    9873 * <tr><td>\ref reader_zpl.h "ZPL format"</td> <td>for <a href="http://zimpl.zib.de">ZIMPL</a> models, i.e., mixed-integer linear and nonlinear
    9874 * programming problems [read only]</td></tr>
    9875 * </table>
    9876 *
    9877 * @section ADDREADER How to add a file reader
    9878 *
    9879 * A detailed description what a file reader does and how to add a file reader to SCIP can be found
    9880 * \ref READER "here".
    9881 *
    9882 */
    9883
    9884/**@defgroup FileReaderIncludes Inclusion functions
    9885 * @ingroup FILEREADERS
    9886 * @brief functions to include specific file readers into \SCIP
    9887 *
    9888 * This module contains functions to include specific file readers into \SCIP.
    9889 *
    9890 * @note All default plugins can be included at once (including all default file readers) using SCIPincludeDefaultPlugins()
    9891 */
    9892
    9893/**@defgroup IISFINDERS IIS Finders
    9894 * @ingroup PUBLICPLUGINAPI
    9895 * @brief functions and files provided by the default IIS finders of \SCIP
    9896 *
    9897 * A detailed description what an IIS finder does and how to add a IIS finder to SCIP can be found \ref IISFINDER "here".
    9898 */
    9899
    9900/**@defgroup IISfinderIncludes Inclusion functions
    9901 * @ingroup IISFINDERS
    9902 * @brief functions to include specific IIS finders into \SCIP
    9903 *
    9904 * This module contains functions to include specific IIS finders into \SCIP.
    9905 *
    9906 * @note All default plugins can be included at once (including all default file readers) using SCIPincludeDefaultPlugins()
    9907 */
    9908
    9909/**@defgroup PARALLEL Parallel interface functions
    9910 * @ingroup INTERNALAPI
    9911 * @brief headers and functions for the parallel interface of \SCIP
    9912 *
    9913 */
    9914
    9915/**@defgroup TASKINTERFACE Parallel task interface functions
    9916 * @ingroup INTERNALAPI
    9917 * @brief headers and functions for the parallel task interface of \SCIP
    9918 */
    9919
    9920/**@defgroup PublicSymmetryMethods Symmetry
    9921 * @ingroup PUBLICCOREAPI
    9922 * @brief functions for symmetry handling
    9923 */
    9924
    9925/**@defgroup FileReaderIncludes Inclusion functions
    9926 * @ingroup FILEREADERS
    9927 * @brief functions to include specific file readers into \SCIP
    9928 *
    9929 * This module contains functions to include specific file readers into \SCIP.
    9930 *
    9931 * @note All default plugins can be included at once (including all default file readers) using SCIPincludeDefaultPlugins()
    9932 *
    9933 */
    9934
    9935/**@defgroup LPIS LP Solver Interface
    9936 * @ingroup PUBLICPLUGINAPI
    9937 * @brief functions and files provided by the LP solver interface of \SCIP
    9938 *
    9939 * \SCIP uses external tools to solve LP relaxations. The communication
    9940 * is realized through an LP interface.
    9941 *
    9942 * This page lists public interface functions that every LP interface provides.
    9943 * Find the concrete implementation for your LP solver
    9944 * under "src/lpi/".
    9945 *
    9946 * @see \ref LPI for a list of available LP solver interfaces
    9947 */
    9948
    9949/**@defgroup LPIEXACTS Exact LP Solver Interface
    9950 * @ingroup PUBLICPLUGINAPI
    9951 * @brief functions and files provided by the exact LP solver interface of \SCIP
    9952 *
    9953 * For the numerically exact solving mode, \SCIP also uses exact LP solvers. The communication
    9954 * is realized through an exact LP interface.
    9955 *
    9956 * This page lists public interface functions that every exact LP interface provides.
    9957 * Find the concrete implementation for your exact LP solver
    9958 * under "src/lpiexact/".
    9959 *
    9960 * @see \ref LPIEXACT for a list of available exact LP solver interfaces
    9961 */
    9962
    9963/**@defgroup NODESELECTORS Node Selectors
    9964 * @ingroup PUBLICPLUGINAPI
    9965 * @brief functions and files provided by the default node selectors of \SCIP
    9966 *
    9967 * A detailed description what a node selector does and how to add a node selector to SCIP can be found
    9968 * \ref NODESEL "here".
    9969 */
    9970
    9971/**@defgroup NodeSelectorIncludes Inclusion functions
    9972 * @ingroup NODESELECTORS
    9973 * @brief functions to include specific node selectors into \SCIP
    9974 *
    9975 * This module contains functions to include specific node selectors into \SCIP.
    9976 *
    9977 * @note All default plugins can be included at once (including all default node selectors) using SCIPincludeDefaultPlugins()
    9978 *
    9979 */
    9980
    9981/**@defgroup NLHDLRS Nonlinear Handlers
    9982 * @ingroup PUBLICPLUGINAPI
    9983 * @brief functions and files provided by the default nonlinear handlers of \SCIP
    9984 */
    9985
    9986/**@defgroup NlhdlrIncludes Inclusion functions
    9987 * @ingroup NLHDLRS
    9988 * @brief functions to include specific nonlinear handlers into \SCIP
    9989 *
    9990 * This module contains functions to include specific nonlinear handlers into \SCIP.
    9991 *
    9992 * @note All default plugins can be included at once (including all default nonlinear handlers) using SCIPincludeDefaultPlugins()
    9993 *
    9994 */
    9995
    9996/**@defgroup NLPIS NLP Solver Interfaces
    9997 * @ingroup PUBLICPLUGINAPI
    9998 * @brief functions and files provided by the default NLP solver interfaces of \SCIP
    9999 *
    10000 * A detailed description what a NLP solver interface does and how to add a NLP solver interface to SCIP can be found
    10001 * \ref NLPI "here".
    10002 */
    10003
    10004/**@defgroup NLPIIncludes Inclusion functions
    10005 * @ingroup NLPIS
    10006 * @brief functions to include specific NLP solver interfaces into \SCIP
    10007 *
    10008 * This module contains functions to include specific NLP solver interfaces into \SCIP.
    10009 *
    10010 * @note All default plugins can be included at once (including all default NLP solver interfaces) using SCIPincludeDefaultPlugins()
    10011 *
    10012 */
    10013
    10014/**@defgroup PRESOLVERS Presolvers
    10015 * @ingroup PUBLICPLUGINAPI
    10016 * @brief functions and files provided by the default presolvers of \SCIP
    10017 *
    10018 * A detailed description what a presolver does and how to add a presolver to SCIP can be found
    10019 * \ref PRESOL "here".
    10020 */
    10021
    10022/**@defgroup PresolverIncludes Inclusion functions
    10023 * @ingroup PRESOLVERS
    10024 * @brief functions to include specific presolvers into \SCIP
    10025 *
    10026 * This module contains functions to include specific presolvers into \SCIP.
    10027 *
    10028 * @note All default plugins can be included at once (including all default presolvers) using SCIPincludeDefaultPlugins()
    10029 *
    10030 */
    10031
    10032/**@defgroup PRICERS Pricers
    10033 * @ingroup PUBLICPLUGINAPI
    10034 * @brief functions and files provided by the default pricers of \SCIP
    10035 *
    10036 * Per default there exist no variable pricer. A detailed description what a variable pricer does and how to add a
    10037 * variable pricer to SCIP can be found \ref PRICER "here".
    10038 */
    10039
    10040/**@defgroup PricerIncludes Inclusion functions
    10041* @ingroup PRICERS
    10042* @brief functions to include specific pricers into \SCIP
    10043*
    10044* This module contains functions to include specific pricers into \SCIP.
    10045*
    10046* @note All default plugins can be included at once using SCIPincludeDefaultPlugins(). There exists no pricer per default.
    10047* In order to see examples of variable pricers, please consult the \ref EXAMPLES "Coding Examples" of \SCIP.
    10048*
    10049*/
    10050
    10051/**@defgroup PRIMALHEURISTICS Primal Heuristics
    10052 * @ingroup PUBLICPLUGINAPI
    10053 * @brief functions and files provided by the default primal heuristics of \SCIP
    10054 *
    10055 * A detailed description what a primal heuristic does and how to add a primal heuristic to SCIP can be found
    10056 * \ref HEUR "here".
    10057 */
    10058
    10059/**@defgroup PrimalHeuristicIncludes Inclusion functions
    10060 * @ingroup PRIMALHEURISTICS
    10061 * @brief functions to include specific primal heuristics into \SCIP
    10062 *
    10063 * This module contains functions to include specific primal heuristics into \SCIP.
    10064 *
    10065 * @note All default plugins can be included at once (including all default primal heuristics) using SCIPincludeDefaultPlugins()
    10066 *
    10067 */
    10068
    10069/**@defgroup PROPAGATORS Propagators
    10070 * @ingroup PUBLICPLUGINAPI
    10071 * @brief functions and files provided by the default propagators of \SCIP
    10072 *
    10073 * A detailed description what a propagator does and how to add a propagator to SCIP can be found
    10074 * \ref PROP "here".
    10075 */
    10076
    10077/**@defgroup PropagatorIncludes Inclusion functions
    10078 * @ingroup PROPAGATORS
    10079 * @brief functions to include specific propagators into \SCIP
    10080 *
    10081 * This module contains functions to include specific propagators into \SCIP.
    10082 *
    10083 * @note All default plugins can be included at once (including all default propagators) using SCIPincludeDefaultPlugins()
    10084 *
    10085 */
    10086
    10087/**@defgroup RELAXATORS Relaxation Handlers
    10088 * @ingroup PUBLICPLUGINAPI
    10089 * @brief functions and files provided by the default relaxation handlers of \SCIP
    10090 *
    10091 * A detailed description what a relaxation handler does and how to add a relaxation handler to SCIP can be found
    10092 * \ref RELAX "here". Note that the linear programming relaxation is not implemented via the relaxation handler plugin.
    10093 * Per default no relaxation handler exists in SCIP. However, there are two relaxation handlers in the
    10094 * \ref RELAXATOR_MAIN "Relaxator example".
    10095 */
    10096
    10097/**@defgroup SEPARATORS Separators
    10098 * @ingroup PUBLICPLUGINAPI
    10099 * @brief functions and files provided by the default separators of \SCIP
    10100 *
    10101 * A detailed description what a separator does and how to add a separator to SCIP can be found
    10102 * \ref SEPA "here".
    10103 */
    10104
    10105/**@defgroup SeparatorIncludes Inclusion functions
    10106 * @ingroup SEPARATORS
    10107 * @brief functions to include specific separators into \SCIP
    10108 *
    10109 * This module contains functions to include specific separators into \SCIP.
    10110 *
    10111 * @note All default plugins can be included at once (including all default separators) using SCIPincludeDefaultPlugins()
    10112 *
    10113 */
    10114
    10115/**@defgroup TABLES Tables
    10116 * @ingroup PUBLICPLUGINAPI
    10117 * @brief functions and files provided by the default statistics tables of \SCIP
    10118 *
    10119 * A detailed description what a table does and how to add a table to SCIP can be found
    10120 * \ref TABLE "here".
    10121 *
    10122 */
    10123
    10124/**@defgroup TableIncludes Inclusion functions
    10125 * @ingroup TABLES
    10126 * @brief functions to include specific tables into \SCIP
    10127 *
    10128 * This module contains functions to include specific statistics tables into \SCIP.
    10129 *
    10130 * @note All default plugins can be included at once (including all default statisticstables) using SCIPincludeDefaultPlugins()
    10131 *
    10132 */
    10133
    10134/**@defgroup PublicToleranceMethods Computations With Tolerances
    10135 * @ingroup NumericalMethods
    10136 * @brief functions used by the majority of operations involving floating-point computations in \SCIP
    10137 *
    10138 * - query the numerical tolerances of \SCIP, as well as special values such as infinity.
    10139 * - change tolerances inside relaxations
    10140 * - epsilon-comparison functions for floating point numbers
    10141 */
    10142
    10143/** @defgroup CFILES Implementation files (.c files)
    10144 * @brief implementation files (.c files) of the SCIP core and the default plugins
    10145 *
    10146 * The core provides the functionality for creating problems, variables, and general constraints.
    10147 * The default plugins of SCIP provide a mix of public API function and private, static function and callback declarations.
    10148 */
    10149
    10150/** @defgroup DEFPLUGINS SCIP Default Plugins
    10151 * @ingroup CFILES
    10152 * @brief implementation files (.c files) of the SCIP default plugins
    10153 *
    10154 * The SCIP default plugins provide a mix of public API function and private, static function and callback declarations.
    10155 */
    10156
    10157/** @defgroup OTHER_CFILES Other implementation files of SCIP
    10158 * @ingroup CFILES
    10159 * @brief other implementation files of SCIP
    10160 *
    10161 * Relevant core and other functionality of SCIP.
    10162 */