#include "element.h"
#include "order.h"
-Boolean* allocBoolean(VarType t) {
- BooleanVar* tmp=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
- GETBOOLEANTYPE(tmp)=BOOLEANVAR;
- tmp->vtype=t;
- tmp->var=E_NULL;
- allocInlineDefVectorBoolean(GETBOOLEANPARENTS(tmp));
- return & tmp->base;
+Boolean* allocBooleanVar(VarType t) {
+ BooleanVar* This=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
+ GETBOOLEANTYPE(This)=BOOLEANVAR;
+ This->vtype=t;
+ This->var=E_NULL;
+ initDefVectorBoolean(GETBOOLEANPARENTS(This));
+ return & This->base;
}
Boolean* allocBooleanOrder(Order* order, uint64_t first, uint64_t second) {
- BooleanOrder* tmp=(BooleanOrder *) ourmalloc(sizeof (BooleanOrder));
- GETBOOLEANTYPE(tmp)=ORDERCONST;
- tmp->order=order;
- tmp->first=first;
- tmp->second=second;
- //FIXME: what if client calls this function with the same arguments?
- //Instead of vector we should keep a hashtable from PAIR->BOOLEANOrder with
- //asymmetric hash function.
- pushVectorBoolean(&order->constraints, &tmp->base);
- allocInlineDefVectorBoolean(GETBOOLEANPARENTS(tmp));
- return & tmp -> base;
+ BooleanOrder* This=(BooleanOrder *) ourmalloc(sizeof (BooleanOrder));
+ GETBOOLEANTYPE(This)=ORDERCONST;
+ This->order=order;
+ This->first=first;
+ This->second=second;
+ pushVectorBoolean(&order->constraints, &This->base);
+ initDefVectorBoolean(GETBOOLEANPARENTS(This));
+ return & This -> base;
}
Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs){
BooleanPredicate* This = (BooleanPredicate*) ourmalloc(sizeof(BooleanPredicate));
GETBOOLEANTYPE(This)= PREDICATEOP;
This->predicate=predicate;
- allocInlineArrayInitElement(&This->inputs, inputs, numInputs);
- allocInlineDefVectorBoolean(GETBOOLEANPARENTS(This));
+ initArrayInitElement(&This->inputs, inputs, numInputs);
+ initDefVectorBoolean(GETBOOLEANPARENTS(This));
for(uint i=0;i<numInputs;i++) {
pushVectorASTNode(GETELEMENTPARENTS(inputs[i]), (ASTNode *)This);
Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize){
BooleanLogic * This = ourmalloc(sizeof(BooleanLogic));
- allocInlineDefVectorBoolean(GETBOOLEANPARENTS(This));
- allocInlineArrayInitBoolean(&This->inputs, array, asize);
+ initDefVectorBoolean(GETBOOLEANPARENTS(This));
+ initArrayInitBoolean(&This->inputs, array, asize);
pushVectorBoolean(solver->allBooleans, (Boolean *) This);
return & This->base;
}
ArrayElement inputs;
};
-Boolean * allocBoolean(VarType t);
+Boolean * allocBooleanVar(VarType t);
Boolean * allocBooleanOrder(Order * order, uint64_t first, uint64_t second);
Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs);
Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize);
#include "table.h"
Element *allocElementSet(Set * s) {
- ElementSet * tmp=(ElementSet *)ourmalloc(sizeof(ElementSet));
- GETELEMENTTYPE(tmp)= ELEMSET;
- tmp->set=s;
- allocInlineDefVectorASTNode(GETELEMENTPARENTS(tmp));
- initElementEncoding(&tmp->encoding, (Element *) tmp);
- return &tmp->base;
+ ElementSet * This=(ElementSet *)ourmalloc(sizeof(ElementSet));
+ GETELEMENTTYPE(This)= ELEMSET;
+ This->set=s;
+ initDefVectorASTNode(GETELEMENTPARENTS(This));
+ initElementEncoding(&This->encoding, (Element *) This);
+ return &This->base;
}
Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus){
- ElementFunction* tmp = (ElementFunction*) ourmalloc(sizeof(ElementFunction));
- GETELEMENTTYPE(tmp)= ELEMFUNCRETURN;
- tmp->function=function;
- tmp->overflowstatus = overflowstatus;
- allocInlineArrayInitElement(&tmp->inputs, array, numArrays);
- allocInlineDefVectorASTNode(GETELEMENTPARENTS(tmp));
+ ElementFunction* This = (ElementFunction*) ourmalloc(sizeof(ElementFunction));
+ GETELEMENTTYPE(This)= ELEMFUNCRETURN;
+ This->function=function;
+ This->overflowstatus = overflowstatus;
+ initArrayInitElement(&This->inputs, array, numArrays);
+ initDefVectorASTNode(GETELEMENTPARENTS(This));
for(uint i=0;i<numArrays;i++)
- pushVectorASTNode(GETELEMENTPARENTS(array[i]), (ASTNode *) tmp);
- initElementEncoding(&tmp->domainencoding, (Element *) tmp);
- initFunctionEncoding(&tmp->functionencoding, (Element *) tmp);
- return &tmp->base;
+ pushVectorASTNode(GETELEMENTPARENTS(array[i]), (ASTNode *) This);
+ initElementEncoding(&This->domainencoding, (Element *) This);
+ initFunctionEncoding(&This->functionencoding, (Element *) This);
+ return &This->base;
}
Set* getElementSet(Element* This){
switch(GETELEMENTTYPE(This)){
- case ELEMSET:
- return ((ElementSet*)This)->set;
- case ELEMFUNCRETURN:
- ;//Nope is needed for label assignment. i.e. next instruction isn't a statement
- Function* func = ((ElementFunction*)This)->function;
- switch(GETFUNCTIONTYPE(func)){
- case TABLEFUNC:
- return ((FunctionTable*)func)->table->range;
- case OPERATORFUNC:
- return ((FunctionOperator*)func)->range;
- default:
- ASSERT(0);
- }
+ case ELEMSET:
+ return ((ElementSet*)This)->set;
+ case ELEMFUNCRETURN: {
+ Function* func = ((ElementFunction*)This)->function;
+ switch(GETFUNCTIONTYPE(func)){
+ case TABLEFUNC:
+ return ((FunctionTable*)func)->table->range;
+ case OPERATORFUNC:
+ return ((FunctionOperator*)func)->range;
default:
ASSERT(0);
+ }
+ }
+ default:
+ ASSERT(0);
}
ASSERT(0);
return NULL;
break;
}
default:
- ;
+ ASSERT(0);
}
deleteVectorArrayASTNode(GETELEMENTPARENTS(This));
-
ourfree(This);
}
Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
void deleteElement(Element *This);
Set* getElementSet(Element* This);
+
static inline ElementEncoding* getElementEncoding(Element* This){
switch(GETELEMENTTYPE(This)){
case ELEMSET:
return NULL;
}
-
static inline FunctionEncoding* getElementFunctionEncoding(ElementFunction* func){
return &func->functionencoding;
}
-
#endif
#include "set.h"
-Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior){
+Function* allocFunctionOperator(ArithOp op, Set ** domain, uint numDomain, Set * range, OverFlowBehavior overflowbehavior) {
FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
GETFUNCTIONTYPE(This)=OPERATORFUNC;
- allocInlineArrayInitSet(&This->domains, domain, numDomain);
+ initArrayInitSet(&This->domains, domain, numDomain);
This->op=op;
This->overflowbehavior = overflowbehavior;
This->range=range;
return &This->base;
}
-uint64_t applyFunctionOperator(FunctionOperator* func, uint64_t var1, uint64_t var2, bool* isInRange){
+uint64_t applyFunctionOperator(FunctionOperator* This, uint64_t var1, uint64_t var2) {
uint64_t result = 0;
- switch( func->op){
+ switch(This->op){
case ADD:
result = var1+ var2;
break;
default:
ASSERT(0);
}
- *isInRange = existsInSet(func->range, result);
return result;
}
+bool isInRangeFunction(FunctionOperator *This, uint64_t val) {
+ return existsInSet(This->range, val);
+}
+
void deleteFunction(Function* This){
switch(GETFUNCTIONTYPE(This)){
case TABLEFUNC:
Table* table;
};
-Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior);
+Function* allocFunctionOperator(ArithOp op, Set ** domain, uint numDomain, Set * range, OverFlowBehavior overflowbehavior);
Function* allocFunctionTable (Table* table);
-uint64_t applyFunctionOperator(FunctionOperator* func, uint64_t var1, uint64_t var2, bool* isInrange);
+uint64_t applyFunctionOperator(FunctionOperator* This, uint64_t var1, uint64_t var2);
+bool isInRangeFunction(FunctionOperator *This, uint64_t val);
void deleteFunction(Function* This);
#endif
#include "mutableset.h"
MutableSet * allocMutableSet(VarType t) {
- MutableSet * tmp=(MutableSet *)ourmalloc(sizeof(MutableSet));
- tmp->type=t;
- tmp->isRange=false;
- tmp->low=0;
- tmp->high=0;
- tmp->members=allocDefVectorInt();
- return tmp;
+ MutableSet * This=(MutableSet *)ourmalloc(sizeof(MutableSet));
+ This->type=t;
+ This->isRange=false;
+ This->low=0;
+ This->high=0;
+ This->members=allocDefVectorInt();
+ return This;
}
void addElementMSet(MutableSet * set, uint64_t element) {
#include "set.h"
#include "boolean.h"
-
Order* allocOrder(OrderType type, Set * set){
- Order* order = (Order*)ourmalloc(sizeof(Order));
- order->set=set;
- allocInlineDefVectorBoolean(& order->constraints);
- order->type=type;
- allocOrderEncoding(& order->order, order);
- order->boolsToConstraints = NULL;
- return order;
+ Order* This = (Order*)ourmalloc(sizeof(Order));
+ This->set=set;
+ initDefVectorBoolean(& This->constraints);
+ This->type=type;
+ initOrderEncoding(& This->order, This);
+ This->orderPairTable = NULL;
+ return This;
}
-void initializeOrderHashTable(Order* order){
- order->boolsToConstraints= allocHashTableBoolConst(HT_INITIAL_CAPACITY, HT_DEFAULT_FACTOR);
+void initializeOrderHashTable(Order* This){
+ This->orderPairTable=allocHashTableOrderPair(HT_INITIAL_CAPACITY, HT_DEFAULT_FACTOR);
}
-void addOrderConstraint(Order* order, BooleanOrder* constraint){
- pushVectorBoolean( &order->constraints, (Boolean*) constraint);
+void addOrderConstraint(Order* This, BooleanOrder* constraint){
+ pushVectorBoolean( &This->constraints, (Boolean*) constraint);
}
-void setOrderEncodingType(Order* order, OrderEncodingType type){
- order->order.type = type;
+void setOrderEncodingType(Order* This, OrderEncodingType type){
+ This->order.type = type;
}
-void deleteOrder(Order* order){
- deleteVectorArrayBoolean(& order->constraints);
- deleteOrderEncoding(& order->order);
- if(order->boolsToConstraints!= NULL) {
- resetAndDeleteHashTableBoolConst(order->boolsToConstraints);
- deleteHashTableBoolConst(order->boolsToConstraints);
+void deleteOrder(Order* This){
+ deleteVectorArrayBoolean(& This->constraints);
+ deleteOrderEncoding(& This->order);
+ if(This->orderPairTable != NULL) {
+ resetAndDeleteHashTableOrderPair(This->orderPairTable);
+ deleteHashTableOrderPair(This->orderPairTable);
}
- ourfree(order);
+ ourfree(This);
}
struct Order {
OrderType type;
Set * set;
- HashTableBoolConst* boolsToConstraints;
+ HashTableOrderPair * orderPairTable;
VectorBoolean constraints;
OrderEncoding order;
};
Order* allocOrder(OrderType type, Set * set);
-void initializeOrderHashTable(Order * order);
-void addOrderConstraint(Order* order, BooleanOrder* constraint);
-void setOrderEncodingType(Order* order, OrderEncodingType type);
-void deleteOrder(Order* order);
+void initializeOrderHashTable(Order * This);
+void addOrderConstraint(Order * This, BooleanOrder * constraint);
+void setOrderEncodingType(Order * This, OrderEncodingType type);
+void deleteOrder(Order * This);
#endif
#include "set.h"
Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain){
- PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator));
- GETPREDICATETYPE(predicate)=OPERATORPRED;
- allocInlineArrayInitSet(&predicate->domains, domain, numDomain);
- predicate->op=op;
- return &predicate->base;
+ PredicateOperator* This = ourmalloc(sizeof(PredicateOperator));
+ GETPREDICATETYPE(This)=OPERATORPRED;
+ initArrayInitSet(&This->domains, domain, numDomain);
+ This->op=op;
+ return &This->base;
}
Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior){
- PredicateTable* predicate = ourmalloc(sizeof(PredicateTable));
- GETPREDICATETYPE(predicate) = TABLEPRED;
- predicate->table=table;
- predicate->undefinedbehavior=undefBehavior;
- return &predicate->base;
+ PredicateTable* This = ourmalloc(sizeof(PredicateTable));
+ GETPREDICATETYPE(This) = TABLEPRED;
+ This->table=table;
+ This->undefinedbehavior=undefBehavior;
+ return &This->base;
}
-void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result){
- ASSERT( predicate->op == EQUALS);
+// BRIAN: REVISIT
+void getEqualitySetIntersection(PredicateOperator* This, uint* size, uint64_t* result){
+ ASSERT( This->op == EQUALS);
//make sure equality has 2 operands
- ASSERT(getSizeArraySet( &predicate->domains) == 2);
+ ASSERT(getSizeArraySet( &This->domains) == 2);
*size=0;
- VectorInt* mems1 = getArraySet(&predicate->domains, 0)->members;
+ VectorInt* mems1 = getArraySet(&This->domains, 0)->members;
uint size1 = getSizeVectorInt(mems1);
- VectorInt* mems2 = getArraySet(&predicate->domains, 1)->members;
+ VectorInt* mems2 = getArraySet(&This->domains, 1)->members;
uint size2 = getSizeVectorInt(mems2);
//FIXME:This isn't efficient, if we a hashset datastructure for Set, we
// can reduce it to O(n), but for now .... HG
}
}
}
-
}
-void deletePredicate(Predicate* predicate){
- switch(GETPREDICATETYPE(predicate)) {
+void deletePredicate(Predicate* This){
+ switch(GETPREDICATETYPE(This)) {
case OPERATORPRED: {
- PredicateOperator * operpred=(PredicateOperator *) predicate;
+ PredicateOperator * operpred=(PredicateOperator *) This;
deleteInlineArraySet(&operpred->domains);
break;
}
}
}
//need to handle freeing array...
- ourfree(predicate);
+ ourfree(This);
}
UndefinedBehavior undefinedbehavior;
};
-
Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain);
Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior);
// size and result will be modified by this function!
-void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result);
-void deletePredicate(Predicate* predicate);
+void getEqualitySetIntersection(PredicateOperator* This, uint* size, uint64_t* result);
+void deletePredicate(Predicate* This);
#endif
#include <stddef.h>
Set * allocSet(VarType t, uint64_t* elements, uint num) {
- Set * tmp=(Set *)ourmalloc(sizeof(Set));
- tmp->type=t;
- tmp->isRange=false;
- tmp->low=0;
- tmp->high=0;
- tmp->members=allocVectorArrayInt(num, elements);
- return tmp;
+ Set * This=(Set *)ourmalloc(sizeof(Set));
+ This->type=t;
+ This->isRange=false;
+ This->low=0;
+ This->high=0;
+ This->members=allocVectorArrayInt(num, elements);
+ return This;
}
Set * allocSetRange(VarType t, uint64_t lowrange, uint64_t highrange) {
- Set * tmp=(Set *)ourmalloc(sizeof(Set));
- tmp->type=t;
- tmp->isRange=true;
- tmp->low=lowrange;
- tmp->high=highrange;
- tmp->members=NULL;
- return tmp;
+ Set * This=(Set *)ourmalloc(sizeof(Set));
+ This->type=t;
+ This->isRange=true;
+ This->low=lowrange;
+ This->high=highrange;
+ This->members=NULL;
+ return This;
}
-bool existsInSet(Set* set, uint64_t element){
- if(set->isRange){
- return element >= set->low && element <= set->high;
+bool existsInSet(Set* This, uint64_t element){
+ if(This->isRange){
+ return element >= This->low && element <= This->high;
}else {
- uint size = getSizeVectorInt(set->members);
+ uint size = getSizeVectorInt(This->members);
for(uint i=0; i< size; i++){
- if(element == getVectorInt(set->members, i))
+ if(element == getVectorInt(This->members, i))
return true;
}
return false;
}
}
-uint getSetSize(Set* set){
- if(set->isRange){
- return set->high- set->low+1;
+uint getSetSize(Set* This){
+ if(This->isRange){
+ return This->high- This->low+1;
}else{
- return getSizeVectorInt(set->members);
+ return getSizeVectorInt(This->members);
}
}
-void deleteSet(Set * set) {
- if (!set->isRange)
- deleteVectorInt(set->members);
- ourfree(set);
+void deleteSet(Set * This) {
+ if (!This->isRange)
+ deleteVectorInt(This->members);
+ ourfree(This);
}
VectorInt * members;
};
-
-Set *allocSet(VarType t, uint64_t * elements, uint num);
+Set * allocSet(VarType t, uint64_t * elements, uint num);
Set * allocSetRange(VarType t, uint64_t lowrange, uint64_t highrange);
-bool existsInSet(Set* set, uint64_t element);
-uint getSetSize(Set* set);
-void deleteSet(Set *set);
+bool existsInSet(Set * This, uint64_t element);
+uint getSetSize(Set * This);
+void deleteSet(Set * This);
#endif/* SET_H */
#include "set.h"
#include "mutableset.h"
-
Table * allocTable(Set **domains, uint numDomain, Set * range){
- Table* table = (Table*) ourmalloc(sizeof(Table));
- allocInlineArrayInitSet(&table->domains, domains, numDomain);
- allocInlineDefVectorTableEntry(&table->entries);
- table->range =range;
- return table;
+ Table* This = (Table*) ourmalloc(sizeof(Table));
+ initArrayInitSet(&This->domains, domains, numDomain);
+ initDefVectorTableEntry(&This->entries);
+ This->range =range;
+ return This;
}
-void addNewTableEntry(Table* table, uint64_t* inputs, uint inputSize, uint64_t result){
- ASSERT(getSizeArraySet( &table->domains) == inputSize);
- pushVectorTableEntry(&table->entries, allocTableEntry(inputs, inputSize, result));
+void addNewTableEntry(Table* This, uint64_t* inputs, uint inputSize, uint64_t result){
+ ASSERT(getSizeArraySet( &This->domains) == inputSize);
+ pushVectorTableEntry(&This->entries, allocTableEntry(inputs, inputSize, result));
}
-void deleteTable(Table* table){
- deleteInlineArraySet(&table->domains);
- uint size = getSizeVectorTableEntry(&table->entries);
+void deleteTable(Table* This){
+ deleteInlineArraySet(&This->domains);
+ uint size = getSizeVectorTableEntry(&This->entries);
for(uint i=0; i<size; i++){
- deleteTableEntry(getVectorTableEntry(&table->entries, i));
+ deleteTableEntry(getVectorTableEntry(&This->entries, i));
}
- deleteVectorArrayTableEntry(&table->entries);
- ourfree(table);
+ deleteVectorArrayTableEntry(&This->entries);
+ ourfree(This);
}
VectorTableEntry entries;
};
-Table * allocTable(Set **domains, uint numDomain, Set * range);
-void addNewTableEntry(Table* table, uint64_t* inputs, uint inputSize, uint64_t result);
-void deleteTable(Table* table);
+Table * allocTable(Set ** domains, uint numDomain, Set * range);
+void addNewTableEntry(Table * This, uint64_t * inputs, uint inputSize, uint64_t result);
+void deleteTable(Table * This);
#endif
CNFExpr *This=ourmalloc(sizeof(CNFExpr));
This->litSize=0;
This->isTrue=isTrue;
- allocInlineVectorLitVector(&This->clauses, 2);
+ initVectorLitVector(&This->clauses, 2);
initLitVector(&This->singletons);
return This;
}
CNFExpr *This=ourmalloc(sizeof(CNFExpr));
This->litSize=1;
This->isTrue=false;
- allocInlineVectorLitVector(&This->clauses, 2);
+ initVectorLitVector(&This->clauses, 2);
initLitVector(&This->singletons);
addLiteralLitVector(&This->singletons, l);
return This;
cnf->size=0;
cnf->maxsize=(uint)(((double)cnf->capacity)*LOAD_FACTOR);
cnf->enableMatching=true;
- allocInlineDefVectorEdge(& cnf->constraints);
- allocInlineDefVectorEdge(& cnf->args);
+ initDefVectorEdge(& cnf->constraints);
+ initDefVectorEdge(& cnf->args);
cnf->solver=allocIncrementalSolver();
return cnf;
}
return result;
}
-void addConstraint(CNF *cnf, Edge constraint) {
+void addConstraintCNF(CNF *cnf, Edge constraint) {
pushVectorEdge(&cnf->constraints, constraint);
}
Edge constraintNewVar(CNF *cnf);
void countPass(CNF *cnf);
void countConstraint(CNF *cnf, VectorEdge * stack, Edge e);
-void addConstraint(CNF *cnf, Edge constraint);
+void addConstraintCNF(CNF *cnf, Edge constraint);
int solveCNF(CNF *cnf);
bool getValueCNF(CNF *cnf, Edge var);
void printCNF(Edge e);
return getSolution(This);
}
-
void startSolve(IncrementalSolver *This) {
addClauseLiteral(This, IS_RUNSOLVER);
flushBufferSolver(This);
waitpid(This->solver_pid, &status, 0);
}
}
+
+//DEBUGGING CODE STARTS
bool first=true;
+//DEBUGGING CODE ENDS
void flushBufferSolver(IncrementalSolver * This) {
ssize_t bytestowrite=sizeof(int)*This->offset;
ssize_t byteswritten=0;
+ //DEBUGGING CODE STARTS
for(uint i=0;i<This->offset;i++) {
if (first)
printf("(");
printf("%d", This->buffer[i]);
}
}
+ //DEBUGGING CODE ENDS
do {
ssize_t n=write(This->to_solver_fd, &((char *)This->buffer)[byteswritten], bytestowrite);
if (n == -1) {
Edge c= encodeConstraintSATEncoder(This, constraint);
printCNF(c);
printf("\n\n");
- addConstraint(This->cnf, c);
+ addConstraintCNF(This->cnf, c);
}
}
return E_BOGUS;
}
-Edge getPairConstraint(SATEncoder *This, HashTableBoolConst * table, OrderPair * pair) {
+Edge getPairConstraint(SATEncoder *This, HashTableOrderPair * table, OrderPair * pair) {
bool negate = false;
OrderPair flipped;
if (pair->first > pair->second) {
negate=true;
flipped.first=pair->second;
flipped.second=pair->first;
- pair = &flipped; //FIXME: accessing a local variable from outside of the function?
+ pair = &flipped;
}
Edge constraint;
- if (!containsBoolConst(table, pair)) {
+ if (!containsOrderPair(table, pair)) {
constraint = getNewVarSATEncoder(This);
OrderPair * paircopy = allocOrderPair(pair->first, pair->second, constraint);
- putBoolConst(table, paircopy, paircopy);
+ putOrderPair(table, paircopy, paircopy);
} else
- constraint = getBoolConst(table, pair)->constraint;
+ constraint = getOrderPair(table, pair)->constraint;
if (negate)
return constraintNegate(constraint);
else
Edge encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * boolOrder){
ASSERT(boolOrder->order->type == TOTAL);
- if(boolOrder->order->boolsToConstraints == NULL){
+ if(boolOrder->order->orderPairTable == NULL){
initializeOrderHashTable(boolOrder->order);
createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order);
}
- HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
+ HashTableOrderPair* orderPairTable = boolOrder->order->orderPairTable;
OrderPair pair={boolOrder->first, boolOrder->second, E_NULL};
- Edge constraint = getPairConstraint(This, boolToConsts, & pair);
+ Edge constraint = getPairConstraint(This, orderPairTable, & pair);
return constraint;
}
void createAllTotalOrderConstraintsSATEncoder(SATEncoder* This, Order* order){
ASSERT(order->type == TOTAL);
VectorInt* mems = order->set->members;
- HashTableBoolConst* table = order->boolsToConstraints;
+ HashTableOrderPair* table = order->orderPairTable;
uint size = getSizeVectorInt(mems);
uint csize =0;
for(uint i=0; i<size; i++){
OrderPair pairIK = {valueI, valueK};
Edge constIK = getPairConstraint(This, table, & pairIK);
Edge constJK = getPairConstraint(This, table, & pairJK);
- addConstraint(This->cnf, generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK));
+ addConstraintCNF(This->cnf, generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK));
}
}
}
}
-Edge getOrderConstraint(HashTableBoolConst *table, OrderPair *pair){
+Edge getOrderConstraint(HashTableOrderPair *table, OrderPair *pair){
ASSERT(pair->first!= pair->second);
- Edge constraint = getBoolConst(table, pair)->constraint;
+ Edge constraint = getOrderPair(table, pair)->constraint;
if(pair->first > pair->second)
return constraint;
else
// when client specify sparse constraints for the total order!)
ASSERT(constraint->order->type == PARTIAL);
/*
- HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
- if( containsBoolConst(boolToConsts, boolOrder) ){
- return getBoolConst(boolToConsts, boolOrder);
+ HashTableOrderPair* boolToConsts = boolOrder->order->boolsToConstraints;
+ if( containsOrderPair(boolToConsts, boolOrder) ){
+ return getOrderPair(boolToConsts, boolOrder);
} else {
Edge constraint = getNewVarSATEncoder(This);
- putBoolConst(boolToConsts,boolOrder, constraint);
+ putOrderPair(boolToConsts,boolOrder, constraint);
VectorBoolean* orderConstrs = &boolOrder->order->constraints;
uint size= getSizeVectorBoolean(orderConstrs);
for(uint i=0; i<size; i++){
if(isinUseElement(elemEnc1, i)){
for( uint j=0; j<elemEnc2->encArraySize; j++){
if(isinUseElement(elemEnc2, j)){
- bool isInRange = false;
uint64_t result= applyFunctionOperator((FunctionOperator*)This->function,elemEnc1->encodingArray[i],
- elemEnc2->encodingArray[j], &isInRange);
+ elemEnc2->encodingArray[j]);
+ bool isInRange = isInRangeFunction((FunctionOperator*)This->function, result);
+
//FIXME: instead of getElementValueConstraint, it might be useful to have another function
// that doesn't iterate over encodingArray and treats more efficient ...
Edge valConstrIn1 = getElementValueConstraint(encoder, elemEnc1->element, elemEnc1->encodingArray[i]);
Edge encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint);
Edge encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
void createAllTotalOrderConstraintsSATEncoder(SATEncoder* This, Order* order);
-Edge getOrderConstraint(HashTableBoolConst *table, OrderPair *pair);
+Edge getOrderConstraint(HashTableOrderPair *table, OrderPair *pair);
Edge generateTransOrderConstraintSATEncoder(SATEncoder *This, Edge constIJ, Edge constJK, Edge constIK);
Edge encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
Edge encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
static inline void deleteInlineArray ## name(Array ## name *This) { \
ourfree(This->array); \
} \
- static inline void allocInlineArray ## name(Array ## name * This, uint size) { \
+ static inline void initArray ## name(Array ## name * This, uint size) { \
This->size = size; \
This->array = (type *) ourcalloc(1, sizeof(type) * size); \
} \
- static inline void allocInlineArrayInit ## name(Array ## name * This, type *array, uint size) { \
- allocInlineArray ##name(This, size); \
+ static inline void initArrayInit ## name(Array ## name * This, type *array, uint size) { \
+ initArray ##name(This, size); \
memcpy(This->array, array, size * sizeof(type)); \
}
return key1->first== key2->first && key1->second == key2->second;
}
-HashTableImpl(BoolConst, OrderPair *, OrderPair *, order_pair_hash_Function, order_pair_equals, ourfree);
+HashTableImpl(OrderPair, OrderPair *, OrderPair *, order_pair_hash_Function, order_pair_equals, ourfree);
VectorDef(Int, uint64_t);
HashTableDef(Void, void *, void *);
-HashTableDef(BoolConst, OrderPair *, OrderPair *);
+HashTableDef(OrderPair, OrderPair *, OrderPair *);
HashSetDef(Void, void *);
void clearVector ## name(Vector ## name *vector); \
void deleteVectorArray ## name(Vector ## name *vector); \
type * exposeArray ## name(Vector ## name * vector); \
- void allocInlineVector ## name(Vector ## name * vector, uint capacity); \
- void allocInlineDefVector ## name(Vector ## name * vector); \
- void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array);
+ void initVector ## name(Vector ## name * vector, uint capacity); \
+ void initDefVector ## name(Vector ## name * vector); \
+ void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array);
#define VectorImpl(name, type, defcap) \
Vector ## name * allocDefVector ## name() { \
void deleteVectorArray ## name(Vector ## name *vector) { \
ourfree(vector->array); \
} \
- void allocInlineVector ## name(Vector ## name * vector, uint capacity) { \
+ void initVector ## name(Vector ## name * vector, uint capacity) { \
vector->size = 0; \
vector->capacity = capacity; \
vector->array = (type *) ourmalloc(sizeof(type) * capacity); \
} \
- void allocInlineDefVector ## name(Vector ## name * vector) { \
- allocInlineVector ## name(vector, defcap); \
+ void initDefVector ## name(Vector ## name * vector) { \
+ initVector ## name(vector, defcap); \
} \
- void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \
- allocInlineVector ##name(vector, capacity); \
+ void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \
+ initVector ##name(vector, capacity); \
vector->size=capacity; \
memcpy(vector->array, array, capacity * sizeof(type)); \
}
void deleteElementEncoding(ElementEncoding *This);
void allocEncodingArrayElement(ElementEncoding *This, uint size);
void allocInUseArrayElement(ElementEncoding *This, uint size);
+void generateBinaryIndexEncodingVars(SATEncoder* encode, ElementEncoding* This);
+void generateElementEncodingVariables(SATEncoder* encoder, ElementEncoding* This);
+
static inline bool isinUseElement(ElementEncoding *This, uint offset) {
return (This->inUseArray[(offset>>6)] >> (offset & 63)) &0x1;
}
This->inUseArray[(offset>>6)] |= 1 << (offset & 63);
}
-void generateBinaryIndexEncodingVars(SATEncoder* encode, ElementEncoding* This);
-void generateElementEncodingVariables(SATEncoder* encoder, ElementEncoding* This);
-
#endif
#include "order.h"
#include <strings.h>
-
+//BRIAN: MAKE FOLLOW TREE STRUCTURE
void naiveEncodingDecision(CSolver* csolver){
uint size = getSizeVectorElement(csolver->allElements);
for(uint i=0; i<size; i++){
setInUseElement(This, i);
}
}
-
-
#include "classlist.h"
#include "structs.h"
-
-
/**
- *For now, This function just simply goes through elements/functions and
- *assigns a predefined Encoding to each of them
+ * The NaiveEncoder assigns a predefined Encoding to each Element and Function.
* @param csolver
* @param encoder
*/
#include "orderencoding.h"
-void allocOrderEncoding(OrderEncoding * This, Order *order) {
+void initOrderEncoding(OrderEncoding * This, Order *order) {
This->type=ORDER_UNASSIGNED;
This->order=order;
}
Order *order;
};
-void allocOrderEncoding(OrderEncoding * This, Order *order);
+void initOrderEncoding(OrderEncoding * This, Order *order);
void deleteOrderEncoding(OrderEncoding *This);
#endif
Predicate *equals=createPredicateOperator(solver, EQUALS, domain, 2);
Element * inputs[]={e1, e2};
Boolean * b=applyPredicate(solver, equals, inputs, 2);
- addBoolean(solver, b);
+ addConstraint(solver, b);
Order * o=createOrder(solver, TOTAL, s);
Boolean * oc=orderConstraint(solver, o, 1, 2);
- addBoolean(solver, oc);
+ addConstraint(solver, oc);
uint64_t set2[] = {2, 3};
Set* rangef1 = createSet(solver, 1, set2, 2);
Predicate* equal2 = createPredicateOperator(solver, EQUALS, domain2, 2);
Element* inputs2 [] = {e4, e3};
Boolean* pred = applyPredicate(solver, equal2, inputs2, 2);
- addBoolean(solver, pred);
+ addConstraint(solver, pred);
startEncoding(solver);
deleteSolver(solver);
Edge v2=constraintNewVar(cnf);
Edge v3=constraintNewVar(cnf);
Edge v4=constraintNewVar(cnf);
- Edge v5=constraintNewVar(cnf);
Edge nv1=constraintNegate(v1);
Edge nv2=constraintNegate(v2);
Edge c2=constraintAND2(cnf, v3, nv4);
Edge c3=constraintAND2(cnf, nv1, v2);
Edge c4=constraintAND2(cnf, nv3, v4);
- Edge cor=constraintOR2(cnf, constraintAND2(cnf, c1, c2), v5);
+ Edge cor=constraintOR2(cnf, constraintAND2(cnf, c1, c2), constraintAND2(cnf, c3, c4));
printCNF(cor);
printf("\n");
- addConstraint(cnf, cor);
+ addConstraintCNF(cnf, cor);
int value=solveCNF(cnf);
if (value==1) {
bool v1v=getValueCNF(cnf, v1);
#include "satencoder.h"
CSolver * allocCSolver() {
- CSolver * tmp=(CSolver *) ourmalloc(sizeof(CSolver));
- tmp->constraints=allocDefVectorBoolean();
- tmp->allBooleans=allocDefVectorBoolean();
- tmp->allSets=allocDefVectorSet();
- tmp->allElements=allocDefVectorElement();
- tmp->allPredicates = allocDefVectorPredicate();
- tmp->allTables = allocDefVectorTable();
- tmp->allOrders = allocDefVectorOrder();
- tmp->allFunctions = allocDefVectorFunction();
- return tmp;
+ CSolver * This=(CSolver *) ourmalloc(sizeof(CSolver));
+ This->constraints=allocDefVectorBoolean();
+ This->allBooleans=allocDefVectorBoolean();
+ This->allSets=allocDefVectorSet();
+ This->allElements=allocDefVectorElement();
+ This->allPredicates = allocDefVectorPredicate();
+ This->allTables = allocDefVectorTable();
+ This->allOrders = allocDefVectorOrder();
+ This->allFunctions = allocDefVectorFunction();
+ return This;
}
/** This function tears down the solver and the entire AST */
return set;
}
-void addItem(CSolver *solver, MutableSet * set, uint64_t element) {
+void addItem(CSolver *This, MutableSet * set, uint64_t element) {
addElementMSet(set, element);
}
-uint64_t createUniqueItem(CSolver *solver, MutableSet * set) {
+uint64_t createUniqueItem(CSolver *This, MutableSet * set) {
uint64_t element=set->low++;
addElementMSet(set, element);
return element;
return element;
}
-Boolean * getBooleanVar(CSolver *solver, VarType type) {
- Boolean* boolean= allocBoolean(type);
- pushVectorBoolean(solver->allBooleans, boolean);
+Boolean * getBooleanVar(CSolver *This, VarType type) {
+ Boolean* boolean= allocBooleanVar(type);
+ pushVectorBoolean(This->allBooleans, boolean);
return boolean;
}
-Function * createFunctionOperator(CSolver *solver, ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior) {
+Function * createFunctionOperator(CSolver *This, ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior) {
Function* function = allocFunctionOperator(op, domain, numDomain, range, overflowbehavior);
- pushVectorFunction(solver->allFunctions, function);
+ pushVectorFunction(This->allFunctions, function);
return function;
}
-Predicate * createPredicateOperator(CSolver *solver, CompOp op, Set ** domain, uint numDomain) {
+Predicate * createPredicateOperator(CSolver *This, CompOp op, Set ** domain, uint numDomain) {
Predicate* predicate= allocPredicateOperator(op, domain,numDomain);
- pushVectorPredicate(solver->allPredicates, predicate);
+ pushVectorPredicate(This->allPredicates, predicate);
return predicate;
}
-Table * createTable(CSolver *solver, Set **domains, uint numDomain, Set * range) {
+Table * createTable(CSolver *This, Set **domains, uint numDomain, Set * range) {
Table* table= allocTable(domains,numDomain,range);
- pushVectorTable(solver->allTables, table);
+ pushVectorTable(This->allTables, table);
return table;
}
-void addTableEntry(CSolver *solver, Table* table, uint64_t* inputs, uint inputSize, uint64_t result) {
+void addTableEntry(CSolver *This, Table* table, uint64_t* inputs, uint inputSize, uint64_t result) {
addNewTableEntry(table,inputs, inputSize,result);
}
-Function * completeTable(CSolver *solver, Table * table) {
+Function * completeTable(CSolver *This, Table * table) {
Function* function = allocFunctionTable(table);
- pushVectorFunction(solver->allFunctions,function);
+ pushVectorFunction(This->allFunctions,function);
return function;
}
-Element * applyFunction(CSolver *solver, Function * function, Element ** array, uint numArrays, Boolean * overflowstatus) {
+Element * applyFunction(CSolver *This, Function * function, Element ** array, uint numArrays, Boolean * overflowstatus) {
Element* element= allocElementFunction(function,array,numArrays,overflowstatus);
- pushVectorElement(solver->allElements, element);
+ pushVectorElement(This->allElements, element);
return element;
}
-Boolean * applyPredicate(CSolver *solver, Predicate * predicate, Element ** inputs, uint numInputs) {
+Boolean * applyPredicate(CSolver *This, Predicate * predicate, Element ** inputs, uint numInputs) {
Boolean* boolean= allocBooleanPredicate(predicate, inputs, numInputs);
- pushVectorBoolean(solver->allBooleans, boolean);
+ pushVectorBoolean(This->allBooleans, boolean);
return boolean;
}
-Boolean * applyLogicalOperation(CSolver *solver, LogicOp op, Boolean ** array, uint asize) {
- return allocBooleanLogicArray(solver, op, array, asize);
+Boolean * applyLogicalOperation(CSolver *This, LogicOp op, Boolean ** array, uint asize) {
+ return allocBooleanLogicArray(This, op, array, asize);
}
-void addBoolean(CSolver *This, Boolean * constraint) {
+void addConstraint(CSolver *This, Boolean * constraint) {
pushVectorBoolean(This->constraints, constraint);
}
-Order * createOrder(CSolver *solver, OrderType type, Set * set) {
+Order * createOrder(CSolver *This, OrderType type, Set * set) {
Order* order = allocOrder(type, set);
- pushVectorOrder(solver->allOrders, order);
+ pushVectorOrder(This->allOrders, order);
return order;
}
-Boolean * orderConstraint(CSolver *solver, Order * order, uint64_t first, uint64_t second) {
+Boolean * orderConstraint(CSolver *This, Order * order, uint64_t first, uint64_t second) {
Boolean* constraint = allocBooleanOrder(order, first, second);
- pushVectorBoolean(solver->allBooleans,constraint);
+ pushVectorBoolean(This->allBooleans,constraint);
return constraint;
}
-void startEncoding(CSolver* solver){
- naiveEncodingDecision(solver);
+void startEncoding(CSolver* This){
+ naiveEncodingDecision(This);
SATEncoder* satEncoder = allocSATEncoder();
- encodeAllSATEncoder(solver, satEncoder);
+ encodeAllSATEncoder(This, satEncoder);
int result= solveCNF(satEncoder->cnf);
model_print("sat_solver's result:%d\tsolutionSize=%d\n", result, satEncoder->cnf->solver->solutionsize);
for(uint i=1; i<=satEncoder->cnf->solver->solutionsize; i++){
/** This function adds a boolean constraint to the set of constraints
to be satisfied */
-void addBoolean(CSolver *, Boolean * constraint);
+void addConstraint(CSolver *, Boolean * constraint);
/** This function instantiates an order of type type over the set set. */
Order * createOrder(CSolver *, OrderType type, Set * set);