X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fcsolver.c;h=67e25899bd6b8b059c3e7d3b69897e060baff6c9;hb=25a6a7672de392c9708c227b80123df8a1528b55;hp=5ddaaeda13e13e79db6bb291f2705418217241c4;hpb=fdf0e45c309033c29b504a69dfe1e9ab0e2e2ff7;p=satune.git diff --git a/src/csolver.c b/src/csolver.c index 5ddaaed..67e2589 100644 --- a/src/csolver.c +++ b/src/csolver.c @@ -4,121 +4,222 @@ #include "element.h" #include "boolean.h" #include "predicate.h" +#include "order.h" +#include "table.h" +#include "function.h" +#include "satencoder.h" +#include "sattranslator.h" CSolver * allocCSolver() { - CSolver * tmp=(CSolver *) ourmalloc(sizeof(CSolver)); - tmp->constraints=allocDefVectorBoolean(); - tmp->sets=allocDefVectorSet(); - tmp->elements=allocDefVectorElement(); - 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(); + This->satEncoder = allocSATEncoder(); + return This; } /** This function tears down the solver and the entire AST */ -void deleteSolver(CSolver *this) { - deleteVectorBoolean(this->constraints); - uint size=getSizeVectorSet(this->sets); +void deleteSolver(CSolver *This) { + deleteVectorBoolean(This->constraints); + + uint size=getSizeVectorBoolean(This->allBooleans); + for(uint i=0;iallBooleans, i)); + } + deleteVectorBoolean(This->allBooleans); + + size=getSizeVectorSet(This->allSets); for(uint i=0;isets, i)); + deleteSet(getVectorSet(This->allSets, i)); } + deleteVectorSet(This->allSets); - deleteVectorSet(this->sets); + size=getSizeVectorElement(This->allElements); + for(uint i=0;iallElements, i)); + } + deleteVectorElement(This->allElements); - size=getSizeVectorElement(this->elements); + size=getSizeVectorTable(This->allTables); for(uint i=0;ielements, i)); + deleteTable(getVectorTable(This->allTables, i)); } + deleteVectorTable(This->allTables); - deleteVectorElement(this->elements); - ourfree(this); + size=getSizeVectorPredicate(This->allPredicates); + for(uint i=0;iallPredicates, i)); + } + deleteVectorPredicate(This->allPredicates); + + size=getSizeVectorOrder(This->allOrders); + for(uint i=0;iallOrders, i)); + } + deleteVectorOrder(This->allOrders); + + size=getSizeVectorFunction(This->allFunctions); + for(uint i=0;iallFunctions, i)); + } + deleteVectorFunction(This->allFunctions); + deleteSATEncoder(This->satEncoder); + ourfree(This); } -Set * createSet(CSolver * this, VarType type, uint64_t * elements, uint numelements) { +Set * createSet(CSolver * This, VarType type, uint64_t * elements, uint numelements) { Set * set=allocSet(type, elements, numelements); - pushVectorSet(this->sets, set); + pushVectorSet(This->allSets, set); return set; } -Set * createRangeSet(CSolver * this, VarType type, uint64_t lowrange, uint64_t highrange) { +Set * createRangeSet(CSolver * This, VarType type, uint64_t lowrange, uint64_t highrange) { Set * set=allocSetRange(type, lowrange, highrange); - pushVectorSet(this->sets, set); + pushVectorSet(This->allSets, set); return set; } -MutableSet * createMutableSet(CSolver * this, VarType type) { +MutableSet * createMutableSet(CSolver * This, VarType type) { MutableSet * set=allocMutableSet(type); - pushVectorSet(this->sets, set); + pushVectorSet(This->allSets, set); 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; } -Element * getElementVar(CSolver *this, Set * set) { - Element * element=allocElement(set); - pushVectorElement(this->elements, element); +Element * getElementVar(CSolver *This, Set * set) { + Element * element=allocElementSet(set); + pushVectorElement(This->allElements, element); + return element; +} + +Element * getElementConst(CSolver *This, VarType type, uint64_t value) { + Element * element=allocElementConst(value, type); + pushVectorElement(This->allElements, element); return element; } -Boolean * getBooleanVar(CSolver *solver, VarType type) { - Boolean* boolean= allocBoolean(type); - pushVectorBoolean(solver->constraints, boolean); - return boolean; +Boolean * getBooleanVar(CSolver *This, VarType type) { + Boolean* boolean= allocBooleanVar(type); + pushVectorBoolean(This->allBooleans, boolean); + return boolean; +} + +Function * createFunctionOperator(CSolver *This, ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior) { + Function* function = allocFunctionOperator(op, domain, numDomain, range, overflowbehavior); + pushVectorFunction(This->allFunctions, function); + return function; } -Function * createFunctionOperator(CSolver *solver, enum ArithOp op, Set ** domain, uint numDomain, Set * range, - enum OverFlowBehavior overflowbehavior, Boolean * overflowstatus) { - return NULL; +Predicate * createPredicateOperator(CSolver *This, CompOp op, Set ** domain, uint numDomain) { + Predicate* predicate= allocPredicateOperator(op, domain,numDomain); + pushVectorPredicate(This->allPredicates, predicate); + return predicate; } -//Function * createFunctionOperatorPure(CSolver *solver, enum ArithOp op) { -// return NULL; -//} +Table * createTable(CSolver *This, Set **domains, uint numDomain, Set * range) { + Table* table= allocTable(domains,numDomain,range); + pushVectorTable(This->allTables, table); + return table; +} -Predicate * createPredicateOperator(CSolver *solver, enum CompOp op, Set ** domain, uint numDomain) { - return allocPredicate(op, domain,numDomain); +void addTableEntry(CSolver *This, Table* table, uint64_t* inputs, uint inputSize, uint64_t result) { + addNewTableEntry(table,inputs, inputSize,result); } -Table * createTable(CSolver *solver, Set **domains, uint numDomain, Set * range) { - return NULL; +Function * completeTable(CSolver *This, Table * table) { + Function* function = allocFunctionTable(table); + pushVectorFunction(This->allFunctions,function); + return function; } -void addTableEntry(CSolver *solver, uint64_t* inputs, uint inputSize, uint64_t result) { +Element * applyFunction(CSolver *This, Function * function, Element ** array, uint numArrays, Boolean * overflowstatus) { + Element* element= allocElementFunction(function,array,numArrays,overflowstatus); + pushVectorElement(This->allElements, element); + return element; } -Function * completeTable(CSolver *solver, Table * table) { - return NULL; +Boolean * applyPredicate(CSolver *This, Predicate * predicate, Element ** inputs, uint numInputs) { + Boolean* boolean= allocBooleanPredicate(predicate, inputs, numInputs); + pushVectorBoolean(This->allBooleans, boolean); + return boolean; } -Element * applyFunction(CSolver *solver, Function * function, Element ** array) { - return NULL; +Boolean * applyLogicalOperation(CSolver *This, LogicOp op, Boolean ** array, uint asize) { + return allocBooleanLogicArray(This, op, array, asize); } -Boolean * applyPredicate(CSolver *solver, Predicate * predicate, Element ** inputs) { - return NULL; +void addConstraint(CSolver *This, Boolean * constraint) { + pushVectorBoolean(This->constraints, constraint); } -Boolean * applyLogicalOperation(CSolver *solver, enum LogicOp op, Boolean ** array) { - return NULL; +Order * createOrder(CSolver *This, OrderType type, Set * set) { + Order* order = allocOrder(type, set); + pushVectorOrder(This->allOrders, order); + return order; } -void addBoolean(CSolver *this, Boolean * constraint) { - pushVectorBoolean(this->constraints, constraint); +Boolean * orderConstraint(CSolver *This, Order * order, uint64_t first, uint64_t second) { + Boolean* constraint = allocBooleanOrder(order, first, second); + pushVectorBoolean(This->allBooleans,constraint); + return constraint; } -Order * createOrder(CSolver *solver, enum OrderType type, Set * set) { - return allocOrder(type, set); +int startEncoding(CSolver* This){ + naiveEncodingDecision(This); + SATEncoder* satEncoder = This->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++){ + model_print("%d, ", satEncoder->cnf->solver->solution[i]); + } + model_print("\n"); + return result; } -Boolean * orderConstraint(CSolver *solver, Order * order, uint64_t first, uint64_t second) { - Boolean* constraint = allocBooleanOrder(order, first, second); - pushVectorBoolean(solver->constraints,constraint); - return constraint; +uint64_t getElementValue(CSolver* This, Element* element){ + switch(GETELEMENTTYPE(element)){ + case ELEMSET: + return getElementValueSATTranslator(This, element); + default: + ASSERT(0); + } + exit(-1); } + +bool getBooleanValue( CSolver* This , Boolean* boolean){ + switch(GETBOOLEANTYPE(boolean)){ + case BOOLEANVAR: + return getBooleanVariableValueSATTranslator(This, boolean); + default: + ASSERT(0); + } + exit(-1); +} + +HappenedBefore getOrderConstraintValue(CSolver* This, Boolean* orderConstr){ + switch(GETBOOLEANTYPE(orderConstr)){ + case ORDERCONST: + return getOrderConstraintValueSATTranslator(This, (BooleanOrder*)orderConstr); + default: + ASSERT(0); + } + exit(-1); +} +