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