implemented collectModelInfo for TheoryBV
authorLiana Hadarean <lianahady@gmail.com>
Wed, 3 Oct 2012 22:38:37 +0000 (22:38 +0000)
committerLiana Hadarean <lianahady@gmail.com>
Wed, 3 Oct 2012 22:38:37 +0000 (22:38 +0000)
src/theory/bv/bitblast_strategies.cpp
src/theory/bv/bitblaster.cpp
src/theory/bv/bitblaster.h
src/theory/bv/bv_subtheory.h
src/theory/bv/bv_subtheory_bitblast.cpp
src/theory/bv/bv_subtheory_bitblast.h
src/theory/bv/bv_subtheory_eq.cpp
src/theory/bv/bv_subtheory_eq.h
src/theory/bv/theory_bv.cpp

index 80b689b8c3fb30156c1b85d1d38be58bf8bf8ba0..08bd3475a1f87046dd9436b25b8d8512936d5d24 100644 (file)
@@ -338,9 +338,7 @@ void UndefinedTermBBStrategy(TNode node, Bits& bits, Bitblaster* bb) {
 }
 
 void DefaultVarBB (TNode node, Bits& bits, Bitblaster* bb) {
-  //  Assert (node.getKind() == kind::VARIABLE);
   Assert(bits.size() == 0);
-  
   for (unsigned i = 0; i < utils::getSize(node); ++i) {
     bits.push_back(utils::mkBitOf(node, i));
   }
@@ -349,6 +347,10 @@ void DefaultVarBB (TNode node, Bits& bits, Bitblaster* bb) {
     BVDebug("bitvector-bb") << "theory::bv::DefaultVarBB bitblasting  " << node << "\n";
     BVDebug("bitvector-bb") << "                           with bits  " << toString(bits); 
   }
+  // this is not necessairily a variable, but it is a term the theory of bitvectors treads as one
+  // e.g. a select over a bv array 
+  bb->storeVariable(node); 
+
 }
 
 void DefaultConstBB (TNode node, Bits& bits, Bitblaster* bb) {
index 3beb7c2299033543b8df3cf1df6a45fe57682f30..4aa52e24c8078d9dc14b7d5819750408438ae7aa 100644 (file)
@@ -26,6 +26,7 @@
 #include "theory/bv/theory_bv_rewrite_rules_simplification.h"
 #include "theory/bv/theory_bv.h"
 #include "theory/bv/options.h"
+#include "theory/model.h"
 
 using namespace std;
 
@@ -398,6 +399,35 @@ EqualityStatus Bitblaster::getEqualityStatus(TNode a, TNode b) {
   }
 }
 
+Node Bitblaster::getVarValue(TNode a) {
+  Assert (d_termCache.find(a) != d_termCache.end()); 
+  Bits bits = d_termCache[a];
+  Integer value(0); 
+  for (int i = bits.size() -1; i >= 0; --i) {
+    SatValue bit_value;
+    if (d_cnfStream->hasLiteral(bits[i])) { 
+      SatLiteral bit = d_cnfStream->getLiteral(bits[i]);
+      bit_value = d_satSolver->value(bit);
+      Assert (bit_value != SAT_VALUE_UNKNOWN);
+    } else {
+      // the bit is unconstrainted so we can give it an arbitrary value 
+      bit_value = SAT_VALUE_FALSE;
+    }
+    Integer bit_int = bit_value == SAT_VALUE_TRUE ? Integer(1) : Integer(0); 
+    value = value * 2 + bit_int;  
+  }
+  return utils::mkConst(BitVector(bits.size(), value));  
+}
+
+void Bitblaster::collectModelInfo(TheoryModel* m) {
+  __gnu_cxx::hash_set<TNode, TNodeHashFunction>::iterator it = d_variables.begin();
+  for (; it!= d_variables.end(); ++it) {
+    TNode var = *it;
+    Node const_value = getVarValue(var);
+    m->assertEquality(var, const_value, true); 
+  }
+}
+
 } /*bv namespace */
 } /* theory namespace */
 } /* CVC4 namespace*/
