ElementOpt::ElementOpt(CSolver *_solver)
: Transform(_solver),
- updateSets(solver->getTuner()->getTunable(ELEMENTOPTSETS, &onoff) == 1)
+ updateSets(false)
{
}
}
void ElementOpt::doTransform() {
- if (solver->getTuner()->getTunable(ELEMENTOPT, &onoff) == 0)
+ if (solver->isUnSAT() || solver->getTuner()->getTunable(ELEMENTOPT, &onoff) == 0)
return;
+ //Set once we know we are going to use it.
+ updateSets = solver->getTuner()->getTunable(ELEMENTOPTSETS, &onoff) == 1;
+
SetIteratorBooleanEdge *iterator = solver->getConstraints();
while (iterator->hasNext()) {
BooleanEdge constraint = iterator->next();
replaceVarWithConst(pred, left, right);
} else if (pred->isFalse() && updateSets) {
constrainVarWithConst(pred, left, right);
- } else ASSERT(0);
+ }
}
void ElementOpt::handlePredicateInequality(BooleanPredicate *pred, ElementSet *var, ElementConst *value) {
solver->boolMap.remove(newpred);
newpred->inputs.set(j, value);
solver->boolMap.put(newpred, newpred);
- workList.push(newpred);
+ if (newpred->isTrue() || newpred->isFalse())
+ workList.push(newpred);
break;
}
}