Statistics for fast enumerator (#3699)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 7 Feb 2020 16:41:09 +0000 (10:41 -0600)
committerGitHub <noreply@github.com>
Fri, 7 Feb 2020 16:41:09 +0000 (10:41 -0600)
src/theory/quantifiers/sygus/sygus_enumerator.cpp
src/theory/quantifiers/sygus/sygus_enumerator.h
src/theory/quantifiers/sygus/sygus_stats.cpp
src/theory/quantifiers/sygus/sygus_stats.h
src/theory/quantifiers/sygus/synth_conjecture.cpp

index ea539cc16c1f5af7e95b189694d6b0bbeec445dd..99f8eee2ce0aa7bd26bc43258da1f95d186e0a81 100644 (file)
@@ -24,8 +24,10 @@ namespace CVC4 {
 namespace theory {
 namespace quantifiers {
 
-SygusEnumerator::SygusEnumerator(TermDbSygus* tds, SynthConjecture* p)
-    : d_tds(tds), d_parent(p), d_tlEnum(nullptr), d_abortSize(-1)
+SygusEnumerator::SygusEnumerator(TermDbSygus* tds,
+                                 SynthConjecture* p,
+                                 SygusStatistics& s)
+    : d_tds(tds), d_parent(p), d_stats(s), d_tlEnum(nullptr), d_abortSize(-1)
 {
 }
 
@@ -149,12 +151,11 @@ SygusEnumerator::TermCache::TermCache()
       d_sampleRrVInit(false)
 {
 }
-void SygusEnumerator::TermCache::initialize(Node e,
-                                            TypeNode tn,
-                                            TermDbSygus* tds,
-                                            SygusPbe* pbe)
+void SygusEnumerator::TermCache::initialize(
+    SygusStatistics* s, Node e, TypeNode tn, TermDbSygus* tds, SygusPbe* pbe)
 {
   Trace("sygus-enum-debug") << "Init term cache " << tn << "..." << std::endl;
+  d_stats = s;
   d_enum = e;
   d_tn = tn;
   d_tds = tds;
@@ -312,6 +313,7 @@ bool SygusEnumerator::TermCache::addTerm(Node n)
   {
     Node bn = d_tds->sygusToBuiltin(n);
     Node bnr = d_tds->getExtRewriter()->extendedRewrite(bn);
+    ++(d_stats->d_enumTermsRewrite);
     if (options::sygusRewVerify())
     {
       if (bn != bnr)
@@ -334,6 +336,7 @@ bool SygusEnumerator::TermCache::addTerm(Node n)
     // if we are doing PBE symmetry breaking
     if (d_pbe != nullptr)
     {
+      ++(d_stats->d_enumTermsExampleEval);
       // Is it equivalent under examples?
       Node bne = d_pbe->addSearchVal(d_tn, d_enum, bnr);
       if (!bne.isNull())
@@ -350,6 +353,7 @@ bool SygusEnumerator::TermCache::addTerm(Node n)
     Trace("sygus-enum-terms") << "tc(" << d_tn << "): term " << bn << std::endl;
     d_bterms.insert(bnr);
   }
+  ++(d_stats->d_enumTerms);
   d_terms.push_back(n);
   return true;
 }
@@ -539,7 +543,7 @@ void SygusEnumerator::initializeTermCache(TypeNode tn)
       pbe = nullptr;
     }
   }
-  d_tcache[tn].initialize(d_enum, tn, d_tds, pbe);
+  d_tcache[tn].initialize(&d_stats, d_enum, tn, d_tds, pbe);
 }
 
 SygusEnumerator::TermEnum* SygusEnumerator::getMasterEnumForType(TypeNode tn)
index 3f4490b15ea6cb258916fd4fbb174e6c055842b8..7e5add299bab58c1edf8078c394c20660bd3ded4 100644 (file)
@@ -44,7 +44,7 @@ class SygusPbe;
 class SygusEnumerator : public EnumValGenerator
 {
  public:
-  SygusEnumerator(TermDbSygus* tds, SynthConjecture* p);
+  SygusEnumerator(TermDbSygus* tds, SynthConjecture* p, SygusStatistics& s);
   ~SygusEnumerator() {}
   /** initialize this class with enumerator e */
   void initialize(Node e) override;
@@ -60,6 +60,8 @@ class SygusEnumerator : public EnumValGenerator
   TermDbSygus* d_tds;
   /** pointer to the synth conjecture that owns this enumerator */
   SynthConjecture* d_parent;
+  /** reference to the statistics of parent */
+  SygusStatistics& d_stats;
   /** Term cache
    *
    * This stores a list of terms for a given sygus type. The key features of
@@ -68,8 +70,8 @@ class SygusEnumerator : public EnumValGenerator
    * natural number n, and redundancy criteria are used for discarding terms
    * that are not relevant. This includes discarding terms whose builtin version
    * is the same up to T-rewriting with another, or is equivalent under
-   * examples, if the conjecture in question is in PBE form and sygusSymBreakPbe
-   * is enabled.
+   * examples, if the conjecture in question is in examples form and
+   * sygusSymBreakPbe is enabled.
    *
    * This class also computes static information about sygus types that is
    * relevant for enumeration. Primarily, this includes mapping constructors
@@ -97,7 +99,8 @@ class SygusEnumerator : public EnumValGenerator
    public:
     TermCache();
     /** initialize this cache */
-    void initialize(Node e,
+    void initialize(SygusStatistics* s,
+                    Node e,
                     TypeNode tn,
                     TermDbSygus* tds,
                     SygusPbe* pbe = nullptr);
@@ -141,6 +144,8 @@ class SygusEnumerator : public EnumValGenerator
     void setComplete();
 
    private:
+    /** reference to the statistics of parent */
+    SygusStatistics* d_stats;
     /** the enumerator this cache is for */
     Node d_enum;
     /** the sygus type of terms in this cache */
index bee2e1d5652be5a67bf0c8e5a267c47af251e2a2..e8e7c0357217bcc11ece88fa52fc2c294a9d3107 100644 (file)
@@ -27,7 +27,11 @@ SygusStatistics::SygusStatistics()
       d_cegqi_si_lemmas("SynthEngine::cegqi_lemmas_si", 0),
       d_solutions("SynthConjecture::solutions", 0),
       d_filtered_solutions("SynthConjecture::filtered_solutions", 0),
-      d_candidate_rewrites_print("SynthConjecture::candidate_rewrites_print", 0)
+      d_candidate_rewrites_print("SynthConjecture::candidate_rewrites_print",
+                                 0),
+      d_enumTermsRewrite("SygusEnumerator::enumTermsRewrite", 0),
+      d_enumTermsExampleEval("SygusEnumerator::enumTermsEvalExamples", 0),
+      d_enumTerms("SygusEnumerator::enumTerms", 0)
 
 {
   smtStatisticsRegistry()->registerStat(&d_cegqi_lemmas_ce);
@@ -36,6 +40,9 @@ SygusStatistics::SygusStatistics()
   smtStatisticsRegistry()->registerStat(&d_solutions);
   smtStatisticsRegistry()->registerStat(&d_filtered_solutions);
   smtStatisticsRegistry()->registerStat(&d_candidate_rewrites_print);
+  smtStatisticsRegistry()->registerStat(&d_enumTermsRewrite);
+  smtStatisticsRegistry()->registerStat(&d_enumTermsExampleEval);
+  smtStatisticsRegistry()->registerStat(&d_enumTerms);
 }
 
 SygusStatistics::~SygusStatistics()
@@ -46,6 +53,9 @@ SygusStatistics::~SygusStatistics()
   smtStatisticsRegistry()->unregisterStat(&d_solutions);
   smtStatisticsRegistry()->unregisterStat(&d_filtered_solutions);
   smtStatisticsRegistry()->unregisterStat(&d_candidate_rewrites_print);
+  smtStatisticsRegistry()->unregisterStat(&d_enumTermsRewrite);
+  smtStatisticsRegistry()->unregisterStat(&d_enumTermsExampleEval);
+  smtStatisticsRegistry()->unregisterStat(&d_enumTerms);
 }
 
 }  // namespace quantifiers
index c4c7ba060eec327604c3163b5b570e4d26b1871c..80499f7a4a1295013f37740104ed9bbc54c156bb 100644 (file)
@@ -43,6 +43,12 @@ class SygusStatistics
   IntStat d_filtered_solutions;
   /** Number of candidate rewrites printed (for --sygus-rr) */
   IntStat d_candidate_rewrites_print;
+  /** Number of terms checked for rewrite-based symmetry in fast enumerators */
+  IntStat d_enumTermsRewrite;
+  /** Number of terms checked for example-based symmetry in fast enumerators */
+  IntStat d_enumTermsExampleEval;
+  /** Number of non-redundant terms generated by fast enumerators */
+  IntStat d_enumTerms;
 };
 
 }  // namespace quantifiers
index 73fc53d86fc495a8e761b818a327419efa203c34..b7c3851afec4e1df69c19e932472f15580b2a7cb 100644 (file)
@@ -813,7 +813,7 @@ Node SynthConjecture::getEnumeratedValue(Node e, bool& activeIncomplete)
                    == options::SygusActiveGenMode::ENUM
                || options::sygusActiveGenMode()
                       == options::SygusActiveGenMode::AUTO);
-        d_evg[e].reset(new SygusEnumerator(d_tds, this));
+        d_evg[e].reset(new SygusEnumerator(d_tds, this, d_stats));
       }
     }
     Trace("sygus-active-gen")