#ifndef __MinisatInterfacing__
#define __MinisatInterfacing__
#include "SATSolver.hpp"
#include "SATLiteral.hpp"
#include "SATClause.hpp"
#include "Minisat/core/Solver.h"
#include "Minisat/simp/SimpSolver.h"
namespace SAT{
template<typename MinisatSolver = Minisat::Solver>
class MinisatInterfacing : public SATSolver
{
public:
static const unsigned VAR_MAX = std::numeric_limits<Minisat::Var>::max() / 2;
void addClause(SATClause* cl) override;
VarAssignment getAssignment(unsigned var) override;
bool isZeroImplied(unsigned var) override;
void ensureVarCount(unsigned newVarCnt) override;
unsigned newVar() override;
void suggestPolarity(unsigned var, unsigned pol) override {
bool mpol = pol ? false : true;
_solver.suggestPolarity(vampireVar2Minisat(var),mpol);
}
Status solveUnderAssumptionsLimited(const SATLiteralStack& assumps, unsigned conflictCountLimit) override;
SATLiteralStack failedAssumptions() override;
static SATClauseList* minimizePremiseList(SATClauseList* premises, SATLiteralStack& assumps);
static void interpolateViaAssumptions(unsigned maxVar, const SATClauseStack& first, const SATClauseStack& second, SATClauseStack& result);
SATClauseList *minimizePremises(SATClauseList *premises) override {
SATLiteralStack assumps;
for(int i = 0; i < _assumptions.size(); i++)
assumps.push(minisatLit2Vampire(_assumptions[i]));
return minimizePremiseList(premises, assumps);
}
protected:
void solveModuloAssumptionsAndSetStatus(unsigned conflictCountLimit = UINT_MAX);
Minisat::Var vampireVar2Minisat(unsigned vvar) {
ASS_G(vvar,0); ASS_LE(vvar,(unsigned)_solver.nVars());
return (vvar-1);
}
unsigned minisatVar2Vampire(Minisat::Var mvar) {
return (unsigned)(mvar+1);
}
const Minisat::Lit vampireLit2Minisat(SATLiteral vlit) {
return Minisat::mkLit(vampireVar2Minisat(vlit.var()),!vlit.positive());
}
const SATLiteral minisatLit2Vampire(Minisat::Lit mlit) {
return SATLiteral(minisatVar2Vampire(Minisat::var(mlit)),Minisat::sign(mlit) ? 0 : 1);
}
private:
Status _status = Status::SATISFIABLE;
Minisat::vec<Minisat::Lit> _assumptions;
MinisatSolver _solver;
};
using MinisatInterfacingNewSimp = MinisatInterfacing<Minisat::SimpSolver>;
}
#endif