Scippy

    SCIP

    Solving Constraint Integer Programs

    scip_lpexact.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file scip_lpexact.c
    26 * @brief public methods for the exact LP relaxation, rows and columns
    27 * @author Leon Eifler
    28 *
    29 * @todo check all SCIP_STAGE_* switches, and include the new stages TRANSFORMED and INITSOLVE
    30 */
    31
    32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    33
    34#include <ctype.h>
    35#include <stdarg.h>
    36#include <assert.h>
    37#include <string.h>
    38#ifndef _WIN32
    39#include <strings.h> /*lint --e{766}*/
    40#endif
    41
    42#include "lpiexact/lpiexact.h"
    43#include "scip/conflict.h"
    44#include "scip/debug.h"
    45#include "scip/lp.h"
    46#include "scip/lpexact.h"
    47#include "scip/prob.h"
    48#include "scip/pub_lp.h"
    49#include "scip/pub_message.h"
    50#include "scip/pub_tree.h"
    51#include "scip/scip_lpexact.h"
    52#include "scip/scip_lp.h"
    53#include "scip/scip_mem.h"
    54#include "scip/scip_numerics.h"
    55#include "scip/scip_sol.h"
    57#include "scip/scip_tree.h"
    58#include "scip/scip_var.h"
    59#include "scip/sepastoreexact.h"
    60#include "scip/set.h"
    61#include "scip/solve.h"
    62#include "scip/struct_lpexact.h"
    63#include "scip/struct_primal.h"
    64#include "scip/struct_prob.h"
    65#include "scip/struct_mem.h"
    66#include "scip/tree.h"
    67#include "scip/var.h"
    68
    69
    70/* In debug mode, we include the SCIP's structure in scip.c, such that no one can access
    71 * this structure except the interface methods in scip.c.
    72 * In optimized mode, the structure is included in scip.h, because some of the methods
    73 * are implemented as defines for performance reasons (e.g. the numerical comparisons)
    74 */
    75#ifndef NDEBUG
    76#include "scip/struct_scip.h"
    77#endif
    78
    79/** increases usage counter of exact LP row
    80 *
    81 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    82 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    83 *
    84 * @pre this method can be called in one of the following stages of the SCIP solving process:
    85 * - \ref SCIP_STAGE_INITSOLVE
    86 * - \ref SCIP_STAGE_SOLVING
    87 */
    89 SCIP* scip, /**< SCIP data structure */
    90 SCIP_ROWEXACT* row /**< row to capture */
    91 )
    92{
    94
    96
    97 return SCIP_OKAY;
    98}
    99
    100/** decreases usage counter of LP row, and frees memory if necessary
    101 *
    102 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    103 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    104 *
    105 * @pre this method can be called in one of the following stages of the SCIP solving process:
    106 * - \ref SCIP_STAGE_INITSOLVE
    107 * - \ref SCIP_STAGE_SOLVING
    108 * - \ref SCIP_STAGE_EXITSOLVE
    109 */
    111 SCIP* scip, /**< SCIP data structure */
    112 SCIP_ROWEXACT** row /**< pointer to LP row */
    113 )
    114{
    115 SCIP_CALL( SCIPcheckStage(scip, "SCIPreleaseRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE) );
    116
    117 SCIP_CALL( SCIProwExactRelease(row, scip->mem->probmem, scip->set, scip->lpexact) );
    118
    119 return SCIP_OKAY;
    120}
    121
    122/** changes left hand side of exact LP row
    123 *
    124 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    125 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    126 *
    127 * @pre this method can be called in one of the following stages of the SCIP solving process:
    128 * - \ref SCIP_STAGE_INITSOLVE
    129 * - \ref SCIP_STAGE_SOLVING
    130 */
    132 SCIP* scip, /**< SCIP data structure */
    133 SCIP_ROWEXACT* row, /**< LP row */
    134 SCIP_RATIONAL* lhs /**< new left hand side */
    135 )
    136{
    138
    139 assert(!SCIPlpExactDiving(scip->lpexact) || (row->lppos == -1));
    140
    141 SCIP_CALL( SCIProwExactChgLhs(row, scip->set, scip->lpexact, lhs) );
    142
    143 return SCIP_OKAY;
    144}
    145
    146/** changes right hand side of exact LP row
    147 *
    148 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    149 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    150 *
    151 * @pre this method can be called in one of the following stages of the SCIP solving process:
    152 * - \ref SCIP_STAGE_INITSOLVE
    153 * - \ref SCIP_STAGE_SOLVING
    154 */
    156 SCIP* scip, /**< SCIP data structure */
    157 SCIP_ROWEXACT* row, /**< LP row */
    158 SCIP_RATIONAL* rhs /**< new right hand side */
    159 )
    160{
    162
    163 assert(!SCIPlpExactDiving(scip->lpexact) || (row->lppos == -1));
    164
    165 SCIP_CALL( SCIProwExactChgRhs(row, scip->set, scip->lpexact, rhs) );
    166
    167 return SCIP_OKAY;
    168}
    169
    170/** resolves variables to columns and adds them with the coefficients to the row;
    171 * this method caches the row extensions and flushes them afterwards to gain better performance
    172 *
    173 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    174 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    175 *
    176 * @attention If a coefficients absolute value is below the SCIP epsilon tolerance, the variable with its value is not added.
    177 *
    178 * @pre this method can be called in one of the following stages of the SCIP solving process:
    179 * - \ref SCIP_STAGE_INITSOLVE
    180 * - \ref SCIP_STAGE_SOLVING
    181 */
    183 SCIP* scip, /**< SCIP data structure */
    184 SCIP_ROWEXACT* row, /**< LP row */
    185 int nvars, /**< number of variables to add to the row */
    186 SCIP_VAR** vars, /**< problem variables to add */
    187 SCIP_RATIONAL** vals /**< values of coefficients */
    188 )
    189{
    190 int v;
    191
    192 assert(nvars == 0 || vars != NULL);
    193 assert(nvars == 0 || vals != NULL);
    194
    195 SCIP_CALL( SCIPcheckStage(scip, "SCIPaddVarsToRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    196
    197 /* resize the row to be able to store all variables (at least, if they are COLUMN variables) */
    198 SCIP_CALL( SCIProwExactEnsureSize(row, scip->mem->probmem, scip->set, SCIProwGetNNonz(row->fprow) + nvars) );
    199
    200 /* delay the row sorting */
    202
    203 /* add the variables to the row */
    204 for( v = 0; v < nvars; ++v )
    205 {
    206 SCIP_CALL( SCIPvarAddToRowExact(vars[v], scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->transprob, scip->lpexact,
    207 row, vals[v]) );
    208 }
    211
    212 /* force the row sorting */
    213 SCIProwExactForceSort(row, scip->set);
    214 row->fprow->rowexact = row;
    215
    216 return SCIP_OKAY;
    217}
    218
    219/** creates and captures an LP row without any coefficients from a constraint handler
    220 *
    221 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    222 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    223 *
    224 * @pre this method can be called in one of the following stages of the SCIP solving process:
    225 * - \ref SCIP_STAGE_INITSOLVE
    226 * - \ref SCIP_STAGE_SOLVING
    227 */
    229 SCIP* scip, /**< SCIP data structure */
    230 SCIP_ROWEXACT** rowexact, /**< pointer to row */
    231 SCIP_ROW* fprow, /**< corresponding fp-row */
    232 SCIP_ROW* fprowrhs, /**< rhs-part of fp-relaxation of this row if necessary, NULL otherwise */
    233 SCIP_RATIONAL* lhs, /**< left hand side of row */
    234 SCIP_RATIONAL* rhs, /**< right hand side of row */
    235 SCIP_Bool isfprelaxable /**< is it possible to create an fp relaxation of this row? */
    236 )
    237{
    238 SCIP_CALL( SCIPcheckStage(scip, "SCIPcreateEmptyRowConsExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    239
    241 assert(fprowrhs == NULL || SCIProwGetOriginCons(fprow) == SCIProwGetOriginCons(fprowrhs));
    242
    243 SCIP_CALL( SCIProwExactCreate(rowexact, fprow, fprowrhs, scip->mem->probmem, scip->set, scip->stat, scip->lpexact, 0, NULL, NULL, lhs, rhs, isfprelaxable) );
    244
    245 return SCIP_OKAY;
    246}
    247
    248/** creates and captures an exact LP row
    249 *
    250 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    251 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    252 *
    253 * @pre this method can be called in one of the following stages of the SCIP solving process:
    254 * - \ref SCIP_STAGE_SOLVING
    255 */
    257 SCIP* scip, /**< SCIP data structure */
    258 SCIP_ROWEXACT** row, /**< pointer to row */
    259 SCIP_ROW* fprow, /**< corresponding fp approximation/relaxation */
    260 int len, /**< number of nonzeros in the row */
    261 SCIP_COLEXACT** cols, /**< array with columns of row entries */
    262 SCIP_RATIONAL** vals, /**< array with coefficients of row entries */
    263 SCIP_RATIONAL* lhs, /**< left hand side of row */
    264 SCIP_RATIONAL* rhs, /**< right hand side of row */
    265 SCIP_Bool isfprelaxable /**< is it possible to make fp-relaxation of this row */
    266 )
    267{
    268 /* Note: Rows can only be created in the solving stage, since otherwise the LP does not exist and, e.g., the norms cannot be computed correctly. */
    270
    271 SCIP_CALL( SCIProwExactCreate(row, fprow, NULL, scip->mem->probmem, scip->set, scip->stat, scip->lpexact, len, cols, vals, lhs, rhs, isfprelaxable) );
    272
    273 return SCIP_OKAY;
    274}
    275
    276/** creates and captures an exact LP row from an existing fp row
    277 *
    278 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    279 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    280 *
    281 * @pre this method can be called in one of the following stages of the SCIP solving process:
    282 * - \ref SCIP_STAGE_INITSOLVE
    283 * - \ref SCIP_STAGE_SOLVING
    284 */
    286 SCIP* scip, /**< SCIP data structure */
    287 SCIP_ROW* fprow /**< corresponding fp approximation/relaxation */
    288 )
    289{
    290 assert(fprow != NULL);
    291 assert(fprow->rowexact == NULL);
    292
    293 SCIP_CALL( SCIPcheckStage(scip, "SCIPcreateRowExactFromRow", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    294
    295 SCIP_CALL( SCIProwExactCreateFromRow(fprow, scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->transprob, scip->lpexact) );
    296
    297 return SCIP_OKAY;
    298}
    299
    300/** generates two fprows that are a relaxation of the exact row wrt the lhs/rhs, respectively
    301 *
    302 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    303 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    304 *
    305 * @pre this method can be called in one of the following stages of the SCIP solving process:
    306 * - \ref SCIP_STAGE_INITSOLVE
    307 * - \ref SCIP_STAGE_SOLVING
    308 */
    310 SCIP* scip, /**< SCIP data structure */
    311 SCIP_ROWEXACT* row, /**< SCIP exact row */
    312 SCIP_ROW* rowlhs, /**< fp row-relaxation wrt lhs */
    313 SCIP_ROW* rowrhs, /**< fp row-relaxation wrt rhs */
    314 SCIP_Bool* onerowrelax, /**< is one row enough to represent the exact row */
    315 SCIP_Bool* hasfprelax /**< is it possible to generate relaxations at all for this row? */
    316 )
    317{
    318 assert(row != NULL);
    319 assert(rowlhs != NULL);
    320 assert(rowrhs != NULL);
    321
    322 SCIP_CALL( SCIPcheckStage(scip, "SCIPgenerateFpRowsFromRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    323 SCIP_CALL( SCIProwExactGenerateFpRows(scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->lpexact, scip->transprob, row, rowlhs, rowrhs, onerowrelax, hasfprelax) );
    324
    325 return SCIP_OKAY;
    326}
    327
    328/** returns the feasibility of a row for the given primal solution
    329 *
    330 * @return the feasibility of a row for the given primal solution
    331 *
    332 * @pre this method can be called in one of the following stages of the SCIP solving process:
    333 * - \ref SCIP_STAGE_SOLVING
    334 */
    336 SCIP* scip, /**< SCIP data structure */
    337 SCIP_ROWEXACT* row, /**< LP row */
    338 SCIP_SOL* sol, /**< primal CIP solution */
    339 SCIP_RATIONAL* result /**< result pointer */
    340 )
    341{
    342 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolFeasibilityExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    343
    344 if( sol != NULL )
    345 {
    346 SCIP_CALL( SCIProwExactGetSolFeasibility(row, scip->set, scip->stat, sol, result) );
    347 }
    348 else if( SCIPtreeHasCurrentNodeLP(scip->tree) )
    349 {
    350 SCIP_CALL( SCIProwExactGetLPFeasibility(row, scip->set, scip->stat, scip->lpexact, result) );
    351 }
    352 else
    353 {
    354 SCIP_CALL( SCIProwExactGetPseudoFeasibility(row, scip->set, scip->stat, result) );
    355 }
    356
    357 return SCIP_OKAY;
    358}
    359
    360/** returns the activity of a row for the given primal solution
    361 *
    362 * @return the activitiy of a row for the given primal solution
    363 *
    364 * @pre this method can be called in one of the following stages of the SCIP solving process:
    365 * - \ref SCIP_STAGE_SOLVING
    366 */
    368 SCIP* scip, /**< SCIP data structure */
    369 SCIP_ROWEXACT* row, /**< LP row */
    370 SCIP_SOL* sol, /**< primal CIP solution */
    371 SCIP_Bool useexact, /**< true if sol should be considered instead of sol */
    372 SCIP_RATIONAL* result /**< result pointer */
    373 )
    374{
    375 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolActivityExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
    376
    377 if( sol != NULL )
    378 {
    379 SCIP_CALL( SCIProwExactGetSolActivity(row, scip->set, scip->stat, sol, useexact, result) );
    380 }
    381 else if( SCIPtreeHasCurrentNodeLP(scip->tree) )
    382 SCIPrationalSetRational(result, SCIProwExactGetLPActivity(row, scip->stat, scip->lpexact));
    383 else
    385
    386 return SCIP_OKAY;
    387}
    388
    389/** returns the activity of a row for the given primal solution with running error analysis
    390 *
    391 * @return the activitiy of a row for the given primal solution and the error bound of the activity; returns true on success
    392 *
    393 * @pre this method can be called in one of the following stages of the SCIP solving process:
    394 * - \ref SCIP_STAGE_SOLVING
    395 */
    397 SCIP* scip, /**< SCIP data structure */
    398 SCIP_ROWEXACT* row, /**< LP row */
    399 SCIP_SOL* sol, /**< primal CIP solution */
    400 SCIP_Real* activity, /**< the approximate activity */
    401 SCIP_Real* errorbound /**< the error bound */
    402 )
    403{
    404 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolActivityWithErrorboundExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
    405
    406 return SCIProwExactGetSolActivityWithErrorbound(row, scip->set, scip->stat, sol, activity, errorbound);
    407}
    408
    409/** output exact row to file stream via the message handler system
    410 *
    411 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    412 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    413 *
    414 * @pre this method can be called in one of the following stages of the SCIP solving process:
    415 * - \ref SCIP_STAGE_SOLVING
    416 * - \ref SCIP_STAGE_SOLVED
    417 * - \ref SCIP_STAGE_EXITSOLVE
    418 */
    420 SCIP* scip, /**< SCIP data structure */
    421 SCIP_ROWEXACT* row, /**< LP row */
    422 FILE* file /**< output file (or NULL for standard output) */
    423 )
    424{
    425 assert(row != NULL);
    426
    428
    429 SCIProwExactPrint(row, scip->messagehdlr, file);
    430
    431 return SCIP_OKAY;
    432}
    433
    434/** gets objective value of current exact LP (which is the sum of column and loose objective value)
    435 *
    436 * @pre This method can be called if @p scip is in one of the following stages:
    437 * - \ref SCIP_STAGE_SOLVING
    438 *
    439 * @note This method returns the objective value of the current exact LP solution, which might be primal or dual infeasible
    440 * if a limit was hit during solving. It must not be used as a dual bound if the exact LP solution status returned by
    441 * SCIPgetLPExactSolstat() is SCIP_LPSOLSTAT_ITERLIMIT or SCIP_LPSOLSTAT_TIMELIMIT.
    442 *
    443 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    444 */
    446 SCIP* scip, /**< SCIP data structure */
    447 SCIP_RATIONAL* result /**< result pointer */
    448 )
    449{
    451
    452 SCIPlpExactGetObjval(scip->lpexact, scip->set, result);
    453}
    454
    455/** returns whether the exact lp was solved */
    457 SCIP* scip /**< SCIP data structure */
    458 )
    459{
    460 assert(scip != NULL);
    461 assert(scip->lpexact != NULL);
    462
    463 return scip->lpexact->solved && scip->lpexact->flushed;
    464}
    465
    466/** gets solution status of current exact LP
    467 *
    468 * @return the solution status of current exact LP.
    469 *
    470 * @pre This method can be called if @p scip is in one of the following stages:
    471 * - \ref SCIP_STAGE_SOLVING
    472 *
    473 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    474 */
    476 SCIP* scip /**< SCIP data structure */
    477 )
    478{
    480
    481 /* We can check the floating point flag here since the exact and floating point LP is constructed at the same
    482 * time.
    483 */
    485 return SCIPlpExactGetSolstat(scip->lpexact);
    486 else
    488}
    489
    490/** initiates exact LP diving, making methods SCIPchgVarObjExactDive(), SCIPchgVarLbExactDive(), and SCIPchgVarUbExactDive() available
    491 *
    492 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    493 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    494 *
    495 * @pre This method can be called if @p scip is in one of the following stages:
    496 * - \ref SCIP_STAGE_SOLVING
    497 *
    498 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    499 *
    500 * @note In parallel to exact LP diving, this method also starts the regular LP diving mode by calling SCIPstartDive().
    501 */
    503 SCIP* scip /**< SCIP data structure */
    504 )
    505{
    506 assert(scip != NULL);
    507
    510
    511 if( SCIPlpExactDiving(scip->lpexact) )
    512 {
    513 SCIPerrorMessage("already in exact diving mode\n");
    514 return SCIP_INVALIDCALL;
    515 }
    516
    517 if( SCIPlpDiving(scip->lp) )
    518 {
    519 SCIPerrorMessage("cannot start exact diving while being in diving mode\n");
    520 return SCIP_INVALIDCALL;
    521 }
    522
    523 if( SCIPtreeProbing(scip->tree) )
    524 {
    525 SCIPerrorMessage("cannot start exact diving while being in probing mode\n");
    526 return SCIP_INVALIDCALL;
    527 }
    528
    529 /* We start the exact LP dive parallel to the floating-point LP dive. This is necessary because we need to work with
    530 * several flags and counters of the floating-point LP.
    531 */
    533
    534 SCIP_CALL( SCIPlpExactStartDive(scip->lpexact, scip->mem->probmem, scip->set, scip->stat) );
    535
    536 return SCIP_OKAY;
    537}
    538
    539/** checks if exact diving mode is possible at this point in time
    540 *
    541 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    542 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    543 *
    544 * @pre This method can be called if @p scip is in one of the following stages:
    545 * - \ref SCIP_STAGE_SOLVING
    546 *
    547 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    548 *
    549 * @note In parallel to exact LP diving, this method also starts the regular LP diving mode by calling SCIPstartDive().
    550 */
    552 SCIP* scip /**< SCIP data structure */
    553 )
    554{
    555 assert(scip != NULL);
    556
    559
    560 if( SCIPlpExactDiving(scip->lpexact) )
    561 return FALSE;
    562
    563 if( SCIPlpDiving(scip->lp) )
    564 return FALSE;
    565
    566 if( SCIPtreeProbing(scip->tree) )
    567 return FALSE;
    568
    569 if( !SCIPlpIsSolved(scip->lp) )
    570 return FALSE;
    571
    572 return TRUE;
    573}
    574
    575/** returns whether we are in exact diving mode
    576 *
    577 * @return whether we are in exact diving mode.
    578 *
    579 * @pre This method can be called if @p scip is in one of the following stages:
    580 * - \ref SCIP_STAGE_TRANSFORMING
    581 * - \ref SCIP_STAGE_TRANSFORMED
    582 * - \ref SCIP_STAGE_INITPRESOLVE
    583 * - \ref SCIP_STAGE_PRESOLVING
    584 * - \ref SCIP_STAGE_EXITPRESOLVE
    585 * - \ref SCIP_STAGE_PRESOLVED
    586 * - \ref SCIP_STAGE_INITSOLVE
    587 * - \ref SCIP_STAGE_SOLVING
    588 * - \ref SCIP_STAGE_SOLVED
    589 * - \ref SCIP_STAGE_EXITSOLVE
    590 * - \ref SCIP_STAGE_FREETRANS
    591 *
    592 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    593 */
    595 SCIP* scip /**< SCIP data structure */
    596 )
    597{
    598 assert(scip != NULL);
    599
    601
    602 return SCIPlpExactDiving(scip->lpexact);
    603}
    604
    605/** quits exact LP diving and resets bounds and objective values of columns to the current node's values
    606 *
    607 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    608 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    609 *
    610 * @pre This method can be called if @p scip is in one of the following stages:
    611 * - \ref SCIP_STAGE_SOLVING
    612 *
    613 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    614 */
    616 SCIP* scip /**< SCIP data structure */
    617 )
    618{
    619 assert(scip != NULL);
    620
    622
    623 if( !SCIPlpExactDiving(scip->lpexact) )
    624 {
    625 SCIPerrorMessage("not in exact diving mode\n");
    626 return SCIP_INVALIDCALL;
    627 }
    628
    629 /* end floating-point LP dive, see comment in SCIPstartExactDive() */
    631
    632 /* unmark the diving flag in the exact LP and reset all variables' objective and bound values */
    633 SCIP_CALL( SCIPlpExactEndDive(scip->lpexact, scip->mem->probmem, scip->set, scip->stat, scip->eventqueue,
    634 scip->transprob->vars, scip->transprob->nvars) );
    635
    636 /* reset the probably changed LP's cutoff bound */
    637 SCIP_CALL( SCIPlpSetCutoffbound(scip->lp, scip->set, scip->transprob, scip->primal->cutoffbound) );
    638 assert(scip->lp->cutoffbound == scip->primal->cutoffbound); /*lint !e777*/
    639
    640 return SCIP_OKAY;
    641}
    642
    643/** solves the exact LP of the current dive; no separation or pricing is applied
    644 *
    645 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    646 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    647 *
    648 * @pre This method can be called if @p scip is in one of the following stages:
    649 * - \ref SCIP_STAGE_SOLVING
    650 *
    651 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    652 */
    654 SCIP* scip, /**< SCIP data structure */
    655 int itlim, /**< maximal number of LP iterations to perform, or -1 for no limit */
    656 SCIP_Bool* lperror, /**< pointer to store whether an unresolved LP error occurred */
    657 SCIP_Bool* cutoff /**< pointer to store whether the diving LP was infeasible or the objective
    658 * limit was reached (or NULL, if not needed) */
    659 )
    660{
    661 SCIP_RATIONAL* objval;
    662
    663 assert(scip != NULL);
    664
    665 SCIP_CALL( SCIPcheckStage(scip, "SCIPsolveExactDiveLP", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    666
    667 if( !SCIPlpExactDiving(scip->lpexact) )
    668 {
    669 SCIPerrorMessage("not in exact diving mode\n");
    670 return SCIP_INVALIDCALL;
    671 }
    672
    673 if( cutoff != NULL )
    674 *cutoff = FALSE;
    675
    676 /* solve diving LP */
    677 SCIP_CALL( SCIPlpExactSolveAndEval(scip->lpexact, scip->lp, scip->set, scip->messagehdlr, scip->mem->probmem, scip->stat,
    678 scip->eventqueue, scip->transprob, (SCIP_Longint)itlim, lperror, FALSE) );
    679
    680 if( !(*lperror) )
    681 {
    682 SCIP_CALL( SCIPrationalCreateBuffer(scip->set->buffer, &objval) );
    683 SCIPgetLPExactObjval(scip, objval);
    684
    685 /* the LP is infeasible or the objective limit was reached */
    689 {
    690 if( cutoff != NULL )
    691 *cutoff = TRUE;
    692 }
    693
    694 SCIPrationalFreeBuffer(scip->set->buffer, &objval);
    695 }
    696
    697 return SCIP_OKAY;
    698}
    699
    700/** changes variable's lower bound in current exact dive
    701 *
    702 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    703 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    704 *
    705 * @pre This method can be called if @p scip is in one of the following stages:
    706 * - \ref SCIP_STAGE_SOLVING
    707 *
    708 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    709 */
    711 SCIP* scip, /**< SCIP data structure */
    712 SCIP_VAR* var, /**< variable to change the bound for */
    713 SCIP_RATIONAL* newbound /**< new value for bound */
    714 )
    715{
    716 assert(scip != NULL);
    717 assert(var != NULL);
    718
    719 SCIP_CALL( SCIPcheckStage(scip, "SCIPchgVarLbExactDive", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    720
    721 if( !SCIPlpExactDiving(scip->lpexact) )
    722 {
    723 SCIPerrorMessage("not in exact diving mode\n");
    724 return SCIP_INVALIDCALL;
    725 }
    726
    727 SCIP_CALL( SCIPvarChgLbExactDive(var, scip->set, scip->lpexact, newbound) );
    728
    729 return SCIP_OKAY;
    730}
    731
    732/** changes variable's upper bound in current exact dive
    733 *
    734 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    735 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    736 *
    737 * @pre This method can be called if @p scip is in one of the following stages:
    738 * - \ref SCIP_STAGE_SOLVING
    739 *
    740 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    741 */
    743 SCIP* scip, /**< SCIP data structure */
    744 SCIP_VAR* var, /**< variable to change the bound for */
    745 SCIP_RATIONAL* newbound /**< new value for bound */
    746 )
    747{
    748 assert(scip != NULL);
    749 assert(var != NULL);
    750
    751 SCIP_CALL( SCIPcheckStage(scip, "SCIPchgVarUbExactDive", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
    752
    753 if( !SCIPlpExactDiving(scip->lpexact) )
    754 {
    755 SCIPerrorMessage("not in exact diving mode\n");
    756 return SCIP_INVALIDCALL;
    757 }
    758
    759 SCIP_CALL( SCIPvarChgUbExactDive(var, scip->set, scip->lpexact, newbound) );
    760
    761 return SCIP_OKAY;
    762}
    763
    764/** writes current exact LP to a file
    765 *
    766 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    767 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    768 *
    769 * @pre This method can be called if @p scip is in one of the following stages:
    770 * - \ref SCIP_STAGE_SOLVING
    771 *
    772 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    773 */
    775 SCIP* scip, /**< SCIP data structure */
    776 const char* filename /**< file name */
    777 )
    778{
    779 SCIP_Bool cutoff;
    780
    782
    784 {
    785 SCIP_CALL( SCIPconstructCurrentLP(scip->mem->probmem, scip->set, scip->stat, scip->transprob, scip->origprob,
    786 scip->tree, scip->reopt, scip->lp, scip->pricestore, scip->sepastore, scip->cutpool, scip->branchcand,
    787 scip->eventqueue, scip->eventfilter, scip->cliquetable, FALSE, &cutoff) );
    788 }
    789
    790 /* we need a flushed lp to write the current lp */
    791 SCIP_CALL( SCIPlpExactSyncLPs(scip->lpexact, scip->mem->probmem, scip->set) );
    792 SCIP_CALL( SCIPlpExactFlush(scip->lpexact, scip->mem->probmem, scip->set, scip->eventqueue) );
    793
    794 SCIP_CALL( SCIPlpExactWrite(scip->lpexact, filename) );
    795
    796 return SCIP_OKAY;
    797}
    internal methods for conflict analysis
    methods for debugging
    #define SCIPcheckStage(scip, method, init, problem, transforming, transformed, initpresolve, presolving, exitpresolve, presolved, initsolve, solving, solved, exitsolve, freetrans, freescip)
    Definition: debug.h:364
    #define NULL
    Definition: def.h:248
    #define SCIP_Longint
    Definition: def.h:141
    #define SCIP_Bool
    Definition: def.h:91
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define SCIP_CALL_ABORT(x)
    Definition: def.h:334
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_MESSAGEHDLR * SCIPgetMessagehdlr(SCIP *scip)
    Definition: scip_message.c:88
    SCIP_RETCODE SCIPstartDive(SCIP *scip)
    Definition: scip_lp.c:2206
    SCIP_RETCODE SCIPendDive(SCIP *scip)
    Definition: scip_lp.c:2255
    SCIP_RETCODE SCIPreleaseRowExact(SCIP *scip, SCIP_ROWEXACT **row)
    Definition: scip_lpexact.c:110
    SCIP_RETCODE SCIPsolveExactDiveLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
    Definition: scip_lpexact.c:653
    SCIP_Bool SCIPisExactDivePossible(SCIP *scip)
    Definition: scip_lpexact.c:551
    SCIP_Bool SCIPgetRowSolActivityWithErrorboundExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_Real *activity, SCIP_Real *errorbound)
    Definition: scip_lpexact.c:396
    SCIP_RETCODE SCIPprintRowExact(SCIP *scip, SCIP_ROWEXACT *row, FILE *file)
    Definition: scip_lpexact.c:419
    SCIP_RETCODE SCIPgenerateFpRowsFromRowExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_ROW *rowlhs, SCIP_ROW *rowrhs, SCIP_Bool *onerowrelax, SCIP_Bool *hasfprelax)
    Definition: scip_lpexact.c:309
    SCIP_RETCODE SCIPgetRowSolActivityExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_Bool useexact, SCIP_RATIONAL *result)
    Definition: scip_lpexact.c:367
    SCIP_RETCODE SCIPchgVarLbExactDive(SCIP *scip, SCIP_VAR *var, SCIP_RATIONAL *newbound)
    Definition: scip_lpexact.c:710
    SCIP_RETCODE SCIPgetRowSolFeasibilityExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_RATIONAL *result)
    Definition: scip_lpexact.c:335
    SCIP_LPSOLSTAT SCIPgetLPExactSolstat(SCIP *scip)
    Definition: scip_lpexact.c:475
    SCIP_RETCODE SCIPcreateRowExact(SCIP *scip, SCIP_ROWEXACT **row, SCIP_ROW *fprow, int len, SCIP_COLEXACT **cols, SCIP_RATIONAL **vals, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
    Definition: scip_lpexact.c:256
    SCIP_RETCODE SCIPchgRowExactLhs(SCIP *scip, SCIP_ROWEXACT *row, SCIP_RATIONAL *lhs)
    Definition: scip_lpexact.c:131
    SCIP_RETCODE SCIPcreateEmptyRowConsExact(SCIP *scip, SCIP_ROWEXACT **rowexact, SCIP_ROW *fprow, SCIP_ROW *fprowrhs, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
    Definition: scip_lpexact.c:228
    SCIP_RETCODE SCIPstartExactDive(SCIP *scip)
    Definition: scip_lpexact.c:502
    SCIP_RETCODE SCIPendExactDive(SCIP *scip)
    Definition: scip_lpexact.c:615
    SCIP_RETCODE SCIPwriteLPexact(SCIP *scip, const char *filename)
    Definition: scip_lpexact.c:774
    SCIP_RETCODE SCIPchgVarUbExactDive(SCIP *scip, SCIP_VAR *var, SCIP_RATIONAL *newbound)
    Definition: scip_lpexact.c:742
    SCIP_RETCODE SCIPchgRowExactRhs(SCIP *scip, SCIP_ROWEXACT *row, SCIP_RATIONAL *rhs)
    Definition: scip_lpexact.c:155
    SCIP_RETCODE SCIPaddVarsToRowExact(SCIP *scip, SCIP_ROWEXACT *row, int nvars, SCIP_VAR **vars, SCIP_RATIONAL **vals)
    Definition: scip_lpexact.c:182
    SCIP_Bool SCIPlpExactIsSolved(SCIP *scip)
    Definition: scip_lpexact.c:456
    SCIP_RETCODE SCIPcaptureRowExact(SCIP *scip, SCIP_ROWEXACT *row)
    Definition: scip_lpexact.c:88
    SCIP_RETCODE SCIPcreateRowExactFromRow(SCIP *scip, SCIP_ROW *fprow)
    Definition: scip_lpexact.c:285
    SCIP_Bool SCIPinExactDive(SCIP *scip)
    Definition: scip_lpexact.c:594
    void SCIPgetLPExactObjval(SCIP *scip, SCIP_RATIONAL *result)
    Definition: scip_lpexact.c:445
    SCIP_NODETYPE SCIPnodeGetType(SCIP_NODE *node)
    Definition: tree.c:8473
    void SCIPrationalFreeBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
    Definition: rational.cpp:473
    SCIP_RETCODE SCIPrationalCreateBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
    Definition: rational.cpp:123
    void SCIPrationalSetRational(SCIP_RATIONAL *res, SCIP_RATIONAL *src)
    Definition: rational.cpp:569
    SCIP_Bool SCIPrationalIsGE(SCIP_RATIONAL *rat1, SCIP_RATIONAL *rat2)
    Definition: rational.cpp:1512
    SCIP_CONS * SCIProwGetOriginCons(SCIP_ROW *row)
    Definition: lp.c:17835
    int SCIProwGetNNonz(SCIP_ROW *row)
    Definition: lp.c:17607
    SCIP_ROWORIGINTYPE SCIProwGetOrigintype(SCIP_ROW *row)
    Definition: lp.c:17825
    SCIP_RATIONAL * SCIPgetCutoffboundExact(SCIP *scip)
    SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
    Definition: scip_tree.c:91
    SCIP_Bool SCIPlpDiving(SCIP_LP *lp)
    Definition: lp.c:18251
    void SCIProwPrint(SCIP_ROW *row, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
    Definition: lp.c:5514
    SCIP_RETCODE SCIPlpSetCutoffbound(SCIP_LP *lp, SCIP_SET *set, SCIP_PROB *prob, SCIP_Real cutoffbound)
    Definition: lp.c:10451
    SCIP_Bool SCIPlpIsSolved(SCIP_LP *lp)
    Definition: lp.c:18211
    internal methods for LP management
    SCIP_RETCODE SCIProwExactGetSolFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_RATIONAL *result)
    Definition: lpexact.c:5446
    SCIP_RETCODE SCIPlpExactSolveAndEval(SCIP_LPEXACT *lpexact, SCIP_LP *lp, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_Longint itlim, SCIP_Bool *lperror, SCIP_Bool usefarkas)
    Definition: lpexact.c:4477
    SCIP_RATIONAL * SCIProwExactGetLPActivity(SCIP_ROWEXACT *row, SCIP_STAT *stat, SCIP_LPEXACT *lpexact)
    Definition: lpexact.c:5713
    SCIP_RETCODE SCIProwExactGetLPFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *result)
    Definition: lpexact.c:5655
    void SCIProwExactPrint(SCIP_ROWEXACT *row, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
    Definition: lpexact.c:4953
    SCIP_RETCODE SCIPlpExactStartDive(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
    Definition: lpexact.c:8177
    SCIP_RETCODE SCIPlpExactSyncLPs(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set)
    Definition: lpexact.c:8474
    SCIP_RETCODE SCIProwExactEnsureSize(SCIP_ROWEXACT *row, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
    Definition: lpexact.c:6062
    void SCIProwExactCapture(SCIP_ROWEXACT *row)
    Definition: lpexact.c:4940
    SCIP_RETCODE SCIProwExactCreate(SCIP_ROWEXACT **row, SCIP_ROW *fprow, SCIP_ROW *fprowrhs, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_LPEXACT *lpexact, int len, SCIP_COLEXACT **cols, SCIP_RATIONAL **vals, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
    Definition: lpexact.c:3138
    void SCIProwExactDelaySort(SCIP_ROWEXACT *rowexact)
    Definition: lpexact.c:5867
    SCIP_RETCODE SCIProwExactRelease(SCIP_ROWEXACT **row, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_LPEXACT *lpexact)
    Definition: lpexact.c:5583
    SCIP_RETCODE SCIProwExactGetPseudoFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_RATIONAL *result)
    Definition: lpexact.c:5684
    void SCIProwExactForceSort(SCIP_ROWEXACT *rowexact, SCIP_SET *set)
    Definition: lpexact.c:5878
    SCIP_Bool SCIProwExactGetSolActivityWithErrorbound(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_Real *activity, SCIP_Real *errorbound)
    Definition: lpexact.c:5475
    SCIP_Bool SCIPlpExactDiving(SCIP_LPEXACT *lpexact)
    Definition: lpexact.c:8423
    SCIP_RETCODE SCIProwExactCreateFromRow(SCIP_ROW *fprow, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_LPEXACT *lpexact)
    Definition: lpexact.c:3373
    SCIP_RETCODE SCIPlpExactEndDive(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_VAR **vars, int nvars)
    Definition: lpexact.c:8280
    SCIP_RETCODE SCIProwExactGetSolActivity(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_Bool useexact, SCIP_RATIONAL *result)
    Definition: lpexact.c:5529
    SCIP_LPSOLSTAT SCIPlpExactGetSolstat(SCIP_LPEXACT *lpexact)
    Definition: lpexact.c:8084
    SCIP_RATIONAL * SCIProwExactGetPseudoActivity(SCIP_ROWEXACT *row, SCIP_STAT *stat)
    Definition: lpexact.c:5734
    SCIP_RETCODE SCIProwExactGenerateFpRows(BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_LPEXACT *lpexact, SCIP_PROB *prob, SCIP_ROWEXACT *row, SCIP_ROW *rowlhs, SCIP_ROW *rowrhs, SCIP_Bool *onerowrelax, SCIP_Bool *hasfprelax)
    Definition: lpexact.c:3454
    void SCIPlpExactGetObjval(SCIP_LPEXACT *lpexact, SCIP_SET *set, SCIP_RATIONAL *res)
    Definition: lpexact.c:7416
    SCIP_RETCODE SCIProwExactChgRhs(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *rhs)
    Definition: lpexact.c:8063
    SCIP_RETCODE SCIPlpExactWrite(SCIP_LPEXACT *lpexact, const char *fname)
    Definition: lpexact.c:8434
    SCIP_RETCODE SCIPlpExactFlush(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_EVENTQUEUE *eventqueue)
    Definition: lpexact.c:3651
    SCIP_RETCODE SCIProwExactChgLhs(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *lhs)
    Definition: lpexact.c:8042
    internal methods for exact LP management
    interface methods for specific exact LP solvers
    internal methods for storing and manipulating the main problem
    public methods for LP management
    public methods for message output
    #define SCIPerrorMessage
    Definition: pub_message.h:64
    #define SCIPdebug(x)
    Definition: pub_message.h:93
    public methods for branch and bound tree
    public methods for the LP relaxation, rows and columns
    public methods for the LP relaxation, rows and columns
    public methods for memory management
    public methods for numerical tolerances
    public methods for solutions
    public methods for querying solving statistics
    public methods for the branch-and-bound tree
    public methods for SCIP variables
    internal methods for storing separated exact cuts
    internal methods for global SCIP settings
    SCIP_RETCODE SCIPconstructCurrentLP(BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_PRICESTORE *pricestore, SCIP_SEPASTORE *sepastore, SCIP_CUTPOOL *cutpool, SCIP_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool newinitconss, SCIP_Bool *cutoff)
    Definition: solve.c:1407
    internal methods for main solving loop and node processing
    SCIP_ROW * fprow
    SCIP_ROWEXACT * rowexact
    Definition: struct_lp.h:235
    data structures for exact LP management
    datastructures for block memory pools and memory buffers
    datastructures for collecting primal CIP solutions and primal informations
    datastructures for storing and manipulating the main problem
    SCIP main data structure.
    SCIP_Bool SCIPtreeIsFocusNodeLPConstructed(SCIP_TREE *tree)
    Definition: tree.c:9442
    SCIP_Bool SCIPtreeProbing(SCIP_TREE *tree)
    Definition: tree.c:9361
    SCIP_Bool SCIPtreeHasCurrentNodeLP(SCIP_TREE *tree)
    Definition: tree.c:9496
    internal methods for branch and bound tree
    enum SCIP_LPSolStat SCIP_LPSOLSTAT
    Definition: type_lp.h:52
    @ SCIP_ROWORIGINTYPE_CONS
    Definition: type_lp.h:75
    @ SCIP_LPSOLSTAT_NOTSOLVED
    Definition: type_lp.h:43
    @ SCIP_LPSOLSTAT_OPTIMAL
    Definition: type_lp.h:44
    @ SCIP_LPSOLSTAT_INFEASIBLE
    Definition: type_lp.h:45
    @ SCIP_LPSOLSTAT_OBJLIMIT
    Definition: type_lp.h:47
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_NODETYPE_FOCUSNODE
    Definition: type_tree.h:41
    SCIP_RETCODE SCIPvarChgLbExactDive(SCIP_VAR *var, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *newbound)
    Definition: var.c:13365
    SCIP_RETCODE SCIPvarChgUbExactDive(SCIP_VAR *var, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *newbound)
    Definition: var.c:13512
    SCIP_RETCODE SCIPvarAddToRowExact(SCIP_VAR *var, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_LPEXACT *lpexact, SCIP_ROWEXACT *rowexact, SCIP_RATIONAL *val)
    Definition: var.c:20135
    internal methods for problem variables