#ifndef GlucoseSolver_h #define GlucoseSolver_h #include "glucose/core/Solver.h" using namespace CMP; class GlucoseSolver : public SatSolver { //TODO update model after calling to solve() // friend class SatSolverFactory; public: Glucose::Solver* slv; GlucoseSolver() {slv = new Glucose::Solver();} ~GlucoseSolver() {if(!slv) {delete slv; slv = NULL;}} bool solve2 () { vec emptyVec; return solve2(emptyVec); } bool solve2 (const vec& assumps) { Glucose::vec m_assumps; for(int i = 0 ; isolve(m_assumps); } bool solve () { vec emptyVec; return solve(emptyVec); } bool solve (Lit p) { vec notEmptyVec; notEmptyVec.push(p); return solve(notEmptyVec); } bool solve (const vec& assumps) { Glucose::vec m_assumps; for(int i = 0 ; isolve(m_assumps); } bool solve (const vec& assumps, const vec& mss) { //TODO Glucose::vec m_assumps, m_mss; for(int i = 0 ; isolve(m_assumps, m_mss); } bool solve (const int lim) { assert(0); return slv->solve(lim); } void initNbVariable(int n) { slv->initNbInitialVars(n);} Var newVar(bool polarity = true, bool dvar = true) {return slv->newVar(polarity, dvar);} bool addClause(const vec& ps) { Glucose::vec m_lits; for(int i=0; iaddClause(m_lits); } void uncheckedEnqueue(Lit p) {slv->uncheckedEnqueue(Glucose::mkLit((int)var(p), sign(p)));} lbool value(Lit p) { Glucose::lbool m_val = slv->value(Glucose::mkLit((int)var(p), sign(p))); lbool val = (Glucose::toInt(m_val) == 0)? l_True : ((Glucose::toInt(m_val) == 1)? l_False : l_Undef); return val; } lbool value(Var v) { Glucose::lbool m_val = slv->value((int)v); lbool val = (Glucose::toInt(m_val) == 0)? l_True : ((Glucose::toInt(m_val) == 1)? l_False : l_Undef); return val; } lbool modelValue(Lit p) { assert(slv->model.size()>var(p)); Glucose::lbool m_val = slv->modelValue(Glucose::mkLit((int)var(p), sign(p))); lbool val = (Glucose::toInt(m_val) == 0)? l_True : ((Glucose::toInt(m_val) == 1)? l_False : l_Undef); return val; } lbool modelValue(Var v) { assert(slv->model.size() > v); Glucose::lbool m_val = slv->modelValue(v); lbool val = (Glucose::toInt(m_val) == 0)? l_True : ((Glucose::toInt(m_val) == 1)? l_False : l_Undef); return val; } void setPolarity(Var v, bool b) {slv->setPolarity(v,b);} void getConflict(vec& core) { for(int i=0; iconflict.size(); i++) core.push(mkLit((int)Glucose::var(slv->conflict[i]), Glucose::sign(slv->conflict[i]))); } int getPolarity(Var v) {return slv->polarity[v];} double activity(Var v) {return slv->activity[(int)v];} bool reason_is_undef(Var v) {return (slv->reason((int)v) == Glucose::CRef_Undef);} void getTrail(vec& trail) {trail.clear();}//TODO int nAssigns() {return slv->nAssigns();} int nClauses() {return slv->nClauses();} int nLearnts() {return slv->nLearnts();} int nVars() {return slv->nVars();} void allowLearnts(bool b) {slv->canTouchLearnt = b;} int decisionLevel() {return slv->decisionLevel();} void newDecisionLevel() {slv->newDecisionLevel();} bool propagate_() {return (slv->propagate() == Glucose::CRef_Undef);} void cancelUntil(int level) {slv->cancelUntil(level);} void restartUntil(int level) {slv->restartUntil(level);} void removeLearnts() {slv->removeLearnts();} void removeFromTrail(Var v) {slv->removeFromTrail(v);} void analyzeFinal(Lit p, vec& confl) { Glucose::Lit m_lit = Glucose::mkLit((int)var(p), sign(p)); Glucose::vec out_conflict; slv->analyzeFinal(m_lit, out_conflict); confl.clear(); for(int i=0; ipropagate(); return NULL; //TODO /* if(cr == Glucose::CRef_Undef) return NULL; */ /* return getIth_clauses(slv->ca[cr].index()); */ } Clause* reason(Var x) { printf("%d\n", x); /* Minisat::CRef cr = slv->reason(x); */ return NULL; /* if(cr == Minisat::CRef_Undef) return NULL; */ /* return &(getIth_clauses(slv->ca[cr].index())); */ } void addPhantomClause(vec& ps) { //TODO Glucose::vec m_lits; for(int i=0; iaddPhantomClause(m_lits); } void removePhantomClauses() {slv->removePhantomClauses();} void popLearnt() {slv->removeClause((slv->learnts).last()); slv->learnts.pop();}//TODO bool originalVar(Var v) {return slv->originalVar((int)v);} //TODO Clause a; Clause &getIth_clauses(int i) { assert(ica[slv->clauses[i]]; //Lit lits[c.size()]; vec lits; for(int j=0; jnbVarsInitialFormula;} void addBlockingClause(const vec& ps) { //TODO vec lits; ps.copyTo(lits); addClause(lits); } int nCalls() {return 0;}//TODO void printStats() {} void interrupt() {} void printClauses() { } //TODO }; #endif