Towards standard usage of evaluator (#7189)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 22 Sep 2021 20:05:44 +0000 (15:05 -0500)
committerGitHub <noreply@github.com>
Wed, 22 Sep 2021 20:05:44 +0000 (20:05 +0000)
This makes the evaluator accessible via EnvObj through the Rewriter. It furthermore removes Rewriter::rewrite from inside the evaluator itself.

Construction of Evaluator utilities is now discouraged.

The include dependencies were cleaned slightly in this PR, leading to more precise includes throughout.

This is work towards having a configurable cardinality for strings, as well as eliminating SmtEngineScope.

44 files changed:
src/smt/env.cpp
src/smt/env.h
src/smt/env_obj.cpp
src/smt/env_obj.h
src/smt/proof_post_processor.cpp
src/theory/builtin/proof_checker.cpp
src/theory/datatypes/sygus_datatype_utils.cpp
src/theory/datatypes/sygus_extension.cpp
src/theory/datatypes/sygus_extension.h
src/theory/datatypes/sygus_simple_sym.cpp
src/theory/datatypes/theory_datatypes.cpp
src/theory/evaluator.cpp
src/theory/evaluator.h
src/theory/quantifiers/cegqi/ceg_instantiator.cpp
src/theory/quantifiers/cegqi/inst_strategy_cegqi.cpp
src/theory/quantifiers/ematching/inst_match_generator.cpp
src/theory/quantifiers/expr_miner_manager.cpp
src/theory/quantifiers/fmf/bounded_integers.cpp
src/theory/quantifiers/fun_def_evaluator.cpp
src/theory/quantifiers/fun_def_evaluator.h
src/theory/quantifiers/quant_bound_inference.cpp
src/theory/quantifiers/quant_conflict_find.cpp
src/theory/quantifiers/quantifiers_attributes.cpp
src/theory/quantifiers/skolemize.cpp
src/theory/quantifiers/solution_filter.cpp
src/theory/quantifiers/sygus/cegis.cpp
src/theory/quantifiers/sygus/cegis.h
src/theory/quantifiers/sygus/cegis_core_connective.cpp
src/theory/quantifiers/sygus/cegis_core_connective.h
src/theory/quantifiers/sygus/cegis_unif.cpp
src/theory/quantifiers/sygus/enum_value_manager.cpp
src/theory/quantifiers/sygus/rcons_type_info.cpp
src/theory/quantifiers/sygus/rcons_type_info.h
src/theory/quantifiers/sygus/sygus_enumerator.cpp
src/theory/quantifiers/sygus/sygus_grammar_cons.cpp
src/theory/quantifiers/sygus/sygus_unif_io.cpp
src/theory/quantifiers/sygus/term_database_sygus.cpp
src/theory/quantifiers/sygus/term_database_sygus.h
src/theory/quantifiers/sygus_sampler.cpp
src/theory/quantifiers/sygus_sampler.h
src/theory/rewriter.cpp
src/theory/rewriter.h
src/theory/rewriter_tables_template.h
test/unit/theory/evaluator_white.cpp

index f42a51dd02d4c464346670a3c93e850904d1f314..c77b8cfbacffb2b8b35a6b8c5020b4246257f017 100644 (file)
@@ -24,6 +24,7 @@
 #include "proof/conv_proof_generator.h"
 #include "smt/dump_manager.h"
 #include "smt/smt_engine_stats.h"
+#include "theory/evaluator.h"
 #include "theory/rewriter.h"
 #include "theory/trust_substitutions.h"
 #include "util/resource_manager.h"
@@ -39,6 +40,8 @@ Env::Env(NodeManager* nm, const Options* opts)
       d_nodeManager(nm),
       d_proofNodeManager(nullptr),
       d_rewriter(new theory::Rewriter()),
+      d_evalRew(new theory::Evaluator(d_rewriter.get())),
+      d_eval(new theory::Evaluator(nullptr)),
       d_topLevelSubs(new theory::TrustSubstitutionMap(d_userContext.get())),
       d_dumpManager(new DumpManager(d_userContext.get())),
       d_logic(),
@@ -132,4 +135,55 @@ const Printer& Env::getPrinter()
 
 std::ostream& Env::getDumpOut() { return *d_options.base.out; }
 
+Node Env::evaluate(TNode n,
+                   const std::vector<Node>& args,
+                   const std::vector<Node>& vals,
+                   bool useRewriter) const
+{
+  std::unordered_map<Node, Node> visited;
+  return evaluate(n, args, vals, visited, useRewriter);
+}
+
+Node Env::evaluate(TNode n,
+                   const std::vector<Node>& args,
+                   const std::vector<Node>& vals,
+                   const std::unordered_map<Node, Node>& visited,
+                   bool useRewriter) const
+{
+  if (useRewriter)
+  {
+    return d_evalRew->eval(n, args, vals, visited);
+  }
+  return d_eval->eval(n, args, vals, visited);
+}
+
+Node Env::rewriteViaMethod(TNode n, MethodId idr)
+{
+  if (idr == MethodId::RW_REWRITE)
+  {
+    return d_rewriter->rewrite(n);
+  }
+  if (idr == MethodId::RW_EXT_REWRITE)
+  {
+    return d_rewriter->extendedRewrite(n);
+  }
+  if (idr == MethodId::RW_REWRITE_EQ_EXT)
+  {
+    return d_rewriter->rewriteEqualityExt(n);
+  }
+  if (idr == MethodId::RW_EVALUATE)
+  {
+    return evaluate(n, {}, {}, false);
+  }
+  if (idr == MethodId::RW_IDENTITY)
+  {
+    // does nothing
+    return n;
+  }
+  // unknown rewriter
+  Unhandled() << "Env::rewriteViaMethod: no rewriter for " << idr
+              << std::endl;
+  return n;
+}
+
 }  // namespace cvc5
index d95e702264961f35a8972f2e9f8eb32309d3b57f..2f2fe19ce858f1d3d8caf7e576f153ef7401f817 100644 (file)
@@ -22,6 +22,7 @@
 #include <memory>
 
 #include "options/options.h"
+#include "proof/method_id.h"
 #include "theory/logic_info.h"
 #include "util/statistics_registry.h"
 
@@ -44,6 +45,7 @@ class PfManager;
 }
 
 namespace theory {
+class Evaluator;
 class Rewriter;
 class TrustSubstitutionMap;
 }
@@ -137,6 +139,39 @@ class Env
    */
   std::ostream& getDumpOut();
 
+  /* Rewrite helpers--------------------------------------------------------- */
+  /**
+   * Evaluate node n under the substitution args -> vals. For details, see
+   * theory/evaluator.h.
+   *
+   * @param n The node to evaluate
+   * @param args The domain of the substitution
+   * @param vals The range of the substitution
+   * @param useRewriter if true, we use this rewriter to rewrite subterms of
+   * n that cannot be evaluated to a constant.
+   * @return the rewritten, evaluated form of n under the given substitution.
+   */
+  Node evaluate(TNode n,
+                const std::vector<Node>& args,
+                const std::vector<Node>& vals,
+                bool useRewriter) const;
+  /** Same as above, with a visited cache. */
+  Node evaluate(TNode n,
+                const std::vector<Node>& args,
+                const std::vector<Node>& vals,
+                const std::unordered_map<Node, Node>& visited,
+                bool useRewriter = true) const;
+  /**
+   * Apply rewrite on n via the rewrite method identifier idr (see method_id.h).
+   * This encapsulates the exact behavior of a REWRITE step in a proof.
+   *
+   * @param n The node to rewrite,
+   * @param idr The method identifier of the rewriter, by default RW_REWRITE
+   * specifying a call to rewrite.
+   * @return The rewritten form of n.
+   */
+  Node rewriteViaMethod(TNode n, MethodId idr = MethodId::RW_REWRITE);
+
  private:
   /* Private initialization ------------------------------------------------- */
 
