X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTTransform%2Fintegerencoding.cc;h=2a7b9012f74eae6272ef4a97d23545060028a67a;hp=d15c60e365798254924277c8fd77c0fe86935359;hb=cbd921ee35b6a29934fd7cecccde7f160228af17;hpb=83849cbb24f9680d1ca7c09d09ecefc6fe461d66 diff --git a/src/ASTTransform/integerencoding.cc b/src/ASTTransform/integerencoding.cc index d15c60e..2a7b901 100644 --- a/src/ASTTransform/integerencoding.cc +++ b/src/ASTTransform/integerencoding.cc @@ -1,49 +1,57 @@ - #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 (GETVARTUNABLE(solver->getTuner(), order->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->set->getSize() - 1)); + currOrder->setOrderEncodingType( INTEGERENCODING ); + uint size = currOrder->constraints.getSize(); + for (uint i = 0; i < size; i++) { + orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord); } + currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord)); + solver->getActiveOrders()->remove(currOrder); } -void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder) { - IntegerEncodingRecord* ierec = orderIntegerEncoding->get(order); - //getting two elements and using SATC_LT predicate ... +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(SATC_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); }