Scippy

    SCIP

    Solving Constraint Integer Programs

    concsolver.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 concsolver.c
    26 * @ingroup OTHER_CFILES
    27 * @brief methods for concurrent solvers
    28 * @author Leona Gottwald
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    33#include <assert.h>
    34#include <string.h>
    35
    36#include "scip/concsolver.h"
    37#include "scip/set.h"
    38#include "scip/scip.h"
    39#include "scip/concurrent.h"
    40
    42#include "scip/struct_stat.h"
    43#include "scip/struct_scip.h"
    45#include "scip/syncstore.h"
    46#include "scip/boundstore.h"
    47#include "scip/clock.h"
    48
    49
    50/** internal method for creating a concurrent solver type */
    51static
    53 SCIP_CONCSOLVERTYPE** concsolvertype, /**< pointer to concurrent solver data structure */
    54 SCIP_SET* set, /**< global SCIP settings */
    55 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    56 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    57 const char* name, /**< name of concurrent solver */
    58 SCIP_Real prefpriodefault, /**< the default preferred priority of this concurrent solver type */
    59 SCIP_DECL_CONCSOLVERCREATEINST ((*concsolvercreateinst)),/**< data copy method of concurrent solver */
    60 SCIP_DECL_CONCSOLVERDESTROYINST ((*concsolverdestroyinst)),/**< data copy method of concurrent solver */
    61 SCIP_DECL_CONCSOLVERINITSEEDS ((*concsolverinitseeds)),/**< initialize random seeds of concurrent solver */
    62 SCIP_DECL_CONCSOLVEREXEC ((*concsolverexec)),/**< execution method of concurrent solver */
    63 SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA ((*concsolvercopysolvdata)),/**< method to copy solving data */
    64 SCIP_DECL_CONCSOLVERSTOP ((*concsolverstop)),/**< terminate solving in concurrent solver */
    65 SCIP_DECL_CONCSOLVERSYNCWRITE ((*concsolversyncwrite)),/**< synchronization method of concurrent solver */
    66 SCIP_DECL_CONCSOLVERSYNCREAD ((*concsolversyncread)),/**< synchronization method of concurrent solver */
    67 SCIP_DECL_CONCSOLVERTYPEFREEDATA ((*concsolvertypefreedata)),/**< method to free data of concurrent solver type */
    68 SCIP_CONCSOLVERTYPEDATA* data /**< the concurrent solver type's data */
    69 )
    70{
    72 char paramdesc[SCIP_MAXSTRLEN];
    73
    74 assert(concsolvertype != NULL);
    75 assert(name != NULL);
    76 assert(prefpriodefault >= 0.0 && prefpriodefault <= 1.0);
    77
    78 assert(concsolvercreateinst != NULL);
    79 assert(concsolverdestroyinst != NULL);
    80 assert(concsolverexec != NULL);
    81 assert(concsolvercopysolvdata != NULL);
    82 assert(concsolverstop != NULL);
    83 assert(concsolversyncwrite != NULL);
    84 assert(concsolversyncread != NULL);
    85
    86 SCIP_ALLOC( BMSallocMemory(concsolvertype) );
    87 BMSclearMemory(*concsolvertype);
    88
    89 SCIP_ALLOC( BMSduplicateMemoryArray(&(*concsolvertype)->name, name, strlen(name) + 1) );
    90
    91 (*concsolvertype)->data = data;
    92 (*concsolvertype)->ninstances = 0;
    93 (*concsolvertype)->concsolvercreateinst = concsolvercreateinst;
    94 (*concsolvertype)->concsolverdestroyinst = concsolverdestroyinst;
    95 (*concsolvertype)->concsolverinitseeds = concsolverinitseeds;
    96 (*concsolvertype)->concsolverexec = concsolverexec;
    97 (*concsolvertype)->concsolvercopysolvdata = concsolvercopysolvdata;
    98 (*concsolvertype)->concsolverstop = concsolverstop;
    99 (*concsolvertype)->concsolversyncwrite = concsolversyncwrite;
    100 (*concsolvertype)->concsolversyncread = concsolversyncread;
    101 (*concsolvertype)->concsolvertypefreedata = concsolvertypefreedata;
    102
    103 (void) SCIPsnprintf(paramname, SCIP_MAXSTRLEN, "concurrent/%s/prefprio", name);
    104 (void) SCIPsnprintf(paramdesc, SCIP_MAXSTRLEN, "the preferred number concurrent solvers of type <%s> with respect to the number of threads", name);
    105 SCIP_CALL( SCIPsetAddRealParam(set, messagehdlr, blkmem, paramname, paramdesc,
    106 &(*concsolvertype)->prefprio, FALSE, prefpriodefault, 0.0, 1.0,
    107 NULL, NULL) ); /*lint !e740*/
    108
    109 return SCIP_OKAY;
    110}
    111
    112/** creates a concurrent solver type */
    114 SCIP_CONCSOLVERTYPE** concsolvertype, /**< pointer to concurrent solver data structure */
    115 SCIP_SET* set, /**< global SCIP settings */
    116 SCIP_MESSAGEHDLR* messagehdlr, /**< message handler */
    117 BMS_BLKMEM* blkmem, /**< block memory for parameter settings */
    118 const char* name, /**< name of concurrent solver */
    119 SCIP_Real prefpriodefault, /**< the default preferred priority of this concurrent solver type */
    120 SCIP_DECL_CONCSOLVERCREATEINST ((*concsolvercreateinst)),/**< data copy method of concurrent solver */
    121 SCIP_DECL_CONCSOLVERDESTROYINST ((*concsolverdestroyinst)),/**< data copy method of concurrent solver */
    122 SCIP_DECL_CONCSOLVERINITSEEDS ((*concsolverinitseeds)),/**< initialize random seeds of concurrent solver */
    123 SCIP_DECL_CONCSOLVEREXEC ((*concsolverexec)),/**< execution method of concurrent solver */
    124 SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA ((*concsolvercopysolvdata)),/**< method to copy solving data */
    125 SCIP_DECL_CONCSOLVERSTOP ((*concsolverstop)),/**< terminate solving in concurrent solver */
    126 SCIP_DECL_CONCSOLVERSYNCWRITE ((*concsolversyncwrite)),/**< synchronization method of concurrent solver */
    127 SCIP_DECL_CONCSOLVERSYNCREAD ((*concsolversyncread)),/**< synchronization method of concurrent solver */
    128 SCIP_DECL_CONCSOLVERTYPEFREEDATA ((*concsolvertypefreedata)),/**< method to free data of concurrent solver type */
    129 SCIP_CONCSOLVERTYPEDATA* data /**< the concurrent solver type's data */
    130 )
    131{
    132 assert(concsolvertype != NULL);
    133 assert(name != NULL);
    134 assert(prefpriodefault >= 0.0 && prefpriodefault <= 1.0);
    135
    136 assert(concsolvercreateinst != NULL);
    137 assert(concsolverdestroyinst != NULL);
    138 assert(concsolverexec != NULL);
    139 assert(concsolvercopysolvdata != NULL);
    140 assert(concsolverstop != NULL);
    141 assert(concsolversyncwrite != NULL);
    142 assert(concsolversyncread != NULL);
    143
    144 SCIP_CALL_FINALLY( doConcsolverTypeCreate(concsolvertype, set, messagehdlr, blkmem,
    145 name, prefpriodefault, concsolvercreateinst, concsolverdestroyinst, concsolverinitseeds, concsolverexec,
    146 concsolvercopysolvdata, concsolverstop, concsolversyncwrite, concsolversyncread, concsolvertypefreedata, data),
    147 SCIPconcsolverTypeFree(concsolvertype) );
    148
    149 return SCIP_OKAY;
    150}
    151
    152/** frees all memory of a concurrent solver type */
    154 SCIP_CONCSOLVERTYPE** concsolvertype /**< pointer to concurrent solver data structure */
    155 )
    156{
    157 assert(concsolvertype != NULL);
    158
    159 if( *concsolvertype == NULL )
    160 return;
    161
    162 if( (*concsolvertype)->concsolvertypefreedata != NULL )
    163 (*concsolvertype)->concsolvertypefreedata(&(*concsolvertype)->data);
    164
    165 BMSfreeMemoryArrayNull(&(*concsolvertype)->name);
    166 BMSfreeMemory(concsolvertype);
    167}
    168
    169/** gets the data of a concurrent solver type */
    171 SCIP_CONCSOLVERTYPE* concsolvertype /**< concurrent solver type */
    172 )
    173{
    174 assert(concsolvertype != NULL);
    175
    176 return concsolvertype->data;
    177}
    178
    179/** sets the data of a concurrent solver type */
    181 SCIP_CONCSOLVERTYPE* concsolvertype, /**< concurrent solver type */
    182 SCIP_CONCSOLVERTYPEDATA* data /**< the concurrent solver's data */
    183 )
    184{
    185 assert(concsolvertype != NULL);
    186
    187 concsolvertype->data = data;
    188}
    189
    190/** gets the name of a concurrent solver type */
    192 SCIP_CONCSOLVERTYPE* concsolvertype /**< concurrent solver type */
    193 )
    194{
    195 assert(concsolvertype != NULL);
    196
    197 return concsolvertype->name;
    198}
    199
    200/** gets the preferred priority from a concurrent solver type */
    202 SCIP_CONCSOLVERTYPE* concsolvertype /**< concurrent solver type */
    203 )
    204{
    205 assert(concsolvertype != NULL);
    206
    207 return concsolvertype->prefprio;
    208}
    209
    210/** creates an instance of the given concurrent solver type */
    212 SCIP_SET* set, /**< global SCIP settings */
    213 SCIP_CONCSOLVERTYPE* concsolvertype, /**< concurrent solver type to create */
    214 SCIP_CONCSOLVER** concsolver /**< pointer to return concurrent solver instance */
    215 )
    216{
    217 char instancename[SCIP_MAXSTRLEN];
    218
    219 ++concsolvertype->ninstances;
    220 (void) SCIPsnprintf(instancename, SCIP_MAXSTRLEN, "%s-%i", concsolvertype->name, concsolvertype->ninstances);
    221
    222 SCIP_ALLOC( BMSallocMemory(concsolver) );
    223 SCIP_ALLOC( BMSduplicateMemoryArray(&(*concsolver)->name, instancename, strlen(instancename) + 1) );
    224
    225 (*concsolver)->type = concsolvertype;
    226
    227 /* initialize counters for statistics */
    228 (*concsolver)->nsolsrecvd = 0;
    229 (*concsolver)->nsolsshared = 0;
    230 (*concsolver)->ntighterbnds = 0;
    231 (*concsolver)->ntighterintbnds = 0;
    232 SCIP_CALL( SCIPcreateWallClock(set->scip, &(*concsolver)->totalsynctime) );
    233
    234 /* initialize synchronization fields */
    235 (*concsolver)->nsyncs = 0;
    236 (*concsolver)->syncdelay = 0.0;
    237 (*concsolver)->timesincelastsync = 0.0;
    238
    239 /* in deterministic mode use number of nonzeros and variables to get a good initial synchronization frequency
    240 * in opportunistic mode use the frequency as set by the user
    241 */
    242 if( set->parallel_mode == (int) SCIP_PARA_DETERMINISTIC )
    243 (*concsolver)->syncfreq = 0.01 * set->scip->stat->nnz * SCIPgetNVars(set->scip) * set->concurrent_freqinit;
    244 else
    245 (*concsolver)->syncfreq = set->concurrent_freqinit;
    246
    247 (*concsolver)->syncdata = NULL;
    248
    249 SCIPdebugMessage("concsolver %s initialized sync freq to %f\n", (*concsolver)->name, (*concsolver)->syncfreq);
    250
    251 /* register concurrent solver */
    252 (*concsolver)->idx = SCIPgetNConcurrentSolvers(set->scip);
    253 SCIP_CALL( concsolvertype->concsolvercreateinst(set->scip, concsolvertype, *concsolver) );
    254 SCIP_CALL( SCIPaddConcurrentSolver(set->scip, *concsolver) );
    255
    256 return SCIP_OKAY;
    257}
    258
    259/** destroys an instance of the given concurrent solver */
    261 SCIP_SET* set, /**< global SCIP settings */
    262 SCIP_CONCSOLVER** concsolver /**< concurrent solver */
    263 )
    264{
    265 assert(concsolver != NULL);
    266 assert((*concsolver)->type != NULL);
    267 assert(set != NULL);
    268 assert((*concsolver)->type->concsolverdestroyinst != NULL);
    269
    270 SCIP_CALL( (*concsolver)->type->concsolverdestroyinst(set->scip, *concsolver) );
    271 --(*concsolver)->type->ninstances;
    272
    273 SCIP_CALL( SCIPfreeClock(set->scip, &(*concsolver)->totalsynctime) );
    274 BMSfreeMemoryArray(&(*concsolver)->name);
    275
    276 BMSfreeMemory(concsolver);
    277
    278 return SCIP_OKAY;
    279}
    280
    281/** gets the data of a concurrent solver */
    283 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    284 )
    285{
    286 assert(concsolver != NULL);
    287
    288 return concsolver->data;
    289}
    290
    291/** sets the data of a concurrent solver */
    293 SCIP_CONCSOLVER* concsolver, /**< concurrent solver */
    294 SCIP_CONCSOLVERDATA* data /**< the concurrent solver's data */
    295 )
    296{
    297 assert(concsolver != NULL);
    298
    299 concsolver->data = data;
    300}
    301
    302/** gets the name of a concurrent solver */
    304 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    305 )
    306{
    307 assert(concsolver != NULL);
    308
    309 return concsolver->name;
    310}
    311
    312/** initializes the random seeds of a concurrent solver */
    314 SCIP_CONCSOLVER* concsolver, /**< concurrent solver */
    315 unsigned int seed /**< seed for initializing the solver's internal random seeds */
    316 )
    317{
    318 assert(concsolver != NULL);
    319 assert(concsolver->type != NULL);
    320
    321 if( concsolver->type->concsolverinitseeds != NULL )
    322 {
    323 SCIP_CALL( concsolver->type->concsolverinitseeds(concsolver, seed) );
    324 }
    325
    326 return SCIP_OKAY;
    327}
    328
    329/** start the solving process of a concurrent solver */
    331 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    332 )
    333{
    334 assert(concsolver != NULL);
    335 assert(concsolver->type != NULL);
    336 assert(concsolver->type->concsolverexec != NULL);
    337
    338 /* set the stopped flag to false */
    339 concsolver->stopped = FALSE;
    340
    341 /* then call the execute callback */
    342 SCIP_CALL( concsolver->type->concsolverexec(concsolver, &concsolver->solvingtime, &concsolver->nlpiterations, &concsolver->nnodes) );
    343
    344 return SCIP_OKAY;
    345}
    346
    347/** gets solving data of concurrent solver and stores it in the given SCIP instance */
    349 SCIP_CONCSOLVER* concsolver, /**< concurrent solver */
    350 SCIP* scip /**< SCIP data structure */
    351 )
    352{
    353 assert(concsolver != NULL);
    354 assert(concsolver->type != NULL);
    355 assert(concsolver->type->concsolvercopysolvdata != NULL);
    356
    357 return concsolver->type->concsolvercopysolvdata(concsolver, scip);
    358}
    359
    360/** interrupt solving in a concurrent solver */
    362 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    363 )
    364{
    365 assert(concsolver != NULL);
    366 assert(concsolver->type != NULL);
    367 assert(concsolver->type->concsolverstop != NULL);
    368
    369 SCIP_CALL( concsolver->type->concsolverstop(concsolver) );
    370
    371 /* set the stopped flag to true */
    372 concsolver->stopped = TRUE;
    373
    374 return SCIP_OKAY;
    375}
    376
    377/** let the given concurrent solver synchronize, i.e., pass its own solutions and bounds to syncstore */
    379 SCIP_CONCSOLVER* concsolver, /**< concurrent solver */
    380 SCIP_SET* set /**< global SCIP settings */
    381 )
    382{
    383 SCIP_SYNCDATA* syncdata;
    384 SCIP_SYNCSTORE* syncstore;
    385 int nsols;
    386 int ntighterintbnds;
    387 int ntighterbnds;
    388 SCIP_CONCSOLVERTYPE* concsolvertype;
    389
    390 assert(concsolver != NULL);
    391 assert(concsolver->type != NULL);
    392 assert(concsolver->type->concsolversyncwrite != NULL);
    393 assert(concsolver->type->concsolversyncread != NULL);
    394
    395 if( concsolver->stopped )
    396 return SCIP_OKAY;
    397
    398 SCIP_CALL( SCIPstartClock(set->scip, concsolver->totalsynctime) );
    399
    400 concsolvertype = concsolver->type;
    401
    402 syncstore = SCIPgetSyncstore(set->scip);
    403 assert(syncstore != NULL);
    404
    405 SCIP_CALL( SCIPsyncstoreStartSync(syncstore, concsolver->nsyncs, &syncdata) );
    406
    407 if( syncdata == NULL )
    408 {
    409 SCIP_CALL( SCIPstopClock(set->scip, concsolver->totalsynctime) );
    410 return SCIP_OKAY;
    411 }
    412
    413 SCIPdebugMessage("concsolver %s starts sync %lli\n", concsolver->name, concsolver->nsyncs);
    414
    415 SCIP_CALL( concsolvertype->concsolversyncwrite(concsolver, syncstore, syncdata, set->concurrent_nbestsols, set->concurrent_maxnsols, &nsols) );
    416 concsolver->nsolsshared += nsols;
    417
    419 {
    420 SCIP_CALL( SCIPconcsolverStop(concsolver) );
    421 }
    422 else if( SCIPsyncdataGetNSynced(syncdata) == SCIPsyncstoreGetNSolvers(syncstore) - 1 )
    423 {
    424 /* if this is the last concurrent solver that is synchronizing for this synchronization data
    425 * it will adjust the synchronization frequency using the progress on the gap
    426 */
    427 SCIP_Bool lbok;
    428 SCIP_Bool ubok;
    429 SCIP_Real progress;
    430 SCIP_Real prevub;
    431 SCIP_Real prevlb;
    432 SCIP_Real newub;
    433 SCIP_Real newlb;
    434 SCIP_Real freqfactor;
    435 SCIP_Real newsyncfreq;
    436 SCIP_SYNCDATA* prevsync;
    437
    438 if( concsolver->nsyncs == 0 )
    439 {
    440 SCIPsyncdataSetSyncFreq(syncstore, syncdata, concsolver->syncfreq);
    441 }
    442 else
    443 {
    444 prevsync = SCIPsyncstoreGetSyncdata(syncstore, concsolver->nsyncs - 1);
    445 assert(SCIPsyncdataGetNSynced(prevsync) == SCIPsyncstoreGetNSolvers(syncstore));
    446
    447 prevub = SCIPsyncdataGetUpperbound(prevsync);
    448 prevlb = SCIPsyncdataGetLowerbound(prevsync);
    449 newub = SCIPsyncdataGetUpperbound(syncdata);
    450 newlb = SCIPsyncdataGetLowerbound(syncdata);
    451 lbok = prevlb > -SCIPsetInfinity(set);
    452 ubok = prevub < SCIPsetInfinity(set);
    453
    454 if( lbok && ubok )
    455 progress = SCIPrelDiff(prevub - prevlb, newub - newlb);
    456 else if( lbok )
    457 progress = SCIPrelDiff(newlb, prevlb);
    458 else if( ubok )
    459 progress = SCIPrelDiff(prevub, newub);
    460 else if( !SCIPsetIsInfinity(set, -newlb) || !SCIPsetIsInfinity(set, newub) ||
    462 progress = set->concurrent_targetprogress;
    463 else
    464 progress = 0.0;
    465
    466 /* should not be negative */
    467 progress = MAX(progress, 0.0);
    468 assert(SCIPsetIsGE(set, progress, 0.0));
    469
    470 if( progress < 0.5 * set->concurrent_targetprogress )
    471 freqfactor = set->concurrent_freqfactor;
    472 else if( progress > 2 * set->concurrent_targetprogress )
    473 freqfactor = 0.5 + 0.5 / set->concurrent_freqfactor;
    474 else
    475 freqfactor = 1.0;
    476
    477 SCIPdebugMessage("syncfreq is %g and freqfactor is %f due to progress %f\n", concsolver->syncfreq, freqfactor, progress);
    478 newsyncfreq = concsolver->syncfreq * freqfactor;
    479 SCIPsyncdataSetSyncFreq(syncstore, syncdata, newsyncfreq);
    480 SCIPdebugMessage("new syncfreq is %g\n", SCIPsyncdataGetSyncFreq(syncdata));
    481 }
    482 }
    483
    484 SCIPdebugMessage("concsolver %s finishing sync %lli\n", concsolver->name, concsolver->nsyncs);
    485
    486 SCIP_CALL( SCIPsyncstoreFinishSync(syncstore, &syncdata) );
    487 ++concsolver->nsyncs;
    488
    489 concsolver->syncdelay += concsolver->timesincelastsync;
    490
    491 syncdata = SCIPsyncstoreGetNextSyncdata(syncstore, concsolver->syncdata, concsolver->syncfreq, concsolver->nsyncs, &concsolver->syncdelay);
    492
    493 while( syncdata != NULL )
    494 {
    495 SCIP_CALL( SCIPsyncstoreEnsureAllSynced(syncstore, syncdata) );
    496 concsolver->syncdata = syncdata;
    497 SCIP_CALL( concsolvertype->concsolversyncread(concsolver, syncstore, syncdata, &nsols, &ntighterbnds, &ntighterintbnds) );
    498 concsolver->ntighterbnds += ntighterbnds;
    499 concsolver->ntighterintbnds += ntighterintbnds;
    500 concsolver->nsolsrecvd += nsols;
    501 SCIPdebugMessage("syncfreq before reading the next syncdata is %g\n", concsolver->syncfreq);
    502 concsolver->syncfreq = SCIPsyncdataGetSyncFreq(concsolver->syncdata);
    503 SCIPdebugMessage("syncfreq after reading the next syncdata is %g\n", concsolver->syncfreq);
    504 syncdata = SCIPsyncstoreGetNextSyncdata(syncstore, concsolver->syncdata, concsolver->syncfreq, concsolver->nsyncs, &concsolver->syncdelay);
    505 }
    506
    507 SCIP_CALL( SCIPstopClock(set->scip, concsolver->totalsynctime) );
    508
    509 return SCIP_OKAY;
    510}
    511
    512/** gets the current synchronization frequency of the concurrent solver */
    514 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    515 )
    516{
    517 assert(concsolver != NULL);
    518
    519 return concsolver->syncfreq;
    520}
    521
    522/** gets the total memory used by the concurrent solver */
    524 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    525 )
    526{
    527 assert(concsolver != NULL);
    528
    529 return concsolver->syncdata != NULL ? SCIPsyncdataGetMemTotal(concsolver->syncdata) : 0;
    530}
    531
    532/** sets the time elapsed since the last synchronization. Must be set before the synchronization is
    533 * started.
    534 */
    536 SCIP_CONCSOLVER* concsolver, /**< concurrent solver */
    537 SCIP_Real time /**< the time passed since the last synchronization */
    538 )
    539{
    540 assert(concsolver != NULL);
    541
    542 concsolver->timesincelastsync = time;
    543}
    544
    545/** gets the solving time of the concurrent solver */
    547 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    548 )
    549{
    550 assert(concsolver != NULL);
    551
    552 return concsolver->solvingtime;
    553}
    554
    555/** gets the time spent for synchronization for the concurrent solver */
    557 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    558 )
    559{
    560 assert(concsolver != NULL);
    561
    562 return SCIPclockGetTime(concsolver->totalsynctime);
    563}
    564
    565/** gets the number of lp iterations the concurrent solver used */
    567 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    568 )
    569{
    570 assert(concsolver != NULL);
    571
    572 return concsolver->nlpiterations;
    573}
    574
    575/** gets the number of branch and bound nodes the concurrent solver used */
    577 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    578 )
    579{
    580 assert(concsolver != NULL);
    581
    582 return concsolver->nnodes;
    583}
    584
    585/** gets the number of solutions the concurrent solver received during synchronization */
    587 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    588 )
    589{
    590 assert(concsolver != NULL);
    591
    592 return concsolver->nsolsrecvd;
    593}
    594
    595/** gets the number of solutions the concurrent solver shared during synchronization */
    597 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    598 )
    599{
    600 assert(concsolver != NULL);
    601
    602 return concsolver->nsolsshared;
    603}
    604
    605/** gets the number of tighter global variable bounds the solver received */
    607 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    608 )
    609{
    610 assert(concsolver != NULL);
    611
    612 return concsolver->ntighterbnds;
    613}
    614
    615/** gets the number of tighter global variable bounds of integer variables the solver received */
    617 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    618 )
    619{
    620 assert(concsolver != NULL);
    621
    622 return concsolver->ntighterintbnds;
    623}
    624
    625/** gets index of concurrent solver */
    627 SCIP_CONCSOLVER* concsolver /**< concurrent solver */
    628 )
    629{
    630 assert(concsolver != NULL);
    631
    632 return concsolver->idx;
    633}
    int SCIPboundstoreGetNChgs(SCIP_BOUNDSTORE *boundstore)
    Definition: boundstore.c:203
    the interface of the bound store data structure
    SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
    Definition: clock.c:438
    internal methods for clocks and timing issues
    SCIP_Longint SCIPconcsolverGetNNodes(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:576
    void SCIPconcsolverSetTimeSinceLastSync(SCIP_CONCSOLVER *concsolver, SCIP_Real time)
    Definition: concsolver.c:535
    SCIP_RETCODE SCIPconcsolverExec(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:330
    SCIP_RETCODE SCIPconcsolverCreateInstance(SCIP_SET *set, SCIP_CONCSOLVERTYPE *concsolvertype, SCIP_CONCSOLVER **concsolver)
    Definition: concsolver.c:211
    SCIP_Real SCIPconcsolverGetSyncFreq(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:513
    SCIP_RETCODE SCIPconcsolverInitSeeds(SCIP_CONCSOLVER *concsolver, unsigned int seed)
    Definition: concsolver.c:313
    SCIP_RETCODE SCIPconcsolverDestroyInstance(SCIP_SET *set, SCIP_CONCSOLVER **concsolver)
    Definition: concsolver.c:260
    SCIP_CONCSOLVERDATA * SCIPconcsolverGetData(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:282
    SCIP_Longint SCIPconcsolverGetNSolsRecvd(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:586
    SCIP_Real SCIPconcsolverGetSyncTime(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:556
    void SCIPconcsolverSetData(SCIP_CONCSOLVER *concsolver, SCIP_CONCSOLVERDATA *data)
    Definition: concsolver.c:292
    SCIP_RETCODE SCIPconcsolverTypeCreate(SCIP_CONCSOLVERTYPE **concsolvertype, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
    Definition: concsolver.c:113
    int SCIPconcsolverGetIdx(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:626
    SCIP_Longint SCIPconcsolverGetNTighterIntBnds(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:616
    SCIP_RETCODE SCIPconcsolverGetSolvingData(SCIP_CONCSOLVER *concsolver, SCIP *scip)
    Definition: concsolver.c:348
    static SCIP_RETCODE doConcsolverTypeCreate(SCIP_CONCSOLVERTYPE **concsolvertype, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
    Definition: concsolver.c:52
    SCIP_Real SCIPconcsolverGetSolvingTime(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:546
    SCIP_Longint SCIPconcsolverGetNTighterBnds(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:606
    char * SCIPconcsolverTypeGetName(SCIP_CONCSOLVERTYPE *concsolvertype)
    Definition: concsolver.c:191
    SCIP_RETCODE SCIPconcsolverSync(SCIP_CONCSOLVER *concsolver, SCIP_SET *set)
    Definition: concsolver.c:378
    SCIP_Longint SCIPconcsolverGetNLPIterations(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:566
    void SCIPconcsolverTypeFree(SCIP_CONCSOLVERTYPE **concsolvertype)
    Definition: concsolver.c:153
    SCIP_RETCODE SCIPconcsolverStop(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:361
    char * SCIPconcsolverGetName(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:303
    SCIP_Real SCIPconcsolverTypeGetPrefPrio(SCIP_CONCSOLVERTYPE *concsolvertype)
    Definition: concsolver.c:201
    SCIP_Longint SCIPconcsolverGetNSolsShared(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:596
    SCIP_Longint SCIPconcsolverGetMemTotal(SCIP_CONCSOLVER *concsolver)
    Definition: concsolver.c:523
    void SCIPconcsolverTypeSetData(SCIP_CONCSOLVERTYPE *concsolvertype, SCIP_CONCSOLVERTYPEDATA *data)
    Definition: concsolver.c:180
    SCIP_CONCSOLVERTYPEDATA * SCIPconcsolverTypeGetData(SCIP_CONCSOLVERTYPE *concsolvertype)
    Definition: concsolver.c:170
    data structures for concurrent solvers
    SCIP_RETCODE SCIPaddConcurrentSolver(SCIP *scip, SCIP_CONCSOLVER *concsolver)
    Definition: concurrent.c:148
    int SCIPgetNConcurrentSolvers(SCIP *scip)
    Definition: concurrent.c:126
    helper functions for concurrent scip solvers
    #define NULL
    Definition: def.h:255
    #define SCIP_MAXSTRLEN
    Definition: def.h:276
    #define SCIP_Longint
    Definition: def.h:148
    #define SCIP_Bool
    Definition: def.h:98
    #define SCIP_ALLOC(x)
    Definition: def.h:373
    #define SCIP_Real
    Definition: def.h:163
    #define TRUE
    Definition: def.h:100
    #define FALSE
    Definition: def.h:101
    #define MAX(x, y)
    Definition: def.h:227
    #define SCIP_CALL(x)
    Definition: def.h:362
    #define SCIP_CALL_FINALLY(x, y)
    Definition: def.h:404
    int SCIPgetNVars(SCIP *scip)
    Definition: scip_prob.c:2246
    SCIP_Real SCIPrelDiff(SCIP_Real val1, SCIP_Real val2)
    Definition: misc.c:11162
    SCIP_SYNCSTORE * SCIPgetSyncstore(SCIP *scip)
    SCIP_RETCODE SCIPstopClock(SCIP *scip, SCIP_CLOCK *clck)
    Definition: scip_timing.c:178
    SCIP_RETCODE SCIPfreeClock(SCIP *scip, SCIP_CLOCK **clck)
    Definition: scip_timing.c:127
    SCIP_RETCODE SCIPcreateWallClock(SCIP *scip, SCIP_CLOCK **clck)
    Definition: scip_timing.c:110
    SCIP_RETCODE SCIPstartClock(SCIP *scip, SCIP_CLOCK *clck)
    Definition: scip_timing.c:161
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    static const char * paramname[]
    Definition: lpi_msk.c:5172
    memory allocation routines
    #define BMSfreeMemory(ptr)
    Definition: memory.h:145
    #define BMSduplicateMemoryArray(ptr, source, num)
    Definition: memory.h:143
    #define BMSclearMemory(ptr)
    Definition: memory.h:129
    #define BMSfreeMemoryArray(ptr)
    Definition: memory.h:147
    struct BMS_BlkMem BMS_BLKMEM
    Definition: memory.h:437
    #define BMSfreeMemoryArrayNull(ptr)
    Definition: memory.h:148
    #define BMSallocMemory(ptr)
    Definition: memory.h:118
    #define SCIPdebugMessage
    Definition: pub_message.h:96
    SCIP callable library.
    SCIP_Bool SCIPsetIsGE(SCIP_SET *set, SCIP_Real val1, SCIP_Real val2)
    Definition: set.c:6617
    SCIP_RETCODE SCIPsetAddRealParam(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, const char *desc, SCIP_Real *valueptr, SCIP_Bool isadvanced, SCIP_Real defaultvalue, SCIP_Real minvalue, SCIP_Real maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
    Definition: set.c:3277
    SCIP_Real SCIPsetInfinity(SCIP_SET *set)
    Definition: set.c:6380
    SCIP_Bool SCIPsetIsInfinity(SCIP_SET *set, SCIP_Real val)
    Definition: set.c:6515
    internal methods for global SCIP settings
    SCIP_CONCSOLVERTYPEDATA * data
    SCIP_Longint ntighterbnds
    SCIP_Real timesincelastsync
    SCIP_Longint ntighterintbnds
    SCIP_Longint nsyncs
    SCIP_SYNCDATA * syncdata
    SCIP_Longint nsolsshared
    SCIP_CLOCK * totalsynctime
    SCIP_CONCSOLVERTYPE * type
    SCIP_Longint nlpiterations
    SCIP_Longint nsolsrecvd
    SCIP_CONCSOLVERDATA * data
    SCIP_Longint nnodes
    data structures for concurrent solvers
    SCIP main data structure.
    datastructures for problem statistics
    Definition: heur_padm.c:135
    SCIP_Real SCIPsyncdataGetSyncFreq(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:576
    SCIP_Longint SCIPsyncdataGetMemTotal(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:566
    SCIP_BOUNDSTORE * SCIPsyncdataGetBoundChgs(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:624
    SCIP_RETCODE SCIPsyncstoreFinishSync(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA **syncdata)
    Definition: syncstore.c:481
    SCIP_Real SCIPsyncdataGetUpperbound(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:586
    SCIP_RETCODE SCIPsyncstoreEnsureAllSynced(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:409
    void SCIPsyncdataSetSyncFreq(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata, SCIP_Real syncfreq)
    Definition: syncstore.c:634
    SCIP_RETCODE SCIPsyncstoreStartSync(SCIP_SYNCSTORE *syncstore, SCIP_Longint syncnum, SCIP_SYNCDATA **syncdata)
    Definition: syncstore.c:438
    SCIP_Real SCIPsyncdataGetLowerbound(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:596
    int SCIPsyncdataGetNSynced(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:545
    SCIP_SYNCDATA * SCIPsyncstoreGetSyncdata(SCIP_SYNCSTORE *syncstore, SCIP_Longint syncnum)
    Definition: syncstore.c:340
    SCIP_SYNCDATA * SCIPsyncstoreGetNextSyncdata(SCIP_SYNCSTORE *syncstore, SCIP_SYNCDATA *syncdata, SCIP_Real syncfreq, SCIP_Longint writenum, SCIP_Real *delay)
    Definition: syncstore.c:361
    int SCIPsyncstoreGetNSolvers(SCIP_SYNCSTORE *syncstore)
    Definition: syncstore.c:555
    SCIP_STATUS SCIPsyncdataGetStatus(SCIP_SYNCDATA *syncdata)
    Definition: syncstore.c:521
    the function declarations for the synchronization store
    #define SCIP_DECL_CONCSOLVERSTOP(x)
    #define SCIP_DECL_CONCSOLVERINITSEEDS(x)
    #define SCIP_DECL_CONCSOLVERTYPEFREEDATA(x)
    #define SCIP_DECL_CONCSOLVERSYNCWRITE(x)
    #define SCIP_DECL_CONCSOLVERDESTROYINST(x)
    #define SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA(x)
    struct SCIP_ConcSolverTypeData SCIP_CONCSOLVERTYPEDATA
    #define SCIP_DECL_CONCSOLVEREXEC(x)
    #define SCIP_DECL_CONCSOLVERCREATEINST(x)
    #define SCIP_DECL_CONCSOLVERSYNCREAD(x)
    struct SCIP_ConcSolverData SCIP_CONCSOLVERDATA
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63
    @ SCIP_STATUS_UNKNOWN
    Definition: type_stat.h:42
    @ SCIP_PARA_DETERMINISTIC
    struct SCIP_SyncData SCIP_SYNCDATA