Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/constraint_compiler
[satune.git] / src / ASTTransform / integerencoding.cc
index a992f8f72b06c0ec53a8f61dea704f51961cfca0..1bc1dc3fc3180bded5d5ffdb4649fd02dc36c1ba 100644 (file)
@@ -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);
 }