#Ignoring netbeans configs
nbproject/
+sat_solver
+setup.sh
#Ignoring binary files
src/bin/
src/lib_cons_comp.so
/src/mymemory.cc
.*
-*.dSYM
\ No newline at end of file
+*.dSYM
void deleteOrder(Order* order){
deleteVectorArrayBoolean(& order->constraints);
deleteOrderEncoding(& order->order);
- deleteHashTableBoolConst(order->boolsToConstraints);
+ if(order->boolsToConstraints!= NULL) {
+ resetAndDeleteHashTableBoolConst(order->boolsToConstraints);
+ deleteHashTableBoolConst(order->boolsToConstraints);
+ }
ourfree(order);
}
void deleteConstraint(Constraint *This) {
if (This->operands!=NULL)
ourfree(This->operands);
+ ourfree(This);
}
void dumpConstraint(Constraint * This, IncrementalSolver *solver) {
ASSERT(0);
default:
This->type=BOGUS;
- ourfree(This);
+ deleteConstraint(This);
}
}
model_print("!t%u",This->numoperandsorvar);
break;
default:
+ model_print("In printingConstraint: %d", This->type);
ASSERT(0);
}
}
void printConstraint(Constraint * c);
void dumpConstraint(Constraint * c, IncrementalSolver *solver);
static inline uint getVarConstraint(Constraint * c) {ASSERT(c->type==VAR); return c->numoperandsorvar;}
-VectorConstraint * simplify(Constraint * c);
+VectorConstraint * simplifyConstraint(Constraint * This);
static inline CType getType(Constraint * c) {return c->type;}
static inline bool isFalse(Constraint * c) {return c->type==FALSE;}
static inline bool isTrue(Constraint * c) {return c->type==TRUE;}
#include "orderpair.h"
-OrderPair* allocOrderPair(uint64_t first, uint64_t second){
+OrderPair* allocOrderPair(uint64_t first, uint64_t second, Constraint * constraint){
OrderPair* pair = (OrderPair*) ourmalloc(sizeof(OrderPair));
pair->first = first;
pair->second = second;
+ pair->constraint = constraint;
return pair;
}
+
void deleteOrderPair(OrderPair* pair){
ourfree(pair);
-}
\ No newline at end of file
+}
struct OrderPair{
uint64_t first;
uint64_t second;
+ Constraint *constraint;
};
-OrderPair* allocOrderPair(uint64_t first, uint64_t second);
+OrderPair* allocOrderPair(uint64_t first, uint64_t second, Constraint * constraint);
void deleteOrderPair(OrderPair* pair);
#endif /* ORDERPAIR_H */
SATEncoder * allocSATEncoder() {
SATEncoder *This=ourmalloc(sizeof (SATEncoder));
This->varcount=1;
+ This->satSolver = allocIncrementalSolver();
return This;
}
void deleteSATEncoder(SATEncoder *This) {
+ deleteIncrementalSolver(This->satSolver);
ourfree(This);
}
generateElementEncodingVariables(encoder, getElementEncoding(This));
switch(getElementEncoding(This)->type){
case ONEHOT:
+ //FIXME
ASSERT(0);
break;
case UNARY:
return NULL;
}
+void addConstraintToSATSolver(Constraint *c, IncrementalSolver* satSolver) {
+ VectorConstraint* simplified = simplifyConstraint(c);
+ uint size = getSizeVectorConstraint(simplified);
+ for(uint i=0; i<size; i++) {
+ Constraint *simp=getVectorConstraint(simplified, i);
+ if (simp->type==TRUE)
+ continue;
+ ASSERT(simp->type!=FALSE);
+ dumpConstraint(simp, satSolver);
+ freerecConstraint(simp);
+ }
+ deleteVectorConstraint(simplified);
+}
+
void encodeAllSATEncoder(CSolver *csolver, SATEncoder * This) {
VectorBoolean *constraints=csolver->constraints;
uint size=getSizeVectorBoolean(constraints);
Constraint* c= encodeConstraintSATEncoder(This, constraint);
printConstraint(c);
model_print("\n\n");
+ addConstraintToSATSolver(c, This->satSolver);
+ //FIXME: When do we want to delete constraints? Should we keep an array of them
+ // and delete them later, or it would be better to just delete them right away?
}
}
Constraint * constraint;
if (!containsBoolConst(table, pair)) {
constraint = getNewVarSATEncoder(This);
- OrderPair * paircopy = allocOrderPair(pair->first, pair->second);
- putBoolConst(table, paircopy, constraint);
+ OrderPair * paircopy = allocOrderPair(pair->first, pair->second, constraint);
+ putBoolConst(table, paircopy, paircopy);
} else
- constraint = getBoolConst(table, pair);
+ constraint = getBoolConst(table, pair)->constraint;
if (negate)
return negateConstraint(constraint);
else
return createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order);
}
HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
- OrderPair pair={boolOrder->first, boolOrder->second};
- Constraint* constraint = getPairConstraint(This, boolToConsts, & pair);
- ASSERT(constraint != NULL);
+ OrderPair pair={boolOrder->first, boolOrder->second, NULL};
+ Constraint *constraint = getPairConstraint(This, boolToConsts, & pair);
return constraint;
}
Constraint* getOrderConstraint(HashTableBoolConst *table, OrderPair *pair){
ASSERT(pair->first!= pair->second);
- Constraint* constraint= getBoolConst(table, pair);
- ASSERT(constraint!= NULL);
+ Constraint* constraint= getBoolConst(table, pair)->constraint;
if(pair->first > pair->second)
return constraint;
else
#include "classlist.h"
#include "structs.h"
+#include "inc_solver.h"
struct SATEncoder {
uint varcount;
+ IncrementalSolver* satSolver;
};
SATEncoder * allocSATEncoder();
Constraint* encodeEnumTableElemFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This);
Constraint* encodeTableElementFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This);
Constraint* encodeOperatorElementFunctionSATEncoder(SATEncoder* encoder,ElementFunction* This);
+void addConstraintToSATSolver(Constraint *c, IncrementalSolver* satSolver);
#endif
bool contains ## Name(const HashTable ## Name * tab, _Key key); \
void resize ## Name(HashTable ## Name * tab, unsigned int newsize); \
double getLoadFactor ## Name(HashTable ## Name * tab); \
- unsigned int getCapacity ## Name(HashTable ## Name * tab);
+ unsigned int getCapacity ## Name(HashTable ## Name * tab); \
+ void resetAndDeleteHashTable ## Name(HashTable ## Name * tab);
-#define HashTableImpl(Name, _Key, _Val, hash_function, equals) \
+#define HashTableImpl(Name, _Key, _Val, hash_function, equals, freefunction) \
HashTable ## Name * allocHashTable ## Name(unsigned int initialcapacity, double factor) { \
HashTable ## Name * tab = (HashTable ## Name *)ourmalloc(sizeof(HashTable ## Name)); \
tab->table = (struct hashlistnode ## Name *)ourcalloc(initialcapacity, sizeof(struct hashlistnode ## Name)); \
tab->size = 0; \
return tab; \
} \
- \
- void deleteHashTable ## Name(HashTable ## Name * tab) { \
+ \
+ void deleteHashTable ## Name(HashTable ## Name * tab) { \
ourfree(tab->table); \
if (tab->zero) \
ourfree(tab->zero); \
ourfree(tab); \
} \
- \
+ \
+ void resetAndDeleteHashTable ## Name(HashTable ## Name * tab) { \
+ for(uint i=0;i<tab->capacity;i++) { \
+ struct hashlistnode ## Name * bin=&tab->table[i]; \
+ if (bin->key!=NULL) { \
+ bin->key=NULL; \
+ if (bin->val!=NULL) { \
+ freefunction(bin->val); \
+ bin->val=NULL; \
+ } \
+ } \
+ } \
+ if (tab->zero) { \
+ if (tab->zero->val != NULL) \
+ freefunction(tab->zero->val); \
+ ourfree(tab->zero); \
+ tab->zero=NULL; \
+ } \
+ tab->size=0; \
+ } \
+ \
void reset ## Name(HashTable ## Name * tab) { \
memset(tab->table, 0, tab->capacity * sizeof(struct hashlistnode ## Name)); \
if (tab->zero) { \
return key1->first== key2->first && key1->second == key2->second;
}
-HashTableImpl(BoolConst, OrderPair *, Constraint *, order_pair_hash_Function, order_pair_equals);
+HashTableImpl(BoolConst, OrderPair *, OrderPair *, order_pair_hash_Function, order_pair_equals, ourfree);
VectorDef(Int, uint64_t);
HashTableDef(Void, void *, void *);
-HashTableDef(BoolConst, OrderPair *, Constraint *);
+HashTableDef(BoolConst, OrderPair *, OrderPair *);
HashSetDef(Void, void *);
}
void allocInUseArrayElement(ElementEncoding *This, uint size) {
- This->inUseArray=ourcalloc(1, size >> 6);
+ uint bytes = ((size + ((1 << 9)-1)) >> 6)&~7;//Depends on size of inUseArray
+ This->inUseArray=ourcalloc(1, bytes);
}
void allocElementConstraintVariables(ElementEncoding* This, uint numVars){
export LD_LIBRARY_PATH=../bin
# For Mac OSX
export DYLD_LIBRARY_PATH=../bin
+# For sat_solver
+export PATH=.:$PATH
$@
void startEncoding(CSolver* solver){
naiveEncodingDecision(solver);
SATEncoder* satEncoder = allocSATEncoder();
-// initializeConstraintVars(solver, satEncoder);
encodeAllSATEncoder(solver, satEncoder);
+ finishedClauses(satEncoder->satSolver);
+ int result= solve(satEncoder->satSolver);
+ model_print("sat_solver's result:%d\n", result);
//For now, let's just delete it, and in future for doing queries
//we may need it.
deleteSATEncoder(satEncoder);
-}
\ No newline at end of file
+}