X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTTransform%2Fintegerencoding.cc;h=621d2a8c927ee9d10d81315c7dab1f25192d1879;hp=1b34bae06a683288a1549fa2b3e0c729e03bb893;hb=73e6a63d0683c953722370f12a420ada87ed81a7;hpb=d8a822b4166c0e1da167d756bc10cffbaded8972 diff --git a/src/ASTTransform/integerencoding.cc b/src/ASTTransform/integerencoding.cc index 1b34bae..621d2a8 100644 --- a/src/ASTTransform/integerencoding.cc +++ b/src/ASTTransform/integerencoding.cc @@ -6,6 +6,7 @@ #include "integerencodingrecord.h" #include "integerencorderresolver.h" #include "tunable.h" +#include "polarityassignment.h" IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver) : Transform(_solver) @@ -16,11 +17,16 @@ IntegerEncodingTransform::~IntegerEncodingTransform() { } void IntegerEncodingTransform::doTransform() { + if (solver->isUnSAT()) { + return; + } HashsetOrder *orders = solver->getActiveOrders()->copy(); SetIteratorOrder *orderit = orders->iterator(); while (orderit->hasNext()) { Order *order = orderit->next(); - if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff)) + if (order->type == SATC_PARTIAL) + continue; + if (GETVARTUNABLE(solver->getTuner(), order->set->type, ORDERINTEGERENCODING, &offon)) integerEncode(order); } delete orders; @@ -29,11 +35,13 @@ void IntegerEncodingTransform::doTransform() { void IntegerEncodingTransform::integerEncode(Order *currOrder) { IntegerEncodingRecord *encodingRecord = new IntegerEncodingRecord( - solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1)); + solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->getNumUsed() - 1)); currOrder->setOrderEncodingType( INTEGERENCODING ); - uint size = currOrder->constraints.getSize(); + + Vector *constraints = currOrder->getConstraints(); + uint size = constraints->getSize(); for (uint i = 0; i < size; i++) { - orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord); + orderIntegerEncodingSATEncoder(constraints->get(i), encodingRecord); } currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord)); solver->getActiveOrders()->remove(currOrder); @@ -44,10 +52,10 @@ void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *bool //getting two elements and using LT predicate ... Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first); Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second); - Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()}; - Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2); + Predicate *predicate = solver->createPredicateOperator(SATC_LT); Element *parray[] = {elem1, elem2}; BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2); + updateEdgePolarity(boolean, boolOrder); solver->replaceBooleanWithBoolean(boolOrder, boolean); }