#include "integerencodingrecord.h"
#include "integerencorderresolver.h"
#include "tunable.h"
+#include "polarityassignment.h"
IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
: Transform(_solver)
}
void IntegerEncodingTransform::doTransform() {
+ if (solver->isUnSAT()) {
+ return;
+ }
HashsetOrder *orders = solver->getActiveOrders()->copy();
- SetIteratorOrder * orderit=orders->iterator();
- while(orderit->hasNext()) {
+ SetIteratorOrder *orderit = orders->iterator();
+ while (orderit->hasNext()) {
Order *order = orderit->next();
- if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff))
+ if (order->type == SATC_PARTIAL)
+ continue;
+ if (GETVARTUNABLE(solver->getTuner(), order->set->type, ORDERINTEGERENCODING, &offon))
integerEncode(order);
}
delete orders;
void IntegerEncodingTransform::integerEncode(Order *currOrder) {
IntegerEncodingRecord *encodingRecord = new IntegerEncodingRecord(
- solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1));
+ solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->getNumUsed() - 1));
currOrder->setOrderEncodingType( INTEGERENCODING );
- uint size = currOrder->constraints.getSize();
+
+ Vector<BooleanOrder *> *constraints = currOrder->getConstraints();
+ uint size = constraints->getSize();
for (uint i = 0; i < size; i++) {
- orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord);
+ orderIntegerEncodingSATEncoder(constraints->get(i), encodingRecord);
}
currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
solver->getActiveOrders()->remove(currOrder);
//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);
+ Predicate *predicate = solver->createPredicateOperator(SATC_LT);
Element *parray[] = {elem1, elem2};
BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
- solver->addConstraint(boolean);
+ updateEdgePolarity(boolean, boolOrder);
solver->replaceBooleanWithBoolean(boolOrder, boolean);
}