Boolean *bvar = solver->getBooleanVar(type);
map->put(this, bvar);
return bvar;
-
}
Boolean *BooleanOrder::clone(CSolver *solver, CloneMap *map) {
public:
Boolean(ASTNodeType _type);
virtual ~Boolean() {}
- virtual Boolean *clone(CSolver *solver, CloneMap *map);
+ virtual Boolean *clone(CSolver *solver, CloneMap *map) { ASSERT(0); return NULL; }
Polarity polarity;
BooleanValue boolVal;
Vector<Boolean *> parents;
virtual ~Element() {}
Vector<ASTNode *> parents;
ElementEncoding encoding;
- virtual Element *clone(CSolver *solver, CloneMap *map);
+ virtual Element *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;};
MEMALLOC;
};
Function(FunctionType _type) : type(_type) {}
FunctionType type;
virtual ~Function() {}
- virtual Function *clone(CSolver *solver, CloneMap *map);
+ virtual Function *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;}
MEMALLOC;
};
#include "mymemory.h"
#include "ops.h"
#include "structs.h"
+#include "common.h"
#define GETPREDICATETYPE(o) (((Predicate *)(o))->type)
public:
Predicate(PredicateType _type) : type(_type) {}
virtual ~Predicate() {}
- virtual Predicate *clone(CSolver *solver, CloneMap *map);
+ virtual Predicate *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;}
PredicateType type;
MEMALLOC;
};
HSIteratorOrderEdge *iterator = node->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
- if (!edge->mustPos)
+ if (!edge->mustPos) {
+ delete iterator;
return false;
+ }
}
delete iterator;
iterator = node->outEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
- if (!edge->mustPos)
+ if (!edge->mustPos) {
+ delete iterator;
return false;
+ }
}
delete iterator;
return true;
BooleanOrder *orderconstraint = order->constraints.get(i);
OrderNode *from = graph->getOrderNodeFromOrderGraph(orderconstraint->first);
OrderNode *to = graph->getOrderNodeFromOrderGraph(orderconstraint->second);
- model_print("from->sccNum:%u\tto->sccNum:%u\n", from->sccNum, to->sccNum);
if (from->sccNum != to->sccNum) {
OrderEdge *edge = graph->getOrderEdgeFromOrderGraph(from, to);
if (edge->polPos) {
void addConstraintCNF(CNF *cnf, Edge constraint) {
pushVectorEdge(&cnf->constraints, constraint);
+#ifdef CONFIG_DEBUG
model_print("****ADDING NEW Constraint*****\n");
printCNF(constraint);
model_print("\n******************************\n");
+#endif
}
Edge constraintNewVar(CNF *cnf) {
void flushBufferSolver(IncrementalSolver *This) {
ssize_t bytestowrite = sizeof(int) * This->offset;
ssize_t byteswritten = 0;
- //DEBUGGING CODE STARTS
+#ifdef CONFIG_DEBUG
for (uint i = 0; i < This->offset; i++) {
if (first)
printf("(");
printf("%d", This->buffer[i]);
}
}
- //DEBUGGING CODE ENDS
+#endif
do {
ssize_t n = write(This->to_solver_fd, &((char *)This->buffer)[byteswritten], bytestowrite);
if (n == -1) {
HSIteratorBoolean *iterator = csolver->getConstraints();
while (iterator->hasNext()) {
Boolean *constraint = iterator->next();
+#ifdef CONFIG_DEBUG
model_print("Encoding All ...\n\n");
+#endif
Edge c = encodeConstraintSATEncoder(constraint);
+#ifdef CONFIG_DEBUG
model_print("Returned Constraint in EncodingAll:\n");
+#endif
ASSERT( !equalsEdge(c, E_BOGUS));
addConstraintCNF(cnf, c);
}
Edge getElementValueBinaryIndexConstraint(Element *element, uint64_t value);
Edge getElementValueBinaryValueConstraint(Element *element, uint64_t value);
Edge getElementValueConstraint(Element *element, uint64_t value);
- void allocElementConstraintVariables(ElementEncoding *ee, uint numVars);
void generateOneHotEncodingVars(ElementEncoding *encoding);
void generateUnaryEncodingVars(ElementEncoding *encoding);
void generateBinaryIndexEncodingVars(ElementEncoding *encoding);
CSolver *solver;
};
+void allocElementConstraintVariables(ElementEncoding *ee, uint numVars);
Edge getOrderConstraint(HashTableOrderPair *table, OrderPair *pair);
#endif
return E_BOGUS;
}
-Edge inferOrderConstraintFromGraph(Order *order, uint64_t _first, uint64_t _second) {
+Edge SATEncoder::inferOrderConstraintFromGraph(Order *order, uint64_t _first, uint64_t _second) {
if (order->graph != NULL) {
OrderGraph *graph = order->graph;
OrderNode *first = graph->lookupOrderNodeFromOrderGraph(_first);
void SATEncoder::createAllTotalOrderConstraintsSATEncoder(Order *order) {
-#ifdef TRACE_DEBUG
+#ifdef CONFIG_DEBUG
model_print("in total order ...\n");
#endif
ASSERT(order->type == TOTAL);
Boolean *o58 = solver->orderConstraint(order, 5, 8);
Boolean *o81 = solver->orderConstraint(order, 8, 1);
- /* Not Valid c++...Let Hamed fix...
- addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o12, o13, o24, o34}, 4) );
- Boolean *b1 = applyLogicalOperation(solver, L_XOR, (Boolean *[]) {o41, o57}, 2);
- Boolean *o34n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o34}, 1);
- Boolean *o24n = applyLogicalOperation(solver, L_NOT, (Boolean *[]) {o24}, 1);
- Boolean *b2 = applyLogicalOperation(solver, L_OR, (Boolean *[]) {o34n, o24n}, 2);
- addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b1, b2}, 2) );
- addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o12, o13}, 2) );
- addConstraint(solver, applyLogicalOperation(solver, L_OR,(Boolean *[]) {o76, o65}, 2) );
- Boolean* b3= applyLogicalOperation(solver, L_AND,(Boolean *[]) {o76, o65}, 2) ;
- Boolean* o57n= applyLogicalOperation(solver, L_NOT,(Boolean *[]) {o57}, 1);
- addConstraint(solver, applyLogicalOperation(solver, L_IMPLIES,(Boolean *[]) {b3, o57n}, 2) );
- addConstraint(solver, applyLogicalOperation(solver, L_AND,(Boolean *[]) {o58, o81}, 2) );
+ Boolean * array1[]={o12, o13, o24, o34};
+ solver->addConstraint(solver->applyLogicalOperation(L_OR, array1, 4) );
+ Boolean * array2[]={o41, o57};
+
+ Boolean *b1 = solver->applyLogicalOperation(L_XOR, array2, 2);
+ Boolean * array3[]={o34};
+ Boolean *o34n = solver->applyLogicalOperation(L_NOT, array3, 1);
+ Boolean * array4[]={o24};
+ Boolean *o24n = solver->applyLogicalOperation(L_NOT, array4, 1);
+ Boolean * array5[]={o34n, o24n};
+ Boolean *b2 = solver->applyLogicalOperation(L_OR, array5, 2);
+ Boolean * array6[] = {b1, b2};
+ solver->addConstraint(solver->applyLogicalOperation(L_IMPLIES, array6, 2) );
- if (solver->startEncoding() == 1)
- printf("SAT\n");
- else
- printf("UNSAT\n");
- */
+ Boolean * array7[] = {o12, o13};
+ solver->addConstraint(solver->applyLogicalOperation(L_AND, array7, 2) );
+
+ Boolean * array8[] = {o76, o65};
+ solver->addConstraint(solver->applyLogicalOperation(L_OR, array8, 2) );
+
+ Boolean * array9[] = {o76, o65};
+ Boolean* b3= solver->applyLogicalOperation(L_AND, array9, 2) ;
+ Boolean * array10[] = {o57};
+ Boolean* o57n= solver->applyLogicalOperation(L_NOT, array10, 1);
+ Boolean * array11[] = {b3, o57n};
+ solver->addConstraint(solver->applyLogicalOperation(L_IMPLIES, array11, 2));
+
+ Boolean * array12[] = {o58, o81};
+ solver->addConstraint(solver->applyLogicalOperation(L_AND, array12, 2) );
+
+ /* if (solver->startEncoding() == 1)
+ printf("SAT\n");
+ else
+ printf("UNSAT\n");*/
+
+ solver->autoTune(100);
delete solver;
}
long long encodeTime=copy->getEncodeTime();
long long solveTime=copy->getSolveTime();
long long metric=elapsedTime;
+ model_print("Elapsed Time: %llu\n", elapsedTime);
+ model_print("Encode Time: %llu\n", encodeTime);
+ model_print("Solve Time: %llu\n", solveTime);
delete copy;
return metric;
}
for (uint i=0;i<budget;i++) {
SearchTuner *newTuner=mutateTuner(oldTuner, i);
double newScore=evaluateAll(newTuner);
+ newTuner->printUsed();
+ model_print("Received score %f\n", newScore);
double scoreDiff=newScore - oldScore; //smaller is better
if (newScore < bestScore) {
+ if (bestTuner != NULL)
+ delete bestTuner;
bestScore = newScore;
bestTuner = newTuner->copyUsed();
}
}
double ran = ((double)random()) / RAND_MAX;
if (ran <= acceptanceP) {
+ delete oldTuner;
oldScore = newScore;
oldTuner = newTuner;
} else {
delete newTuner;
}
}
+ model_print("Best tuner:\n");
+ bestTuner->print();
+ model_print("Received score %f\n", bestScore);
+ if (bestTuner != NULL)
+ delete bestTuner;
+ delete oldTuner;
}
void TunableSetting::print() {
if (hasVar) {
- model_print("Type %llu, ", type);
+ model_print("Type %" PRIu64 ", ", type);
}
model_print("Param %u = %u\n", param, selectedValue);
}
void SearchTuner::randomMutate() {
TunableSetting * randomSetting = settings.getRandomElement();
- uint range=randomSetting->highValue-randomSetting->lowValue;
- uint randomchoice=(random() % range) + randomSetting->lowValue;
+ int range=randomSetting->highValue-randomSetting->lowValue;
+ int randomchoice=(random() % range) + randomSetting->lowValue;
if (randomchoice < randomSetting->selectedValue)
randomSetting->selectedValue = randomchoice;
else
#ifndef TUNABLE_H
#define TUNABLE_H
#include "classlist.h"
-
+#include "common.h"
class Tuner {
public:
- virtual int getTunable(TunableParam param, TunableDesc *descriptor);
- virtual int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor);
- virtual ~Tuner();
+ virtual int getTunable(TunableParam param, TunableDesc *descriptor) {ASSERT(0); return 0;}
+ virtual int getVarTunable(VarType vartype, TunableParam param, TunableDesc *descriptor) {ASSERT(0); return 0;}
+ virtual ~Tuner() {}
MEMALLOC;
};
CSolver::CSolver() :
unsat(false),
- tuner(new DefaultTuner()),
+ tuner(NULL),
elapsedTime(0)
{
satEncoder = new SATEncoder(this);
}
delete satEncoder;
- delete tuner;
}
CSolver *CSolver::clone() {
HSIteratorBoolean *it = getConstraints();
while (it->hasNext()) {
Boolean *b = it->next();
- b->clone(copy, &map);
+ copy->addConstraint(b->clone(copy, &map));
}
delete it;
return copy;
}
int CSolver::startEncoding() {
+ bool deleteTuner = false;
+ if (tuner == NULL) {
+ tuner = new DefaultTuner();
+ deleteTuner = true;
+ }
+
long long startTime = getTimeNano();
computePolarities(this);
orderAnalysis(this);
int result = satEncoder->solve();
long long finishTime = getTimeNano();
elapsedTime = finishTime - startTime;
+ if (deleteTuner) {
+ delete tuner;
+ tuner = NULL;
+ }
return result;
}
AutoTuner * autotuner=new AutoTuner(budget);
autotuner->addProblem(this);
autotuner->tune();
+ delete autotuner;
}