// Datatype for Clauselists
typedef vector<ClausePtr> ClauseList;
+ //Needed for defining the MAP below
+ struct ltint
+ {
+ bool operator()(int s1, int s2) const
+ {
+ return s1 < s2;
+ }
+ };
+
//Datatype for ClauseLists
typedef MAP<
int,
- ClauseList *> ClauseBuckets;
+ ClauseList *,
+ ltint> ClauseBuckets;
// Function to dump contents of ASTNodeMap
ostream &operator<<(ostream &os, const ASTNodeMap &nmap);
********************************************************************/
#include "ToSAT.h"
+#define MAX_BUCKET_LIMIT 3
namespace BEEV
{
-
- static ClauseBuckets * SortClauseList_IntoBuckets(ClauseList * cl)
+ //Bucketize clauses into buckets of size 1,2,...MAX_BUCKET_LIMIT
+ static ClauseBuckets * Sort_ClauseList_IntoBuckets(ClauseList * cl)
{
ClauseBuckets * cb = new ClauseBuckets();
{
ClausePtr cptr = *it;
int cl_size = cptr->size();
-
+ if(cl_size >= MAX_BUCKET_LIMIT)
+ {
+ cl_size = MAX_BUCKET_LIMIT;
+ }
+
//If no clauses of size cl_size have been seen, then create a
//bucket for that size
if(cb->find(cl_size) == cb->end())
return cb;
} //End of SortClauseList_IntoBuckets()
+ bool ToSAT::CallSAT_On_ClauseBuckets(MINISAT::Solver& SatSolver,
+ ClauseBuckets * cb)
+ {
+ ClauseBuckets::iterator it = cb->begin();
+ ClauseBuckets::iterator itend = cb->end();
+
+ bool sat = false;
+ for(;it!=itend;it++)
+ {
+ ClauseList *cl = (*it).second;
+ sat = toSATandSolve(SatSolver,*cl);
+ if(!sat)
+ {
+ return sat;
+ }
+ }
+ return sat;
+ }
+
//Call the SAT solver, and check the result before returning. This
//can return one of 3 values, SOLVER_VALID, SOLVER_INVALID or
//SOLVER_UNDECIDED
CNFMgr* cm = new CNFMgr(bm);
ClauseList* cl = cm->convertToCNF(BBFormula);
- ClauseBuckets * cb = SortClauseList_IntoBuckets(cl);
- bool sat = toSATandSolve(SatSolver, *cl);
+ ClauseBuckets * cb = Sort_ClauseList_IntoBuckets(cl);
+ //bool sat = toSATandSolve(SatSolver, *cl);
+ bool sat = CallSAT_On_ClauseBuckets(SatSolver, cb);
cm->DELETE(cl);
delete cm;
return sat;
bool CallSAT(MINISAT::Solver& SatSolver,
const ASTNode& modified_input,
const ASTNode& original_input);
+
+ //Iteratively goes through the Clause Buckets, and calls
+ //toSATandSolve()
+ bool CallSAT_On_ClauseBuckets(MINISAT::Solver& SatSolver,
+ ClauseBuckets * cb);
// Converts the clause to SAT and calls SAT solver
bool toSATandSolve(MINISAT::Solver& S, ClauseList& cll);