bool FCSimplexDecisionProcedure::debugCheckWitness(const UpdateInfo& inf, WitnessImprovement w, bool useBlands){ if(inf.getWitness(useBlands) == w){ switch(w){ case ConflictFound: return inf.foundConflict(); case ErrorDropped: return inf.errorsChange() < 0; case FocusImproved: return inf.focusDirection() > 0; case FocusShrank: return false; // This is not a valid output case Degenerate: return false; // This is not a valid output case BlandsDegenerate: return useBlands; case HeuristicDegenerate: return !useBlands; case AntiProductive: return false; } } return false; }
WitnessImprovement FCSimplexDecisionProcedure::dualLikeImproveError(ArithVar errorVar){ Assert(d_sgnDisagreements.empty()); Assert(d_focusSize > 1); UpdateInfo selected = selectUpdateForDualLike(errorVar); if(selected.uninitialized()){ // we found no proposals // If this is empty, there must be an error on this variable! // this should not be possible. It Should have been caught as a signal earlier WitnessImprovement dropped = focusUsingSignDisagreements(errorVar); Assert(d_sgnDisagreements.empty()); return dropped; }else{ d_sgnDisagreements.clear(); } Assert(d_sgnDisagreements.empty()); Assert(!selected.uninitialized()); if(selected.focusDirection() == 0 && d_prevWitnessImprovement == HeuristicDegenerate && d_witnessImprovementInARow >= s_focusThreshold){ Debug("focusDownToJust") << "focusDownToJust " << errorVar << endl; return focusDownToJust(errorVar); }else{ WitnessImprovement w = selected.getWitness(false); Assert(debugCheckWitness(selected, w, false)); updateAndSignal(selected, w); logPivot(w); return w; } }