From: Michael Schroeder Date: Tue, 3 Jan 2012 16:06:30 +0000 (+0100) Subject: - clean up findrecommendedsuggested X-Git-Tag: BASE-SuSE-Code-12_2-Branch~216 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=80445cc0bda870adb1c44aae2a85a2755526de4a;p=platform%2Fupstream%2Flibsolv.git - clean up findrecommendedsuggested --- diff --git a/src/problems.c b/src/problems.c index 6a5e979..6d8f831 100644 --- a/src/problems.c +++ b/src/problems.c @@ -489,25 +489,30 @@ convertsolution(Solver *solv, Id why, Queue *solutionq) int solver_prepare_solutions(Solver *solv) { - int i, j = 1, idx = 1; + int i, j = 1, idx; if (!solv->problems.count) return 0; - queue_push(&solv->solutions, 0); - queue_push(&solv->solutions, -1); /* unrefined */ + queue_empty(&solv->solutions); + queue_push(&solv->solutions, 0); /* dummy so idx is always nonzero */ + idx = solv->solutions.count; + queue_push(&solv->solutions, -1); /* unrefined */ + /* proofidx stays in position, thus we start with 1 */ for (i = 1; i < solv->problems.count; i++) { Id p = solv->problems.elements[i]; queue_push(&solv->solutions, p); if (p) continue; + /* end of problem reached */ solv->problems.elements[j++] = idx; if (i + 1 >= solv->problems.count) break; + /* start another problem */ solv->problems.elements[j++] = solv->problems.elements[++i]; /* copy proofidx */ idx = solv->solutions.count; - queue_push(&solv->solutions, -1); - } + queue_push(&solv->solutions, -1); /* unrefined */ + } solv->problems.count = j; return j / 2; } @@ -524,12 +529,9 @@ create_solutions(Solver *solv, int probnr, int solidx) Queue problem, solution, problems_save; int i, j, nsol; int essentialok; - int recocount; unsigned int now; now = solv_timems(0); - recocount = solv->recommendations.count; - solv->recommendations.count = 0; /* so that revert() doesn't mess with it later */ queue_init(&redoq); /* save decisionq, decisionq_why, decisionmap */ for (i = 0; i < solv->decisionq.count; i++) @@ -623,7 +625,6 @@ create_solutions(Solver *solv, int probnr, int solidx) queue_push(&solv->decisionq_why, redoq.elements[i + 1]); solv->decisionmap[p > 0 ? p : -p] = redoq.elements[i + 2]; } - solv->recommendations.count = recocount; queue_free(&redoq); /* restore problems */ queue_free(&solv->problems); diff --git a/src/solver.c b/src/solver.c index d96acd4..10d3069 100644 --- a/src/solver.c +++ b/src/solver.c @@ -833,7 +833,6 @@ solver_reset(Solver *solv) solv->decisionq.count = 0; solv->recommends_index = -1; solv->propagate_index = 0; - solv->recommendations.count = 0; solv->branches.count = 0; /* adapt learnt rule status to new set of enabled/disabled rules */ @@ -1065,8 +1064,6 @@ revert(Solver *solv, int level) if (solv->decisionmap[vv] <= level && solv->decisionmap[vv] >= -level) break; POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "reverting decision %d at %d\n", v, solv->decisionmap[vv]); - if (v > 0 && solv->recommendations.count && v == solv->recommendations.elements[solv->recommendations.count - 1]) - solv->recommendations.count--; solv->decisionmap[vv] = 0; solv->decisionq.count--; solv->decisionq_why.count--; @@ -1949,13 +1946,12 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) if (dq.count == 1) { - /* simple case, just one package. no need to choose */ + /* simple case, just one package. no need to choose to best version */ p = dq.elements[0]; if (dqs.count) POOL_DEBUG(SOLV_DEBUG_POLICY, "installing supplemented %s\n", pool_solvid2str(pool, p)); else POOL_DEBUG(SOLV_DEBUG_POLICY, "installing recommended %s\n", pool_solvid2str(pool, p)); - queue_push(&solv->recommendations, p); level = setpropagatelearn(solv, level, p, 0, 0); if (level == 0) break; @@ -1977,7 +1973,6 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) if (solv->decisionmap[p] || !MAPTST(&dqmap, p)) continue; POOL_DEBUG(SOLV_DEBUG_POLICY, "installing supplemented %s\n", pool_solvid2str(pool, p)); - queue_push(&solv->recommendations, p); olevel = level; level = setpropagatelearn(solv, level, p, 0, 0); if (level <= olevel) @@ -2030,7 +2025,6 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) } p = dq.elements[0]; POOL_DEBUG(SOLV_DEBUG_POLICY, "installing recommended %s\n", pool_solvid2str(pool, p)); - queue_push(&solv->recommendations, p); olevel = level; level = setpropagatelearn(solv, level, p, 0, 0); if (level <= olevel || solv->decisionq.count < decisioncount) @@ -2337,7 +2331,7 @@ weaken_solvable_deps(Solver *solv, Id p) static void -findrecommendedsuggested(Solver *solv) +solver_findrecommendedsuggested(Solver *solv) { Pool *pool = solv->pool; Queue redoq, disabledq; @@ -2394,13 +2388,30 @@ findrecommendedsuggested(Solver *solv) /* if redoq.count == 0 we already found all recommended in the * solver run */ - if (redoq.count || solv->dontinstallrecommended || !solv->dontshowinstalledrecommended || solv->ignorealreadyrecommended) + if (1) { Id rec, *recp, p, pp; /* create map of all recommened packages */ solv->recommends_index = -1; MAPZERO(&solv->recommendsmap); + + /* put all packages the solver already chose in the map */ + if (solv->decisioncnt_weak) + { + for (i = solv->decisioncnt_weak; i < solv->decisioncnt_orphan; i++) + { + Id why; + why = solv->decisionq_why.elements[i]; + if (why) + continue; /* forced by unit rule */ + p = solv->decisionq.elements[i]; + if (p < 0) + continue; + MAPSET(&solv->recommendsmap, p); + } + } + for (i = 0; i < solv->decisionq.count; i++) { p = solv->decisionq.elements[i]; @@ -2448,10 +2459,7 @@ findrecommendedsuggested(Solver *solv) if (!solver_is_supplementing(solv, s)) continue; } - if (solv->dontinstallrecommended) - queue_push(&solv->recommendations, i); - else - queue_pushunique(&solv->recommendations, i); + queue_push(&solv->recommendations, i); } /* we use MODE_SUGGEST here so that repo prio is ignored */ policy_filter_unwanted(solv, &solv->recommendations, POLICY_MODE_SUGGEST); @@ -3073,7 +3081,7 @@ solver_solve(Solver *solv, Queue *job) /* * calculate recommended/suggested packages */ - findrecommendedsuggested(solv); + solver_findrecommendedsuggested(solv); /* * prepare solution queue if there were problems @@ -3144,6 +3152,11 @@ solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res) map_free(&installedmap); } +/*------------------------------------------------------------------- + * + * decision introspection + */ + int solver_get_decisionlevel(Solver *solv, Id p) {