Minor cleanup of NodeManager (#8650)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sat, 23 Apr 2022 15:48:28 +0000 (10:48 -0500)
committerGitHub <noreply@github.com>
Sat, 23 Apr 2022 15:48:28 +0000 (15:48 +0000)
14 files changed:
src/api/cpp/cvc5.cpp
src/expr/node_builder.cpp
src/expr/node_manager_template.cpp
src/expr/node_manager_template.h
src/preprocessing/passes/ite_simp.cpp
src/preprocessing/passes/ite_simp.h
src/preprocessing/passes/synth_rew_rules.cpp
src/theory/datatypes/sygus_datatype_utils.cpp
src/theory/quantifiers/sygus/cegis_unif.cpp
src/theory/quantifiers/sygus/sygus_grammar_cons.cpp
src/theory/quantifiers/sygus/sygus_grammar_norm.cpp
src/theory/rewriter.cpp
src/theory/rewriter.h
src/theory/rewriter_tables_template.h

index 84967b5c9c5fc583d187987b652d8e8b8576eb62..e0983f3af7f7caec16f78c7b37c90148f2fba887 100644 (file)
@@ -4458,9 +4458,7 @@ Sort Grammar::resolve()
   }
 
   std::vector<internal::TypeNode> datatypeTypes =
-      d_solver->getNodeManager()->mkMutualDatatypeTypes(
-          datatypes,
-          internal::NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+      d_solver->getNodeManager()->mkMutualDatatypeTypes(datatypes);
 
   // return is the first datatype
   return Sort(d_solver, datatypeTypes[0]);
index 276dab5e44f9a68b94ee06e345866a24f80adfb5..693eadd395356c74b028951756adda16e3d516c1 100644 (file)
@@ -415,7 +415,7 @@ expr::NodeValue* NodeBuilder::constructNV()
     // reference counts in this case.
     nv->d_nchildren = 0;
     nv->d_kind = d_nv->d_kind;
-    nv->d_id = d_nm->next_id++;  // FIXME multithreading
+    nv->d_id = d_nm->d_nextId++;
     nv->d_rc = 0;
     setUsed();
     if (TraceIsOn("gc"))
@@ -497,7 +497,7 @@ expr::NodeValue* NodeBuilder::constructNV()
       }
       nv->d_nchildren = d_inlineNv.d_nchildren;
       nv->d_kind = d_inlineNv.d_kind;
-      nv->d_id = d_nm->next_id++;  // FIXME multithreading
+      nv->d_id = d_nm->d_nextId++;
       nv->d_rc = 0;
 
       std::copy(d_inlineNv.d_children,
@@ -557,7 +557,7 @@ expr::NodeValue* NodeBuilder::constructNV()
 
       crop();
       expr::NodeValue* nv = d_nv;
-      nv->d_id = d_nm->next_id++;  // FIXME multithreading
+      nv->d_id = d_nm->d_nextId++;
       d_nv = &d_inlineNv;
       d_nvMaxChildren = default_nchild_thresh;
       setUsed();
index 779687eed9e85f547e466daf8f58a7f3ff66f441..57b59dce96ae6f073dd74fb5c7983e5c631bb4e3 100644 (file)
@@ -110,11 +110,10 @@ NodeManager::NodeManager()
     : d_skManager(new SkolemManager),
       d_bvManager(new BoundVarManager),
       d_initialized(false),
-      next_id(0),
+      d_nextId(0),
       d_attrManager(new expr::attr::AttributeManager()),
       d_nodeUnderDeletion(nullptr),
-      d_inReclaimZombies(false),
-      d_abstractValueCount(0)
+      d_inReclaimZombies(false)
 {
 }
 
@@ -556,19 +555,19 @@ TypeNode NodeManager::mkSequenceType(TypeNode elementType)
   return mkTypeNode(kind::SEQUENCE_TYPE, elementType);
 }
 
