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