43#include "scip/struct_nodesel.h" 
   45#ifdef UG_DEBUG_SOLUTION 
   46#ifndef WITH_DEBUG_SOLUTION 
   47#define WITH_DEBUG_SOLUTION 
   49#include "scip/debug.h" 
   58ScipParaObjCommPointHdlr::processNewSolution(
 
   63   SCIP_SOL *sol = SCIPeventGetSol(event);
 
   64   int nVars = SCIPgetNOrigVars(scip);
 
   65   SCIP_VAR **vars = SCIPgetOrigVars(scip);
 
   66   SCIP_Real *vals = 
new SCIP_Real[nVars];
 
   67   SCIP_CALL_ABORT( SCIPgetSolVals(scip, sol, nVars, vars, vals) );
 
   71   SCIP_CALL_ABORT( SCIPcheckSolOrig(scip,sol,&feasible,1,1 ) );
 
   77      SCIP_VAR **varsInOrig = 
new SCIP_VAR*[nVars];
 
   78      SCIP_Real *valsInOrig = 
new SCIP_Real[nVars]();
 
   80      for( 
int i = 0; i < nVars; i++ )
 
   84            varsInOrig[nVarsInOrig] = vars[i];
 
   85            valsInOrig[nVarsInOrig] = vals[i];
 
   91            scipParaComm->createScipParaSolution(
 
   93                  SCIPgetSolOrigObj(scip, sol),
 
  100      delete [] valsInOrig;
 
  105            scipParaComm->createScipParaSolution(
 
  107                  SCIPgetSolOrigObj(scip, sol),
 
  123      SCIP_EVENTHDLR*    eventhdlr,          
 
  125      SCIP_EVENTDATA*    eventdata           
 
  131      scipParaComm->lockInterruptMsg();
 
  133   assert(eventhdlr != NULL);
 
  134   assert(strcmp(SCIPeventhdlrGetName(eventhdlr), 
"ScipParaObjCommPointHdlr") == 0);
 
  135   assert(event != NULL);
 
  136#ifdef SCIP_EVENTTYPE_COMM 
  137   assert(SCIPeventGetType(event) &
 
  138          ( SCIP_EVENTTYPE_GBDCHANGED |
 
  139            SCIP_EVENTTYPE_BOUNDTIGHTENED |
 
  140            SCIP_EVENTTYPE_LPEVENT |
 
  141            SCIP_EVENTTYPE_ROWEVENT |
 
  143            SCIP_EVENTTYPE_NODEEVENT |
 
  144            SCIP_EVENTTYPE_BESTSOLFOUND |
 
  149   assert(SCIPeventGetType(event) &
 
  150          ( SCIP_EVENTTYPE_GBDCHANGED |
 
  151            SCIP_EVENTTYPE_BOUNDTIGHTENED |
 
  152            SCIP_EVENTTYPE_LPEVENT |
 
  153            SCIP_EVENTTYPE_ROWEVENT |
 
  155            SCIP_EVENTTYPE_NODEEVENT |
 
  156            SCIP_EVENTTYPE_BESTSOLFOUND
 
  161#if SCIP_VERSION == 211 && SCIP_SUBVERSION == 0 
  162   if( SCIPgetStage(scip) >= SCIP_STAGE_FREESOLVE )
 
  164   if( SCIPgetStage(scip) >= SCIP_STAGE_EXITSOLVE )
 
  169         scipParaComm->unlockInterruptMsg();
 
  174   double detTime = -1.0;
 
  187         if( SCIPeventGetType(event) == SCIP_EVENTTYPE_FIRSTLPSOLVED )
 
  189            SCIP_Longint totalLpIter = 0;
 
  192               totalLpIter = SCIPgetNLPIterations(subScip);
 
  196               totalLpIter = SCIPgetNLPIterations(scip);
 
  201               lpIter = totalLpIter;
 
  207         else if ( SCIPeventGetType(event) == SCIP_EVENTTYPE_LPSOLVED )
 
  209            SCIP_Longint totalLpIter = 0;
 
  212               totalLpIter = SCIPgetNLPIterations(subScip);
 
  216               totalLpIter = SCIPgetNLPIterations(scip);
 
  221               lpIter = totalLpIter;
 
  226         else if ( SCIPeventGetType(event) == SCIP_EVENTTYPE_BESTSOLFOUND
 
  227               || SCIPeventGetType(event) == SCIP_EVENTTYPE_NODEFOCUSED )
 
  237         if ( SCIPeventGetType(event) != SCIP_EVENTTYPE_BESTSOLFOUND
 
  238               && SCIPeventGetType(event) != SCIP_EVENTTYPE_NODEFOCUSED )
 
  247         if( SCIPeventGetType(event) == SCIP_EVENTTYPE_BESTSOLFOUND )
 
  253                  scipParaComm->unlockInterruptMsg();
 
  270      if( SCIPeventGetType(event) == SCIP_EVENTTYPE_BESTSOLFOUND )
 
  276               scipParaComm->unlockInterruptMsg();
 
  297      scipParaComm->unlockInterruptMsg();
 
  307         SCIPgetStage(scip) != SCIP_STAGE_PRESOLVING
 
  308                  && SCIPgetStage(scip) != SCIP_STAGE_INITSOLVE )
 
  314            ( SCIPeventGetType(event) & (SCIP_EVENTTYPE_NODEEVENT | SCIP_EVENTTYPE_LPEVENT)
 
  331#ifdef UG_DEBUG_SOLUTION 
  332               if( SCIPdebugSolIsEnabled(scip) )
 
  334                  throw "Optimal solution going to be lost!";
 
  337               SCIP_CALL_ABORT( SCIPinterruptSolve(scip) );
 
  349         && (SCIPeventGetType(event) & SCIP_EVENTTYPE_GBDCHANGED )
 
  350         && (SCIPvarGetStatus(SCIPeventGetVar(event)) != SCIP_VARSTATUS_LOOSE )
 
  351         && (SCIPvarGetStatus(SCIPeventGetVar(event)) != SCIP_VARSTATUS_AGGREGATED )
 
  355      SCIP_BOUNDTYPE      boundtype;
 
  356      SCIP_Var *var = SCIPeventGetVar(event);
 
  357      switch( SCIPeventGetType(event) )
 
  359         case SCIP_EVENTTYPE_GLBCHANGED:
 
  360            boundtype = SCIP_BOUNDTYPE_LOWER;
 
  362         case SCIP_EVENTTYPE_GUBCHANGED:
 
  363            boundtype = SCIP_BOUNDTYPE_UPPER;
 
  369      SCIP_Real newbound = SCIPeventGetNewbound(event);
 
  370      SCIP_Real constant = 0.0;
 
  371      SCIP_Real scalar = 1.0;
 
  372      SCIP_CALL_ABORT( SCIPvarGetOrigvarSum(&var, &scalar, &constant) );
 
  375         assert(SCIPvarIsOriginal(var));
 
  376         int index = SCIPvarGetIndex(var);
 
  377         boundtype = scalar < 0.0 ? (SCIP_BOUNDTYPE)(1 - boundtype) : boundtype;
 
  378         newbound = (newbound - constant) / scalar;
 
  383         if( index < scipParaSolver->getNOrgVars() )
 
  385            if( boundtype == SCIP_BOUNDTYPE_LOWER )
 
  387               if( SCIPvarGetType(var) != SCIP_VARTYPE_CONTINUOUS )
 
  389                  assert( SCIPisFeasIntegral(scip, newbound) );
 
  390                  newbound = SCIPfeasCeil(scip, newbound);
 
  392   #ifdef UG_DEBUG_SOLUTION 
  393               SCIP_Real solvalue = 0.0;
 
  394               SCIP_CALL(SCIPdebugGetSolVal(scip,var, &solvalue));
 
  395               std::cout << 
"Sender side SolValue: " << SCIPvarGetName(var) << 
" = " << solvalue << std::endl;
 
  396               std::cout << 
"Sender side (SCIP_BOUNDTYPE_LOWER): " << SCIPvarGetName(var) << 
" = " << newbound << std::endl;
 
  397               SCIP_CALL_ABORT( SCIPdebugCheckLbGlobal(scip,var,newbound) );
 
  408                  int orgIndex = SCIPvarGetIndex(var);
 
  429               if( SCIPvarGetType(var) != SCIP_VARTYPE_CONTINUOUS )
 
  431                  assert( SCIPisFeasIntegral(scip, newbound) );
 
  432                  newbound = SCIPfeasFloor(scip, newbound);
 
  434   #ifdef UG_DEBUG_SOLUTION 
  435               SCIP_Real solvalue = 0.0;
 
  436               SCIP_CALL(SCIPdebugGetSolVal(scip,var, &solvalue));
 
  437               std::cout << 
"Sender side SolValue: " << SCIPvarGetName(var) << 
" = " << solvalue << std::endl;
 
  438               std::cout << 
"Sender side (SCIP_BOUNDTYPE_UPPER): " << SCIPvarGetName(var) << 
" = " << newbound << std::endl;
 
  439               SCIP_CALL_ABORT( SCIPdebugCheckUbGlobal(scip,var,newbound) );
 
  450                  int orgIndex = SCIPvarGetIndex(var);
 
  495            if( SCIPgetStage(subScip) != SCIP_STAGE_INITSOLVE )
 
  497               SCIP_CALL_ABORT( SCIPinterruptSolve(subScip) );
 
  503            if( SCIPgetStage(scip) != SCIP_STAGE_INITSOLVE )
 
  509   #ifdef UG_DEBUG_SOLUTION 
  513                     if( SCIPdebugSolIsEnabled(scip) )
 
  515                        throw "Optimal solution going to be lost!";
 
  518                  SCIPdebugSolDisable(scip);
 
  519                  std::cout << 
"R." << 
paraComm->
getRank() << 
": disable debug, this solver is interrupted." << std::endl;
 
  521                  SCIP_CALL_ABORT( SCIPinterruptSolve(scip) );
 
  541      SCIP_CALL( SCIPgetIntParam(scip, 
"presolving/maxrestarts", &maxrestarts) );
 
  542      if( SCIPgetNRuns( scip ) >= maxrestarts  )
 
  563   SCIP_Longint nNodes = 0;
 
  564   if( SCIPgetStage(scip) != SCIP_STAGE_PRESOLVING
 
  565         && SCIPgetStage(scip) != SCIP_STAGE_INITSOLVE
 
  568      nNodes = SCIPgetNTotalNodes(scip);
 
  593   if( nNodes == 2 && SCIPgetNNodes(scip) == 2 )
 
  610            SCIPgetDualbound(scip) <
 
  617               SCIP_CALL_ABORT( SCIPinterruptSolve(subScip) );
 
  622               SCIP_CALL_ABORT( SCIPinterruptSolve(scip) );
 
  634   double bestDualBoundValue = -SCIPinfinity(scip);
 
  635   if( SCIPgetStage(scip) == SCIP_STAGE_TRANSFORMED ||
 
  636         SCIPgetStage(scip) == SCIP_STAGE_PRESOLVING ||
 
  637         SCIPgetStage(scip) == SCIP_STAGE_INITSOLVE
 
  675            if( SCIPgetStage(subScip) != SCIP_STAGE_INITSOLVE )
 
  677               SCIP_CALL_ABORT( SCIPinterruptSolve(subScip) );
 
  683            if( SCIPgetStage(scip) != SCIP_STAGE_INITSOLVE )
 
  685#ifdef UG_DEBUG_SOLUTION 
  689                  if( SCIPdebugSolIsEnabled(scip) )
 
  691                     throw "Optimal solution going to be lost!";
 
  694               SCIPdebugSolDisable(scip);
 
  695               std::cout << 
"R." << 
paraComm->
getRank() << 
": disable debug, this solver is interrupted." << std::endl;
 
  697               SCIP_CALL_ABORT( SCIPinterruptSolve(scip) );
 
  723         if( SCIPgetStage(scip) != SCIP_STAGE_TRANSFORMED &&
 
  724               SCIPgetStage(scip) != SCIP_STAGE_PRESOLVING &&
 
  725               SCIPgetStage(scip) != SCIP_STAGE_INITSOLVE )
 
  727            nNodesLeft = SCIPgetNNodesLeft(scip);
 
  735            SCIP_CALL_ABORT( SCIPinterruptSolve(scip) );
 
  756         ( nNodes < scipParaSolver->getNStopSolvingMode() ) &&
 
  795               nNodes < scipParaSolver->getNStopSolvingMode() ) ) 
 
  818         ( SCIPeventGetType(event) != SCIP_EVENTTYPE_NODEFOCUSED
 
  843   if( SCIPnodeGetDepth( SCIPgetCurrentNode( scip ) )
 
  857                ( SCIPgetNNodesLeft( scip ) > 1 &&
 
  903         assert( nNodes <=2 );
 
  990               SCIP_NODESEL *nodesel = SCIPgetNodesel(scip);
 
  991               SCIP_CALL_ABORT( SCIPsetNodeselStdPriority(scip, nodesel,
 
 1010   SCIP_NODE* node = SCIPgetCurrentNode( scip );
 
 1011   int depth = SCIPnodeGetDepth( node );
 
 1012   SCIP_VAR **branchVars = 
new SCIP_VAR*[depth];
 
 1013   SCIP_Real *branchBounds = 
new SCIP_Real[depth];
 
 1014   SCIP_BOUNDTYPE *boundTypes = 
new  SCIP_BOUNDTYPE[depth];
 
 1016   SCIPnodeGetAncestorBranchings( node, branchVars, branchBounds, boundTypes, &nBranchVars, depth );
 
 1017   if( nBranchVars > depth )  
 
 1019      delete [] branchVars;
 
 1020      delete [] branchBounds;
 
 1021      delete [] boundTypes;
 
 1022      branchVars = 
new SCIP_VAR*[nBranchVars];
 
 1023      branchBounds = 
new SCIP_Real[nBranchVars];
 
 1024      boundTypes = 
new  SCIP_BOUNDTYPE[nBranchVars];
 
 1025      SCIPnodeGetAncestorBranchings( node, branchVars, branchBounds, boundTypes, &nBranchVars, nBranchVars );
 
 1032      int nVars = SCIPgetNVars(scip);
 
 1033      SCIP_VAR **vars = SCIPgetVars(scip);
 
 1034      int *iBranchVars = 
new int[nBranchVars];
 
 1036      SCIP_HASHMAP* varmapLb;
 
 1037      SCIP_HASHMAP* varmapUb;
 
 1038      SCIP_CALL_ABORT( SCIPhashmapCreate(&varmapLb, SCIPblkmem(scip), nVars) );
 
 1039      SCIP_CALL_ABORT( SCIPhashmapCreate(&varmapUb, SCIPblkmem(scip), nVars) );
 
 1040      for( 
int i = 0; i < nBranchVars; i++ )
 
 1043         if( boundTypes[i] == SCIP_BOUNDTYPE_LOWER )
 
 1045            if( !SCIPhashmapGetImage(varmapLb, branchVars[i]) )
 
 1047               SCIP_CALL_ABORT( SCIPhashmapInsert(varmapLb, branchVars[i], &iBranchVars[i] ) );
 
 1052            if( !SCIPhashmapGetImage(varmapUb, branchVars[i]) )
 
 1054               SCIP_CALL_ABORT( SCIPhashmapInsert(varmapUb, branchVars[i], &iBranchVars[i] ) );
 
 1058      SCIP_VAR **preBranchVars = branchVars;
 
 1059      SCIP_Real *preBranchBounds = branchBounds;
 
 1060      SCIP_BOUNDTYPE *preBboundTypes = boundTypes;
 
 1061      branchVars = 
new SCIP_VAR*[nBranchVars+nVars*2];
 
 1062      branchBounds = 
new SCIP_Real[nBranchVars+nVars*2];
 
 1063      boundTypes = 
new  SCIP_BOUNDTYPE[nBranchVars+nVars*2];
 
 1064      for( 
int i = 0; i < nBranchVars; i++ )
 
 1066         branchVars[i] = preBranchVars[i];
 
 1067         branchBounds[i] = preBranchBounds[i];
 
 1068         boundTypes[i] = preBboundTypes[i];
 
 1070      int *iBranchVar = NULL;
 
 1071      for( 
int i = 0; i < nVars; i++ )
 
 1078         iBranchVar =  (
int *)SCIPhashmapGetImage(varmapLb, vars[i]);
 
 1084               branchBounds[*iBranchVar] = SCIPvarGetLbLocal(vars[i]);  
 
 1090            if( 
EPSGT( SCIPvarGetLbLocal(vars[i]), SCIPvarGetLbGlobal(vars[i]), 
MINEPSILON ) )
 
 1092               branchVars[nBranchVars] = vars[i];
 
 1093               branchBounds[nBranchVars] = SCIPvarGetLbLocal(vars[i]);
 
 1094               boundTypes[nBranchVars] = SCIP_BOUNDTYPE_LOWER;
 
 1099         iBranchVar = (
int *)SCIPhashmapGetImage(varmapUb, vars[i]);
 
 1105               branchBounds[*iBranchVar] = SCIPvarGetUbLocal(vars[i]); 
 
 1111            if( 
EPSLT( SCIPvarGetUbLocal(vars[i]), SCIPvarGetUbGlobal(vars[i]), 
MINEPSILON ) )
 
 1113               branchVars[nBranchVars] = vars[i];
 
 1114               branchBounds[nBranchVars] = SCIPvarGetUbLocal(vars[i]);
 
 1115               boundTypes[nBranchVars] = SCIP_BOUNDTYPE_UPPER;
 
 1121      SCIPhashmapFree(&varmapLb);
 
 1122      SCIPhashmapFree(&varmapUb);
 
 1123      delete [] preBranchVars;
 
 1124      delete [] preBranchBounds;
 
 1125      delete [] preBboundTypes;
 
 1126      delete [] iBranchVars;
 
 1134      for(
int v = 0; v < nBranchVars; v++)
 
 1136         int index = SCIPvarGetProbindex(branchVars[v]);
 
 1137         assert(index != -1);
 
 1138         assert(std::string(SCIPvarGetName(branchVars[v]))==std::string(SCIPvarGetName(copyVars[index])));
 
 1139         if( boundTypes[v] == SCIP_BOUNDTYPE_LOWER )
 
 1143         else if (boundTypes[v] == SCIP_BOUNDTYPE_UPPER)
 
 1160      case SCIP_STATUS_OPTIMAL :
 
 1162         SCIP_SOL *bestSol = SCIPgetBestSol( scip );
 
 1163         int nVars = SCIPgetNOrigVars(scip);
 
 1164         SCIP_VAR **vars = SCIPgetOrigVars(scip);
 
 1165         SCIP_Real *vals = 
new SCIP_Real[nVars];
 
 1166         SCIP_CALL_ABORT( SCIPgetSolVals(scip, bestSol, nVars, vars, vals) );
 
 1169               scipParaComm->createScipParaSolution(
 
 1171                     SCIPgetSolOrigObj(scip, bestSol),
 
 1179         SCIP_CALL_ABORT( SCIPcutoffNode( scip, node) );
 
 1185      case SCIP_STATUS_INFEASIBLE :
 
 1186      case SCIP_STATUS_INFORUNBD :
 
 1189         SCIP_CALL_ABORT( SCIPcutoffNode( scip, node ) );
 
 1195      case SCIP_STATUS_NODELIMIT :
 
 1197         sendNode(scip, node, depth, nBranchVars, branchVars, branchBounds, boundTypes);
 
 1201         THROW_LOGICAL_ERROR2(
"Invalid status after root solvability check: status = ", 
static_cast<int>(status));
 
 1212            delete [] branchVars;
 
 1213            delete [] branchBounds;
 
 1214            delete [] boundTypes;
 
 1218      sendNode(scip, node, depth, nBranchVars, branchVars, branchBounds, boundTypes);
 
 1221   delete [] branchVars;
 
 1222   delete [] branchBounds;
 
 1223   delete [] boundTypes;
 
 1234      SCIP_VAR **newBranchVars,
 
 1235      SCIP_Real *newBranchBounds,
 
 1236      SCIP_BOUNDTYPE *newBoundTypes
 
 1240   SCIP_CONS** addedcons = 0;
 
 1241   int addedconsssize = SCIPnodeGetNAddedConss(node);
 
 1242   int naddedconss = 0;
 
 1243   if( addedconsssize > 0 )
 
 1245      SCIP_CALL_ABORT( SCIPallocBufferArray(scip, &addedcons, addedconsssize) );
 
 1246      SCIPnodeGetAddedConss(node, addedcons, &naddedconss, addedconsssize);
 
 1264      SCIPfreeBufferArray(scip, &addedcons);
 
 1268   long long n = SCIPnodeGetNumber( node );
 
 1269   double dualBound = SCIPgetDualbound(scip);
 
 1274   assert(SCIPisFeasGE(scip, SCIPnodeGetLowerbound(node) , SCIPgetLowerbound(scip)));
 
 1275   double estimateValue = SCIPnodeGetEstimate( node );
 
 1276   assert(SCIPisFeasGE(scip, estimateValue, SCIPnodeGetLowerbound(node) ));
 
 1277#ifdef UG_DEBUG_SOLUTION 
 1278   SCIP_Bool valid = 0;
 
 1279   SCIP_CALL_ABORT( SCIPdebugSolIsValidInSubtree(scip, &valid) );
 
 1280   diffSubproblem->setOptimalSolIndicator(valid);
 
 1281   std::cout << 
"* R." << 
scipParaSolver->
getRank() << 
", debug = " << SCIPdebugSolIsEnabled(scip) << 
", valid = " << valid << std::endl;
 
 1286#ifdef UG_DEBUG_SOLUTION 
 1289      SCIPdebugSolDisable(scip);
 
 1290      std::cout << 
"R." << 
paraComm->
getRank() << 
": disable debug, node which contains optmal solution is sent." << std::endl;
 
 1293   SCIP_CALL_ABORT( SCIPcutoffNode( scip, node) );
 
 1302   int numnodesels = SCIPgetNNodesels( scip );
 
 1303   SCIP_NODESEL** nodesels = SCIPgetNodesels( scip );
 
 1305   for( i = 0; i < numnodesels; ++i )
 
 1307      std::string nodeselname(SCIPnodeselGetName(nodesels[i]));
 
 1310         SCIP_CALL_ABORT( SCIPsetNodeselStdPriority(scip, nodesels[i], 536870911 ) );
 
 1313         SCIP_CALL_ABORT( SCIPgetIntParam(scip, 
"presolving/maxrestarts", &maxrestarts) );
 
 1314         if( maxrestarts != 0 )
 
 1316            SCIP_CALL_ABORT( SCIPsetIntParam(scip, 
"presolving/maxrestarts", 0) );
 
 1321   assert( i != numnodesels );
 
 1328      SCIP_VAR **newBranchVars,
 
 1329      SCIP_Real *newBranchBounds)
 
 1332   bool feasible = 
true;
 
 1333   SCIP_Real *branchBounds = 
new SCIP_Real[nNewBranchVars];
 
 1334   for( 
int v = nNewBranchVars -1 ; v >= 0; --v )
 
 1336      SCIP_VAR *transformVar = newBranchVars[v];
 
 1337      SCIP_Real scalar = 1.0;
 
 1338      SCIP_Real constant = 0.0;
 
 1339      SCIP_CALL_ABORT( SCIPvarGetOrigvarSum(&transformVar, &scalar, &constant ) );
 
 1340      if( transformVar == NULL ) 
continue;
 
 1342      branchBounds[v] = ( newBranchBounds[v] - constant ) / scalar;
 
 1343      if( SCIPvarGetType(transformVar) != SCIP_VARTYPE_CONTINUOUS
 
 1354   delete [] branchBounds;
 
ScipParaObjLimitUpdator * scipParaObjLimitUpdator
 
SCIP_Longint previousNNodesSolved
 
ScipParaSolver * scipParaSolver
 
bool originalSelectionStrategy
 
const char * changeNodeSelName
 
void processNewSolution(SCIP *scip, SCIP_EVENT *event)
 
SCIP * scipToCheckRootSolvability
 
SCIP_Longint previousLpIter
 
bool checkRootNodeSolvabilityAndSendParaNode(SCIP *scip)
 
void sendNode(SCIP *scip, SCIP_NODE *node, int depth, int nBranchVars, SCIP_VAR **branchVars, SCIP_Real *branchBounds, SCIP_BOUNDTYPE *boundTypes)
 
void changeSearchStrategy(SCIP *scip)
 
bool ifFeasibleInOriginalProblem(SCIP *scip, int nNewBranchVars, SCIP_VAR **newBranchVars, SCIP_Real *newBranchBounds)
 
virtual SCIP_RETCODE scip_exec(SCIP *scip, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENT *event, SCIP_EVENTDATA *eventdata)
 
bool startedCollectingNodesForInitialRampUp
 
int getOriginalPriority()
 
bool isCopyIncreasedVariables()
 
int getOriginalIndex(int index)
 
long long getSimplexIter()
 
void allowCollectingMode()
 
void setNPreviousNodesLeft(long long n)
 
double getOrgVarLb(int i)
 
double getTightenedVarUb(int i)
 
void setTightenedVarUb(int i, double v)
 
bool isCollectingModeProhibited()
 
void setTightenedVarLb(int i, double v)
 
double getTightenedVarLb(int i)
 
int getProbIndex(int index)
 
double getOrgVarUb(int i)
 
bool isOriginalIndeciesMap()
 
double getDualBoundValue()
getter of dual bound value
 
virtual void sendSolverState(long long nNodesSolved, int nNodesLeft, double bestDualBoundValue, double detTime)
send Solver state to LoadCoordinator
 
virtual int getRank()
get rank of this Solver
 
double getCurrentSolvingNodeInitialDualBound()
get initial dual bound of current solving node
 
bool isAggressivePresolvingSpecified()
check if aggressive presolving is specified
 
double getElapsedTimeOfNodeSolving()
the following functions may be called from callback routines of the target Solver
 
bool isRacingRampUp()
check if this solver is in racing ramp-up or not
 
bool isManyNodesCollectionRequested()
check if many nodes collection was requested or not
 
bool isRacingInterruptRequested()
check if racing interrupt was requested or not
 
bool isCollectingAllNodes()
check if Solver is sending all nodes to LoadCoordinaor or not
 
ParaTask * getCurrentNode()
get current ParaNode object
 
bool isTransferLimitReached()
check if the number of ParaNodes sent is reached to transfer limit specified
 
bool isAggressiveCollecting()
check if Solver is in aggressive collecting mode or not
 
bool isCollecingInterrupt()
check if collecting interrupt (interrupt with collecting all nodes) is requested or not
 
virtual void waitMessageIfNecessary()
wait a notification id message if it is needed to synchronize with LoadCoordinaor
 
bool newParaNodeExists()
check if a new ParaNode was received or not
 
ParaParamSet * getParaParamSet()
get ParaParamSet object
 
void setRootNodeSimplexIter(int iter)
set number of simplex iteration at root node
 
void setNotEnoughGain()
set dual bound gain is not enough
 
void resetBreakingInfo()
reset breaking information
 
void setSendBackAllNodes()
set counter and flag to indicate that all nodes are sent to LoadCooordinator
 
int getCurrentSolivingNodeMergingStatus()
get current solving node merging status
 
int getNStopSolvingMode()
get number of nodes to stop solving. This number is not used to decide stop solving....
 
void passToken(int rank)
pass token to the next process
 
virtual void sendLocalSolution()
send solution found in this Solver
 
bool isAnotherNodeIsRequested()
check if another node is requested or not
 
double getGlobalBestIncumbentValue()
get global best incumbent value
 
bool isGivenGapReached()
check if given gap is reached or not
 
virtual void iReceiveMessages()
non-blocking receive messages
 
double getTimeStopSolvingMode()
get time to stop solving. This value is not used to decide stop solving. It is used a part of conditi...
 
bool isDualBoundGainTestNeeded()
check if dual bound gain needs to be tested or not
 
double getAverageDualBoundGain()
get average dual bound gain
 
virtual void sendParaNode(long long n, int depth, double dualBound, double estimateValue, ParaDiffSubproblem *diffSubproblem)
send a branch-and-bound node as ParaNode to LoadCoordinator
 
int getBigDualGapSubtreeHandlingStrategy()
get big dual gap subtree handling strategy
 
virtual void sendAnotherNodeRequest(double bestDualBoundValue)
send another node request
 
bool isBreaking()
check if Solver is in racing stage or not
 
double getBoundGapForCollectingMode()
get bound gap for collecting mode
 
bool isInCollectingMode()
check if Solver is in collecting mode or not
 
bool isGlobalIncumbentUpdated()
check if global incumbent value is updated or not
 
bool isRacingStage()
check if Solver is in racing stage or not
 
int getSubMipDepth()
get depth of sub-MIP root node in global search tree
 
virtual void setRootNodeTime()
set root node computing time
 
bool isEnoughGainObtained()
check if dual bound gains enough or not
 
double getTargetBound()
get target bound for breaking
 
int getAggresivePresolvingStopDepth()
get depth to stop aggressive presolving
 
double getLcBestDualBoundValue()
get LoadCorrdinator best dual bound value
 
virtual bool saveIfImprovedSolutionWasFound(ParaSolution *sol)
save improved solution if it was found in this Solver
 
virtual int getThresholdValue(int nNodes)
get threshold value to send ParaNodes to LoadCoordinator
 
void countInPrecheckSolvedParaNodes()
count ParaNode solved at root node in pre-check
 
virtual bool notificationIsNecessary()
check if a notification message needs to send or not
 
int getAggresivePresolvingDepth()
get depth to apply aggressive presolving
 
double getBoundGapForStopSolving()
get bound gap for stop solving. This value is not used to decide stop solving. It is used a part of c...
 
int getNSendInCollectingMode()
get number of ParaNodes already sent in a collecting mode
 
bool waitToken(int rank)
wait token for deterministic mode
 
virtual int send(void *bufer, int count, const int datatypeId, int dest, const int tag)=0
send function for standard ParaData types
 
virtual int getRank()=0
get rank of this process or this thread depending on run-time environment
 
virtual void update(double value)=0
update function of the deterministic time. the deterministic time is a kind of counter
 
virtual double getElapsedTime()=0
getter of the deterministic time
 
bool getBoolParamValue(int param)
get bool parameter value
 
double getRealParamValue(int param)
get real parameter value
 
int getIntParamValue(int param)
get int parameter value
 
virtual void updatePendingSolution()
update pending solution
 
void setPreviousCommTime(double detTime)
set previous communication time for deterministic execution
 
bool isRampUp()
check if this solver is ramp-up or not
 
ParaDeterministicTimer * getDeterministicTimer()
get deterministic timer object
 
bool isRacingWinner()
check if this solver is in racing ramp-up or not
 
bool isTerminationRequested()
check if termination was requested or not
 
double getPreviousCommTime()
get previous communication time for deterministic execution
 
bool isRootTask()
check if root task or not
 
static const int RootNodeSolvabilityCheck
 
static const int BreakFirstSubtree
 
static const int NoAllBoundChangesTransferInRacing
 
static const int DualBoundGainTest
 
static const int TagLbBoundTightenedBound
 
static const int NumberOfNodesKeepingInRootSolver
 
static const int TagAllowToBeInCollectingMode
 
static const int FinalCheckpointGeneratingTime
 
static const int EventWeightedDeterministic
 
static const int NotificationInterval
 
static const int TagLbBoundTightenedIndex
 
static const int TagUbBoundTightenedIndex
 
static const int ParaBYTE
 
static const int ControlCollectingModeOnSolverSide
 
static const int NoAlternateSolving
 
static const int GenerateReducedCheckpointFiles
 
static const int Deterministic
 
static const int RampUpPhaseProcess
 
static const int TagUbBoundTightenedBound
 
static const int DualBoundGainBranchRatio
 
static const int AllBoundChangesTransfer
 
static const int KeepNodesDepth
 
static const int AllowableRegressionRatioInMerging
 
static const int ParaDOUBLE
 
static const int CommunicateTighterBoundsInRacing
 
#define PARA_COMM_CALL(paracommcall)
 
#define THROW_LOGICAL_ERROR2(msg1, msg2)
 
#define DEFAULT_NUM_EPSILON
 
#define DEF_SCIP_PARA_COMM(scip_para_comm, comm)
 
ParaInitialStat extension for SCIP solver.
 
Event handlr for communication point.
 
ParaSolution extension for SCIP solver.