/src/mymemory.cc
.*
*.dSYM
+
+#Ignoring Benchmarks
+src/Benchmarks/
#include "order.h"
#include "predicate.h"
+uint64_t Boolean::counter = 0;
+
Boolean::Boolean(ASTNodeType _type) :
ASTNode(_type),
polarity(P_UNDEFINED),
boolVal(BV_UNDEFINED),
- parents() {
+ parents(), id(counter++) {
}
BooleanConst::BooleanConst(bool _isTrue) :
#include "serializer.h"
class Boolean : public ASTNode {
+private:
+ static uint64_t counter;
public:
Boolean(ASTNodeType _type);
virtual ~Boolean() {}
BooleanValue boolVal;
Vector<ASTNode *> parents;
virtual void updateParents() {}
-
+ uint64_t id;
CMEMALLOC;
};
ASSERT(encoding->type == BINARYVAL);
allocElementConstraintVariables(encoding, encoding->numBits);
getArrayNewVarsSATEncoder(encoding->numVars, encoding->variables);
+ if(encoding->anyValue)
+ generateAnyValueBinaryValueEncoding(encoding);
}
void SATEncoder::generateBinaryIndexEncodingVars(ElementEncoding *encoding) {
ASSERT(encoding->type == BINARYINDEX);
allocElementConstraintVariables(encoding, NUMBITS(encoding->encArraySize - 1));
getArrayNewVarsSATEncoder(encoding->numVars, encoding->variables);
+ if(encoding->anyValue)
+ generateAnyValueBinaryIndexEncoding(encoding);
}
void SATEncoder::generateOneHotEncodingVars(ElementEncoding *encoding) {
}
}
addConstraintCNF(cnf, constraintOR(cnf, encoding->numVars, encoding->variables));
+ if(encoding->anyValue)
+ generateAnyValueOneHotEncoding(encoding);
}
void SATEncoder::generateUnaryEncodingVars(ElementEncoding *encoding) {
}
}
+void SATEncoder::generateAnyValueOneHotEncoding(ElementEncoding *encoding){
+ if(encoding->numVars == 0)
+ return;
+ Edge carray[encoding->numVars];
+ int size = 0;
+ for (uint i = 0; i < encoding->encArraySize; i++) {
+ if (encoding->isinUseElement(i)){
+ carray[size++] = encoding->variables[i];
+ }
+ }
+ if(size > 0){
+ addConstraintCNF(cnf, constraintOR(cnf, size, carray));
+ }
+}
+
+void SATEncoder::generateAnyValueBinaryIndexEncoding(ElementEncoding *encoding){
+ if(encoding->numVars == 0)
+ return;
+ Edge carray[encoding->numVars];
+ int size = 0;
+ int index = -1;
+ for(uint i= encoding->encArraySize-1; i>=0; i--){
+ if(encoding->isinUseElement(i)){
+ if(i+1 < encoding->encArraySize){
+ index = i+1;
+ }
+ break;
+ }
+ }
+ if( index != -1 ){
+ carray[size++] = generateLTValueConstraint(cnf, encoding->numVars, encoding->variables, index);
+ }
+ index = index == -1? encoding->encArraySize-1 : index-1;
+ for(int i= index; i>=0; i--){
+ if (!encoding->isinUseElement(i)){
+ carray[size++] = constraintNegate( generateBinaryConstraint(cnf, encoding->numVars, encoding->variables, i));
+ }
+ }
+ if(size > 0){
+ addConstraintCNF(cnf, constraintAND(cnf, size, carray));
+ }
+}
+
+void SATEncoder::generateAnyValueBinaryValueEncoding(ElementEncoding *encoding){
+ uint64_t minvalueminusoffset = encoding->low - encoding->offset;
+ uint64_t maxvalueminusoffset = encoding->high - encoding->offset;
+ model_print("This is minvalueminus offset: %lu", minvalueminusoffset);
+ Edge lowerbound = generateLTValueConstraint(cnf, encoding->numVars, encoding->variables, maxvalueminusoffset);
+ Edge upperbound = constraintNegate(generateLTValueConstraint(cnf, encoding->numVars, encoding->variables, minvalueminusoffset));
+ addConstraintCNF(cnf, constraintAND2(cnf, lowerbound, upperbound));
+}
+
Edge encodeEnumTablePredicateSATEncoder(BooleanPredicate *constraint);
void encodeEnumTableElemFunctionSATEncoder(ElementFunction *This);
void encodeEnumEntriesTableElemFuncSATEncoder(ElementFunction *This);
-
+ void generateAnyValueOneHotEncoding(ElementEncoding *encoding);
+ void generateAnyValueBinaryIndexEncoding(ElementEncoding *encoding);
+ void generateAnyValueBinaryValueEncoding(ElementEncoding *encoding);
CNF *cnf;
CSolver *solver;
BooleanToEdgeMap booledgeMap;
deleteVectorEdge(clauses);
return;
}
- Edge cor = constraintAND(cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
- addConstraintCNF(cnf, cor);
+ Edge cand = constraintAND(cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses));
+ addConstraintCNF(cnf, cand);
deleteVectorEdge(clauses);
}
const char *elemEncTypeNames[] = {"UNASSIGNED", "ONEHOT", "UNARY", "BINARYINDEX", "BINARYVAL"};
ElementEncoding::ElementEncoding(Element *_element) :
+ anyValue(false),
type(ELEM_UNASSIGNED),
element(_element),
variables(NULL),
}
void print();
+ bool anyValue;
ElementEncodingType type;
Element *element;
Edge *variables;/* List Variables Used To Encode Element */
--- /dev/null
+#include "csolver.h"
+
+
+int main(int numargs, char **argv) {
+ CSolver *solver = new CSolver();
+ uint64_t set1[] = {10, 8, 18};
+ uint64_t set2[] = {10, 13, 7};
+ Set *s1 = solver->createSet(0, set1, 3);
+ Set *s2 = solver->createSet(1, set2, 3);
+ Element *e1 = solver->getElementVar(s1);
+ Element *e2 = solver->getElementVar(s2);
+ solver->mustHaveValue(e1);
+ solver->mustHaveValue(e2);
+
+ Set *domain[] = {s1, s2};
+ Predicate *equals = solver->createPredicateOperator(SATC_EQUALS, domain, 2);
+ Element *inputs[] = {e1, e2};
+ BooleanEdge b = solver->applyPredicate(equals, inputs, 2);
+ b = solver->applyLogicalOperation(SATC_NOT, b);
+ solver->addConstraint(b);
+
+ if (solver->solve() == 1)
+ printf("e1=%" PRIu64 "e2=%" PRIu64 "\n", solver->getElementValue(e1), solver->getElementValue(e2));
+ else
+ printf("UNSAT\n");
+ delete solver;
+}
--- /dev/null
+#include "csolver.h"
+#include <unistd.h>
+
+/**
+ * e1={0, 1, 2}
+ * e2={0, 1, 2}
+ * e1 == e2
+ * e3= e1+e2 {0, 1, 2, 3, 4}
+ * e4 = f(e1, e2)
+ * 0 1 => 0
+ * 1 1 => 0
+ * 2 1 => 2
+ * 2 2 => 2
+ * e3 == e4
+ * Result: UNSAT!
+ */
+int main(int numargs, char **argv) {
+ CSolver *solver = new CSolver();
+ uint64_t set1[] = {1, 2, 3};
+ Set *s1 = solver->createSet(1, set1, 3);
+ Set *s2 = solver->createSet(1, set1, 3);
+ Element *e1 = solver->getElementVar(s1);
+ Element *e2 = solver->getElementVar(s2);
+ solver->mustHaveValue(e1);
+ solver->mustHaveValue(e2);
+ Set *domain[] = {s1, s2};
+ Element *inputs[] = {e1, e2};
+
+ uint64_t set2[] = {3};
+ Set *rangef1 = solver->createSet(1, set2, 1);
+ Function *f1 = solver->createFunctionOperator(SATC_ADD, domain, 2, rangef1, SATC_FLAGIFFOVERFLOW);
+
+ BooleanEdge overflow = solver->getBooleanVar(2);
+ Element *e3 = solver->applyFunction(f1, inputs, 2, overflow);
+ Element *e4 = solver->getElementConst(5, 3);
+ Set *domain2[] = {rangef1,rangef1};
+ Predicate *equal2 = solver->createPredicateOperator(SATC_EQUALS, domain2, 2);
+ Element *inputs2 [] = {e4, e3};
+ BooleanEdge pred = solver->applyPredicate(equal2, inputs2, 2);
+ solver->addConstraint(pred);
+ solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, overflow));
+ if (solver->solve() == 1)
+ printf("e1=%" PRIu64 " e2=%" PRIu64 " \n", solver->getElementValue(e1), solver->getElementValue(e2));
+ else
+ printf("UNSAT\n");
+ delete solver;
+}
void serialize(void* solver){
CCSOLVER(solver)->serialize();
}
+
+
+void mustHaveValue(void *solver, void *element){
+ CCSOLVER(solver)->mustHaveValue( (Element*) element);
+}
int getOrderConstraintValue(void* solver,void *order, long first, long second);
void printConstraints(void* solver);
void serialize(void* solver);
+void mustHaveValue(void *solver, void *element);
#ifdef __cplusplus
}
#endif
return element;
}
+void CSolver::mustHaveValue(Element *element){
+ element->getElementEncoding()->anyValue = true;
+}
+
Set *CSolver::getElementRange (Element *element) {
return element->getRange();
}
return applyLogicalOperation(op, array, 1);
}
-static int ptrcompares(const void *p1, const void *p2) {
- uintptr_t b1 = *(uintptr_t const *) p1;
- uintptr_t b2 = *(uintptr_t const *) p2;
+static int booleanEdgeCompares(const void *p1, const void *p2) {
+ BooleanEdge be1 = *(BooleanEdge const *) p1;
+ BooleanEdge be2 = *(BooleanEdge const *) p2;
+ uint64_t b1 = be1->id;
+ uint64_t b2 = be2->id;
if (b1 < b2)
return -1;
else if (b1 == b2)
} else if (newindex == 1) {
return newarray[0];
} else {
- bsdqsort(newarray, newindex, sizeof(BooleanEdge), ptrcompares);
+ bsdqsort(newarray, newindex, sizeof(BooleanEdge), booleanEdgeCompares);
array = newarray;
asize = newindex;
}
Set *getElementRange (Element *element);
+ void mustHaveValue(Element *element);
+
BooleanEdge getBooleanTrue();
BooleanEdge getBooleanFalse();
SATC_LTE=3
SATC_GTE=4
+class ArithOp:
+ SATC_ADD=0
+ SATC_SUB=1
+
+class OverFlowBehavior:
+ SATC_IGNORE=0
+ SATC_WRAPAROUND=1
+ SATC_FLAGFORCESOVERFLOW=2
+ SATC_OVERFLOWSETSFLAG=3
+ SATC_FLAGIFFOVERFLOW=4
+ SATC_NOOVERFLOW=5
+
+
def loadCSolver():
csolverlb = cdll.LoadLibrary("lib_cons_comp.so")
csolverlb.createCCSolver.restype = c_void_p