void SimplexDecisionProcedure::shrinkInfeasFunc(TimerStat& timer, ArithVar inf, const ArithVarVec& dropped){ TimerStat::CodeTimer codeTimer(timer); for(ArithVarVec::const_iterator i=dropped.begin(), i_end = dropped.end(); i != i_end; ++i){ ArithVar back = *i; int focusSgn = d_errorSet.focusSgn(back); Rational chg(-focusSgn); d_linEq.substitutePlusTimesConstant(inf, back, chg); } }
ArithVar SimplexDecisionProcedure::constructInfeasiblityFunction(TimerStat& timer, const ArithVarVec& set){ Debug("constructInfeasiblityFunction") << "constructInfeasiblityFunction start" << endl; TimerStat::CodeTimer codeTimer(timer); Assert(!d_errorSet.focusEmpty()); Assert(debugIsASet(set)); ArithVar inf = requestVariable(); Assert(inf != ARITHVAR_SENTINEL); std::vector<Rational> coeffs; std::vector<ArithVar> variables; for(ArithVarVec::const_iterator iter = set.begin(), iend = set.end(); iter != iend; ++iter){ ArithVar e = *iter; Assert(d_tableau.isBasic(e)); Assert(!d_variables.assignmentIsConsistent(e)); int sgn = d_errorSet.getSgn(e); Assert(sgn == -1 || sgn == 1); const Rational& violatedCoeff = sgn < 0 ? d_negOne : d_posOne; coeffs.push_back(violatedCoeff); variables.push_back(e); Debug("constructInfeasiblityFunction") << violatedCoeff << " " << e << endl; } d_tableau.addRow(inf, coeffs, variables); DeltaRational newAssignment = d_linEq.computeRowValue(inf, false); d_variables.setAssignment(inf, newAssignment); //d_linEq.trackVariable(inf); d_linEq.trackRowIndex(d_tableau.basicToRowIndex(inf)); Debug("constructInfeasiblityFunction") << inf << " " << newAssignment << endl; Debug("constructInfeasiblityFunction") << "constructInfeasiblityFunction done" << endl; return inf; }