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-2024 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 << " -sl <settings> : load parameter settings (.set) file for LC presolving" << std::endl;
130 std::cout << " -s <settings> : load parameter settings (.set) file for solvers" << std::endl;
131 std::cout << " -sr <root_settings> : load parameter settings (.set) file for root" << std::endl;
132 std::cout << " -w <prefix_warm> : warm start file prefix ( prefix_warm_nodes.gz and prefix_warm_solution.txt are read )" << std::endl;
133 std::cout << " -sth <number> : the number of solver threads used" << std::endl;
134 std::cout << " -fsol <solution file> : specify output solution file" << std::endl;
135 std::cout << " -qsol : quit to output solution file" << std::endl;
136 std::cout << " -isol <intial solution file> : specify initial solution file" << std::endl;
137}
138
139void
141 // ParaInitiator *paraInitiator
142 )
143{
145 {
146 std::ofstream ofsParamsOutputFile;
147 std::ostringstream s;
149 {
151 }
152 else
153 {
156 }
157 s << ".prm";
158 ofsParamsOutputFile.open(s.str().c_str());
159 if( !ofsParamsOutputFile ){
160 std::cout << "Cannot open ParaParams output file: file name = " << s.str() << std::endl;
161 exit(1);
162 }
163 paraParamSet->write(&ofsParamsOutputFile);
164 ofsParamsOutputFile.close();
165 }
166}
167
168void
170 // ParaInitiator *paraInitiator
171 )
172{
174 {
175 std::ofstream ofsSolverParamsOutputFile;
176 std::ostringstream s;
178 {
180 }
181 else
182 {
185 }
186 s << "_solver.prm";
187 ofsSolverParamsOutputFile.open(s.str().c_str());
188 if( !ofsSolverParamsOutputFile ){
189 std::cout << "Cannot open Solver parameters output file: file name = " << s.str() << std::endl;
190 exit(1);
191 }
192 paraInitiator->writeSolverParameters(&ofsSolverParamsOutputFile);
193 ofsSolverParamsOutputFile.close();
194 }
195}
196
197void *
199 void *threadData
200 )
201{
202 SolverThreadData *solverThreadData = static_cast<SolverThreadData *>(threadData);
203
204 assert( solverThreadData->rank < comm->getSize() );
205// #ifdef _COMM_CPP11
206 comm->solverInit(solverThreadData->rank, paraParamSet);
207// #endif
208
209#ifdef UG_WITH_ULIBC
210 printf("ULIBC_bind_pthread_thread( comm->getRank(): %d )\n", comm->getRank());
211 ULIBC_bind_pthread_thread( comm->getRank() );
212#endif
213
214#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
215 SCIPmessageSetDefaultHandler();
216#endif
217
218#ifdef _PLACEME
219 /*
220 * Do placement
221 */
222
223 int ierr = placeme(1, PLACEME_SCHEME_DEFAULT, PLACEME_LEVEL_DEFAULT, 1, "HLRN| ");
224 switch(ierr) {
225 case PLACEME_SUCCESS:
226 fprintf(stdout,"task %2d: pinning successful\n", comm->getRank());
227 break;
228 case PLACEME_NOTDONE:
229 fprintf(stdout,"task %2d: pinning not changed on request\n", comm->getRank());
230 break;
231 default:
232 fprintf(stdout,"task %2d: pinning not successful, left unchanged\n", comm->getRank());
233 }
234#endif
235
236 int argc = solverThreadData->argc;
237 char **argv = solverThreadData->argv;
238 ParaTimer *paraTimer = solverThreadData->paraTimer;
239 ParaDeterministicTimer *detTimer = 0;
240
242 {
243 detTimer = new ScipParaDeterministicTimer();
244 }
245
246 ParaInstance *paraInstance = comm->createParaInstance();
247 // setUserPlugins(paraInstance); // instance data should not be read from original data file
249 ScipParaSolver *paraSolver = new ScipParaSolver(argc, argv, comm, paraParamSet, paraInstance, detTimer, paraTimer->getElapsedTime(), true );
250 setUserPlugins(paraSolver);
251
253 {
254 comm->lockApp();
255 std::cout << "After Rank " << comm->getRank() << " Solver initialized 1: " << paraTimer->getElapsedTime() << std::endl;
256 comm->unlockApp();
257 }
258
259 // if( paraParamSet->getIntParamValue(RampUpPhaseProcess) == 0 || paraSolver->isWarmStarted() )
262 )
263 {
264 paraSolver->run();
265 }
267 paraParamSet->getIntParamValue(RampUpPhaseProcess) == 2 ) // racing ramp-up
268 {
269 int source;
270 int tag;
271 (void)comm->probe(&source, &tag);
272 if( tag == TagKeepRacing )
273 {
274 int keep = 0;
276 comm->receive( &keep, 1, ParaINT, 0, UG::TagKeepRacing)
277 );
278 if( keep == 0 )
279 {
280 dynamic_cast<BbParaSolver *>(paraSolver)->setKeepRacing(false);
281 }
282 else
283 {
284 dynamic_cast<BbParaSolver *>(paraSolver)->setKeepRacing(true);
285 }
286 (void)comm->probe(&source, &tag);
289 racingRampUpParamSet->receive(comm, 0)
290 );
292 {
293 comm->lockApp();
294 std::cout << "After Rank " << comm->getRank() << " Solver initialized 2: " << paraTimer->getElapsedTime() << std::endl;
295 comm->unlockApp();
296 }
297 paraSolver->run( racingRampUpParamSet );
298 }
299 else
300 {
301 if( tag == TagTerminateRequest )
302 {
304 comm->receive( NULL, 0, ParaBYTE, source, TagTerminateRequest )
305 );
306 // when solver is deleted, solver's destructor sends termination status
307 }
308 else
309 {
310 THROW_LOGICAL_ERROR2("Invalid Tag is received in ParaSCIP solver main: ", tag )
311 }
312 }
313 }
314 else
315 {
316 THROW_LOGICAL_ERROR2("Invalid RampUpPhaseProcess: ", paraParamSet->getIntParamValue(RampUpPhaseProcess) )
317 }
318 delete solverThreadData;
319 delete paraSolver;
320 if( detTimer ) delete detTimer;
321
322 // ULIBC_unbind_thread();
323
324 return 0;
325}
326
327//void *
328//runTimeLimitMonitorThread(
329// void *threadData
330// )
331//{
332//// #ifdef _COMM_PTH
333//// comm->waitUntilRegistered();
334//// #endif
335//// #ifdef _COMM_CPP11
336// SolverThreadData *monitorThreadData = static_cast<SolverThreadData *>(threadData);
337// comm->solverInit(monitorThreadData->rank, paraParamSet);
338//#ifdef _COMM_PTH
339// comm->waitUntilRegistered();
340//#endif
341// delete monitorThreadData;
342//// #endif
343//
344// ParaTimeLimitMonitorTh *monitor = new ParaTimeLimitMonitorTh(comm, paraParamSet->getRealParamValue(TimeLimit));
345// monitor->run();
346// delete monitor;
347//
348// // ULIBC_unbind_thread();
349//#ifdef _COMM_PTH
350// pthread_exit(NULL);
351//#endif
352// return 0;
353//}
354
355/**************************************************************************************
356 * *
357 * Command line see outputCommandLineMessages() * *
358 * *
359 **************************************************************************************/
360int
362 int argc,
363 char **argv
364 )
365{
366 static const int solverOrigin = 1;
367
368 bool racingSolversExist = false;
369
370#ifdef UG_WITH_UGS
371 char *configFileName = 0;
372 for( int i = 1; i < argc; ++i )
373 {
374 if ( strcmp(argv[i], "-ugsc") == 0 )
375 {
376 i++;
377 if( i < argc )
378 {
379 configFileName = argv[i];
380 break;
381 }
382 else
383 {
384 std::cerr << "missing file name after parameter '-ugsc" << std::endl;
385 exit(1);
386 }
387 }
388 }
389
390 UGS::UgsParaCommMpi *commUgs = 0; // commUgs != 0 means ParaXpress runs under UGS
391 if( configFileName )
392 {
393 if( argc < 4 )
394 {
396 return 1;
397 }
398 commUgs = new UGS::UgsParaCommMpi();
399 commUgs->init(argc,argv);
400 }
401 else
402 {
403 if( argc < 3 )
404 {
406 return 1;
407 }
408 }
409#else
410 if( argc < 3 )
411 {
413 return 1;
414 }
415#endif
416
417 /** catch SIGINT **/
418#ifdef NO_SIGACTION
419 (void)signal(SIGINT, interruptHandler);
420#else
421 struct sigaction newaction;
422
423 /* initialize new signal action */
424 newaction.sa_handler = interruptHandler;
425 newaction.sa_flags = SA_RESTART | SA_NODEFER | SA_RESETHAND;
426 (void)sigemptyset(&newaction.sa_mask);
427
428 /* set new signal action */
429 (void)sigaction(SIGINT, &newaction, NULL);
430#endif
431
432 comm = new ScipParaCommTh();
433 comm->init(argc,argv);
434
435 ParaTimer *paraTimer = comm->createParaTimer();
436 paraTimer->init(comm);
437
438#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
439 SCIP_CALL_ABORT( SCIPcreateMesshdlrPThreads(comm->getSize()) );
440 SCIPmessageSetDefaultHandler();
441#endif
442
443#ifdef _PLACEME
444 /*
445 * Do placement
446 */
447
448 int ierr = placeme(1, PLACEME_SCHEME_DEFAULT, PLACEME_LEVEL_DEFAULT, 1, "HLRN| ");
449 switch(ierr) {
450 case PLACEME_SUCCESS:
451 fprintf(stdout,"task %2d: pinning successful\n", comm->getRank());
452 break;
453 case PLACEME_NOTDONE:
454 fprintf(stdout,"task %2d: pinning not changed on request\n", comm->getRank());
455 break;
456 default:
457 fprintf(stdout,"task %2d: pinning not successful, left unchanged\n", comm->getRank());
458 }
459#endif
460
461 nSolvers = comm->getSize() - 1;
463 paraParamSet->read(comm, argv[1]);
465
466#ifdef UG_WITH_ULIBC
467 ULIBC_init();
468 // number of threads with ULIBC == nSolvers
469 ULIBC_set_affinity_policy(nSolvers, SCATTER_MAPPING, THREAD_TO_CORE );
470#endif
471
472 // ParaInitiator *paraInitiator = new ScipParaInitiator(comm, paraTimer);
473 paraInitiator = new ScipParaInitiator(comm, paraTimer);
475 if( paraInitiator->init(paraParamSet, argc, argv) )
476 {
477 if( dynamic_cast<ScipParaInitiator *>(paraInitiator)->isSolvedAtInit() )
478 {
480 return 0;
481 }
482 }
483
485 {
486 std::cout << "After Initiator initialized: " << paraTimer->getElapsedTime() << std::endl;
487 }
488
489 ParaInstance *paraInstance = paraInitiator->getParaInstance();
491 {
492 // outputParaParamSet(paraInitiator);
493 // outputSolverParams(paraInitiator);
496 }
497
498// #ifdef _COMM_PTH
499// SolverThreadData solverThreadData;
500// solverThreadData.argc = argc;
501// solverThreadData.argv = argv;
502// solverThreadData.paraTimer = paraTimer;
503// #endif
504
505 std::thread *solverThreads = new std::thread[nSolvers];
506
507 for( int i = 0; i < nSolvers; i++ )
508 {
509 SolverThreadData *solverThreadData = new SolverThreadData;
510 solverThreadData->argc = argc;
511 solverThreadData->argv = argv;
512 solverThreadData->paraTimer = paraTimer;
513 solverThreadData->rank = (i+1);
514 // comm->solverInit(i+1, paraParamSet);
515 solverThreads[i] = std::thread(runSolverThread, solverThreadData);
516 }
517
518 ParaDeterministicTimer *detTimer = 0;
520 {
521 detTimer = new ScipParaDeterministicTimer();
522 }
523
525 paraInitiator->sendSolverInitializationMessage(); // This messages should be received in constructor of the target Solver
526
527 if( dynamic_cast<ScipParaInitiator *>(paraInitiator)->isSolvedAtInit() )
528 {
529#ifdef UG_WITH_UGS
530 paraLc = new ScipParaLoadCoordinator(commUgs, comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
531#else
532 paraLc = new ScipParaLoadCoordinator(comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
533#endif
534
535 delete paraLc;
536
537 for( int i = 0; i < nSolvers; i++ )
538 {
539 solverThreads[i].join();
540 }
541
542 delete [] solverThreads;
543
544 delete paraInitiator;
545 delete paraParamSet;
546 delete paraTimer;
547 delete comm;
548#ifdef UG_WITH_UGS
549 if( commUgs ) delete commUgs;
550#endif
551 if( detTimer ) delete detTimer;
552 return 0;
553 }
554 else
555 {
556#ifdef UG_WITH_UGS
557 paraLc = new ScipParaLoadCoordinator(commUgs, comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
558#else
559 paraLc = new ScipParaLoadCoordinator(comm, paraParamSet, paraInitiator, &racingSolversExist, paraTimer, detTimer);
560#endif
561 }
563 {
564#ifdef UG_WITH_ZLIB
565 paraLc->warmStart();
566#endif
567 }
568 else
569 {
572 {
573 BbParaNode *rootNode = new BbParaNodeTh(
574 TaskId(), TaskId(), 0, -DBL_MAX, -DBL_MAX, -DBL_MAX,
576 paraLc->run(rootNode);
577 }
580 ) // racing ramp-up
581 {
582 ParaRacingRampUpParamSet **racingRampUpParams = new ParaRacingRampUpParamSet *[comm->getSize()];
583 paraInitiator->generateRacingRampUpParameterSets( (comm->getSize()-1), racingRampUpParams );
584 for( int i = 1; i < comm->getSize(); i++ )
585 {
586 int noKeep = 0;
588 comm->send( &noKeep, 1, ParaINT, i, UG::TagKeepRacing)
589 );
591 racingRampUpParams[i-solverOrigin]->send(comm, i)
592 );
593 }
594 ParaTask *rootNode = comm->createParaNode(
595 TaskId(), TaskId(), 0, -DBL_MAX, -DBL_MAX, -DBL_MAX,
597 paraLc->run(rootNode, (comm->getSize()-1), racingRampUpParams );
598 for( int i = 1; i < comm->getSize(); i++ )
599 {
600 if( racingRampUpParams[i-solverOrigin] ) delete racingRampUpParams[i-solverOrigin];
601 }
602 delete [] racingRampUpParams;
603 }
604 else
605 {
606 THROW_LOGICAL_ERROR2("Invalid RampUpPhaseProcess: ", paraParamSet->getIntParamValue(RampUpPhaseProcess) )
607 }
608 }
609
610 delete paraLc;
611
612 for( int i = 0; i < nSolvers; i++ )
613 {
614 solverThreads[i].join();
615 }
616
617 delete [] solverThreads;
618
619 if ( interrupted )
620 {
621 std::cout << "*** FiberSCIP process is interrupted. ***" << std::endl;
622 }
623
624 if( paraInitiator ) delete paraInitiator;
625 delete paraParamSet;
626 delete paraTimer;
627 if( detTimer ) delete detTimer;
628 delete comm;
629
630#ifdef UG_WITH_UGS
631 if( commUgs ) delete commUgs;
632#endif
633
634#ifndef SCIP_THREADSAFE_MESSAGEHDLRS
635 SCIPfreeMesshdlrPThreads();
636#endif
637
638 // ULIBC_unbind_thread();
639
640 return 0;
641} /* 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:140
static ScipParaLoadCoordinator * paraLc
Definition: fscip.cpp:77
void outputSolverParams()
Definition: fscip.cpp:169
int main(int argc, char **argv)
Definition: fscip.cpp:361
struct SolverThreadData_t SolverThreadData
Definition: fscip.cpp:87
void * runSolverThread(void *threadData)
Definition: fscip.cpp:198
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