[Aptitude-devel] r2955 - in branches/aptitude-0.3/aptitude: . src/generic/problemresolver

Daniel Burrows dburrows@costa.debian.org
Fri, 08 Apr 2005 17:35:11 +0000


Author: dburrows
Date: Fri Apr  8 17:35:08 2005
New Revision: 2955

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h
Log:
Get the closed queue working to avoid excessive duplication of work.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Fri Apr  8 17:35:08 2005
@@ -1,5 +1,10 @@
 2005-04-08  Daniel Burrows  <dburrows@debian.org>
 
+	* src/generic/problemresolver/problemresolver.h:
+
+	  Enable the closed queue, and fix solution_contents_compare to
+	  not treat all solutions as equal to one another.
+
 	* src/generic/problemresolver/test.cc:
 
 	  Overhaul the test code to make the test fully controlled

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h	Fri Apr  8 17:35:08 2005
@@ -380,7 +380,7 @@
       return real_soln->package_modified(pkg);
     }
 
-    void dump(std::ostream &out)
+    void dump(std::ostream &out) const
     {
       out << "<";
       for(typename std::map<package, action>::const_iterator i=get_actions().begin();
@@ -435,26 +435,34 @@
       // S1 < S2 if
       //   - S1(p)=S2(p) for all p<p' and S1(p')<S2(p'), where
       //     p,p' \in \dom(S1) \cup dom(S2)
-      typename std::map<package,version>::const_iterator i1,i2;
-      const std::map<package,version>
+      typename std::map<package,action>::const_iterator i1,i2;
+      const std::map<package,action>
 	&a1=s1.get_actions(), &a2=s2.get_actions();
 
+      if(a1.size()<a2.size())
+	return true;
+      else if(a2.size()<a1.size())
+	return true;
+
       i1=a1.begin();
       i2=a2.begin();
 
       while(i1!=a1.end() && i2!=a2.end())
 	{
-	  if(i1->first == i2->first && i1->second != i2->second)
-	    return i1->second < i2->second;
-	  else if(i1->first < i2->first)
-	    return i1->second < i2->first.current_version();
-	  else
-	    return i1->first.current_version() < i2->second;
+	  if(i1->first.get_id() < i2->first.get_id())
+	    return true;
+	  else if(i1->first.get_id() > i2->first.get_id())
+	    return false;
+	  else if(i1->second.ver.get_id() < i2->second.ver.get_id())
+	    return true;
+	  else if(i1->second.ver.get_id() > i2->second.ver.get_id())
+	    return false;
+
+	  ++i1;
+	  ++i2;
 	}
 
-      // If they have unequal lengths, the longer one is considered
-      // larger.
-      return i2 != a2.end();
+      return false;
     }
   };
 
@@ -564,11 +572,20 @@
 			 new_action_score+broken_score*new_broken.size(),
 			 new_action_score);
 
-    std::cout << "Enqueuing ";
-    s2.dump(std::cout);
-    std::cout << endl;
+    if(closed.find(s2) == closed.end())
+      {
+	std::cout << "Enqueuing ";
+	s2.dump(std::cout);
+	std::cout << endl;
 
-    open.push(s2);
+	open.push(s2);
+      }
+    else
+      {
+	std::cout << "Dropping closed solution ";
+	s2.dump(std::cout);
+	std::cout << endl;
+      }
   }
 
   /** Generates (and enqueues) successor nodes for the given broken
@@ -709,6 +726,16 @@
 	solution s=open.top();
 	open.pop();
 
+	if(closed.find(s) != closed.end())
+	  {
+	    std::cout << "Dropping closed solution ";
+	    s.dump(std::cout);
+	    std::cout << endl;
+	    continue;
+	  }
+
+	closed.insert(s);
+
 	std::cout << "Processing ";
 
 	s.dump(std::cout);