WitnessImprovement FCSimplexDecisionProcedure::focusDownToLastHalf(){ Assert(d_focusSize >= 2); Debug("focusDownToLastHalf") << "focusDownToLastHalf " << d_errorSet.errorSize() << " " << d_errorSet.focusSize() << " "; uint32_t half = d_focusSize/2; ArithVarVec buf; for(ErrorSet::focus_iterator i = d_errorSet.focusBegin(), i_end = d_errorSet.focusEnd(); i != i_end; ++i){ if(half > 0){ --half; } else{ buf.push_back(*i); } } WitnessImprovement w = adjustFocusShrank(buf); Debug("focusDownToLastHalf") << "-> " << d_errorSet.focusSize() << endl; return w; }
WitnessImprovement FCSimplexDecisionProcedure::focusUsingSignDisagreements(ArithVar basic){ Assert(!d_sgnDisagreements.empty()); Assert(d_errorSet.focusSize() >= 2); if(Debug.isOn("arith::focus")){ d_errorSet.debugPrint(Debug("arith::focus")); } ArithVar nb = d_linEq.minBy(d_sgnDisagreements, &LinearEqualityModule::minColLength); const Tableau::Entry& e_evar_nb = d_tableau.basicFindEntry(basic, nb); int oppositeSgn = - (e_evar_nb.getCoefficient().sgn()); Debug("arith::focus") << "focusUsingSignDisagreements " << basic << " " << oppositeSgn << endl; ArithVarVec dropped; Tableau::ColIterator colIter = d_tableau.colIterator(nb); for(; !colIter.atEnd(); ++colIter){ const Tableau::Entry& entry = *colIter; Assert(entry.getColVar() == nb); int sgn = entry.getCoefficient().sgn(); Debug("arith::focus") << "on row " << d_tableau.rowIndexToBasic(entry.getRowIndex()) << " " << entry.getCoefficient() << endl; ArithVar currRow = d_tableau.rowIndexToBasic(entry.getRowIndex()); if(d_errorSet.inError(currRow) && d_errorSet.inFocus(currRow)){ int errSgn = d_errorSet.getSgn(currRow); if(errSgn * sgn == oppositeSgn){ dropped.push_back(currRow); Debug("arith::focus") << "dropping from focus " << currRow << endl; } } } d_sgnDisagreements.clear(); return adjustFocusShrank(dropped); }
ArithVar SimplexDecisionProcedure::constructInfeasiblityFunction(TimerStat& timer, ArithVar e){ ArithVarVec justE; justE.push_back(e); return constructInfeasiblityFunction(timer, justE); }