1 #include "integerencoding.h"
4 #include "satencoder.h"
6 #include "integerencodingrecord.h"
7 #include "integerencorderresolver.h"
10 IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
15 IntegerEncodingTransform::~IntegerEncodingTransform() {
18 void IntegerEncodingTransform::doTransform() {
19 HashsetOrder *orders = solver->getActiveOrders()->copy();
20 SetIteratorOrder *orderit = orders->iterator();
21 while (orderit->hasNext()) {
22 Order *order = orderit->next();
23 if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &offon))
30 void IntegerEncodingTransform::integerEncode(Order *currOrder) {
31 IntegerEncodingRecord *encodingRecord = new IntegerEncodingRecord(
32 solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1));
33 currOrder->setOrderEncodingType( INTEGERENCODING );
34 uint size = currOrder->constraints.getSize();
35 for (uint i = 0; i < size; i++) {
36 orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord);
38 currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
39 solver->getActiveOrders()->remove(currOrder);
43 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder, IntegerEncodingRecord *ierec) {
44 //getting two elements and using LT predicate ...
45 Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
46 Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
47 Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()};
48 Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2);
49 Element *parray[] = {elem1, elem2};
50 BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
51 solver->replaceBooleanWithBoolean(boolOrder, boolean);