Scippy

    SCIP

    Solving Constraint Integer Programs

    conflict_general.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 conflict_general.c
    26 * @ingroup OTHER_CFILES
    27 * @brief methods and datastructures for conflict analysis
    28 * @author Tobias Achterberg
    29 * @author Timo Berthold
    30 * @author Stefan Heinz
    31 * @author Marc Pfetsch
    32 * @author Michael Winkler
    33 * @author Jakob Witzig
    34 * @author Sander Borst
    35 *
    36 * SCIP contains two kinds of conflict analysis:
    37 * - In graph based conflict analysis, the graph consisting of derived
    38 * is analysed. Code and documentation is available in conflict_graphanalysis.h
    39 * - In dual proof analysis, an infeasible LP relaxation is analysed.
    40 * Using the dual solution, a valid constraint is derived that is violated
    41 * by all values in the domain. This constraint is added to the problem
    42 * and can then be used for domain propagation.
    43 * Code is available in conflict_dualproofanalysis.h
    44 * This file contains the methods that are shared by both kinds of conflict analysis.
    45 */
    46
    47/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    48#include "lpi/lpi.h"
    49#include "scip/clock.h"
    50#include "scip/conflict.h"
    51#include "scip/conflictstore.h"
    52#include "scip/certificate.h"
    53#include "scip/cons.h"
    54#include "scip/cons_linear.h"
    55#include "scip/cuts.h"
    56#include "scip/history.h"
    57#include "scip/lp.h"
    58#include "scip/lpexact.h"
    59#include "scip/presolve.h"
    60#include "scip/prob.h"
    61#include "scip/prop.h"
    62#include "scip/pub_conflict.h"
    63#include "scip/pub_cons.h"
    64#include "scip/pub_lp.h"
    65#include "scip/pub_message.h"
    66#include "scip/pub_misc.h"
    67#include "scip/pub_misc_sort.h"
    68#include "scip/pub_paramset.h"
    69#include "scip/pub_prop.h"
    70#include "scip/pub_tree.h"
    71#include "scip/pub_var.h"
    73#include "scip/scip_conflict.h"
    74#include "scip/scip_cons.h"
    75#include "scip/scip_exact.h"
    76#include "scip/scip_mem.h"
    77#include "scip/scip_numerics.h"
    78#include "scip/scip_sol.h"
    79#include "scip/scip_var.h"
    80#include "scip/scip_prob.h"
    81#include "scip/scip_lp.h"
    82#include "scip/scip_lpexact.h"
    84#include "scip/set.h"
    85#include "scip/sol.h"
    87#include "scip/struct_lp.h"
    88#include "scip/struct_prob.h"
    89#include "scip/struct_scip.h"
    90#include "scip/struct_set.h"
    92#include "scip/struct_stat.h"
    93#include "scip/struct_tree.h"
    94#include "scip/struct_lpexact.h"
    95#include "scip/struct_var.h"
    96#include "scip/tree.h"
    97#include "scip/cuts.h"
    98#include "scip/var.h"
    99#include "scip/visual.h"
    100#include <string.h>
    101#ifndef _WIN32
    102#include <strings.h> /*lint --e{766}*/
    103#endif
    104
    105/* because calculations might cancel out some values, we stop the infeasibility analysis if a value is bigger than
    106 * 2^53 = 9007199254740992
    107 */
    108#define NUMSTOP 9007199254740992.0
    109/* because row violations might be magnified, we stop the infeasibility analysis if a dual weight is bigger than
    110 * 10^7 = 10000000
    111 */
    112#define SOLSTOP 10000000.0
    113
    114/** return TRUE if conflict analysis is applicable; In case the function returns FALSE there is no need to initialize the
    115 * conflict analysis since it will not be applied
    116 */
    118 SCIP_SET* set /**< global SCIP settings */
    119 )
    120{
    121 assert(set != NULL);
    122 /* check, if resolution or propagation conflict analysis is enabled */
    123 if( !set->conf_enable || !( set->conf_useprop || set->conf_usegenres ) )
    124 return FALSE;
    125
    126 return TRUE;
    127}
    128
    129/** returns the current number of conflict sets in the conflict set storage */
    131 SCIP_CONFLICT* conflict /**< conflict analysis data */
    132 )
    133{
    134 assert(conflict != NULL);
    135
    136 return conflict->nconflictsets;
    137}
    138
    139/** returns the total number of conflict constraints that were added to the problem */
    141 SCIP_CONFLICT* conflict /**< conflict analysis data */
    142 )
    143{
    144 assert(conflict != NULL);
    145
    146 return conflict->nappliedglbconss + conflict->nappliedlocconss;
    147}
    148
    149/** returns the total number of resolution conflict constraints that were added to the problem */
    151 SCIP_CONFLICT* conflict /**< conflict analysis data */
    152 )
    153{
    154 assert(conflict != NULL);
    155
    156 return conflict->nappliedglbresconss;
    157}
    158
    159/** returns the total number of literals in conflict constraints that were added to the problem */
    161 SCIP_CONFLICT* conflict /**< conflict analysis data */
    162 )
    163{
    164 assert(conflict != NULL);
    165
    166 return conflict->nappliedglbliterals + conflict->nappliedlocliterals;
    167}
    168
    169/** returns the total number of global bound changes applied by the conflict analysis */
    171 SCIP_CONFLICT* conflict /**< conflict analysis data */
    172 )
    173{
    174 assert(conflict != NULL);
    175
    176 return conflict->nglbchgbds;
    177}
    178
    179/** returns the total number of conflict constraints that were added globally to the problem */
    181 SCIP_CONFLICT* conflict /**< conflict analysis data */
    182 )
    183{
    184 assert(conflict != NULL);
    185
    186 return conflict->nappliedglbconss;
    187}
    188
    189/** returns the total number of literals in conflict constraints that were added globally to the problem */
    191 SCIP_CONFLICT* conflict /**< conflict analysis data */
    192 )
    193{
    194 assert(conflict != NULL);
    195
    196 return conflict->nappliedglbliterals;
    197}
    198
    199/** returns the total number of local bound changes applied by the conflict analysis */
    201 SCIP_CONFLICT* conflict /**< conflict analysis data */
    202 )
    203{
    204 assert(conflict != NULL);
    205
    206 return conflict->nlocchgbds;
    207}
    208
    209/** returns the total number of conflict constraints that were added locally to the problem */
    211 SCIP_CONFLICT* conflict /**< conflict analysis data */
    212 )
    213{
    214 assert(conflict != NULL);
    215
    216 return conflict->nappliedlocconss;
    217}
    218
    219/** returns the total number of literals in conflict constraints that were added locally to the problem */
    221 SCIP_CONFLICT* conflict /**< conflict analysis data */
    222 )
    223{
    224 assert(conflict != NULL);
    225
    226 return conflict->nappliedlocliterals;
    227}
    228
    229/** compares two conflict set entries, such that bound changes inferred later are
    230 * ordered prior to ones that were inferred earlier
    231 */
    232static
    233SCIP_DECL_SORTPTRCOMP(conflictBdchginfoComp)
    234{ /*lint --e{715}*/
    235 SCIP_BDCHGINFO* bdchginfo1;
    236 SCIP_BDCHGINFO* bdchginfo2;
    237
    238 bdchginfo1 = (SCIP_BDCHGINFO*)elem1;
    239 bdchginfo2 = (SCIP_BDCHGINFO*)elem2;
    240 assert(bdchginfo1 != NULL);
    241 assert(bdchginfo2 != NULL);
    242 assert(!SCIPbdchginfoIsRedundant(bdchginfo1));
    243 assert(!SCIPbdchginfoIsRedundant(bdchginfo2));
    244
    245 if( bdchginfo1 == bdchginfo2 )
    246 return 0;
    247
    249 return -1;
    250 else
    251 return +1;
    252}
    253
    254/** enables or disables all clocks of \p conflict, depending on the value of the flag */
    256 SCIP_CONFLICT* conflict, /**< the conflict analysis data for which all clocks should be enabled or disabled */
    257 SCIP_Bool enable /**< should the clocks of the conflict analysis data be enabled? */
    258 )
    259{
    260 assert(conflict != NULL);
    261
    263 SCIPclockEnableOrDisable(conflict->dIBclock, enable);
    265 SCIPclockEnableOrDisable(conflict->propanalyzetime, enable);
    266 SCIPclockEnableOrDisable(conflict->resanalyzetime, enable);
    268 SCIPclockEnableOrDisable(conflict->sbanalyzetime, enable);
    269}
    270
    271/** creates conflict analysis data for propagation conflicts */
    273 SCIP_CONFLICT** conflict, /**< pointer to conflict analysis data */
    274 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    275 SCIP_SET* set /**< global SCIP settings */
    276 )
    277{
    278 assert(conflict != NULL);
    279
    280 SCIP_ALLOC( BMSallocMemory(conflict) );
    281
    282 SCIP_CALL( SCIPclockCreate(&(*conflict)->dIBclock, SCIP_CLOCKTYPE_DEFAULT) );
    283 SCIP_CALL( SCIPclockCreate(&(*conflict)->propanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    284 SCIP_CALL( SCIPclockCreate(&(*conflict)->resanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    285 SCIP_CALL( SCIPclockCreate(&(*conflict)->inflpanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    286 SCIP_CALL( SCIPclockCreate(&(*conflict)->boundlpanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    287 SCIP_CALL( SCIPclockCreate(&(*conflict)->sbanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    288 SCIP_CALL( SCIPclockCreate(&(*conflict)->pseudoanalyzetime, SCIP_CLOCKTYPE_DEFAULT) );
    289
    290 /* enable or disable timing depending on the parameter statistic timing */
    291 SCIPconflictEnableOrDisableClocks((*conflict), set->time_statistictiming);
    292
    293 SCIP_CALL( SCIPpqueueCreate(&(*conflict)->bdchgqueue, set->mem_arraygrowinit, set->mem_arraygrowfac,
    294 conflictBdchginfoComp, NULL) );
    295 SCIP_CALL( SCIPpqueueCreate(&(*conflict)->forcedbdchgqueue, set->mem_arraygrowinit, set->mem_arraygrowfac,
    296 conflictBdchginfoComp, NULL) );
    297 SCIP_CALL( SCIPpqueueCreate(&(*conflict)->resbdchgqueue, set->mem_arraygrowinit, set->mem_arraygrowfac,
    298 conflictBdchginfoComp, NULL) );
    299 SCIP_CALL( SCIPpqueueCreate(&(*conflict)->continuousbdchgqueue, set->mem_arraygrowinit, set->mem_arraygrowfac,
    300 conflictBdchginfoComp, NULL) );
    301 SCIP_CALL( SCIPconflictsetCreate(&(*conflict)->conflictset, blkmem) );
    302 (*conflict)->conflictsets = NULL;
    303 (*conflict)->conflictsetscores = NULL;
    304 (*conflict)->conflictvarslbs = NULL;
    305 (*conflict)->conflictvarsubs = NULL;
    306 (*conflict)->tmpbdchginfos = NULL;
    307 (*conflict)->conflictprobnvars = 0;
    308 (*conflict)->conflictsetssize = 0;
    309 (*conflict)->nconflictsets = 0;
    310 (*conflict)->conflictrows = NULL;
    311 (*conflict)->nconflictrows = 0;
    312 (*conflict)->proofsets = NULL;
    313 (*conflict)->proofsetssize = 0;
    314 (*conflict)->nproofsets = 0;
    315 (*conflict)->tmpbdchginfossize = 0;
    316 (*conflict)->ntmpbdchginfos = 0;
    317 (*conflict)->count = 0;
    318 (*conflict)->nglbchgbds = 0;
    319 (*conflict)->nappliedglbconss = 0;
    320 (*conflict)->nappliedglbresconss = 0;
    321 (*conflict)->nappliedglbliterals = 0;
    322 (*conflict)->nlocchgbds = 0;
    323 (*conflict)->nappliedlocconss = 0;
    324 (*conflict)->nappliedlocliterals = 0;
    325 (*conflict)->npropcalls = 0;
    326 (*conflict)->npropsuccess = 0;
    327 (*conflict)->npropconfconss = 0;
    328 (*conflict)->npropconfliterals = 0;
    329 (*conflict)->npropreconvconss = 0;
    330 (*conflict)->npropreconvliterals = 0;
    331 (*conflict)->ninflpcalls = 0;
    332 (*conflict)->ninflpsuccess = 0;
    333 (*conflict)->ninflpconfconss = 0;
    334 (*conflict)->ninflpconfliterals = 0;
    335 (*conflict)->ninflpreconvconss = 0;
    336 (*conflict)->ninflpreconvliterals = 0;
    337 (*conflict)->ninflpiterations = 0;
    338 (*conflict)->nboundlpcalls = 0;
    339 (*conflict)->nboundlpsuccess = 0;
    340 (*conflict)->nboundlpconfconss = 0;
    341 (*conflict)->nboundlpconfliterals = 0;
    342 (*conflict)->nboundlpreconvconss = 0;
    343 (*conflict)->nboundlpreconvliterals = 0;
    344 (*conflict)->nboundlpiterations = 0;
    345 (*conflict)->nsbcalls = 0;
    346 (*conflict)->nsbsuccess = 0;
    347 (*conflict)->nsbconfconss = 0;
    348 (*conflict)->nsbconfliterals = 0;
    349 (*conflict)->nsbreconvconss = 0;
    350 (*conflict)->nsbreconvliterals = 0;
    351 (*conflict)->nsbiterations = 0;
    352 (*conflict)->npseudocalls = 0;
    353 (*conflict)->npseudosuccess = 0;
    354 (*conflict)->npseudoconfconss = 0;
    355 (*conflict)->npseudoconfliterals = 0;
    356 (*conflict)->npseudoreconvconss = 0;
    357 (*conflict)->npseudoreconvliterals = 0;
    358 (*conflict)->ndualproofsinfglobal = 0;
    359 (*conflict)->ndualproofsinflocal = 0;
    360 (*conflict)->ndualproofsinfsuccess = 0;
    361 (*conflict)->dualproofsinfnnonzeros = 0;
    362 (*conflict)->ndualproofsbndglobal = 0;
    363 (*conflict)->ndualproofsbndlocal = 0;
    364 (*conflict)->ndualproofsbndsuccess = 0;
    365 (*conflict)->dualproofsbndnnonzeros = 0;
    366 (*conflict)->nrescalls = 0;
    367 (*conflict)->nressuccess = 0;
    368 (*conflict)->nreslargecoefs = 0;
    369 (*conflict)->nreslongconfs = 0;
    370 (*conflict)->nresconfconss = 0;
    371 (*conflict)->nresconfvariables = 0;
    372 (*conflict)->conflictrowssize = 0;
    373 (*conflict)->bdchgonlyresqueue = FALSE;
    374 (*conflict)->bdchgonlyconfqueue = FALSE;
    375
    376 SCIP_CALL( SCIPconflictInitRows((*conflict), blkmem) );
    377
    378 SCIP_CALL( SCIPconflictInitProofset((*conflict), blkmem) );
    379
    380 return SCIP_OKAY;
    381}
    382
    383/** frees conflict analysis data for propagation conflicts */
    385 SCIP_CONFLICT** conflict, /**< pointer to conflict analysis data */
    386 BMS_BLKMEM* blkmem /**< block memory of transformed problem */
    387 )
    388{
    389 assert(conflict != NULL);
    390 assert(*conflict != NULL);
    391 assert((*conflict)->nconflictsets == 0);
    392 assert((*conflict)->ntmpbdchginfos == 0);
    393
    394#if defined(SCIP_CONFGRAPH) || defined(SCIP_CONFGRAPH_DOT)
    395 confgraphFree();
    396#endif
    397
    398 SCIPclockFree(&(*conflict)->dIBclock);
    399 SCIPclockFree(&(*conflict)->propanalyzetime);
    400 SCIPclockFree(&(*conflict)->resanalyzetime);
    401 SCIPclockFree(&(*conflict)->inflpanalyzetime);
    402 SCIPclockFree(&(*conflict)->boundlpanalyzetime);
    403 SCIPclockFree(&(*conflict)->sbanalyzetime);
    404 SCIPclockFree(&(*conflict)->pseudoanalyzetime);
    405 SCIPpqueueFree(&(*conflict)->bdchgqueue);
    406 SCIPpqueueFree(&(*conflict)->forcedbdchgqueue);
    407 SCIPpqueueFree(&(*conflict)->resbdchgqueue);
    408 SCIPpqueueFree(&(*conflict)->continuousbdchgqueue);
    409 SCIPconflictsetFree(&(*conflict)->conflictset, blkmem);
    410 SCIPconflictRowFree(&(*conflict)->conflictrow, blkmem);
    411 SCIPconflictRowFree(&(*conflict)->resolvedconflictrow, blkmem);
    412 SCIPconflictRowFree(&(*conflict)->reasonrow, blkmem);
    413 SCIPconflictRowFree(&(*conflict)->reducedreasonrow, blkmem);
    414 SCIPproofsetFree(&(*conflict)->proofset, blkmem);
    415
    416 BMSfreeMemoryArrayNull(&(*conflict)->conflictsets);
    417 BMSfreeMemoryArrayNull(&(*conflict)->conflictsetscores);
    418 BMSfreeMemoryArrayNull(&(*conflict)->conflictvarslbs);
    419 BMSfreeMemoryArrayNull(&(*conflict)->conflictvarsubs);
    420 BMSfreeMemoryArrayNull(&(*conflict)->proofsets);
    421 BMSfreeMemoryArrayNull(&(*conflict)->conflictrows);
    422 BMSfreeMemoryArrayNull(&(*conflict)->tmpbdchginfos);
    423 BMSfreeMemory(conflict);
    424
    425 return SCIP_OKAY;
    426}
    427
    428/** clears conflict analysis bound changes queues for propagation conflicts */
    430 SCIP_CONFLICT* conflict /**< pointer to conflict analysis data */
    431 )
    432{
    433 assert(conflict != NULL);
    434
    435 SCIPpqueueClear(conflict->bdchgqueue);
    437
    438 return SCIP_OKAY;
    439}
    440
    441/** returns the conflict lower bound if the variable is present in the current conflict set; otherwise the global lower
    442 * bound
    443 */
    445 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    446 SCIP_VAR* var /**< problem variable */
    447 )
    448{
    449 if( var->conflictlbcount == conflict->count )
    450 {
    451 assert(EPSGE(var->conflictlb, var->conflictrelaxedlb, 1e-09));
    452 return var->conflictrelaxedlb;
    453 }
    454
    455 return SCIPvarGetLbGlobal(var);
    456}
    457
    458/** returns the conflict upper bound if the variable is present in the current conflict set; otherwise the global upper
    459 * bound
    460 */
    462 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    463 SCIP_VAR* var /**< problem variable */
    464 )
    465{
    466 if( var->conflictubcount == conflict->count )
    467 {
    468 assert(EPSLE(var->conflictub, var->conflictrelaxedub, 1e-09));
    469 return var->conflictrelaxedub;
    470 }
    471
    472 return SCIPvarGetUbGlobal(var);
    473}
    474
    475/** gets time in seconds used for preprocessing global conflict constraint before appliance */
    477 SCIP_CONFLICT* conflict /**< conflict analysis data */
    478 )
    479{
    480 assert(conflict != NULL);
    481
    482 return SCIPclockGetTime(conflict->dIBclock);
    483}
    484
    485/** gets time in seconds used for analyzing propagation conflicts */
    487 SCIP_CONFLICT* conflict /**< conflict analysis data */
    488 )
    489{
    490 assert(conflict != NULL);
    491
    492 return SCIPclockGetTime(conflict->propanalyzetime);
    493}
    494
    495/** gets time in seconds used for analyzing propagation conflicts with generalized resolution */
    497 SCIP_CONFLICT* conflict /**< conflict analysis data */
    498 )
    499{
    500 assert(conflict != NULL);
    501
    502 return SCIPclockGetTime(conflict->resanalyzetime);
    503}
    504
    505/** gets number of calls to propagation conflict analysis */
    507 SCIP_CONFLICT* conflict /**< conflict analysis data */
    508 )
    509{
    510 assert(conflict != NULL);
    511
    512 return conflict->npropcalls;
    513}
    514
    515/** gets number of calls to propagation conflict analysis that yield at least one conflict constraint */
    517 SCIP_CONFLICT* conflict /**< conflict analysis data */
    518 )
    519{
    520 assert(conflict != NULL);
    521
    522 return conflict->npropsuccess;
    523}
    524
    525/** gets number of conflict constraints detected in propagation conflict analysis */
    527 SCIP_CONFLICT* conflict /**< conflict analysis data */
    528 )
    529{
    530 assert(conflict != NULL);
    531
    532 return conflict->npropconfconss;
    533}
    534
    535/** gets total number of literals in conflict constraints created in propagation conflict analysis */
    537 SCIP_CONFLICT* conflict /**< conflict analysis data */
    538 )
    539{
    540 assert(conflict != NULL);
    541
    542 return conflict->npropconfliterals;
    543}
    544
    545/** returns total number of variables in resolution conflict constraints created in propagation conflict analysis */
    547 SCIP_CONFLICT* conflict /**< conflict analysis data */
    548 )
    549{
    550 assert(conflict != NULL);
    551
    552 return conflict->nresconfvariables;
    553}
    554
    555/** gets number of reconvergence constraints detected in propagation conflict analysis */
    557 SCIP_CONFLICT* conflict /**< conflict analysis data */
    558 )
    559{
    560 assert(conflict != NULL);
    561
    562 return conflict->npropreconvconss;
    563}
    564
    565/** gets total number of literals in reconvergence constraints created in propagation conflict analysis */
    567 SCIP_CONFLICT* conflict /**< conflict analysis data */
    568 )
    569{
    570 assert(conflict != NULL);
    571
    572 return conflict->npropreconvliterals;
    573}
    574
    575/** gets time in seconds used for analyzing infeasible LP conflicts */
    577 SCIP_CONFLICT* conflict /**< conflict analysis data */
    578 )
    579{
    580 assert(conflict != NULL);
    581
    582 return SCIPclockGetTime(conflict->inflpanalyzetime);
    583}
    584
    585/** gets number of calls to infeasible LP conflict analysis */
    587 SCIP_CONFLICT* conflict /**< conflict analysis data */
    588 )
    589{
    590 assert(conflict != NULL);
    591
    592 return conflict->ninflpcalls;
    593}
    594
    595/** gets number of calls to infeasible LP conflict analysis that yield at least one conflict constraint */
    597 SCIP_CONFLICT* conflict /**< conflict analysis data */
    598 )
    599{
    600 assert(conflict != NULL);
    601
    602 return conflict->ninflpsuccess;
    603}
    604
    605/** gets number of conflict constraints detected in infeasible LP conflict analysis */
    607 SCIP_CONFLICT* conflict /**< conflict analysis data */
    608 )
    609{
    610 assert(conflict != NULL);
    611
    612 return conflict->ninflpconfconss;
    613}
    614
    615/** gets total number of literals in conflict constraints created in infeasible LP conflict analysis */
    617 SCIP_CONFLICT* conflict /**< conflict analysis data */
    618 )
    619{
    620 assert(conflict != NULL);
    621
    622 return conflict->ninflpconfliterals;
    623}
    624
    625/** gets number of reconvergence constraints detected in infeasible LP conflict analysis */
    627 SCIP_CONFLICT* conflict /**< conflict analysis data */
    628 )
    629{
    630 assert(conflict != NULL);
    631
    632 return conflict->ninflpreconvconss;
    633}
    634
    635/** gets total number of literals in reconvergence constraints created in infeasible LP conflict analysis */
    637 SCIP_CONFLICT* conflict /**< conflict analysis data */
    638 )
    639{
    640 assert(conflict != NULL);
    641
    642 return conflict->ninflpreconvliterals;
    643}
    644
    645/** gets number of LP iterations in infeasible LP conflict analysis */
    647 SCIP_CONFLICT* conflict /**< conflict analysis data */
    648 )
    649{
    650 assert(conflict != NULL);
    651
    652 return conflict->ninflpiterations;
    653}
    654
    655/** gets time in seconds used for analyzing bound exceeding LP conflicts */
    657 SCIP_CONFLICT* conflict /**< conflict analysis data */
    658 )
    659{
    660 assert(conflict != NULL);
    661
    662 return SCIPclockGetTime(conflict->boundlpanalyzetime);
    663}
    664
    665/** gets number of calls to bound exceeding LP conflict analysis */
    667 SCIP_CONFLICT* conflict /**< conflict analysis data */
    668 )
    669{
    670 assert(conflict != NULL);
    671
    672 return conflict->nboundlpcalls;
    673}
    674
    675/** gets number of calls to bound exceeding LP conflict analysis that yield at least one conflict constraint */
    677 SCIP_CONFLICT* conflict /**< conflict analysis data */
    678 )
    679{
    680 assert(conflict != NULL);
    681
    682 return conflict->nboundlpsuccess;
    683}
    684
    685/** gets number of conflict constraints detected in bound exceeding LP conflict analysis */
    687 SCIP_CONFLICT* conflict /**< conflict analysis data */
    688 )
    689{
    690 assert(conflict != NULL);
    691
    692 return conflict->nboundlpconfconss;
    693}
    694
    695/** gets total number of literals in conflict constraints created in bound exceeding LP conflict analysis */
    697 SCIP_CONFLICT* conflict /**< conflict analysis data */
    698 )
    699{
    700 assert(conflict != NULL);
    701
    702 return conflict->nboundlpconfliterals;
    703}
    704
    705/** gets number of reconvergence constraints detected in bound exceeding LP conflict analysis */
    707 SCIP_CONFLICT* conflict /**< conflict analysis data */
    708 )
    709{
    710 assert(conflict != NULL);
    711
    712 return conflict->nboundlpreconvconss;
    713}
    714
    715/** gets total number of literals in reconvergence constraints created in bound exceeding LP conflict analysis */
    717 SCIP_CONFLICT* conflict /**< conflict analysis data */
    718 )
    719{
    720 assert(conflict != NULL);
    721
    722 return conflict->nboundlpreconvliterals;
    723}
    724
    725/** gets number of LP iterations in bound exceeding LP conflict analysis */
    727 SCIP_CONFLICT* conflict /**< conflict analysis data */
    728 )
    729{
    730 assert(conflict != NULL);
    731
    732 return conflict->nboundlpiterations;
    733}
    734
    735/** gets time in seconds used for analyzing infeasible strong branching conflicts */
    737 SCIP_CONFLICT* conflict /**< conflict analysis data */
    738 )
    739{
    740 assert(conflict != NULL);
    741
    742 return SCIPclockGetTime(conflict->sbanalyzetime);
    743}
    744
    745/** gets number of successful calls to dual proof analysis derived from infeasible LPs */
    747 SCIP_CONFLICT* conflict /**< conflict analysis data */
    748 )
    749{
    750 assert(conflict != NULL);
    751
    752 return conflict->ndualproofsinfsuccess;
    753}
    754
    755/** gets number of globally valid dual proof constraints derived from infeasible LPs */
    757 SCIP_CONFLICT* conflict /**< conflict analysis data */
    758 )
    759{
    760 assert(conflict != NULL);
    761
    762 return conflict->ndualproofsinfglobal;
    763}
    764
    765/** gets number of locally valid dual proof constraints derived from infeasible LPs */
    767 SCIP_CONFLICT* conflict /**< conflict analysis data */
    768 )
    769{
    770 assert(conflict != NULL);
    771
    772 return conflict->ndualproofsinflocal;
    773}
    774
    775/** gets average length of dual proof constraints derived from infeasible LPs */
    777 SCIP_CONFLICT* conflict /**< conflict analysis data */
    778 )
    779{
    780 assert(conflict != NULL);
    781
    782 return conflict->dualproofsinfnnonzeros;
    783}
    784
    785/** gets number of successfully analyzed dual proofs derived from bound exceeding LPs */
    787 SCIP_CONFLICT* conflict /**< conflict analysis data */
    788 )
    789{
    790 assert(conflict != NULL);
    791
    792 return conflict->ndualproofsbndsuccess;
    793}
    794
    795/** gets number of globally applied dual proofs derived from bound exceeding LPs */
    797 SCIP_CONFLICT* conflict /**< conflict analysis data */
    798 )
    799{
    800 assert(conflict != NULL);
    801
    802 return conflict->ndualproofsbndglobal;
    803}
    804
    805/** gets number of locally applied dual proofs derived from bound exceeding LPs */
    807 SCIP_CONFLICT* conflict /**< conflict analysis data */
    808 )
    809{
    810 assert(conflict != NULL);
    811
    812 return conflict->ndualproofsbndlocal;
    813}
    814
    815/** gets average length of dual proofs derived from bound exceeding LPs */
    817 SCIP_CONFLICT* conflict /**< conflict analysis data */
    818 )
    819{
    820 assert(conflict != NULL);
    821
    822 return conflict->dualproofsbndnnonzeros;
    823}
    824
    825/** gets number of calls to infeasible strong branching conflict analysis */
    827 SCIP_CONFLICT* conflict /**< conflict analysis data */
    828 )
    829{
    830 assert(conflict != NULL);
    831
    832 return conflict->nsbcalls;
    833}
    834
    835/** gets number of calls to infeasible strong branching conflict analysis that yield at least one conflict constraint */
    837 SCIP_CONFLICT* conflict /**< conflict analysis data */
    838 )
    839{
    840 assert(conflict != NULL);
    841
    842 return conflict->nsbsuccess;
    843}
    844
    845/** gets number of conflict constraints detected in infeasible strong branching conflict analysis */
    847 SCIP_CONFLICT* conflict /**< conflict analysis data */
    848 )
    849{
    850 assert(conflict != NULL);
    851
    852 return conflict->nsbconfconss;
    853}
    854
    855/** gets total number of literals in conflict constraints created in infeasible strong branching conflict analysis */
    857 SCIP_CONFLICT* conflict /**< conflict analysis data */
    858 )
    859{
    860 assert(conflict != NULL);
    861
    862 return conflict->nsbconfliterals;
    863}
    864
    865/** gets number of reconvergence constraints detected in infeasible strong branching conflict analysis */
    867 SCIP_CONFLICT* conflict /**< conflict analysis data */
    868 )
    869{
    870 assert(conflict != NULL);
    871
    872 return conflict->nsbreconvconss;
    873}
    874
    875/** gets total number of literals in reconvergence constraints created in infeasible strong branching conflict analysis */
    877 SCIP_CONFLICT* conflict /**< conflict analysis data */
    878 )
    879{
    880 assert(conflict != NULL);
    881
    882 return conflict->nsbreconvliterals;
    883}
    884
    885/** gets number of LP iterations in infeasible strong branching conflict analysis */
    887 SCIP_CONFLICT* conflict /**< conflict analysis data */
    888 )
    889{
    890 assert(conflict != NULL);
    891
    892 return conflict->nsbiterations;
    893}
    894
    895/** adds a weighted LP row to an aggregation row */
    896static
    898 SCIP_SET* set, /**< global SCIP settings */
    899 SCIP_ROW* row, /**< LP row */
    900 SCIP_Real weight, /**< weight for scaling */
    901 SCIP_AGGRROW* aggrrow, /**< aggregation row */
    902 SCIP_Bool safely, /**< should the addition be performed safely? */
    903 SCIP_Bool* success /**< was adding the row successful? */
    904 )
    905{
    906 SCIP_Bool negated;
    907
    908 assert(set != NULL);
    909 assert(row != NULL);
    910 assert(weight != 0.0);
    911 assert(safely == set->exact_enable);
    912 assert(success != NULL);
    913
    914 /* add minimal value to dual row's left hand side: y_i < 0 -> lhs, y_i > 0 -> rhs */
    915 negated = weight < 0.0;
    916
    917 assert(!negated || !SCIPsetIsInfinity(set, -row->lhs));
    918 assert(negated || !SCIPsetIsInfinity(set, row->rhs));
    919
    920 if( !safely )
    921 {
    922 *success = TRUE;
    923 SCIP_CALL( SCIPaggrRowAddRow(set->scip, aggrrow, row, weight, negated ? -1 : 1) );
    924 }
    925 else
    926 {
    927 *success = FALSE;
    928 SCIP_CALL( SCIPaggrRowAddRowSafely(set->scip, aggrrow, row, weight, negated ? -1 : 1, success) );
    929 }
    930
    931 SCIPsetDebugMsg(set, " -> add %s row <%s>[%g,%g](lp depth: %d): dual=%g -> dualrhs=%g\n",
    932 row->local ? "local" : "global",
    933 SCIProwGetName(row), row->lhs - row->constant, row->rhs - row->constant,
    934 row->lpdepth, weight, SCIPaggrRowGetRhs(aggrrow));
    935
    936 return SCIP_OKAY;
    937}
    938
    939/** checks validity of an LP row and a corresponding weight */
    940static
    942 SCIP_SET* set, /**< global SCIP settings */
    943 SCIP_ROW* row, /**< LP row */
    944 SCIP_Real weight, /**< weight for scaling */
    945 SCIP_Bool* zerocontribution /**< pointer to store whether every row entry is zero within tolerances */
    946 )
    947{
    948 SCIP_Bool valid = TRUE;
    949
    950 *zerocontribution = TRUE;
    951
    952 /* dual solution values of 0.0 are always valid */
    953 if( REALABS(weight) > QUAD_EPSILON )
    954 {
    955 *zerocontribution = FALSE;
    956
    957 /* check dual feasibility */
    958 if( (SCIPsetIsInfinity(set, -row->lhs) && weight > 0.0) || (SCIPsetIsInfinity(set, row->rhs) && weight < 0.0) )
    959 {
    960 int i;
    961
    962 /* ignore slight numerical violations if the contribution of every component of the row is close to zero */
    963 if( weight > 0.0 )
    964 *zerocontribution = SCIPsetIsDualfeasZero(set, row->rhs * weight);
    965 else
    966 *zerocontribution = SCIPsetIsDualfeasZero(set, row->lhs * weight);
    967
    968 for( i = 0; i < row->len && *zerocontribution; i++ )
    969 {
    970 if( !SCIPsetIsDualfeasZero(set, weight * row->vals[i]) )
    971 *zerocontribution = FALSE;
    972 }
    973
    974 if( !(*zerocontribution) )
    975 {
    976 SCIPsetDebugMsg(set, " -> invalid dual solution value %g for row <%s>: lhs=%g, rhs=%g\n",
    977 weight, SCIProwGetName(row), row->lhs, row->rhs);
    978
    979 valid = FALSE;
    980 }
    981 }
    982 }
    983
    984 return valid;
    985}
    986
    987/** calculates the minimal activity of a given aggregation row */
    988static
    990 SCIP_SET* set, /**< global SCIP settings */
    991 SCIP_PROB* transprob, /**< transformed problem data */
    992 SCIP_AGGRROW* aggrrow, /**< aggregation row */
    993 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables (or NULL for global bounds) */
    994 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables (or NULL for global bounds) */
    995 SCIP_Bool* infdelta /**< pointer to store whether at least one variable contributes with an infinite value */
    996 )
    997{
    998 SCIP_VAR** vars;
    999 SCIP_Real minact;
    1000 int* inds;
    1001 int nnz;
    1002 int i;
    1003 SCIP_ROUNDMODE roundmode;
    1004
    1005 vars = SCIPprobGetVars(transprob);
    1006 assert(vars != NULL);
    1007
    1008 nnz = SCIPaggrRowGetNNz(aggrrow);
    1009 inds = SCIPaggrRowGetInds(aggrrow);
    1010
    1011 minact = 0;
    1012
    1013 roundmode = SCIPintervalGetRoundingMode();
    1015
    1016 if( infdelta != NULL )
    1017 *infdelta = FALSE;
    1018
    1019 for( i = 0; i < nnz; i++ )
    1020 {
    1021 SCIP_Real val;
    1022 SCIP_Real delta;
    1023 int v = inds[i];
    1024
    1025 assert(SCIPvarGetProbindex(vars[v]) == v);
    1026
    1027 val = aggrrow->vals[v];
    1028 delta = 0.0;
    1029
    1030 if( val > 0.0 )
    1031 {
    1032 SCIP_Real bnd = (curvarlbs == NULL ? SCIPvarGetLbGlobal(vars[v]) : curvarlbs[v]);
    1033 if( infdelta != NULL && SCIPsetIsInfinity(set, -bnd) )
    1034 {
    1035 *infdelta = TRUE;
    1036 goto TERMINATE;
    1037 }
    1038 delta += val * bnd;
    1039 }
    1040 else
    1041 {
    1042 SCIP_Real bnd = (curvarubs == NULL ? SCIPvarGetUbGlobal(vars[v]) : curvarubs[v]);
    1043 if( infdelta != NULL && SCIPsetIsInfinity(set, bnd) )
    1044 {
    1045 *infdelta = TRUE;
    1046 goto TERMINATE;
    1047 }
    1048 delta += val * bnd;
    1049 }
    1050
    1051 /* update minimal activity */
    1052 minact += delta;
    1053
    1054 if( infdelta != NULL && SCIPsetIsInfinity(set, REALABS(delta)) )
    1055 {
    1056 *infdelta = TRUE;
    1057 goto TERMINATE;
    1058 }
    1059 }
    1060
    1061 TERMINATE:
    1062 SCIPintervalSetRoundingMode(roundmode);
    1063 /* check whether the minimal activity is infinite */
    1064 if( SCIPsetIsInfinity(set, minact) )
    1065 return SCIPsetInfinity(set);
    1066 if( SCIPsetIsInfinity(set, -minact) )
    1067 return -SCIPsetInfinity(set);
    1068
    1069 return minact;
    1070}
    1071
    1072/** calculates the minimal activity of a given aggregation row
    1073 *
    1074 * @note in exact solving mode, this returns a safe underestimation of the minimal activity
    1075 */
    1077 SCIP_SET* set, /**< global SCIP settings */
    1078 SCIP_PROB* transprob, /**< transformed problem data */
    1079 SCIP_AGGRROW* aggrrow, /**< aggregation row */
    1080 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables (or NULL for global bounds) */
    1081 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables (or NULL for global bounds) */
    1082 SCIP_Bool* infdelta /**< pointer to store whether at least one variable contributes with an infinite value */
    1083 )
    1084{
    1085 SCIP_VAR** vars;
    1086 SCIP_Real QUAD(minact);
    1087 int* inds;
    1088 int nnz;
    1089 int i;
    1090
    1091 if( set->exact_enable )
    1092 return aggrRowGetMinActivitySafely(set, transprob, aggrrow, curvarlbs, curvarubs, infdelta);
    1093
    1094 vars = SCIPprobGetVars(transprob);
    1095 assert(vars != NULL);
    1096
    1097 nnz = SCIPaggrRowGetNNz(aggrrow);
    1098 inds = SCIPaggrRowGetInds(aggrrow);
    1099
    1100 QUAD_ASSIGN(minact, 0.0);
    1101
    1102 if( infdelta != NULL )
    1103 *infdelta = FALSE;
    1104
    1105 for( i = 0; i < nnz; i++ )
    1106 {
    1107 SCIP_Real val;
    1108 SCIP_Real QUAD(delta);
    1109 int v = inds[i];
    1110
    1111 assert(SCIPvarGetProbindex(vars[v]) == v);
    1112
    1113 val = SCIPaggrRowGetProbvarValue(aggrrow, v);
    1114
    1115 if( val > 0.0 )
    1116 {
    1117 SCIP_Real bnd = (curvarlbs == NULL ? SCIPvarGetLbGlobal(vars[v]) : curvarlbs[v]);
    1118
    1119 if( SCIPsetIsInfinity(set, -bnd) )
    1120 {
    1121 if( infdelta != NULL )
    1122 *infdelta = TRUE;
    1123
    1124 return -SCIPsetInfinity(set);
    1125 }
    1126
    1127 SCIPquadprecProdDD(delta, val, bnd);
    1128 }
    1129 else
    1130 {
    1131 SCIP_Real bnd = (curvarubs == NULL ? SCIPvarGetUbGlobal(vars[v]) : curvarubs[v]);
    1132
    1133 if( SCIPsetIsInfinity(set, bnd) )
    1134 {
    1135 if( infdelta != NULL )
    1136 *infdelta = TRUE;
    1137
    1138 return -SCIPsetInfinity(set);
    1139 }
    1140
    1141 SCIPquadprecProdDD(delta, val, bnd);
    1142 }
    1143
    1144 /* update minimal activity */
    1145 SCIPquadprecSumQQ(minact, minact, delta);
    1146 }
    1147
    1148 /* check whether the minimal activity is infinite */
    1149 if( SCIPsetIsInfinity(set, QUAD_TO_DBL(minact)) )
    1150 return SCIPsetInfinity(set);
    1151 if( SCIPsetIsInfinity(set, -QUAD_TO_DBL(minact)) )
    1152 return -SCIPsetInfinity(set);
    1153
    1154 return QUAD_TO_DBL(minact);
    1155}
    1156
    1157/** sort local rows by increasing depth and number of nonzeros as tie-breaker */
    1158static
    1160 SCIP_SET* set, /**< global SCIP settings */
    1161 SCIP_AGGRROW* aggrrow, /**< aggregation row */
    1162 SCIP_ROW** rows, /**< array of local rows */
    1163 int* rowinds, /**< array of row indices */
    1164 int* rowdepth, /**< array of LP depths */
    1165 int nrows /**< number of local rows */
    1166 )
    1167{
    1168 int* rownnz;
    1169 int i;
    1170
    1171 assert(aggrrow != NULL);
    1172 assert(rows != NULL);
    1173 assert(nrows > 0);
    1174 assert(rowinds != NULL);
    1175 assert(rowdepth != NULL);
    1176
    1177 /* sort row indices by increasing depth */
    1178 SCIPsortIntInt(rowdepth, rowinds, nrows);
    1179 assert(rowdepth[0] <= rowdepth[nrows-1]);
    1180
    1181 SCIP_CALL( SCIPsetAllocBufferArray(set, &rownnz, nrows) );
    1182
    1183 /* get number of nonzero entries for every row */
    1184 for( i = 0; i < nrows; i++ )
    1185 {
    1186 SCIP_ROW* row = rows[rowinds[i]];
    1187 assert(row != NULL);
    1188
    1189 rownnz[i] = row->len;
    1190 }
    1191
    1192 /* since SCIP has no stable sorting function we sort each bucket separately */
    1193 for( i = 0; i < nrows; i++ )
    1194 {
    1195 int j = i;
    1196 int d = rowdepth[i];
    1197
    1198 /* search for the next row with a greater depth */
    1199 while( j+1 < nrows && rowdepth[j+1] == d )
    1200 j++;
    1201
    1202 /* the bucket has size one */
    1203 if( j == i )
    1204 continue;
    1205
    1206 assert(j-i+1 <= nrows);
    1207
    1208 /* sort row indices by increasing number of nonzero elements */
    1209 SCIPsortIntIntInt(&rownnz[i], &rowdepth[i], &rowinds[i], j-i+1);
    1210 assert(rownnz[i] <= rownnz[j]);
    1211
    1212 i = j;
    1213 } /*lint --e{850} i is modified in the body of the for loop */
    1214
    1215#ifndef NDEBUG
    1216 for( i = 0; i < nrows-1; i++ )
    1217 assert(rowdepth[i] < rowdepth[i+1] || (rowdepth[i] == rowdepth[i+1] && rownnz[i] <= rownnz[i+1]));
    1218#endif
    1219
    1220 SCIPsetFreeBufferArray(set, &rownnz);
    1221
    1222 return SCIP_OKAY;
    1223}
    1224
    1225/** adds locally valid rows to the proof constraint */
    1226static
    1228 SCIP_SET* set, /**< global SCIP settings */
    1229 SCIP_PROB* transprob, /**< transformed problem */
    1230 SCIP_LP* lp, /**< LP data */
    1231 SCIP_AGGRROW* proofrow, /**< aggregated row representing the proof */
    1232 SCIP_ROW** rows, /**< array if locally valid rows */
    1233 SCIP_Real* dualsols, /**< dual solution vector */
    1234 int* localrowinds, /**< array of row indecies */
    1235 int* localrowdepth, /**< array of row depths */
    1236 int nlocalrows, /**< number of local rows stored in rows array */
    1237 SCIP_Real* proofact, /**< pointer to store the activity of the proof constraint */
    1238 int* validdepth, /**< pointer to store the depth where the proof constraint is valid */
    1239 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables */
    1240 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables */
    1241 SCIP_Bool* valid /**< pointer store whether the proof constraint is valid */
    1242 )
    1243{
    1244 SCIP_Bool infdelta;
    1245 int i;
    1246
    1247 assert(set != NULL);
    1248 assert(lp != NULL);
    1249
    1250 *validdepth = 0;
    1251
    1252 if( !set->conf_uselocalrows )
    1253 return SCIP_OKAY;
    1254
    1255 SCIPsetDebugMsg(set, "add local rows to dual proof:\n");
    1256
    1257 /* check whether the proof is already valid, e.g., violated within the local bounds */
    1258 *proofact = SCIPaggrRowGetMinActivity(set, transprob, proofrow, curvarlbs, curvarubs, &infdelta);
    1259
    1260 /* we stop if the minimal activity is infinite but all variables have a finite activity delta (bad numerics) */
    1261 if( !infdelta && SCIPsetIsInfinity(set, REALABS(*proofact)) )
    1262 {
    1263 *valid = FALSE;
    1264 return SCIP_OKAY;
    1265 }
    1266
    1267 /* break if the proof is valid w.r.t local bounds
    1268 * note: it can happen that the proof contains a variable with an infinite activity delta.
    1269 * here, we don't break immediately because we might be able to fix it by adding local rows
    1270 */
    1271 if( !infdelta && SCIPsetIsGT(set, *proofact, SCIPaggrRowGetRhs(proofrow)) )
    1272 {
    1273 *valid = TRUE;
    1274 return SCIP_OKAY;
    1275 }
    1276
    1277 /* sort local rows by depth */
    1278 SCIP_CALL( sortLocalRows(set, proofrow, rows, localrowinds, localrowdepth, nlocalrows) );
    1279
    1280 /* add successively local rows */
    1281 for( i = 0; i < nlocalrows; ++i )
    1282 {
    1283 SCIP_ROW* row;
    1284 int r;
    1285
    1286 r = localrowinds[i];
    1287 row = rows[r];
    1288
    1289 assert(row != NULL);
    1290 assert(row->len == 0 || row->cols != NULL);
    1291 assert(row->len == 0 || row->vals != NULL);
    1292 assert(row == lp->lpirows[r]);
    1293 assert(row->local);
    1294 assert(row->lpdepth == localrowdepth[i]);
    1295
    1296 /* ignore dual solution values of 0.0 (in this case: y_i == 0) */
    1297 if( REALABS(dualsols[r]) > 0.0 )
    1298 {
    1299#ifndef NDEBUG
    1300 SCIP_Bool zerocontribution;
    1301
    1302 /* check dual feasibility */
    1303 *valid = checkDualFeasibility(set, row, dualsols[r], &zerocontribution);
    1304 assert(*valid);
    1305 assert(!zerocontribution);
    1306#endif
    1307
    1308 if( SCIPsetIsDualfeasZero(set, dualsols[r]) )
    1309 continue;
    1310
    1311 /* add row to dual proof */
    1312 SCIP_CALL( addRowToAggrRow(set, row, -dualsols[r], proofrow, set->exact_enable, valid) );
    1313 if( !(*valid) )
    1314 goto TERMINATE;
    1315
    1316 /* update depth where the proof is valid */
    1317 if( *validdepth < localrowdepth[i] )
    1318 *validdepth = localrowdepth[i];
    1319
    1320 /* get the new minimal activity */
    1321 *proofact = SCIPaggrRowGetMinActivity(set, transprob, proofrow, curvarlbs, curvarubs, &infdelta);
    1322
    1323 /* we stop if the minimal activity is infinite but all variables have a finite activity delta (bad numerics) */
    1324 if( !infdelta && SCIPsetIsInfinity(set, REALABS(*proofact)) )
    1325 {
    1326 *valid = FALSE;
    1327 goto TERMINATE;
    1328 }
    1329
    1330 /* break if the proof is valid w.r.t local bounds */
    1331 if( !infdelta && SCIPsetIsGT(set, *proofact, SCIPaggrRowGetRhs(proofrow)) )
    1332 {
    1333 *valid = TRUE;
    1334 break;
    1335 }
    1336 }
    1337 }
    1338
    1339 /* remove all nearly zero coefficients */
    1340 /**@todo check whether it gives better performance to keep them in exact mode */
    1341 SCIPaggrRowRemoveZeros(set->scip, proofrow, TRUE, valid);
    1342
    1343 TERMINATE:
    1344 if( !(*valid) )
    1345 {
    1346 SCIPsetDebugMsg(set, " -> proof is not valid: %g <= %g\n", *proofact, SCIPaggrRowGetRhs(proofrow));
    1347 SCIPsetDebugMsg(set, " -> stop due to numerical troubles\n");
    1348 }
    1349 else
    1350 {
    1351 *proofact = SCIPaggrRowGetMinActivity(set, transprob, proofrow, curvarlbs, curvarubs, &infdelta);
    1352
    1353 /* we stop if the minimal activity is infinite but all variables have a finite activity delta (bad numerics) */
    1354 if( !infdelta && SCIPsetIsInfinity(set, REALABS(*proofact)) )
    1355 {
    1356 *valid = FALSE;
    1357 SCIPsetDebugMsg(set, " -> proof is not valid: %g <= %g [infdelta: %u]\n", *proofact, SCIPaggrRowGetRhs(proofrow), infdelta);
    1358 }
    1359 else if( infdelta || SCIPsetIsLE(set, *proofact, SCIPaggrRowGetRhs(proofrow)) )
    1360 {
    1361 *valid = FALSE;
    1362 SCIPsetDebugMsg(set, " -> proof is not valid: %g <= %g [infdelta: %u]\n", *proofact, SCIPaggrRowGetRhs(proofrow), infdelta);
    1363 }
    1364 }
    1365
    1366 return SCIP_OKAY;
    1367}
    1368
    1369/** calculates a Farkas proof from the current dual LP solution */
    1371 SCIP_SET* set, /**< global SCIP settings */
    1372 SCIP_PROB* prob, /**< transformed problem */
    1373 SCIP_LP* lp, /**< LP data */
    1374 SCIP_LPI* lpi, /**< LPI data */
    1375 SCIP_TREE* tree, /**< tree data */
    1376 SCIP_AGGRROW* farkasrow, /**< aggregated row representing the proof */
    1377 SCIP_Real* farkasact, /**< maximal activity of the proof constraint */
    1378 int* validdepth, /**< pointer to store the valid depth of the proof constraint */
    1379 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables */
    1380 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables */
    1381 SCIP_Bool* valid /**< pointer store whether the proof constraint is valid */
    1382 )
    1383{
    1384 SCIP_ROW** rows;
    1385 SCIP_Real* dualfarkas;
    1386 SCIP_ROW* row;
    1387 int* localrowinds;
    1388 int* localrowdepth;
    1389 SCIP_Bool infdelta;
    1390 int nlocalrows;
    1391 int nrows;
    1392 int r;
    1393
    1394 assert(set != NULL);
    1395 assert(prob != NULL);
    1396 assert(lp != NULL);
    1397 assert(lp->flushed);
    1398 assert(lp->solved);
    1399 assert(curvarlbs != NULL);
    1400 assert(curvarubs != NULL);
    1401 assert(valid != NULL);
    1402
    1405
    1406 /* get LP rows and problem variables */
    1407 rows = SCIPlpGetRows(lp);
    1408 nrows = SCIPlpGetNRows(lp);
    1409 assert(nrows == 0 || rows != NULL);
    1410 assert(nrows == lp->nlpirows);
    1411
    1412 /* it can happen that infeasibility is detetected within LP presolve. in that case, the LP solver may not be able to
    1413 * to return the dual ray.
    1414 */
    1415 if( !SCIPlpiHasDualRay(lpi) )
    1416 {
    1417 *valid = FALSE;
    1418 return SCIP_OKAY;
    1419 }
    1420
    1421 assert(farkasrow != NULL);
    1422
    1423 /* allocate temporary memory */
    1424 SCIP_CALL( SCIPsetAllocBufferArray(set, &dualfarkas, nrows) );
    1425 BMSclearMemoryArray(dualfarkas, nrows);
    1426 localrowinds = NULL;
    1427 localrowdepth = NULL;
    1428 nlocalrows = 0;
    1429
    1430 /* get dual Farkas values of rows */
    1431 SCIP_CALL( SCIPlpiGetDualfarkas(lpi, dualfarkas) );
    1432
    1433 /* check whether the Farkas solution is numerically stable */
    1434 for( r = 0; r < nrows; ++r )
    1435 {
    1436 if( REALABS(dualfarkas[r]) > SOLSTOP )
    1437 {
    1438 *valid = FALSE;
    1439 goto TERMINATE;
    1440 }
    1441 }
    1442
    1443 /* calculate the Farkas row */
    1444 *valid = TRUE;
    1445 *validdepth = 0;
    1446
    1447 for( r = 0; r < nrows; ++r )
    1448 {
    1449 row = rows[r];
    1450 assert(row != NULL);
    1451 assert(row->len == 0 || row->cols != NULL);
    1452 assert(row->len == 0 || row->vals != NULL);
    1453 assert(row == lp->lpirows[r]);
    1454
    1455 /* ignore dual ray values of 0.0 (in this case: y_i == z_i == 0) */
    1456 if( REALABS(dualfarkas[r]) > 0.0 )
    1457 {
    1458 SCIP_Bool zerocontribution;
    1459
    1460 /* check dual feasibility */
    1461 *valid = checkDualFeasibility(set, row, dualfarkas[r], &zerocontribution);
    1462
    1463 if( !(*valid) )
    1464 goto TERMINATE;
    1465
    1466 if( zerocontribution )
    1467 continue;
    1468
    1469 if( SCIPsetIsDualfeasZero(set, dualfarkas[r]) )
    1470 continue;
    1471
    1472 if( !row->local )
    1473 {
    1474 if( set->exact_enable && SCIPisCertified(set->scip) )
    1475 {
    1476 SCIP_Longint certificate_index;
    1477
    1478 /* ensure each row used in the aggregation is certified */
    1479 certificate_index = SCIPhashmapGetImageLong(SCIPgetCertificate(set->scip)->rowdatahash, row->rowexact);
    1480 if( certificate_index == LONG_MAX && SCIProwGetOrigintype(row) == SCIP_ROWORIGINTYPE_SEPA )
    1481 {
    1482 SCIP_CALL( SCIPcertificatePrintMirCut(set, lp, SCIPgetCertificate(set->scip), prob, row, 'L') );
    1483 certificate_index = SCIPcertificateGetRowIndex(SCIPgetCertificate(set->scip), row->rowexact, dualfarkas[r] > 0);
    1484 }
    1485 assert(certificate_index != LONG_MAX);
    1486 }
    1487
    1488 SCIP_CALL( addRowToAggrRow(set, row, -dualfarkas[r], farkasrow, set->exact_enable, valid) );
    1489 if( !(*valid) )
    1490 goto TERMINATE;
    1491
    1492 /* due to numerical reasons we want to stop */
    1493 if( REALABS(SCIPaggrRowGetRhs(farkasrow)) > NUMSTOP )
    1494 {
    1495 *valid = FALSE;
    1496 goto TERMINATE;
    1497 }
    1498 }
    1499 else
    1500 {
    1501 int lpdepth = SCIProwGetLPDepth(row);
    1502
    1503 if( nlocalrows == 0 && lpdepth < SCIPtreeGetFocusDepth(tree) )
    1504 {
    1505 SCIP_CALL( SCIPsetAllocBufferArray(set, &localrowinds, nrows-r) );
    1506 SCIP_CALL( SCIPsetAllocBufferArray(set, &localrowdepth, nrows-r) );
    1507 }
    1508
    1509 if( lpdepth < SCIPtreeGetFocusDepth(tree) )
    1510 {
    1511 assert(localrowinds != NULL);
    1512 assert(localrowdepth != NULL);
    1513
    1514 localrowinds[nlocalrows] = r;
    1515 localrowdepth[nlocalrows++] = lpdepth;
    1516 }
    1517 }
    1518 }
    1519 }
    1520
    1521 /* remove all coefficients that are too close to zero */
    1522 SCIPaggrRowRemoveZeros(set->scip, farkasrow, TRUE, valid);
    1523
    1524 if( !(*valid) )
    1525 goto TERMINATE;
    1526
    1527 infdelta = FALSE;
    1528
    1529 /* calculate the current Farkas activity, always using the best bound w.r.t. the Farkas coefficient */
    1530 *farkasact = SCIPaggrRowGetMinActivity(set, prob, farkasrow, curvarlbs, curvarubs, &infdelta);
    1531
    1532 SCIPsetDebugMsg(set, " -> farkasact=%g farkasrhs=%g [infdelta: %u], \n",
    1533 (*farkasact), SCIPaggrRowGetRhs(farkasrow), infdelta);
    1534
    1535 /* The constructed proof is not valid, this can happen due to numerical reasons,
    1536 * e.g., we only consider rows r with !SCIPsetIsZero(set, dualfarkas[r]),
    1537 * or because of local rows were ignored so far.
    1538 * Due to the latter case, it might happen at least one variable contributes
    1539 * with an infinite value to the activity (see: https://git.zib.de/integer/scip/issues/2743)
    1540 */
    1541 if( infdelta || SCIPsetIsFeasLE(set, *farkasact, SCIPaggrRowGetRhs(farkasrow)))
    1542 {
    1543 /* add contribution of local rows */
    1544 if( nlocalrows > 0 && set->conf_uselocalrows > 0 )
    1545 {
    1546 SCIP_CALL( addLocalRows(set, prob, lp, farkasrow, rows, dualfarkas, localrowinds, localrowdepth,
    1547 nlocalrows, farkasact, validdepth, curvarlbs, curvarubs, valid) );
    1548 }
    1549 else
    1550 {
    1551 *valid = FALSE;
    1552 SCIPsetDebugMsg(set, " -> proof is not valid to due infinite activity delta\n");
    1553 }
    1554 }
    1555
    1556 if( set->exact_enable )
    1557 {
    1558 for( int i = 0; i < farkasrow->nnz; i++ )
    1559 {
    1560 if( SCIPsetIsInfinity(set, ABS(farkasrow->vals[farkasrow->inds[i]])) )
    1561 {
    1562 (*valid) = FALSE;
    1563 goto TERMINATE;
    1564 }
    1565 }
    1566
    1567 /* certify final Farkas row */
    1568 if( SCIPisCertified(set->scip) )
    1569 {
    1570 SCIP_ROW** usedrows;
    1571 SCIP_CALL( SCIPallocBufferArray(set->scip, &usedrows, farkasrow->nrows) );
    1572 for( int i = 0; i < farkasrow->nrows; i++ )
    1573 {
    1574 usedrows[i] = SCIPgetLPRows(set->scip)[farkasrow->rowsinds[i]];
    1575 }
    1577 farkasrow, usedrows, farkasrow->rowweights, farkasrow->nrows, FALSE, &farkasrow->certificateline) );
    1578 SCIPfreeBufferArray(set->scip, &usedrows);
    1579 }
    1580 }
    1581
    1582 TERMINATE:
    1583 SCIPfreeBufferArrayNull(set->scip, &localrowdepth);
    1584 SCIPfreeBufferArrayNull(set->scip, &localrowinds);
    1585 SCIPsetFreeBufferArray(set, &dualfarkas);
    1586
    1587 return SCIP_OKAY;
    1588}
    1589
    1590
    1591/** creates a numerically safe row (with corresponding exact row) from the objective, provided rhs is an exactly valid cutoffbound */
    1592static
    1594 SCIP* scip, /**< SCIP data structure */
    1595 SCIP_ROW** row, /**< pointer to store the row */
    1596 SCIP_Real rhs, /**< right-hand side of the artificial row */
    1597 SCIP_Bool* success /**< pointer to store whether adding the row was successful */
    1598 )
    1599{
    1600 SCIP_Real* vals;
    1601 SCIP_COL** cols;
    1602 SCIP_COLEXACT** colsexact;
    1603 int nvals;
    1604 SCIP_RATIONAL** valsexact;
    1605 SCIP_RATIONAL* lhsexact;
    1606 SCIP_RATIONAL* rhsexact;
    1607 SCIP_ROWEXACT* rowexact;
    1608 SCIP_Real rhschange;
    1609 SCIP_ROUNDMODE prevmode;
    1610
    1611 assert(SCIPisExact(scip));
    1612
    1619
    1620 rhschange = 0;
    1621 nvals = 0;
    1622
    1623 prevmode = SCIPintervalGetRoundingMode();
    1625
    1627 SCIPrationalSetReal(rhsexact, rhs);
    1628 if( SCIPisObjIntegral(scip) )
    1629 {
    1631 rhs = floor(rhs);
    1632 }
    1633
    1634 /* add coefficients */
    1635 for( int i = 0; i < SCIPgetNLPCols(scip) && (*success); i++ )
    1636 {
    1637 SCIP_RATIONAL* val;
    1638 SCIP_COLEXACT* col;
    1639
    1640 col = scip->lpexact->cols[i];
    1641 val = col->obj;
    1642
    1643 if( SCIPrationalIsZero(val) )
    1644 continue;
    1645
    1646 /* make the objective safe, if possible */
    1648 vals[nvals] = SCIPvarGetObj(col->var);
    1649 else if( !SCIPrationalIsNegInfinity(col->lb) )
    1650 {
    1652 if( SCIPvarGetLbGlobal(col->var) < 0 )
    1653 {
    1655 * (-SCIPvarGetLbGlobal(col->var));
    1656 }
    1657 }
    1658 else if( !SCIPrationalIsInfinity(col->ub) )
    1659 {
    1660 vals[nvals] = SCIPrationalRoundReal(col->obj, SCIP_R_ROUND_UPWARDS);
    1661 if( SCIPvarGetUbGlobal(col->var) > 0)
    1662 {
    1664 * SCIPvarGetUbGlobal(col->var);
    1665 }
    1666 }
    1667 else
    1668 {
    1669 *success = FALSE;
    1670 break;
    1671 }
    1672
    1673 valsexact[nvals] = val;
    1674 cols[nvals] = scip->lp->cols[i];
    1675 colsexact[nvals] = scip->lpexact->cols[i];
    1676 assert(scip->lp->cols[i]->var == scip->lpexact->cols[i]->var);
    1677
    1678 /* rows do not allow numerically zero coefficients, since this almost never happens, just abort the procedure in this case*/
    1679 if( SCIPisZero(scip, vals[nvals]) )
    1680 {
    1681 *success = FALSE;
    1682 break;
    1683 }
    1684
    1685 nvals++;
    1686 }
    1687
    1688 if( *success )
    1689 {
    1690 rhs += rhschange;
    1691 SCIP_CALL( SCIPcreateRowUnspec(scip, row, "objective", nvals, cols, vals, -SCIPinfinity(scip), rhs,
    1692 FALSE, FALSE, TRUE) );
    1693 SCIP_CALL( SCIPcreateRowExact(scip, &rowexact, *row , nvals, colsexact, valsexact, lhsexact, rhsexact, TRUE) );
    1695 }
    1696
    1699 SCIPfreeBufferArray(scip, &vals);
    1700 SCIPfreeBufferArray(scip, &cols);
    1701 SCIPfreeBufferArray(scip, &colsexact);
    1702 SCIPfreeBufferArray(scip, &valsexact);
    1703
    1705
    1706 return SCIP_OKAY;
    1707}
    1708
    1709/** calculates a Farkas proof from the current dual LP solution */
    1711 SCIP_SET* set, /**< global SCIP settings */
    1712 SCIP_PROB* transprob, /**< transformed problem */
    1713 SCIP_LP* lp, /**< LP data */
    1714 SCIP_LPI* lpi, /**< LPI data */
    1715 SCIP_TREE* tree, /**< tree data */
    1716 SCIP_AGGRROW* farkasrow, /**< aggregated row representing the proof */
    1717 SCIP_Real* farkasact, /**< maximal activity of the proof constraint */
    1718 int* validdepth, /**< pointer to store the valid depth of the proof constraint */
    1719 SCIP_Real* curvarlbs, /**< current lower bounds of active problem variables */
    1720 SCIP_Real* curvarubs, /**< current upper bounds of active problem variables */
    1721 SCIP_Bool* valid /**< pointer store whether the proof constraint is valid */
    1722 )
    1723{
    1724 SCIP_RETCODE retcode;
    1725 SCIP_ROW** rows;
    1726 SCIP_ROW* row;
    1727 SCIP_Real* primsols;
    1728 SCIP_Real* dualsols;
    1729 SCIP_Real* redcosts;
    1730 int* localrowinds;
    1731 int* localrowdepth;
    1732 SCIP_Bool infdelta;
    1733 SCIP_ROW* objectiverow = NULL;
    1734 int nlocalrows;
    1735 int nrows;
    1736 int ncols;
    1737 int r;
    1738
    1739 assert(set != NULL);
    1740 assert(transprob != NULL);
    1741 assert(lp != NULL);
    1742 assert(lp->flushed);
    1743 assert(lp->solved);
    1744 assert(curvarlbs != NULL);
    1745 assert(curvarubs != NULL);
    1746 assert(valid != NULL);
    1747
    1748 *validdepth = 0;
    1749 *valid = TRUE;
    1750
    1751 localrowinds = NULL;
    1752 localrowdepth = NULL;
    1753 nlocalrows = 0;
    1754
    1755 /* get LP rows and problem variables */
    1756 rows = SCIPlpGetRows(lp);
    1757 nrows = SCIPlpGetNRows(lp);
    1758 ncols = SCIPlpGetNCols(lp);
    1759 assert(nrows == 0 || rows != NULL);
    1760 assert(nrows == lp->nlpirows);
    1761
    1762 /* get temporary memory */
    1763 SCIP_CALL( SCIPsetAllocBufferArray(set, &primsols, ncols) );
    1764 SCIP_CALL( SCIPsetAllocBufferArray(set, &dualsols, nrows) );
    1765 SCIP_CALL( SCIPsetAllocBufferArray(set, &redcosts, ncols) );
    1766
    1767 /* get solution from LPI */
    1768 retcode = SCIPlpiGetSol(lpi, NULL, primsols, dualsols, NULL, redcosts);
    1769 if( retcode == SCIP_LPERROR ) /* on an error in the LP solver, just abort the conflict analysis */
    1770 {
    1771 *valid = FALSE;
    1772 goto TERMINATE;
    1773 }
    1774 SCIP_CALL( retcode );
    1775#ifdef SCIP_DEBUG
    1776 {
    1777 SCIP_Real objval;
    1778 SCIP_CALL( SCIPlpiGetObjval(lpi, &objval) );
    1779 SCIPsetDebugMsg(set, " -> LP objval: %g\n", objval);
    1780 }
    1781#endif
    1782
    1783 /* check whether the dual solution is numerically stable */
    1784 for( r = 0; r < nrows; ++r )
    1785 {
    1786 if( REALABS(dualsols[r]) > SOLSTOP )
    1787 {
    1788 *valid = FALSE;
    1789 goto TERMINATE;
    1790 }
    1791 }
    1792
    1793 if( set->exact_enable )
    1794 {
    1795 SCIP_COL** cols = SCIPgetLPCols(set->scip);
    1796 for( int i = 0; i < SCIPgetNLPCols(set->scip); i++ )
    1797 {
    1798 if( SCIPsetIsInfinity(set, -SCIPvarGetLbGlobal(cols[i]->var)) && SCIPsetIsInfinity(set, SCIPvarGetUbGlobal(cols[i]->var)) )
    1799 {
    1800 /* adding unbounded variables safely to an aggregation row is not yet supported */
    1801 (*valid) = FALSE;
    1802 goto TERMINATE;
    1803 }
    1804 }
    1805 }
    1806
    1807 /* clear the proof */
    1808 if( set->exact_enable )
    1809 SCIPaggrRowClearSafely(farkasrow);
    1810 else
    1811 SCIPaggrRowClear(farkasrow);
    1812
    1813 /* Let y be the dual solution and r be the reduced cost vector. Let z be defined as
    1814 * z_i := y_i if i is a global row,
    1815 * z_i := 0 if i is a local row.
    1816 * Define the set X := {x | lhs <= Ax <= rhs, lb <= x <= ub, c^Tx <= c*}, with c* being the current primal bound.
    1817 * Then the following inequalities are valid for all x \in X:
    1818 * - c* <= -c^Tx
    1819 * <=> z^TAx - c* <= (z^TA - c^T) x
    1820 * <=> z^TAx - c* <= (y^TA - c^T - (y-z)^TA) x
    1821 * <=> z^TAx - c* <= (-r^T - (y-z)^TA) x (dual feasibility of (y,r): y^TA + r^T == c^T)
    1822 * Because lhs <= Ax <= rhs and lb <= x <= ub, the inequality can be relaxed to give
    1823 * min{z^Tq | lhs <= q <= rhs} - c* <= max{(-r^T - (y-z)^TA) x | lb <= x <= ub}, or X = {}.
    1824 *
    1825 * The resulting dual row is: z^T{lhs,rhs} - c* <= (-r^T - (y-z)^TA){lb,ub},
    1826 * where lhs, rhs, lb, and ub are selected in order to maximize the feasibility of the row.
    1827 */
    1828
    1829 /* add the objective function to the aggregation row with respect to the current cutoff bound
    1830 *
    1831 * for an integral objective the right-hand side is reduced by the cutoff bound delta to cut off up to the next
    1832 * possible objective value below the cutoff bound
    1833 */
    1834
    1835 if( !set->exact_enable )
    1836 {
    1837 SCIP_CALL( SCIPaggrRowAddObjectiveFunction(set->scip, farkasrow, lp->cutoffbound - (SCIPprobIsObjIntegral(transprob) ? SCIPsetCutoffbounddelta(set) : 0.0), 1.0) );
    1838 }
    1839 else
    1840 {
    1841 double cutoffbound;
    1842
    1844
    1845 SCIP_CALL( getObjectiveRow(set->scip, &objectiverow, cutoffbound, valid) );
    1846 if( *valid )
    1847 {
    1848 SCIP_CALL( addRowToAggrRow(set, objectiverow, 1.0, farkasrow, TRUE, valid) );
    1849 }
    1850
    1851 if( !(*valid) )
    1852 goto TERMINATE;
    1853 }
    1854
    1855 /* dual row: z^T{lhs,rhs} - c* <= (-r^T - (y-z)^TA){lb,ub}
    1856 * process rows: add z^T{lhs,rhs} to the dual row's left hand side, and -(y-z)^TA to the dual row's coefficients
    1857 */
    1858 for( r = 0; r < nrows; ++r )
    1859 {
    1860 row = rows[r];
    1861 assert(row != NULL);
    1862 assert(row->len == 0 || row->cols != NULL);
    1863 assert(row->len == 0 || row->vals != NULL);
    1864 assert(row == lp->lpirows[r]);
    1865
    1866 /* ignore dual solution values of 0.0 (in this case: y_i == z_i == 0) */
    1867 if( REALABS(dualsols[r]) > 0.0 )
    1868 {
    1869 SCIP_Bool zerocontribution;
    1870
    1871 /* check dual feasibility */
    1872 *valid = checkDualFeasibility(set, row, dualsols[r], &zerocontribution);
    1873
    1874 if( !(*valid) )
    1875 goto TERMINATE;
    1876
    1877 if( zerocontribution )
    1878 continue;
    1879
    1880 if( SCIPsetIsDualfeasZero(set, dualsols[r]) )
    1881 continue;
    1882
    1883 /* skip local row */
    1884 if( !row->local )
    1885 {
    1886 SCIP_CALL( addRowToAggrRow(set, row, -dualsols[r], farkasrow, set->exact_enable, valid) );
    1887 if( !(*valid) )
    1888 goto TERMINATE;
    1889
    1890 /* due to numerical reasons we want to stop */
    1891 if( REALABS(SCIPaggrRowGetRhs(farkasrow)) > NUMSTOP )
    1892 {
    1893 *valid = FALSE;
    1894 goto TERMINATE;
    1895 }
    1896 }
    1897 else
    1898 {
    1899 int lpdepth = SCIProwGetLPDepth(row);
    1900
    1901 if( nlocalrows == 0 && lpdepth < SCIPtreeGetFocusDepth(tree) )
    1902 {
    1903 SCIP_CALL( SCIPsetAllocBufferArray(set, &localrowinds, nrows-r) );
    1904 SCIP_CALL( SCIPsetAllocBufferArray(set, &localrowdepth, nrows-r) );
    1905 }
    1906
    1907 if( lpdepth < SCIPtreeGetFocusDepth(tree) )
    1908 {
    1909 assert(localrowinds != NULL);
    1910 assert(localrowdepth != NULL);
    1911
    1912 localrowinds[nlocalrows] = r;
    1913 localrowdepth[nlocalrows++] = lpdepth;
    1914 }
    1915 }
    1916 }
    1917 }
    1918
    1919 /* remove all nearly zero coefficients */
    1920 SCIPaggrRowRemoveZeros(set->scip, farkasrow, TRUE, valid);
    1921
    1922 if( !(*valid) )
    1923 goto TERMINATE;
    1924
    1925 infdelta = FALSE;
    1926
    1927 /* check validity of the proof */
    1928 *farkasact = SCIPaggrRowGetMinActivity(set, transprob, farkasrow, curvarlbs, curvarubs, &infdelta);
    1929
    1930 SCIPsetDebugMsg(set, " -> farkasact=%g farkasrhs=%g [infdelta: %u], \n",
    1931 (*farkasact), SCIPaggrRowGetRhs(farkasrow), infdelta);
    1932
    1933 /* The constructed proof is not valid, this can happen due to numerical reasons,
    1934 * e.g., we only consider rows r with !SCIPsetIsZero(set, dualsol[r]),
    1935 * or because of local rows were ignored so far.
    1936 * Due to the latter case, it might happen at least one variable contributes
    1937 * with an infinite value to the activity (see: https://git.zib.de/integer/scip/issues/2743)
    1938 */
    1939 if( infdelta || SCIPsetIsFeasLE(set, *farkasact, SCIPaggrRowGetRhs(farkasrow)))
    1940 {
    1941 /* add contribution of local rows */
    1942 if( nlocalrows > 0 && set->conf_uselocalrows > 0 )
    1943 {
    1944 SCIP_CALL( addLocalRows(set, transprob, lp, farkasrow, rows, dualsols, localrowinds, localrowdepth,
    1945 nlocalrows, farkasact, validdepth, curvarlbs, curvarubs, valid) );
    1946 }
    1947 else
    1948 {
    1949 *valid = FALSE;
    1950 SCIPsetDebugMsg(set, " -> proof is not valid to due infinite activity delta\n");
    1951 }
    1952 }
    1953
    1954 if( set->exact_enable && SCIPisCertified(set->scip) )
    1955 {
    1956 SCIP_Longint certificateline;
    1957 SCIP_ROW** usedrows;
    1958
    1959 assert(objectiverow != NULL && objectiverow->rowexact != NULL);
    1960
    1962 SCIP_CALL( SCIPhashmapInsertLong(SCIPgetCertificate(set->scip)->rowdatahash, objectiverow->rowexact, certificateline) );
    1963 SCIP_CALL( SCIPallocBufferArray(set->scip, &usedrows, farkasrow->nrows + 1) );
    1964 usedrows[0] = objectiverow;
    1965 for( int i = 1; i < farkasrow->nrows; i++ )
    1966 {
    1967 SCIP_Longint certificate_index;
    1968
    1969 usedrows[i] = SCIPgetLPRows(set->scip)[farkasrow->rowsinds[i]];
    1970
    1971 /* ensure used rows are certified */
    1972 certificate_index = SCIPhashmapGetImageLong(SCIPgetCertificate(set->scip)->rowdatahash, usedrows[i]->rowexact);
    1973 if( certificate_index == LONG_MAX && SCIProwGetOrigintype(usedrows[i]) == SCIP_ROWORIGINTYPE_SEPA )
    1974 {
    1975 SCIP_CALL( SCIPcertificatePrintMirCut(set, lp, SCIPgetCertificate(set->scip), transprob, usedrows[i], 'L') );
    1976 }
    1977 else
    1978 {
    1979 assert(certificate_index != SCIP_LONGINT_MAX);
    1980 }
    1981 }
    1982 SCIP_CALL( SCIPcertificatePrintAggrrow(set, transprob, SCIPgetCertificate(set->scip), farkasrow, usedrows,
    1983 farkasrow->rowweights, farkasrow->nrows, false, &farkasrow->certificateline) );
    1985 SCIPfreeBufferArray(set->scip, &usedrows);
    1986 }
    1987
    1988 TERMINATE:
    1989 assert(set->exact_enable || objectiverow == NULL);
    1990 if( objectiverow != NULL )
    1991 {
    1992 SCIP_CALL( SCIPreleaseRowExact(set->scip, &objectiverow->rowexact) );
    1993 SCIP_CALL( SCIPreleaseRow(set->scip, &objectiverow) );
    1994 }
    1995 SCIPfreeBufferArrayNull(set->scip, &localrowdepth);
    1996 SCIPfreeBufferArrayNull(set->scip, &localrowinds);
    1997 SCIPsetFreeBufferArray(set, &redcosts);
    1998 SCIPsetFreeBufferArray(set, &dualsols);
    1999 SCIPsetFreeBufferArray(set, &primsols);
    2000
    2001 return SCIP_OKAY;
    2002}
    2003
    2004
    2005/*
    2006 * pseudo solution conflict analysis
    2007 */
    2008
    2009/** analyzes a pseudo solution with objective value exceeding the current cutoff to find out the bound changes on
    2010 * variables that were responsible for the objective value degradation;
    2011 * on success, calls standard conflict analysis with the responsible variables as starting conflict set, thus creating
    2012 * a conflict constraint out of the resulting conflict set;
    2013 * updates statistics for pseudo solution conflict analysis
    2014 */
    2016 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2017 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    2018 SCIP_SET* set, /**< global SCIP settings */
    2019 SCIP_STAT* stat, /**< problem statistics */
    2020 SCIP_PROB* transprob, /**< transformed problem */
    2021 SCIP_PROB* origprob, /**< original problem */
    2022 SCIP_TREE* tree, /**< branch and bound tree */
    2023 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2024 SCIP_LP* lp, /**< LP data */
    2025 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2026 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2027 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2028 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2029 SCIP_Bool* success /**< pointer to store whether a conflict constraint was created, or NULL */
    2030 )
    2031{
    2032 SCIP_VAR** vars;
    2033 SCIP_VAR* var;
    2034 SCIP_Real* curvarlbs;
    2035 SCIP_Real* curvarubs;
    2036 int* lbchginfoposs;
    2037 int* ubchginfoposs;
    2038 SCIP_Real* pseudocoefs;
    2039 SCIP_Real pseudolhs;
    2040 SCIP_Real pseudoact;
    2041 int nvars;
    2042 int v;
    2043
    2044 if( set->exact_enable )
    2045 return SCIP_OKAY;
    2046
    2047 assert(conflict != NULL);
    2048 assert(conflict->nconflictsets == 0);
    2049 assert(set != NULL);
    2050 assert(stat != NULL);
    2051 assert(transprob != NULL);
    2052 assert(lp != NULL);
    2053 assert(!SCIPsetIsInfinity(set, -SCIPlpGetPseudoObjval(lp, set, transprob)));
    2054 assert(!SCIPsetIsInfinity(set, lp->cutoffbound));
    2055
    2056 if( success != NULL )
    2057 *success = FALSE;
    2058
    2059 /* check, if pseudo solution conflict analysis is enabled */
    2060 if( !set->conf_enable || !set->conf_usepseudo )
    2061 return SCIP_OKAY;
    2062
    2063 /* check, if there are any conflict handlers to use a conflict set */
    2064 if( set->nconflicthdlrs == 0 )
    2065 return SCIP_OKAY;
    2066
    2067 SCIPsetDebugMsg(set, "analyzing pseudo solution (obj: %g) that exceeds objective limit (%g)\n",
    2068 SCIPlpGetPseudoObjval(lp, set, transprob), lp->cutoffbound);
    2069
    2071 conflict->conflictset->usescutoffbound = TRUE;
    2072
    2073 /* start timing */
    2075 conflict->npseudocalls++;
    2076
    2077 vars = transprob->vars;
    2078 nvars = transprob->nvars;
    2079 assert(nvars == 0 || vars != NULL);
    2080
    2081 /* The current primal bound c* gives an upper bound for the current pseudo objective value:
    2082 * min{c^T x | lb <= x <= ub} <= c*.
    2083 * We have to transform this row into a >= inequality in order to use methods above:
    2084 * -c* <= max{-c^T x | lb <= x <= ub}.
    2085 * In the local subproblem, this row is violated. We want to undo bound changes while still keeping the
    2086 * row violated.
    2087 */
    2088
    2089 /* get temporary memory for remembering variables' current bounds and corresponding bound change information
    2090 * positions in variable's bound change information arrays
    2091 */
    2092 SCIP_CALL( SCIPsetAllocBufferArray(set, &curvarlbs, nvars) );
    2093 SCIP_CALL( SCIPsetAllocBufferArray(set, &curvarubs, nvars) );
    2094 SCIP_CALL( SCIPsetAllocBufferArray(set, &lbchginfoposs, nvars) );
    2095 SCIP_CALL( SCIPsetAllocBufferArray(set, &ubchginfoposs, nvars) );
    2096
    2097 /* get temporary memory for infeasibility proof coefficients */
    2098 SCIP_CALL( SCIPsetAllocBufferArray(set, &pseudocoefs, nvars) );
    2099
    2100 /* for an integral objective use the cutoff bound reduced by the cutoff bound delta to cut off up to the next better
    2101 * objective value
    2102 */
    2103 pseudolhs = -(lp->cutoffbound - (SCIPprobIsObjIntegral(transprob) ? SCIPsetCutoffbounddelta(set) : 0.0));
    2104
    2105 /* store the objective values as infeasibility proof coefficients, and recalculate the pseudo activity */
    2106 pseudoact = 0.0;
    2107 for( v = 0; v < nvars; ++v )
    2108 {
    2109 var = vars[v];
    2110 pseudocoefs[v] = -SCIPvarGetObj(var);
    2111 curvarlbs[v] = SCIPvarGetLbLocal(var);
    2112 curvarubs[v] = SCIPvarGetUbLocal(var);
    2113 lbchginfoposs[v] = var->nlbchginfos-1;
    2114 ubchginfoposs[v] = var->nubchginfos-1;
    2115
    2116 if( SCIPsetIsZero(set, pseudocoefs[v]) )
    2117 {
    2118 pseudocoefs[v] = 0.0;
    2119 continue;
    2120 }
    2121
    2122 if( pseudocoefs[v] > 0.0 )
    2123 pseudoact += pseudocoefs[v] * curvarubs[v];
    2124 else
    2125 pseudoact += pseudocoefs[v] * curvarlbs[v];
    2126 }
    2127 assert(SCIPsetIsFeasEQ(set, pseudoact, -SCIPlpGetPseudoObjval(lp, set, transprob)));
    2128 SCIPsetDebugMsg(set, " -> recalculated pseudo infeasibility proof: %g <= %g\n", pseudolhs, pseudoact);
    2129
    2130 /* check, if the pseudo row is still violated (after recalculation of pseudo activity) */
    2131 if( SCIPsetIsFeasGT(set, pseudolhs, pseudoact) )
    2132 {
    2133 int nconss;
    2134 int nliterals;
    2135 int nreconvconss;
    2136 int nreconvliterals;
    2137
    2138 conflict->bdchgonlyconfqueue = TRUE;
    2139
    2140 /* undo bound changes without destroying the infeasibility proof */
    2141 SCIP_CALL( SCIPundoBdchgsProof(set, transprob, SCIPtreeGetCurrentDepth(tree), pseudocoefs, pseudolhs, &pseudoact,
    2142 curvarlbs, curvarubs, lbchginfoposs, ubchginfoposs, NULL, NULL, NULL, lp->lpi) );
    2143
    2144 /* analyze conflict on remaining bound changes */
    2145 SCIP_CALL( SCIPconflictAnalyzeRemainingBdchgs(conflict, blkmem, set, stat, transprob, tree, FALSE, \
    2146 lbchginfoposs, ubchginfoposs, &nconss, &nliterals, &nreconvconss, &nreconvliterals) );
    2147 conflict->npseudosuccess += (nconss > 0 ? 1 : 0);
    2148 conflict->npseudoconfconss += nconss;
    2149 conflict->npseudoconfliterals += nliterals;
    2150 conflict->npseudoreconvconss += nreconvconss;
    2151 conflict->npseudoreconvliterals += nreconvliterals;
    2152 if( success != NULL )
    2153 *success = (nconss > 0);
    2154
    2155 conflict->bdchgonlyconfqueue = FALSE;
    2156 }
    2157
    2158 /* free temporary memory */
    2159 SCIPsetFreeBufferArray(set, &pseudocoefs);
    2160 SCIPsetFreeBufferArray(set, &ubchginfoposs);
    2161 SCIPsetFreeBufferArray(set, &lbchginfoposs);
    2162 SCIPsetFreeBufferArray(set, &curvarubs);
    2163 SCIPsetFreeBufferArray(set, &curvarlbs);
    2164
    2165 /* flush conflict set storage */
    2166 SCIP_CALL( SCIPconflictFlushConss(conflict, blkmem, set, stat, transprob, origprob, tree, reopt, lp, branchcand, eventqueue, eventfilter, cliquetable) );
    2167
    2168 /* stop timing */
    2170
    2171 return SCIP_OKAY;
    2172}
    2173
    2174/** gets time in seconds used for analyzing pseudo solution conflicts */
    2176 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2177 )
    2178{
    2179 assert(conflict != NULL);
    2180
    2181 return SCIPclockGetTime(conflict->pseudoanalyzetime);
    2182}
    2183
    2184/** gets number of calls to pseudo solution conflict analysis */
    2186 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2187 )
    2188{
    2189 assert(conflict != NULL);
    2190
    2191 return conflict->npseudocalls;
    2192}
    2193
    2194/** gets number of calls to pseudo solution conflict analysis that yield at least one conflict constraint */
    2196 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2197 )
    2198{
    2199 assert(conflict != NULL);
    2200
    2201 return conflict->npseudosuccess;
    2202}
    2203
    2204/** gets number of conflict constraints detected in pseudo solution conflict analysis */
    2206 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2207 )
    2208{
    2209 assert(conflict != NULL);
    2210
    2211 return conflict->npseudoconfconss;
    2212}
    2213
    2214/** gets total number of literals in conflict constraints created in pseudo solution conflict analysis */
    2216 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2217 )
    2218{
    2219 assert(conflict != NULL);
    2220
    2221 return conflict->npseudoconfliterals;
    2222}
    2223
    2224/** gets number of reconvergence constraints detected in pseudo solution conflict analysis */
    2226 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2227 )
    2228{
    2229 assert(conflict != NULL);
    2230
    2231 return conflict->npseudoreconvconss;
    2232}
    2233
    2234/** gets total number of literals in reconvergence constraints created in pseudo solution conflict analysis */
    2236 SCIP_CONFLICT* conflict /**< conflict analysis data */
    2237 )
    2238{
    2239 assert(conflict != NULL);
    2240
    2241 return conflict->npseudoreconvliterals;
    2242}
    2243
    2244/** actually performs analysis of infeasible LP */
    2245static
    2247 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2248 SCIP_CONFLICTSTORE* conflictstore, /**< conflict store */
    2249 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    2250 SCIP_SET* set, /**< global SCIP settings */
    2251 SCIP_STAT* stat, /**< problem statistics */
    2252 SCIP_PROB* transprob, /**< transformed problem */
    2253 SCIP_PROB* origprob, /**< original problem */
    2254 SCIP_TREE* tree, /**< branch and bound tree */
    2255 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2256 SCIP_LP* lp, /**< LP data */
    2257 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2258 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2259 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2260 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2261 SCIP_Bool diving, /**< are we in strong branching or diving mode? */
    2262 SCIP_Bool* dualproofsuccess, /**< pointer to store success result of dual proof analysis */
    2263 int* iterations, /**< pointer to store the total number of LP iterations used */
    2264 int* nconss, /**< pointer to store the number of generated conflict constraints */
    2265 int* nliterals, /**< pointer to store the number of literals in generated conflict constraints */
    2266 int* nreconvconss, /**< pointer to store the number of generated reconvergence constraints */
    2267 int* nreconvliterals, /**< pointer to store the number of literals generated reconvergence constraints */
    2268 SCIP_Bool marklpunsolved /**< whether LP should be marked unsolved after analysis (needed for strong branching) */
    2269 )
    2270{
    2271 SCIP_VAR** vars;
    2272 SCIP_AGGRROW* farkasrow;
    2273 SCIP_LPI* lpi;
    2274 SCIP_Bool valid;
    2275 SCIP_Bool globalinfeasible;
    2276 int* lbchginfoposs;
    2277 int* ubchginfoposs;
    2278 int validdepth;
    2279 int nvars;
    2280 int v;
    2281 SCIP_Real* curvarlbs;
    2282 SCIP_Real* curvarubs;
    2283 SCIP_Real farkasactivity;
    2284
    2285 assert(conflict != NULL);
    2286 assert(conflict->nconflictsets == 0);
    2287 assert(set != NULL);
    2288 assert(SCIPprobAllColsInLP(transprob, set, lp)); /* LP conflict analysis is only valid, if all variables are known */
    2289 assert(stat != NULL);
    2290 assert(transprob != NULL);
    2291 assert(lp != NULL);
    2292 assert(lp->flushed);
    2293 assert(lp->solved);
    2294 assert(iterations != NULL);
    2295 assert(nconss != NULL);
    2296 assert(nliterals != NULL);
    2297 assert(nreconvconss != NULL);
    2298 assert(nreconvliterals != NULL);
    2299
    2300 *dualproofsuccess = FALSE;
    2301 *iterations = 0;
    2302 *nconss = 0;
    2303 *nliterals = 0;
    2304 *nreconvconss = 0;
    2305 *nreconvliterals = 0;
    2306
    2307 vars = transprob->vars;
    2308 nvars = transprob->nvars;
    2309
    2310 valid = TRUE;
    2311 validdepth = 0;
    2312
    2313 /* get LP solver interface */
    2314 lpi = SCIPlpGetLPI(lp);
    2317
    2318 if( !SCIPlpiIsPrimalInfeasible(lpi) )
    2319 {
    2320 SCIP_Real objval;
    2321
    2322 assert(!SCIPlpDivingObjChanged(lp));
    2323
    2324 /* make sure, a dual feasible solution exists, that exceeds the objective limit;
    2325 * With FASTMIP setting, CPLEX does not apply the final pivot to reach the dual solution exceeding the objective
    2326 * limit. Therefore, we have to either turn off FASTMIP and resolve the problem or continue solving it without
    2327 * objective limit for at least one iteration. It seems that the strategy to continue with FASTMIP for one
    2328 * additional simplex iteration yields better results.
    2329 */
    2330 SCIP_CALL( SCIPlpiGetObjval(lpi, &objval) );
    2331 if( objval < lp->lpiobjlim )
    2332 {
    2333 SCIP_RETCODE retcode;
    2334
    2335 /* temporarily disable objective limit and install an iteration limit */
    2338
    2339 /* start LP timer */
    2341
    2342 /* resolve LP */
    2343 retcode = SCIPlpiSolveDual(lpi);
    2344
    2345 /* stop LP timer */
    2347
    2348 /* check return code of LP solving call */
    2349 valid = (retcode != SCIP_LPERROR);
    2350 if( valid )
    2351 {
    2352 int iter;
    2353
    2354 SCIP_CALL( retcode );
    2355
    2356 /* count number of LP iterations */
    2357 SCIP_CALL( SCIPlpiGetIterations(lpi, &iter) );
    2358 (*iterations) += iter;
    2359 stat->nconflictlps++;
    2360 stat->nconflictlpiterations += iter;
    2361 SCIPsetDebugMsg(set, " -> resolved objlim exceeding LP in %d iterations (total: %" SCIP_LONGINT_FORMAT ") (infeasible:%u, objlim: %u, optimal:%u)\n",
    2364 }
    2365
    2366 /* reinstall old objective and iteration limits in LP solver */
    2369
    2370 /* abort, if the LP produced an error */
    2371 if( !valid )
    2372 return SCIP_OKAY;
    2373 }
    2374 }
    2376
    2377 if( !SCIPlpiIsPrimalInfeasible(lpi) )
    2378 {
    2379 SCIP_Real objval;
    2380
    2381 assert(!SCIPlpDivingObjChanged(lp));
    2382
    2383 SCIP_CALL( SCIPlpiGetObjval(lpi, &objval) );
    2384 if( objval < lp->lpiobjlim )
    2385 {
    2386 SCIPsetDebugMsg(set, " -> LP does not exceed the cutoff bound: obj=%g, cutoff=%g\n", objval, lp->lpiobjlim);
    2387 return SCIP_OKAY;
    2388 }
    2389 else
    2390 {
    2391 SCIPsetDebugMsg(set, " -> LP exceeds the cutoff bound: obj=%g, cutoff=%g\n", objval, lp->lpiobjlim);
    2392 }
    2393 }
    2394
    2395 assert(valid);
    2396
    2397 SCIP_CALL( SCIPsetAllocBufferArray(set, &lbchginfoposs, transprob->nvars) );
    2398 SCIP_CALL( SCIPsetAllocBufferArray(set, &ubchginfoposs, transprob->nvars) );
    2399
    2400 farkasactivity = 0.0;
    2401
    2402 /* get temporary memory for remembering variables' current bounds and corresponding bound change information
    2403 * positions in variable's bound change information arrays
    2404 */
    2405 SCIP_CALL( SCIPsetAllocBufferArray(set, &curvarlbs, nvars) );
    2406 SCIP_CALL( SCIPsetAllocBufferArray(set, &curvarubs, nvars) );
    2407
    2408 /* get current bounds and current positions in lb/ubchginfos arrays of variables */
    2409 valid = TRUE;
    2410 for( v = 0; v < nvars && valid; ++v )
    2411 {
    2412 SCIP_VAR* var;
    2413
    2414 var = vars[v];
    2415
    2416 curvarlbs[v] = SCIPvarGetLbLP(var, set);
    2417 curvarubs[v] = SCIPvarGetUbLP(var, set);
    2418 lbchginfoposs[v] = var->nlbchginfos-1;
    2419 ubchginfoposs[v] = var->nubchginfos-1;
    2420 assert(diving || SCIPsetIsEQ(set, curvarlbs[v], SCIPvarGetLbLocal(var)));
    2421 assert(diving || SCIPsetIsEQ(set, curvarubs[v], SCIPvarGetUbLocal(var)));
    2422
    2423 /* check, if last bound changes were due to strong branching or diving */
    2424 if( diving )
    2425 {
    2426 SCIP_Real lb;
    2427 SCIP_Real ub;
    2428
    2429 lb = SCIPvarGetLbLocal(var);
    2430 ub = SCIPvarGetUbLocal(var);
    2431 if( SCIPsetIsGT(set, curvarlbs[v], lb) )
    2432 lbchginfoposs[v] = var->nlbchginfos;
    2433 else if( SCIPsetIsLT(set, curvarlbs[v], lb) )
    2434 {
    2435 /* the bound in the diving LP was relaxed -> the LP is not a subproblem of the current node -> abort! */
    2436 /**@todo we could still analyze such a conflict, but we would have to take care with our data structures */
    2437 valid = FALSE;
    2438 }
    2439 if( SCIPsetIsLT(set, curvarubs[v], ub) )
    2440 ubchginfoposs[v] = var->nubchginfos;
    2441 else if( SCIPsetIsGT(set, curvarubs[v], ub) )
    2442 {
    2443 /* the bound in the diving LP was relaxed -> the LP is not a subproblem of the current node -> abort! */
    2444 /**@todo we could still analyze such a conflict, but we would have to take care with our data structures */
    2445 valid = FALSE;
    2446 }
    2447 }
    2448 }
    2449
    2450 if( !valid )
    2451 goto TERMINATE;
    2452
    2453 SCIP_CALL( SCIPaggrRowCreate(set->scip, &farkasrow) );
    2454
    2455 /* the LP is proven to be infeasible */
    2456 if( SCIPlpiIsPrimalInfeasible(lpi) )
    2457 {
    2458 SCIP_CALL( SCIPgetFarkasProof(set, transprob, lp, lpi, tree, farkasrow, &farkasactivity, &validdepth,
    2459 curvarlbs, curvarubs, &valid) );
    2460 }
    2461 /* the LP is dual feasible and/or exceeds the current incumbant solution */
    2462 else
    2463 {
    2464 assert(SCIPlpiIsDualFeasible(lpi) || SCIPlpiIsObjlimExc(lpi));
    2465 SCIP_CALL( SCIPgetDualProof(set, transprob, lp, lpi, tree, farkasrow, &farkasactivity, &validdepth,
    2466 curvarlbs, curvarubs, &valid) );
    2467 }
    2468
    2469 if( !valid || validdepth >= SCIPtreeGetCurrentDepth(tree) )
    2470 {
    2471 SCIPaggrRowFree(set->scip, &farkasrow);
    2472 goto TERMINATE;
    2473 }
    2474
    2475 globalinfeasible = FALSE;
    2476
    2477 /* start dual proof analysis */
    2478 if( ((set->conf_useinflp == 'b' || set->conf_useinflp == 'd') && conflict->conflictset->conflicttype == SCIP_CONFTYPE_INFEASLP)
    2479 || ((set->conf_useboundlp == 'b' || set->conf_useboundlp == 'd') && conflict->conflictset->conflicttype == SCIP_CONFTYPE_BNDEXCEEDING) )
    2480 {
    2481 /* start dual proof analysis */
    2482 SCIP_CALL( SCIPconflictAnalyzeDualProof(conflict, set, stat, eventfilter, blkmem, origprob, transprob, tree, reopt, lp,
    2483 farkasrow, validdepth, curvarlbs, curvarubs, TRUE, &globalinfeasible, dualproofsuccess) );
    2484 }
    2485
    2486 assert(valid);
    2487
    2488 /* todo: in theory, we could apply conflict graph analysis for locally valid proofs, too, but this needs to be
    2489 * implemented; also conflict graph analysis is not implemented in exact solving mode, yet
    2490 */
    2491 if( !set->exact_enable && !globalinfeasible && validdepth <= SCIPtreeGetEffectiveRootDepth(tree)
    2492 && (((set->conf_useinflp == 'b' || set->conf_useinflp == 'c') && conflict->conflictset->conflicttype == SCIP_CONFTYPE_INFEASLP)
    2493 || ((set->conf_useboundlp == 'b' || set->conf_useboundlp == 'c') && conflict->conflictset->conflicttype == SCIP_CONFTYPE_BNDEXCEEDING)) )
    2494 {
    2495 SCIP_Real* farkascoefs;
    2496 SCIP_Real farkaslhs;
    2497 int* inds;
    2498 int nnz;
    2499
    2500#ifdef SCIP_DEBUG
    2501 {
    2502 SCIP_Real objlim;
    2503 SCIPsetDebugMsg(set, "analyzing conflict on infeasible LP (infeasible: %u, objlimexc: %u, optimal:%u) in depth %d (diving: %u)\n",
    2505
    2507 SCIPsetDebugMsg(set, " -> objective limit in LP solver: %g (in LP: %g)\n", objlim, lp->lpiobjlim);
    2508 SCIPsetDebugMsg(set, " -> current cutoff bound: %g \n", SCIPgetCutoffbound(set->scip));
    2509 }
    2510#endif
    2511
    2512 SCIP_CALL( SCIPsetAllocBufferArray(set, &farkascoefs, SCIPprobGetNVars(transprob)) );
    2513 BMSclearMemoryArray(farkascoefs, SCIPprobGetNVars(transprob));
    2514
    2515 farkaslhs = -SCIPaggrRowGetRhs(farkasrow);
    2516 farkasactivity = -farkasactivity;
    2517
    2518 inds = SCIPaggrRowGetInds(farkasrow);
    2519 nnz = SCIPaggrRowGetNNz(farkasrow);
    2520
    2521 for( v = 0; v < nnz; v++ )
    2522 {
    2523 int i = inds[v];
    2524
    2525 assert(SCIPvarGetProbindex(vars[i]) == inds[v]);
    2526
    2527 farkascoefs[i] = -SCIPaggrRowGetProbvarValue(farkasrow, i);
    2528 }
    2529
    2530 SCIP_CALL( SCIPrunBoundHeuristic(conflict, set, stat, origprob, transprob, tree, reopt, lp, lpi, eventfilter,
    2531 blkmem, farkascoefs, &farkaslhs, &farkasactivity, curvarlbs, curvarubs, lbchginfoposs, ubchginfoposs, iterations,
    2532 marklpunsolved, dualproofsuccess, &valid) );
    2533
    2534 conflict->bdchgonlyconfqueue = FALSE;
    2535
    2536 SCIPsetFreeBufferArray(set, &farkascoefs);
    2537
    2538 if( !valid )
    2539 goto FLUSHPROOFSETS;
    2540
    2541 conflict->bdchgonlyconfqueue = TRUE;
    2542
    2543 /* analyze the conflict starting with remaining bound changes */
    2544 SCIP_CALL( SCIPconflictAnalyzeRemainingBdchgs(conflict, blkmem, set, stat, transprob, tree, diving,
    2545 lbchginfoposs, ubchginfoposs, nconss, nliterals, nreconvconss, nreconvliterals) );
    2546
    2547 SCIP_CALL( SCIPconflictFlushConss(conflict, blkmem, set, stat, transprob, origprob, tree, reopt, lp, branchcand,
    2548 eventqueue, eventfilter, cliquetable) );
    2549
    2550 conflict->bdchgonlyconfqueue = FALSE;
    2551 }
    2552
    2553 FLUSHPROOFSETS:
    2554 SCIPaggrRowFree(set->scip, &farkasrow);
    2555
    2556 /* flush proof set */
    2557 if( SCIPproofsetGetNVars(conflict->proofset) > 0 || conflict->nproofsets > 0 )
    2558 {
    2559 SCIP_CALL( SCIPconflictFlushProofset(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree, reopt, lp,
    2560 branchcand, eventqueue, eventfilter, cliquetable) );
    2561 }
    2562
    2563 TERMINATE:
    2564 SCIPsetFreeBufferArray(set, &curvarubs);
    2565 SCIPsetFreeBufferArray(set, &curvarlbs);
    2566 SCIPsetFreeBufferArray(set, &ubchginfoposs);
    2567 SCIPsetFreeBufferArray(set, &lbchginfoposs);
    2568
    2569 return SCIP_OKAY;
    2570}
    2571
    2572
    2573/*
    2574 * infeasible strong branching conflict analysis
    2575 */
    2576
    2577/** analyses infeasible strong branching sub problems for conflicts */
    2579 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2580 SCIP_CONFLICTSTORE* conflictstore, /**< conflict store */
    2581 BMS_BLKMEM* blkmem, /**< block memory buffers */
    2582 SCIP_SET* set, /**< global SCIP settings */
    2583 SCIP_STAT* stat, /**< dynamic problem statistics */
    2584 SCIP_PROB* transprob, /**< transformed problem */
    2585 SCIP_PROB* origprob, /**< original problem */
    2586 SCIP_TREE* tree, /**< branch and bound tree */
    2587 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2588 SCIP_LP* lp, /**< LP data */
    2589 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2590 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2591 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2592 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2593 SCIP_COL* col, /**< LP column with at least one infeasible strong branching subproblem */
    2594 SCIP_Bool* downconflict, /**< pointer to store whether a conflict constraint was created for an
    2595 * infeasible downwards branch, or NULL */
    2596 SCIP_Bool* upconflict /**< pointer to store whether a conflict constraint was created for an
    2597 * infeasible upwards branch, or NULL */
    2598 )
    2599{
    2600 int* cstat;
    2601 int* rstat;
    2602 SCIP_RETCODE retcode;
    2603 SCIP_Bool resolve;
    2604 SCIP_Real oldlb;
    2605 SCIP_Real oldub;
    2606 SCIP_Real newlb;
    2607 SCIP_Real newub;
    2608 SCIP_Bool dualraysuccess;
    2609 int iter;
    2610 int nconss;
    2611 int nliterals;
    2612 int nreconvconss;
    2613 int nreconvliterals;
    2614
    2615 assert(stat != NULL);
    2616 assert(lp != NULL);
    2617 assert(lp->flushed);
    2618 assert(lp->solved);
    2619 assert(SCIPprobAllColsInLP(transprob, set, lp)); /* LP conflict analysis is only valid, if all variables are known */
    2620 assert(col != NULL);
    2621 assert((col->sbdownvalid && SCIPsetIsGE(set, col->sbdown, lp->cutoffbound)
    2622 && SCIPsetFeasCeil(set, col->primsol-1.0) >= col->lb - 0.5)
    2623 || (col->sbupvalid && SCIPsetIsGE(set, col->sbup, lp->cutoffbound)
    2624 && SCIPsetFeasFloor(set, col->primsol+1.0) <= col->ub + 0.5));
    2625 assert(SCIPtreeGetCurrentDepth(tree) > 0);
    2626
    2627 if( downconflict != NULL )
    2628 *downconflict = FALSE;
    2629 if( upconflict != NULL )
    2630 *upconflict = FALSE;
    2631
    2632 /* check, if infeasible LP conflict analysis is enabled */
    2633 if( !set->conf_enable || !set->conf_usesb )
    2634 return SCIP_OKAY;
    2635
    2636 /* check, if there are any conflict handlers to use a conflict set */
    2637 if( set->nconflicthdlrs == 0 )
    2638 return SCIP_OKAY;
    2639
    2640 /* inform the LPI that strong branch is (temporarily) finished */
    2642
    2643 /* start timing */
    2644 SCIPclockStart(conflict->sbanalyzetime, set);
    2645
    2646 /* get temporary memory for storing current LP basis */
    2649
    2650 /* get current LP basis */
    2651 SCIP_CALL( SCIPlpiGetBase(lp->lpi, cstat, rstat) );
    2652
    2653 /* remember old bounds */
    2654 oldlb = col->lb;
    2655 oldub = col->ub;
    2656
    2657 resolve = FALSE;
    2658
    2659 /* is down branch infeasible? */
    2660 if( col->sbdownvalid && SCIPsetIsGE(set, col->sbdown, lp->cutoffbound) )
    2661 {
    2662 newub = SCIPsetFeasCeil(set, col->primsol-1.0);
    2663 if( newub >= col->lb - 0.5 )
    2664 {
    2665 SCIPsetDebugMsg(set, "analyzing conflict on infeasible downwards strongbranch for variable <%s>[%g,%g] in depth %d\n",
    2668
    2670 conflict->nsbcalls++;
    2671
    2672 /* change the upper bound */
    2673 col->ub = newub;
    2674 SCIP_CALL( SCIPlpiChgBounds(lp->lpi, 1, &col->lpipos, &col->lb, &col->ub) );
    2675
    2676 /* start LP timer */
    2678
    2679 /* resolve the LP */
    2680 retcode = SCIPlpiSolveDual(lp->lpi);
    2681
    2682 /* stop LP timer */
    2684
    2685 /* check return code of LP solving call */
    2686 if( retcode != SCIP_LPERROR )
    2687 {
    2688 SCIP_CALL( retcode );
    2689 }
    2690
    2691 if( retcode != SCIP_LPERROR && SCIPlpiIsStable(lp->lpi) )
    2692 {
    2693 /* count number of LP iterations */
    2694 SCIP_CALL( SCIPlpiGetIterations(lp->lpi, &iter) );
    2695 stat->nconflictlps++;
    2696 stat->nconflictlpiterations += iter;
    2697 conflict->nsbiterations += iter;
    2698 SCIPsetDebugMsg(set, " -> resolved downwards strong branching LP in %d iterations\n", iter);
    2699
    2700 /* perform conflict analysis on infeasible LP; last parameter guarantees status 'solved' on return */
    2701 SCIP_CALL( conflictAnalyzeLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree, reopt,
    2702 lp, branchcand, eventqueue, eventfilter, cliquetable, TRUE, &dualraysuccess, &iter, &nconss,
    2703 &nliterals, &nreconvconss, &nreconvliterals, FALSE) );
    2704 conflict->nsbsuccess += ((nconss > 0 || dualraysuccess) ? 1 : 0);
    2705 conflict->nsbiterations += iter;
    2706 conflict->nsbconfconss += nconss;
    2707 conflict->nsbconfliterals += nliterals;
    2708 conflict->nsbreconvconss += nreconvconss;
    2709 conflict->nsbreconvliterals += nreconvliterals;
    2710 if( downconflict != NULL )
    2711 *downconflict = (nconss > 0);
    2712 }
    2713
    2714 /* reset the upper bound */
    2715 col->ub = oldub;
    2716 SCIP_CALL( SCIPlpiChgBounds(lp->lpi, 1, &col->lpipos, &col->lb, &col->ub) );
    2717
    2718 /* reset LP basis */
    2719 SCIP_CALL( SCIPlpiSetBase(lp->lpi, cstat, rstat) );
    2720
    2721 /* mark the LP to be resolved at the end */
    2722 resolve = TRUE;
    2723 }
    2724 }
    2725
    2726 /* is up branch infeasible? */
    2727 if( col->sbupvalid && SCIPsetIsGE(set, col->sbup, lp->cutoffbound) )
    2728 {
    2729 newlb = SCIPsetFeasFloor(set, col->primsol+1.0);
    2730 if( newlb <= col->ub + 0.5 )
    2731 {
    2732 SCIPsetDebugMsg(set, "analyzing conflict on infeasible upwards strongbranch for variable <%s>[%g,%g] in depth %d\n",
    2735
    2737 conflict->nsbcalls++;
    2738
    2739 /* change the lower bound */
    2740 col->lb = newlb;
    2741 SCIP_CALL( SCIPlpiChgBounds(lp->lpi, 1, &col->lpipos, &col->lb, &col->ub) );
    2742
    2743 /* start LP timer */
    2745
    2746 /* resolve the LP */
    2747 retcode = SCIPlpiSolveDual(lp->lpi);
    2748
    2749 /* stop LP timer */
    2751
    2752 /* check return code of LP solving call */
    2753 if( retcode != SCIP_LPERROR )
    2754 {
    2755 SCIP_CALL( retcode );
    2756 }
    2757
    2758 if( retcode != SCIP_LPERROR && SCIPlpiIsStable(lp->lpi) )
    2759 {
    2760 /* count number of LP iterations */
    2761 SCIP_CALL( SCIPlpiGetIterations(lp->lpi, &iter) );
    2762 stat->nconflictlps++;
    2763 stat->nconflictlpiterations += iter;
    2764 conflict->nsbiterations += iter;
    2765 SCIPsetDebugMsg(set, " -> resolved upwards strong branching LP in %d iterations\n", iter);
    2766
    2767 /* perform conflict analysis on infeasible LP; last parameter guarantees status 'solved' on return */
    2768 SCIP_CALL( conflictAnalyzeLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree, reopt,
    2769 lp, branchcand, eventqueue, eventfilter, cliquetable, TRUE, &dualraysuccess, &iter, &nconss,
    2770 &nliterals, &nreconvconss, &nreconvliterals, FALSE) );
    2771 conflict->nsbsuccess += ((nconss > 0 || dualraysuccess) ? 1 : 0);
    2772 conflict->nsbiterations += iter;
    2773 conflict->nsbconfconss += nconss;
    2774 conflict->nsbconfliterals += nliterals;
    2775 conflict->nsbreconvconss += nreconvconss;
    2776 conflict->nsbreconvliterals += nreconvliterals;
    2777 if( upconflict != NULL )
    2778 *upconflict = (nconss > 0);
    2779 }
    2780
    2781 /* reset the lower bound */
    2782 col->lb = oldlb;
    2783 SCIP_CALL( SCIPlpiChgBounds(lp->lpi, 1, &col->lpipos, &col->lb, &col->ub) );
    2784
    2785 /* reset LP basis */
    2786 SCIP_CALL( SCIPlpiSetBase(lp->lpi, cstat, rstat) );
    2787
    2788 /* mark the LP to be resolved at the end */
    2789 resolve = TRUE;
    2790 }
    2791 }
    2792
    2793 /* free temporary memory for storing current LP basis */
    2794 SCIPsetFreeBufferArray(set, &rstat);
    2795 SCIPsetFreeBufferArray(set, &cstat);
    2796
    2797 assert(lp->flushed);
    2798
    2799 /* resolve LP if something has changed in order to synchronize LPI and LP */
    2800 if( resolve )
    2801 {
    2802 /* start LP timer */
    2804
    2805 /* resolve the LP */
    2807
    2808 /* stop LP timer */
    2810 }
    2811
    2812 /* stop timing */
    2813 SCIPclockStop(conflict->sbanalyzetime, set);
    2814
    2815 /* inform the LPI that strong branch starts (again) */
    2817
    2818 return SCIP_OKAY;
    2819}
    2820
    2821/** analyzes an infeasible LP to find out the bound changes on variables that were responsible for the infeasibility;
    2822 * on success, calls standard conflict analysis with the responsible variables as starting conflict set, thus creating
    2823 * a conflict constraint out of the resulting conflict set;
    2824 * updates statistics for infeasible LP conflict analysis
    2825 */
    2826static
    2828 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2829 SCIP_CONFLICTSTORE* conflictstore, /**< conflict store */
    2830 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    2831 SCIP_SET* set, /**< global SCIP settings */
    2832 SCIP_STAT* stat, /**< problem statistics */
    2833 SCIP_PROB* transprob, /**< transformed problem */
    2834 SCIP_PROB* origprob, /**< original problem */
    2835 SCIP_TREE* tree, /**< branch and bound tree */
    2836 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2837 SCIP_LP* lp, /**< LP data */
    2838 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2839 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2840 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2841 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2842 SCIP_Bool* success /**< pointer to store whether a conflict constraint was created, or NULL */
    2843 )
    2844{
    2845 SCIP_Bool dualraysuccess = FALSE;
    2846 SCIP_Longint olddualproofsuccess;
    2847 int iterations;
    2848 int nconss;
    2849 int nliterals;
    2850 int nreconvconss;
    2851 int nreconvliterals;
    2852
    2853 assert(conflict != NULL);
    2854 assert(set != NULL);
    2855 assert(lp != NULL);
    2856 assert(SCIPprobAllColsInLP(transprob, set, lp)); /* LP conflict analysis is only valid, if all variables are known */
    2857
    2858 assert(success == NULL || *success == FALSE);
    2859
    2860 /* check, if infeasible LP conflict analysis is enabled */
    2861 if( !set->conf_enable || set->conf_useinflp == 'o' )
    2862 return SCIP_OKAY;
    2863
    2864 /* check, if there are any conflict handlers to use a conflict set */
    2865 if( set->nconflicthdlrs == 0 )
    2866 return SCIP_OKAY;
    2867
    2868 SCIPsetDebugMsg(set, "analyzing conflict on infeasible LP in depth %d (solstat: %d, objchanged: %u)\n",
    2870
    2871 /* start timing */
    2873 conflict->ninflpcalls++;
    2874 /**@todo reset usescutoffbound flag */
    2876
    2877 olddualproofsuccess = conflict->ndualproofsinfsuccess;
    2878
    2879 /* perform conflict analysis */
    2880 SCIP_CALL( conflictAnalyzeLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree, reopt, lp, branchcand, eventqueue,
    2881 eventfilter, cliquetable, SCIPlpDiving(lp), &dualraysuccess, &iterations, &nconss, &nliterals, &nreconvconss, &nreconvliterals, TRUE) );
    2882 conflict->ninflpsuccess += ((nconss > 0 || conflict->ndualproofsinfsuccess > olddualproofsuccess) ? 1 : 0);
    2883 conflict->ninflpiterations += iterations;
    2884 conflict->ninflpconfconss += nconss;
    2885 conflict->ninflpconfliterals += nliterals;
    2886 conflict->ninflpreconvconss += nreconvconss;
    2887 conflict->ninflpreconvliterals += nreconvliterals;
    2888 if( success != NULL )
    2889 *success = (nconss > 0 || conflict->ndualproofsinfsuccess > olddualproofsuccess);
    2890
    2891 /* stop timing */
    2893
    2894 return SCIP_OKAY;
    2895}
    2896
    2897/** analyzes a bound exceeding LP to find out the bound changes on variables that were responsible for exceeding the
    2898 * primal bound;
    2899 * on success, calls standard conflict analysis with the responsible variables as starting conflict set, thus creating
    2900 * a conflict constraint out of the resulting conflict set;
    2901 * updates statistics for bound exceeding LP conflict analysis
    2902 */
    2903static
    2905 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2906 SCIP_CONFLICTSTORE* conflictstore, /**< conflict store */
    2907 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    2908 SCIP_SET* set, /**< global SCIP settings */
    2909 SCIP_STAT* stat, /**< problem statistics */
    2910 SCIP_PROB* transprob, /**< transformed problem */
    2911 SCIP_PROB* origprob, /**< original problem */
    2912 SCIP_TREE* tree, /**< branch and bound tree */
    2913 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2914 SCIP_LP* lp, /**< LP data */
    2915 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2916 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2917 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2918 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2919 SCIP_Bool* success /**< pointer to store whether a conflict constraint was created, or NULL */
    2920 )
    2921{
    2922 SCIP_Bool dualraysuccess;
    2923 SCIP_Longint oldnsuccess;
    2924 int iterations;
    2925 int nconss;
    2926 int nliterals;
    2927 int nreconvconss;
    2928 int nreconvliterals;
    2929
    2930 assert(conflict != NULL);
    2931 assert(set != NULL);
    2932 assert(lp != NULL);
    2933 assert(!SCIPlpDivingObjChanged(lp));
    2934 assert(SCIPprobAllColsInLP(transprob, set, lp)); /* LP conflict analysis is only valid, if all variables are known */
    2935
    2936 assert(success == NULL || *success == FALSE);
    2937
    2938 /* check, if bound exceeding LP conflict analysis is enabled */
    2939 if( !set->conf_enable || set->conf_useboundlp == 'o')
    2940 return SCIP_OKAY;
    2941
    2942 /* check, if there are any conflict handlers to use a conflict set */
    2943 if( set->nconflicthdlrs == 0 )
    2944 return SCIP_OKAY;
    2945
    2946 SCIPsetDebugMsg(set, "analyzing conflict on bound exceeding LP in depth %d (solstat: %d)\n",
    2948
    2949 /* start timing */
    2951 conflict->nboundlpcalls++;
    2952
    2953 /* mark the conflict to depend on the cutoff bound */
    2955 conflict->conflictset->usescutoffbound = TRUE;
    2956
    2957 oldnsuccess = conflict->ndualproofsbndsuccess + conflict->ndualproofsinfsuccess;
    2958
    2959 /* perform conflict analysis */
    2960 SCIP_CALL( conflictAnalyzeLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree, reopt, lp, branchcand, eventqueue,
    2961 eventfilter, cliquetable, SCIPlpDiving(lp), &dualraysuccess, &iterations, &nconss, &nliterals, &nreconvconss, &nreconvliterals, TRUE) );
    2962 conflict->nboundlpsuccess += ((nconss > 0 || conflict->ndualproofsbndsuccess + conflict->ndualproofsinfsuccess > oldnsuccess) ? 1 : 0);
    2963 conflict->nboundlpiterations += iterations;
    2964 conflict->nboundlpconfconss += nconss;
    2965 conflict->nboundlpconfliterals += nliterals;
    2966 conflict->nboundlpreconvconss += nreconvconss;
    2967 conflict->nboundlpreconvliterals += nreconvliterals;
    2968 if( success != NULL )
    2969 *success = (nconss > 0 || conflict->ndualproofsbndsuccess + conflict->ndualproofsinfsuccess > oldnsuccess);
    2970
    2971 /* stop timing */
    2973
    2974 return SCIP_OKAY;
    2975}
    2976
    2977/** analyzes an infeasible or bound exceeding LP to find out the bound changes on variables that were responsible for the
    2978 * infeasibility or for exceeding the primal bound;
    2979 * on success, calls standard conflict analysis with the responsible variables as starting conflict set, thus creating
    2980 * a conflict constraint out of the resulting conflict set;
    2981 * updates statistics for infeasible or bound exceeding LP conflict analysis;
    2982 * may only be called if SCIPprobAllColsInLP()
    2983 */
    2985 SCIP_CONFLICT* conflict, /**< conflict analysis data */
    2986 SCIP_CONFLICTSTORE* conflictstore, /**< conflict store */
    2987 BMS_BLKMEM* blkmem, /**< block memory of transformed problem */
    2988 SCIP_SET* set, /**< global SCIP settings */
    2989 SCIP_STAT* stat, /**< problem statistics */
    2990 SCIP_PROB* transprob, /**< transformed problem */
    2991 SCIP_PROB* origprob, /**< original problem */
    2992 SCIP_TREE* tree, /**< branch and bound tree */
    2993 SCIP_REOPT* reopt, /**< reoptimization data structure */
    2994 SCIP_LP* lp, /**< LP data */
    2995 SCIP_BRANCHCAND* branchcand, /**< branching candidate storage */
    2996 SCIP_EVENTQUEUE* eventqueue, /**< event queue */
    2997 SCIP_EVENTFILTER* eventfilter, /**< global event filter */
    2998 SCIP_CLIQUETABLE* cliquetable, /**< clique table data structure */
    2999 SCIP_Bool* success /**< pointer to store whether a conflict constraint was created, or NULL */
    3000 )
    3001{
    3002 SCIP_LPSOLVALS storedsolvals;
    3003 SCIP_COLSOLVALS* storedcolsolvals;
    3004 SCIP_ROWSOLVALS* storedrowsolvals;
    3005 int c;
    3006 int r;
    3007
    3008 if( success != NULL )
    3009 *success = FALSE;
    3010
    3011 /* check if the conflict analysis is applicable */
    3012 if( !set->conf_enable || (set->conf_useinflp == 'o' && set->conf_useboundlp == 'o') )
    3013 return SCIP_OKAY;
    3014
    3015 /* in rare cases, it might happen that the solution stati of the LP and the LPI are out of sync; in particular this
    3016 * happens when a new incumbent which cuts off the current node is found during the LP solving loop; in this case the
    3017 * LP has status objlimit, but if diving has been used, the LPI only has the basis information, but is not solved
    3018 *
    3019 * @todo: alternatively, solve the LPI
    3020 */
    3021 if( !SCIPlpiWasSolved(SCIPlpGetLPI(lp)) )
    3022 return SCIP_OKAY;
    3023
    3024 /* LP conflict analysis is only valid, if all variables are known */
    3025 assert( SCIPprobAllColsInLP(transprob, set, lp) );
    3026 /* if the objective limit in the LP solver was disabled manually or during safe bounding in exact solving mode, then
    3027 * the optimal objective value can be bound exceeding, and we can arrive here even if LP status is optimal
    3028 */
    3030 || (SCIPlpGetSolstat(lp) == SCIP_LPSOLSTAT_OPTIMAL && (set->lp_disablecutoff == 1 || set->exact_enable)) );
    3031
    3032 /* save status */
    3033 storedsolvals.lpsolstat = lp->lpsolstat;
    3034 storedsolvals.lpobjval = lp->lpobjval;
    3035 storedsolvals.primalfeasible = lp->primalfeasible;
    3036 storedsolvals.primalchecked = lp->primalchecked;
    3037 storedsolvals.dualfeasible = lp->dualfeasible;
    3038 storedsolvals.dualchecked = lp->dualchecked;
    3039 storedsolvals.solisbasic = lp->solisbasic;
    3040 storedsolvals.lpissolved = lp->solved;
    3041
    3042 /* store solution values */
    3043 SCIP_CALL( SCIPsetAllocBufferArray(set, &storedcolsolvals, lp->ncols) );
    3044 SCIP_CALL( SCIPsetAllocBufferArray(set, &storedrowsolvals, lp->nrows) );
    3045 for( c = 0; c < lp->ncols; ++c )
    3046 {
    3047 SCIP_COL* col;
    3048
    3049 col = lp->cols[c];
    3050 assert( col != NULL );
    3051
    3052 storedcolsolvals[c].primsol = col->primsol;
    3053 storedcolsolvals[c].redcost = col->redcost;
    3054 storedcolsolvals[c].basisstatus = col->basisstatus; /*lint !e641 !e732*/
    3055 }
    3056 for( r = 0; r < lp->nrows; ++r )
    3057 {
    3058 SCIP_ROW* row;
    3059
    3060 row = lp->rows[r];
    3061 assert( row != NULL );
    3062
    3063 storedrowsolvals[r].dualsol = lp->lpsolstat == SCIP_LPSOLSTAT_INFEASIBLE ? row->dualfarkas : row->dualsol;
    3064 storedrowsolvals[r].activity = row->activity;
    3065 storedrowsolvals[r].basisstatus = row->basisstatus; /*lint !e641 !e732*/
    3066 }
    3067
    3068 /* check, if the LP was infeasible or bound exceeding */
    3070 {
    3071 SCIP_CALL( conflictAnalyzeInfeasibleLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree,
    3072 reopt, lp, branchcand, eventqueue, eventfilter, cliquetable, success) );
    3073 }
    3074 else
    3075 {
    3076 SCIP_CALL( conflictAnalyzeBoundexceedingLP(conflict, conflictstore, blkmem, set, stat, transprob, origprob, tree,
    3077 reopt, lp, branchcand, eventqueue, eventfilter, cliquetable, success) );
    3078 }
    3079
    3080 /* possibly restore solution values */
    3082 {
    3083 /* restore status */
    3084 lp->lpsolstat = storedsolvals.lpsolstat;
    3085 lp->lpobjval = storedsolvals.lpobjval;
    3086 lp->primalfeasible = storedsolvals.primalfeasible;
    3087 lp->primalchecked = storedsolvals.primalchecked;
    3088 lp->dualfeasible = storedsolvals.dualfeasible;
    3089 lp->dualchecked = storedsolvals.dualchecked;
    3090 lp->solisbasic = storedsolvals.solisbasic;
    3091 lp->solved = storedsolvals.lpissolved;
    3092
    3093 for( c = 0; c < lp->ncols; ++c )
    3094 {
    3095 SCIP_COL* col;
    3096
    3097 col = lp->cols[c];
    3098 assert( col != NULL );
    3099 col->primsol = storedcolsolvals[c].primsol;
    3100 col->redcost = storedcolsolvals[c].redcost;
    3101 col->basisstatus = storedcolsolvals[c].basisstatus; /*lint !e641 !e732*/
    3102 }
    3103 for( r = 0; r < lp->nrows; ++r )
    3104 {
    3105 SCIP_ROW* row;
    3106
    3107 row = lp->rows[r];
    3108 assert( row != NULL );
    3109
    3111 row->dualfarkas = storedrowsolvals[r].dualsol;
    3112 else
    3113 {
    3114 assert( lp->lpsolstat == SCIP_LPSOLSTAT_OBJLIMIT );
    3115 row->dualsol = storedrowsolvals[r].dualsol;
    3116 }
    3117 row->activity = storedrowsolvals[r].activity;
    3118 row->basisstatus = storedrowsolvals[r].basisstatus; /*lint !e641 !e732*/
    3119 }
    3120 }
    3121 SCIPsetFreeBufferArray(set, &storedrowsolvals);
    3122 SCIPsetFreeBufferArray(set, &storedcolsolvals);
    3123
    3124 return SCIP_OKAY;
    3125}
    SCIP_RETCODE SCIPcertificatePrintAggrrow(SCIP_SET *set, SCIP_PROB *prob, SCIP_CERTIFICATE *certificate, SCIP_AGGRROW *aggrrow, SCIP_ROW **aggrrows, SCIP_Real *weights, int naggrrows, SCIP_Bool local, SCIP_Longint *certificateline)
    SCIP_CERTIFICATE * SCIPgetCertificate(SCIP *scip)
    SCIP_Longint SCIPcertificateGetRowIndex(SCIP_CERTIFICATE *certificate, SCIP_ROWEXACT *row, SCIP_Bool rhs)
    SCIP_RETCODE SCIPcertificatePrintMirCut(SCIP_SET *set, SCIP_LP *lp, SCIP_CERTIFICATE *certificate, SCIP_PROB *prob, SCIP_ROW *row, const char sense)
    SCIP_RETCODE SCIPcertificatePrintCutoffBound(SCIP *scip, SCIP_CERTIFICATE *certificate, SCIP_RATIONAL *bound, SCIP_Longint *certificateline)
    methods for certificate output
    SCIP_Real * r
    Definition: circlepacking.c:59
    void SCIPclockStop(SCIP_CLOCK *clck, SCIP_SET *set)
    Definition: clock.c:360
    void SCIPclockEnableOrDisable(SCIP_CLOCK *clck, SCIP_Bool enable)
    Definition: clock.c:260
    void SCIPclockStart(SCIP_CLOCK *clck, SCIP_SET *set)
    Definition: clock.c:290
    SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
    Definition: clock.c:438
    void SCIPclockFree(SCIP_CLOCK **clck)
    Definition: clock.c:185
    SCIP_RETCODE SCIPclockCreate(SCIP_CLOCK **clck, SCIP_CLOCKTYPE clocktype)
    Definition: clock.c:170
    internal methods for clocks and timing issues
    internal methods for conflict analysis
    void SCIPproofsetFree(SCIP_PROOFSET **proofset, BMS_BLKMEM *blkmem)
    SCIP_RETCODE SCIPconflictInitProofset(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem)
    SCIP_RETCODE SCIPconflictFlushProofset(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable)
    SCIP_RETCODE SCIPconflictAnalyzeDualProof(SCIP_CONFLICT *conflict, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTFILTER *eventfilter, BMS_BLKMEM *blkmem, SCIP_PROB *origprob, SCIP_PROB *transprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_AGGRROW *proofrow, int validdepth, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool initialproof, SCIP_Bool *globalinfeasible, SCIP_Bool *success)
    int SCIPproofsetGetNVars(SCIP_PROOFSET *proofset)
    int SCIPconflictGetNConflicts(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedGlobalConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsInfLocal(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedLocalLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNResConflictVars(SCIP_CONFLICT *conflict)
    #define SOLSTOP
    SCIP_Longint SCIPconflictGetNPropCalls(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsInfNonzeros(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNStrongbranchIterations(SCIP_CONFLICT *conflict)
    SCIP_Real SCIPconflictGetInfeasibleLPTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNInfeasibleLPCalls(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPgetFarkasProof(SCIP_SET *set, SCIP_PROB *prob, SCIP_LP *lp, SCIP_LPI *lpi, SCIP_TREE *tree, SCIP_AGGRROW *farkasrow, SCIP_Real *farkasact, int *validdepth, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool *valid)
    SCIP_RETCODE SCIPconflictCreate(SCIP_CONFLICT **conflict, BMS_BLKMEM *blkmem, SCIP_SET *set)
    SCIP_Real SCIPconflictGetGlobalApplTime(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPgetDualProof(SCIP_SET *set, SCIP_PROB *transprob, SCIP_LP *lp, SCIP_LPI *lpi, SCIP_TREE *tree, SCIP_AGGRROW *farkasrow, SCIP_Real *farkasact, int *validdepth, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool *valid)
    SCIP_Longint SCIPconflictGetNInfeasibleLPSuccess(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPReconvergenceConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNGlobalChgBds(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPconflictClearQueues(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedLiterals(SCIP_CONFLICT *conflict)
    static SCIP_Bool checkDualFeasibility(SCIP_SET *set, SCIP_ROW *row, SCIP_Real weight, SCIP_Bool *zerocontribution)
    SCIP_RETCODE SCIPconflictAnalyzeLP(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool *success)
    SCIP_Longint SCIPconflictGetNPropConflictLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedConss(SCIP_CONFLICT *conflict)
    static SCIP_DECL_SORTPTRCOMP(conflictBdchginfoComp)
    SCIP_Longint SCIPconflictGetNInfeasibleLPConflictConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPConflictConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPSuccess(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNStrongbranchCalls(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNInfeasibleLPReconvergenceLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPropReconvergenceConss(SCIP_CONFLICT *conflict)
    SCIP_Real SCIPconflictGetBoundexceedingLPTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNStrongbranchReconvergenceLiterals(SCIP_CONFLICT *conflict)
    static SCIP_RETCODE conflictAnalyzeBoundexceedingLP(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool *success)
    SCIP_Real SCIPconflictGetPseudoTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPseudoReconvergenceLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPropReconvergenceLiterals(SCIP_CONFLICT *conflict)
    SCIP_Bool SCIPconflictApplicable(SCIP_SET *set)
    static SCIP_RETCODE conflictAnalyzeInfeasibleLP(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool *success)
    static SCIP_RETCODE addLocalRows(SCIP_SET *set, SCIP_PROB *transprob, SCIP_LP *lp, SCIP_AGGRROW *proofrow, SCIP_ROW **rows, SCIP_Real *dualsols, int *localrowinds, int *localrowdepth, int nlocalrows, SCIP_Real *proofact, int *validdepth, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool *valid)
    static SCIP_Real aggrRowGetMinActivitySafely(SCIP_SET *set, SCIP_PROB *transprob, SCIP_AGGRROW *aggrrow, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool *infdelta)
    SCIP_Longint SCIPconflictGetNInfeasibleLPReconvergenceConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedLocalConss(SCIP_CONFLICT *conflict)
    static SCIP_RETCODE sortLocalRows(SCIP_SET *set, SCIP_AGGRROW *aggrrow, SCIP_ROW **rows, int *rowinds, int *rowdepth, int nrows)
    SCIP_RETCODE SCIPconflictAnalyzeStrongbranch(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_COL *col, SCIP_Bool *downconflict, SCIP_Bool *upconflict)
    SCIP_Longint SCIPconflictGetNStrongbranchReconvergenceConss(SCIP_CONFLICT *conflict)
    SCIP_Real SCIPconflictGetVarUb(SCIP_CONFLICT *conflict, SCIP_VAR *var)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPConflictLiterals(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPconflictAnalyzePseudo(SCIP_CONFLICT *conflict, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool *success)
    #define NUMSTOP
    SCIP_Real SCIPconflictGetStrongbranchTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPseudoSuccess(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNInfeasibleLPConflictLiterals(SCIP_CONFLICT *conflict)
    SCIP_Real SCIPaggrRowGetMinActivity(SCIP_SET *set, SCIP_PROB *transprob, SCIP_AGGRROW *aggrrow, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, SCIP_Bool *infdelta)
    SCIP_Longint SCIPconflictGetNPseudoConflictLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNLocalChgBds(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsBndSuccess(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPropSuccess(SCIP_CONFLICT *conflict)
    static SCIP_RETCODE getObjectiveRow(SCIP *scip, SCIP_ROW **row, SCIP_Real rhs, SCIP_Bool *success)
    SCIP_Longint SCIPconflictGetNDualproofsInfSuccess(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPCalls(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPropConflictConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNStrongbranchSuccess(SCIP_CONFLICT *conflict)
    static SCIP_RETCODE addRowToAggrRow(SCIP_SET *set, SCIP_ROW *row, SCIP_Real weight, SCIP_AGGRROW *aggrrow, SCIP_Bool safely, SCIP_Bool *success)
    SCIP_Real SCIPconflictGetResTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsBndGlobal(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPseudoReconvergenceConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNAppliedGlobalLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsBndLocal(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPseudoCalls(SCIP_CONFLICT *conflict)
    static SCIP_RETCODE conflictAnalyzeLP(SCIP_CONFLICT *conflict, SCIP_CONFLICTSTORE *conflictstore, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool diving, SCIP_Bool *dualproofsuccess, int *iterations, int *nconss, int *nliterals, int *nreconvconss, int *nreconvliterals, SCIP_Bool marklpunsolved)
    SCIP_Longint SCIPconflictGetNAppliedResConss(SCIP_CONFLICT *conflict)
    void SCIPconflictEnableOrDisableClocks(SCIP_CONFLICT *conflict, SCIP_Bool enable)
    SCIP_Real SCIPconflictGetPropTime(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPIterations(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNStrongbranchConflictLiterals(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNPseudoConflictConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsBndNonzeros(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNDualproofsInfGlobal(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNBoundexceedingLPReconvergenceLiterals(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPconflictFree(SCIP_CONFLICT **conflict, BMS_BLKMEM *blkmem)
    SCIP_Real SCIPconflictGetVarLb(SCIP_CONFLICT *conflict, SCIP_VAR *var)
    SCIP_Longint SCIPconflictGetNStrongbranchConflictConss(SCIP_CONFLICT *conflict)
    SCIP_Longint SCIPconflictGetNInfeasibleLPIterations(SCIP_CONFLICT *conflict)
    SCIP_RETCODE SCIPconflictFlushConss(SCIP_CONFLICT *conflict, 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_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable)
    void SCIPconflictsetFree(SCIP_CONFLICTSET **conflictset, BMS_BLKMEM *blkmem)
    SCIP_RETCODE SCIPconflictAnalyzeRemainingBdchgs(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *prob, SCIP_TREE *tree, SCIP_Bool diving, int *lbchginfoposs, int *ubchginfoposs, int *nconss, int *nliterals, int *nreconvconss, int *nreconvliterals)
    SCIP_RETCODE SCIPrunBoundHeuristic(SCIP_CONFLICT *conflict, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *origprob, SCIP_PROB *transprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_LPI *lpi, SCIP_EVENTFILTER *eventfilter, BMS_BLKMEM *blkmem, SCIP_Real *proofcoefs, SCIP_Real *prooflhs, SCIP_Real *proofactivity, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, int *lbchginfoposs, int *ubchginfoposs, int *iterations, SCIP_Bool marklpunsolved, SCIP_Bool *dualproofsuccess, SCIP_Bool *valid)
    SCIP_RETCODE SCIPundoBdchgsProof(SCIP_SET *set, SCIP_PROB *prob, int currentdepth, SCIP_Real *proofcoefs, SCIP_Real prooflhs, SCIP_Real *proofact, SCIP_Real *curvarlbs, SCIP_Real *curvarubs, int *lbchginfoposs, int *ubchginfoposs, SCIP_LPBDCHGS *oldlpbdchgs, SCIP_LPBDCHGS *relaxedlpbdchgs, SCIP_Bool *resolve, SCIP_LPI *lpi)
    SCIP_RETCODE SCIPconflictsetCreate(SCIP_CONFLICTSET **conflictset, BMS_BLKMEM *blkmem)
    void SCIPconflictRowFree(SCIP_CONFLICTROW **row, BMS_BLKMEM *blkmem)
    SCIP_RETCODE SCIPconflictInitRows(SCIP_CONFLICT *conflict, BMS_BLKMEM *blkmem)
    internal methods for storing conflicts
    internal methods for constraints and constraint handlers
    Constraint handler for linear constraints in their most general form, .
    methods for the aggregation rows
    #define QUAD_EPSILON
    Definition: dbldblarith.h:42
    #define SCIPquadprecProdDD(r, a, b)
    Definition: dbldblarith.h:58
    #define QUAD_ASSIGN(a, constant)
    Definition: dbldblarith.h:51
    #define QUAD(x)
    Definition: dbldblarith.h:47
    #define SCIPquadprecSumQQ(r, a, b)
    Definition: dbldblarith.h:67
    #define QUAD_TO_DBL(x)
    Definition: dbldblarith.h:49
    #define NULL
    Definition: def.h:255
    #define EPSGE(x, y, eps)
    Definition: def.h:194
    #define SCIP_Longint
    Definition: def.h:148
    #define SCIP_Bool
    Definition: def.h:98
    #define EPSLE(x, y, eps)
    Definition: def.h:192
    #define SCIP_ALLOC(x)
    Definition: def.h:373
    #define SCIP_Real
    Definition: def.h:163
    #define ABS(x)
    Definition: def.h:223
    #define TRUE
    Definition: def.h:100
    #define FALSE
    Definition: def.h:101
    #define SCIP_LONGINT_FORMAT
    Definition: def.h:155
    #define REALABS(x)
    Definition: def.h:189
    #define SCIP_LONGINT_MAX
    Definition: def.h:149
    #define SCIP_CALL(x)
    Definition: def.h:362
    SCIP_Bool SCIPisObjIntegral(SCIP *scip)
    Definition: scip_prob.c:1801
    SCIP_RETCODE SCIPhashmapInsertLong(SCIP_HASHMAP *hashmap, void *origin, SCIP_Longint image)
    Definition: misc.c:3215
    SCIP_RETCODE SCIPhashmapRemove(SCIP_HASHMAP *hashmap, void *origin)
    Definition: misc.c:3482
    SCIP_Longint SCIPhashmapGetImageLong(SCIP_HASHMAP *hashmap, void *origin)
    Definition: misc.c:3324
    SCIP_RETCODE SCIPlpiGetRealpar(SCIP_LPI *lpi, SCIP_LPPARAM type, SCIP_Real *dval)
    Definition: lpi_clp.cpp:3824
    SCIP_Real SCIPlpiInfinity(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:3947
    SCIP_Bool SCIPlpiIsObjlimExc(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2718
    SCIP_RETCODE SCIPlpiGetBase(SCIP_LPI *lpi, int *cstat, int *rstat)
    Definition: lpi_clp.cpp:2995
    SCIP_RETCODE SCIPlpiSetRealpar(SCIP_LPI *lpi, SCIP_LPPARAM type, SCIP_Real dval)
    Definition: lpi_clp.cpp:3861
    SCIP_RETCODE SCIPlpiGetDualfarkas(SCIP_LPI *lpi, SCIP_Real *dualfarkas)
    Definition: lpi_clp.cpp:2885
    SCIP_RETCODE SCIPlpiGetObjval(SCIP_LPI *lpi, SCIP_Real *objval)
    Definition: lpi_clp.cpp:2794
    SCIP_RETCODE SCIPlpiStartStrongbranch(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2034
    SCIP_RETCODE SCIPlpiChgBounds(SCIP_LPI *lpi, int ncols, const int *ind, const SCIP_Real *lb, const SCIP_Real *ub)
    Definition: lpi_clp.cpp:1096
    SCIP_Bool SCIPlpiIsDualFeasible(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2637
    SCIP_RETCODE SCIPlpiSetIntpar(SCIP_LPI *lpi, SCIP_LPPARAM type, int ival)
    Definition: lpi_clp.cpp:3720
    SCIP_RETCODE SCIPlpiSetBase(SCIP_LPI *lpi, const int *cstat, const int *rstat)
    Definition: lpi_clp.cpp:3095
    SCIP_Bool SCIPlpiWasSolved(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2414
    SCIP_Bool SCIPlpiIsOptimal(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2651
    SCIP_RETCODE SCIPlpiEndStrongbranch(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2046
    SCIP_RETCODE SCIPlpiGetSol(SCIP_LPI *lpi, SCIP_Real *objval, SCIP_Real *primsol, SCIP_Real *dualsol, SCIP_Real *activity, SCIP_Real *redcost)
    Definition: lpi_clp.cpp:2816
    SCIP_Bool SCIPlpiHasDualRay(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2584
    SCIP_Bool SCIPlpiIsPrimalInfeasible(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2530
    SCIP_RETCODE SCIPlpiSolveDual(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:1908
    SCIP_RETCODE SCIPlpiGetIterations(SCIP_LPI *lpi, int *iterations)
    Definition: lpi_clp.cpp:2949
    SCIP_Bool SCIPlpiIsStable(SCIP_LPI *lpi)
    Definition: lpi_clp.cpp:2675
    void SCIPpqueueClear(SCIP_PQUEUE *pqueue)
    Definition: misc.c:1335
    void SCIPpqueueFree(SCIP_PQUEUE **pqueue)
    Definition: misc.c:1324
    SCIP_RETCODE SCIPpqueueCreate(SCIP_PQUEUE **pqueue, int initsize, SCIP_Real sizefac, SCIP_DECL_SORTPTRCOMP((*ptrcomp)), SCIP_DECL_PQUEUEELEMCHGPOS((*elemchgpos)))
    Definition: misc.c:1297
    SCIP_Bool SCIPisCertified(SCIP *scip)
    SCIP_VAR * SCIPcolGetVar(SCIP_COL *col)
    Definition: lp.c:17425
    void SCIPaggrRowClearSafely(SCIP_AGGRROW *aggrrow)
    Definition: cuts.c:3196
    SCIP_RETCODE SCIPaggrRowCreate(SCIP *scip, SCIP_AGGRROW **aggrrow)
    Definition: cuts.c:2668
    SCIP_RETCODE SCIPaggrRowAddRowSafely(SCIP *scip, SCIP_AGGRROW *aggrrow, SCIP_ROW *row, SCIP_Real weight, int sidetype, SCIP_Bool *success)
    Definition: cuts.c:2887
    void SCIPaggrRowClear(SCIP_AGGRROW *aggrrow)
    Definition: cuts.c:3218
    SCIP_Real SCIPaggrRowGetRhs(SCIP_AGGRROW *aggrrow)
    Definition: cuts.c:4068
    void SCIPaggrRowFree(SCIP *scip, SCIP_AGGRROW **aggrrow)
    Definition: cuts.c:2700
    int * SCIPaggrRowGetInds(SCIP_AGGRROW *aggrrow)
    Definition: cuts.c:4028
    void SCIPaggrRowRemoveZeros(SCIP *scip, SCIP_AGGRROW *aggrrow, SCIP_Bool useglbbounds, SCIP_Bool *valid)
    Definition: cuts.c:3949
    int SCIPaggrRowGetNNz(SCIP_AGGRROW *aggrrow)
    Definition: cuts.c:4038
    SCIP_RETCODE SCIPaggrRowAddRow(SCIP *scip, SCIP_AGGRROW *aggrrow, SCIP_ROW *row, SCIP_Real weight, int sidetype)
    Definition: cuts.c:2804
    static INLINE SCIP_Real SCIPaggrRowGetProbvarValue(SCIP_AGGRROW *aggrrow, int probindex)
    Definition: cuts.h:297
    SCIP_RETCODE SCIPaggrRowAddObjectiveFunction(SCIP *scip, SCIP_AGGRROW *aggrrow, SCIP_Real rhs, SCIP_Real scale)
    Definition: cuts.c:3067
    SCIP_Bool SCIPisExact(SCIP *scip)
    Definition: scip_exact.c:193
    void SCIPintervalSetRoundingModeUpwards(void)
    void SCIPintervalSetRoundingModeDownwards(void)
    SCIP_ROUNDMODE SCIPintervalGetRoundingMode(void)
    void SCIPintervalSetRoundingMode(SCIP_ROUNDMODE roundmode)
    int SCIP_ROUNDMODE
    Definition: intervalarith.h:65
    SCIP_RETCODE SCIPreleaseRowExact(SCIP *scip, SCIP_ROWEXACT **row)
    Definition: scip_lpexact.c:110
    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_ROW ** SCIPgetLPRows(SCIP *scip)
    Definition: scip_lp.c:611
    SCIP_COL ** SCIPgetLPCols(SCIP *scip)
    Definition: scip_lp.c:512
    int SCIPgetNLPCols(SCIP *scip)
    Definition: scip_lp.c:533
    BMS_BUFMEM * SCIPbuffer(SCIP *scip)
    Definition: scip_mem.c:72
    #define SCIPallocBufferArray(scip, ptr, num)
    Definition: scip_mem.h:124
    #define SCIPfreeBufferArray(scip, ptr)
    Definition: scip_mem.h:136
    #define SCIPfreeBufferArrayNull(scip, ptr)
    Definition: scip_mem.h:137
    SCIP_Bool SCIPrationalIsFpRepresentable(SCIP_RATIONAL *rational)
    Definition: rational.cpp:1711
    void SCIPrationalRoundInteger(SCIP_RATIONAL *res, SCIP_RATIONAL *src, SCIP_ROUNDMODE_RAT roundmode)
    Definition: rational.cpp:2157
    void SCIPrationalSetReal(SCIP_RATIONAL *res, SCIP_Real real)
    Definition: rational.cpp:604
    void SCIPrationalFreeBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
    Definition: rational.cpp:474
    SCIP_RETCODE SCIPrationalCreateBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
    Definition: rational.cpp:124
    SCIP_Bool SCIPrationalIsZero(SCIP_RATIONAL *rational)
    Definition: rational.cpp:1625
    void SCIPrationalSetNegInfinity(SCIP_RATIONAL *res)
    Definition: rational.cpp:631
    SCIP_Bool SCIPrationalIsInfinity(SCIP_RATIONAL *rational)
    Definition: rational.cpp:1661
    SCIP_Real SCIPrationalRoundReal(SCIP_RATIONAL *rational, SCIP_ROUNDMODE_RAT roundmode)
    Definition: rational.cpp:2109
    SCIP_Bool SCIPrationalIsNegInfinity(SCIP_RATIONAL *rational)
    Definition: rational.cpp:1671
    int SCIProwGetLPDepth(SCIP_ROW *row)
    Definition: lp.c:17906
    int SCIProwGetNNonz(SCIP_ROW *row)
    Definition: lp.c:17607
    const char * SCIProwGetName(SCIP_ROW *row)
    Definition: lp.c:17745
    SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
    Definition: scip_lp.c:1508
    SCIP_RETCODE SCIPcreateRowUnspec(SCIP *scip, SCIP_ROW **row, const char *name, int len, SCIP_COL **cols, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
    Definition: scip_lp.c:1335
    SCIP_ROWORIGINTYPE SCIProwGetOrigintype(SCIP_ROW *row)
    Definition: lp.c:17825
    SCIP_RATIONAL * SCIPgetCutoffboundExact(SCIP *scip)
    SCIP_Real SCIPgetCutoffbound(SCIP *scip)
    SCIP_Real SCIPinfinity(SCIP *scip)
    SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
    SCIP_Bool SCIPbdchginfoIsRedundant(SCIP_BDCHGINFO *bdchginfo)
    Definition: var.c:25057
    SCIP_BDCHGIDX * SCIPbdchginfoGetIdx(SCIP_BDCHGINFO *bdchginfo)
    Definition: var.c:24979
    SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
    Definition: var.c:24268
    SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
    Definition: var.c:23900
    SCIP_Real SCIPvarGetUbGlobal(SCIP_VAR *var)
    Definition: var.c:24142
    int SCIPvarGetProbindex(SCIP_VAR *var)
    Definition: var.c:23662
    const char * SCIPvarGetName(SCIP_VAR *var)
    Definition: var.c:23267
    SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
    Definition: var.c:24234
    SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
    Definition: var.c:24120
    SCIP_Bool SCIPbdchgidxIsEarlierNonNull(SCIP_BDCHGIDX *bdchgidx1, SCIP_BDCHGIDX *bdchgidx2)
    Definition: var.c:24869
    void SCIPsortIntInt(int *intarray1, int *intarray2, int len)
    void SCIPsortIntIntInt(int *intarray1, int *intarray2, int *intarray3, int len)
    internal methods for branching and inference history
    SCIP_Bool SCIPlpDivingObjChanged(SCIP_LP *lp)
    Definition: lp.c:18261
    SCIP_LPSOLSTAT SCIPlpGetSolstat(SCIP_LP *lp)
    Definition: lp.c:13420
    SCIP_LPI * SCIPlpGetLPI(SCIP_LP *lp)
    Definition: lp.c:18178
    SCIP_Bool SCIPlpDiving(SCIP_LP *lp)
    Definition: lp.c:18251
    int SCIPlpGetNCols(SCIP_LP *lp)
    Definition: lp.c:17979
    SCIP_ROW ** SCIPlpGetRows(SCIP_LP *lp)
    Definition: lp.c:18016
    int SCIPlpGetNRows(SCIP_LP *lp)
    Definition: lp.c:18026
    SCIP_Real SCIPlpGetPseudoObjval(SCIP_LP *lp, SCIP_SET *set, SCIP_PROB *prob)
    Definition: lp.c:13619
    internal methods for LP management
    internal methods for exact LP management
    interface methods for specific LP solvers
    #define BMSfreeMemory(ptr)
    Definition: memory.h:145
    #define BMSclearMemoryArray(ptr, num)
    Definition: memory.h:130
    struct BMS_BlkMem BMS_BLKMEM
    Definition: memory.h:437
    #define BMSfreeMemoryArrayNull(ptr)
    Definition: memory.h:148
    #define BMSallocMemory(ptr)
    Definition: memory.h:118
    methods commonly used for presolving
    SCIP_Bool SCIPprobIsObjIntegral(SCIP_PROB *prob)
    Definition: prob.c:2813
    int SCIPprobGetNVars(SCIP_PROB *prob)
    Definition: prob.c:2868
    SCIP_VAR ** SCIPprobGetVars(SCIP_PROB *prob)
    Definition: prob.c:2913
    SCIP_Bool SCIPprobAllColsInLP(SCIP_PROB *prob, SCIP_SET *set, SCIP_LP *lp)
    Definition: prob.c:2825
    internal methods for storing and manipulating the main problem
    internal methods for propagators
    public methods for conflict analysis handlers
    public methods for managing constraints
    public methods for LP management
    public methods for message output
    #define SCIPdebugMessage
    Definition: pub_message.h:96
    public data structures and miscellaneous methods
    methods for sorting joint arrays of various types
    public methods for handling parameter settings
    public methods for propagators
    public methods for branch and bound tree
    public methods for problem variables
    public methods for certified solving
    public methods for conflict handler plugins and conflict analysis
    public methods for constraint handler plugins and constraints
    public methods for exact solving
    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 global and local (sub)problems
    public methods for solutions
    public methods for querying solving statistics
    public methods for SCIP variables
    SCIP_Bool SCIPsetIsDualfeasZero(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:7292
    SCIP_Bool SCIPsetIsGE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6617
    SCIP_Real SCIPsetFeasCeil(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:7136
    SCIP_Bool SCIPsetIsFeasGT(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:7017
    SCIP_Bool SCIPsetIsFeasLE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6993
    SCIP_Bool SCIPsetIsFeasEQ(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6945
    SCIP_Bool SCIPsetIsLE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6577
    SCIP_Real SCIPsetFeasFloor(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:7124
    SCIP_Bool SCIPsetIsEQ(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6537
    SCIP_Real SCIPsetInfinity(SCIP_SET *set)
    Definition: set.c:6380
    SCIP_Bool SCIPsetIsLT(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6557
    SCIP_Bool SCIPsetIsInfinity(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:6515
    SCIP_Bool SCIPsetIsGT(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6597
    SCIP_Bool SCIPsetIsZero(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:6637
    SCIP_Real SCIPsetCutoffbounddelta(SCIP_SET *set)
    Definition: set.c:6480
    internal methods for global SCIP settings
    #define SCIPsetFreeBufferArray(set, ptr)
    Definition: set.h:1782
    #define SCIPsetAllocBufferArray(set, ptr, num)
    Definition: set.h:1775
    #define SCIPsetDebugMsg
    Definition: set.h:1811
    internal methods for storing primal CIP solutions
    SCIP_Longint certificateline
    Definition: struct_cuts.h:53
    SCIP_Real * vals
    Definition: struct_cuts.h:42
    SCIP_Real * rowweights
    Definition: struct_cuts.h:46
    int * rowsinds
    Definition: struct_cuts.h:44
    SCIP_HASHMAP * rowdatahash
    SCIP_RATIONAL * obj
    SCIP_RATIONAL * ub
    SCIP_VAR * var
    SCIP_RATIONAL * lb
    SCIP_Real primsol
    Definition: struct_lp.h:96
    unsigned int basisstatus
    Definition: struct_lp.h:98
    SCIP_Real redcost
    Definition: struct_lp.h:97
    SCIP_Real lb
    Definition: struct_lp.h:140
    SCIP_Real ub
    Definition: struct_lp.h:141
    SCIP_Real sbdown
    Definition: struct_lp.h:155
    SCIP_Real sbup
    Definition: struct_lp.h:156
    unsigned int basisstatus
    Definition: struct_lp.h:181
    SCIP_Real redcost
    Definition: struct_lp.h:151
    unsigned int sbupvalid
    Definition: struct_lp.h:193
    SCIP_Real primsol
    Definition: struct_lp.h:150
    int lpipos
    Definition: struct_lp.h:175
    unsigned int sbdownvalid
    Definition: struct_lp.h:191
    SCIP_CONFTYPE conflicttype
    unsigned int usescutoffbound
    SCIP_Longint ninflpiterations
    SCIP_Longint ndualproofsbndglobal
    SCIP_PROOFSET * proofset
    SCIP_Longint ndualproofsinfsuccess
    SCIP_Longint nappliedglbconss
    SCIP_Longint nsbiterations
    SCIP_Longint npropconfconss
    SCIP_Longint ninflpconfconss
    SCIP_Longint npseudoreconvliterals
    SCIP_CLOCK * dIBclock
    SCIP_Longint npseudosuccess
    SCIP_Longint ninflpconfliterals
    SCIP_Longint nsbsuccess
    SCIP_CLOCK * propanalyzetime
    SCIP_Longint nboundlpconfliterals
    SCIP_Longint nsbcalls
    SCIP_Longint ndualproofsinflocal
    SCIP_Longint npseudoconfconss
    SCIP_Longint nboundlpcalls
    SCIP_PQUEUE * forcedbdchgqueue
    SCIP_Longint nappliedglbliterals
    SCIP_Longint nboundlpreconvliterals
    SCIP_Longint npseudocalls
    SCIP_Longint ninflpreconvconss
    SCIP_Longint nglbchgbds
    SCIP_Longint dualproofsbndnnonzeros
    SCIP_Bool bdchgonlyconfqueue
    SCIP_Longint nappliedglbresconss
    SCIP_Longint ninflpcalls
    SCIP_CLOCK * pseudoanalyzetime
    SCIP_Longint nsbconfliterals
    SCIP_CLOCK * inflpanalyzetime
    SCIP_Longint nboundlpiterations
    SCIP_Longint npseudoreconvconss
    SCIP_Longint npseudoconfliterals
    SCIP_Longint nlocchgbds
    SCIP_Longint nsbreconvconss
    SCIP_PQUEUE * bdchgqueue
    SCIP_Longint nsbreconvliterals
    SCIP_Longint npropsuccess
    SCIP_Longint ndualproofsinfglobal
    SCIP_Longint nresconfvariables
    SCIP_Longint nappliedlocconss
    SCIP_Longint nsbconfconss
    SCIP_Longint ninflpsuccess
    SCIP_CLOCK * sbanalyzetime
    SCIP_Longint npropcalls
    SCIP_Longint nboundlpreconvconss
    SCIP_CLOCK * resanalyzetime
    SCIP_Longint ndualproofsbndsuccess
    SCIP_Longint dualproofsinfnnonzeros
    SCIP_Longint nboundlpconfconss
    SCIP_Longint npropreconvliterals
    SCIP_CLOCK * boundlpanalyzetime
    SCIP_Longint nboundlpsuccess
    SCIP_Longint npropconfliterals
    SCIP_Longint ninflpreconvliterals
    SCIP_CONFLICTSET * conflictset
    SCIP_Longint ndualproofsbndlocal
    SCIP_Longint nappliedlocliterals
    SCIP_Longint npropreconvconss
    SCIP_Bool dualchecked
    Definition: struct_lp.h:124
    SCIP_Bool solisbasic
    Definition: struct_lp.h:125
    SCIP_Bool dualfeasible
    Definition: struct_lp.h:123
    SCIP_Bool primalfeasible
    Definition: struct_lp.h:121
    SCIP_Bool primalchecked
    Definition: struct_lp.h:122
    SCIP_Real lpobjval
    Definition: struct_lp.h:120
    SCIP_Bool lpissolved
    Definition: struct_lp.h:126
    SCIP_LPSOLSTAT lpsolstat
    Definition: struct_lp.h:119
    SCIP_ROW ** rows
    Definition: struct_lp.h:308
    SCIP_ROW ** lpirows
    Definition: struct_lp.h:303
    int lpiitlim
    Definition: struct_lp.h:351
    SCIP_Bool primalfeasible
    Definition: struct_lp.h:374
    SCIP_COL ** cols
    Definition: struct_lp.h:306
    int ncols
    Definition: struct_lp.h:334
    SCIP_Real cutoffbound
    Definition: struct_lp.h:289
    SCIP_Bool dualfeasible
    Definition: struct_lp.h:376
    SCIP_Bool solisbasic
    Definition: struct_lp.h:378
    int nrows
    Definition: struct_lp.h:340
    SCIP_Bool primalchecked
    Definition: struct_lp.h:375
    SCIP_LPSOLSTAT lpsolstat
    Definition: struct_lp.h:359
    int nlpicols
    Definition: struct_lp.h:323
    SCIP_Real lpobjval
    Definition: struct_lp.h:276
    int nlpirows
    Definition: struct_lp.h:326
    SCIP_Bool solved
    Definition: struct_lp.h:373
    SCIP_Bool dualchecked
    Definition: struct_lp.h:377
    SCIP_LPI * lpi
    Definition: struct_lp.h:301
    SCIP_Bool flushed
    Definition: struct_lp.h:372
    SCIP_Real lpiobjlim
    Definition: struct_lp.h:291
    SCIP_VAR ** vars
    Definition: struct_prob.h:67
    SCIP_Real activity
    Definition: struct_lp.h:109
    unsigned int basisstatus
    Definition: struct_lp.h:110
    SCIP_Real dualsol
    Definition: struct_lp.h:108
    unsigned int basisstatus
    Definition: struct_lp.h:255
    SCIP_Real rhs
    Definition: struct_lp.h:208
    SCIP_Real dualfarkas
    Definition: struct_lp.h:218
    SCIP_Real * vals
    Definition: struct_lp.h:232
    unsigned int local
    Definition: struct_lp.h:264
    SCIP_Real lhs
    Definition: struct_lp.h:207
    SCIP_COL ** cols
    Definition: struct_lp.h:230
    SCIP_ROWEXACT * rowexact
    Definition: struct_lp.h:235
    SCIP_Real constant
    Definition: struct_lp.h:206
    SCIP_Real activity
    Definition: struct_lp.h:217
    SCIP_Real dualsol
    Definition: struct_lp.h:216
    int lpdepth
    Definition: struct_lp.h:245
    int len
    Definition: struct_lp.h:239
    SCIP_Longint nconflictlps
    Definition: struct_stat.h:228
    SCIP_Longint nconflictlpiterations
    Definition: struct_stat.h:81
    SCIP_CLOCK * conflictlptime
    Definition: struct_stat.h:179
    int nubchginfos
    Definition: struct_var.h:325
    int conflictubcount
    Definition: struct_var.h:327
    SCIP_Real conflictrelaxedub
    Definition: struct_var.h:276
    SCIP_Real conflictub
    Definition: struct_var.h:274
    SCIP_Real conflictrelaxedlb
    Definition: struct_var.h:275
    int nlbchginfos
    Definition: struct_var.h:323
    SCIP_Real conflictlb
    Definition: struct_var.h:273
    int conflictlbcount
    Definition: struct_var.h:326
    data structures for certificate output
    datastructures for conflict analysis
    data structures for LP management
    data structures for exact LP management
    datastructures for storing and manipulating the main problem
    SCIP main data structure.
    datastructures for global SCIP settings
    datastructures for problem statistics
    data structures for branch and bound tree
    datastructures for problem variables
    Definition: heur_padm.c:135
    int SCIPtreeGetFocusDepth(SCIP_TREE *tree)
    Definition: tree.c:9443
    int SCIPtreeGetEffectiveRootDepth(SCIP_TREE *tree)
    Definition: tree.c:9557
    int SCIPtreeGetCurrentDepth(SCIP_TREE *tree)
    Definition: tree.c:9518
    internal methods for branch and bound tree
    @ SCIP_CLOCKTYPE_DEFAULT
    Definition: type_clock.h:43
    @ SCIP_CONFTYPE_BNDEXCEEDING
    Definition: type_conflict.h:64
    @ SCIP_CONFTYPE_INFEASLP
    Definition: type_conflict.h:63
    @ SCIP_ROWORIGINTYPE_SEPA
    Definition: type_lp.h:76
    @ 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_LPPAR_LPITLIM
    Definition: type_lpi.h:60
    @ SCIP_LPPAR_OBJLIM
    Definition: type_lpi.h:59
    @ SCIP_R_ROUND_UPWARDS
    Definition: type_rational.h:58
    @ SCIP_R_ROUND_DOWNWARDS
    Definition: type_rational.h:57
    @ SCIP_LPERROR
    Definition: type_retcode.h:49
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    SCIP_Real SCIPvarGetLbLP(SCIP_VAR *var, SCIP_SET *set)
    Definition: var.c:18568
    SCIP_Real SCIPvarGetUbLP(SCIP_VAR *var, SCIP_SET *set)
    Definition: var.c:18638
    internal methods for problem variables
    methods for creating output for visualization tools (VBC, BAK)