X-Git-Url: http://plrg.eecs.uci.edu/git/?p=satune.git;a=blobdiff_plain;f=src%2FASTTransform%2Fintegerencoding.cc;h=2a7b9012f74eae6272ef4a97d23545060028a67a;hp=343c93a7c02adbfeb2a846750a7f0255150afd4d;hb=cbd921ee35b6a29934fd7cecccde7f160228af17;hpb=265f7ab437520507811eceb70d4b05f111a11ac5 diff --git a/src/ASTTransform/integerencoding.cc b/src/ASTTransform/integerencoding.cc index 343c93a..2a7b901 100644 --- a/src/ASTTransform/integerencoding.cc +++ b/src/ASTTransform/integerencoding.cc @@ -1,46 +1,57 @@ #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 "set.h" +#include "integerencodingrecord.h" +#include "integerencorderresolver.h" +#include "tunable.h" +#include "polarityassignment.h" +IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver) + : Transform(_solver) +{ +} + +IntegerEncodingTransform::~IntegerEncodingTransform() { +} -void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder){ - Order* order = boolOrder->order; - if (order->elementTable == NULL) { - order->initializeOrderElementsHashTable(); +void IntegerEncodingTransform::doTransform() { + if(solver->isUnSAT()){ + return; } - //getting two elements and using LT predicate ... - ElementSet* elem1 = (ElementSet*)getOrderIntegerElement(This, order, boolOrder->first); - ElementSet* elem2 = (ElementSet*)getOrderIntegerElement(This, order, boolOrder->second); - Set * sarray[]={elem1->set, elem2->set}; - 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->constraints.add(boolean); + 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); } - replaceBooleanWithBoolean(This->solver, boolOrder, 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)){ - Set* set = new Set(order->set->type, 1, (uint64_t) order->set->getSize()); - Element* elem = new ElementSet(set); - eset->add(new OrderElement(item, elem)); - This->solver->allElements.push(elem); - This->solver->allSets.push(set); - 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); }