@@ -173,6 +208,10 @@ class Env
    * specific to an SmtEngine/TheoryEngine instance.
    */
   std::unique_ptr<theory::Rewriter> d_rewriter;
+  /** Evaluator that also invokes the rewriter */
+  std::unique_ptr<theory::Evaluator> d_evalRew;
+  /** Evaluator that does not invoke the rewriter */
+  std::unique_ptr<theory::Evaluator> d_eval;
   /** The top level substitutions */
   std::unique_ptr<theory::TrustSubstitutionMap> d_topLevelSubs;
   /** The dump manager */
index fcbcc92d2b1099c5721594112e5ef5755047f5a8..b9aebbe830931439180896fc9d4a20da4319ca01 100644 (file)
@@ -33,6 +33,21 @@ Node EnvObj::extendedRewrite(TNode node, bool aggr) const
 {
   return d_env.getRewriter()->extendedRewrite(node, aggr);
 }
+Node EnvObj::evaluate(TNode n,
+                      const std::vector<Node>& args,
+                      const std::vector<Node>& vals,
+                      bool useRewriter) const
+{
+  return d_env.evaluate(n, args, vals, useRewriter);
+}
+Node EnvObj::evaluate(TNode n,
+                      const std::vector<Node>& args,
+                      const std::vector<Node>& vals,
+                      const std::unordered_map<Node, Node>& visited,
+                      bool useRewriter) const
+{
+  return d_env.evaluate(n, args, vals, visited, useRewriter);
+}
 
 const LogicInfo& EnvObj::logicInfo() const { return d_env.getLogicInfo(); }
 
index ef9a82b17f2483259654529bc3ab3997287663d3..75b97fda9aea78eeeed60d268073ca69cb16bd49 100644 (file)
@@ -55,6 +55,20 @@ class EnvObj
    * This is a wrapper around theory::Rewriter::extendedRewrite via Env.
    */
   Node extendedRewrite(TNode node, bool aggr = true) const;
+  /**
+   * Evaluate node n under the substitution args -> vals.
+   * This is a wrapper about theory::Rewriter::evaluate via Env.
+   */
+  Node evaluate(TNode n,
+                const std::vector<Node>& args,
+                const std::vector<Node>& vals,
+                bool useRewriter = true) const;
+  /** Same as above, with a visited cache. */
+  Node evaluate(TNode n,
+                const std::vector<Node>& args,
+                const std::vector<Node>& vals,
+                const std::unordered_map<Node, Node>& visited,
+                bool useRewriter = true) const;
 
   /** Get the current logic information. */
   const LogicInfo& logicInfo() const;
index 3866c1e0e0e5df9e2bc27e007a11e69efc647942..f5db349e1675e4c11fba138f10837016ca3e1551 100644 (file)
@@ -478,8 +478,7 @@ Node ProofPostprocessCallback::expandMacros(PfRule id,
         rargs.push_back(args[3]);
       }
     }
-    Rewriter* rr = d_env.getRewriter();
-    Node tr = rr->rewriteViaMethod(ts, idr);
+    Node tr = d_env.rewriteViaMethod(ts, idr);
     Trace("smt-proof-pp-debug")
         << "...eq intro rewrite equality is " << ts << " == " << tr << ", from "
         << idr << std::endl;
@@ -954,7 +953,7 @@ Node ProofPostprocessCallback::expandMacros(PfRule id,
       getMethodId(args[1], idr);
     }
     Rewriter* rr = d_env.getRewriter();