-TypeNode NodeManager::mkDatatypeType(DType& datatype, uint32_t flags)
+TypeNode NodeManager::mkDatatypeType(DType& datatype)
 {
   // Not worth a special implementation; this doesn't need to be fast
   // code anyway.
   std::vector<DType> datatypes;
   datatypes.push_back(datatype);
-  std::vector<TypeNode> result = mkMutualDatatypeTypes(datatypes, flags);
+  std::vector<TypeNode> result = mkMutualDatatypeTypes(datatypes);
   Assert(result.size() == 1);
   return result.front();
 }
 
 std::vector<TypeNode> NodeManager::mkMutualDatatypeTypes(
-    const std::vector<DType>& datatypes, uint32_t flags)
+    const std::vector<DType>& datatypes)
 {
   std::set<TypeNode> unresolvedTypes;
   // scan the list of datatypes to find unresolved datatypes
@@ -576,13 +575,12 @@ std::vector<TypeNode> NodeManager::mkMutualDatatypeTypes(
   {
     dt.collectUnresolvedDatatypeTypes(unresolvedTypes);
   }
-  return mkMutualDatatypeTypesInternal(datatypes, unresolvedTypes, flags);
+  return mkMutualDatatypeTypesInternal(datatypes, unresolvedTypes);
 }
 
 std::vector<TypeNode> NodeManager::mkMutualDatatypeTypesInternal(
     const std::vector<DType>& datatypes,
-    const std::set<TypeNode>& unresolvedTypes,
-    uint32_t flags)
+    const std::set<TypeNode>& unresolvedTypes)
 {
   std::map<std::string, TypeNode> nameResolutions;
   std::vector<TypeNode> dtts;
@@ -868,23 +866,6 @@ TypeNode NodeManager::mkRecordType(const Record& rec)
   return d_rt_cache.getRecordType(this, rec);
 }
 
-void NodeManager::reclaimAllZombies() { reclaimZombiesUntil(0u); }
-
-/** Reclaim zombies while there are more than k nodes in the pool (if
- * possible).*/
-void NodeManager::reclaimZombiesUntil(uint32_t k)
-{
-  if (safeToReclaimZombies())
-  {
-    while (poolSize() >= k && !d_zombies.empty())
-    {
-      reclaimZombies();
-    }
-  }
-}
-
-size_t NodeManager::poolSize() const { return d_nodeValuePool.size(); }
-
 TypeNode NodeManager::mkSort()
 {
   NodeBuilder nb(this, kind::SORT_TYPE);
@@ -1157,12 +1138,6 @@ Node NodeManager::mkBag(const TypeNode& t, const TNode n, const TNode m)
   return bag;
 }
 
