Further simplify and fix initialization of ce guided instantiation (#2437)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 6 Sep 2018 20:48:58 +0000 (15:48 -0500)
committerGitHub <noreply@github.com>
Thu, 6 Sep 2018 20:48:58 +0000 (15:48 -0500)
src/theory/quantifiers/sygus/ce_guided_conjecture.cpp
src/theory/quantifiers/sygus/ce_guided_conjecture.h
src/theory/quantifiers/sygus/ce_guided_instantiation.cpp
src/theory/quantifiers/sygus/ce_guided_instantiation.h

index 1d070417eb1599b9532ec47486badb77ea4a1e24..0a212598bec71389855dda7dd14d0adb6fe18b6d 100644 (file)
@@ -202,7 +202,8 @@ bool CegConjecture::isSingleInvocation() const {
   return d_ceg_si->isSingleInvocation();
 }
 
-bool CegConjecture::needsCheck( std::vector< Node >& lem ) {
+bool CegConjecture::needsCheck()
+{
   if( isSingleInvocation() && !d_ceg_si->needsCheck() ){
     return false;
   }
index 48d307f1e6582cbc3de3c4a0b341fefbd9bebad0..612a2b4ce0af0189deb5dbaa7c325823d80bac07 100644 (file)
@@ -58,7 +58,7 @@ public:
    * refinement */
   void incrementRefineCount() { d_refine_count++; }
   /** whether the conjecture is waiting for a call to doCheck below */
-  bool needsCheck( std::vector< Node >& lem );
+  bool needsCheck();
   /** whether the conjecture is waiting for a call to doRefine below */
   bool needsRefinement() const;
   /** do single invocation check 
index 83a576d372615980a17c1cc7dd0e636deeb020b1..c5919574654b4655c67bebddd32a38c3d06f1cc4 100644 (file)
@@ -52,10 +52,20 @@ QuantifiersModule::QEffort CegInstantiation::needsModel(Theory::Effort e)
 
 void CegInstantiation::check(Theory::Effort e, QEffort quant_e)
 {
+  // are we at the proper effort level?
+  unsigned echeck =
+      d_conj->isSingleInvocation() ? QEFFORT_STANDARD : QEFFORT_MODEL;
+  if (quant_e != echeck)
+  {
+    return;
+  }
+
   // if we are waiting to assign the conjecture, do it now
   if (!d_waiting_conj.isNull())
   {
     Node q = d_waiting_conj;
+    Trace("cegqi-engine") << "--- Conjecture waiting to assign: " << q
+                          << std::endl;
     d_waiting_conj = Node::null();
     if (!d_conj->isAssigned())
     {
@@ -65,31 +75,29 @@ void CegInstantiation::check(Theory::Effort e, QEffort quant_e)
       return;
     }
   }
-  unsigned echeck =
-      d_conj->isSingleInvocation() ? QEFFORT_STANDARD : QEFFORT_MODEL;
-  if( quant_e==echeck ){
-    Trace("cegqi-engine") << "---Counterexample Guided Instantiation Engine---" << std::endl;
-    Trace("cegqi-engine-debug") << std::endl;
-    bool active = false;
-    bool value;
-    if( d_quantEngine->getValuation().hasSatValue( d_conj->getConjecture(), value ) ) {
-      active = value;
-    }else{
-      Trace("cegqi-engine-debug") << "...no value for quantified formula." << std::endl;
-    }
-    Trace("cegqi-engine-debug") << "Current conjecture status : active : " << active << std::endl;
-    std::vector< Node > lem;
-    if( active && d_conj->needsCheck( lem ) ){
-      checkCegConjecture( d_conj );
-    }else{
-      Trace("cegqi-engine-debug") << "...does not need check." << std::endl;
-      for( unsigned i=0; i<lem.size(); i++ ){
-        Trace("cegqi-lemma") << "Cegqi::Lemma : check lemma : " << lem[i] << std::endl;
-        d_quantEngine->addLemma( lem[i] );
-      }
-    }
-    Trace("cegqi-engine") << "Finished Counterexample Guided Instantiation engine." << std::endl;
+
+  Trace("cegqi-engine") << "---Counterexample Guided Instantiation Engine---"
+                        << std::endl;
+  Trace("cegqi-engine-debug") << std::endl;
+  bool active = false;
+  bool value;
+  if (d_quantEngine->getValuation().hasSatValue(d_conj->getConjecture(), value))
+  {
+    active = value;
+  }
+  else
+  {
+    Trace("cegqi-engine-debug")
+        << "...no value for quantified formula." << std::endl;
   }
+  Trace("cegqi-engine-debug")
+      << "Current conjecture status : active : " << active << std::endl;
+  if (active && d_conj->needsCheck())
+  {
+    checkConjecture(d_conj);
+  }
+  Trace("cegqi-engine")
+      << "Finished Counterexample Guided Instantiation engine." << std::endl;
 }
 
 bool CegInstantiation::assignConjecture(Node q)
@@ -98,6 +106,7 @@ bool CegInstantiation::assignConjecture(Node q)
   {
     return false;
   }
+  Trace("cegqi-engine") << "--- Assign conjecture " << q << std::endl;
   if (options::sygusQePreproc())
   {
     // the following does quantifier elimination as a preprocess step
@@ -236,7 +245,7 @@ void CegInstantiation::registerQuantifier(Node q)
       else
       {
         // assign it now
-        d_conj->assign(q);
+        assignConjecture(q);
       }
     }else{
       Assert( d_conj->getEmbeddedConjecture()==q );
@@ -257,7 +266,8 @@ Node CegInstantiation::getNextDecisionRequest( unsigned& priority ) {
   return Node::null();
 }
 
-void CegInstantiation::checkCegConjecture( CegConjecture * conj ) {
+void CegInstantiation::checkConjecture(CegConjecture* conj)
+{
   Node q = conj->getEmbeddedConjecture();
   Node aq = conj->getConjecture();
   if( Trace.isOn("cegqi-engine-debug") ){
@@ -322,7 +332,7 @@ void CegInstantiation::checkCegConjecture( CegConjecture * conj ) {
       if (conj->needsRefinement())
       {
         // immediately go to refine candidate
-        checkCegConjecture(conj);
+        checkConjecture(conj);
         return;
       }
     }
index 03b4c4cc149225522a68ac8f02aea00923c8eb3c..9c81b69781d0c0bf22ef0ced5b8229e05e2818f2 100644 (file)
@@ -48,8 +48,9 @@ private:
    */
   bool assignConjecture(Node q);
   /** check conjecture */
-  void checkCegConjecture( CegConjecture * conj );
-public:
+  void checkConjecture(CegConjecture* conj);
+
+ public:
   CegInstantiation( QuantifiersEngine * qe, context::Context* c );
   ~CegInstantiation();
 public: