void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
updateMustValue(bexpr.getBoolean(), bexpr.isNegated() ? BV_MUSTBEFALSE : BV_MUSTBETRUE);
+
+ ASSERT(bexpr->boolVal != BV_UNSAT);
uint size = bexpr->parents.getSize();
for (uint i = 0; i < size; i++) {
if (oldb.isNegated()) {
oldb=oldb.negate();
newb=newb.negate();
+
}
if (constraints.contains(oldb)) {
constraints.remove(oldb);
constraints.add(newb);
+ if (newb->type == BOOLEANVAR)
+ replaceBooleanWithTrue(newb);
+ else
+ replaceBooleanWithTrueNoRemove(newb);
+ return;
}
if (constraints.contains(oldb.negate())) {
constraints.remove(oldb.negate());
constraints.add(newb.negate());
+ if (newb->type == BOOLEANVAR)
+ replaceBooleanWithTrue(newb.negate());
+ else
+ replaceBooleanWithTrueNoRemove(newb.negate());
+ return;
}
BooleanEdge oldbnegated = oldb.negate();
--- /dev/null
+#include "preprocess.h"
+#include "boolean.h"
+#include "csolver.h"
+#include "tunable.h"
+
+Preprocess::Preprocess(CSolver *_solver)
+ : Transform(_solver)
+{
+}
+
+Preprocess::~Preprocess() {
+}
+
+void Preprocess::doTransform() {
+ if (solver->getTuner()->getTunable(PREPROCESS, &onoff) == 0)
+ return;
+
+ SetIteratorBooleanEdge *iterator = solver->getConstraints();
+ while (iterator->hasNext()) {
+ BooleanEdge boolean = iterator->next();
+ Boolean *b = boolean.getBoolean();
+ transformBoolean(b);
+ }
+ delete iterator;
+ resolveBooleanVars();
+}
+
+void Preprocess::resolveBooleanVars() {
+ SetIteratorBoolean * iterator = toremove.iterator();
+ while (iterator->hasNext()) {
+ BooleanVar *bv = (BooleanVar *) iterator->next();
+ if (bv->polarity == P_TRUE) {
+ solver->replaceBooleanWithTrue(BooleanEdge(bv));
+ } else if (bv->polarity == P_FALSE) {
+ solver->replaceBooleanWithFalse(BooleanEdge(bv));
+ }
+ }
+ delete iterator;
+}
+
+void Preprocess::transformBoolean(Boolean *b) {
+ if (!processed.add(b))
+ return;
+ switch (b->type) {
+ case BOOLEANVAR:
+ processBooleanVar((BooleanVar *)b);
+ break;
+ case LOGICOP:
+ processLogicOp((BooleanLogic *)b);
+ break;
+ default:
+ break;
+ }
+}
+
+void Preprocess::processBooleanVar(BooleanVar * b) {
+ if (b->polarity==P_TRUE ||
+ b->polarity==P_FALSE) {
+ toremove.add(b);
+ }
+}
+
+void Preprocess::processLogicOp(BooleanLogic * b) {
+ for(uint i=0; i < b->inputs.getSize(); i++)
+ transformBoolean(b->inputs.get(i).getBoolean());
+}
--- /dev/null
+#ifndef PREPROCESS_H
+#define PREPROCESS_H
+#include "classlist.h"
+#include "transform.h"
+
+class Preprocess : public Transform {
+ public:
+ Preprocess(CSolver *_solver);
+ ~Preprocess();
+ void doTransform();
+
+ CMEMALLOC;
+private:
+ HashsetBoolean processed;
+ HashsetBoolean toremove;
+ void transformBoolean(Boolean *b);
+ void processBooleanVar(BooleanVar * b);
+ void processLogicOp(BooleanLogic * b);
+ void resolveBooleanVars();
+};
+
+#endif
typedef Hashset<OrderEdge *, uintptr_t, 4, order_edge_hash_function, order_edge_equals> HashsetOrderEdge;
typedef Hashset<OrderElement *, uintptr_t, 4, order_element_hash_function, order_element_equals> HashsetOrderElement;
typedef Hashset<Boolean *, uintptr_t, 4> HashsetBoolean;
+typedef SetIterator<Boolean *, uintptr_t, 4> SetIteratorBoolean;
typedef Hashtable<OrderNode *, HashsetOrderNode *, uintptr_t, 4> HashtableNodeToNodeSet;
typedef Hashtable<OrderPair *, OrderPair *, uintptr_t, 4, order_pair_hash_function, order_pair_equals> HashtableOrderPair;
}
bool getBooleanVariableValueSATTranslator( CSolver *This, Boolean *boolean) {
- int index = getEdgeVar( ((BooleanVar *) boolean)->var );
- return getValueSolver(This->getSATEncoder()->getCNF()->solver, index);
+ if (boolean->boolVal == BV_MUSTBETRUE)
+ return true;
+ else if (boolean->boolVal == BV_MUSTBEFALSE)
+ return false;
+ else {
+ int index = getEdgeVar( ((BooleanVar *) boolean)->var );
+ return getValueSolver(This->getSATEncoder()->getCNF()->solver, index);
+ }
}
static TunableDesc onoff(0, 1, 1);
static TunableDesc offon(0, 1, 0);
-enum Tunables {DECOMPOSEORDER, MUSTREACHGLOBAL, MUSTREACHLOCAL, MUSTREACHPRUNE, OPTIMIZEORDERSTRUCTURE, ORDERINTEGERENCODING};
+enum Tunables {DECOMPOSEORDER, MUSTREACHGLOBAL, MUSTREACHLOCAL, MUSTREACHPRUNE, OPTIMIZEORDERSTRUCTURE, ORDERINTEGERENCODING, PREPROCESS};
typedef enum Tunables Tunables;
#endif
#include "orderresolver.h"
#include "integerencoding.h"
#include "qsort.h"
+#include "preprocess.h"
CSolver::CSolver() :
boolTrue(BooleanEdge(new BooleanConst(true))),
long long startTime = getTimeNano();
computePolarities(this);
+ Preprocess pp(this);
+ pp.doTransform();
+
DecomposeOrderTransform dot(this);
dot.doTransform();