-Node NodeManager::mkUninterpretedSortValue(const TypeNode& type)
-{
-  Node n = mkConst(UninterpretedSortValue(type, ++d_abstractValueCount));
-  return n;
-}
-
 bool NodeManager::hasOperator(Kind k)
 {
   switch (kind::MetaKind mk = kind::metaKindOf(k))
@@ -1228,7 +1203,7 @@ NodeClass NodeManager::mkConstInternal(Kind k, const T& val)
 
   nv->d_nchildren = 0;
   nv->d_kind = k;
-  nv->d_id = next_id++;  // FIXME multithreading
+  nv->d_id = d_nextId++;
   nv->d_rc = 0;
 
   new (&nv->d_children) T(val);
@@ -1267,11 +1242,6 @@ void NodeManager::deleteAttributes(
   d_attrManager->deleteAttributes(ids);
 }
 
-void NodeManager::debugHook(int debugFlag)
-{
-  // For debugging purposes only, DO NOT CHECK IN ANY CODE!
-}
-
 Kind NodeManager::getKindForFunction(TNode fun)
 {
   TypeNode tn = fun.getType();
index d8927f43a016117057f5c4db81563557ce23543f..4e84b16fc36d3dd83952c4442597a943367c54e2 100644 (file)
@@ -48,14 +48,21 @@ class DType;
 class Rational;
 
 namespace expr {
-  namespace attr {
-    class AttributeUniqueId;
-    class AttributeManager;
-    }  // namespace attr
 
-  class TypeChecker;
-  }  // namespace expr
+namespace attr {
+class AttributeUniqueId;
+class AttributeManager;
+}  // namespace attr
 
+class TypeChecker;
+}  // namespace expr
+
+/**
+ * The node manager.
+ *
+ * This class should not be used simulatenously in multiple threads. It is a
+ * singleton that is accessible via NodeManager::currentNM().
+ */
 class NodeManager
 {
   friend class cvc5::Solver;
@@ -66,24 +73,6 @@ class NodeManager
   friend class NodeBuilder;
 
  public:
-  /**
-   * Bits for use in mkDatatypeType() flags.
-   *
-   * DATATYPE_FLAG_PLACEHOLDER indicates that the type should not be printed
-   * out as a definition, for example, in models or during dumping.
-   */
-  enum
-  {
-    DATATYPE_FLAG_NONE = 0,
-    DATATYPE_FLAG_PLACEHOLDER = 1
-  }; /* enum */
-
-  /** Bits for use in mkSort() flags. */
-  enum
-  {
-    SORT_FLAG_NONE = 0,
-    SORT_FLAG_PLACEHOLDER = 1
-  }; /* enum */
 
   /**
    * Return true if given kind is n-ary. The test is based on n-ary kinds
@@ -143,25 +132,6 @@ class NodeManager
   /** Get this node manager's bound variable manager */
   BoundVarManager* getBoundVarManager() { return d_bvManager.get(); }
 
-  /** Reclaim zombies while there are more than k nodes in the pool (if
-   * possible).*/
-  void reclaimZombiesUntil(uint32_t k);
-
-  /** Reclaims all zombies (if possible).*/
-  void reclaimAllZombies();
-
-  /** Size of the node pool. */
-  size_t poolSize() const;
-
-  /**
-   * This function gives developers a hook into the NodeManager.
-   * This can be changed in node_manager.cpp without recompiling most of cvc5.
-   *
-   * debugHook is a debugging only function, and should not be present in
-   * any published code!
-   */
-  void debugHook(int debugFlag);
-
   /**
    * Return the datatype at the given index owned by this class. Type nodes are
    * associated with datatypes through the DatatypeIndexConstant class. The
@@ -493,14 +463,14 @@ class NodeManager
   TypeNode mkSequenceType(TypeNode elementType);
 
   /** Make a type representing the given datatype. */
-  TypeNode mkDatatypeType(DType& datatype, uint32_t flags = DATATYPE_FLAG_NONE);
+  TypeNode mkDatatypeType(DType& datatype);
 
   /**
    * Make a set of types representing the given datatypes, which may be
    * mutually recursive.
    */
   std::vector<TypeNode> mkMutualDatatypeTypes(
-      const std::vector<DType>& datatypes, uint32_t flags = DATATYPE_FLAG_NONE);
+      const std::vector<DType>& datatypes);
 
   /**
    * Make a type representing a constructor with the given argument (subfield)
@@ -655,9 +625,6 @@ class NodeManager
   /** Create a raw symbol with the given type. */
   Node mkRawSymbol(const std::string& name, const TypeNode& type);
 
-  /** Make a new uninterpreted sort value with the given type. */
-  Node mkUninterpretedSortValue(const TypeNode& type);
-
   /** make unique (per Type,Kind) variable. */
   Node mkNullaryOperator(const TypeNode& type, Kind k);
 
@@ -802,8 +769,7 @@ class NodeManager
    */
   std::vector<TypeNode> mkMutualDatatypeTypesInternal(
       const std::vector<DType>& datatypes,
-      const std::set<TypeNode>& unresolvedTypes,
-      uint32_t flags = DATATYPE_FLAG_NONE);
+      const std::set<TypeNode>& unresolvedTypes);
 
   typedef std::unordered_set<expr::NodeValue*,
                              expr::NodeValuePoolHashFunction,
@@ -836,7 +802,7 @@ class NodeManager
   {
     expr::NodeValue nv;
     expr::NodeValue* child[N];
-  }; /* struct NodeManager::NVStorage<N> */
+  };
 
   /**
    * A map of tuple and record types to their corresponding datatype.
@@ -1010,7 +976,8 @@ class NodeManager
 
   bool d_initialized;
 
-  size_t next_id;
+  /** The next node identifier */
+  size_t d_nextId;
 
   expr::attr::AttributeManager* d_attrManager;
 
@@ -1063,14 +1030,6 @@ class NodeManager
 
   TupleTypeCache d_tt_cache;
   RecTypeCache d_rt_cache;
-
-  /**
-   * Keep a count of all abstract values produced by this NodeManager.
-   * Abstract values have a type attribute, so if multiple SolverEngines
-   * are attached to this NodeManager, we don't want their abstract
-   * values to overlap.
-   */
-  uint32_t d_abstractValueCount;
 }; /* class NodeManager */
 
 inline TypeNode NodeManager::mkArrayType(TypeNode indexType,
index 48c045582a23a38de7ac7f1c8464e09fe1355a8c..e8f5e899824b73d0634b08a1cdab83b4a5bece94 100644 (file)
@@ -203,24 +203,6 @@ bool ITESimp::doneSimpITE(AssertionPipeline* assertionsToPreprocess)
     {
       result = d_iteUtilities.compress(assertionsToPreprocess);
     }
-
-    if (result)
-    {
-      // if false, don't bother to reclaim memory here.
-      NodeManager* nm = NodeManager::currentNM();
-      if (nm->poolSize() >= zombieHuntThreshold)
-      {
-        verbose(2) << "..ite simplifier did quite a bit of work.. "
-               << nm->poolSize() << endl;
-        verbose(2) << "....node manager contains " << nm->poolSize()
-               << " nodes before cleanup" << endl;
-        d_iteUtilities.clear();
-        d_env.getRewriter()->clearCaches();
-        nm->reclaimZombiesUntil(zombieHuntThreshold);
-        verbose(2) << "....node manager contains " << nm->poolSize()
-               << " nodes after cleanup" << endl;
-      }
-    }
   }
 
   // Do theory specific preprocessing passes
