Eliminate currentSmtEngine for subsolver calls (#7068)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 26 Aug 2021 16:55:59 +0000 (11:55 -0500)
committerGitHub <noreply@github.com>
Thu, 26 Aug 2021 16:55:59 +0000 (16:55 +0000)
This eliminates another occurrence of smt::currentSmtEngine by making it required to pass options + logic for all subsolver calls.

43 files changed:
src/preprocessing/passes/sygus_inference.cpp
src/preprocessing/preprocessing_pass_context.cpp
src/preprocessing/preprocessing_pass_context.h
src/smt/abduction_solver.cpp
src/smt/abduction_solver.h
src/smt/env.cpp
src/smt/env.h
src/smt/interpolation_solver.cpp
src/smt/interpolation_solver.h
src/smt/optimization_solver.cpp
src/smt/optimization_solver.h
src/smt/quant_elim_solver.cpp
src/smt/quant_elim_solver.h
src/smt/smt_engine.cpp
src/smt/smt_engine.h
src/smt/sygus_solver.cpp
src/smt/sygus_solver.h
src/theory/quantifiers/cegqi/inst_strategy_cegqi.cpp
src/theory/quantifiers/cegqi/nested_qe.cpp
src/theory/quantifiers/cegqi/nested_qe.h
src/theory/quantifiers/expr_miner.cpp
src/theory/quantifiers/sygus/ce_guided_single_inv.cpp
src/theory/quantifiers/sygus/ce_guided_single_inv.h
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/sygus_interpol.cpp
src/theory/quantifiers/sygus/sygus_interpol.h
src/theory/quantifiers/sygus/sygus_module.cpp
src/theory/quantifiers/sygus/sygus_module.h
src/theory/quantifiers/sygus/sygus_pbe.cpp
src/theory/quantifiers/sygus/sygus_pbe.h
src/theory/quantifiers/sygus/sygus_qe_preproc.cpp
src/theory/quantifiers/sygus/sygus_qe_preproc.h
src/theory/quantifiers/sygus/sygus_repair_const.cpp
src/theory/quantifiers/sygus/synth_conjecture.cpp
src/theory/quantifiers/sygus/synth_engine.cpp
src/theory/quantifiers/sygus/synth_verify.cpp
src/theory/quantifiers/sygus/synth_verify.h
src/theory/smt_engine_subsolver.cpp
src/theory/smt_engine_subsolver.h

index 33a2e38d97befcc7656af91ff509b0121c22298c..c0cddda5eae51dfafb6ee18705b0611e46411c34 100644 (file)
@@ -295,7 +295,9 @@ bool SygusInference::solveSygus(const std::vector<Node>& assertions,
 
   // make a separate smt call
   std::unique_ptr<SmtEngine> rrSygus;
-  theory::initializeSubsolver(rrSygus);
+  theory::initializeSubsolver(rrSygus,
+                              d_preprocContext->getOptions(),
+                              d_preprocContext->getLogicInfo());
   rrSygus->assertFormula(body);
   Trace("sygus-infer") << "*** Check sat..." << std::endl;
   Result r = rrSygus->checkSat();
index b21fcb261deb70b46cefee70bf685a4a13b8b99a..7fefafce68ae7d3a80f7ca639416904028f32176 100644 (file)
@@ -36,7 +36,14 @@ PreprocessingPassContext::PreprocessingPassContext(
       d_symsInAssertions(env.getUserContext())
 {
 }
-
+const Options& PreprocessingPassContext::getOptions()
+{
+  return d_env.getOptions();
+}
+const LogicInfo& PreprocessingPassContext::getLogicInfo()
+{
+  return d_env.getLogicInfo();
+}
 theory::TrustSubstitutionMap&
 PreprocessingPassContext::getTopLevelSubstitutions()
 {
index 1af73e45339fad281ca4fd8758ef5d34de32dddf..aab1b453dbd1e9f37072b6b0b14d763c110ae413 100644 (file)
@@ -61,8 +61,10 @@ class PreprocessingPassContext
 
   void spendResource(Resource r);
 
-  /** Get the current logic info of the SmtEngine */
-  const LogicInfo& getLogicInfo() { return d_smt->getLogicInfo(); }
+  /** Get the options of the environment */
+  const Options& getOptions();
+  /** Get the current logic info of the environment */
+  const LogicInfo& getLogicInfo();
 
   /** Gets a reference to the top-level substitution map */
   theory::TrustSubstitutionMap& getTopLevelSubstitutions();
index ff1337fe1fbe6dec897c25739803a6ffddf51a53..b773d8d576e19192c82ebb713366b6515d41c600 100644 (file)
@@ -32,7 +32,10 @@ using namespace cvc5::theory;
 namespace cvc5 {
 namespace smt {
 
-AbductionSolver::AbductionSolver(SmtEngine* parent) : d_parent(parent) {}
+AbductionSolver::AbductionSolver(Env& env, SmtEngine* parent)
+    : d_env(env), d_parent(parent)
+{
+}
 
 AbductionSolver::~AbductionSolver() {}
 bool AbductionSolver::getAbduct(const Node& goal,
@@ -48,7 +51,7 @@ bool AbductionSolver::getAbduct(const Node& goal,
   std::vector<Node> axioms = d_parent->getExpandedAssertions();
   std::vector<Node> asserts(axioms.begin(), axioms.end());
   // must expand definitions
-  Node conjn = d_parent->getEnv().getTopLevelSubstitutions().apply(goal);
+  Node conjn = d_env.getTopLevelSubstitutions().apply(goal);
   // now negate
   conjn = conjn.negate();
   d_abdConj = conjn;
@@ -63,7 +66,7 @@ bool AbductionSolver::getAbduct(const Node& goal,
   Trace("sygus-abduct") << "SmtEngine::getAbduct: made conjecture : " << aconj
                         << ", solving for " << d_sssf << std::endl;
   // we generate a new smt engine to do the abduction query
-  initializeSubsolver(d_subsolver);
+  initializeSubsolver(d_subsolver, d_env);
   // get the logic
   LogicInfo l = d_subsolver->getLogicInfo().getUnlockedCopy();
   // enable everything needed for sygus
@@ -153,7 +156,7 @@ void AbductionSolver::checkAbduct(Node a)
                           << ": make new SMT engine" << std::endl;
     // Start new SMT engine to check solution
     std::unique_ptr<SmtEngine> abdChecker;
-    initializeSubsolver(abdChecker);
+    initializeSubsolver(abdChecker, d_env);
     Trace("check-abduct") << "SmtEngine::checkAbduct: phase " << j
                           << ": asserting formulas" << std::endl;
     for (const Node& e : asserts)
index c7f9db035ae55525a61f8d63776c623886346aaa..b408fe060b5220c0757954a1193d00e5a1c48704 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace cvc5 {
 
+class Env;
 class SmtEngine;
 
 namespace smt {
@@ -37,7 +38,7 @@ namespace smt {
 class AbductionSolver
 {
  public:
-  AbductionSolver(SmtEngine* parent);
+  AbductionSolver(Env& env, SmtEngine* parent);
   ~AbductionSolver();
   /**
    * This method asks this SMT engine to find an abduct with respect to the
@@ -84,6 +85,8 @@ class AbductionSolver
    * problems.
    */
   bool getAbductInternal(Node& abd);
+  /** Reference to the env */
+  Env& d_env;
   /** The parent SMT engine */
   SmtEngine* d_parent;
   /** The SMT engine subsolver
index d6677c3435470e9f2a0171e2881a86d8e0356818..7efefabcdd65927b8b8c3db075b0b708a2e45cf9 100644 (file)
@@ -33,7 +33,7 @@ using namespace cvc5::smt;
 
 namespace cvc5 {
 
-Env::Env(NodeManager* nm, Options* opts)
+Env::Env(NodeManager* nm, const Options* opts)
     : d_context(new context::Context()),
       d_userContext(new context::UserContext()),
       d_nodeManager(nm),
index 68148ec00a2b3b9cedd9a1fa8a6d62dae5fb46cc..7c12c86b901dccb89c12a6a17023fabc517f4828 100644 (file)
@@ -61,7 +61,7 @@ class Env
   /**
    * Construct an Env with the given node manager.
    */
-  Env(NodeManager* nm, Options* opts);
+  Env(NodeManager* nm, const Options* opts);
   /** Destruct the env.  */
   ~Env();
 
index fbbdb1b9072ea3b010a3b6bb9373d70a750965b9..ab7002205c1328a3ffac078c755148678637542e 100644 (file)
@@ -32,7 +32,8 @@ using namespace cvc5::theory;
 namespace cvc5 {
 namespace smt {
 
-InterpolationSolver::InterpolationSolver(SmtEngine* parent) : d_parent(parent)
+InterpolationSolver::InterpolationSolver(Env& env, SmtEngine* parent)
+    : d_env(env), d_parent(parent)
 {
 }
 
@@ -52,10 +53,10 @@ bool InterpolationSolver::getInterpol(const Node& conj,
                           << std::endl;
   std::vector<Node> axioms = d_parent->getExpandedAssertions();
   // must expand definitions
-  Node conjn = d_parent->getEnv().getTopLevelSubstitutions().apply(conj);
+  Node conjn = d_env.getTopLevelSubstitutions().apply(conj);
   std::string name("A");
 
-  quantifiers::SygusInterpol interpolSolver;
+  quantifiers::SygusInterpol interpolSolver(d_env);
   if (interpolSolver.solveInterpolation(
           name, axioms, conjn, grammarType, interpol))
   {
@@ -94,7 +95,7 @@ void InterpolationSolver::checkInterpol(Node interpol,
                             << ": make new SMT engine" << std::endl;
     // Start new SMT engine to check solution
     std::unique_ptr<SmtEngine> itpChecker;
-    initializeSubsolver(itpChecker);
+    initializeSubsolver(itpChecker, d_env);
     Trace("check-interpol") << "SmtEngine::checkInterpol: phase " << j
                             << ": asserting formulas" << std::endl;
     if (j == 0)
index 03f8ab6a16e3576fb334d9e6dfb67e4c17e6821d..19bb54c615a89d508bef8fbcf66d53577a6d2d9a 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace cvc5 {
 
+class Env;
 class SmtEngine;
 
 namespace smt {
@@ -37,7 +38,7 @@ namespace smt {
 class InterpolationSolver
 {
  public:
-  InterpolationSolver(SmtEngine* parent);
+  InterpolationSolver(Env& env, SmtEngine* parent);
   ~InterpolationSolver();
 
   /**
@@ -77,6 +78,8 @@ class InterpolationSolver
                      const Node& conj);
 
  private:
+  /** Reference to the env */
+  Env& d_env;
   /** The parent SMT engine */
   SmtEngine* d_parent;
 };
index fecf65275192c7f7e5e424c3a0bcd02aef82f067..67de9728c9341fb00d38d9af46272887ce28615e 100644 (file)
@@ -22,6 +22,7 @@
 #include "options/language.h"
 #include "options/smt_options.h"
 #include "smt/assertions.h"
+#include "smt/env.h"
 #include "smt/smt_engine.h"
 #include "theory/smt_engine_subsolver.h"
 
@@ -147,7 +148,8 @@ std::unique_ptr<SmtEngine> OptimizationSolver::createOptCheckerWithTimeout(
   std::unique_ptr<SmtEngine> optChecker;
   // initializeSubSolver will copy the options and theories enabled
   // from the current solver to optChecker and adds timeout
-  theory::initializeSubsolver(optChecker, nullptr, needsTimeout, timeout);
+  theory::initializeSubsolver(
+      optChecker, parentSMTSolver->getEnv(), needsTimeout, timeout);
   // we need to be in incremental mode for multiple objectives since we need to
   // push pop we need to produce models to inrement on our objective
   optChecker->setOption("incremental", "true");
@@ -275,7 +277,10 @@ Result OptimizationSolver::optimizeLexicographicIterative()
 Result OptimizationSolver::optimizeParetoNaiveGIA()
 {
   // initial call to Pareto optimizer, create the checker
-  if (!d_optChecker) d_optChecker = createOptCheckerWithTimeout(d_parent);
+  if (!d_optChecker)
+  {
+    d_optChecker = createOptCheckerWithTimeout(d_parent);
+  }
   NodeManager* nm = d_optChecker->getNodeManager();
 
   // checks whether the current set of assertions are satisfied or not
index 339ba9ea708de1ac8c18f17d3e0fae2319813b6f..04a960282b54d02476cb9aa8853aa9a640495ba1 100644 (file)
@@ -26,6 +26,7 @@
 
 namespace cvc5 {
 
+class Env;
 class SmtEngine;
 
 namespace smt {
@@ -254,6 +255,8 @@ class OptimizationSolver
  private:
   /**
    * Initialize an SMT subsolver for offline optimization purpose
+   * @param env the environment, which determines options and logic for the
+   * subsolver
    * @param parentSMTSolver the parental solver containing the assertions
    * @param needsTimeout specifies whether it needs timeout for each single
    *    query
index e675feaa0a2cfe94b34e6a2191d97693089584fa..087aa0e06a29f8fde1e63837395563f5f3142f0b 100644 (file)
@@ -32,7 +32,10 @@ using namespace cvc5::kind;
 namespace cvc5 {
 namespace smt {
 
-QuantElimSolver::QuantElimSolver(SmtSolver& sms) : d_smtSolver(sms) {}
+QuantElimSolver::QuantElimSolver(Env& env, SmtSolver& sms)
+    : d_env(env), d_smtSolver(sms)
+{
+}
 
 QuantElimSolver::~QuantElimSolver() {}
 
@@ -51,7 +54,7 @@ Node QuantElimSolver::getQuantifierElimination(Assertions& as,
   // ensure the body is rewritten
   q = nm->mkNode(q.getKind(), q[0], Rewriter::rewrite(q[1]));
   // do nested quantifier elimination if necessary
-  q = quantifiers::NestedQe::doNestedQe(q, true);
+  q = quantifiers::NestedQe::doNestedQe(d_env, q, true);
   Trace("smt-qe") << "QuantElimSolver: after nested quantifier elimination : "
                   << q << std::endl;
   // tag the quantified formula with the quant-elim attribute
index 4396694e92fde77755311718a7280a6510b61517..f890deba0f395bfc9a6e7491e9b59230b1f5a206 100644 (file)
@@ -22,6 +22,8 @@
 #include "smt/assertions.h"
 
 namespace cvc5 {
+class Env;
+
 namespace smt {
 
 class SmtSolver;
@@ -37,7 +39,7 @@ class SmtSolver;
 class QuantElimSolver
 {
  public:
-  QuantElimSolver(SmtSolver& sms);
+  QuantElimSolver(Env& env, SmtSolver& sms);
   ~QuantElimSolver();
 
   /**
@@ -95,6 +97,8 @@ class QuantElimSolver
                                 bool isInternalSubsolver);
 
  private:
+  /** Reference to the env */
+  Env& d_env;
   /** The SMT solver, which is used during doQuantifierElimination. */
   SmtSolver& d_smtSolver;
 };
index 45056057d379a623b11366a73d55b179e90cc024..ea253e4ef8f5884134330b1b9a42f2f303c2aa04 100644 (file)
@@ -84,7 +84,7 @@ using namespace cvc5::theory;
 
 namespace cvc5 {
 
-SmtEngine::SmtEngine(NodeManager* nm, Options* optr)
+SmtEngine::SmtEngine(NodeManager* nm, const Options* optr)
     : d_env(new Env(nm, optr)),
       d_state(new SmtEngineState(*d_env.get(), *this)),
       d_absValues(new AbstractValues(getNodeManager())),
@@ -131,11 +131,9 @@ SmtEngine::SmtEngine(NodeManager* nm, Options* optr)
   // make the SMT solver
   d_smtSolver.reset(new SmtSolver(*d_env.get(), *d_state, *d_pp, *d_stats));
   // make the SyGuS solver
-  d_sygusSolver.reset(
-      new SygusSolver(*d_smtSolver, *d_pp, getUserContext(), d_outMgr));
+  d_sygusSolver.reset(new SygusSolver(*d_env.get(), *d_smtSolver, *d_pp));
   // make the quantifier elimination solver
-  d_quantElimSolver.reset(new QuantElimSolver(*d_smtSolver));
-
+  d_quantElimSolver.reset(new QuantElimSolver(*d_env.get(), *d_smtSolver));
 }
 
 bool SmtEngine::isFullyInited() const { return d_state->isFullyInited(); }
@@ -259,12 +257,12 @@ void SmtEngine::finishInit()
   // subsolvers
   if (d_env->getOptions().smt.produceAbducts)
   {
-    d_abductSolver.reset(new AbductionSolver(this));
+    d_abductSolver.reset(new AbductionSolver(*d_env.get(), this));
   }
   if (d_env->getOptions().smt.produceInterpols
       != options::ProduceInterpols::NONE)
   {
-    d_interpolSolver.reset(new InterpolationSolver(this));
+    d_interpolSolver.reset(new InterpolationSolver(*d_env.get(), this));
   }
 
   d_pp->finishInit();
@@ -1119,7 +1117,7 @@ Node SmtEngine::getValue(const Node& ex) const
   Trace("smt") << "SMT getValue(" << ex << ")" << endl;
   if (Dump.isOn("benchmark"))
   {
-    getPrinter().toStreamCmdGetValue(d_outMgr.getDumpOut(), {ex});
+    getPrinter().toStreamCmdGetValue(d_env->getDumpOut(), {ex});
   }
   TypeNode expectedType = ex.getType();
 
@@ -1408,7 +1406,7 @@ std::vector<Node> SmtEngine::reduceUnsatCore(const std::vector<Node>& core)
   for (const Node& skip : core)
   {
     std::unique_ptr<SmtEngine> coreChecker;
-    initializeSubsolver(coreChecker);
+    initializeSubsolver(coreChecker, *d_env.get());
     coreChecker->setLogic(getLogicInfo());
     coreChecker->getOptions().smt.checkUnsatCores = false;
     // disable all proof options
@@ -1474,7 +1472,7 @@ void SmtEngine::checkUnsatCore() {
 
   // initialize the core checker
   std::unique_ptr<SmtEngine> coreChecker;
-  initializeSubsolver(coreChecker);
+  initializeSubsolver(coreChecker, *d_env.get());
   coreChecker->getOptions().smt.checkUnsatCores = false;
   // disable all proof options
   coreChecker->getOptions().smt.produceProofs = false;
@@ -1988,7 +1986,7 @@ std::string SmtEngine::getOption(const std::string& key) const
 
   if (Dump.isOn("benchmark"))
   {
-    getPrinter().toStreamCmdGetOption(d_outMgr.getDumpOut(), key);
+    getPrinter().toStreamCmdGetOption(d_env->getDumpOut(), key);
   }
 
   if (key == "command-verbosity")
index 208c83db80254dee8128c94a1cd243369bb2e40e..d9786f6a17cbfd766754406131f4830bdddabb6b 100644 (file)
@@ -126,7 +126,7 @@ class CVC5_EXPORT SmtEngine
    * If provided, optr is a pointer to a set of options that should initialize the values
    * of the options object owned by this class.
    */
-  SmtEngine(NodeManager* nm, Options* optr = nullptr);
+  SmtEngine(NodeManager* nm, const Options* optr = nullptr);
   /** Destruct the SMT engine.  */
   ~SmtEngine();
 
index d5cfe274eedffae22958de6ff5240f140dd8273d..b7b6d9c18a2cd0b98f679e7a163c27874bf3d97c 100644 (file)
@@ -41,14 +41,11 @@ using namespace cvc5::kind;
 namespace cvc5 {
 namespace smt {
 
-SygusSolver::SygusSolver(SmtSolver& sms,
-                         Preprocessor& pp,
-                         context::UserContext* u,
-                         OutputManager& outMgr)
-    : d_smtSolver(sms),
+SygusSolver::SygusSolver(Env& env, SmtSolver& sms, Preprocessor& pp)
+    : d_env(env),
+      d_smtSolver(sms),
       d_pp(pp),
-      d_sygusConjectureStale(u, true),
-      d_outMgr(outMgr)
+      d_sygusConjectureStale(env.getUserContext(), true)
 {
 }
 
@@ -212,7 +209,7 @@ Result SygusSolver::checkSynth(Assertions& as)
     Trace("smt") << "Check synthesis conjecture: " << body << std::endl;
     if (Dump.isOn("raw-benchmark"))
     {
-      d_outMgr.getPrinter().toStreamCmdCheckSynth(d_outMgr.getDumpOut());
+      d_env.getPrinter().toStreamCmdCheckSynth(d_env.getDumpOut());
     }
 
     d_sygusConjectureStale = false;
@@ -332,7 +329,7 @@ void SygusSolver::checkSynthSolution(Assertions& as)
   {
     // Start new SMT engine to check solutions
     std::unique_ptr<SmtEngine> solChecker;
-    initializeSubsolver(solChecker);
+    initializeSubsolver(solChecker, d_env);
     solChecker->getOptions().smt.checkSynthSol = false;
     solChecker->getOptions().quantifiers.sygusRecFun = false;
     // get the solution for this conjecture
index ff9b7e51306d59b84d80fd7c4e91c60d3e2d9945..82dfab3cccdd02dab661da304454b3f5583d3da0 100644 (file)
@@ -45,10 +45,7 @@ class SmtSolver;
 class SygusSolver
 {
  public:
-  SygusSolver(SmtSolver& sms,
-              Preprocessor& pp,
-              context::UserContext* u,
-              OutputManager& outMgr);
+  SygusSolver(Env& env, SmtSolver& sms, Preprocessor& pp);
   ~SygusSolver();
 
   /**
@@ -161,6 +158,8 @@ class SygusSolver
    * previously not stale.
    */
   void setSygusConjectureStale();
+  /** Reference to the env class */
+  Env& d_env;
   /** The SMT solver, which is used during checkSynth. */
   SmtSolver& d_smtSolver;
   /** The preprocessor, used for checkSynthSolution. */
@@ -180,8 +179,6 @@ class SygusSolver
    * Whether we need to reconstruct the sygus conjecture.
    */
   context::CDO<bool> d_sygusConjectureStale;
-  /** Reference to the output manager of the smt engine */
-  OutputManager& d_outMgr;
 };
 
 }  // namespace smt
index f65828d2f58c471067f773666e24c8abb6a5b56e..81366fabd2e1ebf1c305c705d415ffc2d8bd90ae 100644 (file)
@@ -70,7 +70,7 @@ InstStrategyCegqi::InstStrategyCegqi(QuantifiersState& qs,
   }
   if (options::cegqiNestedQE())
   {
-    d_nestedQe.reset(new NestedQe(qs.getUserContext()));
+    d_nestedQe.reset(new NestedQe(qs.getEnv()));
   }
 }
 
index a20c370432f199a84fcddc81fa800bb3875fef09..869ebe036b70f297b365e3a08f4fd4e25fc2135c 100644 (file)
 
 #include "expr/node_algorithm.h"
 #include "expr/subs.h"
+#include "smt/env.h"
 #include "theory/smt_engine_subsolver.h"
 
 namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-NestedQe::NestedQe(context::UserContext* u) : d_qnqe(u) {}
+NestedQe::NestedQe(Env& env) : d_env(env), d_qnqe(d_env.getUserContext()) {}
 
 bool NestedQe::process(Node q, std::vector<Node>& lems)
 {
@@ -35,7 +36,7 @@ bool NestedQe::process(Node q, std::vector<Node>& lems)
     return (*it).second != q;
   }
   Trace("cegqi-nested-qe") << "Check nested QE on " << q << std::endl;
-  Node qqe = doNestedQe(q, true);
+  Node qqe = doNestedQe(d_env, q, true);
   d_qnqe[q] = qqe;
   if (qqe == q)
   {
@@ -67,7 +68,7 @@ bool NestedQe::hasNestedQuantification(Node q)
   return getNestedQuantification(q, nqs);
 }
 
-Node NestedQe::doNestedQe(Node q, bool keepTopLevel)
+Node NestedQe::doNestedQe(Env& env, Node q, bool keepTopLevel)
 {
   NodeManager* nm = NodeManager::currentNM();
   Node qOrig = q;
@@ -88,7 +89,7 @@ Node NestedQe::doNestedQe(Node q, bool keepTopLevel)
       return qOrig;
     }
     // just do ordinary quantifier elimination
-    Node qqe = doQe(q);
+    Node qqe = doQe(env, q);
     Trace("cegqi-nested-qe-debug") << "...did ordinary qe" << std::endl;
     return qqe;
   }
@@ -104,7 +105,7 @@ Node NestedQe::doNestedQe(Node q, bool keepTopLevel)
   for (const Node& nq : nqs)
   {
     Node nqk = sk.apply(nq);
-    Node nqqe = doNestedQe(nqk);
+    Node nqqe = doNestedQe(env, nqk);
     if (nqqe == nqk)
     {
       // failed
@@ -130,14 +131,14 @@ Node NestedQe::doNestedQe(Node q, bool keepTopLevel)
   return nm->mkNode(inputExists ? kind::EXISTS : kind::FORALL, qargs);
 }
 
-Node NestedQe::doQe(Node q)
+Node NestedQe::doQe(Env& env, Node q)
 {
   Assert(q.getKind() == kind::FORALL);
   Trace("cegqi-nested-qe") << "  Apply qe to " << q << std::endl;
   NodeManager* nm = NodeManager::currentNM();
   q = nm->mkNode(kind::EXISTS, q[0], q[1].negate());
   std::unique_ptr<SmtEngine> smt_qe;
-  initializeSubsolver(smt_qe);
+  initializeSubsolver(smt_qe, env);
   Node qqe = smt_qe->getQuantifierElimination(q, true, false);
   if (expr::hasBoundVar(qqe))
   {
index f6e15d4c6dfbccaf0b3ff051f8f546348d6bf859..f577a504c6a9e153c4cf5f3ba80b33be8f2dfb7b 100644 (file)
@@ -25,6 +25,9 @@
 #include "expr/node.h"
 
 namespace cvc5 {
+
+class Env;
+
 namespace theory {
 namespace quantifiers {
 
@@ -33,7 +36,7 @@ class NestedQe
   using NodeNodeMap = context::CDHashMap<Node, Node>;
 
  public:
-  NestedQe(context::UserContext* u);
+  NestedQe(Env& env);
   ~NestedQe() {}
   /**
    * Process quantified formula. If this returns true, then q was processed
@@ -64,15 +67,17 @@ class NestedQe
    * returned formula is quantifier-free. Otherwise, it is a quantified formula
    * with no nested quantification.
    */
-  static Node doNestedQe(Node q, bool keepTopLevel = false);
+  static Node doNestedQe(Env& env, Node q, bool keepTopLevel = false);
   /**
    * Run quantifier elimination on quantified formula q, where q has no nested
    * quantification. This method invokes a subsolver for performing quantifier
    * elimination.
    */
-  static Node doQe(Node q);
+  static Node doQe(Env& env, Node q);
 
  private:
+  /** Reference to the env */
+  Env& d_env;
   /**
    * Mapping from quantified formulas q to the result of doNestedQe(q, true).
    */
index fa156c839006c9648d107bd2864a65ce2b22e837..49b1d56faaa9759950fb84e27342d5350a63a2d8 100644 (file)
@@ -56,12 +56,14 @@ void ExprMiner::initializeChecker(std::unique_ptr<SmtEngine>& checker,
   Assert (!query.isNull());
   if (Options::current().quantifiers.sygusExprMinerCheckTimeoutWasSetByUser)
   {
-    initializeSubsolver(
-        checker, nullptr, true, options::sygusExprMinerCheckTimeout());
+    initializeSubsolver(checker,
+                        d_env,
+                        true,
+                        options::sygusExprMinerCheckTimeout());
   }
   else
   {
-    initializeSubsolver(checker);
+    initializeSubsolver(checker, d_env);
   }
   // also set the options
   checker->setOption("sygus-rr-synth-input", "false");
index f1caca1c433ff1f1d6d99f9a884e17c507c84f5f..99716806f4bafb101a9118eb20dd81c3c440a283 100644 (file)
@@ -38,7 +38,8 @@ namespace theory {
 namespace quantifiers {
 
 CegSingleInv::CegSingleInv(Env& env, TermRegistry& tr, SygusStatistics& s)
-    : d_sip(new SingleInvocationPartition),
+    : d_env(env),
+      d_sip(new SingleInvocationPartition),
       d_srcons(new SygusReconstruct(env, tr.getTermDatabaseSygus(), s)),
       d_isSolved(false),
       d_single_invocation(false),
@@ -227,7 +228,7 @@ bool CegSingleInv::solve()
   }
   // solve the single invocation conjecture using a fresh copy of SMT engine
   std::unique_ptr<SmtEngine> siSmt;
-  initializeSubsolver(siSmt);
+  initializeSubsolver(siSmt, d_env);
   siSmt->assertFormula(siq);
   Result r = siSmt->checkSat();
   Trace("sygus-si") << "Result: " << r << std::endl;
index 13757dba99f9ce285a332215b556fca08a6768d1..f7d6e5bb99bc0008f05755c24ed9a2cba7bae836 100644 (file)
@@ -51,6 +51,8 @@ class CegSingleInv
                                std::map< Node, std::vector< Node > >& teq,
                                Node n, std::vector< Node >& conj );
  private:
+  /** Reference to the env */
+  Env& d_env;
   // single invocation inference utility
   SingleInvocationPartition* d_sip;
   /** solution reconstruction */
index dff44eb1c42fafe0b1196428e550fc6d96bec4e3..57b763044371b3d88f167545ae0d0105d5a35160 100644 (file)
@@ -32,10 +32,11 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-Cegis::Cegis(QuantifiersInferenceManager& qim,
+Cegis::Cegis(QuantifiersState& qs,
+             QuantifiersInferenceManager& qim,
              TermDbSygus* tds,
              SynthConjecture* p)
-    : SygusModule(qim, tds, p),
+    : SygusModule(qs, qim, tds, p),
       d_eval_unfold(tds->getEvalUnfold()),
       d_usingSymCons(false)
 {
index f5114d7ca24e68c203b1336e99b83ab49333de75..d6678a305de2d655d855b771c3b1bf92c0457fb4 100644 (file)
@@ -42,7 +42,10 @@ namespace quantifiers {
 class Cegis : public SygusModule
 {
  public:
-  Cegis(QuantifiersInferenceManager& qim, TermDbSygus* tds, SynthConjecture* p);
+  Cegis(QuantifiersState& qs,
+        QuantifiersInferenceManager& qim,
+        TermDbSygus* tds,
+        SynthConjecture* p);
   ~Cegis() override {}
   /** initialize */
   virtual bool initialize(Node conj,
index 165326db72358b0955863353acd76d25ab3b46b1..9a9d8f02d5f808bad148054bb2953ec0c2d49261 100644 (file)
@@ -68,10 +68,11 @@ bool VariadicTrie::hasSubset(const std::vector<Node>& is) const
   return false;
 }
 
-CegisCoreConnective::CegisCoreConnective(QuantifiersInferenceManager& qim,
+CegisCoreConnective::CegisCoreConnective(QuantifiersState& qs,
+                                         QuantifiersInferenceManager& qim,
                                          TermDbSygus* tds,
                                          SynthConjecture* p)
-    : Cegis(qim, tds, p)
+    : Cegis(qs, qim, tds, p)
 {
   d_true = NodeManager::currentNM()->mkConst(true);
   d_false = NodeManager::currentNM()->mkConst(false);
@@ -628,7 +629,9 @@ bool CegisCoreConnective::getUnsatCore(
 Result CegisCoreConnective::checkSat(Node n, std::vector<Node>& mvs) const
 {
   Trace("sygus-ccore-debug") << "...check-sat " << n << "..." << std::endl;
-  Result r = checkWithSubsolver(n, d_vars, mvs);
+  Env& env = d_qstate.getEnv();
+  Result r =
+      checkWithSubsolver(n, d_vars, mvs, env.getOptions(), env.getLogicInfo());
   Trace("sygus-ccore-debug") << "...got " << r << std::endl;
   return r;
 }
@@ -736,7 +739,7 @@ Node CegisCoreConnective::constructSolutionFromPool(Component& ccheck,
     addSuccess = false;
     // try a new core
     std::unique_ptr<SmtEngine> checkSol;
-    initializeSubsolver(checkSol);
+    initializeSubsolver(checkSol, d_qstate.getEnv());
     Trace("sygus-ccore") << "----- Check candidate " << an << std::endl;
     std::vector<Node> rasserts = asserts;
     rasserts.push_back(d_sc);
@@ -776,7 +779,7 @@ Node CegisCoreConnective::constructSolutionFromPool(Component& ccheck,
           // In terms of Variant #2, this is the check "if S ^ U is unsat"
           Trace("sygus-ccore") << "----- Check side condition" << std::endl;
           std::unique_ptr<SmtEngine> checkSc;
-          initializeSubsolver(checkSc);
+          initializeSubsolver(checkSc, d_qstate.getEnv());
           std::vector<Node> scasserts;
           scasserts.insert(scasserts.end(), uasserts.begin(), uasserts.end());
           scasserts.push_back(d_sc);
index 005e85706b7c0cc28858cfddbd1e84d29f0dac0b..e9a73e9bb56d4d7958dd16f11d51bb752da5dca8 100644 (file)
@@ -160,7 +160,8 @@ class VariadicTrie
 class CegisCoreConnective : public Cegis
 {
  public:
-  CegisCoreConnective(QuantifiersInferenceManager& qim,
+  CegisCoreConnective(QuantifiersState& qs,
+                      QuantifiersInferenceManager& qim,
                       TermDbSygus* tds,
                       SynthConjecture* p);
   ~CegisCoreConnective() {}
index 0b7255e2d01c98d06b77694982c5db3aa1d9db30..c4d9cbd4add818bd3a1c6803559a187c3130d86a 100644 (file)
@@ -34,7 +34,7 @@ CegisUnif::CegisUnif(QuantifiersState& qs,
                      QuantifiersInferenceManager& qim,
                      TermDbSygus* tds,
                      SynthConjecture* p)
-    : Cegis(qim, tds, p), d_sygus_unif(p), d_u_enum_manager(qs, qim, tds, p)
+    : Cegis(qs, qim, tds, p), d_sygus_unif(p), d_u_enum_manager(qs, qim, tds, p)
 {
 }
 
index 426ad07ef91f771a7313e57e628660bf1ace8146..0dad2989374bace0abf19b936af3cc740b1b07f9 100644 (file)
@@ -22,6 +22,7 @@
 #include "expr/dtype.h"
 #include "expr/node_algorithm.h"
 #include "options/smt_options.h"
+#include "smt/env.h"
 #include "theory/datatypes/sygus_datatype_utils.h"
 #include "theory/quantifiers/quantifiers_attributes.h"
 #include "theory/quantifiers/sygus/sygus_grammar_cons.h"
@@ -32,7 +33,7 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SygusInterpol::SygusInterpol() {}
+SygusInterpol::SygusInterpol(Env& env) : d_env(env) {}
 
 void SygusInterpol::collectSymbols(const std::vector<Node>& axioms,
                                    const Node& conj)
@@ -324,7 +325,7 @@ bool SygusInterpol::solveInterpolation(const std::string& name,
   mkSygusConjecture(itp, axioms, conj);
 
   std::unique_ptr<SmtEngine> subSolver;
-  initializeSubsolver(subSolver);
+  initializeSubsolver(subSolver, d_env);
   // get the logic
   LogicInfo l = subSolver->getLogicInfo().getUnlockedCopy();
   // enable everything needed for sygus
index e86ac624a95ae3efdeaf4cc132d724ce2ab33751..d4aedad8a291e5ce863c54f0afacc1d20259d6bc 100644 (file)
@@ -25,6 +25,7 @@
 
 namespace cvc5 {
 
+class Env;
 class SmtEngine;
 
 namespace theory {
@@ -61,7 +62,7 @@ namespace quantifiers {
 class SygusInterpol
 {
  public:
-  SygusInterpol();
+  SygusInterpol(Env& env);
 
   /**
    * Returns the sygus conjecture in interpol corresponding to the interpolation
@@ -173,7 +174,8 @@ class SygusInterpol
    * @param itp the interpolation predicate.
    */
   bool findInterpol(SmtEngine* subsolver, Node& interpol, Node itp);
-
+  /** Reference to the env */
+  Env& d_env;
   /**
    * symbols from axioms and conjecture.
    */
index b134eb993e8c7beb624d1b3c4330395bb292f2fb..4cb333849d7d02018570bd450be9b1763e293c03 100644 (file)
@@ -19,10 +19,11 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SygusModule::SygusModule(QuantifiersInferenceManager& qim,
+SygusModule::SygusModule(QuantifiersState& qs,
+                         QuantifiersInferenceManager& qim,
                          TermDbSygus* tds,
                          SynthConjecture* p)
-    : d_qim(qim), d_tds(tds), d_parent(p)
+    : d_qstate(qs), d_qim(qim), d_tds(tds), d_parent(p)
 {
 }
 
index d93957a15bb14315b83bdd58e74e31b0ba3b6df6..d7e0caa5b71e055ac8b745368380b36cf3b6a1b7 100644 (file)
@@ -28,6 +28,7 @@ namespace quantifiers {
 
 class SynthConjecture;
 class TermDbSygus;
+class QuantifiersState;
 class QuantifiersInferenceManager;
 
 /** SygusModule
@@ -51,7 +52,8 @@ class QuantifiersInferenceManager;
 class SygusModule
 {
  public:
-  SygusModule(QuantifiersInferenceManager& qim,
+  SygusModule(QuantifiersState& qs,
+              QuantifiersInferenceManager& qim,
               TermDbSygus* tds,
               SynthConjecture* p);
   virtual ~SygusModule() {}
@@ -147,6 +149,8 @@ class SygusModule
   virtual bool usingRepairConst() { return false; }
 
  protected:
+  /** Reference to the state of the quantifiers engine */
+  QuantifiersState& d_qstate;
   /** Reference to the quantifiers inference manager */
   QuantifiersInferenceManager& d_qim;
   /** sygus term database of d_qe */
index 27a1e3f3b6633c37ed4ef2efbdc509e64e7a8982..26621eb964d13754ca2363c64634a1279bf6d782 100644 (file)
@@ -30,10 +30,11 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SygusPbe::SygusPbe(QuantifiersInferenceManager& qim,
+SygusPbe::SygusPbe(QuantifiersState& qs,
+                   QuantifiersInferenceManager& qim,
                    TermDbSygus* tds,
                    SynthConjecture* p)
-    : SygusModule(qim, tds, p)
+    : SygusModule(qs, qim, tds, p)
 {
   d_true = NodeManager::currentNM()->mkConst(true);
   d_false = NodeManager::currentNM()->mkConst(false);
index e27f4ce3536a31115cc493297806b43a32d771e9..86776461780cbcfaee803a4a8e56d3d1804f30b1 100644 (file)
@@ -86,7 +86,8 @@ class SynthConjecture;
 class SygusPbe : public SygusModule
 {
  public:
-  SygusPbe(QuantifiersInferenceManager& qim,
+  SygusPbe(QuantifiersState& qs,
+           QuantifiersInferenceManager& qim,
            TermDbSygus* tds,
            SynthConjecture* p);
   ~SygusPbe();
index c6ff7e61a0c15ca29f2e5dac4695fa16ad460802..5cf7122f31eddfb6f1f0b08782d5b2063fe3d605 100644 (file)
@@ -27,7 +27,7 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SygusQePreproc::SygusQePreproc() {}
+SygusQePreproc::SygusQePreproc(Env& env) : d_env(env) {}
 
 Node SygusQePreproc::preprocess(Node q)
 {
@@ -53,7 +53,7 @@ Node SygusQePreproc::preprocess(Node q)
   }
   // create new smt engine to do quantifier elimination
   std::unique_ptr<SmtEngine> smt_qe;
-  initializeSubsolver(smt_qe);
+  initializeSubsolver(smt_qe, d_env);
   Trace("cegqi-qep") << "Property is non-ground single invocation, run "
                         "QE to obtain single invocation."
                      << std::endl;
index 551dd16111fe09d9e45f87e5ed409630fe1baccd..0cbd96914b21e371bd54a225f998b80e5205149c 100644 (file)
@@ -19,6 +19,9 @@
 #include "expr/node.h"
 
 namespace cvc5 {
+
+class Env;
+
 namespace theory {
 namespace quantifiers {
 
@@ -35,13 +38,17 @@ namespace quantifiers {
 class SygusQePreproc
 {
  public:
-  SygusQePreproc();
+  SygusQePreproc(Env& env);
   ~SygusQePreproc() {}
   /**
    * Preprocess. Returns a lemma of the form q = nq where nq is obtained
    * by the quantifier elimination technique outlined above.
    */
   Node preprocess(Node q);
+
+ private:
+  /** Reference to the env */
+  Env& d_env;
 };
 
 }  // namespace quantifiers
index d4611e6ca27a94e20dce592b8cfcea1486734072..4a8d0406b22ea45c9f19ca3636f4aa9cb00c32bc 100644 (file)
@@ -232,7 +232,8 @@ bool SygusRepairConst::repairSolution(Node sygusBody,
   // initialize the subsolver using the standard method
   initializeSubsolver(
       repcChecker,
-      nullptr,
+      d_env.getOptions(),
+      d_env.getLogicInfo(),
       Options::current().quantifiers.sygusRepairConstTimeoutWasSetByUser,
       options::sygusRepairConstTimeout());
   // renable options disabled by sygus
index eeadbdd5432cc8d4f6b8903f9e54fa1e71616e08..3e7095c129b7c92712d5cfe56c30740da66f6206 100644 (file)
@@ -56,7 +56,7 @@ SynthConjecture::SynthConjecture(QuantifiersState& qs,
       d_treg(tr),
       d_stats(s),
       d_tds(tr.getTermDatabaseSygus()),
-      d_verify(qs.options(), d_tds),
+      d_verify(qs.options(), qs.getLogicInfo(), d_tds),
       d_hasSolution(false),
       d_ceg_si(new CegSingleInv(qs.getEnv(), tr, s)),
       d_templInfer(new SygusTemplateInfer),
@@ -64,10 +64,10 @@ SynthConjecture::SynthConjecture(QuantifiersState& qs,
       d_ceg_gc(new CegGrammarConstructor(d_tds, this)),
       d_sygus_rconst(new SygusRepairConst(qs.getEnv(), d_tds)),
       d_exampleInfer(new ExampleInfer(d_tds)),
-      d_ceg_pbe(new SygusPbe(qim, d_tds, this)),
-      d_ceg_cegis(new Cegis(qim, d_tds, this)),
+      d_ceg_pbe(new SygusPbe(qs, qim, d_tds, this)),
+      d_ceg_cegis(new Cegis(qs, qim, d_tds, this)),
       d_ceg_cegisUnif(new CegisUnif(qs, qim, d_tds, this)),
-      d_sygus_ccore(new CegisCoreConnective(qim, d_tds, this)),
+      d_sygus_ccore(new CegisCoreConnective(qs, qim, d_tds, this)),
       d_master(nullptr),
       d_set_ce_sk_vars(false),
       d_repair_index(0),
@@ -609,7 +609,8 @@ bool SynthConjecture::checkSideCondition(const std::vector<Node>& cvals) const
     }
     Trace("sygus-engine") << "Check side condition..." << std::endl;
     Trace("cegqi-debug") << "Check side condition : " << sc << std::endl;
-    Result r = checkWithSubsolver(sc);
+    Env& env = d_qstate.getEnv();
+    Result r = checkWithSubsolver(sc, env.getOptions(), env.getLogicInfo());
     Trace("cegqi-debug") << "...got side condition : " << r << std::endl;
     if (r == Result::UNSAT)
     {
index 65907cb31f1a7bc2b96a38a141a88863b4cb54a3..cdcbeb85dd7674c87a1c6baa66c6cffb2f5d10cc 100644 (file)
@@ -30,7 +30,7 @@ SynthEngine::SynthEngine(QuantifiersState& qs,
                          QuantifiersInferenceManager& qim,
                          QuantifiersRegistry& qr,
                          TermRegistry& tr)
-    : QuantifiersModule(qs, qim, qr, tr), d_conj(nullptr), d_sqp()
+    : QuantifiersModule(qs, qim, qr, tr), d_conj(nullptr), d_sqp(qs.getEnv())
 {
   d_conjs.push_back(std::unique_ptr<SynthConjecture>(
       new SynthConjecture(qs, qim, qr, tr, d_statistics)));
index 9e8171fdc51138b9fa497e1ec6d51b8060e63dc1..db09b45ed601aaa7aaacb22ce0d0bf2fc7cef6a2 100644 (file)
@@ -32,7 +32,10 @@ namespace cvc5 {
 namespace theory {
 namespace quantifiers {
 
-SynthVerify::SynthVerify(const Options& opts, TermDbSygus* tds) : d_tds(tds)
+SynthVerify::SynthVerify(const Options& opts,
+                         const LogicInfo& logicInfo,
+                         TermDbSygus* tds)
+    : d_tds(tds), d_subLogicInfo(logicInfo)
 {
   // determine the options to use for the verification subsolvers we spawn
   // we start with the provided options
@@ -102,7 +105,7 @@ Result SynthVerify::verify(Node query,
     }
   }
   Trace("sygus-engine") << "  *** Verify with subcall..." << std::endl;
-  Result r = checkWithSubsolver(query, vars, mvs, &d_subOptions);
+  Result r = checkWithSubsolver(query, vars, mvs, d_subOptions, d_subLogicInfo);
   Trace("sygus-engine") << "  ...got " << r << std::endl;
   if (r.asSatisfiabilityResult().isSat() == Result::SAT)
   {
index c4d1052da588bc131dc000a53153d341890e0785..948a707875e769b683b8a26d02cb13bad8c3f635 100644 (file)
@@ -34,7 +34,9 @@ namespace quantifiers {
 class SynthVerify
 {
  public:
-  SynthVerify(const Options& opts, TermDbSygus* tds);
+  SynthVerify(const Options& opts,
+              const LogicInfo& logicInfo,
+              TermDbSygus* tds);
   ~SynthVerify();
   /**
    * Verification call, which takes into account specific aspects of the
@@ -55,6 +57,8 @@ class SynthVerify
   TermDbSygus* d_tds;
   /** The options for subsolver calls */
   Options d_subOptions;
+  /** The logic info for subsolver calls */
+  const LogicInfo& d_subLogicInfo;
 };
 
 }  // namespace quantifiers
index 5f285dc073b47db8c5bb5e04eb76ede3f0f63384..dda065d7b1501211cd8ee0fe9ad57d62027bb8ae 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "theory/smt_engine_subsolver.h"
 
+#include "smt/env.h"
 #include "smt/smt_engine.h"
 #include "smt/smt_engine_scope.h"
 #include "theory/rewriter.h"
@@ -42,30 +43,34 @@ Result quickCheck(Node& query)
 }
 
 void initializeSubsolver(std::unique_ptr<SmtEngine>& smte,
-                         Options* opts,
+                         const Options& opts,
+                         const LogicInfo& logicInfo,
                          bool needsTimeout,
                          unsigned long timeout)
 {
   NodeManager* nm = NodeManager::currentNM();
-  SmtEngine* smtCurr = smt::currentSmtEngine();
-  if (opts == nullptr)
-  {
-    // must copy the options
-    opts = &smtCurr->getOptions();
-  }
-  smte.reset(new SmtEngine(nm, opts));
+  smte.reset(new SmtEngine(nm, &opts));
   smte->setIsInternalSubsolver();
-  smte->setLogic(smtCurr->getLogicInfo());
+  smte->setLogic(logicInfo);
   // set the options
   if (needsTimeout)
   {
     smte->setTimeLimit(timeout);
   }
 }
+void initializeSubsolver(std::unique_ptr<SmtEngine>& smte,
+                         const Env& env,
+                         bool needsTimeout,
+                         unsigned long timeout)
+{
+  initializeSubsolver(
+      smte, env.getOptions(), env.getLogicInfo(), needsTimeout, timeout);
+}
 
 Result checkWithSubsolver(std::unique_ptr<SmtEngine>& smte,
                           Node query,
-                          Options* opts,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout,
                           unsigned long timeout)
 {
@@ -75,26 +80,28 @@ Result checkWithSubsolver(std::unique_ptr<SmtEngine>& smte,
   {
     return r;
   }
-  initializeSubsolver(smte, opts, needsTimeout, timeout);
+  initializeSubsolver(smte, opts, logicInfo, needsTimeout, timeout);
   smte->assertFormula(query);
   return smte->checkSat();
 }
 
 Result checkWithSubsolver(Node query,
-                          Options* opts,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout,
                           unsigned long timeout)
 {
   std::vector<Node> vars;
   std::vector<Node> modelVals;
   return checkWithSubsolver(
-      query, vars, modelVals, opts, needsTimeout, timeout);
+      query, vars, modelVals, opts, logicInfo, needsTimeout, timeout);
 }
 
 Result checkWithSubsolver(Node query,
                           const std::vector<Node>& vars,
                           std::vector<Node>& modelVals,
-                          Options* opts,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout,
                           unsigned long timeout)
 {
@@ -116,7 +123,7 @@ Result checkWithSubsolver(Node query,
     return r;
   }
   std::unique_ptr<SmtEngine> smte;
-  initializeSubsolver(smte, opts, needsTimeout, timeout);
+  initializeSubsolver(smte, opts, logicInfo, needsTimeout, timeout);
   smte->assertFormula(query);
   r = smte->checkSat();
   if (r.asSatisfiabilityResult().isSat() == Result::SAT)
index 2d80831f2ff9951c466cede11211f9f68ba18eda..028c35cd81c76515451a871416c14e89a212e3ac 100644 (file)
@@ -41,13 +41,22 @@ namespace theory {
  * if the current SMT engine has declared a separation logic heap.
  *
  * @param smte The smt engine pointer to initialize
- * @param opts The options for the subsolver. If nullptr, then we copy the
- * options from the current SmtEngine in scope.
+ * @param opts The options for the subsolver.
+ * @param logicInfo The logic info to set on the subsolver
  * @param needsTimeout Whether we would like to set a timeout
  * @param timeout The timeout (in milliseconds)
  */
 void initializeSubsolver(std::unique_ptr<SmtEngine>& smte,
-                         Options* opts = nullptr,
+                         const Options& opts,
+                         const LogicInfo& logicInfo,
+                         bool needsTimeout = false,
+                         unsigned long timeout = 0);
+
+/**
+ * Version that uses the options and logicInfo in an environment.
+ */
+void initializeSubsolver(std::unique_ptr<SmtEngine>& smte,
+                         const Env& env,
                          bool needsTimeout = false,
                          unsigned long timeout = 0);
 
@@ -59,7 +68,8 @@ void initializeSubsolver(std::unique_ptr<SmtEngine>& smte,
  */
 Result checkWithSubsolver(std::unique_ptr<SmtEngine>& smte,
                           Node query,
-                          Options* opts = nullptr,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout = false,
                           unsigned long timeout = 0);
 
@@ -71,11 +81,13 @@ Result checkWithSubsolver(std::unique_ptr<SmtEngine>& smte,
  *
  * @param query The query to check
  * @param opts The options for the subsolver
+ * @param logicInfo The logic info to set on the subsolver
  * @param needsTimeout Whether we would like to set a timeout
  * @param timeout The timeout (in milliseconds)
  */
 Result checkWithSubsolver(Node query,
-                          Options* opts = nullptr,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout = false,
                           unsigned long timeout = 0);
 
@@ -88,13 +100,15 @@ Result checkWithSubsolver(Node query,
  * @param vars The variables we are interesting in getting a model for.
  * @param modelVals A vector storing the model values of variables in vars.
  * @param opts The options for the subsolver
+ * @param logicInfo The logic info to set on the subsolver
  * @param needsTimeout Whether we would like to set a timeout
  * @param timeout The timeout (in milliseconds)
  */
 Result checkWithSubsolver(Node query,
                           const std::vector<Node>& vars,
                           std::vector<Node>& modelVals,
-                          Options* opts = nullptr,
+                          const Options& opts,
+                          const LogicInfo& logicInfo,
                           bool needsTimeout = false,
                           unsigned long timeout = 0);