fix to bug659 due to algebraic solver model building
authorLiana Hadarean <lianahady@gmail.com>
Thu, 20 Aug 2015 16:21:50 +0000 (17:21 +0100)
committerLiana Hadarean <lianahady@gmail.com>
Thu, 20 Aug 2015 17:22:46 +0000 (18:22 +0100)
src/theory/bv/bv_subtheory_algebraic.cpp
src/theory/bv/theory_bv_utils.cpp
src/theory/bv/theory_bv_utils.h

index 96b205bb1be3659e05771f2b152cfb8367b4b938..e6e3120f521f014809d46acd960db8a82ddcc48f 100644 (file)
@@ -684,16 +684,19 @@ void AlgebraicSolver::collectModelInfo(TheoryModel* model, bool fullModel) {
     }
   }
 
+  NodeSet leaf_vars;
   Debug("bitvector-model") << "Substitutions:\n";
   for (unsigned i = 0; i < variables.size(); ++i) {
     TNode current = variables[i];
     TNode subst = Rewriter::rewrite(d_modelMap->apply(current));
     Debug("bitvector-model") << "   " << current << " => " << subst << "\n";
     values[i] = subst;
+    utils::collectVariables(subst, leaf_vars);
   }
 
   Debug("bitvector-model") << "Model:\n";
-  for (BVQuickCheck::vars_iterator it = d_quickSolver->beginVars(); it != d_quickSolver->endVars(); ++it) {
+
+  for (NodeSet::const_iterator it = leaf_vars.begin(); it != leaf_vars.end(); ++it) {
     TNode var = *it;
     Node value = d_quickSolver->getVarValue(var, true);
     Assert (!value.isNull() || !fullModel);
@@ -712,7 +715,7 @@ void AlgebraicSolver::collectModelInfo(TheoryModel* model, bool fullModel) {
     TNode subst = Rewriter::rewrite(d_modelMap->apply(current));
     Debug("bitvector-model") << "AlgebraicSolver:   " << variables[i] << " => " << subst << "\n"; 
     // Doesn't have to be constant as it may be irrelevant
-    // Assert (subst.getKind() == kind::CONST_BITVECTOR); 
+    Assert (subst.getKind() == kind::CONST_BITVECTOR); 
     model->assertEquality(variables[i], subst, true);
   }
 
index 824dc5b9290f2c074e2681129c6fd3bfbc359755..d2025b1b82d0db8073bfaef8a025375645bf6eee 100644 (file)
@@ -100,3 +100,18 @@ uint64_t CVC4::theory::bv::utils::numNodes(TNode node, NodeSet& seen) {
   seen.insert(node);
   return size;
 }
+
+
+
+void CVC4::theory::bv::utils::collectVariables(TNode node, NodeSet& vars) {
+  if (vars.find(node) != vars.end())
+    return;
+
+  if (Theory::isLeafOf(node, THEORY_BV) && node.getKind() != kind::CONST_BITVECTOR) {
+    vars.insert(node);
+    return;
+  }
+  for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+    collectVariables(node[i], vars);
+  }
+}
index a8b6887e5743d5be0755bc236132a66e735546f2..ba8074fbb237abd7d1390cec12395bacf16803e3 100644 (file)
@@ -513,6 +513,8 @@ typedef __gnu_cxx::hash_set<Node, NodeHashFunction> NodeSet;
 
 uint64_t numNodes(TNode node, NodeSet& seen);
 
+void collectVariables(TNode node, NodeSet& vars);
+
 }
 }
 }