d_statDisequalityConflicts("theory::arith::DisequalityConflicts", 0),
d_simplifyTimer("theory::arith::simplifyTimer"),
d_staticLearningTimer("theory::arith::staticLearningTimer"),
- d_permanentlyRemovedVariables("theory::arith::permanentlyRemovedVariables", 0),
d_presolveTime("theory::arith::presolveTime"),
d_externalBranchAndBounds("theory::arith::externalBranchAndBounds",0),
d_initialTableauSize("theory::arith::initialTableauSize", 0),
StatisticsRegistry::registerStat(&d_simplifyTimer);
StatisticsRegistry::registerStat(&d_staticLearningTimer);
- StatisticsRegistry::registerStat(&d_permanentlyRemovedVariables);
StatisticsRegistry::registerStat(&d_presolveTime);
StatisticsRegistry::registerStat(&d_externalBranchAndBounds);
StatisticsRegistry::unregisterStat(&d_simplifyTimer);
StatisticsRegistry::unregisterStat(&d_staticLearningTimer);
- StatisticsRegistry::unregisterStat(&d_permanentlyRemovedVariables);
StatisticsRegistry::unregisterStat(&d_presolveTime);
StatisticsRegistry::unregisterStat(&d_externalBranchAndBounds);
case kind::PLUS: { // 2+ args
DeltaRational value(0);
for(TNode::iterator i = n.begin(),
- iend = n.end();
- i != iend;
- ++i) {
+ iend = n.end();
+ i != iend;
+ ++i) {
value = value + getDeltaValue(*i);
}
return value;
default:
{
ArithVar var = d_arithvarNodeMap.asArithVar(n);
-
- if(d_removedRows.find(var) != d_removedRows.end()){
- Node eq = d_removedRows.find(var)->second;
- Assert(n == eq[0]);
- Node rhs = eq[1];
- return getDeltaValue(rhs);
- }
-
return d_partialModel.getAssignment(var);
}
}
case kind::VARIABLE: {
ArithVar var = d_arithvarNodeMap.asArithVar(n);
- if(d_removedRows.find(var) != d_removedRows.end()){
- Node eq = d_removedRows.find(var)->second;
- Assert(n == eq[0]);
- Node rhs = eq[1];
- return getValue(rhs);
- }
-
DeltaRational drat = d_partialModel.getAssignment(var);
const Rational& delta = d_partialModel.getDelta();
Debug("getValue") << n << " " << drat << " " << delta << endl;
return true;
}
-void TheoryArith::permanentlyRemoveVariable(ArithVar v){
- //There are 3 cases
- // 1) v is non-basic and is contained in a row
- // 2) v is basic
- // 3) v is non-basic and is not contained in a row
- // It appears that this can happen after other variables have been removed!
- // Tread carefullty with this one.
-
- Assert(Options::current()->variableRemovalEnabled);
-
- bool noRow = false;
-
- if(!d_tableau.isBasic(v)){
- ArithVar basic = findShortestBasicRow(v);
-
- if(basic == ARITHVAR_SENTINEL){
- noRow = true;
- }else{
- Assert(basic != ARITHVAR_SENTINEL);
- d_tableau.pivot(basic, v);
- }
- }
-
- if(d_tableau.isBasic(v)){
- Assert(!noRow);
-
- //remove the row from the tableau
- Node eq = d_tableau.rowAsEquality(v, d_arithvarNodeMap.getArithVarToNodeMap());
- d_tableau.removeRow(v);
-
- if(Debug.isOn("tableau")) d_tableau.printTableau();
- Debug("arith::permanentlyRemoveVariable") << eq << endl;
-
- Assert(d_tableau.getRowLength(v) == 0);
- Assert(d_tableau.getColLength(v) == 0);
- Assert(d_removedRows.find(v) == d_removedRows.end());
- d_removedRows[v] = eq;
- }
-
- Debug("arith::permanentlyRemoveVariable") << "Permanently removed variable " << v
- << ":" << d_arithvarNodeMap.asNode(v) <<endl;
- ++(d_statistics.d_permanentlyRemovedVariables);
-}
-
void TheoryArith::presolve(){
TimerStat::CodeTimer codeTimer(d_statistics.d_presolveTime);
- /* BREADCRUMB : Turn this on for QF_LRA/QF_RDL problems.
- *
- * The big problem for adding things back is that if they are readded they may
- * need to be assigned an initial value at ALL context values.
- * This is unsupported with our current datastructures.
- *
- * A better solution is to KNOW when the permantent removal is safe.
- * This is true for single query QF_LRA/QF_RDL problems.
- * Maybe a mechanism to ask "the sharing manager"
- * if this variable/row can be used in sharing?
- */
- if(Options::current()->variableRemovalEnabled){
- typedef std::vector<Node>::const_iterator VarIter;
- for(VarIter i = d_variables.begin(), end = d_variables.end(); i != end; ++i){
- Node variableNode = *i;
- ArithVar var = d_arithvarNodeMap.asArithVar(variableNode);
- if(!isSlackVariable(var) &&
- !d_atomDatabase.hasAnyAtoms(variableNode) &&
- !variableNode.getType().isInteger()){
- //The user variable is unconstrained.
- //Remove this variable permanently
- permanentlyRemoveVariable(var);
- }
- }
- }
-
d_statistics.d_initialTableauSize.setData(d_tableau.size());
if(Debug.isOn("paranoid:check_tableau")){ d_linEq.debugCheckTableau(); }
Comparison mkIntegerEqualityFromAssignment(ArithVar v);
- /**
- * If ArithVar v maps to the node n in d_removednode,
- * then n = (= asNode(v) rhs) where rhs is a term that
- * can be used to determine the value of n using getValue().
- */
- std::map<ArithVar, Node> d_removedRows;
-
/**
* List of all of the inequalities asserted in the current context.
*/
*/
bool entireStateIsConsistent();
- /**
- * Permanently removes a variable from the problem.
- * The caller guarentees the saftey of this removal!
- */
- void permanentlyRemoveVariable(ArithVar v);
-
bool isImpliedUpperBound(ArithVar var, Node exp);
bool isImpliedLowerBound(ArithVar var, Node exp);
TimerStat d_simplifyTimer;
TimerStat d_staticLearningTimer;
- IntStat d_permanentlyRemovedVariables;
TimerStat d_presolveTime;
IntStat d_externalBranchAndBounds;
replayFilename(""),
replayStream(NULL),
replayLog(NULL),
- variableRemovalEnabled(false),
arithPropagation(true),
satRandomFreq(0.0),
satRandomSeed(91648253),// Minisat's default value
--random-seed=S sets the random seed for the sat solver\n\
--restart-int-base=I sets the base restart interval for the sat solver (I=25 by default)\n\
--restart-int-inc=F sets the restart interval increase factor for the sat solver (F=3.0 by default)\n\
- --disable-variable-removal enable permanent removal of variables in arithmetic (UNSAFE! experts only)\n\
--disable-arithmetic-propagation turns on arithmetic propagation\n\
--enable-symmetry-breaker turns on UF symmetry breaker (Deharbe et al., CADE 2011) [on by default only for QF_UF]\n\
--disable-symmetry-breaker turns off UF symmetry breaker\n\
";
-#warning "Change CL options as --disable-variable-removal cannot do anything currently."
static const string languageDescription = "\
Languages currently supported as arguments to the -L / --lang option:\n\
RANDOM_SEED,
SAT_RESTART_FIRST,
SAT_RESTART_INC,
- ARITHMETIC_VARIABLE_REMOVAL,
ARITHMETIC_PROPAGATION,
ARITHMETIC_PIVOT_THRESHOLD,
ARITHMETIC_PROP_MAX_LENGTH,
{ "restart-int-base", required_argument, NULL, SAT_RESTART_FIRST },
{ "restart-int-inc", required_argument, NULL, SAT_RESTART_INC },
{ "print-winner", no_argument , NULL, PRINT_WINNER },
- { "disable-variable-removal", no_argument, NULL, ARITHMETIC_VARIABLE_REMOVAL },
{ "disable-arithmetic-propagation", no_argument, NULL, ARITHMETIC_PROPAGATION },
{ "disable-dio-solver", no_argument, NULL, ARITHMETIC_DIO_SOLVER },
{ "enable-symmetry-breaker", no_argument, NULL, ENABLE_SYMMETRY_BREAKER },
#endif /* CVC4_REPLAY */
break;
- case ARITHMETIC_VARIABLE_REMOVAL:
- variableRemovalEnabled = false;
- break;
-
case ARITHMETIC_PROPAGATION:
arithPropagation = false;
break;