[Aptitude-devel] r3070 - in branches/aptitude-0.3/aptitude: . src/cmdline src/generic src/generic/problemresolver
Daniel Burrows
dburrows@costa.debian.org
Sat, 23 Apr 2005 03:21:43 +0000
Author: dburrows
Date: Sat Apr 23 03:21:40 2005
New Revision: 3070
Modified:
branches/aptitude-0.3/aptitude/ChangeLog
branches/aptitude-0.3/aptitude/src/cmdline/cmdline_do_action.cc
branches/aptitude-0.3/aptitude/src/generic/aptcache.cc
branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.cc
branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h
branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h
Log:
Instead of automatically popping full solutions out as soon as
they arise, risk taking more time in order to get a better
result. (the effect of the old behavior can mostly be restored
by making the solution bonus really big).
Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog (original)
+++ branches/aptitude-0.3/aptitude/ChangeLog Sat Apr 23 03:21:40 2005
@@ -1,5 +1,16 @@
2005-04-22 Daniel Burrows <dburrows@debian.org>
+ * src/cmdline/cmdline_do_action.cc, src/generic/aptcache.cc, src/generic/aptitude_resolver.cc, src/generic/aptitude_resolver.h, src/generic/problemresolver/problemresolver.h:
+
+ Instead of automatically floating complete solutions to the head
+ of the queue, apply a configurable bonus score to them (and in
+ fact it's set rather low by default). This should avoid
+ situations where a really bad solution happens to appear before
+ a pretty good one.
+
+ Also, remove the now-useless debugging invocation of the
+ resolver.
+
* src/solution_fragment.cc:
Display the score of the solution.
Modified: branches/aptitude-0.3/aptitude/src/cmdline/cmdline_do_action.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/cmdline/cmdline_do_action.cc (original)
+++ branches/aptitude-0.3/aptitude/src/cmdline/cmdline_do_action.cc Sat Apr 23 03:21:40 2005
@@ -170,34 +170,6 @@
}
(*apt_cache_file)->end_action_group(NULL);
- // Ok, see what the aptitude fixer sez. Try penalizing brokenness
- // fairly heavily:
- aptitude_resolver resolver(10, 50);
-
- // Try to avoid removing packages; prefer keeping them or even
- // upgrading.
- resolver.add_action_scores(50, 25,
- -50, -10,
- -20, -15,
- -40, -100000);
-
- // Prefer higher-priority versions of packages (not excessively)
- resolver.add_priority_scores(5, 4, 3, 1, -1);
-
- // See what happens (for the debugging output).
-
- aptitude_resolver::solution s1=resolver.find_next_solution(10000);
- aptitude_resolver::solution s2=resolver.find_next_solution(10000);
- aptitude_resolver::solution s3=resolver.find_next_solution(10000);
-
- cout << "Solution 1: " << endl;
- s1.dump(cout);
- cout << endl << endl << "Solution 2: " << endl;
- s2.dump(cout);
- cout << endl << endl << "Solution 3: " << endl;
- s3.dump(cout);
- cout << endl << endl;
-
if(dist_upgrade ||
(fix_broken && argc==1 && default_action==cmdline_install))
{
Modified: branches/aptitude-0.3/aptitude/src/generic/aptcache.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptcache.cc (original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptcache.cc Sat Apr 23 03:21:40 2005
@@ -1346,8 +1346,9 @@
{
assert(resolver==NULL);
- resolver=new aptitude_resolver(aptcfg->FindI(PACKAGE "::ProblemResolver::StepPenalty", 10),
- aptcfg->FindI(PACKAGE "::ProblemResolver::BrokenPenalty", 200));
+ resolver=new aptitude_resolver(aptcfg->FindI(PACKAGE "::ProblemResolver::StepScore", -10),
+ aptcfg->FindI(PACKAGE "::ProblemResolver::BrokenScore", -50),
+ aptcfg->FindI(PACKAGE "::ProblemResolver::ResolutionScore", 50));
resolver->add_action_scores(aptcfg->FindI(PACKAGE "::ProblemResolver::PreserveManualScore", 40),
aptcfg->FindI(PACKAGE "::ProblemResolver::PreserveAutoScore", 35),
Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.cc (original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.cc Sat Apr 23 03:21:40 2005
@@ -20,8 +20,9 @@
#include "aptitude_resolver.h"
aptitude_resolver::aptitude_resolver(int step_penalty,
- int broken_penalty)
- :generic_problem_resolver<aptitude_universe>(step_penalty, broken_penalty, universe),
+ int broken_penalty,
+ int resolution_score)
+ :generic_problem_resolver<aptitude_universe>(step_penalty, broken_penalty, resolution_score, universe),
universe()
{
}
Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h (original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver.h Sat Apr 23 03:21:40 2005
@@ -1082,7 +1082,7 @@
{
const aptitude_universe universe;
public:
- aptitude_resolver(int step_penalty, int broken_penalty);
+ aptitude_resolver(int step_score, int broken_score, int resolution_score);
/** Assign scores to all packages and all package versions according
* to its arguments. All scores are assigned with add_score, so
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 Sat Apr 23 03:21:40 2005
@@ -434,16 +434,6 @@
{
bool operator()(const solution &s1, const solution &s2) const
{
- // Solutions that solve *all* dependencies always score higher
- // than those that don't; guarantees we deal with them
- // immediately (but in order of goodness).
- if(s1.get_broken().empty() && !s2.get_broken().empty())
- return false;
- if(s2.get_broken().empty() && !s1.get_broken().empty())
- return true;
-
- // If both are either non-final or final solutions, compare
- // scores.
return s1.get_score() < s2.get_score();
}
};
@@ -473,6 +463,13 @@
*/
int step_score, broken_score;
+ /** How much to reward real solutions -- solutions that fix all
+ * dependencies. Make this big to immediately pick them up, or
+ * small to ignore "bad" solutions (at the risk of running out of
+ * time if no better solution pops up).
+ */
+ int full_solution_score;
+
/** The universe in which we are solving problems. */
const PackageUniverse &universe;
@@ -583,9 +580,13 @@
if(dep_broken(s, v, *bd))
new_broken.insert(*bd);
+ int new_score=new_action_score+broken_score*new_broken.size();
+ if(new_broken.size() == 0)
+ new_score+=full_solution_score;
+
solution s2=solution(action(v), s,
new_broken,
- new_action_score+broken_score*new_broken.size(),
+ new_score,
new_action_score);
if(closed.find(s2) == closed.end())
@@ -691,13 +692,17 @@
/** Construct a new generic_problem_resolver.
*
- * \param _step_penalty the penalty per "step" of a (partial) solution.
- * \param _broken_penalty the penalty per broken dependency of a (partial) solution.
+ * \param _score_penalty the score per "step" of a (partial) solution. Typically negative.
+ * \param _broken_score the score to add per broken dependency of a (partial) solution. Typically negative.
+ * \param _full_solution_score a bonus for goal nodes (things
+ * that solve all dependencies)
* \param _universe the universe in which we are working.
*/
- generic_problem_resolver(int step_penalty, int broken_penalty,
- const PackageUniverse &_universe)
- :step_score(-step_penalty), broken_score(-broken_penalty),
+ generic_problem_resolver(int _step_score, int _broken_score,
+ int _full_solution_score,
+ const PackageUniverse &_universe)
+ :step_score(_step_score), broken_score(_broken_score),
+ full_solution_score(_full_solution_score),
universe(_universe), finished(false), debug(false)
{
version_scores=new int[universe.get_version_count()];