Scippy

UG

Ubiquity Generator framework

fscip.cpp
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the program and software framework */
4/* UG --- Ubquity Generator Framework */
5/* */
6/* Copyright Written by Yuji Shinano <shinano@zib.de>, */
7/* Copyright (C) 2021-2025 by Zuse Institute Berlin, */
8/* licensed under LGPL version 3 or later. */
9/* Commercial licenses are available through <licenses@zib.de> */
10/* */
11/* This code is free software; you can redistribute it and/or */
12/* modify it under the terms of the GNU Lesser General Public License */
13/* as published by the Free Software Foundation; either version 3 */
14/* of the License, or (at your option) any later version. */
15/* */
16/* This program is distributed in the hope that it will be useful, */
17/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
18/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
19/* GNU Lesser General Public License for more details. */
20/* */
21/* You should have received a copy of the GNU Lesser General Public License */
22/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
23/* */
24/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
25
26/**@file fscip.cpp
27 * @brief FiberSCIP MAIN.
28 * @author Yuji Shinano
29 *
30 *
31 *
32 */
33
34/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
35
36
37#ifndef _MSC_VER
38#include <unistd.h>
39#endif
40#include <cfloat>
41#include <thread>
42#include <cstdlib>
43#include <signal.h>
50#include "ug_bb/bbParaNodeTh.h"
51#include "scip/scip.h"
52#include "scipParaCommTh.h"
53#include "scipParaInstance.h"
55#include "scipParaSolver.h"
56#include "scipParaInitiator.h"
58#include "scipParaParamSet.h"
59#ifdef UG_WITH_ULIBC
60#include "ulibc.h"
61#endif
62#ifdef UG_WITH_UGS
63#include "ugs/ugsDef.h"
64#include "ugs/ugsParaCommMpi.h"
65#endif
66
67using namespace UG;
68using namespace ParaSCIP;
69
70long long virtualMemUsedAtLc = 0;
71double memoryLimitOfSolverSCIP = 8796093022207;
72
73static ScipParaCommTh *comm = 0;
75static int nSolvers = 0;
78static bool interrupted = false;
79
81 int argc;
82 char **argv;
84 int rank;
85};
86
88
89extern void
91extern void
92setUserPlugins(ParaInstance *instance); /** this should not be used */
93extern void
95
96/** interrupt handler for CTRL-C interrupts */
97static
99 int signum /**< interrupt signal number */
100 )
101{
102 // std::cout << "in interrupt hander" << std::endl;
103 if (paraLc == 0)
104 {
105 if (paraInitiator != 0)
106 dynamic_cast<ScipParaInitiator *>(paraInitiator)->interrupt(); //this interrupt initSolve, see below
107 }
108 else
109 {
110 paraLc->interrupt();
111 // delete paraLc;
112 }
113
114 interrupted = true;
115 exit(0);
116
117}
118
119void
121 char **argv
122 )
123{
124 std::cout << std::endl;
125 std::cout << "syntax: " << argv[0] << " fscip_param_file problem_file_name "
126 << "[-l <logfile>] [-q] [-sl <settings>] [-s <settings>] [-sr <root_settings>] [-w <prefix_warm>] [-sth <number>] [-fsol <solution_file>] [-isol <initial solution file]" << std::endl;
127 std::cout << " -l <logfile> : copy output into log file" << std::endl;
128 std::cout << " -q : suppress screen messages" << std::endl;
129 std::cout << " -c : print comment messages" << std::endl;
130 std::cout << " -sl <settings> : load parameter settings (.set) file for LC presolving" << std::endl;
131 std::cout << " -s <settings> : load parameter settings (.set) file for solvers" << std::endl;
132 std::cout << " -sr <root_settings> : load parameter settings (.set) file for root" << std::endl;
133 std::cout << " -w <prefix_warm> : warm start file prefix ( prefix_warm_nodes.gz and prefix_warm_solution.txt are read )" << std::endl;
134 std::cout << " -sth <number> : the number of solver threads used" << std::endl;
135 std::cout << " -fsol <solution file> : specify output solution file" << std::endl;
136 std::cout << " -qsol : quit to output solution file" << std::endl;
137 std::cout << " -isol <intial solution file> : specify initial solution file" << std::endl;
138}
139
140void
142 // ParaInitiator *paraInitiator
143 )
144{
146 {
147 std::ofstream ofsParamsOutputFile;
148 std::ostringstream s;
150 {
152 }
153 else
154 {
157 }
158 s << ".prm";
159 ofsParamsOutputFile.open(s.str().c_str());
160 if( !ofsParamsOutputFile ){
161 std::cout << "Cannot open ParaParams output file: file name = " << s.str() << std::endl;
162 exit(1);
163 }
164 paraParamSet->write(&ofsParamsOutputFile);
165 ofsParamsOutputFile.close();
166 }
167}
168
169void
171 // ParaInitiator *paraInitiator
172 )
173{
175 {
176 std::ofstream ofsSolverParamsOutputFile;
177 std::ostringstream s;
179 {
181 }
182 else
183 {
186 }
187 s << "_solver.prm";
188 ofsSolverParamsOutputFile.open(s.str().c_str());
189 if( !ofsSolverParamsOutputFile ){
190 std::cout << "Cannot open Solver parameters output file: file name = " << s.str() << std::endl;
191 exit(1);
192 }
193 paraInitiator->writeSolverParameters(&ofsSolverParamsOutputFile);
194 ofsSolverParamsOutputFile.close();
195 }
196}
197
198void *
200 void *threadData
201 )
202{
203 SolverThreadData *solverThreadData = static_cast<SolverThreadData *>(threadData);
204
205 assert( solverThreadData->rank < comm->getSize() );
206// #ifdef _COMM_CPP11
207 comm->solverInit(solverThreadData->rank, paraParamSet);
208// #endif
209
210#ifdef UG_WITH_ULIBC
211 printf("ULIBC_bind_pthread_thread( comm->getRank(): %d )\n", comm->getRank());
212 ULIBC_bind_pthread_thread( comm->getRank() );
213#endif
214
215#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
216 SCIPmessageSetDefaultHandler();
217#endif
218
219#ifdef _PLACEME
220 /*
221 * Do placement
222 */
223
224 int ierr = placeme(1, PLACEME_SCHEME_DEFAULT, PLACEME_LEVEL_DEFAULT, 1, "HLRN| ");
225 switch(ierr) {
226 case PLACEME_SUCCESS:
227 fprintf(stdout,"task %2d: pinning successful\n", comm->getRank());
228 break;
229 case PLACEME_NOTDONE:
230 fprintf(stdout,"task %2d: pinning not changed on request\n", comm->getRank());
231 break;
232 default:
233 fprintf(stdout,"task %2d: pinning not successful, left unchanged\n", comm->getRank());
234 }
235#endif
236
237 int argc = solverThreadData->argc;
238 char **argv = solverThreadData->argv;
239 ParaTimer *paraTimer = solverThreadData->paraTimer;
240 ParaDeterministicTimer *detTimer = 0;
241
243 {
244 detTimer = new ScipParaDeterministicTimer();
245 }
246
247 ParaInstance *paraInstance = comm->createParaInstance();
248 // setUserPlugins(paraInstance); // instance data should not be read from original data file
250 ScipParaSolver *paraSolver = new ScipParaSolver(argc, argv, comm, paraParamSet, paraInstance, detTimer, paraTimer->getElapsedTime(), true );
251 setUserPlugins(paraSolver);
252
254 {
255 comm->lockApp();
256 std::cout << "After Rank " << comm->getRank() << " Solver initialized 1: " << paraTimer->getElapsedTime() << std::endl;
257 comm->unlockApp();
258 }
259
260 // if( paraParamSet->getIntParamValue(RampUpPhaseProcess) == 0 || paraSolver->isWarmStarted() )
263 )
264 {
265 paraSolver->run();
266 }
268 paraParamSet->getIntParamValue(RampUpPhaseProcess) == 2 ) // racing ramp-up
269 {
270 int source;
271 int tag;
272 (void)comm->probe(&source, &tag);
273 if( tag == TagKeepRacing )
274 {
275 int keep = 0;
277 comm->receive( &keep, 1, ParaINT, 0, UG::TagKeepRacing)
278 );
279 if( keep == 0 )
280 {
281 dynamic_cast<BbParaSolver *>(paraSolver)->setKeepRacing(false);
282 }
283 else
284 {
285 dynamic_cast<BbParaSolver *>(paraSolver)->setKeepRacing(true);
286 }
287 (void)comm->probe(&source, &tag);
290 racingRampUpParamSet->receive(comm, 0)
291 );
293 {
294 comm->lockApp();
295 std::cout << "After Rank " << comm->getRank() << " Solver initialized 2: " << paraTimer->getElapsedTime() << std::endl;
296 comm->unlockApp();
297 }
298 paraSolver->run( racingRampUpParamSet );
299 }
300 else
301 {
302 if( tag == TagTerminateRequest )
303 {
305 comm->receive( NULL, 0, ParaBYTE, source, TagTerminateRequest )
306 );
307 // when solver is deleted, solver's destructor sends termination status
308 }
309 else
310 {
311 THROW_LOGICAL_ERROR2("Invalid Tag is received in ParaSCIP solver main: ", tag )
312 }
313 }
314 }
315 else
316 {
317 THROW_LOGICAL_ERROR2("Invalid RampUpPhaseProcess: ", paraParamSet->getIntParamValue(RampUpPhaseProcess) )
318 }
319 delete solverThreadData;
320 delete paraSolver;
321 if( detTimer ) delete detTimer;
322
323 // ULIBC_unbind_thread();
324
325 return 0;
326}
327
328//void *
329//runTimeLimitMonitorThread(
330// void *threadData
331// )
332//{
333//// #ifdef _COMM_PTH
334//// comm->waitUntilRegistered();
335//// #endif
336//// #ifdef _COMM_CPP11
337// SolverThreadData *monitorThreadData = static_cast<SolverThreadData *>(threadData);
338// comm->solverInit(monitorThreadData->rank, paraParamSet);
339//#ifdef _COMM_PTH
340// comm->waitUntilRegistered();
341//#endif
342// delete monitorThreadData;
343//// #endif
344//
345// ParaTimeLimitMonitorTh *monitor = new ParaTimeLimitMonitorTh(comm, paraParamSet->getRealParamValue(TimeLimit));
346// monitor->run();
347// delete monitor;
348//
349// // ULIBC_unbind_thread();
350//#ifdef _COMM_PTH
351// pthread_exit(NULL);
352//#endif
353// return 0;
354//}
355
356/**************************************************************************************
357 * *
358 * Command line see outputCommandLineMessages() * *
359 * *
360 **************************************************************************************/
361int
363 int argc,
364 char **argv
365 )
366{
367 static const int solverOrigin = 1;
368
369 bool racingSolversExist = false;
370
371#ifdef UG_WITH_UGS
372 char *configFileName = 0;
373 for( int i = 1; i < argc; ++i )
374 {
375 if ( strcmp(argv[i], "-ugsc") == 0 )
376 {
377 i++;
378 if( i < argc )
379 {
380 configFileName = argv[i];
381 break;
382 }
383 else
384 {
385 std::cerr << "missing file name after parameter '-ugsc" << std::endl;
386 exit(1);
387 }
388 }
389 }
390
391 UGS::UgsParaCommMpi *commUgs = 0; // commUgs != 0 means ParaXpress runs under UGS
392 if( configFileName )
393 {
394 if( argc < 4 )
395 {
397 return 1;
398 }
399 commUgs = new UGS::UgsParaCommMpi();
400 commUgs->init(argc,argv);
401 }
402 else
403 {
404 if( argc < 3 )
405 {
407 return 1;
408 }
409 }
410#else
411 if( argc < 3 )
412 {
414 return 1;
415 }
416#endif
417
418 /** catch SIGINT **/
419#ifdef NO_SIGACTION
420 (void)signal(SIGINT, interruptHandler);
421#else
422 struct sigaction newaction;
423
424 /* initialize new signal action */
425 newaction.sa_handler = interruptHandler;
426 newaction.sa_flags = SA_RESTART | SA_NODEFER | SA_RESETHAND;
427 (void)sigemptyset(&newaction.sa_mask);
428
429 /* set new signal action */
430 (void)sigaction(SIGINT, &newaction, NULL);
431#endif
432
433 comm = new ScipParaCommTh();
434 comm->init(argc,argv);
435
436 ParaTimer *paraTimer = comm->createParaTimer();
437 paraTimer->init(comm);
438
439#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
440 SCIP_CALL_ABORT( SCIPcreateMesshdlrPThreads(comm->getSize()) );
441 SCIPmessageSetDefaultHandler();
442#endif
443
444#ifdef _PLACEME
445 /*
446 * Do placement
447 */
448
449 int ierr = placeme(1, PLACEME_SCHEME_DEFAULT, PLACEME_LEVEL_DEFAULT, 1, "HLRN| ");
450 switch(ierr) {
451 case PLACEME_SUCCESS:
452 fprintf(stdout,"task %2d: pinning successful\n", comm->getRank());
453 break;
454 case PLACEME_NOTDONE:
455 fprintf(stdout,"task %2d: pinning not changed on request\n", comm->getRank());
456 break;
457 default:
458 fprintf(stdout,"task %2d: pinning not successful, left unchanged\n", comm->getRank());
459 }
460#endif
461
462 nSolvers = comm->getSize() - 1;
464 paraParamSet->read(comm, argv[1]);
466
467#ifdef UG_WITH_ULIBC
468 ULIBC_init();
469 // number of threads with ULIBC == nSolvers
470 ULIBC_set_affinity_policy(nSolvers, SCATTER_MAPPING, THREAD_TO_CORE );
471#endif
472
473 // ParaInitiator *paraInitiator = new ScipParaInitiator(comm, paraTimer);
474 paraInitiator = new ScipParaInitiator(comm, paraTimer);
476 if( paraInitiator->init(paraParamSet, argc, argv) )
477 {
478 if( dynamic_cast<ScipParaInitiator *>(paraInitiator)->isSolvedAtInit() )
479 {
481 return 0;
482 }
483 }
484
486 {
487 std::cout << "After Initiator initialized: " << paraTimer->getElapsedTime() << std::endl;
488 }
489
490 ParaInstance *paraInstance = paraInitiator->getParaInstance();
492 {
493 // outputParaParamSet(paraInitiator);
494 // outputSolverParams(paraInitiator);
497 }
498
499// #ifdef _COMM_PTH
500// SolverThreadData solverThreadData;
501// solverThreadData.argc = argc;
502// solverThreadData.argv = argv;
503// solverThreadData.paraTimer = paraTimer;
504// #endif
505
506 std::thread *solverThreads = new std::thread[nSolvers];
507
508 for( int i = 0; i < nSolvers; i++ )
509 {
510 SolverThreadData *solverThreadData = new SolverThreadData;
511 solverThreadData->argc = argc;
512 solverThreadData->argv = argv;
513 solverThreadData->paraTimer = paraTimer;
514 solverThreadData->rank = (i+1);
515 // comm->solverInit(i+1, paraParamSet);
516 solverThreads[i] = std::thread(runSolverThread, solverThreadData);
517 }
518
519 ParaDeterministicTimer *detTimer = 0;
521 {
522 detTimer = new ScipParaDeterministicTimer();
523 }
524
526 paraInitiator->sendSolverInitializationMessage(); // This messages should be received in constructor of the target Solver
527
528 if( dynamic_cast<ScipParaInitiator *>(paraInitiator)->isSolvedAtInit() )
529 {
530#ifdef UG_WITH_UGS
531 paraLc = new ScipParaLoadCoordinator(commUgs, comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
532#else
533 paraLc = new ScipParaLoadCoordinator(comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
534#endif
535
536 delete paraLc;
537
538 for( int i = 0; i < nSolvers; i++ )
539 {
540 solverThreads[i].join();
541 }
542
543 delete [] solverThreads;
544
545 delete paraInitiator;
546 delete paraParamSet;
547 delete paraTimer;
548 delete comm;
549#ifdef UG_WITH_UGS
550 if( commUgs ) delete commUgs;
551#endif
552 if( detTimer ) delete detTimer;
553 return 0;
554 }
555 else
556 {
557#ifdef UG_WITH_UGS
558 paraLc = new ScipParaLoadCoordinator(commUgs, comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
559#else
560 paraLc = new ScipParaLoadCoordinator(comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
561#endif
562 }
564 {
565#ifdef UG_WITH_ZLIB
566 paraLc->warmStart();
567#endif
568 }
569 else
570 {
573 {
574 BbParaNode *rootNode = new BbParaNodeTh(
575 TaskId(), TaskId(), 0, -DBL_MAX, -DBL_MAX, -DBL_MAX,
577 paraLc->run(rootNode);
578 }
581 ) // racing ramp-up
582 {
583 ParaRacingRampUpParamSet **racingRampUpParams = new ParaRacingRampUpParamSet *[comm->getSize()];
584 paraInitiator->generateRacingRampUpParameterSets( (comm->getSize()-1), racingRampUpParams );
585 for( int i = 1; i < comm->getSize(); i++ )
586 {
587 int noKeep = 0;
589 comm->send( &noKeep, 1, ParaINT, i, UG::TagKeepRacing)
590 );
592 racingRampUpParams[i-solverOrigin]->send(comm, i)
593 );
594 }
595 ParaTask *rootNode = comm->createParaNode(
596 TaskId(), TaskId(), 0, -DBL_MAX, -DBL_MAX, -DBL_MAX,
598 paraLc->run(rootNode, (comm->getSize()-1), racingRampUpParams );
599 for( int i = 1; i < comm->getSize(); i++ )
600 {
601 if( racingRampUpParams[i-solverOrigin] ) delete racingRampUpParams[i-solverOrigin];
602 }
603 delete [] racingRampUpParams;
604 }
605 else
606 {
607 THROW_LOGICAL_ERROR2("Invalid RampUpPhaseProcess: ", paraParamSet->getIntParamValue(RampUpPhaseProcess) )
608 }
609 }
610
611 delete paraLc;
612
613 for( int i = 0; i < nSolvers; i++ )
614 {
615 solverThreads[i].join();
616 }
617
618 delete [] solverThreads;
619
620 if ( interrupted )
621 {
622 std::cout << "*** FiberSCIP process is interrupted. ***" << std::endl;
623 }
624
625 if( paraInitiator ) delete paraInitiator;
626 delete paraParamSet;
627 delete paraTimer;
628 if( detTimer ) delete detTimer;
629 delete comm;
630
631#ifdef UG_WITH_UGS
632 if( commUgs ) delete commUgs;
633#endif
634
635#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
636 SCIPfreeMesshdlrPThreads();
637#endif
638
639 // ULIBC_unbind_thread();
640
641 return 0;
642} /* END main */
Base class of initiator that maintains original problem and incumbent solution.
Base class for instance data.
Load Coordinator.
BbParaNode extension for threads communication.
Parameter set for UG framework.
Base class for racing ramp-up parameter set.
UG::ParaRacingRampUpParamSet * createParaRacingRampUpParamSet()
UG::ParaInstance * createParaInstance()
UG::ParaParamSet * createParaParamSet()
void outputFinalSolverStatistics(std::ostream *os, double time)
void generateRacingRampUpParameterSets(int nParamSets, UG::ParaRacingRampUpParamSet **racingRampUpParamSets)
void writeSolverParameters(std::ostream *os)
UG::BbParaDiffSubproblem * makeRootNodeDiffSubproblem()
UG::ParaInstance * getParaInstance()
virtual int init(UG::ParaParamSet *paraParams, int argc, char **argv)
class BbParaParamSet
virtual ParaTask * createParaNode(TaskId inNodeId, TaskId inGeneratorNodeId, int inDepth, double inDualBoundValue, double inOriginalDualBoundValue, double inEstimatedValue, ParaDiffSubproblem *inDiffSubproblem)
create ParaNode object
virtual void run()
run function to start main process
virtual void warmStart()
warm start (restart)
class BbParaNodeTh
Definition: bbParaNodeTh.h:52
class BbParaNode
Definition: bbParaNode.h:62
void read(ParaComm *comm, const char *filename)
read ParaParams from file
virtual int receive(ParaComm *comm, int source)=0
receive BbParaRacingRampUpParamSet
class BbParaSolver
Definition: bbParaSolver.h:64
virtual void run()
virtual void solverInit(ParaParamSet *paraParamSet)
initializer for Solvers
virtual void lockApp()
lock UG application to synchronize with other threads
bool probe(int *source, int *tag)
probe function which waits a new message
int send(void *bufer, int count, const int datatypeId, int dest, const int tag)
send function for standard ParaData types
int receive(void *bufer, int count, const int datatypeId, int source, const int tag)
receive function for standard ParaData types
int getSize()
get size of this communicator, which indicates how many threads in a UG process
int getRank()
get rank of caller's thread
virtual void init(int argc, char **argv)
initializer of this communicator
ParaTimer * createParaTimer()
create ParaTimer object
virtual void unlockApp()
unlock UG application to synchronize with other threads
virtual void lcInit(ParaParamSet *paraParamSet)
initializer for LoadCoordinator
class for deterministic timer
Class for initiator.
Definition: paraInitiator.h:63
const char * getPrefixWarm()
get prefix of warm start (restart) files
bool isWarmStarted()
check if the execution is warm started (restarted) or not
class for instance data
Definition: paraInstance.h:51
virtual int bcast(ParaComm *comm, int rank, int method)=0
broadcast function to all solvers
virtual const char * getProbName()=0
get problem name
virtual void interrupt()
interrupt from out side
bool getBoolParamValue(int param)
get bool parameter value
void write(std::ostream *os)
write ParaParams to output stream
int getIntParamValue(int param)
get int parameter value
const char * getStringParamValue(int param)
get string parameter value
class ParaRacingRampUpParamSet (parameter set for racing ramp-up)
class ParaSolver
Definition: paraSolver.h:71
class ParaTask
Definition: paraTask.h:542
class ParaTimer
Definition: paraTimer.h:49
virtual void init(ParaComm *paraComm)=0
initialize timer
virtual double getElapsedTime()=0
get elapsed time
TaskId class.
Definition: paraTask.h:223
static ScipParaCommTh * comm
Definition: fscip.cpp:73
void outputParaParamSet()
Definition: fscip.cpp:141
static ScipParaLoadCoordinator * paraLc
Definition: fscip.cpp:77
void outputSolverParams()
Definition: fscip.cpp:170
int main(int argc, char **argv)
Definition: fscip.cpp:362
struct SolverThreadData_t SolverThreadData
Definition: fscip.cpp:87
void * runSolverThread(void *threadData)
Definition: fscip.cpp:199
static ScipParaInitiator * paraInitiator
Definition: fscip.cpp:76
double memoryLimitOfSolverSCIP
Definition: fscip.cpp:71
static int nSolvers
Definition: fscip.cpp:75
static void interruptHandler(int signum)
Definition: fscip.cpp:98
void outputCommandLineMessages(char **argv)
Definition: fscip.cpp:120
void setUserPlugins(ParaInitiator *initiator)
static ScipParaParamSet * paraParamSet
Definition: fscip.cpp:74
static bool interrupted
Definition: fscip.cpp:78
long long virtualMemUsedAtLc
Definition: fscip.cpp:70
static const int OutputParaParams
Definition: paraParamSet.h:87
static const int ParaINT
Definition: paraComm.h:66
static const int InstanceTransferMethod
static const int LogSolvingStatusFilePath
Definition: paraParamSet.h:127
static const int TagTerminateRequest
Definition: paraTagDef.h:56
static const int ParaBYTE
Definition: paraComm.h:79
static const int Deterministic
Definition: paraParamSet.h:76
static const int RampUpPhaseProcess
static const int TagKeepRacing
Definition: bbParaTagDef.h:69
static const int Quiet
Definition: paraParamSet.h:71
static const int StatisticsToStdout
Definition: paraParamSet.h:77
#define PARA_COMM_CALL(paracommcall)
Definition: paraComm.h:47
#define THROW_LOGICAL_ERROR2(msg1, msg2)
Definition: paraDef.h:69
Time limit monitor thread class.
SCIP ParaComm extension for threads communication.
ParaDeterministicTimer extension for SCIP.
ParaInitiator extension for SCIP solver.
ParaInstance extenstion for SCIP solver.
ParaSolver extension for SCIP: Parallelized solver implementation for SCIP.
ParaTimer * paraTimer
Definition: fscip.cpp:83
char ** argv
Definition: fscip.cpp:82