Fix performance issue in a DFS search (bug 474)
authorKshitij Bansal <kshitij@cs.nyu.edu>
Thu, 6 Dec 2012 21:31:56 +0000 (16:31 -0500)
committerFrançois Bobot <francois@bobot.eu>
Fri, 7 Dec 2012 08:27:57 +0000 (09:27 +0100)
(cherry picked from commit f056522a587d1b080224992355be070b73d97a3b)

src/decision/justification_heuristic.cpp
src/decision/justification_heuristic.h

index ba8ab91b7b299707b7feeb64d4195834b683caa3..4ec4588f3acd136ee1f895fe13d7601f361887cc 100644 (file)
@@ -70,13 +70,17 @@ SatValue JustificationHeuristic::tryGetSatValue(Node n)
 void JustificationHeuristic::computeITEs(TNode n, IteList &l)
 {
   Trace("jh-ite") << " computeITEs( " << n << ", &l)\n";
+  d_visitedComputeITE.insert(n);
   for(unsigned i=0; i<n.getNumChildren(); ++i) {
     SkolemMap::iterator it2 = d_iteAssertions.find(n[i]);
     if(it2 != d_iteAssertions.end()) {
       l.push_back(make_pair(n[i], it2->second));
       Assert(n[i].getNumChildren() == 0);
     }
-    computeITEs(n[i], l);
+    if(d_visitedComputeITE.find(n[i]) ==
+         d_visitedComputeITE.end()) {
+      computeITEs(n[i], l);
+    }
   }
 }
 
@@ -89,6 +93,7 @@ const JustificationHeuristic::IteList& JustificationHeuristic::getITEs(TNode n)
     // Compute the list of ITEs
     // TODO: optimize by avoiding multiple lookup for d_iteCache[n]
     d_iteCache[n] = IteList();
+    d_visitedComputeITE.clear();
     computeITEs(n, d_iteCache[n]);
     return d_iteCache[n];
   }
index a3b05b1bb29d4c6bfddf553237b046200e102cd4..de6bf5095ce9c80b3f5aef49287b51e1d721d4ad 100644 (file)
@@ -76,6 +76,12 @@ class JustificationHeuristic : public ITEDecisionStrategy {
    * term-ITE.
    */
   hash_set<TNode,TNodeHashFunction> d_visited;
+
+  /**
+   * Set to track visited nodes in a dfs search done in computeITE
+   * function
+   */
+  hash_set<TNode,TNodeHashFunction> d_visitedComputeITE;
 public:
   JustificationHeuristic(CVC4::DecisionEngine* de, context::Context *c):
     ITEDecisionStrategy(de, c),