#include "theory/arith/partial_model.h" #include "util/output.h" using namespace std; using namespace CVC4; using namespace CVC4::theory; using namespace CVC4::theory::arith; using namespace CVC4::theory::arith::partial_model; void ArithPartialModel::setUpperBound(TNode x, const DeltaRational& r){ Assert(x.getMetaKind() == CVC4::kind::metakind::VARIABLE); Debug("partial_model") << "setUpperBound(" << x << "," << r << ")" << endl; d_UpperBoundMap[x] = r; } void ArithPartialModel::setLowerBound(TNode x, const DeltaRational& r){ Assert(x.getMetaKind() == CVC4::kind::metakind::VARIABLE); Debug("partial_model") << "setLowerBound(" << x << "," << r << ")" << endl; d_LowerBoundMap[x] = r; } void ArithPartialModel::setAssignment(TNode x, const DeltaRational& r){ Assert(x.getMetaKind() == CVC4::kind::metakind::VARIABLE); if(d_savingAssignments){ d_history.push_back(make_pair(x,r)); } DeltaRational* c; if(x.getAttribute(partial_model::Assignment(), c)){ *c = r; Debug("partial_model") << "pm: updating the assignment to" << x << " now " << r < u; }else{ return c >= u; } } bool ArithPartialModel::strictlyBelowUpperBound(TNode x){ DeltaRational* assign; AlwaysAssert(x.getAttribute(partial_model::Assignment(),assign)); CDDRationalMap::iterator i = d_UpperBoundMap.find(x); if(i == d_UpperBoundMap.end()){// u = \infty return true; } DeltaRational u = (*i).second; return *assign < u; } bool ArithPartialModel::strictlyAboveLowerBound(TNode x){ DeltaRational* assign; AlwaysAssert(x.getAttribute(partial_model::Assignment(),assign)); CDDRationalMap::iterator i = d_LowerBoundMap.find(x); if(i == d_LowerBoundMap.end()){// l = \infty return true; } DeltaRational l = (*i).second; return l < *assign; } bool ArithPartialModel::assignmentIsConsistent(TNode x){ DeltaRational beta = getAssignment(x); bool above_li = !belowLowerBound(x,beta,true); bool below_ui = !aboveUpperBound(x,beta,true); //l_i <= beta(x_i) <= u_i return above_li && below_ui; } void ArithPartialModel::beginRecordingAssignments(){ Assert(!d_savingAssignments); Assert(d_history.empty()); d_savingAssignments = true; } void ArithPartialModel::stopRecordingAssignments(bool revert){ Assert(d_savingAssignments); d_savingAssignments = false; if(revert){ while(!d_history.empty()){ pair& curr = d_history.back(); d_history.pop_back(); TNode x = curr.first; DeltaRational* c; bool hasAssignment = x.getAttribute(partial_model::Assignment(), c); Assert(hasAssignment); *c = curr.second; } }else{ d_history.clear(); } }