X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FASTTransform%2Fintegerencoding.cc;h=6be73ea9bfbf648d7e2eac98e8610a98c6c8aff6;hb=ccc6ed150f90cc74234b7b8eef2e44eb5363f7bc;hp=f4b17b4eae2c1f5e1a08ac1d6a3edc0bbd33025f;hpb=0e8a6723cb83a99d0ded4f09e5310a2afa2edabf;p=satune.git diff --git a/src/ASTTransform/integerencoding.cc b/src/ASTTransform/integerencoding.cc index f4b17b4..6be73ea 100644 --- a/src/ASTTransform/integerencoding.cc +++ b/src/ASTTransform/integerencoding.cc @@ -1,41 +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 "integerencodingrecord.h" +#include "integerencorderresolver.h" +#include "tunable.h" +#include "polarityassignment.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, &offon)) + 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); } + 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); + Predicate *predicate = solver->createPredicateOperator(SATC_LT); + Element *parray[] = {elem1, elem2}; + BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2); + updateEdgePolarity(boolean, boolOrder); + solver->replaceBooleanWithBoolean(boolOrder, boolean); }