#include "satencoder.h"
#include "csolver.h"
#include "integerencodingrecord.h"
+#include "integerencorderresolver.h"
IntegerEncodingTransform::IntegerEncodingTransform(CSolver* _solver)
}
void IntegerEncodingTransform::doTransform(){
+ IntegerEncodingRecord* encodingRecord = NULL;
if (!orderIntEncoding->contains(currOrder)) {
- orderIntEncoding->put(currOrder, new IntegerEncodingRecord(
- solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize()-1)));
+ encodingRecord = new IntegerEncodingRecord(
+ solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize()-1));
+ orderIntEncoding->put(currOrder, encodingRecord);
+ } else {
+ encodingRecord = orderIntEncoding->get(currOrder);
}
uint size = currOrder->constraints.getSize();
for(uint i=0; i<size; i++){
orderIntegerEncodingSATEncoder(currOrder->constraints.get(i));
}
+ currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
}
virtual ~IntegerEncodingTransform();
private:
Order* currOrder;
+ //FIXME:We can remove it, because we don't need it for translating anymore... -HG
HashTableOrderIntEncoding* orderIntEncoding;
};
}
}
-Element * IntegerEncodingRecord::getOrderIntegerElement(CSolver *This, uint64_t item) {
+Element * IntegerEncodingRecord::getOrderIntegerElement(CSolver *This, uint64_t item, bool create) {
OrderElement oelement(item, NULL);
- if ( !elementTable->contains(&oelement)) {
+ if ( elementTable->contains(&oelement)) {
+ return elementTable->get(&oelement)->getElement();
+ } else if (create) {
Element *elem = This->getElementVar(secondarySet);
elementTable->add(new OrderElement(item, elem));
return elem;
- } else
- return elementTable->get(&oelement)->getElement();
+ }
+ return NULL;
}
public:
IntegerEncodingRecord(Set* set);
~IntegerEncodingRecord();
- Element* getOrderIntegerElement(CSolver *This, uint64_t item);
+ Element* getOrderIntegerElement(CSolver *This, uint64_t item, bool create = true);
inline Set* getSecondarySet() { return secondarySet; }
CMEMALLOC;
--- /dev/null
+
+/*
+ * File: integerencorderresolver.cpp
+ * Author: hamed
+ *
+ * Created on September 1, 2017, 4:58 PM
+ */
+
+#include "integerencorderresolver.h"
+#include "integerencodingrecord.h"
+#include "sattranslator.h"
+
+IntegerEncOrderResolver::IntegerEncOrderResolver(CSolver* _solver, IntegerEncodingRecord* _ierecord):
+ solver(_solver),
+ ierecord(_ierecord)
+{
+}
+
+IntegerEncOrderResolver::~IntegerEncOrderResolver() {
+}
+
+
+HappenedBefore IntegerEncOrderResolver::resolveOrder(uint64_t first, uint64_t second){
+ Element* elem1 = ierecord->getOrderIntegerElement(solver, first, false);
+ if(elem1 == NULL)
+ return SATC_UNORDERED;
+ Element* elem2 = ierecord->getOrderIntegerElement(solver, second, false);
+ if(elem2 == NULL)
+ return SATC_UNORDERED;
+
+ uint64_t val1 = getElementValueSATTranslator(solver, elem1);
+ uint64_t val2 = getElementValueSATTranslator(solver, elem2);
+ return val1 < val2? SATC_FIRST : val1> val2? SATC_SECOND: SATC_UNORDERED;
+}
--- /dev/null
+
+/*
+ * File: integerencorderresolver.h
+ * Author: hamed
+ *
+ * Created on September 1, 2017, 4:58 PM
+ */
+
+#ifndef INTEGERENCORDERRESOLVER_H
+#define INTEGERENCORDERRESOLVER_H
+#include "orderresolver.h"
+
+class IntegerEncOrderResolver : public OrderResolver{
+public:
+ IntegerEncOrderResolver(CSolver* _solver, IntegerEncodingRecord* _ierecord);
+ HappenedBefore resolveOrder(uint64_t first, uint64_t second);
+ virtual ~IntegerEncOrderResolver();
+private:
+ CSolver* solver;
+ IntegerEncodingRecord* ierecord;
+};
+
+#endif /* INTEGERENCORDERRESOLVER_H */
+