bool debugUpdatedBasic(const UpdateInfo& selected, ArithVar updated){ if(selected.describesPivot() && updated == selected.leaving()){ return selected.foundConflict(); }else{ return true; } }
void FCSimplexDecisionProcedure::updateAndSignal(const UpdateInfo& selected, WitnessImprovement w){ ArithVar nonbasic = selected.nonbasic(); static bool verbose = false; Debug("updateAndSignal") << "updateAndSignal " << selected << endl; stringstream ss; if(verbose){ d_errorSet.debugPrint(ss); if(selected.describesPivot()){ ArithVar leaving = selected.leaving(); ss << "leaving " << leaving << " " << d_tableau.basicRowLength(leaving) << " " << d_linEq.debugBasicAtBoundCount(leaving) << endl; } if(degenerate(w) && selected.describesPivot()){ ArithVar leaving = selected.leaving(); Message() << "degenerate " << leaving << ", atBounds " << d_linEq.basicsAtBounds(selected) << ", len " << d_tableau.basicRowLength(leaving) << ", bc " << d_linEq.debugBasicAtBoundCount(leaving) << endl; } } if(selected.describesPivot()){ ConstraintP limiting = selected.limiting(); ArithVar basic = limiting->getVariable(); Assert(d_linEq.basicIsTracked(basic)); d_linEq.pivotAndUpdate(basic, nonbasic, limiting->getValue()); }else{ Assert(!selected.unbounded() || selected.errorsChange() < 0); DeltaRational newAssignment = d_variables.getAssignment(nonbasic) + selected.nonbasicDelta(); d_linEq.updateTracked(nonbasic, newAssignment); } d_pivots++; increaseLeavingCount(nonbasic); vector< pair<ArithVar, int> > focusChanges; while(d_errorSet.moreSignals()){ ArithVar updated = d_errorSet.topSignal(); int prevFocusSgn = d_errorSet.popSignal(); if(d_tableau.isBasic(updated)){ Assert(!d_variables.assignmentIsConsistent(updated) == d_errorSet.inError(updated)); if(Debug.isOn("updateAndSignal")){debugPrintSignal(updated);} if(!d_variables.assignmentIsConsistent(updated)){ if(checkBasicForConflict(updated)){ reportConflict(updated); Assert(debugUpdatedBasic(selected, updated)); } } }else{ Debug("updateAndSignal") << "updated nonbasic " << updated << endl; } int currFocusSgn = d_errorSet.focusSgn(updated); if(currFocusSgn != prevFocusSgn){ int change = currFocusSgn - prevFocusSgn; focusChanges.push_back(make_pair(updated, change)); } } if(verbose){ Message() << "conflict variable " << selected << endl; Message() << ss.str(); } if(Debug.isOn("error")){ d_errorSet.debugPrint(Debug("error")); } Assert(debugSelectedErrorDropped(selected, d_errorSize, d_errorSet.errorSize())); adjustFocusAndError(selected, focusChanges); }