void deleteOrder(Order* order){
deleteVectorArrayBoolean(& order->constraints);
deleteOrderEncoding(& order->order);
- if(order->boolsToConstraints!= NULL)
+ 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);
}
}
#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 */
continue;
ASSERT(simp->type!=FALSE);
dumpConstraint(simp, satSolver);
+ freerecConstraint(simp);
}
deleteVectorConstraint(simplified);
}
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
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 startEncoding(CSolver* solver){
naiveEncodingDecision(solver);
SATEncoder* satEncoder = allocSATEncoder();
- satEncoder->satSolver =allocIncrementalSolver();
encodeAllSATEncoder(solver, satEncoder);
finishedClauses(satEncoder->satSolver);
int result= solve(satEncoder->satSolver);
//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
+}