1 #include "integerencoding.h"
4 #include "satencoder.h"
6 #include "integerencodingrecord.h"
7 #include "integerencorderresolver.h"
9 #include "polarityassignment.h"
11 IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
16 IntegerEncodingTransform::~IntegerEncodingTransform() {
19 void IntegerEncodingTransform::doTransform() {
20 if (solver->isUnSAT()) {
23 HashsetOrder *orders = solver->getActiveOrders()->copy();
24 SetIteratorOrder *orderit = orders->iterator();
25 while (orderit->hasNext()) {
26 Order *order = orderit->next();
27 if (order->type == SATC_PARTIAL)
29 if (GETVARTUNABLE(solver->getTuner(), order->set->type, ORDERINTEGERENCODING, &offon))
36 void IntegerEncodingTransform::integerEncode(Order *currOrder) {
37 IntegerEncodingRecord *encodingRecord = new IntegerEncodingRecord(
38 solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->getNumUsed() - 1));
39 currOrder->setOrderEncodingType( INTEGERENCODING );
41 Vector<BooleanOrder *> *constraints = currOrder->getConstraints();
42 uint size = constraints->getSize();
43 for (uint i = 0; i < size; i++) {
44 orderIntegerEncodingSATEncoder(constraints->get(i), encodingRecord);
46 currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
47 solver->getActiveOrders()->remove(currOrder);
51 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder, IntegerEncodingRecord *ierec) {
52 //getting two elements and using LT predicate ...
53 Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
54 Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
55 Predicate *predicate = solver->createPredicateOperator(SATC_LT);
56 Element *parray[] = {elem1, elem2};
57 BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
58 updateEdgePolarity(boolean, boolOrder);
59 solver->replaceBooleanWithBoolean(boolOrder, boolean);