bool Rank1Constraint::isSatisfied(const VariableAssignment& assignment, const PrintOptions& printOnFail) const { const FElem ares = a_.eval(assignment); const FElem bres = b_.eval(assignment); const FElem cres = c_.eval(assignment); if (ares*bres != cres) { # ifdef DEBUG if (printOnFail == PrintOptions::DBG_PRINT_IF_NOT_SATISFIED) { cerr << GADGETLIB2_FMT("Constraint named \"%s\" not satisfied. Constraint is:", name().c_str()) << endl; cerr << annotation() << endl; cerr << "Variable assignments are:" << endl; const Variable::set varSet = getUsedVariables(); for(const Variable& var : varSet) { cerr << var.name() << ": " << assignment.at(var).asString() << endl; } cerr << "a: " << ares.asString() << endl; cerr << "b: " << bres.asString() << endl; cerr << "a*b: " << (ares*bres).asString() << endl; cerr << "c: " << cres.asString() << endl; } # endif return false; } return true; }
FElem Variable::eval(const VariableAssignment& assignment) const { try { return assignment.at(*this); } catch (::std::out_of_range) { GADGETLIB_FATAL(GADGETLIB2_FMT("Attempted to evaluate unassigned Variable \"%s\", idx:%lu", name().c_str(), index_)); } }
bool PolynomialConstraint::isSatisfied(const VariableAssignment& assignment, const PrintOptions& printOnFail) const { const FElem aEval = a_.eval(assignment); const FElem bEval = b_.eval(assignment); if (aEval != bEval) { # ifdef DEBUG if(printOnFail == PrintOptions::DBG_PRINT_IF_NOT_SATISFIED) { cerr << GADGETLIB2_FMT("Constraint named \"%s\" not satisfied. Constraint is:", name().c_str()) << endl; cerr << annotation() << endl; cerr << "Expecting: " << aEval << " == " << bEval << endl; cerr << "Variable assignments are:" << endl; const Variable::set varSet = getUsedVariables(); for(const Variable& var : varSet) { cerr << var.name() << ": " << assignment.at(var).asString() << endl; } } # endif return false; } return true; }
::std::string LinearTerm::asString() const { if (coeff_ == 1) { return variable_.name();} else if (coeff_ == -1) {return GADGETLIB2_FMT("-1 * %s", variable_.name().c_str());} else if (coeff_ == 0) {return GADGETLIB2_FMT("0 * %s", variable_.name().c_str());} else {return GADGETLIB2_FMT("%s * %s", coeff_.asString().c_str(), variable_.name().c_str());} }
VariableArray::VariableArray(const size_t size, const ::std::string& name) : VariableArrayContents() { for (size_t i = 0; i < size; ++i) { push_back(Variable(GADGETLIB2_FMT("%s[%d]", name.c_str(), i))); } }
Variable::Variable(const string& name) : index_(nextFreeIndex_++) { libff::UNUSED(name); GADGETLIB_ASSERT(nextFreeIndex_ > 0, GADGETLIB2_FMT("Variable index overflow has occured, maximum number of " "Variables is %lu", ULONG_MAX)); }