index 53812f93fafa9018a7cf84d8310ad5e45fcec4d7..7b8e19f50617bb54414eed559a489b2ae64d4559 100644 (file)
@@ -49,8 +49,6 @@ class ITESimp : public PreprocessingPass
   util::ITEUtilities d_iteUtilities;
 
   Statistics d_statistics;
-
-  static const uint32_t zombieHuntThreshold = 524288;
 };
 
 }  // namespace passes
index 3569d12504b87ab8a10e8e913aa0498ea1ca522c..8308ca11cd025416e73baab8285979a6cae6b735 100644 (file)
@@ -395,8 +395,7 @@ PreprocessingPassResult SynthRewRulesPass::applyInternal(
   {
     datatypes.push_back(sdts[i].getDatatype());
   }
-  std::vector<TypeNode> types = nm->mkMutualDatatypeTypes(
-      datatypes, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+  std::vector<TypeNode> types = nm->mkMutualDatatypeTypes(datatypes);
   Trace("srs-input") << "...finished." << std::endl;
   Assert(types.size() == datatypes.size());
   std::map<Node, TypeNode> subtermTypes;
@@ -440,8 +439,7 @@ PreprocessingPassResult SynthRewRulesPass::applyInternal(
     // set that this is a sygus datatype
     sdttl.initializeDatatype(t, sygusVarList, false, false);
     DType dttl = sdttl.getDatatype();
-    TypeNode tlt =
-        nm->mkDatatypeType(dttl, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+    TypeNode tlt = nm->mkDatatypeType(dttl);
     tlGrammarTypes[t] = tlt;
     Trace("srs-input") << "Grammar is: " << std::endl;
     Trace("srs-input") << printer::smt2::Smt2Printer::sygusGrammarString(tlt)
index 935d912b708a31d146cbe4236a40bc4e4e904dbe..6b833cb8138ffc62e422d9fe0bda35e57a3b74e8 100644 (file)
@@ -546,8 +546,7 @@ TypeNode substituteAndGeneralizeSygusType(TypeNode sdt,
     datatypes.push_back(sdts[i].getDatatype());
   }
   // make the datatype types
-  std::vector<TypeNode> datatypeTypes = nm->mkMutualDatatypeTypes(
-      datatypes, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+  std::vector<TypeNode> datatypeTypes = nm->mkMutualDatatypeTypes(datatypes);
   TypeNode sdtS = datatypeTypes[0];
   if (TraceIsOn("dtsygus-gen-debug"))
   {
index e70d48032a98c2b1c8ea1fc684a04da3030c8ee6..9686b081d66b815f23ea3bc132c72a9c105d652b 100644 (file)
@@ -487,8 +487,7 @@ Node CegisUnifEnumDecisionStrategy::mkLiteral(unsigned n)
       sdt.initializeDatatype(nm->integerType(), bvl, false, false);
       std::vector<DType> datatypes;
       datatypes.push_back(sdt.getDatatype());
-      std::vector<TypeNode> dtypes = nm->mkMutualDatatypeTypes(
-          datatypes, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+      std::vector<TypeNode> dtypes = nm->mkMutualDatatypeTypes(datatypes);
       d_virtual_enum = sm->mkDummySkolem("_ve", dtypes[0]);
       d_tds->registerEnumerator(
           d_virtual_enum, Node::null(), d_parent, ROLE_ENUM_CONSTRAINED);
index 81c75a1763e7b7837900224e9f810f7947c39f4d..f6cdc2411598821b706a0e765413b0469a18cb01 100644 (file)
@@ -1544,8 +1544,8 @@ TypeNode CegGrammarConstructor::mkSygusDefaultType(
   }
   Trace("sygus-grammar-def")  << "...made " << datatypes.size() << " datatypes, now make mutual datatype types..." << std::endl;
   Assert(!datatypes.empty());
-  std::vector<TypeNode> types = NodeManager::currentNM()->mkMutualDatatypeTypes(
-      datatypes, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+  std::vector<TypeNode> types =
+      NodeManager::currentNM()->mkMutualDatatypeTypes(datatypes);
   Trace("sygus-grammar-def") << "...finished" << std::endl;
   Assert(types.size() == datatypes.size());
   return types[0];
@@ -1591,8 +1591,7 @@ TypeNode CegGrammarConstructor::mkSygusTemplateTypeRec( Node templ, Node templ_a
       datatypes.push_back(sdts[i].getDatatype());
     }
     std::vector<TypeNode> types =
-        NodeManager::currentNM()->mkMutualDatatypeTypes(
-            datatypes, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+        NodeManager::currentNM()->mkMutualDatatypeTypes(datatypes);
     Assert(types.size() == 1);
     return types[0];
   }
index 58090c98adbea71858ded9bd2bf9ada7a2810074..85ddc9f5f3efdbefac35045cb2e2b16ca114630d 100644 (file)
@@ -526,8 +526,8 @@ TypeNode SygusGrammarNorm::normalizeSygusType(TypeNode tn, Node sygus_vars)
     Trace("sygus-grammar-normalize-build") << "\n";
   }
   Assert(d_dt_all.size() == d_unres_t_all.size());
-  std::vector<TypeNode> types = NodeManager::currentNM()->mkMutualDatatypeTypes(
-      d_dt_all, NodeManager::DATATYPE_FLAG_PLACEHOLDER);
+  std::vector<TypeNode> types =
+      NodeManager::currentNM()->mkMutualDatatypeTypes(d_dt_all);
   Assert(types.size() == d_dt_all.size());
   /* Clear accumulators */
   d_dt_all.clear();
index 22b852b92c61aae7744680fb91565e0570167dac..bf74c028191fe097e1dc3d1feace58a0aa294122 100644 (file)
@@ -481,15 +481,6 @@ RewriteResponse Rewriter::processTrustRewriteResponse(
   return RewriteResponse(tresponse.d_status, trn.getNode());
 }
 
-void Rewriter::clearCaches()
-{
-#ifdef CVC5_ASSERTIONS
-  d_rewriteStack.reset(nullptr);
-#endif
-
-  clearCachesInternal();
-}
-
 bool Rewriter::hasRewrittenWithProofs(TNode n) const
 {
   return d_tpgNodes.find(n) != d_tpgNodes.end();
index 95defbe63319ca9c873401ffd9700224599c3c3c..273ef036e7033605a843498610df197889b36f98 100644 (file)
@@ -89,9 +89,6 @@ class Rewriter {
   /** Set proof node manager */
   void setProofNodeManager(ProofNodeManager* pnm);
 
-  /** Garbage collects the rewrite caches. */
-  void clearCaches();
-
   /**
    * Registers a theory rewriter with this rewriter. The rewriter does not own
    * the theory rewriters.
@@ -153,8 +150,6 @@ class Rewriter {
    */
   Node callRewriteEquality(theory::TheoryId theoryId, TNode equality);
 
-  void clearCachesInternal();
-
   /**
    * Has n been rewritten with proofs? This checks if n is in d_tpgNodes.
    */
index 9fb82481290c8a06461bc8c549736d590449697e..4159cefaf73c6c82e05daaef87a03e8fd3fa8d8c 100644 (file)
@@ -82,30 +82,5 @@ ${post_rewrite_set_cache}
 
 Rewriter::Rewriter() : d_resourceManager(nullptr), d_tpg(nullptr) {}
 
-void Rewriter::clearCachesInternal()
-{
-  typedef cvc5::internal::expr::attr::AttributeUniqueId AttributeUniqueId;
-  std::vector<AttributeUniqueId> preids;
-  // clang-format off
-  ${pre_rewrite_attribute_ids}  // clang-format on
-
-  std::vector<AttributeUniqueId>
-      postids;
-  // clang-format off
-  ${post_rewrite_attribute_ids}  // clang-format on
-
-  std::vector<const AttributeUniqueId*>
-      allids;
-  for (size_t i = 0, size = preids.size(); i < size; ++i)
-  {
-    allids.push_back(&preids[i]);
-  }
-  for (size_t i = 0, size = postids.size(); i < size; ++i)
-  {
-    allids.push_back(&postids[i]);
-  }
-  NodeManager::currentNM()->deleteAttributes(allids);
-}
-
 }  // namespace theory
 }  // namespace cvc5::internal