-    Node ret = rr->rewriteViaMethod(args[0], idr);
+    Node ret = d_env.rewriteViaMethod(args[0], idr);
     Node eq = args[0].eqNode(ret);
     if (idr == MethodId::RW_REWRITE || idr == MethodId::RW_REWRITE_EQ_EXT)
     {
index d71b3635b900291965598c7f4f3531066c993a87..1309a05f948d7e179519a05e9c87251b5dd0c38b 100644 (file)
 #include "expr/skolem_manager.h"
 #include "smt/env.h"
 #include "smt/term_formula_removal.h"
-#include "theory/evaluator.h"
 #include "theory/rewriter.h"
 #include "theory/substitutions.h"
 #include "theory/theory.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
@@ -67,7 +67,7 @@ Node BuiltinProofRuleChecker::applySubstitutionRewrite(
     MethodId idr)
 {
   Node nks = applySubstitution(n, exp, ids, ida);
-  return d_env.getRewriter()->rewriteViaMethod(nks, idr);
+  return d_env.rewriteViaMethod(nks, idr);
 }
 
 bool BuiltinProofRuleChecker::getSubstitutionForLit(Node exp,
@@ -249,7 +249,7 @@ Node BuiltinProofRuleChecker::checkInternal(PfRule id,
     {
       return Node::null();
     }
-    Node res = d_env.getRewriter()->rewriteViaMethod(args[0], idr);
+    Node res = d_env.rewriteViaMethod(args[0], idr);
     if (res.isNull())
     {
       return Node::null();
@@ -260,7 +260,7 @@ Node BuiltinProofRuleChecker::checkInternal(PfRule id,
   {
     Assert(children.empty());
     Assert(args.size() == 1);
-    Node res = d_env.getRewriter()->rewriteViaMethod(args[0], MethodId::RW_EVALUATE);
+    Node res = d_env.rewriteViaMethod(args[0], MethodId::RW_EVALUATE);
     if (res.isNull())
     {
       return Node::null();
@@ -302,7 +302,7 @@ Node BuiltinProofRuleChecker::checkInternal(PfRule id,
                              << SkolemManager::getOriginalForm(res) << std::endl;
     // **** NOTE: can rewrite the witness form here. This enables certain lemmas
     // to be provable, e.g. (= k t) where k is a purification Skolem for t.
-    res = Rewriter::rewrite(SkolemManager::getOriginalForm(res));
+    res = d_env.getRewriter()->rewrite(SkolemManager::getOriginalForm(res));
     if (!res.isConst() || !res.getConst<bool>())
     {
       Trace("builtin-pfcheck")
@@ -349,8 +349,8 @@ Node BuiltinProofRuleChecker::checkInternal(PfRule id,
     if (res1 != res2)
     {
       // can rewrite the witness forms
-      res1 = Rewriter::rewrite(SkolemManager::getOriginalForm(res1));
-      res2 = Rewriter::rewrite(SkolemManager::getOriginalForm(res2));
+      res1 = d_env.getRewriter()->rewrite(SkolemManager::getOriginalForm(res1));
+      res2 = d_env.getRewriter()->rewrite(SkolemManager::getOriginalForm(res2));
       if (res1.isNull() || res1 != res2)
       {
         Trace("builtin-pfcheck") << "Failed to match results" << std::endl;
index f1f7b45a414444418f1a183653bf4bb636346e0c..12c255f5770ee0499a8ee250cb80f8491a791231 100644 (file)
@@ -391,7 +391,7 @@ Node sygusToBuiltin(Node n, bool isExternal)
 Node sygusToBuiltinEval(Node n, const std::vector<Node>& args)
 {
   NodeManager* nm = NodeManager::currentNM();
-  Evaluator eval;
+  Evaluator eval(nullptr);
   // constant arguments?
   bool constArgs = true;
   for (const Node& a : args)
index 2411013b28c21ef17dafbaafa5a33dc44bae53e8..d666cdac53a9358012c746d56fb2f62160591231 100644 (file)
@@ -35,6 +35,7 @@
 #include "theory/rewriter.h"
 #include "theory/theory_model.h"
 #include "theory/theory_state.h"
+#include "util/rational.h"
 
 using namespace cvc5;
 using namespace cvc5::kind;
@@ -1101,16 +1102,20 @@ Node SygusExtension::registerSearchValue(Node a,
         if (bv != bvr)
         {
           // add to the sampler database object
-          std::map<TypeNode, quantifiers::SygusSampler>::iterator its =
-              d_sampler[a].find(tn);
-          if (its == d_sampler[a].end())
+          std::map<TypeNode, std::unique_ptr<quantifiers::SygusSampler>>& smap =
+              d_sampler[a];
+          std::map<TypeNode,
+                   std::unique_ptr<quantifiers::SygusSampler>>::iterator its =
+              smap.find(tn);
+          if (its == smap.end())
           {
-            d_sampler[a][tn].initializeSygus(
+            smap[tn].reset(new quantifiers::SygusSampler(d_env));
+            smap[tn]->initializeSygus(
                 d_tds, nv, options::sygusSamples(), false);
             its = d_sampler[a].find(tn);
           }
           // check equivalent
-          its->second.checkEquivalent(bv, bvr, *options().base.out);
+          its->second->checkEquivalent(bv, bvr, *options().base.out);
         }
       }
 
index c7a9e7893bf848604d1f8bb703cf4eace8040515..2fd0110b4aab0281642fd85680432050000813b4 100644 (file)
@@ -289,7 +289,8 @@ private:
    * This is used for the sygusRewVerify() option to verify the correctness of
    * the rewriter.
    */
-  std::map<Node, std::map<TypeNode, quantifiers::SygusSampler>> d_sampler;
+  std::map<Node, std::map<TypeNode, std::unique_ptr<quantifiers::SygusSampler>>>
+      d_sampler;
   /** Assert tester internal
    *
    * This function is called when the tester with index tindex is asserted for
index 36dfc710b70e821caededcf29874237aa51d4ead..63e60a4786c14eb0de146b0214e912d133a03d67 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "expr/dtype_cons.h"
 #include "theory/quantifiers/term_util.h"
+#include "util/rational.h"
 
 using namespace std;
 using namespace cvc5::kind;
index 4a8976876d383bb50b4dd316eea7900df6be3c0c..427e0251ff2f9a145d118bea1d07437edb3dc57e 100644 (file)
@@ -22,6 +22,7 @@
 #include "expr/dtype_cons.h"
 #include "expr/kind.h"
 #include "expr/skolem_manager.h"
+#include "expr/uninterpreted_constant.h"
 #include "options/datatypes_options.h"
 #include "options/quantifiers_options.h"
 #include "options/smt_options.h"
@@ -38,6 +39,7 @@
 #include "theory/theory_state.h"
 #include "theory/type_enumerator.h"
 #include "theory/valuation.h"
+#include "util/rational.h"
 
 using namespace std;
 using namespace cvc5::kind;
index 2a274426fe65b6776bd01e313ed09a66cc4220fe..75c8780651ce55e9a18674a22c2d6c4c37592625 100644 (file)
@@ -127,19 +127,22 @@ Node EvalResult::toNode() const
   }
 }
 
+Evaluator::Evaluator(Rewriter* rr)
+    : d_rr(rr), d_alphaCard(strings::utils::getAlphabetCardinality())
+{
+}
+
 Node Evaluator::eval(TNode n,
                      const std::vector<Node>& args,
-                     const std::vector<Node>& vals,
-                     bool useRewriter) const
+                     const std::vector<Node>& vals) const
 {
   std::unordered_map<Node, Node> visited;
-  return eval(n, args, vals, visited, useRewriter);
+  return eval(n, args, vals, visited);
 }
 Node Evaluator::eval(TNode n,
                      const std::vector<Node>& args,
                      const std::vector<Node>& vals,
-                     const std::unordered_map<Node, Node>& visited,
-                     bool useRewriter) const
+                     const std::unordered_map<Node, Node>& visited) const
 {
   Trace("evaluator") << "Evaluating " << n << " under substitution " << args
                      << " " << vals << " with visited size = " << visited.size()
@@ -150,36 +153,36 @@ Node Evaluator::eval(TNode n,
   for (const std::pair<const Node, Node>& p : visited)
   {
     Trace("evaluator") << "Add " << p.first << " == " << p.second << std::endl;
-    results[p.first] = evalInternal(p.second, args, vals, evalAsNode, results, useRewriter);
+    results[p.first] = evalInternal(p.second, args, vals, evalAsNode, results);
     if (results[p.first].d_tag == EvalResult::INVALID)
     {
       // could not evaluate, use the evalAsNode map
       std::unordered_map<TNode, Node>::iterator itn = evalAsNode.find(p.second);
       Assert(itn != evalAsNode.end());
       Node val = itn->second;
-      if (useRewriter)
+      if (d_rr != nullptr)
       {
-        val = Rewriter::rewrite(val);
+        val = d_rr->rewrite(val);
       }
       evalAsNode[p.first] = val;
     }
   }
   Trace("evaluator") << "Run eval internal..." << std::endl;
-  Node ret = evalInternal(n, args, vals, evalAsNode, results, useRewriter).toNode();
+  Node ret = evalInternal(n, args, vals, evalAsNode, results).toNode();
   // if we failed to evaluate
-  if (ret.isNull() && useRewriter)
+  if (ret.isNull() && d_rr != nullptr)
   {
     // should be stored in the evaluation-as-node map
     std::unordered_map<TNode, Node>::iterator itn = evalAsNode.find(n);
     Assert(itn != evalAsNode.end());
-    ret = Rewriter::rewrite(itn->second);
+    ret = d_rr->rewrite(itn->second);
   }
   // should be the same as substitution + rewriting, or possibly null if
-  // useRewriter is false
-  Assert((ret.isNull() && !useRewriter)
+  // d_rr is nullptr
+  Assert((ret.isNull() && d_rr == nullptr)
          || ret
-                == Rewriter::rewrite(n.substitute(
-                       args.begin(), args.end(), vals.begin(), vals.end())));
+                == d_rr->rewrite(n.substitute(
+                    args.begin(), args.end(), vals.begin(), vals.end())));
   return ret;
 }
 
@@ -188,8 +191,7 @@ EvalResult Evaluator::evalInternal(
     const std::vector<Node>& args,
     const std::vector<Node>& vals,
     std::unordered_map<TNode, Node>& evalAsNode,
-    std::unordered_map<TNode, EvalResult>& results,
-    bool useRewriter) const
+    std::unordered_map<TNode, EvalResult>& results) const
 {
   std::vector<TNode> queue;
   queue.emplace_back(n);
@@ -290,11 +292,11 @@ EvalResult Evaluator::evalInternal(
           // successfully evaluated, and the children that did not.
           Trace("evaluator") << "Evaluator: collect arguments" << std::endl;
           currNodeVal = reconstruct(currNodeVal, results, evalAsNode);
-          if (useRewriter)
+          if (d_rr != nullptr)
           {
             // Rewrite the result now, if we use the rewriter. We will see below
             // if we are able to turn it into a valid EvalResult.
-            currNodeVal = Rewriter::rewrite(currNodeVal);
+            currNodeVal = d_rr->rewrite(currNodeVal);
           }
         }
         needsReconstruct = false;
@@ -360,12 +362,8 @@ EvalResult Evaluator::evalInternal(
           // evalAsNodeC but favor avoiding this copy for performance reasons.
           std::unordered_map<TNode, Node> evalAsNodeC;
           std::unordered_map<TNode, EvalResult> resultsC;
-          results[currNode] = evalInternal(op[1],
-                                           lambdaArgs,
-                                           lambdaVals,
-                                           evalAsNodeC,
-                                           resultsC,
-                                           useRewriter);
+          results[currNode] = evalInternal(
+              op[1], lambdaArgs, lambdaVals, evalAsNodeC, resultsC);
           Trace("evaluator") << "Evaluated via arguments to "
                              << results[currNode].d_tag << std::endl;
           if (results[currNode].d_tag == EvalResult::INVALID)
@@ -676,7 +674,7 @@ EvalResult Evaluator::evalInternal(
         case kind::STRING_FROM_CODE:
         {
           Integer i = results[currNode[0]].d_rat.getNumerator();
-          if (i >= 0 && i < strings::utils::getAlphabetCardinality())
+          if (i >= 0 && i < d_alphaCard)
           {
             std::vector<unsigned> svec = {i.toUnsignedInt()};
             results[currNode] = EvalResult(String(svec));
index 42cc347491344f0b615825c35a83da0c79b9d972..2e96952b8ff05ebe8d477c868741cfd2ca1b34ae 100644 (file)
@@ -80,6 +80,8 @@ struct EvalResult
   Node toNode() const;
 };
 
+class Rewriter;
+
 /**
  * The class that performs the actual evaluation of a term under a
  * substitution. Right now, the class does not cache anything between different
@@ -88,6 +90,7 @@ struct EvalResult
 class Evaluator
 {
  public:
+  Evaluator(Rewriter* rr);
   /**
    * Evaluates node `n` under the substitution described by the variable names
    * `args` and the corresponding values `vals`. This method uses evaluation
@@ -103,22 +106,20 @@ class Evaluator
    * The result of this call is either equivalent to:
    * (1) Rewriter::rewrite(n.substitute(args,vars))
    * (2) Node::null().
-   * If useRewriter is true, then we are always in the first case. If
-   * useRewriter is false, then we may be in case (2) if computing the
+   * If d_rr is non-null, then we are always in the first case. If
+   * useRewriter is null, then we may be in case (2) if computing the
    * rewritten, substituted form of n could not be determined by evaluation.
    */
   Node eval(TNode n,
             const std::vector<Node>& args,
-            const std::vector<Node>& vals,
-            bool useRewriter = true) const;
+            const std::vector<Node>& vals) const;
   /**
    * Same as above, but with a precomputed visited map.
    */
   Node eval(TNode n,
             const std::vector<Node>& args,
             const std::vector<Node>& vals,
-            const std::unordered_map<Node, Node>& visited,
-            bool useRewriter = true) const;
+            const std::unordered_map<Node, Node>& visited) const;
 
  private:
   /**
@@ -141,8 +142,7 @@ class Evaluator
                           const std::vector<Node>& args,
                           const std::vector<Node>& vals,
                           std::unordered_map<TNode, Node>& evalAsNode,
-                          std::unordered_map<TNode, EvalResult>& results,
-                          bool useRewriter) const;
+                          std::unordered_map<TNode, EvalResult>& results) const;
   /** reconstruct
    *
    * This function reconstructs the result of evaluating n using a combination
@@ -155,6 +155,10 @@ class Evaluator
   Node reconstruct(TNode n,
                    std::unordered_map<TNode, EvalResult>& eresults,
                    std::unordered_map<TNode, Node>& evalAsNode) const;
+  /** The (optional) rewriter to be used */
+  Rewriter* d_rr;
+  /** The cardinality of the alphabet of strings */
+  uint32_t d_alphaCard;
 };
 
 }  // namespace theory
index 88da629a0a63679a31d03cb3990cc329e8ddafc3..4b06589b300303302910a4ff9445313183c373c0 100644 (file)
 
 #include "theory/quantifiers/cegqi/ceg_instantiator.h"
 
-#include "theory/quantifiers/cegqi/ceg_arith_instantiator.h"
-#include "theory/quantifiers/cegqi/ceg_bv_instantiator.h"
-#include "theory/quantifiers/cegqi/ceg_dt_instantiator.h"
-
 #include "expr/dtype.h"
 #include "expr/dtype_cons.h"
 #include "expr/node_algorithm.h"
 #include "options/quantifiers_options.h"
 #include "theory/arith/arith_msum.h"
+#include "theory/quantifiers/cegqi/ceg_arith_instantiator.h"
+#include "theory/quantifiers/cegqi/ceg_bv_instantiator.h"
+#include "theory/quantifiers/cegqi/ceg_dt_instantiator.h"
 #include "theory/quantifiers/cegqi/inst_strategy_cegqi.h"
 #include "theory/quantifiers/first_order_model.h"
 #include "theory/quantifiers/quantifiers_attributes.h"
@@ -31,6 +30,7 @@
 #include "theory/quantifiers/term_database.h"
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace std;
 using namespace cvc5::kind;
index 1ccfd8ede0ad0f2b352ee37510558e6bd0c1bf48..04fa1d2fe1b947b1afe5574bf5f7b6249796938c 100644 (file)
@@ -25,6 +25,7 @@
 #include "theory/quantifiers/term_registry.h"
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace std;
 using namespace cvc5::kind;
index 5380fc7d5f21b32afb6753625c13ba292159e7ec..d8e3b79500641444c4772fc86f3b3c2229ee2cec 100644 (file)
@@ -29,6 +29,7 @@
 #include "theory/quantifiers/term_database.h"
 #include "theory/quantifiers/term_registry.h"
 #include "theory/quantifiers/term_util.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
index 8af456ea8177aef732f5fdb5b84ea98b4afdd739..e53fd9424794558e3ec14dcbcd55b361fecb3c77 100644 (file)
@@ -16,6 +16,7 @@
 #include "theory/quantifiers/expr_miner_manager.h"
 
 #include "options/quantifiers_options.h"
+#include "smt/env.h"
 
 namespace cvc5 {
 namespace theory {
@@ -33,7 +34,8 @@ ExpressionMinerManager::ExpressionMinerManager(Env& env)
             options::sygusRewSynthAccel(),
             false),
       d_qg(env),
-      d_sols(env)
+      d_sols(env),
+      d_sampler(env)
 {
 }
 
index 4a3e13dd05b405ff6b07e54fd37e389da237fe12..44352c6febf69a12a469fcbe3ee4bb72efc40c4c 100644 (file)
@@ -29,6 +29,7 @@
 #include "theory/quantifiers/term_enumeration.h"
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace cvc5;
 using namespace std;
index 36f557db80d495ecdb3223ba2ccaa6f0ab0d5dab..78a09641b7f81b58e31dc8463c4f3888fc4510d5 100644 (file)
@@ -26,7 +26,7 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-FunDefEvaluator::FunDefEvaluator() {}
+FunDefEvaluator::FunDefEvaluator(Env& env) : EnvObj(env) {}
 
 void FunDefEvaluator::assertDefinition(Node q)
 {
@@ -51,11 +51,11 @@ void FunDefEvaluator::assertDefinition(Node q)
                    << fdi.d_args << " / " << fdi.d_body << std::endl;
 }
 
-Node FunDefEvaluator::evaluate(Node n) const
+Node FunDefEvaluator::evaluateDefinitions(Node n) const
 {
   // should do standard rewrite before this call
   Assert(Rewriter::rewrite(n) == n);
-  Trace("fd-eval") << "FunDefEvaluator: evaluate " << n << std::endl;
+  Trace("fd-eval") << "FunDefEvaluator: evaluateDefinitions " << n << std::endl;
   NodeManager* nm = NodeManager::currentNM();
   std::unordered_map<TNode, unsigned> funDefCount;
   std::unordered_map<TNode, unsigned>::iterator itCount;
@@ -185,7 +185,7 @@ Node FunDefEvaluator::evaluate(Node n) const
           if (!args.empty())
           {
             // invoke it on arguments using the evaluator
-            sbody = d_eval.eval(sbody, args, children);
+            sbody = evaluate(sbody, args, children);
             if (Trace.isOn("fd-eval-debug2"))
             {
               Trace("fd-eval-debug2")
index a3b79bec7c674f9bb5dde132350480b21dd67d21..c8e8119687f509c0c220dbccb7f28879de33b881 100644 (file)
@@ -20,8 +20,9 @@
 
 #include <map>
 #include <vector>
+
 #include "expr/node.h"
-#include "theory/evaluator.h"
+#include "smt/env_obj.h"
 
 namespace cvc5 {
 namespace theory {
@@ -30,10 +31,10 @@ namespace quantifiers {
 /**
  * Techniques for evaluating recursively defined functions.
  */
-class FunDefEvaluator
+class FunDefEvaluator : protected EnvObj
 {
  public:
-  FunDefEvaluator();
+  FunDefEvaluator(Env& env);
   ~FunDefEvaluator() {}
   /**
    * Assert definition of a (recursive) function definition given by quantified
@@ -45,7 +46,7 @@ class FunDefEvaluator
    * class. If n cannot be simplified to a constant, then this method returns
    * null.
    */
-  Node evaluate(Node n) const;
+  Node evaluateDefinitions(Node n) const;
   /**
    * Has a call to assertDefinition been made? If this returns false, then
    * the evaluate method is the same as calling the rewriter, and returning
@@ -74,8 +75,6 @@ class FunDefEvaluator
   std::map<Node, FunDefInfo> d_funDefMap;
   /** list of all definitions */
   std::vector<Node> d_funDefs;
-  /** evaluator utility */
-  Evaluator d_eval;
 };
 
 }  // namespace quantifiers
index a78f66c5101477f48383c09fbce8e750ec875355..83e48bf9cdb845027d16594b2e29accc998bf7c9 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "theory/quantifiers/fmf/bounded_integers.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
index 1de60422fa8b8698e789bd12eade434123f23386..b26b6501851eb1d90711ed8ec01c90e860f8310b 100644 (file)
@@ -28,6 +28,7 @@
 #include "theory/quantifiers/term_database.h"
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 using namespace std;
index deed1c7611f3ea5bba08b20ac9c7aa865fce3ac8..1a0e03bfcc71ab2478d7680d00c4a24d91af4679 100644 (file)
@@ -19,6 +19,8 @@
 #include "theory/arith/arith_msum.h"
 #include "theory/quantifiers/sygus/synth_engine.h"
 #include "theory/quantifiers/term_util.h"
+#include "util/rational.h"
+#include "util/string.h"
 
 using namespace std;
 using namespace cvc5::kind;
index bb0fa389980be555fa5c15b0492962a1da1d575b..a34547f453a372bad8c8a27c5d835e355d66ceca 100644 (file)
@@ -28,6 +28,7 @@
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
 #include "theory/sort_inference.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
index 8844950c78b6f77a769dd1bd72998dd68c0cb6b6..19bfcab66a8151d7f79999e9da23039b09174d1b 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "options/base_options.h"
 #include "options/quantifiers_options.h"
+#include "smt/env.h"
 #include "util/random.h"
 
 using namespace cvc5::kind;
index f5774c76196f629d77bc618731ba0a1fb7ac5605..d9e4b61af2693ad7302dd4ddf0fcebae6e8b251c 100644 (file)
@@ -39,6 +39,7 @@ Cegis::Cegis(Env& env,
              SynthConjecture* p)
     : SygusModule(env, qs, qim, tds, p),
       d_eval_unfold(tds->getEvalUnfold()),
+      d_cegis_sampler(env),
       d_usingSymCons(false)
 {
 }
@@ -594,7 +595,6 @@ bool Cegis::checkRefinementEvalLemmas(const std::vector<Node>& vs,
     }
   }
 
-  Evaluator* eval = d_tds->getEvaluator();
   for (unsigned r = 0; r < 2; r++)
   {
     std::unordered_set<Node>& rlemmas =
@@ -603,7 +603,7 @@ bool Cegis::checkRefinementEvalLemmas(const std::vector<Node>& vs,
     {
       // We may have computed the evaluation of some function applications
       // via example-based symmetry breaking, stored in evalVisited.
-      Node lemcsu = eval->eval(lem, vs, ms, evalVisited);
+      Node lemcsu = evaluate(lem, vs, ms, evalVisited);
       if (lemcsu.isConst() && !lemcsu.getConst<bool>())
       {
         return true;
index d728059509036b6db698dbe0a94923e1fff1698d..8e0fffdd1319fc03580387741fd3d71635f4d100 100644 (file)
@@ -28,6 +28,8 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
+class SygusEvalUnfold;
+
 /** Cegis
  *
  * The default sygus module for synthesis, counterexample-guided inductive
index a4232322790cf379376fb0bbaf5a7c65bbdc75ab..b9066b079ff8a9c319c947f3eb1ab3388aa5f163 100644 (file)
@@ -311,7 +311,7 @@ bool CegisCoreConnective::constructSolution(
   Assert(candidates.size() == 1 && candidates[0] == d_candidate);
   TNode cval = candidate_values[0];
   Node ets = d_eterm.substitute(d_candidate, cval);
-  Node etsr = Rewriter::rewrite(ets);
+  Node etsr = rewrite(ets);
   Trace("sygus-ccore-debug") << "...predicate is: " << etsr << std::endl;
   NodeManager* nm = NodeManager::currentNM();
   for (unsigned d = 0; d < 2; d++)
@@ -476,7 +476,7 @@ Node CegisCoreConnective::Component::getRefinementPt(
         visited.insert(id);
         Trace("sygus-ccore-ref") << "...eval " << std::endl;
         // check if it is true
-        Node en = p->evaluate(n, id, ctx);
+        Node en = p->evaluatePt(n, id, ctx);
         if (en.isConst() && en.getConst<bool>())
         {
           ss = ctx;
@@ -553,7 +553,7 @@ bool CegisCoreConnective::Component::addToAsserts(CegisCoreConnective* p,
     for (unsigned i = currIndex, psize = passerts.size(); i < psize; i++)
     {
       Node cn = passerts[i];
-      Node cne = p->evaluate(cn, mvId, mvs);
+      Node cne = p->evaluatePt(cn, mvId, mvs);
       if (cne.isConst() && !cne.getConst<bool>())
       {
         n = cn;
@@ -635,9 +635,9 @@ Result CegisCoreConnective::checkSat(Node n, std::vector<Node>& mvs) const
   return r;
 }
 
-Node CegisCoreConnective::evaluate(Node n,
-                                   Node id,
-                                   const std::vector<Node>& mvs)
+Node CegisCoreConnective::evaluatePt(Node n,
+                                     Node id,
+                                     const std::vector<Node>& mvs)
 {
   Kind nk = n.getKind();
   if (nk == AND || nk == OR)
@@ -647,7 +647,7 @@ Node CegisCoreConnective::evaluate(Node n,
     // split AND/OR
     for (const Node& nc : n)
     {
-      Node enc = evaluate(nc, id, mvs);
+      Node enc = evaluatePt(nc, id, mvs);
       Assert(enc.isConst());
       if (enc.getConst<bool>() == expRes)
       {
@@ -666,12 +666,8 @@ Node CegisCoreConnective::evaluate(Node n,
     }
   }
   // use evaluator
-  Node cn = d_eval.eval(n, d_vars, mvs);
-  if (cn.isNull())
-  {
-    cn = n.substitute(d_vars.begin(), d_vars.end(), mvs.begin(), mvs.end());
-    cn = Rewriter::rewrite(cn);
-  }
+  Node cn = evaluate(n, d_vars, mvs);
+  Assert(!cn.isNull());
   if (!id.isNull())
   {
     ec[id] = cn;
@@ -844,7 +840,7 @@ Node CegisCoreConnective::constructSolutionFromPool(Component& ccheck,
       mvs.clear();
       getModel(*checkSol, mvs);
       // should evaluate to true
-      Node ean = evaluate(an, Node::null(), mvs);
+      Node ean = evaluatePt(an, Node::null(), mvs);
       Assert(ean.isConst() && ean.getConst<bool>());
       Trace("sygus-ccore") << "--- Add refinement point " << mvs << std::endl;
       // In terms of Variant #2, this is the line:
index 80ba6f26e14b0436d986993268119380ebee8d1e..ebcd871aa52cbaec1e5bb91a6ed980b9bec8b578 100644 (file)
@@ -23,7 +23,6 @@
 #include "expr/node.h"
 #include "expr/node_trie.h"
 #include "smt/env_obj.h"
-#include "theory/evaluator.h"
 #include "theory/quantifiers/sygus/cegis.h"
 #include "util/result.h"
 
@@ -365,11 +364,9 @@ class CegisCoreConnective : public Cegis
    * If id is non-null, then id is a unique identifier for mvs, and we cache
    * the result of n for this point.
    */
-  Node evaluate(Node n, Node id, const std::vector<Node>& mvs);
+  Node evaluatePt(Node n, Node id, const std::vector<Node>& mvs);
   /** A cache of the above function */
   std::unordered_map<Node, std::unordered_map<Node, Node>> d_eval_cache;
-  /** The evaluator utility used for the above function */
-  Evaluator d_eval;
   //-----------------------------------end for evaluation
 
   /** Construct solution from pool
index 6b260bb81db8fb76d284d78dd0f29df8eed13b4d..42306383ba1389474aa040a7f3e82cc9603093ef 100644 (file)
@@ -23,6 +23,7 @@
 #include "theory/quantifiers/sygus/sygus_unif_rl.h"
 #include "theory/quantifiers/sygus/synth_conjecture.h"
 #include "theory/quantifiers/sygus/term_database_sygus.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
index e7b3bbaa995abb70d91fc66011bfe353f72b2592..937537ce9292b4fda97f80b2c56b9922d0ec372b 100644 (file)
@@ -106,7 +106,7 @@ Node EnumValueManager::getEnumeratedValue(bool& activeIncomplete)
           std::ostream* out = nullptr;
           if (options::sygusRewVerify())
           {
-            d_samplerRrV.reset(new SygusSampler);
+            d_samplerRrV.reset(new SygusSampler(d_env));
             d_samplerRrV->initializeSygus(
                 d_tds, e, options::sygusSamples(), false);
             // use the default output for the output of sygusRewVerify
index 78f8d303c206805cd7c5def78e3f583ce7ee4421..72a8e6a56ce74e0d88e18ebe1000b35b336615fd 100644 (file)
 #include "theory/quantifiers/sygus/rcons_type_info.h"
 
 #include "expr/skolem_manager.h"
+#include "smt/env.h"
 #include "theory/datatypes/sygus_datatype_utils.h"
 #include "theory/quantifiers/sygus/rcons_obligation.h"
+#include "theory/quantifiers/sygus_sampler.h"
 
 namespace cvc5 {
 namespace theory {
@@ -37,8 +39,9 @@ void RConsTypeInfo::initialize(Env& env,
   d_crd.reset(new CandidateRewriteDatabase(env, true, false, true, false));
   // since initial samples are not always useful for equivalence checks, set
   // their number to 0
-  d_sygusSampler.initialize(stn, builtinVars, 0);
-  d_crd->initialize(builtinVars, &d_sygusSampler);
+  d_sygusSampler.reset(new SygusSampler(env));
+  d_sygusSampler->initialize(stn, builtinVars, 0);
+  d_crd->initialize(builtinVars, d_sygusSampler.get());
 }
 
 Node RConsTypeInfo::nextEnum()
index 294454fe2f0f6e30ddfc53a55681d625975ac815..5f68993ad2afe8b84c07435298f2f1aa342c55f8 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "theory/quantifiers/candidate_rewrite_database.h"
 #include "theory/quantifiers/sygus/sygus_enumerator.h"
-#include "theory/quantifiers/sygus_sampler.h"
 
 namespace cvc5 {
 namespace theory {
@@ -28,6 +27,7 @@ namespace quantifiers {
 
 class RConsObligation;
 class CandidateRewriteDatabase;
+class SygusSampler;
 
 /**
  * A utility class for Sygus Reconstruct datatype types (grammar non-terminals).
@@ -93,7 +93,7 @@ class RConsTypeInfo
   /** Candidate rewrite database for this class' sygus datatype type */
   std::unique_ptr<CandidateRewriteDatabase> d_crd;
   /** Sygus sampler needed for initializing the candidate rewrite database */
-  SygusSampler d_sygusSampler;
+  std::unique_ptr<SygusSampler> d_sygusSampler;
   /** A map from a builtin term to its obligation.
    *
    * Each sygus datatype type has its own version of this map because it is
index fca09c43db7045ba6abc821e5f2515f15f1a222c..959532d9848f19241016b4e974f7a7228e85e921 100644 (file)
@@ -25,6 +25,7 @@
 #include "theory/quantifiers/sygus/synth_engine.h"
 #include "theory/quantifiers/sygus/type_node_id_trie.h"
 #include "theory/rewriter.h"
+#include "util/rational.h"
 
 using namespace cvc5::kind;
 
index 7072b77e1e711f3fab8fd67f820c75da5704b8a3..43c958ff90c604fea24247a1045df45664bdb794 100644 (file)
@@ -32,6 +32,7 @@
 #include "theory/rewriter.h"
 #include "theory/strings/word.h"
 #include "util/floatingpoint.h"
+#include "util/string.h"
 
 using namespace cvc5::kind;
 
index 3fb80f917fa944ef822739b91b7a582d0e0cda73..e703569d947ae2b94fd67ff125ec3b393a79b231 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "options/quantifiers_options.h"
 #include "theory/datatypes/sygus_datatype_utils.h"
-#include "theory/evaluator.h"
 #include "theory/quantifiers/sygus/example_infer.h"
 #include "theory/quantifiers/sygus/synth_conjecture.h"
 #include "theory/quantifiers/sygus/term_database_sygus.h"
index 035db433eaa597d4c121084f73ef8b554c5b4c28..2e528b213bfee3a0f1e5936ff08f67eef6494b87 100644 (file)
@@ -55,8 +55,7 @@ TermDbSygus::TermDbSygus(Env& env, QuantifiersState& qs)
     : EnvObj(env),
       d_qstate(qs),
       d_syexp(new SygusExplain(this)),
-      d_eval(new Evaluator),
-      d_funDefEval(new FunDefEvaluator),
+      d_funDefEval(new FunDefEvaluator(env)),
       d_eval_unfold(new SygusEvalUnfold(this))
 {
   d_true = NodeManager::currentNM()->mkConst( true );
@@ -759,7 +758,7 @@ Node TermDbSygus::rewriteNode(Node n) const
     {
       // If recursive functions are enabled, then we use the recursive function
       // evaluation utility.
-      Node fres = d_funDefEval->evaluate(res);
+      Node fres = d_funDefEval->evaluateDefinitions(res);
       if (!fres.isNull())
       {
         return fres;
@@ -996,7 +995,7 @@ Node TermDbSygus::evaluateBuiltin(TypeNode tn,
     // This may fail if there is a subterm of bn under the
     // substitution that is not constant, or if an operator in bn is not
     // supported by the evaluator
-    res = d_eval->eval(bn, varlist, args);
+    res = evaluate(bn, varlist, args);
   }
   if (res.isNull())
   {
index 7b05c70e410da2f6c4f13e556af914fa65ba4d64..59e0f4776775b5925ed1cfad91c59a42935bc74f 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "expr/dtype.h"
 #include "smt/env_obj.h"
-#include "theory/evaluator.h"
 #include "theory/quantifiers/extended_rewrite.h"
 #include "theory/quantifiers/fun_def_evaluator.h"
 #include "theory/quantifiers/sygus/sygus_eval_unfold.h"
@@ -80,8 +79,6 @@ class TermDbSygus : protected EnvObj
   //------------------------------utilities
   /** get the explanation utility */
   SygusExplain* getExplain() { return d_syexp.get(); }
-  /** get the evaluator */
-  Evaluator* getEvaluator() { return d_eval.get(); }
   /** (recursive) function evaluator utility */
   FunDefEvaluator* getFunDefEvaluator() { return d_funDefEval.get(); }
   /** evaluation unfolding utility */
@@ -309,8 +306,6 @@ class TermDbSygus : protected EnvObj
   //------------------------------utilities
   /** sygus explanation */
   std::unique_ptr<SygusExplain> d_syexp;
-  /** evaluator */
-  std::unique_ptr<Evaluator> d_eval;
   /** (recursive) function evaluator utility */
   std::unique_ptr<FunDefEvaluator> d_funDefEval;
   /** evaluation function unfolding utility */
index 0cbc4df5b23ea86baa4912bbc3b9c248031b4780..08fab59ebbe40693bb734b8b916f5c23f90af87d 100644 (file)
 #include "options/quantifiers_options.h"
 #include "printer/printer.h"
 #include "theory/quantifiers/lazy_trie.h"
+#include "theory/quantifiers/sygus/term_database_sygus.h"
 #include "theory/rewriter.h"
 #include "util/bitvector.h"
 #include "util/random.h"
+#include "util/rational.h"
 #include "util/sampler.h"
+#include "util/string.h"
 
 namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SygusSampler::SygusSampler()
-    : d_tds(nullptr), d_use_sygus_type(false), d_is_valid(false)
+SygusSampler::SygusSampler(Env& env)
+    : d_env(env), d_tds(nullptr), d_use_sygus_type(false), d_is_valid(false)
 {
 }
 
@@ -471,21 +474,11 @@ Node SygusSampler::evaluate(Node n, unsigned index)
 {
   Assert(index < d_samples.size());
   // do beta-reductions in n first
-  n = Rewriter::rewrite(n);
+  n = d_env.getRewriter()->rewrite(n);
   // use efficient rewrite for substitution + rewrite
-  Node ev = d_eval.eval(n, d_vars, d_samples[index]);
+  Node ev = d_env.evaluate(n, d_vars, d_samples[index], true);
+  Assert(!ev.isNull());
   Trace("sygus-sample-ev") << "Evaluate ( " << n << ", " << index << " ) -> ";
-  if (!ev.isNull())
-  {
-    Trace("sygus-sample-ev") << ev << std::endl;
-    return ev;
-  }
-  Trace("sygus-sample-ev") << "null" << std::endl;
-  Trace("sygus-sample-ev") << "Rewrite -> ";
-  // substitution + rewrite
-  std::vector<Node>& pt = d_samples[index];
-  ev = n.substitute(d_vars.begin(), d_vars.end(), pt.begin(), pt.end());
-  ev = Rewriter::rewrite(ev);
   Trace("sygus-sample-ev") << ev << std::endl;
   return ev;
 }
@@ -617,7 +610,7 @@ Node SygusSampler::getRandomValue(TypeNode tn)
         // negative
         ret = nm->mkNode(kind::UMINUS, ret);
       }
-      ret = Rewriter::rewrite(ret);
+      ret = d_env.getRewriter()->rewrite(ret);
       Assert(ret.isConst());
       return ret;
     }
@@ -715,7 +708,7 @@ Node SygusSampler::getSygusRandomValue(TypeNode tn,
       Trace("sygus-sample-grammar") << "mkGeneric" << std::endl;
       Node ret = d_tds->mkGeneric(dt, cindex, pre);
       Trace("sygus-sample-grammar") << "...returned " << ret << std::endl;
-      ret = Rewriter::rewrite(ret);
+      ret = d_env.getRewriter()->rewrite(ret);
       Trace("sygus-sample-grammar") << "...after rewrite " << ret << std::endl;
       // A rare case where we generate a non-constant value from constant
       // leaves is (/ n 0).
index 85606adc6f9c977bc3af2d31f3dd8263bf056d27..3695270e1ea4954a170b69711fa828b78a236935 100644 (file)
 #define CVC5__THEORY__QUANTIFIERS__SYGUS_SAMPLER_H
 
 #include <map>
-#include "theory/evaluator.h"
 #include "theory/quantifiers/lazy_trie.h"
-#include "theory/quantifiers/sygus/term_database_sygus.h"
 #include "theory/quantifiers/term_enumeration.h"
 
 namespace cvc5 {
+
+class Env;
+
 namespace theory {
 namespace quantifiers {
 
+class TermDbSygus;
+
 /** SygusSampler
  *
  * This class can be used to test whether two expressions are equivalent
@@ -65,7 +68,7 @@ namespace quantifiers {
 class SygusSampler : public LazyTrieEvaluator
 {
  public:
-  SygusSampler();
+  SygusSampler(Env& env);
   ~SygusSampler() override {}
 
   /** initialize
@@ -178,14 +181,14 @@ class SygusSampler : public LazyTrieEvaluator
   void checkEquivalent(Node bv, Node bvr, std::ostream& out);
 
  protected:
+  /** The environment we are using to evaluate terms and samples */
+  Env& d_env;
   /** sygus term database of d_qe */
   TermDbSygus* d_tds;
   /** term enumerator object (used for random sampling) */
   TermEnumeration d_tenum;
   /** samples */
   std::vector<std::vector<Node> > d_samples;
-  /** evaluator class */
-  Evaluator d_eval;
   /** data structure to check duplication of sample points */
   class PtTrie
   {
index 460813084f3b268749e735832b97218691447f1c..4e571a66b73c32204280e7c2f01d4307eac8c2d7 100644 (file)
@@ -479,35 +479,5 @@ void Rewriter::clearCaches()
   clearCachesInternal();
 }
 
-Node Rewriter::rewriteViaMethod(TNode n, MethodId idr)
-{
-  if (idr == MethodId::RW_REWRITE)
-  {
-    return rewrite(n);
-  }
-  if (idr == MethodId::RW_EXT_REWRITE)
-  {
-    return extendedRewrite(n);
-  }
-  if (idr == MethodId::RW_REWRITE_EQ_EXT)
-  {
-    return rewriteEqualityExt(n);
-  }
-  if (idr == MethodId::RW_EVALUATE)
-  {
-    Evaluator eval;
-    return eval.eval(n, {}, {}, false);
-  }
-  if (idr == MethodId::RW_IDENTITY)
-  {
-    // does nothing
-    return n;
-  }
-  // unknown rewriter
-  Unhandled() << "Rewriter::rewriteViaMethod: no rewriter for " << idr
-              << std::endl;
-  return n;
-}
-
 }  // namespace theory
 }  // namespace cvc5
index d87043a670ced24b1a7140c0534a4029204bbdc5..697253e035c8c7b4f7ff20501e594f05840eda6d 100644 (file)
 #pragma once
 
 #include "expr/node.h"
-#include "proof/method_id.h"
 #include "theory/theory_rewriter.h"
 
 namespace cvc5 {
 
+class Env;
 class TConvProofGenerator;
 class ProofNodeManager;
 class TrustNode;
 
 namespace theory {
 
+class Evaluator;
+
 /**
  * The main rewriter class.
  */
 class Rewriter {
-
+  friend class cvc5::Env;  // to initialize the evaluators of this class
  public:
   Rewriter();
 
@@ -62,6 +64,9 @@ class Rewriter {
   Node rewriteEqualityExt(TNode node);
 
   /**
+   * !!! Temporary until static access to rewriter is eliminated. This method
+   * should be moved to same place as evaluate (currently in Env).
+   *
    * Extended rewrite of the given node. This method is implemented by a
    * custom ExtendRewriter class that wraps this class to perform custom
    * rewrites (usually those that are not useful for solving, but e.g. useful
@@ -103,17 +108,6 @@ class Rewriter {
   /** Get the theory rewriter for the given id */
   TheoryRewriter* getTheoryRewriter(theory::TheoryId theoryId);
 
-  /**
-   * Apply rewrite on n via the rewrite method identifier idr (see method_id.h).
-   * This encapsulates the exact behavior of a REWRITE step in a proof.
-   *
-   * @param n The node to rewrite,
-   * @param idr The method identifier of the rewriter, by default RW_REWRITE
-   * specifying a call to rewrite.
-   * @return The rewritten form of n.
-   */
-  Node rewriteViaMethod(TNode n, MethodId idr = MethodId::RW_REWRITE);
-
  private:
   /**
    * Get the rewriter associated with the SmtEngine in scope.
index 36d320fb7ec1320a031d37f2f12af92b8e7b771a..e86d748fd2d689ad7796752789a771f98429fef6 100644 (file)
@@ -80,10 +80,7 @@ ${post_rewrite_set_cache}
   }
 }
 
-Rewriter::Rewriter() : d_tpg(nullptr)
-{
-
-}
+Rewriter::Rewriter() : d_tpg(nullptr) {}
 
 void Rewriter::clearCachesInternal()
 {
index a1f56eaba8b63c09a04ab43aa47fb097829f23b4..c2c6cf77e1e772d8d8e62a8b5387abc4e2a93399 100644 (file)
@@ -59,10 +59,11 @@ TEST_F(TestTheoryWhiteEvaluator, simple)
   std::vector<Node> args = {w, x, y, z};
   std::vector<Node> vals = {c1, zero, one, c1};
 
-  Evaluator eval;
+  Rewriter* rr = d_smtEngine->getRewriter();
+  Evaluator eval(rr);
   Node r = eval.eval(t, args, vals);
   ASSERT_EQ(r,
-            Rewriter::rewrite(t.substitute(
+            rr->rewrite(t.substitute(
                 args.begin(), args.end(), vals.begin(), vals.end())));
 }
 
@@ -90,10 +91,11 @@ TEST_F(TestTheoryWhiteEvaluator, loop)
 
   std::vector<Node> args = {x};
   std::vector<Node> vals = {c};
-  Evaluator eval;
+  Rewriter* rr = d_smtEngine->getRewriter();
+  Evaluator eval(rr);
   Node r = eval.eval(t, args, vals);
   ASSERT_EQ(r,
-            Rewriter::rewrite(t.substitute(
+            rr->rewrite(t.substitute(
                 args.begin(), args.end(), vals.begin(), vals.end())));
 }
 
@@ -106,30 +108,31 @@ TEST_F(TestTheoryWhiteEvaluator, strIdOf)
 
   std::vector<Node> args;
   std::vector<Node> vals;
-  Evaluator eval;
+  Rewriter* rr = d_smtEngine->getRewriter();
+  Evaluator eval(rr);
 
   {
     Node n = d_nodeManager->mkNode(kind::STRING_INDEXOF, a, empty, one);
     Node r = eval.eval(n, args, vals);
-    ASSERT_EQ(r, Rewriter::rewrite(n));
+    ASSERT_EQ(r, rr->rewrite(n));
   }
 
   {
     Node n = d_nodeManager->mkNode(kind::STRING_INDEXOF, a, a, one);
     Node r = eval.eval(n, args, vals);
-    ASSERT_EQ(r, Rewriter::rewrite(n));
+    ASSERT_EQ(r, rr->rewrite(n));
   }
 
   {
     Node n = d_nodeManager->mkNode(kind::STRING_INDEXOF, a, empty, two);
     Node r = eval.eval(n, args, vals);
-    ASSERT_EQ(r, Rewriter::rewrite(n));
+    ASSERT_EQ(r, rr->rewrite(n));
   }
 
   {
     Node n = d_nodeManager->mkNode(kind::STRING_INDEXOF, a, a, two);
     Node r = eval.eval(n, args, vals);
-    ASSERT_EQ(r, Rewriter::rewrite(n));
+    ASSERT_EQ(r, rr->rewrite(n));
   }
 }
 
@@ -140,7 +143,8 @@ TEST_F(TestTheoryWhiteEvaluator, code)
 
   std::vector<Node> args;
   std::vector<Node> vals;
-  Evaluator eval;
+  Rewriter* rr = d_smtEngine->getRewriter();
+  Evaluator eval(rr);
 
   // (str.code "A") ---> 65
   {