[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);