Scippy

    SCIP

    Solving Constraint Integer Programs

    prop_nlobbt.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 prop_nlobbt.c
    26 * @ingroup DEFPLUGINS_PROP
    27 * @brief nlobbt propagator
    28 * @author Benjamin Mueller
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    35#include "scip/prop_nlobbt.h"
    36#include "scip/pub_message.h"
    37#include "scip/pub_misc.h"
    38#include "scip/pub_misc_sort.h"
    39#include "scip/pub_nlp.h"
    40#include "scip/pub_prop.h"
    41#include "scip/pub_tree.h"
    42#include "scip/pub_var.h"
    43#include "scip/scip_general.h"
    44#include "scip/scip_lp.h"
    45#include "scip/scip_mem.h"
    46#include "scip/scip_message.h"
    47#include "scip/scip_nlp.h"
    48#include "scip/scip_nlpi.h"
    49#include "scip/scip_numerics.h"
    50#include "scip/scip_param.h"
    51#include "scip/scip_prob.h"
    52#include "scip/scip_probing.h"
    53#include "scip/scip_prop.h"
    56#include "scip/scip_timing.h"
    57#include "scip/scip_tree.h"
    58#include "scip/scip_var.h"
    59#include <string.h>
    60
    61#define PROP_NAME "nlobbt"
    62#define PROP_DESC "propagator template"
    63#define PROP_PRIORITY -1100000
    64#define PROP_FREQ -1
    65#define PROP_DELAY TRUE
    66#define PROP_TIMING SCIP_PROPTIMING_AFTERLPLOOP
    67
    68#define DEFAULT_MINNONCONVEXFRAC 0.20 /**< default minimum (# convex nlrows)/(# nonconvex nlrows) threshold to apply propagator */
    69#define DEFAULT_MINLINEARFRAC 0.02 /**< default minimum (# convex nlrows)/(# linear nlrows) threshold to apply propagator */
    70#define DEFAULT_FEASTOLFAC 0.01 /**< default factor for NLP feasibility tolerance */
    71#define DEFAULT_RELOBJTOLFAC 0.01 /**< default factor for NLP relative objective tolerance */
    72#define DEFAULT_ADDLPROWS TRUE /**< should (non-initial) LP rows be used? */
    73#define DEFAULT_ITLIMITFACTOR 2.0 /**< multiple of root node LP iterations used as total LP iteration
    74 * limit for nlobbt (<= 0: no limit ) */
    75#define DEFAULT_NLPITERLIMIT 500 /**< default iteration limit of NLP solver; 0 for no limit */
    76#define DEFAULT_NLPTIMELIMIT 0.0 /**< default time limit of NLP solver; 0.0 for no limit */
    77#define DEFAULT_NLPVERLEVEL 0 /**< verbosity level of NLP solver */
    78#define DEFAULT_RANDSEED 79 /**< initial random seed */
    79
    80/*
    81 * Data structures
    82 */
    83
    84/* status of bound candidates */
    85#define UNSOLVED 1 /**< did not solve LB or UB problem */
    86#define SOLVEDLB 2 /**< solved LB problem */
    87#define SOLVEDUB 4 /**< solved UB problem */
    88
    89/** propagator data */
    90struct SCIP_PropData
    91{
    92 SCIP_NLPI* nlpi; /**< nlpi used to create the nlpi problem */
    93 SCIP_NLPIPROBLEM* nlpiprob; /**< nlpi problem representing the convex NLP relaxation */
    94 SCIP_HASHMAP* var2nlpiidx; /**< mapping between variables and nlpi indices */
    95 SCIP_VAR** nlpivars; /**< array containing all variables of the nlpi */
    96 int nlpinvars; /**< total number of nlpi variables */
    97 SCIP_Real* nlscore; /**< score for each nonlinear variable */
    98 int* status; /**< array containing a bound status for each candidate */
    99 SCIP_PROP* genvboundprop; /**< genvbound propagator */
    100 SCIP_RANDNUMGEN* randnumgen; /**< random number generator */
    101 SCIP_Bool skipprop; /**< should the propagator be skipped? */
    102 SCIP_Longint lastnode; /**< number of last node where obbt was performed */
    103 int currpos; /**< current position in the nlpivars array */
    104
    105 int nlpiterlimit; /**< iteration limit of NLP solver; 0 for no limit */
    106 SCIP_Real nlptimelimit; /**< time limit of NLP solver; 0.0 for no limit */
    107 int nlpverblevel; /**< verbosity level of NLP solver */
    108 SCIP_NLPSTATISTICS nlpstatistics; /**< statistics from NLP solver */
    109
    110 SCIP_Real feastolfac; /**< factor for NLP feasibility tolerance */
    111 SCIP_Real relobjtolfac; /**< factor for NLP relative objective tolerance */
    112 SCIP_Real minnonconvexfrac; /**< minimum (#convex nlrows)/(#nonconvex nlrows) threshold to apply propagator */
    113 SCIP_Real minlinearfrac; /**< minimum (#convex nlrows)/(#linear nlrows) threshold to apply propagator */
    114 SCIP_Bool addlprows; /**< should (non-initial) LP rows be used? */
    115 SCIP_Real itlimitfactor; /**< LP iteration limit for nlobbt will be this factor times total LP
    116 * iterations in root node */
    117};
    118
    119/*
    120 * Local methods
    121 */
    122
    123/** clears the propagator data */
    124static
    126 SCIP* scip, /**< SCIP data structure */
    127 SCIP_PROPDATA* propdata /**< propagator data */
    128 )
    129{
    130 assert(propdata != NULL);
    131
    132 if( propdata->nlpiprob != NULL )
    133 {
    134 assert(propdata->nlpi != NULL);
    135
    136 SCIPfreeBlockMemoryArray(scip, &propdata->status, propdata->nlpinvars);
    137 SCIPfreeBlockMemoryArray(scip, &propdata->nlscore, propdata->nlpinvars);
    138 SCIPfreeBlockMemoryArray(scip, &propdata->nlpivars, propdata->nlpinvars);
    139 SCIPhashmapFree(&propdata->var2nlpiidx);
    140 SCIP_CALL( SCIPfreeNlpiProblem(scip, propdata->nlpi, &propdata->nlpiprob) );
    141
    142 propdata->nlpinvars = 0;
    143 }
    144 assert(propdata->nlpinvars == 0);
    145
    146 propdata->skipprop = FALSE;
    147 propdata->currpos = 0;
    148 propdata->lastnode = -1;
    149
    150 return SCIP_OKAY;
    151}
    152
    153/** checks whether it is worth to call nonlinear OBBT procedure */
    154static
    156 SCIP* scip, /**< SCIP data structure */
    157 SCIP_PROPDATA* propdata /**< propagation data */
    158 )
    159{
    160 SCIP_NLROW** nlrows;
    161 int nnonconvexnlrows;
    162 int nconvexnlrows;
    163 int nlinearnlrows;
    164 int nnlrows;
    165 int i;
    166
    167 nlrows = SCIPgetNLPNlRows(scip);
    168 nnlrows = SCIPgetNNLPNlRows(scip);
    169 nnonconvexnlrows = 0;
    170 nconvexnlrows = 0;
    171 nlinearnlrows = 0;
    172
    173 for( i = 0; i < nnlrows; ++i )
    174 {
    175 if( SCIPnlrowGetExpr(nlrows[i]) == NULL )
    176 ++nlinearnlrows;
    177 else if( SCIPnlrowGetCurvature(nlrows[i]) == SCIP_EXPRCURV_CONVEX )
    178 {
    179 if( !SCIPisInfinity(scip, SCIPnlrowGetRhs(nlrows[i])) )
    180 ++nconvexnlrows;
    181 if( !SCIPisInfinity(scip, -SCIPnlrowGetLhs(nlrows[i])) )
    182 ++nnonconvexnlrows;
    183 }
    184 else if( SCIPnlrowGetCurvature(nlrows[i]) == SCIP_EXPRCURV_CONCAVE )
    185 {
    186 if( !SCIPisInfinity(scip, SCIPnlrowGetRhs(nlrows[i])) )
    187 ++nnonconvexnlrows;
    188 if( !SCIPisInfinity(scip, -SCIPnlrowGetLhs(nlrows[i])) )
    189 ++nconvexnlrows;
    190 }
    191 else
    192 {
    193 if( !SCIPisInfinity(scip, SCIPnlrowGetRhs(nlrows[i])) )
    194 ++nnonconvexnlrows;
    195 if( !SCIPisInfinity(scip, -SCIPnlrowGetLhs(nlrows[i])) )
    196 ++nnonconvexnlrows;
    197 }
    198 }
    199
    200 SCIPdebugMsg(scip, "nconvex=%d nnonconvex=%d nlinear=%d\n", nconvexnlrows, nnonconvexnlrows, nlinearnlrows);
    201
    202 return nconvexnlrows > 0
    203 && nnonconvexnlrows > 0
    204 && (SCIPisGE(scip, (SCIP_Real)nconvexnlrows, nnonconvexnlrows * propdata->minnonconvexfrac))
    205 && (SCIPisGE(scip, (SCIP_Real)nconvexnlrows, nlinearnlrows * propdata->minlinearfrac));
    206}
    207
    208/** filters variables which achieve their lower or dual bound in the current NLP solution */
    209static
    211 SCIP* scip, /**< SCIP data structure */
    212 SCIP_PROPDATA* propdata /**< propagator data */
    213 )
    214{
    215 SCIP_Real* primal;
    216 int i;
    217
    218 assert(propdata->currpos >= 0 && propdata->currpos < propdata->nlpinvars);
    219 assert(SCIPgetNlpiSolstat(scip, propdata->nlpi, propdata->nlpiprob) <= SCIP_NLPSOLSTAT_FEASIBLE);
    220
    221 SCIP_CALL( SCIPgetNlpiSolution(scip, propdata->nlpi, propdata->nlpiprob, &primal, NULL, NULL, NULL, NULL) );
    222 assert(primal != NULL);
    223
    224 /* we skip all candidates which have been processed already, i.e., starting at propdata->currpos + 1 */
    225 for( i = propdata->currpos + 1; i < propdata->nlpinvars; ++i )
    226 {
    227 SCIP_VAR* var;
    228 SCIP_Real val;
    229 int varidx;
    230
    231 /* only uninteresting variables left -> stop filtering */
    232 if( SCIPisLE(scip, propdata->nlscore[i], 0.0) )
    233 break;
    234
    235 var = propdata->nlpivars[i];
    236 assert(var != NULL && SCIPhashmapExists(propdata->var2nlpiidx, (void*)var));
    237
    238 varidx = SCIPhashmapGetImageInt(propdata->var2nlpiidx, (void*)var);
    239 assert(SCIPgetVars(scip)[varidx] == var);
    240 val = primal[varidx];
    241
    242 if( (propdata->status[i] & SOLVEDLB) == 0 && !SCIPisInfinity(scip, -val) /*lint !e641*/
    243 && SCIPisFeasLE(scip, val, SCIPvarGetLbLocal(var)) )
    244 {
    245 SCIPdebugMsg(scip, "filter LB of %s in [%g,%g] with %g\n", SCIPvarGetName(var), SCIPvarGetLbLocal(var),
    246 SCIPvarGetUbLocal(var), val);
    247 propdata->status[i] |= SOLVEDLB; /*lint !e641*/
    248 assert((propdata->status[i] & SOLVEDLB) != 0); /*lint !e641*/
    249 }
    250
    251 if( (propdata->status[i] & SOLVEDUB) == 0 && !SCIPisInfinity(scip, val) /*lint !e641*/
    252 && SCIPisFeasGE(scip, val, SCIPvarGetUbLocal(var)) )
    253 {
    254 SCIPdebugMsg(scip, "filter UB of %s in [%g,%g] with %g\n", SCIPvarGetName(var), SCIPvarGetLbLocal(var),
    255 SCIPvarGetUbLocal(var), val);
    256 propdata->status[i] |= SOLVEDUB; /*lint !e641*/
    257 assert((propdata->status[i] & SOLVEDUB) != 0); /*lint !e641*/
    258 }
    259 }
    260
    261 return SCIP_OKAY;
    262}
    263
    264/** tries to add a generalized variable bound by exploiting the dual solution of the last NLP solve (see @ref
    265 * prop_nlobbt.h for more information)
    266 */
    267static
    269 SCIP* scip, /**< SCIP data structure */
    270 SCIP_PROPDATA* propdata, /**< propagator data */
    271 SCIP_VAR* var, /**< variable used in last NLP solve */
    272 int varidx, /**< variable index in the propdata->nlpivars array */
    273 SCIP_BOUNDTYPE boundtype, /**< type of bound provided by the genvbound */
    274 SCIP_Real cutoffbound /**< cutoff bound */
    275 )
    276{
    277 SCIP_VAR** lvbvars;
    278 SCIP_Real* lvbcoefs;
    279 SCIP_Real* primal;
    280 SCIP_Real* dual;
    281 SCIP_Real* alpha;
    282 SCIP_Real* beta;
    283 SCIP_Real constant;
    284 SCIP_Real mu;
    285 int nlvbvars;
    286 int i;
    287
    288 assert(propdata->genvboundprop != NULL);
    289 assert(var != NULL);
    290 assert(varidx >= 0 && varidx < propdata->nlpinvars);
    291 assert(SCIPgetNlpiSolstat(scip, propdata->nlpi, propdata->nlpiprob) <= SCIP_NLPSOLSTAT_LOCOPT);
    292
    293 SCIP_CALL( SCIPgetNlpiSolution(scip, propdata->nlpi, propdata->nlpiprob, &primal, &dual, &alpha, &beta, NULL) );
    294
    295 /* not possible to generate genvbound if the duals for the propagated variable do not disappear */
    296 if( !SCIPisFeasZero(scip, alpha[varidx] - beta[varidx]) )
    297 return SCIP_OKAY;
    298
    299 SCIP_CALL( SCIPallocBufferArray(scip, &lvbcoefs, propdata->nlpinvars) );
    300 SCIP_CALL( SCIPallocBufferArray(scip, &lvbvars, propdata->nlpinvars) );
    301 constant = boundtype == SCIP_BOUNDTYPE_LOWER ? primal[varidx] : -primal[varidx];
    302 mu = 0.0;
    303 nlvbvars = 0;
    304
    305 /* collect coefficients of genvbound */
    306 for( i = 0; i < propdata->nlpinvars; ++i )
    307 {
    308 if( !SCIPisZero(scip, beta[i] - alpha[i]) )
    309 {
    310 lvbvars[nlvbvars] = propdata->nlpivars[i];
    311 lvbcoefs[nlvbvars] = beta[i] - alpha[i];
    312 ++nlvbvars;
    313
    314 constant += (alpha[i] - beta[i]) * primal[i];
    315 }
    316 }
    317
    318 /* first dual multiplier corresponds to the cutoff row if cutoffbound < SCIPinfinity() */
    319 if( !SCIPisInfinity(scip, cutoffbound) && SCIPisGT(scip, dual[0], 0.0) )
    320 {
    321 mu = dual[0];
    322 constant += mu * cutoffbound;
    323 }
    324
    325 /* add genvbound to genvbounds propagator */
    326 if( !SCIPisInfinity(scip, REALABS(constant)) && (nlvbvars > 0 || SCIPisFeasGT(scip, mu, 0.0)) )
    327 {
    328 SCIP_CALL( SCIPgenVBoundAdd(scip, propdata->genvboundprop, lvbvars, var, lvbcoefs, nlvbvars, -mu, constant,
    329 boundtype) );
    330 SCIPdebugMsg(scip, "add genvbound for %s\n", SCIPvarGetName(var));
    331 }
    332
    333 SCIPfreeBufferArray(scip, &lvbvars);
    334 SCIPfreeBufferArray(scip, &lvbcoefs);
    335
    336 return SCIP_OKAY;
    337}
    338
    339/** sets the objective function, solves the NLP, and tightens the given variable; after calling this function, the
    340 * objective function is set to zero
    341 *
    342 * @note function assumes that objective function is zero
    343 */
    344static
    346 SCIP* scip, /**< SCIP data structure */
    347 SCIP_PROPDATA* propdata, /**< propagator data */
    348 SCIP_VAR* var, /**< variable to propagate */
    349 int varidx, /**< variable index in the propdata->nlpivars array */
    350 SCIP_BOUNDTYPE boundtype, /**< minimize or maximize var? */
    351 SCIP_NLPPARAM* nlpparam, /**< NLP solve parameters */
    352 int* nlpiter, /**< buffer to store the total number of nlp iterations */
    353 SCIP_RESULT* result /**< pointer to store result */
    354 )
    355{
    356 SCIP_Real timelimit;
    357 SCIP_Real* primal;
    358 SCIP_Real obj;
    359 int iterlimit;
    360
    361#ifdef SCIP_DEBUG
    362 SCIP_Real oldlb;
    363 SCIP_Real oldub;
    364
    365 oldlb = SCIPvarGetLbLocal(var);
    366 oldub = SCIPvarGetUbLocal(var);
    367#endif
    368
    369 assert(var != NULL);
    370 assert(varidx >= 0 && varidx < propdata->nlpinvars);
    371 assert(result != NULL && *result != SCIP_CUTOFF);
    372
    373 *nlpiter = 0;
    374
    375 /* set time and iteration limit */
    376 SCIP_CALL( SCIPgetRealParam(scip, "limits/time", &timelimit) );
    377 if( !SCIPisInfinity(scip, timelimit) )
    378 {
    379 timelimit -= SCIPgetSolvingTime(scip);
    380 if( timelimit <= 0.0 )
    381 {
    382 SCIPdebugMsg(scip, "skip NLP solve; no time left\n");
    383 return SCIP_OKAY;
    384 }
    385 }
    386 if( propdata->nlptimelimit > 0.0 )
    387 timelimit = MIN(propdata->nlptimelimit, timelimit);
    388 iterlimit = propdata->nlpiterlimit > 0 ? propdata->nlpiterlimit : INT_MAX;
    389 nlpparam->timelimit = timelimit;
    390 nlpparam->iterlimit = iterlimit;
    391
    392 /* set corresponding objective coefficient and solve NLP */
    393 obj = boundtype == SCIP_BOUNDTYPE_LOWER ? 1.0 : -1.0;
    394 SCIP_CALL( SCIPsetNlpiObjective(scip, propdata->nlpi, propdata->nlpiprob, 1, &varidx, &obj, NULL, 0.0) );
    395
    396 SCIPdebugMsg(scip, "solve var=%s boundtype=%d nlscore=%g\n", SCIPvarGetName(var), boundtype,
    397 propdata->nlscore[propdata->currpos]);
    398 SCIP_CALL( SCIPsolveNlpiParam(scip, propdata->nlpi, propdata->nlpiprob, *nlpparam) );
    399 SCIPdebugMsg(scip, "NLP solstat = %d\n", SCIPgetNlpiSolstat(scip, propdata->nlpi, propdata->nlpiprob));
    400
    401 /* collect NLP statistics */
    402 SCIP_CALL( SCIPgetNlpiStatistics(scip, propdata->nlpi, propdata->nlpiprob, &propdata->nlpstatistics) );
    403 *nlpiter = propdata->nlpstatistics.niterations;
    404 SCIPdebugMsg(scip, "iterations %d time %g\n", *nlpiter, propdata->nlpstatistics.totaltime);
    405
    406 /* filter bound candidates first, otherwise we do not have access to the primal solution values */
    407 if( SCIPgetNlpiSolstat(scip, propdata->nlpi, propdata->nlpiprob) <= SCIP_NLPSOLSTAT_FEASIBLE )
    408 {
    409 SCIP_CALL( filterCands(scip, propdata) );
    410 }
    411
    412 /* try to tighten variable bound */
    413 if( SCIPgetNlpiSolstat(scip, propdata->nlpi, propdata->nlpiprob) <= SCIP_NLPSOLSTAT_LOCOPT )
    414 {
    415 SCIP_Bool tightened;
    416 SCIP_Bool infeasible;
    417
    418 /* try to add a genvbound in the root node */
    419 if( propdata->genvboundprop != NULL && SCIPgetDepth(scip) == 0 )
    420 {
    421 SCIP_CALL( addGenVBound(scip, propdata, var, varidx, boundtype, SCIPgetCutoffbound(scip)) );
    422 }
    423
    424 SCIP_CALL( SCIPgetNlpiSolution(scip, propdata->nlpi, propdata->nlpiprob, &primal, NULL, NULL, NULL, NULL) );
    425
    426 if( boundtype == SCIP_BOUNDTYPE_LOWER )
    427 {
    428 SCIP_CALL( SCIPtightenVarLb(scip, var, primal[varidx], FALSE, &infeasible, &tightened) );
    429 }
    430 else
    431 {
    432 SCIP_CALL( SCIPtightenVarUb(scip, var, primal[varidx], FALSE, &infeasible, &tightened) );
    433 }
    434
    435 if( infeasible )
    436 {
    437 SCIPdebugMsg(scip, "detect infeasibility after propagating %s\n", SCIPvarGetName(var));
    438 *result = SCIP_CUTOFF;
    439 }
    440 else if( tightened )
    441 {
    442 SCIP_Real lb;
    443 SCIP_Real ub;
    444
    445 *result = SCIP_REDUCEDDOM;
    446
    447 /* update bounds in NLP */
    448 lb = SCIPvarGetLbLocal(var);
    449 ub = SCIPvarGetUbLocal(var);
    450 SCIP_CALL( SCIPchgNlpiVarBounds(scip, propdata->nlpi, propdata->nlpiprob, 1, &varidx, &lb, &ub) );
    451
    452#ifdef SCIP_DEBUG
    453 SCIPdebugMsg(scip, "tightened bounds of %s from [%g,%g] to [%g,%g]\n", SCIPvarGetName(var), oldlb, oldub, lb, ub);
    454#endif
    455 }
    456 }
    457
    458 /* reset objective function */
    459 obj = 0.0;
    460 SCIP_CALL( SCIPsetNlpiObjective(scip, propdata->nlpi, propdata->nlpiprob, 1, &varidx, &obj, NULL, 0.0) );
    461
    462 return SCIP_OKAY;
    463}
    464
    465/** main method of the propagator
    466 *
    467 * creates a convex NLP relaxation and solves the OBBT-NLPs for each possible candidate;
    468 * binary and variables with a small domain will be ignored to reduce the computational cost of the propagator; after
    469 * solving each NLP we filter out all variable candidates which are on their lower or upper bound; candidates with a
    470 * larger number of occurrences are preferred
    471 */
    472static
    474 SCIP* scip, /**< SCIP data structure */
    475 SCIP_PROPDATA* propdata, /**< propagation data */
    476 SCIP_RESULT* result /**< pointer to store result */
    477 )
    478{
    479 SCIP_NLPPARAM nlpparam = SCIP_NLPPARAM_DEFAULT(scip); /*lint !e446*/
    480 int nlpiterleft;
    481
    482 assert(result != NULL);
    483 assert(!propdata->skipprop);
    484 assert(SCIPgetNNlpis(scip) > 0);
    485
    486 *result = SCIP_DIDNOTRUN;
    487
    488 if( propdata->nlpiprob == NULL && !isNlobbtApplicable(scip, propdata) )
    489 {
    490 /* do not call the propagator anymore (except after a restart) */
    491 SCIPdebugMsg(scip, "nlobbt propagator is not applicable\n");
    492 propdata->skipprop = TRUE;
    493 return SCIP_OKAY;
    494 }
    495
    496 *result = SCIP_DIDNOTFIND;
    497
    498 /* compute NLP iteration limit */
    499 if( propdata->itlimitfactor > 0.0 )
    500 nlpiterleft = (int)(propdata->itlimitfactor * SCIPgetNRootLPIterations(scip));
    501 else
    502 nlpiterleft = INT_MAX;
    503
    504 /* recompute NLP relaxation if the variable set changed */
    505 if( propdata->nlpiprob != NULL && SCIPgetNVars(scip) != propdata->nlpinvars )
    506 {
    507 SCIP_CALL( propdataClear(scip, propdata) );
    508 assert(propdata->nlpiprob == NULL);
    509 }
    510
    511 /* create or update NLP relaxation */
    512 if( propdata->nlpiprob == NULL )
    513 {
    514 int i;
    515
    516 propdata->nlpinvars = SCIPgetNVars(scip);
    517 propdata->nlpi = SCIPgetNlpis(scip)[0];
    518 assert(propdata->nlpi != NULL);
    519
    520 SCIP_CALL( SCIPhashmapCreate(&propdata->var2nlpiidx, SCIPblkmem(scip), propdata->nlpinvars) );
    521 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &propdata->nlpivars, SCIPgetVars(scip), propdata->nlpinvars) ); /*lint !e666*/
    522 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &propdata->nlscore, propdata->nlpinvars) );
    523 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &propdata->status, propdata->nlpinvars) );
    524
    525 SCIP_CALL( SCIPcreateNlpiProblemFromNlRows(scip, propdata->nlpi, &propdata->nlpiprob, "nlobbt-nlp", SCIPgetNLPNlRows(scip), SCIPgetNNLPNlRows(scip),
    526 propdata->var2nlpiidx, NULL, propdata->nlscore, SCIPgetCutoffbound(scip), FALSE, TRUE) );
    527
    528 /* initialize bound status; perturb nlscores by a factor which ensures that zero scores remain zero */
    529 assert(propdata->randnumgen != NULL);
    530 for( i = 0; i < propdata->nlpinvars; ++i )
    531 {
    532 propdata->status[i] = UNSOLVED; /*lint !e641*/
    533 propdata->nlscore[i] *= 1.0 + SCIPrandomGetReal(propdata->randnumgen, SCIPfeastol(scip), 2.0 * SCIPfeastol(scip));
    534 }
    535
    536 /* add rows of the LP */
    537 if( SCIPgetDepth(scip) == 0 )
    538 {
    539 SCIP_CALL( SCIPaddNlpiProblemRows(scip, propdata->nlpi, propdata->nlpiprob, propdata->var2nlpiidx,
    541 }
    542 }
    543 else
    544 {
    545 SCIP_CALL( SCIPupdateNlpiProblem(scip, propdata->nlpi, propdata->nlpiprob, propdata->var2nlpiidx,
    546 propdata->nlpivars, propdata->nlpinvars, SCIPgetCutoffbound(scip)) );
    547 }
    548
    549 assert(propdata->nlpiprob != NULL);
    550 assert(propdata->var2nlpiidx != NULL);
    551 assert(propdata->nlpivars != NULL);
    552 assert(propdata->nlscore != NULL);
    553
    554 /* sort variables w.r.t. their nlscores if we did not solve any NLP for this node */
    555 if( propdata->currpos == 0 )
    556 {
    557 SCIPsortDownRealIntPtr(propdata->nlscore, propdata->status, (void**)propdata->nlpivars, propdata->nlpinvars);
    558 }
    559
    560 /* set parameters of NLP solver */
    561 nlpparam.feastol *= propdata->feastolfac;
    562 nlpparam.opttol = SCIPfeastol(scip) * propdata->relobjtolfac;
    563 nlpparam.verblevel = (unsigned short)propdata->nlpverblevel;
    564
    565 /* main propagation loop */
    566 while( propdata->currpos < propdata->nlpinvars
    567 && nlpiterleft > 0
    568 && SCIPisGT(scip, propdata->nlscore[propdata->currpos], 0.0)
    569 && *result != SCIP_CUTOFF
    570 && !SCIPisStopped(scip) )
    571 {
    572 SCIP_VAR* var;
    573 int varidx;
    574 int iters;
    575
    576 var = propdata->nlpivars[propdata->currpos];
    577 assert(var != NULL);
    578
    579 /* skip binary or almost fixed variables */
    582 {
    583 ++(propdata->currpos);
    584 continue;
    585 }
    586
    587 SCIPdebugMsg(scip, "iterations left %d\n", nlpiterleft);
    588
    589 /* get index of var in the nlpi */
    590 assert(SCIPhashmapExists(propdata->var2nlpiidx, (void*)var) );
    591 varidx = SCIPhashmapGetImageInt(propdata->var2nlpiidx, (void*)var);
    592 assert(var == SCIPgetVars(scip)[varidx]);
    593
    594 /* case: minimize var */
    595 if( (propdata->status[propdata->currpos] & SOLVEDLB) == 0 ) /*lint !e641*/
    596 {
    597 SCIP_CALL( solveNlp(scip, propdata, var, varidx, SCIP_BOUNDTYPE_LOWER, &nlpparam, &iters, result) );
    598 nlpiterleft -= iters;
    599 }
    600
    601 /* case: maximize var */
    602 if( *result != SCIP_CUTOFF && (propdata->status[propdata->currpos] & SOLVEDUB) == 0 ) /*lint !e641*/
    603 {
    604 SCIP_CALL( solveNlp(scip, propdata, var, varidx, SCIP_BOUNDTYPE_UPPER, &nlpparam, &iters, result) );
    605 nlpiterleft -= iters;
    606 }
    607
    608 /* update the current position */
    609 ++(propdata->currpos);
    610 }
    611
    612 return SCIP_OKAY;
    613}
    614
    615/*
    616 * Callback methods of propagator
    617 */
    618
    619/** copy method for propagating plugins (called when SCIP copies plugins) */
    620static
    621SCIP_DECL_PROPCOPY(propCopyNlobbt)
    622{ /*lint --e{715}*/
    623 assert(scip != NULL);
    624 assert(prop != NULL);
    625 assert(strcmp(SCIPpropGetName(prop), PROP_NAME) == 0);
    626
    627 /* call inclusion method of propagator */
    629
    630 return SCIP_OKAY;
    631}
    632
    633/** destructor of propagator to free user data (called when SCIP is exiting) */
    634static
    635SCIP_DECL_PROPFREE(propFreeNlobbt)
    636{ /*lint --e{715}*/
    637 SCIP_PROPDATA* propdata;
    638
    639 propdata = SCIPpropGetData(prop);
    640 assert(propdata != NULL);
    641
    642 SCIP_CALL( propdataClear(scip, propdata) );
    643 SCIPfreeBlockMemory(scip, &propdata);
    644 SCIPpropSetData(prop, NULL);
    645
    646 return SCIP_OKAY;
    647}
    648
    649/** solving process initialization method of propagator (called when branch and bound process is about to begin) */
    650static
    651SCIP_DECL_PROPINITSOL(propInitsolNlobbt)
    652{ /*lint --e{715}*/
    653 SCIP_PROPDATA* propdata;
    654
    655 assert(scip != NULL);
    656 assert(prop != NULL);
    657
    658 propdata = SCIPpropGetData(prop);
    659 assert(propdata != NULL);
    660
    661 /* if genvbounds propagator is not available, we cannot create genvbounds */
    662 propdata->genvboundprop = SCIPfindProp(scip, "genvbounds");
    663
    664 SCIP_CALL( SCIPcreateRandom(scip, &propdata->randnumgen,
    666 propdata->lastnode = -1;
    667
    668 return SCIP_OKAY;
    669}
    670
    671/** solving process deinitialization method of propagator (called before branch and bound process data is freed) */
    672static
    673SCIP_DECL_PROPEXITSOL(propExitsolNlobbt)
    674{ /*lint --e{715}*/
    675 SCIP_PROPDATA* propdata;
    676
    677 propdata = SCIPpropGetData(prop);
    678 assert(propdata != NULL);
    679
    680 SCIPfreeRandom(scip, &propdata->randnumgen);
    681
    682 SCIP_CALL( propdataClear(scip, propdata) );
    683
    684 return SCIP_OKAY;
    685}
    686
    687/** execution method of propagator */
    688static
    689SCIP_DECL_PROPEXEC(propExecNlobbt)
    690{ /*lint --e{715}*/
    691 SCIP_PROPDATA* propdata;
    692
    693 *result = SCIP_DIDNOTRUN;
    694
    695 propdata = SCIPpropGetData(prop);
    696 assert(propdata != NULL);
    697
    698 if( propdata->skipprop || SCIPgetStage(scip) != SCIP_STAGE_SOLVING || SCIPinRepropagation(scip)
    700 {
    701 SCIPdebugMsg(scip, "skip nlobbt propagator\n");
    702 return SCIP_OKAY;
    703 }
    704
    705 /* only run if LP all columns are in the LP, e.g., do not run if pricers are active */
    706 if( !SCIPallColsInLP(scip) )
    707 {
    708 SCIPdebugMsg(scip, "not all columns in LP, skipping obbt\n");
    709 return SCIP_OKAY;
    710 }
    711
    712 /* do not run if SCIP does not have constructed an NLP */
    714 {
    715 SCIPdebugMsg(scip, "NLP not constructed, skipping nlobbt\n");
    716 return SCIP_OKAY;
    717 }
    718
    719 /* consider all variables again if we process a new node */
    720 if( SCIPnodeGetNumber(SCIPgetCurrentNode(scip)) != propdata->lastnode )
    721 {
    722 propdata->lastnode = SCIPnodeGetNumber(SCIPgetCurrentNode(scip));
    723 propdata->currpos = 0;
    724 }
    725
    726 /* call main procedure of nonlinear OBBT propagator */
    727 SCIP_CALL( applyNlobbt(scip, propdata, result) );
    728
    729 return SCIP_OKAY;
    730}
    731
    732/*
    733 * propagator specific interface methods
    734 */
    735
    736/** creates the nlobbt propagator and includes it in SCIP */
    738 SCIP* scip /**< SCIP data structure */
    739 )
    740{
    741 SCIP_PROPDATA* propdata;
    742 SCIP_PROP* prop;
    743
    744 propdata = NULL;
    745 prop = NULL;
    746
    747 SCIP_CALL( SCIPallocBlockMemory(scip, &propdata) );
    748 assert(propdata != NULL);
    749 BMSclearMemory(propdata);
    750
    752 propExecNlobbt, propdata) );
    753 assert(prop != NULL);
    754
    755 /* set non fundamental callbacks via setter functions */
    756 SCIP_CALL( SCIPsetPropCopy(scip, prop, propCopyNlobbt) );
    757 SCIP_CALL( SCIPsetPropFree(scip, prop, propFreeNlobbt) );
    758 SCIP_CALL( SCIPsetPropInitsol(scip, prop, propInitsolNlobbt) );
    759 SCIP_CALL( SCIPsetPropExitsol(scip, prop, propExitsolNlobbt) );
    760
    761 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/feastolfac",
    762 "factor for NLP feasibility tolerance",
    763 &propdata->feastolfac, TRUE, DEFAULT_FEASTOLFAC, 0.0, 1.0, NULL, NULL) );
    764
    765 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/relobjtolfac",
    766 "factor for NLP relative objective tolerance",
    767 &propdata->relobjtolfac, TRUE, DEFAULT_RELOBJTOLFAC, 0.0, 1.0, NULL, NULL) );
    768
    769 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/minnonconvexfrac",
    770 "(#convex nlrows)/(#nonconvex nlrows) threshold to apply propagator",
    771 &propdata->minnonconvexfrac, TRUE, DEFAULT_MINNONCONVEXFRAC, 0.0, SCIPinfinity(scip), NULL, NULL) );
    772
    773 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/minlinearfrac",
    774 "minimum (#convex nlrows)/(#linear nlrows) threshold to apply propagator",
    775 &propdata->minlinearfrac, TRUE, DEFAULT_MINLINEARFRAC, 0.0, SCIPinfinity(scip), NULL, NULL) );
    776
    777 SCIP_CALL( SCIPaddBoolParam(scip, "propagating/" PROP_NAME "/addlprows",
    778 "should non-initial LP rows be used?",
    779 &propdata->addlprows, FALSE, DEFAULT_ADDLPROWS, NULL, NULL) );
    780
    781 SCIP_CALL( SCIPaddIntParam(scip, "propagating/" PROP_NAME "/nlpiterlimit",
    782 "iteration limit of NLP solver; 0 for no limit",
    783 &propdata->nlpiterlimit, TRUE, DEFAULT_NLPITERLIMIT, 0, INT_MAX, NULL, NULL) );
    784
    785 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/nlptimelimit",
    786 "time limit of NLP solver; 0.0 for no limit",
    787 &propdata->nlptimelimit, TRUE, DEFAULT_NLPTIMELIMIT, 0.0, SCIP_REAL_MAX, NULL, NULL) );
    788
    789 SCIP_CALL( SCIPaddIntParam(scip, "propagating/" PROP_NAME "/nlpverblevel",
    790 "verbosity level of NLP solver",
    791 &propdata->nlpverblevel, TRUE, DEFAULT_NLPVERLEVEL, 0, 5, NULL, NULL) );
    792
    793 SCIP_CALL( SCIPaddRealParam(scip, "propagating/" PROP_NAME "/itlimitfactor",
    794 "LP iteration limit for nlobbt will be this factor times total LP iterations in root node",
    795 &propdata->itlimitfactor, TRUE, DEFAULT_ITLIMITFACTOR, 0.0, SCIP_REAL_MAX, NULL, NULL) );
    796
    797 return SCIP_OKAY;
    798}
    #define NULL
    Definition: def.h:248
    #define SCIP_Longint
    Definition: def.h:141
    #define SCIP_REAL_MAX
    Definition: def.h:158
    #define SCIP_Bool
    Definition: def.h:91
    #define MIN(x, y)
    Definition: def.h:224
    #define SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define REALABS(x)
    Definition: def.h:182
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_Bool SCIPisStopped(SCIP *scip)
    Definition: scip_general.c:759
    SCIP_STAGE SCIPgetStage(SCIP *scip)
    Definition: scip_general.c:444
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    SCIP_VAR ** SCIPgetVars(SCIP *scip)
    Definition: scip_prob.c:2201
    void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
    Definition: misc.c:3095
    int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
    Definition: misc.c:3304
    SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
    Definition: misc.c:3061
    SCIP_Bool SCIPhashmapExists(SCIP_HASHMAP *hashmap, void *origin)
    Definition: misc.c:3466
    #define SCIPdebugMsg
    Definition: scip_message.h:78
    SCIP_RETCODE SCIPgenVBoundAdd(SCIP *scip, SCIP_PROP *genvboundprop, SCIP_VAR **vars, SCIP_VAR *var, SCIP_Real *coefs, int ncoefs, SCIP_Real coefcutoffbound, SCIP_Real constant, SCIP_BOUNDTYPE boundtype)
    SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:83
    SCIP_RETCODE SCIPaddRealParam(SCIP *scip, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:139
    SCIP_RETCODE SCIPgetRealParam(SCIP *scip, const char *name, SCIP_Real *value)
    Definition: scip_param.c:307
    SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: scip_param.c:57
    SCIP_RETCODE SCIPincludePropNlobbt(SCIP *scip)
    Definition: prop_nlobbt.c:737
    SCIP_Bool SCIPinDive(SCIP *scip)
    Definition: scip_lp.c:2740
    SCIP_ROW ** SCIPgetLPRows(SCIP *scip)
    Definition: scip_lp.c:611
    int SCIPgetNLPRows(SCIP *scip)
    Definition: scip_lp.c:632
    SCIP_Bool SCIPallColsInLP(SCIP *scip)
    Definition: scip_lp.c:655
    #define SCIPfreeBlockMemoryArray(scip, ptr, num)
    Definition: scip_mem.h:110
    BMS_BLKMEM * SCIPblkmem(SCIP *scip)
    Definition: scip_mem.c:57
    #define SCIPallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:124
    #define SCIPfreeBufferArray(scip, ptr)
    Definition: scip_mem.h:136
    #define SCIPallocBlockMemoryArray(scip, ptr, num)
    Definition: scip_mem.h:93
    #define SCIPfreeBlockMemory(scip, ptr)
    Definition: scip_mem.h:108
    #define SCIPallocBlockMemory(scip, ptr)
    Definition: scip_mem.h:89
    #define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
    Definition: scip_mem.h:105
    SCIP_RETCODE SCIPaddNlpiProblemRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2idx, SCIP_ROW **rows, int nrows)
    Definition: scip_nlpi.c:787
    SCIP_RETCODE SCIPupdateNlpiProblem(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM *nlpiprob, SCIP_HASHMAP *var2nlpiidx, SCIP_VAR **nlpivars, int nlpinvars, SCIP_Real cutoffbound)
    Definition: scip_nlpi.c:735
    SCIP_RETCODE SCIPcreateNlpiProblemFromNlRows(SCIP *scip, SCIP_NLPI *nlpi, SCIP_NLPIPROBLEM **nlpiprob, const char *name, SCIP_NLROW **nlrows, int nnlrows, SCIP_HASHMAP *var2idx, SCIP_HASHMAP *nlrow2idx, SCIP_Real *nlscore, SCIP_Real cutoffbound, SCIP_Bool setobj, SCIP_Bool onlyconvex)
    Definition: scip_nlpi.c:449
    int SCIPgetNNlpis(SCIP *scip)
    Definition: scip_nlpi.c:205
    SCIP_NLPI ** SCIPgetNlpis(SCIP *scip)
    Definition: scip_nlpi.c:192
    SCIP_Bool SCIPisNLPConstructed(SCIP *scip)
    Definition: scip_nlp.c:110
    int SCIPgetNNLPNlRows(SCIP *scip)
    Definition: scip_nlp.c:341
    SCIP_NLROW ** SCIPgetNLPNlRows(SCIP *scip)
    Definition: scip_nlp.c:319
    SCIP_Real SCIPnlrowGetRhs(SCIP_NLROW *nlrow)
    Definition: nlp.c:1914
    SCIP_Real SCIPnlrowGetLhs(SCIP_NLROW *nlrow)
    Definition: nlp.c:1904
    SCIP_EXPRCURV SCIPnlrowGetCurvature(SCIP_NLROW *nlrow)
    Definition: nlp.c:1924
    SCIP_EXPR * SCIPnlrowGetExpr(SCIP_NLROW *nlrow)
    Definition: nlp.c:1894
    SCIP_Longint SCIPnodeGetNumber(SCIP_NODE *node)
    Definition: tree.c:8483
    SCIP_Bool SCIPinProbing(SCIP *scip)
    Definition: scip_probing.c:98
    SCIP_PROP * SCIPfindProp(SCIP *scip, const char *name)
    Definition: scip_prop.c:333
    void SCIPpropSetData(SCIP_PROP *prop, SCIP_PROPDATA *propdata)
    Definition: prop.c:801
    SCIP_RETCODE SCIPsetPropInitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPINITSOL((*propinitsol)))
    Definition: scip_prop.c:219
    SCIP_PROPDATA * SCIPpropGetData(SCIP_PROP *prop)
    Definition: prop.c:791
    const char * SCIPpropGetName(SCIP_PROP *prop)
    Definition: prop.c:951
    SCIP_RETCODE SCIPsetPropFree(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPFREE((*propfree)))
    Definition: scip_prop.c:171
    SCIP_RETCODE SCIPsetPropCopy(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPCOPY((*propcopy)))
    Definition: scip_prop.c:155
    SCIP_RETCODE SCIPsetPropExitsol(SCIP *scip, SCIP_PROP *prop, SCIP_DECL_PROPEXITSOL((*propexitsol)))
    Definition: scip_prop.c:235
    SCIP_RETCODE SCIPincludePropBasic(SCIP *scip, SCIP_PROP **propptr, const char *name, const char *desc, int priority, int freq, SCIP_Bool delay, SCIP_PROPTIMING timingmask, SCIP_DECL_PROPEXEC((*propexec)), SCIP_PROPDATA *propdata)
    Definition: scip_prop.c:118
    SCIP_Longint SCIPgetNRootLPIterations(SCIP *scip)
    SCIP_Real SCIPgetCutoffbound(SCIP *scip)
    SCIP_Real SCIPgetSolvingTime(SCIP *scip)
    Definition: scip_timing.c:378
    SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Real SCIPfeastol(SCIP *scip)
    SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
    SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPinRepropagation(SCIP *scip)
    Definition: scip_tree.c:146
    int SCIPgetDepth(SCIP *scip)
    Definition: scip_tree.c:672
    SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
    Definition: scip_tree.c:91
    SCIP_RETCODE SCIPtightenVarLb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:6401
    SCIP_Bool SCIPvarIsImpliedIntegral(SCIP_VAR *var)
    Definition: var.c:23498
    SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24268
    SCIP_RETCODE SCIPtightenVarUb(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound, SCIP_Bool force, SCIP_Bool *infeasible, SCIP_Bool *tightened)
    Definition: scip_var.c:6651
    SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
    Definition: var.c:23453
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23267
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24234
    SCIP_Bool SCIPallowWeakDualReds(SCIP *scip)
    Definition: scip_var.c:10998
    void SCIPfreeRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen)
    SCIP_Real SCIPrandomGetReal(SCIP_RANDNUMGEN *randnumgen, SCIP_Real minrandval, SCIP_Real maxrandval)
    Definition: misc.c:10245
    SCIP_RETCODE SCIPcreateRandom(SCIP *scip, SCIP_RANDNUMGEN **randnumgen, unsigned int initialseed, SCIP_Bool useglobalseed)
    void SCIPsortDownRealIntPtr(SCIP_Real *realarray, int *intarray, void **ptrarray, int len)
    memory allocation routines
    #define BMSclearMemory(ptr)
    Definition: memory.h:129
    generalized variable bounds propagator
    #define PROP_DESC
    Definition: prop_nlobbt.c:62
    #define DEFAULT_FEASTOLFAC
    Definition: prop_nlobbt.c:70
    #define DEFAULT_NLPVERLEVEL
    Definition: prop_nlobbt.c:77
    #define DEFAULT_NLPTIMELIMIT
    Definition: prop_nlobbt.c:76
    static SCIP_RETCODE applyNlobbt(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_RESULT *result)
    Definition: prop_nlobbt.c:473
    #define PROP_NAME
    Definition: prop_nlobbt.c:61
    static SCIP_DECL_PROPEXITSOL(propExitsolNlobbt)
    Definition: prop_nlobbt.c:673
    #define DEFAULT_NLPITERLIMIT
    Definition: prop_nlobbt.c:75
    static SCIP_RETCODE filterCands(SCIP *scip, SCIP_PROPDATA *propdata)
    Definition: prop_nlobbt.c:210
    static SCIP_DECL_PROPFREE(propFreeNlobbt)
    Definition: prop_nlobbt.c:635
    #define DEFAULT_ADDLPROWS
    Definition: prop_nlobbt.c:72
    #define SOLVEDUB
    Definition: prop_nlobbt.c:87
    #define DEFAULT_ITLIMITFACTOR
    Definition: prop_nlobbt.c:73
    static SCIP_RETCODE addGenVBound(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, SCIP_Real cutoffbound)
    Definition: prop_nlobbt.c:268
    static SCIP_DECL_PROPCOPY(propCopyNlobbt)
    Definition: prop_nlobbt.c:621
    #define DEFAULT_RELOBJTOLFAC
    Definition: prop_nlobbt.c:71
    #define PROP_DELAY
    Definition: prop_nlobbt.c:65
    #define DEFAULT_MINNONCONVEXFRAC
    Definition: prop_nlobbt.c:68
    static SCIP_Bool isNlobbtApplicable(SCIP *scip, SCIP_PROPDATA *propdata)
    Definition: prop_nlobbt.c:155
    #define UNSOLVED
    Definition: prop_nlobbt.c:85
    #define PROP_TIMING
    Definition: prop_nlobbt.c:66
    static SCIP_RETCODE solveNlp(SCIP *scip, SCIP_PROPDATA *propdata, SCIP_VAR *var, int varidx, SCIP_BOUNDTYPE boundtype, SCIP_NLPPARAM *nlpparam, int *nlpiter, SCIP_RESULT *result)
    Definition: prop_nlobbt.c:345
    static SCIP_DECL_PROPINITSOL(propInitsolNlobbt)
    Definition: prop_nlobbt.c:651
    #define DEFAULT_MINLINEARFRAC
    Definition: prop_nlobbt.c:69
    #define SOLVEDLB
    Definition: prop_nlobbt.c:86
    static SCIP_DECL_PROPEXEC(propExecNlobbt)
    Definition: prop_nlobbt.c:689
    #define DEFAULT_RANDSEED
    Definition: prop_nlobbt.c:78
    static SCIP_RETCODE propdataClear(SCIP *scip, SCIP_PROPDATA *propdata)
    Definition: prop_nlobbt.c:125
    #define PROP_FREQ
    Definition: prop_nlobbt.c:64
    #define PROP_PRIORITY
    Definition: prop_nlobbt.c:63
    nonlinear OBBT propagator
    public methods for message output
    public data structures and miscellaneous methods
    methods for sorting joint arrays of various types
    public methods for NLP management
    public methods for propagators
    public methods for branch and bound tree
    public methods for problem variables
    general public methods
    public methods for the LP relaxation, rows and columns
    public methods for memory management
    public methods for message handling
    public methods for nonlinear relaxation
    public methods for NLPI solver interfaces
    public methods for numerical tolerances
    public methods for SCIP parameter handling
    public methods for global and local (sub)problems
    public methods for the probing mode
    public methods for propagator plugins
    public methods for random numbers
    public methods for querying solving statistics
    public methods for timing
    public methods for the branch-and-bound tree
    public methods for SCIP variables
    SCIP_Real timelimit
    Definition: type_nlpi.h:72
    SCIP_Real feastol
    Definition: type_nlpi.h:69
    SCIP_Real opttol
    Definition: type_nlpi.h:70
    unsigned short verblevel
    Definition: type_nlpi.h:74
    @ SCIP_EXPRCURV_CONVEX
    Definition: type_expr.h:63
    @ SCIP_EXPRCURV_CONCAVE
    Definition: type_expr.h:64
    @ SCIP_BOUNDTYPE_UPPER
    Definition: type_lp.h:58
    @ SCIP_BOUNDTYPE_LOWER
    Definition: type_lp.h:57
    enum SCIP_BoundType SCIP_BOUNDTYPE
    Definition: type_lp.h:60
    #define SCIP_NLPPARAM_DEFAULT(scip)
    Definition: type_nlpi.h:126
    @ SCIP_NLPSOLSTAT_FEASIBLE
    Definition: type_nlpi.h:162
    @ SCIP_NLPSOLSTAT_LOCOPT
    Definition: type_nlpi.h:161
    struct SCIP_PropData SCIP_PROPDATA
    Definition: type_prop.h:52
    @ SCIP_DIDNOTRUN
    Definition: type_result.h:42
    @ SCIP_CUTOFF
    Definition: type_result.h:48
    @ SCIP_REDUCEDDOM
    Definition: type_result.h:51
    @ SCIP_DIDNOTFIND
    Definition: type_result.h:44
    enum SCIP_Result SCIP_RESULT
    Definition: type_result.h:61
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_STAGE_SOLVING
    Definition: type_set.h:53
    @ SCIP_VARTYPE_BINARY
    Definition: type_var.h:64