SCIP Doxygen Documentation
Loading...
Searching...
No Matches
concurrent.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 concurrent.c
26 * @ingroup PARALLEL
27 * @brief helper functions for concurrent SCIP solvers
28 * @author Leona Gottwald
29 */
30
31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32
33#include "scip/concurrent.h"
34#include "scip/concsolver.h"
35#include "scip/event.h"
36#include "scip/stat.h"
38#include "scip/struct_scip.h"
39#include "scip/struct_set.h"
40#include "scip/struct_tree.h"
41#include "scip/struct_primal.h"
42#include "scip/struct_sol.h"
43#include "scip/struct_prop.h"
44#include "scip/struct_heur.h"
45#include "scip/struct_sepa.h"
46#include "scip/struct_presol.h"
47#include "scip/prob.h"
48#include "scip/prop_sync.h"
49#include "scip/heur_sync.h"
51#include "scip/scip.h"
52#include "scip/syncstore.h"
53#include "scip/type_syncstore.h"
54#include "scip/set.h"
55#include "tpi/tpi.h"
56#include "tpi/def_openmp.h"
57
58/** TPI job data */
59struct SCIP_ConcurrentData
60{
61 SCIP* scip; /**< SCIP datastructure */
62 int solverindex; /**< index of solver running concurrently */
63};
64typedef struct SCIP_ConcurrentData SCIP_CONCURRENTDATA;
65
66/** create concurrent data */
68 SCIP* scip, /**< SCIP datastructure */
69 SCIP_CONCSOLVER* concsolver, /**< concurrent solver of given SCIP instance */
70 int* varperm, /**< permutation of variables for communication */
71 int nvars /**< number of variables in problem */
72 )
73{
74 assert(scip != NULL);
75 assert(concsolver != NULL);
76 assert(varperm != NULL);
77 assert(scip->concurrent == NULL);
78 assert(nvars >= 0);
79
80 SCIP_CALL( SCIPallocBlockMemory(scip, &scip->concurrent) );
81
82 scip->concurrent->varperm = NULL;
83 scip->concurrent->nvars = nvars;
84
85 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &scip->concurrent->varperm, varperm, nvars) );
86
87 scip->concurrent->concsolver = concsolver;
88 scip->concurrent->mainscip = scip;
89 scip->concurrent->solidx = scip->stat->solindex;
90 scip->stat->subscipdepth = 0;
91
92 if( scip->set->parallel_mode == (int) SCIP_PARA_DETERMINISTIC )
93 {
94 scip->concurrent->dettime = 0.0;
95 scip->concurrent->wallclock = NULL;
96 }
97 else
98 {
99 SCIP_CALL( SCIPcreateWallClock(scip, &scip->concurrent->wallclock) );
100 SCIP_CALL( SCIPstartClock(scip, scip->concurrent->wallclock) );
101 }
102
103 assert(SCIPfindHeur(scip, "sync") == NULL);
104
106 scip->concurrent->heursync = SCIPfindHeur(scip, "sync");
107
108 assert(SCIPfindProp(scip, "sync") == NULL);
109
111 scip->concurrent->propsync = SCIPfindProp(scip, "sync");
112
113 scip->concurrent->eventglobalbnd = NULL;
114 assert(SCIPfindEventhdlr(scip, "globalbnd") == NULL);
115
116 if( scip->set->concurrent_commvarbnds )
117 {
119 scip->concurrent->eventglobalbnd = SCIPfindEventhdlr(scip, "globalbnd");
120 }
121
122 return SCIP_OKAY;
123}
124
125/** get number of initialized concurrent solvers */
127 SCIP* scip /**< SCIP datastructure */
128 )
129{
130 assert(scip != NULL);
131 assert(scip->set != NULL);
132
133 return scip->set->nconcsolvers;
134}
135
136/** gets the initialized concurrent solvers */
138 SCIP* scip /**< SCIP datastructure */
139 )
140{
141 assert(scip != NULL);
142 assert(scip->set != NULL);
143
144 return scip->set->concsolvers;
145}
146
147/** adds an initialized concurrent solver */
149 SCIP* scip, /**< SCIP datastructure */
150 SCIP_CONCSOLVER* concsolver /**< concurrent solver of given SCIP instance */
151 )
152{
153 assert(scip != NULL);
154
155 SCIP_CALL( SCIPsetIncludeConcsolver(scip->set, concsolver) );
156
157 return SCIP_OKAY;
158}
159
160/** frees concurrent data */
162 SCIP* scip /**< SCIP datastructure */
163 )
164{
165 assert(scip != NULL);
166
167 if( scip->concurrent == NULL )
168 return SCIP_OKAY;
169
170 assert(scip->concurrent->varperm != NULL);
171
172 /* check if we are the SCIP that is responsible for freeing this concurrent struct
173 * or just a subscip */
174 if( scip->concurrent->mainscip != scip )
175 {
176 /* we are just a subscip, so don't free the concurrent structure and add the
177 * deterministic time that was counted in the subscip but not yet added to the main SCIP */
178 scip->concurrent->mainscip->stat->detertimecnt += scip->stat->detertimecnt;
179 scip->stat->detertimecnt = 0;
180 scip->concurrent = NULL;
181 }
182 else
183 {
184 /* we are in the main SCIP so free the concurrent structure */
185 if( scip->concurrent->wallclock != NULL )
186 {
187 SCIP_CALL( SCIPfreeClock(scip, &scip->concurrent->wallclock) );
188 }
189
190 SCIPfreeBlockMemoryArray(scip, &scip->concurrent->varperm, scip->concurrent->nvars);
191
192 SCIPfreeBlockMemory(scip, &scip->concurrent);
193 }
194
195 return SCIP_OKAY;
196}
197
198/** increments the time counter for synchronization */
200 SCIP* scip, /**< SCIP datastructure */
201 SCIP_Real val /**< value by which the time counter for synchronization is incremented */
202 )
203{
204 SCIP_Real syncfreq;
205 SCIP* mainscip;
206 SCIP_CLOCK* wallclock;
207
208 assert(scip != NULL);
209
210 if( scip->concurrent == NULL )
211 return SCIP_OKAY;
212
213 syncfreq = SCIPconcsolverGetSyncFreq(scip->concurrent->concsolver);
214 wallclock = scip->concurrent->wallclock;
215 mainscip = scip->concurrent->mainscip;
216
217 if( wallclock == NULL )
218 {
219 scip->concurrent->dettime += val;
220
221 if( scip->concurrent->dettime >= syncfreq )
222 {
223 SCIP_EVENT* event;
224
225 SCIPconcsolverSetTimeSinceLastSync(scip->concurrent->concsolver, scip->concurrent->dettime);
226 scip->concurrent->dettime = 0.0;
227 SCIP_CALL( SCIPeventCreateSync(&event, SCIPblkmem(mainscip)) );
228 SCIP_CALL( SCIPeventqueueAdd(mainscip->eventqueue, SCIPblkmem(mainscip), mainscip->set,
229 NULL, NULL, NULL, mainscip->eventfilter, &event) );
230 }
231 }
232 else
233 {
234 SCIP_Real timesincelastsync;
235
236 timesincelastsync = SCIPgetClockTime(mainscip, wallclock);
237
238 if( timesincelastsync >= syncfreq )
239 {
240 SCIP_EVENT* event;
241
242 SCIPconcsolverSetTimeSinceLastSync(scip->concurrent->concsolver, timesincelastsync);
243
244 SCIP_CALL( SCIPeventCreateSync(&event, SCIPblkmem(mainscip)) );
245 SCIP_CALL( SCIPeventqueueAdd(mainscip->eventqueue, SCIPblkmem(mainscip), mainscip->set,
246 NULL, NULL, NULL, mainscip->eventfilter, &event) );
247
248 SCIP_CALL( SCIPresetClock(mainscip, wallclock) );
249 SCIP_CALL( SCIPstartClock(mainscip, wallclock) );
250 }
251 }
252
253 return SCIP_OKAY;
254}
255
256
257/** synchronize with other concurrent solvers */
259 SCIP* scip /**< SCIP datastructure */
260 )
261{
262 assert(scip != NULL);
263 assert(scip->concurrent != NULL);
264
265 SCIP_CALL( SCIPconcsolverSync(scip->concurrent->concsolver, scip->concurrent->mainscip->set) );
266
267 scip->concurrent->mainscip->concurrent->solidx = scip->concurrent->mainscip->stat->solindex;
268
269 if( scip->concurrent->eventglobalbnd != NULL )
270 SCIPeventGlobalbndClearBoundChanges(scip->concurrent->eventglobalbnd);
271
272 return SCIP_OKAY;
273}
274
275/** disables storing global bound changes */
277 SCIP* scip /**< SCIP data structure */
278 )
279{
280 assert(scip != NULL);
281 assert(scip->concurrent != NULL);
282
283 if( scip->concurrent->eventglobalbnd != NULL )
284 SCIPeventGlobalbndDisableBoundStorage(scip->concurrent->eventglobalbnd);
285}
286
287/** enables storing global bound changes */
289 SCIP* scip /**< SCIP data structure */
290 )
291{
292 assert(scip != NULL);
293 assert(scip->concurrent != NULL);
294
295 if( scip->concurrent->eventglobalbnd != NULL )
296 SCIPeventGlobalbndEnableBoundStorage(scip->concurrent->eventglobalbnd);
297}
298
299/** gets total memory usage of all concurrent solvers together */
301 SCIP* scip /**< SCIP data structure */
302 )
303{
305
306 assert(scip != NULL);
307
308 if( scip->concurrent == NULL || scip->concurrent->mainscip != scip || scip->concurrent->concsolver == NULL )
309 return memtotal;
310 else
311 {
312 SCIP_Longint concmemtotal = SCIPconcsolverGetMemTotal(scip->concurrent->concsolver);
313 return MAX(memtotal, concmemtotal);
314 }
315}
316
317/** gets the dualbound in the last synchronization */
319 SCIP* scip /**< SCIP data structure */
320 )
321{
322 SCIP_SYNCSTORE* syncstore;
323
324 assert(scip != NULL);
325
326 syncstore = SCIPgetSyncstore(scip);
327 assert(syncstore != NULL);
328
329 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set, SCIPsyncstoreGetLastLowerbound(syncstore));
330}
331
332/** gets the primalbound in the last synchronization */
334 SCIP* scip /**< SCIP data structure */
335 )
336{
337 SCIP_SYNCSTORE* syncstore;
338
339 assert(scip != NULL);
340
341 syncstore = SCIPgetSyncstore(scip);
342 assert(syncstore != NULL);
343
344 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set, SCIPsyncstoreGetLastUpperbound(syncstore));
345}
346
347/** gets the gap in the last synchronization */
349 SCIP* scip /**< SCIP data structure */
350 )
351{
352 SCIP_Real primalbound;
353 SCIP_Real dualbound;
354
355 primalbound = SCIPgetConcurrentPrimalbound(scip);
356 dualbound = SCIPgetConcurrentDualbound(scip);
357
358 return SCIPcomputeGap(SCIPepsilon(scip), SCIPinfinity(scip), primalbound, dualbound);
359}
360
361/** gives the total number of tightened bounds received from other concurrent solvers */
363 SCIP* scip /**< SCIP data structure */
364 )
365{
366 assert(scip->concurrent != NULL);
367
368 return scip->concurrent->propsync != NULL ? SCIPpropSyncGetNTightenedBnds(scip->concurrent->propsync) : 0;
369}
370
371/** gives the total number of tightened bounds for integer variables received from
372 * other concurrent solvers */
374 SCIP* scip /**< SCIP data structure */
375 )
376{
377 assert(scip->concurrent != NULL);
378
379 return scip->concurrent->propsync != NULL ? SCIPpropSyncGetNTightenedIntBnds(scip->concurrent->propsync) : 0;
380}
381
382/** pass a solution to the given SCIP instance that was received via synchronization by using the sync heuristic */
384 SCIP* scip, /**< SCIP datastructure */
385 SCIP_SOL* sol /**< solution */
386 )
387{
388 assert(scip != NULL);
389 assert(scip->concurrent != NULL);
390 assert(sol != NULL);
391
392 SCIP_CALL( SCIPheurSyncPassSol(scip, scip->concurrent->heursync, sol) );
393
394 return SCIP_OKAY;
395}
396
397/** adds a global boundchange to the given SCIP, by passing it to the sync propagator */
399 SCIP* scip, /**< SCIP data structure */
400 SCIP_VAR* var, /**< variable for bound */
401 SCIP_Real val, /**< value of bound */
402 SCIP_BOUNDTYPE bndtype /**< type of bound */
403 )
404{
405 assert(scip != NULL);
406 assert(var != NULL);
407 assert(scip->concurrent != NULL);
408 assert(scip->concurrent->propsync != NULL);
409
410 SCIP_CALL( SCIPpropSyncAddBndchg(scip->concurrent->mainscip, scip->concurrent->propsync, var, val, bndtype) );
411
412 return SCIP_OKAY;
413}
414
415/** copy the nodenumber, depth, time, and runnumber of one solution to another one */
417 SCIP_SOL* source, /**< source for solution statistics */
418 SCIP_SOL* target /**< target for solution statistics */
419 )
420{
421 assert(source != NULL);
422 assert(target != NULL);
423
424 target->depth = source->depth;
425 target->time = source->time;
426 target->nodenum = source->nodenum;
427 target->runnum = source->runnum;
428
429 return SCIP_OKAY;
430}
431
432
433/** get variable index of original variable that is the same between concurrent solvers */
435 SCIP* scip, /**< SCIP data structure */
436 SCIP_VAR* var /**< variable */
437 )
438{
439 int idx;
440
441 assert(scip != NULL);
442 assert(scip->concurrent != NULL);
443 assert(scip->concurrent->varperm != NULL);
444 assert(var != NULL);
446
447 /* the map only is valid for variables with a probindex */
449 if( idx >= 0 )
450 {
451 assert( 0 <= idx && idx < scip->concurrent->nvars );
452 return scip->concurrent->varperm[idx];
453 }
454
455 return -1;
456}
457
458/** is the solution new since the last synchronization point */
460 SCIP* scip, /**< SCIP data structure */
461 SCIP_SOL* sol /**< the solution */
462 )
463{
464 assert(scip != NULL);
465 assert(scip->concurrent != NULL);
466 assert(sol != NULL);
467
468 return SCIPsolGetIndex(sol) >= scip->concurrent->solidx;
469}
470
471/** gets the global lower bound changes since the last synchronization point */
473 SCIP* scip /**< SCIP data structure */
474 )
475{
476 assert(scip != NULL);
477 assert(scip->concurrent != NULL);
478
479 if( scip->concurrent->eventglobalbnd != NULL )
480 return SCIPeventGlobalbndGetBoundChanges(scip->concurrent->eventglobalbnd);
481
482 return NULL;
483}
484
485/** executes the concurrent solver corresponding to the current thread */
486static
488 void* args /**< SCIP data structure passed in as a void pointer */
489 )
490{
491 SCIP_CONCURRENTDATA* concurrentdata;
492 SCIP* scip;
493 int solverindex;
494
495 assert(args != NULL);
496
497 concurrentdata = (SCIP_CONCURRENTDATA*) args;
498 scip = concurrentdata->scip;
499 solverindex = concurrentdata->solverindex;
500
501 SCIP_CALL( SCIPconcsolverExec(scip->set->concsolvers[solverindex]) );
502 SCIP_CALL( SCIPconcsolverSync(scip->set->concsolvers[solverindex], scip->set) );
503
504 return SCIP_OKAY;
505}
506
507/** start solving in parallel using the given set of concurrent solvers */
509 SCIP* scip /**< pointer to scip datastructure */
510 )
511{
512 SCIP_CONCSOLVER** concsolvers;
513 SCIP_SYNCSTORE* syncstore;
514 SCIP_RETCODE retcode;
515 SCIP_CONCURRENTDATA** concurrentdata;
516 int nconcsolvers;
517 int idx;
518 int jobid;
519 int i;
520
521 assert(scip != NULL);
522
523 syncstore = SCIPgetSyncstore(scip);
524 concsolvers = scip->set->concsolvers;
525 nconcsolvers = scip->set->nconcsolvers;
526
528 assert(SCIPsyncstoreGetNSolvers(syncstore) == nconcsolvers);
529
531 jobid = SCIPtpiGetNewJobID();
532
533 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &concurrentdata, nconcsolvers) );
534 for( i = 0; i < nconcsolvers; ++i )
535 {
536 SCIP_CALL( SCIPallocBlockMemory(scip, &concurrentdata[i]) ); /*lint !e866*/
537 }
538
540 {
542 {
543 for( i = 0; i < nconcsolvers; ++i )
544 {
545 SCIP_JOB* job;
546 SCIP_SUBMITSTATUS status;
547
548 concurrentdata[i]->scip = scip;
549 concurrentdata[i]->solverindex = i;
550
551 SCIP_CALL_ABORT( SCIPtpiCreateJob(&job, jobid, execConcsolver, concurrentdata[i]) );
552 SCIP_CALL_ABORT( SCIPtpiSubmitJob(job, &status) );
553
554 assert(status == SCIP_SUBMIT_SUCCESS);
555 }
556 }
557 }
558
559 retcode = SCIPtpiCollectJobs(jobid);
560 idx = SCIPsyncstoreGetWinner(syncstore);
561 assert(idx >= 0 && idx < nconcsolvers);
562
563 /* a paranoid safeguard for running in optimized mode */
564 if( idx < 0 || idx >= nconcsolvers )
565 idx = 0;
566
567 SCIP_CALL( SCIPconcsolverGetSolvingData(concsolvers[idx], scip) );
568
569 for( i = nconcsolvers - 1; i >= 0; i-- )
570 SCIPfreeBlockMemory(scip, &concurrentdata[i]); /*lint !e866*/
571 SCIPfreeBlockMemoryArray(scip, &concurrentdata, nconcsolvers);
572
573 return retcode;
574}
575
576/** copy solving statistics */
578 SCIP* source, /**< SCIP data structure */
579 SCIP* target /**< target SCIP data structure */
580 )
581{
582 SCIP_HEUR* heur;
583 SCIP_NODE* root;
584 SCIP_PROP* prop;
585 SCIP_SEPA* sepa;
586 SCIP_PRESOL* presol;
587 SCIP_HEUR** heurs;
588 SCIP_PROP** props;
589 SCIP_SEPA** sepas;
590 SCIP_PRESOL** presols;
591 SCIP_Real tmptime;
592 int nheurs;
593 int nprops;
594 int nsepas;
595 int npresols;
596 int i;
597
598 assert(source != NULL);
599 assert(target != NULL);
600
601 heurs = SCIPgetHeurs(target);
602 nheurs = SCIPgetNHeurs(target);
603
604 for( i = 0; i < nheurs; ++i )
605 {
606 heur = SCIPfindHeur(source, SCIPheurGetName(heurs[i]));
607
608 if( heur != NULL )
609 {
610 heurs[i]->nbestsolsfound += heur->nbestsolsfound;
611 heurs[i]->ncalls += heur->ncalls;
612 heurs[i]->nsolsfound += heur->nsolsfound;
613
614 /* TODO divesets */
615 tmptime = SCIPgetClockTime(target, heurs[i]->setuptime);
616 tmptime += SCIPgetClockTime(source, heur->setuptime);
617 SCIP_CALL( SCIPsetClockTime(target, heurs[i]->setuptime, tmptime) );
618
619 tmptime = SCIPgetClockTime(target, heurs[i]->heurclock);
620 tmptime += SCIPgetClockTime(source, heur->heurclock);
621 SCIP_CALL( SCIPsetClockTime(target, heurs[i]->heurclock, tmptime) );
622 }
623 }
624
625 props = SCIPgetProps(target);
626 nprops = SCIPgetNProps(target);
627
628 for( i = 0; i < nprops; ++i )
629 {
630 prop = SCIPfindProp(source, SCIPpropGetName(props[i]));
631
632 if( prop != NULL )
633 {
634 props[i]->ncalls += prop->ncalls;
635 props[i]->nrespropcalls += prop->nrespropcalls;
636 props[i]->ncutoffs += prop->ncutoffs;
637 props[i]->ndomredsfound += prop->ndomredsfound;
638
639 tmptime = SCIPgetClockTime(target, props[i]->proptime);
640 tmptime += SCIPgetClockTime(source, prop->proptime);
641 SCIP_CALL( SCIPsetClockTime(target, props[i]->proptime, tmptime) );
642
643 tmptime = SCIPgetClockTime(target, props[i]->sbproptime);
644 tmptime += SCIPgetClockTime(source, prop->sbproptime);
645 SCIP_CALL( SCIPsetClockTime(target, props[i]->sbproptime, tmptime) );
646
647 tmptime = SCIPgetClockTime(target, props[i]->resproptime);
648 tmptime += SCIPgetClockTime(source, prop->resproptime);
649 SCIP_CALL( SCIPsetClockTime(target, props[i]->resproptime, tmptime) );
650
651 tmptime = SCIPgetClockTime(target, props[i]->presoltime);
652 tmptime += SCIPgetClockTime(source, prop->presoltime);
653 SCIP_CALL( SCIPsetClockTime(target, props[i]->presoltime, tmptime) );
654
655 tmptime = SCIPgetClockTime(target, props[i]->setuptime);
656 tmptime += SCIPgetClockTime(source, prop->setuptime);
657 SCIP_CALL( SCIPsetClockTime(target, props[i]->setuptime, tmptime) );
658 }
659 }
660
661 presols = SCIPgetPresols(target);
662 npresols = SCIPgetNPresols(target);
663
664 for( i = 0; i < npresols; ++i )
665 {
666 presol = SCIPfindPresol(source, SCIPpresolGetName(presols[i]));
667
668 if( presol != NULL )
669 {
670 presols[i]->ncalls += presol->ncalls;
671 presols[i]->nfixedvars += presol->nfixedvars;
672 presols[i]->naggrvars += presol->naggrvars;
673 presols[i]->nchgvartypes += presol->nchgvartypes;
674 presols[i]->nchgbds += presol->nchgbds;
675 presols[i]->naddholes += presol->naddholes;
676 presols[i]->ndelconss += presol->ndelconss;
677 presols[i]->naddconss += presol->naddconss;
678 presols[i]->nupgdconss += presol->nupgdconss;
679 presols[i]->nchgcoefs += presol->nchgcoefs;
680 presols[i]->nchgsides += presol->nchgsides;
681 presols[i]->nfixedvars += presol->nfixedvars;
682 presols[i]->nfixedvars += presol->nfixedvars;
683 presols[i]->nfixedvars += presol->nfixedvars;
684
685 tmptime = SCIPgetClockTime(target, presols[i]->setuptime);
686 tmptime += SCIPgetClockTime(source, presol->setuptime);
687 SCIP_CALL( SCIPsetClockTime(target, presols[i]->setuptime, tmptime) );
688
689 tmptime = SCIPgetClockTime(target, presols[i]->presolclock);
690 tmptime += SCIPgetClockTime(source, presol->presolclock);
691 SCIP_CALL( SCIPsetClockTime(target, presols[i]->presolclock, tmptime) );
692 }
693 }
694
695 sepas = SCIPgetSepas(target);
696 nsepas = SCIPgetNSepas(target);
697
698 for( i = 0; i < nsepas; ++i )
699 {
700 sepa = SCIPfindSepa(source, SCIPsepaGetName(sepas[i]));
701
702 if( sepa != NULL )
703 {
704 sepas[i]->lastsepanode = sepa->lastsepanode;
705 sepas[i]->ncalls += sepa->ncalls;
706 sepas[i]->nrootcalls += sepa->nrootcalls;
707 sepas[i]->ncutoffs += sepa->ncutoffs;
708 sepas[i]->ncutsfound += sepa->ncutsfound;
709 sepas[i]->ncutsaddedviapool += sepa->ncutsaddedviapool;
710 sepas[i]->ncutsaddeddirect += sepa->ncutsaddeddirect;
712 sepas[i]->ncutsapplieddirect += sepa->ncutsapplieddirect;
713 sepas[i]->nconssfound += sepa->nconssfound;
714 sepas[i]->ndomredsfound += sepa->ndomredsfound;
715 sepas[i]->maxbounddist = MAX(sepas[i]->maxbounddist, sepa->maxbounddist);
716
717 tmptime = SCIPgetClockTime(target, sepas[i]->setuptime);
718 tmptime += SCIPgetClockTime(source, sepa->setuptime);
719 SCIP_CALL( SCIPsetClockTime(target, sepas[i]->setuptime, tmptime) );
720
721 tmptime = SCIPgetClockTime(target, sepas[i]->sepaclock);
722 tmptime += SCIPgetClockTime(source, sepa->sepaclock);
723 SCIP_CALL( SCIPsetClockTime(target, sepas[i]->sepaclock, tmptime) );
724 }
725 }
726
727 target->primal->nsolsfound = source->primal->nsolsfound;
728 target->primal->nbestsolsfound = source->primal->nbestsolsfound;
729 target->primal->nlimsolsfound = source->primal->nlimsolsfound;
730 SCIPprobSetDualbound(target->transprob, SCIPprobExternObjval(target->transprob, target->origprob, target->set, SCIPgetDualbound(source)));
731 root = SCIPgetRootNode(target);
732
733 if( root != NULL )
734 {
735 /* in the copied SCIP the dualbound is in the transformed space of the target */
736 root->lowerbound = SCIPgetDualbound(source);
737 root->estimate = root->lowerbound;
738 target->stat->rootlowerbound = root->lowerbound;
739 }
740
741 target->stat->nlpiterations = source->stat->nlpiterations;
742 target->stat->nrootlpiterations = source->stat->nrootlpiterations;
745 target->stat->nduallpiterations = source->stat->nduallpiterations;
751 target->stat->nnodelpiterations = source->stat->nnodelpiterations;
752 target->stat->ninitlpiterations = source->stat->ninitlpiterations;
756 target->stat->nsblpiterations = source->stat->nsblpiterations;
759 target->stat->nnodes = source->stat->nnodes;
760 target->stat->ninternalnodes = source->stat->ninternalnodes;
761 target->stat->nobjleaves = source->stat->nobjleaves;
762 target->stat->nfeasleaves = source->stat->nfeasleaves;
763 target->stat->ninfeasleaves = source->stat->ninfeasleaves;
764 target->stat->ntotalnodes = source->stat->ntotalnodes;
766 target->stat->ncreatednodes = source->stat->ncreatednodes;
767 target->stat->ncreatednodesrun = source->stat->ncreatednodesrun;
768 target->stat->nactivatednodes = source->stat->nactivatednodes;
769 target->stat->ndeactivatednodes = source->stat->ndeactivatednodes;
770 target->stat->nearlybacktracks = source->stat->nearlybacktracks;
772 target->stat->nbacktracks = source->stat->nbacktracks;
773 target->stat->ndelayedcutoffs = source->stat->ndelayedcutoffs;
774 target->stat->nreprops = source->stat->nreprops;
775 target->stat->nrepropboundchgs = source->stat->nrepropboundchgs;
776 target->stat->nrepropcutoffs = source->stat->nrepropcutoffs;
777 target->stat->nlpsolsfound = source->stat->nlpsolsfound;
778 target->stat->npssolsfound = source->stat->npssolsfound;
779 target->stat->nsbsolsfound = source->stat->nsbsolsfound;
780 target->stat->nlpbestsolsfound = source->stat->nlpbestsolsfound;
781 target->stat->npsbestsolsfound = source->stat->npsbestsolsfound;
782 target->stat->nsbbestsolsfound = source->stat->nsbbestsolsfound;
784 target->stat->lastdispnode = source->stat->lastdispnode;
785 target->stat->lastdivenode = source->stat->lastdivenode;
786 target->stat->lastconflictnode = source->stat->lastconflictnode;
787 target->stat->bestsolnode = source->stat->bestsolnode;
788 target->stat->domchgcount = source->stat->domchgcount;
789 target->stat->nboundchgs = source->stat->nboundchgs;
790 target->stat->nholechgs = source->stat->nholechgs;
791 target->stat->nprobboundchgs = source->stat->nprobboundchgs;
792 target->stat->nprobholechgs = source->stat->nprobholechgs;
793 target->stat->nsbdowndomchgs = source->stat->nsbdowndomchgs;
794 target->stat->nsbupdomchgs = source->stat->nsbupdomchgs;
796 target->stat->nnodesbeforefirst = source->stat->nnodesbeforefirst;
797 target->stat->ninitconssadded = source->stat->ninitconssadded;
798 target->stat->firstlpdualbound = SCIPprobExternObjval(target->transprob, target->origprob, target->set, source->stat->firstlpdualbound);
799 target->stat->vsidsweight = source->stat->vsidsweight;
800 target->stat->firstprimalbound = SCIPprobExternObjval(target->transprob, target->origprob, target->set, source->stat->firstprimalbound);
801 target->stat->firstprimaltime = source->stat->firstprimaltime;
802 target->stat->firstsolgap = source->stat->firstsolgap;
803 target->stat->lastsolgap = source->stat->lastsolgap;
804 target->stat->primalzeroittime = source->stat->primalzeroittime;
805 target->stat->dualzeroittime = source->stat->dualzeroittime;
806 target->stat->barrierzeroittime = source->stat->barrierzeroittime;
807 target->stat->maxcopytime = MAX(source->stat->maxcopytime, target->stat->maxcopytime);
808 target->stat->mincopytime = MIN(source->stat->mincopytime, target->stat->mincopytime);
809 target->stat->firstlptime = source->stat->firstlptime;
810 target->stat->lastbranchvalue = source->stat->lastbranchvalue;
811 target->stat->dualrefintegral = source->stat->dualrefintegral;
812 target->stat->primalrefintegral = source->stat->primalrefintegral;
814 target->stat->previousgap = source->stat->previousgap;
818 target->stat->lastlowerbound = source->stat->lastdualbound;
819 target->stat->lastupperbound = source->stat->lastprimalbound;
820 target->stat->lastdualbound = SCIPprobExternObjval(target->transprob, target->origprob, target->set, target->stat->lastlowerbound);
821 target->stat->lastprimalbound = SCIPprobExternObjval(target->transprob, target->origprob, target->set, target->stat->lastupperbound);
823 target->stat->referencebound = source->stat->referencebound;
824
825 /*tmptime = SCIPgetClockTime(target, target->stat->solvingtime);
826 tmptime += SCIPgetClockTime(source, source->stat->solvingtime);
827 SCIP_CALL( SCIPsetClockTime(target, target->stat->solvingtime, tmptime) );*/
828
829 /* TODO */
830 tmptime = SCIPgetClockTime(target, target->stat->solvingtimeoverall);
831 tmptime += SCIPgetClockTime(source, source->stat->solvingtimeoverall);
832 SCIP_CALL( SCIPsetClockTime(target, target->stat->solvingtimeoverall, tmptime) );
833
834 tmptime = SCIPgetClockTime(target, target->stat->presolvingtime);
835 tmptime += SCIPgetClockTime(source, source->stat->presolvingtime);
836 SCIP_CALL( SCIPsetClockTime(target, target->stat->presolvingtime, tmptime) );
837
838 tmptime = SCIPgetClockTime(target, target->stat->presolvingtimeoverall);
839 tmptime += SCIPgetClockTime(source, source->stat->presolvingtimeoverall);
840 SCIP_CALL( SCIPsetClockTime(target, target->stat->presolvingtimeoverall, tmptime) );
841
842 tmptime = SCIPgetClockTime(target, target->stat->primallptime);
843 tmptime += SCIPgetClockTime(source, source->stat->primallptime);
844 SCIP_CALL( SCIPsetClockTime(target, target->stat->primallptime, tmptime) );
845
846 tmptime = SCIPgetClockTime(target, target->stat->duallptime);
847 tmptime += SCIPgetClockTime(source, source->stat->duallptime);
848 SCIP_CALL( SCIPsetClockTime(target, target->stat->duallptime, tmptime) );
849
850 tmptime = SCIPgetClockTime(target, target->stat->lexduallptime);
851 tmptime += SCIPgetClockTime(source, source->stat->lexduallptime);
852 SCIP_CALL( SCIPsetClockTime(target, target->stat->lexduallptime, tmptime) );
853
854 tmptime = SCIPgetClockTime(target, target->stat->barrierlptime);
855 tmptime += SCIPgetClockTime(source, source->stat->barrierlptime);
856 SCIP_CALL( SCIPsetClockTime(target, target->stat->barrierlptime, tmptime) );
857
858 tmptime = SCIPgetClockTime(target, target->stat->divinglptime);
859 tmptime += SCIPgetClockTime(source, source->stat->divinglptime);
860 SCIP_CALL( SCIPsetClockTime(target, target->stat->divinglptime, tmptime) );
861
862 tmptime = SCIPgetClockTime(target, target->stat->strongbranchtime);
863 tmptime += SCIPgetClockTime(source, source->stat->strongbranchtime);
864 SCIP_CALL( SCIPsetClockTime(target, target->stat->strongbranchtime, tmptime) );
865
866 tmptime = SCIPgetClockTime(target, target->stat->conflictlptime);
867 tmptime += SCIPgetClockTime(source, source->stat->conflictlptime);
868 SCIP_CALL( SCIPsetClockTime(target, target->stat->conflictlptime, tmptime) );
869
870 tmptime = SCIPgetClockTime(target, target->stat->lpsoltime);
871 tmptime += SCIPgetClockTime(source, source->stat->lpsoltime);
872 SCIP_CALL( SCIPsetClockTime(target, target->stat->lpsoltime, tmptime) );
873
874 tmptime = SCIPgetClockTime(target, target->stat->pseudosoltime);
875 tmptime += SCIPgetClockTime(source, source->stat->pseudosoltime);
876 SCIP_CALL( SCIPsetClockTime(target, target->stat->pseudosoltime, tmptime) );
877
878 tmptime = SCIPgetClockTime(target, target->stat->sbsoltime);
879 tmptime += SCIPgetClockTime(source, source->stat->sbsoltime);
880 SCIP_CALL( SCIPsetClockTime(target, target->stat->sbsoltime, tmptime) );
881
882 tmptime = SCIPgetClockTime(target, target->stat->nodeactivationtime);
883 tmptime += SCIPgetClockTime(source, source->stat->nodeactivationtime);
884 SCIP_CALL( SCIPsetClockTime(target, target->stat->nodeactivationtime, tmptime) );
885
886 tmptime = SCIPgetClockTime(target, target->stat->nlpsoltime);
887 tmptime += SCIPgetClockTime(source, source->stat->nlpsoltime);
888 SCIP_CALL( SCIPsetClockTime(target, target->stat->nlpsoltime, tmptime) );
889
890 tmptime = SCIPgetClockTime(target, target->stat->strongpropclock);
891 tmptime += SCIPgetClockTime(source, source->stat->strongpropclock);
892 SCIP_CALL( SCIPsetClockTime(target, target->stat->strongpropclock, tmptime) );
893
894 tmptime = SCIPgetClockTime(target, target->stat->reoptupdatetime);
895 tmptime += SCIPgetClockTime(source, source->stat->reoptupdatetime);
896 SCIP_CALL( SCIPsetClockTime(target, target->stat->reoptupdatetime, tmptime) );
897
898 heur = source->stat->firstprimalheur;
899
900 if( heur != NULL )
901 target->stat->firstprimalheur = SCIPfindHeur(target, SCIPheurGetName(heur));
902
903 target->stat->status = source->stat->status;
904 target->stat->lastbranchdir = source->stat->lastbranchdir;
905 target->stat->lastsblpsolstats[0] = source->stat->lastsblpsolstats[0];
906 target->stat->lastsblpsolstats[1] = source->stat->lastsblpsolstats[1];
907 target->stat->nnz = source->stat->nnz;
908 target->stat->lpcount = source->stat->lpcount;
909 target->stat->nlps = source->stat->nlps;
910 target->stat->nrootlps = source->stat->nrootlps;
911 target->stat->nprimallps = source->stat->nprimallps;
912 target->stat->nprimalzeroitlps = source->stat->nprimalzeroitlps;
913 target->stat->nduallps = source->stat->nduallps;
914 target->stat->ndualzeroitlps = source->stat->ndualzeroitlps;
915 target->stat->nlexduallps = source->stat->nlexduallps;
916 target->stat->nbarrierlps = source->stat->nbarrierlps;
917 target->stat->nbarrierzeroitlps = source->stat->nbarrierzeroitlps;
918 target->stat->nprimalresolvelps = source->stat->nprimalresolvelps;
919 target->stat->ndualresolvelps = source->stat->ndualresolvelps;
921 target->stat->nnodelps = source->stat->nnodelps;
922 target->stat->ninitlps = source->stat->ninitlps;
923 target->stat->ndivinglps = source->stat->ndivinglps;
924 target->stat->ndivesetlps = source->stat->ndivesetlps;
925 target->stat->nsbdivinglps = source->stat->nsbdivinglps;
926 target->stat->nstrongbranchs = source->stat->nstrongbranchs;
928 target->stat->nconflictlps = source->stat->nconflictlps;
929 target->stat->nnlps = source->stat->nnlps;
930 target->stat->nisstoppedcalls = source->stat->nisstoppedcalls;
931 target->stat->totaldivesetdepth = source->stat->totaldivesetdepth;
932 target->stat->ndivesetcalls = source->stat->ndivesetcalls;
933 target->stat->nruns = source->stat->nruns;
934 target->stat->nconfrestarts = source->stat->nconfrestarts;
935 target->stat->nrootboundchgs = source->stat->nrootboundchgs;
936 target->stat->nrootboundchgsrun = source->stat->nrootboundchgsrun;
937 target->stat->nrootintfixings = source->stat->nrootintfixings;
939 target->stat->prevrunnvars = source->stat->prevrunnvars;
940 target->stat->npricerounds = source->stat->npricerounds;
941 target->stat->nseparounds = source->stat->nseparounds;
942 target->stat->maxdepth = source->stat->maxdepth;
943 target->stat->maxtotaldepth = source->stat->maxtotaldepth;
944 target->stat->plungedepth = source->stat->plungedepth;
945 target->stat->npresolrounds += source->stat->npresolrounds;
946 target->stat->npresolroundsfast += source->stat->npresolroundsfast;
947 target->stat->npresolroundsmed += source->stat->npresolroundsmed;
948 target->stat->npresolroundsext += source->stat->npresolroundsext;
949 target->stat->npresolfixedvars += source->stat->npresolfixedvars;
950 target->stat->npresolaggrvars += source->stat->npresolaggrvars;
951 target->stat->npresolchgvartypes += source->stat->npresolchgvartypes;
952 target->stat->npresolchgbds += source->stat->npresolchgbds;
953 target->stat->npresoladdholes += source->stat->npresoladdholes;
954 target->stat->npresoldelconss += source->stat->npresoldelconss;
955 target->stat->npresoladdconss += source->stat->npresoladdconss;
956 target->stat->npresolupgdconss += source->stat->npresolupgdconss;
957 target->stat->npresolchgcoefs += source->stat->npresolchgcoefs;
958 target->stat->npresolchgsides += source->stat->npresolchgsides;
959 target->stat->nrunsbeforefirst = source->stat->nrunsbeforefirst;
960 target->stat->firstprimaldepth = source->stat->firstprimaldepth;
961 target->stat->ncopies += source->stat->ncopies;
962 target->stat->nreoptruns = source->stat->nreoptruns;
963
964 /* set the stage but do not set to earlier stage */
965 target->set->stage = MAX(source->set->stage, target->set->stage);
966
967 return SCIP_OKAY;
968}
void SCIPconcsolverSetTimeSinceLastSync(SCIP_CONCSOLVER *concsolver, SCIP_Real time)
Definition concsolver.c:535
SCIP_RETCODE SCIPconcsolverExec(SCIP_CONCSOLVER *concsolver)
Definition concsolver.c:330
SCIP_Real SCIPconcsolverGetSyncFreq(SCIP_CONCSOLVER *concsolver)
Definition concsolver.c:513
SCIP_RETCODE SCIPconcsolverGetSolvingData(SCIP_CONCSOLVER *concsolver, SCIP *scip)
Definition concsolver.c:348
SCIP_RETCODE SCIPconcsolverSync(SCIP_CONCSOLVER *concsolver, SCIP_SET *set)
Definition concsolver.c:378
SCIP_Longint SCIPconcsolverGetMemTotal(SCIP_CONCSOLVER *concsolver)
Definition concsolver.c:523
data structures for concurrent solvers
SCIP_Real SCIPgetConcurrentDualbound(SCIP *scip)
Definition concurrent.c:318
SCIP_RETCODE SCIPconcurrentSolve(SCIP *scip)
Definition concurrent.c:508
SCIP_Real SCIPgetConcurrentPrimalbound(SCIP *scip)
Definition concurrent.c:333
SCIP_RETCODE SCIPcreateConcurrent(SCIP *scip, SCIP_CONCSOLVER *concsolver, int *varperm, int nvars)
Definition concurrent.c:67
SCIP_RETCODE SCIPsynchronize(SCIP *scip)
Definition concurrent.c:258
SCIP_RETCODE SCIPincrementConcurrentTime(SCIP *scip, SCIP_Real val)
Definition concurrent.c:199
int SCIPgetConcurrentVaridx(SCIP *scip, SCIP_VAR *var)
Definition concurrent.c:434
SCIP_RETCODE SCIPfreeConcurrent(SCIP *scip)
Definition concurrent.c:161
SCIP_RETCODE SCIPaddConcurrentBndchg(SCIP *scip, SCIP_VAR *var, SCIP_Real val, SCIP_BOUNDTYPE bndtype)
Definition concurrent.c:398
SCIP_RETCODE SCIPcopySolStats(SCIP_SOL *source, SCIP_SOL *target)
Definition concurrent.c:416
SCIP_Longint SCIPgetConcurrentMemTotal(SCIP *scip)
Definition concurrent.c:300
SCIP_BOUNDSTORE * SCIPgetConcurrentGlobalBoundChanges(SCIP *scip)
Definition concurrent.c:472
SCIP_RETCODE SCIPaddConcurrentSolver(SCIP *scip, SCIP_CONCSOLVER *concsolver)
Definition concurrent.c:148
static SCIP_RETCODE execConcsolver(void *args)
Definition concurrent.c:487
SCIP_CONCSOLVER ** SCIPgetConcurrentSolvers(SCIP *scip)
Definition concurrent.c:137
SCIP_Bool SCIPIsConcurrentSolNew(SCIP *scip, SCIP_SOL *sol)
Definition concurrent.c:459
SCIP_Longint SCIPgetConcurrentNTightenedBnds(SCIP *scip)
Definition concurrent.c:362
void SCIPenableConcurrentBoundStorage(SCIP *scip)
Definition concurrent.c:288
int SCIPgetNConcurrentSolvers(SCIP *scip)
Definition concurrent.c:126
SCIP_RETCODE SCIPcopyConcurrentSolvingStats(SCIP *source, SCIP *target)
Definition concurrent.c:577
SCIP_RETCODE SCIPaddConcurrentSol(SCIP *scip, SCIP_SOL *sol)
Definition concurrent.c:383
SCIP_Real SCIPgetConcurrentGap(SCIP *scip)
Definition concurrent.c:348
struct SCIP_ConcurrentData SCIP_CONCURRENTDATA
Definition concurrent.c:64
void SCIPdisableConcurrentBoundStorage(SCIP *scip)
Definition concurrent.c:276
SCIP_Longint SCIPgetConcurrentNTightenedIntBnds(SCIP *scip)
Definition concurrent.c:373
helper functions for concurrent scip solvers
#define NULL
Definition def.h:255
#define SCIP_Longint
Definition def.h:148
#define SCIP_Bool
Definition def.h:98
#define MIN(x, y)
Definition def.h:231
#define SCIP_Real
Definition def.h:163
#define FALSE
Definition def.h:101
#define MAX(x, y)
Definition def.h:227
#define SCIP_CALL_ABORT(x)
Definition def.h:341
#define SCIP_CALL(x)
Definition def.h:362
wrappers for OpenMP defines
#define TPI_SINGLE
Definition def_openmp.h:83
#define TPI_PARA
Definition def_openmp.h:78
SCIP_RETCODE SCIPeventqueueAdd(SCIP_EVENTQUEUE *eventqueue, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_PRIMAL *primal, SCIP_LP *lp, SCIP_BRANCHCAND *branchcand, SCIP_EVENTFILTER *eventfilter, SCIP_EVENT **event)
Definition event.c:2561
SCIP_RETCODE SCIPeventCreateSync(SCIP_EVENT **event, BMS_BLKMEM *blkmem)
Definition event.c:555
internal methods for managing events
void SCIPeventGlobalbndClearBoundChanges(SCIP_EVENTHDLR *eventhdlr)
SCIP_RETCODE SCIPincludeEventHdlrGlobalbnd(SCIP *scip)
void SCIPeventGlobalbndEnableBoundStorage(SCIP_EVENTHDLR *eventhdlr)
SCIP_BOUNDSTORE * SCIPeventGlobalbndGetBoundChanges(SCIP_EVENTHDLR *eventhdlr)
void SCIPeventGlobalbndDisableBoundStorage(SCIP_EVENTHDLR *eventhdlr)
eventhdlr for storing all global bound changes
SCIP_Real SCIPcomputeGap(SCIP_Real eps, SCIP_Real inf, SCIP_Real primalbound, SCIP_Real dualbound)
Definition misc.c:11180
SCIP_RETCODE SCIPheurSyncPassSol(SCIP *scip, SCIP_HEUR *heur, SCIP_SOL *sol)
Definition heur_sync.c:194
SCIP_Longint SCIPpropSyncGetNTightenedBnds(SCIP_PROP *prop)
Definition prop_sync.c:358
SCIP_RETCODE SCIPpropSyncAddBndchg(SCIP *scip, SCIP_PROP *prop, SCIP_VAR *var, SCIP_Real val, SCIP_BOUNDTYPE bndtype)
Definition prop_sync.c:318
SCIP_Longint SCIPpropSyncGetNTightenedIntBnds(SCIP_PROP *prop)
Definition prop_sync.c:373
SCIP_RETCODE SCIPincludeHeurSync(SCIP *scip)
Definition heur_sync.c:162
SCIP_RETCODE SCIPincludePropSync(SCIP *scip)
Definition prop_sync.c:293
SCIP_EVENTHDLR * SCIPfindEventhdlr(SCIP *scip, const char *name)
Definition scip_event.c:241
SCIP_HEUR ** SCIPgetHeurs(SCIP *scip)
Definition scip_heur.c:276
int SCIPgetNHeurs(SCIP *scip)
Definition scip_heur.c:287
SCIP_HEUR * SCIPfindHeur(SCIP *scip, const char *name)
Definition scip_heur.c:263
const char * SCIPheurGetName(SCIP_HEUR *heur)
Definition heur.c:1467
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
Definition scip_mem.h:110
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
Definition scip_mem.c:57
#define SCIPallocBlockMemoryArray(scip, ptr, num)
Definition scip_mem.h:93
#define SCIPfreeBlockMemory(scip, ptr)
Definition scip_mem.h:108
SCIP_Longint SCIPgetMemTotal(SCIP *scip)
Definition scip_mem.c:113
#define SCIPallocBlockMemory(scip, ptr)
Definition scip_mem.h:89
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
Definition scip_mem.h:105
SCIP_SYNCSTORE * SCIPgetSyncstore(SCIP *scip)
SCIP_PRESOL ** SCIPgetPresols(SCIP *scip)
SCIP_PRESOL * SCIPfindPresol(SCIP *scip, const char *name)
int SCIPgetNPresols(SCIP *scip)
const char * SCIPpresolGetName(SCIP_PRESOL *presol)
Definition presol.c:625
SCIP_PROP * SCIPfindProp(SCIP *scip, const char *name)
Definition scip_prop.c:333
int SCIPgetNProps(SCIP *scip)
Definition scip_prop.c:359
const char * SCIPpropGetName(SCIP_PROP *prop)
Definition prop.c:951
SCIP_PROP ** SCIPgetProps(SCIP *scip)
Definition scip_prop.c:346
int SCIPgetNSepas(SCIP *scip)
Definition scip_sepa.c:279
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
Definition sepa.c:746
SCIP_SEPA * SCIPfindSepa(SCIP *scip, const char *name)
Definition scip_sepa.c:253
SCIP_SEPA ** SCIPgetSepas(SCIP *scip)
Definition scip_sepa.c:266
int SCIPsolGetIndex(SCIP_SOL *sol)
Definition sol.c:4305
SCIP_Real SCIPgetDualbound(SCIP *scip)
SCIP_RETCODE SCIPresetClock(SCIP *scip, SCIP_CLOCK *clck)
SCIP_RETCODE SCIPfreeClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_RETCODE SCIPcreateWallClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_Real SCIPgetClockTime(SCIP *scip, SCIP_CLOCK *clck)
SCIP_RETCODE SCIPstartClock(SCIP *scip, SCIP_CLOCK *clck)
SCIP_RETCODE SCIPsetClockTime(SCIP *scip, SCIP_CLOCK *clck, SCIP_Real sec)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Real SCIPepsilon(SCIP *scip)
SCIP_NODE * SCIPgetRootNode(SCIP *scip)
Definition scip_tree.c:110
int SCIPvarGetProbindex(SCIP_VAR *var)
Definition var.c:23662
SCIP_Bool SCIPvarIsOriginal(SCIP_VAR *var)
Definition var.c:23417
return SCIP_OKAY
static SCIP_SOL * sol
assert(minobj< SCIPgetCutoffbound(scip))
int nvars
SCIP_VAR * var
primal heuristic that adds solutions from synchronization
SCIP_Real SCIPprobExternObjval(SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_SET *set, SCIP_Real objval)
Definition prob.c:2520
void SCIPprobSetDualbound(SCIP_PROB *prob, SCIP_Real dualbound)
Definition prob.c:1702
internal methods for storing and manipulating the main problem
propagator for applying global bound changes that were communicated by other concurrent solvers
SCIP callable library.
SCIP_RETCODE SCIPsetIncludeConcsolver(SCIP_SET *set, SCIP_CONCSOLVER *concsolver)
Definition set.c:4794
internal methods for global SCIP settings
internal methods for problem statistics
SCIP_CLOCK * heurclock
SCIP_CLOCK * setuptime
SCIP_Longint ncalls
Definition struct_heur.h:99
SCIP_Longint nsolsfound
SCIP_Longint nbestsolsfound
SCIP_Real lowerbound
SCIP_Real estimate
SCIP_CLOCK * setuptime
SCIP_CLOCK * presolclock
SCIP_Longint nbestsolsfound
SCIP_Longint nsolsfound
SCIP_Longint nlimsolsfound
SCIP_CLOCK * resproptime
Definition struct_prop.h:69
SCIP_CLOCK * presoltime
Definition struct_prop.h:70
SCIP_Longint ncutoffs
Definition struct_prop.h:50
SCIP_CLOCK * setuptime
Definition struct_prop.h:66
SCIP_CLOCK * sbproptime
Definition struct_prop.h:68
SCIP_CLOCK * proptime
Definition struct_prop.h:67
SCIP_Longint ndomredsfound
Definition struct_prop.h:51
SCIP_Longint ncalls
Definition struct_prop.h:48
SCIP_Longint nrespropcalls
Definition struct_prop.h:49
SCIP_Longint nrootcalls
Definition struct_sepa.h:50
SCIP_Longint ncutoffs
Definition struct_sepa.h:51
SCIP_Longint ncutsaddedviapool
Definition struct_sepa.h:55
SCIP_Longint ndomredsfound
Definition struct_sepa.h:60
SCIP_Longint ncutsfound
Definition struct_sepa.h:52
SCIP_Longint lastsepanode
Definition struct_sepa.h:48
SCIP_CLOCK * sepaclock
Definition struct_sepa.h:75
SCIP_Longint nconssfound
Definition struct_sepa.h:59
SCIP_Longint ncalls
Definition struct_sepa.h:49
SCIP_Longint ncutsappliedviapool
Definition struct_sepa.h:57
SCIP_CLOCK * setuptime
Definition struct_sepa.h:74
SCIP_Longint ncutsapplieddirect
Definition struct_sepa.h:58
SCIP_Longint ncutsaddeddirect
Definition struct_sepa.h:56
SCIP_Real maxbounddist
Definition struct_sepa.h:61
SCIP_STAGE stage
Definition struct_set.h:76
int depth
Definition struct_sol.h:89
int runnum
Definition struct_sol.h:88
SCIP_Real time
Definition struct_sol.h:76
SCIP_Longint nodenum
Definition struct_sol.h:77
SCIP_Longint nnlps
SCIP_Longint nlexdualresolvelpiterations
Definition struct_stat.h:73
SCIP_STATUS status
SCIP_Longint nearlybacktracks
Definition struct_stat.h:96
SCIP_Longint ndualresolvelpiterations
Definition struct_stat.h:72
SCIP_Real rootlowerbound
SCIP_Longint nrootstrongbranchs
SCIP_Longint nprimalresolvelpiterations
Definition struct_stat.h:71
int npresoladdholes
SCIP_Longint nprimallps
SCIP_Real dualrefintegral
SCIP_CLOCK * strongpropclock
SCIP_Longint nsbdowndomchgs
SCIP_Real previousgap
SCIP_Longint nprimalzeroitlps
SCIP_Longint nreprops
SCIP_CLOCK * sbsoltime
SCIP_Real lastsolgap
SCIP_Longint nnodes
Definition struct_stat.h:84
int npresolupgdconss
SCIP_Longint nsblpiterations
Definition struct_stat.h:79
SCIP_Longint ntotalnodes
Definition struct_stat.h:89
SCIP_CLOCK * strongbranchtime
SCIP_Real previousdualrefgap
int ndivesetcalls
SCIP_CLOCK * barrierlptime
SCIP_Real dualzeroittime
SCIP_Longint nduallps
SCIP_Longint ninfeasleaves
Definition struct_stat.h:88
SCIP_Longint nrepropcutoffs
SCIP_Longint nduallpiterations
Definition struct_stat.h:68
SCIP_Longint ncreatednodesrun
Definition struct_stat.h:93
SCIP_Longint ndelayedcutoffs
Definition struct_stat.h:99
SCIP_CLOCK * nodeactivationtime
SCIP_Longint nlps
SCIP_CLOCK * reoptupdatetime
SCIP_Real lastlowerbound
SCIP_Longint ndualresolvelps
SCIP_Real rootlpbestestimate
SCIP_Longint nbarrierlpiterations
Definition struct_stat.h:70
SCIP_Longint domchgcount
SCIP_Longint nnodelps
SCIP_Longint nconflictlps
SCIP_LPSOLSTAT lastsblpsolstats[2]
SCIP_Longint nnz
SCIP_CLOCK * divinglptime
SCIP_Longint nrootsblpiterations
Definition struct_stat.h:80
SCIP_Longint ndivesetlpiterations
Definition struct_stat.h:77
SCIP_Longint lpcount
SCIP_Longint nprobholechgs
SCIP_CLOCK * presolvingtime
int prevrunnvars
SCIP_Longint nrootfirstlpiterations
Definition struct_stat.h:66
SCIP_Longint nbacktracks
Definition struct_stat.h:98
SCIP_Real maxcopytime
SCIP_Longint ninitconssadded
int nseparounds
SCIP_Longint ndivesetlps
SCIP_Real previousprimalrefgap
SCIP_Longint nlpiterations
Definition struct_stat.h:64
SCIP_Longint nprimalresolvelps
SCIP_Longint ndivinglpiterations
Definition struct_stat.h:76
SCIP_CLOCK * nlpsoltime
int nconfrestarts
int firstprimaldepth
SCIP_Longint nfeasleaves
Definition struct_stat.h:87
SCIP_Longint nsbsolsfound
int npricerounds
SCIP_CLOCK * solvingtimeoverall
int npresolroundsext
SCIP_Longint lastdivenode
SCIP_Longint nlexdualresolvelps
int npresolaggrvars
SCIP_Longint ndeactivatednodes
Definition struct_stat.h:95
int nrootboundchgs
SCIP_Longint nrepropboundchgs
SCIP_Longint nnodesaboverefbound
Definition struct_stat.h:97
SCIP_Real firstlpdualbound
SCIP_Longint nlexduallpiterations
Definition struct_stat.h:69
SCIP_Longint nrootlpiterations
Definition struct_stat.h:65
SCIP_Real firstprimaltime
int nrootintfixingsrun
SCIP_Longint nlexduallps
SCIP_Longint ninternalnodes
Definition struct_stat.h:85
int nrootintfixings
SCIP_Real firstsolgap
SCIP_Real lastdualbound
SCIP_Longint lastdispnode
SCIP_Real vsidsweight
int npresolchgvartypes
SCIP_Longint lastconflictnode
int nrunsbeforefirst
SCIP_Real primalrefintegral
SCIP_Longint ntotalinternalnodes
Definition struct_stat.h:90
SCIP_Longint nobjleaves
Definition struct_stat.h:86
SCIP_HEUR * firstprimalheur
SCIP_Real referencebound
SCIP_CLOCK * duallptime
SCIP_BRANCHDIR lastbranchdir
SCIP_CLOCK * pseudosoltime
SCIP_CLOCK * presolvingtimeoverall
int npresoldelconss
SCIP_Longint nnodesbeforefirst
SCIP_Longint nlpbestsolsfound
SCIP_Longint nboundchgs
int npresolchgbds
int npresolroundsfast
SCIP_Real firstlptime
int nrootboundchgsrun
SCIP_Longint ndivinglps
SCIP_Longint nholechgs
SCIP_Longint npsbestsolsfound
SCIP_Real lastupperbound
SCIP_Real barrierzeroittime
int npresolchgcoefs
SCIP_Longint totaldivesetdepth
SCIP_Longint ninitlps
SCIP_Real previntegralevaltime
SCIP_Longint nexternalsolsfound
SCIP_Longint nisstoppedcalls
int maxtotaldepth
SCIP_Longint ndualzeroitlps
SCIP_Longint nrootlps
SCIP_Longint nsbdivinglps
SCIP_Longint nnodelpiterations
Definition struct_stat.h:74
SCIP_Real lastprimalbound
SCIP_Longint nactivatednodes
Definition struct_stat.h:94
int plungedepth
SCIP_Longint bestsolnode
SCIP_Longint nsbbestsolsfound
SCIP_Longint nsbtimesiterlimhit
SCIP_Real primalzeroittime
SCIP_CLOCK * primallptime
int npresoladdconss
SCIP_Longint nconflictlpiterations
Definition struct_stat.h:81
int npresolroundsmed
SCIP_Longint nstrongbranchs
SCIP_Real mincopytime
SCIP_Longint npssolsfound
SCIP_Longint nbarrierzeroitlps
SCIP_CLOCK * lpsoltime
SCIP_Longint nprimallpiterations
Definition struct_stat.h:67
SCIP_Real primaldualintegral
SCIP_Longint nbarrierlps
SCIP_Longint nlpsolsfound
SCIP_Longint nsbupdomchgs
SCIP_Real lastbranchvalue
int npresolrounds
SCIP_Longint ninitlpiterations
Definition struct_stat.h:75
SCIP_Longint nprobboundchgs
int npresolchgsides
SCIP_Longint ncreatednodes
Definition struct_stat.h:92
SCIP_CLOCK * conflictlptime
SCIP_Longint nsbdivinglpiterations
Definition struct_stat.h:78
SCIP_Real firstprimalbound
SCIP_CLOCK * lexduallptime
int npresolfixedvars
SCIP_PROB * origprob
Definition struct_scip.h:83
SCIP_STAT * stat
Definition struct_scip.h:82
SCIP_EVENTFILTER * eventfilter
Definition struct_scip.h:92
SCIP_EVENTQUEUE * eventqueue
Definition struct_scip.h:91
SCIP_SET * set
Definition struct_scip.h:75
SCIP_PROB * transprob
SCIP_PRIMAL * primal
Definition struct_scip.h:98
concurrent data struct
datastructures for primal heuristics
datastructures for presolvers
datastructures for collecting primal CIP solutions and primal informations
datastructures for propagators
SCIP main data structure.
datastructures for separators
datastructures for global SCIP settings
datastructures for storing primal CIP solutions
data structures for branch and bound tree
SCIP_Real SCIPsyncstoreGetLastUpperbound(SCIP_SYNCSTORE *syncstore)
Definition syncstore.c:272
SCIP_Real SCIPsyncstoreGetLastLowerbound(SCIP_SYNCSTORE *syncstore)
Definition syncstore.c:283
int SCIPsyncstoreGetWinner(SCIP_SYNCSTORE *syncstore)
Definition syncstore.c:531
void SCIPsyncstoreSetSolveIsStopped(SCIP_SYNCSTORE *syncstore, SCIP_Bool stopped)
Definition syncstore.c:259
SCIP_Bool SCIPsyncstoreIsInitialized(SCIP_SYNCSTORE *syncstore)
Definition syncstore.c:795
int SCIPsyncstoreGetNSolvers(SCIP_SYNCSTORE *syncstore)
Definition syncstore.c:555
the function declarations for the synchronization store
the type definitions for the SCIP parallel interface
SCIP_RETCODE SCIPtpiCreateJob(SCIP_JOB **job, int jobid, SCIP_RETCODE(*jobfunc)(void *args), void *jobarg)
Definition tpi_none.c:156
SCIP_RETCODE SCIPtpiSubmitJob(SCIP_JOB *job, SCIP_SUBMITSTATUS *status)
Definition tpi_none.c:180
SCIP_RETCODE SCIPtpiCollectJobs(int jobid)
Definition tpi_none.c:193
int SCIPtpiGetNewJobID(void)
Definition tpi_none.c:172
struct SCIP_Clock SCIP_CLOCK
Definition type_clock.h:49
struct SCIP_ConcSolver SCIP_CONCSOLVER
struct SCIP_Event SCIP_EVENT
Definition type_event.h:161
struct SCIP_Heur SCIP_HEUR
Definition type_heur.h:76
enum SCIP_BoundType SCIP_BOUNDTYPE
Definition type_lp.h:60
struct SCIP_Presol SCIP_PRESOL
Definition type_presol.h:50
struct SCIP_Prop SCIP_PROP
Definition type_prop.h:51
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_Sepa SCIP_SEPA
Definition type_sepa.h:51
struct SCIP_Sol SCIP_SOL
Definition type_sol.h:57
the type definitions for the synchronization store
@ SCIP_PARA_DETERMINISTIC
struct SCIP_SyncStore SCIP_SYNCSTORE
struct SCIP_BoundStore SCIP_BOUNDSTORE
enum SCIP_Submitstatus SCIP_SUBMITSTATUS
Definition type_tpi.h:50
@ SCIP_SUBMIT_SUCCESS
Definition type_tpi.h:48
struct SCIP_Job SCIP_JOB
Definition type_tpi.h:67
struct SCIP_Node SCIP_NODE
Definition type_tree.h:63
struct SCIP_Var SCIP_VAR
Definition type_var.h:166