bug fix
[satune.git] / src / ASTTransform / integerencoding.cc
index 2d405e0fe82712f527d05252829793aff4a0c7b8..621d2a8c927ee9d10d81315c7dab1f25192d1879 100644 (file)
@@ -1,49 +1,61 @@
-
 #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 (order->type == SATC_PARTIAL)
+                 continue;
+               if (GETVARTUNABLE(solver->getTuner(), order->set->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; i<size; i++){
-               orderIntegerEncodingSATEncoder(order->constraints.get(i));
+void IntegerEncodingTransform::integerEncode(Order *currOrder) {
+       IntegerEncodingRecord *encodingRecord =  new IntegerEncodingRecord(
+               solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->getNumUsed() - 1));
+       currOrder->setOrderEncodingType( INTEGERENCODING );
+
+       Vector<BooleanOrder *> *constraints = currOrder->getConstraints();
+       uint size = constraints->getSize();
+       for (uint i = 0; i < size; i++) {
+               orderIntegerEncodingSATEncoder(constraints->get(i), encodingRecord);
        }
+       currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
+       solver->getActiveOrders()->remove(currOrder);
 }
 
 
-void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder) {
-       IntegerEncodingRecord* ierec = orderIntegerEncoding->get(order);
+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(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);
 }