X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTTransform%2Fintegerencoding.cc;h=1bc1dc3fc3180bded5d5ffdb4649fd02dc36c1ba;hp=a992f8f72b06c0ec53a8f61dea704f51961cfca0;hb=2ad5d121f791b7e2a8b904ba75f270e6372f1730;hpb=4b5b02d3c28129def15b8945c0332269f72acc9d diff --git a/src/ASTTransform/integerencoding.cc b/src/ASTTransform/integerencoding.cc index a992f8f..1bc1dc3 100644 --- a/src/ASTTransform/integerencoding.cc +++ b/src/ASTTransform/integerencoding.cc @@ -1,43 +1,54 @@ #include "integerencoding.h" -#include "orderelement.h" +#include "set.h" #include "order.h" #include "satencoder.h" #include "csolver.h" -#include "predicate.h" -#include "element.h" -#include "rewriter.h" +#include "integerencodingrecord.h" +#include "integerencorderresolver.h" +#include "tunable.h" -void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder){ - Order* order = boolOrder->order; - if (order->elementTable == NULL) { - order->initializeOrderElementsHashTable(); +IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver) + : Transform(_solver) +{ +} + +IntegerEncodingTransform::~IntegerEncodingTransform() { +} + +void IntegerEncodingTransform::doTransform() { + HashsetOrder *orders = solver->getActiveOrders()->copy(); + SetIteratorOrder * orderit=orders->iterator(); + while(orderit->hasNext()) { + Order *order = orderit->next(); + if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff) && + order->encoding.resolver == NULL) + integerEncode(order); } - //getting two elements and using LT predicate ... - Element* elem1 = getOrderIntegerElement(This, order, boolOrder->first); - Element* elem2 = getOrderIntegerElement(This, order, boolOrder->second); - Set * sarray[]={order->auxSet, order->auxSet}; - Predicate *predicate =new PredicateOperator(LT, sarray, 2); - Element * parray[]={elem1, elem2}; - BooleanPredicate * boolean=new BooleanPredicate(predicate, parray, 2, NULL); - {//Adding new elements and boolean/predicate to solver regarding memory management - This->solver->allBooleans.push(boolean); - This->solver->allPredicates.push(predicate); - This->solver->allElements.push(elem1); - This->solver->allElements.push(elem2); - This->solver->constraints.add(boolean); + delete orders; + delete orderit; +} + +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); } - replaceBooleanWithBoolean(This->solver, boolOrder, boolean); + currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord)); + solver->getActiveOrders()->remove(currOrder); } -Element* getOrderIntegerElement(SATEncoder* This,Order *order, uint64_t item) { - HashSetOrderElement* eset = order->elementTable; - OrderElement oelement ={item, NULL}; - if( !eset->contains(&oelement)){ - Element* elem = new ElementSet(order->auxSet); - eset->add(allocOrderElement(item, elem)); - return elem; - } else - return eset->get(&oelement)->elem; +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->getSecondarySet(), ierec->getSecondarySet()}; + Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2); + Element *parray[] = {elem1, elem2}; + BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2); + solver->replaceBooleanWithBoolean(boolOrder, boolean); }