index ada9802bd11468ba17d5496ff7846b0c3d5f2a96..3aee0ee1a034f2e239e8b703559f8c974f6a8619 100644 (file)
@@ -51,6 +51,7 @@ class BVSatSolverInterface;
 namespace theory {
 
 class OutputChannel;
+class TheoryModel;
 
 namespace bv {
 
@@ -82,7 +83,8 @@ class Bitblaster {
   };
   
   typedef __gnu_cxx::hash_map <Node, Bits, TNodeHashFunction >              TermDefMap;
-  typedef __gnu_cxx::hash_set<TNode, TNodeHashFunction>                      AtomSet; 
+  typedef __gnu_cxx::hash_set<TNode, TNodeHashFunction>                      AtomSet;
+  typedef __gnu_cxx::hash_set<TNode, TNodeHashFunction>                      VarSet; 
   
   typedef void   (*TermBBStrategy) (TNode, Bits&, Bitblaster*); 
   typedef Node   (*AtomBBStrategy) (TNode, Bitblaster*); 
@@ -95,7 +97,7 @@ class Bitblaster {
   // caches and mappings
   TermDefMap                   d_termCache;
   AtomSet                      d_bitblastedAtoms;
-  
+  VarSet                       d_variables; 
   context::CDList<prop::SatLiteral>  d_assertedAtoms; /**< context dependent list storing the atoms
                                                        currently asserted by the DPLL SAT solver. */
 
@@ -136,7 +138,29 @@ public:
   void explain(TNode atom, std::vector<TNode>& explanation);
 
   EqualityStatus getEqualityStatus(TNode a, TNode b);
-
+  /** 
+   * Return a constant Node representing the value of a variable
+   * in the current model. 
+   * @param a 
+   * 
+   * @return 
+   */
+  Node getVarValue(TNode a);
+  /** 
+   * Adds a constant value for each bit-blasted variable in the model. 
+   * 
+   * @param m the model 
+   */
+  void collectModelInfo(TheoryModel* m); 
+  /** 
+   * Stores the variable (or non-bv term) and its corresponding bits. 
+   * 
+   * @param var 
+   * @param bits 
+   */
+  void storeVariable(TNode var) {
+    d_variables.insert(var); 
+  } 
 private:
 
   
index f8c763e3fa466f83d1b9f785d41305bc26a47df9..98b809d8502d9453724840efcc28795088175763 100644 (file)
@@ -28,6 +28,9 @@
 
 namespace CVC4 {
 namespace theory {
+
+class TheoryModel;
+
 namespace bv {
 
 enum SubTheory {
@@ -82,7 +85,7 @@ public:
   virtual bool  addAssertions(const std::vector<TNode>& assertions, Theory::Effort e) = 0;
   virtual void  explain(TNode literal, std::vector<TNode>& assumptions) = 0;
   virtual void  preRegister(TNode node) {}
-
+  virtual void  collectModelInfo(TheoryModel* m) = 0; 
 }; 
 
 }
index b0d04f952974f56187f491e19e32a66ee9e278cb..e28ec188dde0acc825346d89932a82f872e3e452 100644 (file)
@@ -125,3 +125,7 @@ bool BitblastSolver::addAssertions(const std::vector<TNode>& assertions, Theory:
 EqualityStatus BitblastSolver::getEqualityStatus(TNode a, TNode b) {
   return d_bitblaster->getEqualityStatus(a, b);
 }
+
+void BitblastSolver::collectModelInfo(TheoryModel* m) {
+  return d_bitblaster->collectModelInfo(m); 
+}
index 33ae5d2ffff2247d006d2a32ecd9fe6b42f13c1c..a2c77c9f575fa6650df31723b6f3cf49e86bfd22 100644 (file)
@@ -47,6 +47,7 @@ public:
   bool  addAssertions(const std::vector<TNode>& assertions, Theory::Effort e);
   void  explain(TNode literal, std::vector<TNode>& assumptions);
   EqualityStatus getEqualityStatus(TNode a, TNode b);
+  void collectModelInfo(TheoryModel* m); 
 };
 
 }
index cb08a1ad869ec723b9a49379e0adcbe649799cb8..56a490747162d616025d093d0f80c094ddc294b2 100644 (file)
@@ -19,7 +19,7 @@
 #include "theory/bv/bv_subtheory_eq.h"
 #include "theory/bv/theory_bv.h"
 #include "theory/bv/theory_bv_utils.h"
-
+#include "theory/model.h"
 using namespace std;
 using namespace CVC4;
 using namespace CVC4::context;
@@ -165,3 +165,6 @@ void EqualitySolver::conflict(TNode a, TNode b) {
   d_bv->setConflict(mkAnd(assumptions));
 }
 
+void EqualitySolver::collectModelInfo(TheoryModel* m) {
+  m->assertEqualityEngine(&d_equalityEngine);
+}
index d0ba8abca29484f75cc644546f9099b10a6c5e7a..24d9669dbb5d10f85c12a11266c255734914f5ac 100644 (file)
@@ -19,7 +19,6 @@
 #pragma once
 
 #include "cvc4_private.h"
-
 #include "theory/bv/bv_subtheory.h"
 
 namespace CVC4 {
@@ -68,6 +67,7 @@ public:
   void  preRegister(TNode node);
   bool  addAssertions(const std::vector<TNode>& assertions, Theory::Effort e);
   void  explain(TNode literal, std::vector<TNode>& assumptions);
+  void  collectModelInfo(TheoryModel* m);
   void  addSharedTerm(TNode t) {
     d_equalityEngine.addTriggerTerm(t, THEORY_BV);
   }
index aa5281d2f1fdaf59ac2a90e06e3d30f28aa0b7da..51e09ee5a38443ce5806a1fb7332d0c660522b98 100644 (file)
@@ -23,7 +23,7 @@
 #include "theory/bv/bitblaster.h"
 #include "theory/bv/options.h"
 #include "theory/bv/theory_bv_rewrite_rules_normalization.h"
-
+#include "theory/model.h"
 using namespace CVC4;
 using namespace CVC4::theory;
 using namespace CVC4::theory::bv;
@@ -126,7 +126,11 @@ void TheoryBV::check(Effort e)
 }
 
 void TheoryBV::collectModelInfo( TheoryModel* m, bool fullModel ){
-
+  Assert(!inConflict());
+  Assert (fullModel); // can only query full model
+  d_equalitySolver.collectModelInfo(m); 
+  d_bitblastSolver.collectModelInfo(m); 
+  
 }
 
 void TheoryBV::propagate(Effort e) {