From dc9528ed1aa556265c68d9f456d00524d74c9e0b Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 2 Oct 2018 11:00:18 -0700 Subject: [PATCH 1/1] Performance improvement --- src/Backend/satencoder.h | 1 + src/Backend/satfuncopencoder.cc | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/Backend/satencoder.h b/src/Backend/satencoder.h index 0ccf31c..78e797f 100644 --- a/src/Backend/satencoder.h +++ b/src/Backend/satencoder.h @@ -44,6 +44,7 @@ private: void generateElementEncoding(Element *element); Edge encodeOperatorPredicateSATEncoder(BooleanPredicate *constraint); Edge encodeEnumOperatorPredicateSATEncoder(BooleanPredicate *constraint); + Edge encodeEnumEqualsPredicateSATEncoder(BooleanPredicate *constraint); void encodeOperatorElementFunctionSATEncoder(ElementFunction *This); Edge encodeCircuitOperatorPredicateEncoder(BooleanPredicate *constraint); Edge encodeOrderSATEncoder(BooleanOrder *constraint); diff --git a/src/Backend/satfuncopencoder.cc b/src/Backend/satfuncopencoder.cc index ff91dc3..c2b9025 100644 --- a/src/Backend/satfuncopencoder.cc +++ b/src/Backend/satfuncopencoder.cc @@ -22,6 +22,63 @@ Edge SATEncoder::encodeOperatorPredicateSATEncoder(BooleanPredicate *constraint) exit(-1); } +Edge SATEncoder::encodeEnumEqualsPredicateSATEncoder(BooleanPredicate *constraint) { + Polarity polarity = constraint->polarity; + + /* Call base encoders for children */ + for (uint i = 0; i < 2; i++) { + Element *elem = constraint->inputs.get(i); + encodeElementSATEncoder(elem); + } + VectorEdge *clauses = vector; + + Set *set0 = constraint->inputs.get(0)->getRange(); + uint size0 = set0->getSize(); + + Set *set1 = constraint->inputs.get(1)->getRange(); + uint size1 = set1->getSize(); + + uint64_t val0 = set0->getElement(0); + uint64_t val1 = set1->getElement(0); + if (size0 != 0 && size1 != 0) + for (uint i = 0, j = 0; true; ) { + if (val0 == val1) { + Edge carray[2]; + carray[0] = getElementValueConstraint(constraint->inputs.get(0), polarity, val0); + carray[1] = getElementValueConstraint(constraint->inputs.get(1), polarity, val0); + Edge term = constraintAND(cnf, 2, carray); + pushVectorEdge(clauses, term); + i++; j++; + if (i < size0) + val0 = set0->getElement(i); + else + break; + if (j < size1) + val1 = set1->getElement(j); + else + break; + } else if (val0 < val1) { + i++; + if (i < size0) + val0 = set0->getElement(i); + else + break; + } else { + j++; + if (j < size1) + val1 = set1->getElement(j); + else + break; + } + } + if (getSizeVectorEdge(clauses) == 0) { + return E_False; + } + Edge cor = constraintOR(cnf, getSizeVectorEdge(clauses), exposeArrayEdge(clauses)); + clearVectorEdge(clauses); + return cor; +} + Edge SATEncoder::encodeEnumOperatorPredicateSATEncoder(BooleanPredicate *constraint) { PredicateOperator *predicate = (PredicateOperator *)constraint->predicate; uint numDomains = constraint->inputs.getSize(); @@ -31,6 +88,9 @@ Edge SATEncoder::encodeEnumOperatorPredicateSATEncoder(BooleanPredicate *constra if (generateNegation) polarity = negatePolarity(polarity); + if (!generateNegation && predicate->getOp() == SATC_EQUALS) + return encodeEnumEqualsPredicateSATEncoder(constraint); + /* Call base encoders for children */ for (uint i = 0; i < numDomains; i++) { Element *elem = constraint->inputs.get(i); -- 2.34.1