SCIP Doxygen Documentation
Loading...
Searching...
No Matches
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);
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)
SCIP_RETCODE SCIPfreeClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_RETCODE SCIPcreateWallClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_RETCODE SCIPstartClock(SCIP *scip, SCIP_CLOCK *clck)
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition misc.c:10827
return SCIP_OKAY
assert(minobj< SCIPgetCutoffbound(scip))
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
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
struct SCIP_ConcSolver SCIP_CONCSOLVER
#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
struct SCIP_ConcSolverType SCIP_CONCSOLVERTYPE
struct SCIP_Messagehdlr SCIP_MESSAGEHDLR
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_Set SCIP_SET
Definition type_set.h:71
@ SCIP_STATUS_UNKNOWN
Definition type_stat.h:42
@ SCIP_PARA_DETERMINISTIC
struct SCIP_SyncData SCIP_SYNCDATA
struct SCIP_SyncStore SCIP_SYNCSTORE