projects
/
platform
/
upstream
/
libsolv.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
2fcde9f
)
- clean up findrecommendedsuggested
author
Michael Schroeder
<mls@suse.de>
Tue, 3 Jan 2012 16:06:30 +0000
(17:06 +0100)
committer
Michael Schroeder
<mls@suse.de>
Tue, 3 Jan 2012 16:06:58 +0000
(17:06 +0100)
src/problems.c
patch
|
blob
|
history
src/solver.c
patch
|
blob
|
history
diff --git
a/src/problems.c
b/src/problems.c
index
6a5e979
..
6d8f831
100644
(file)
--- 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
solver_prepare_solutions(Solver *solv)
{
- int i, j = 1, idx
= 1;
+ int i, j = 1, idx
;
if (!solv->problems.count)
return 0;
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;
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;
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;
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;
}
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;
Queue problem, solution, problems_save;
int i, j, nsol;
int essentialok;
- int recocount;
unsigned int now;
now = solv_timems(0);
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++)
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];
}
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);
queue_free(&redoq);
/* restore problems */
queue_free(&solv->problems);
diff --git
a/src/solver.c
b/src/solver.c
index
d96acd4
..
10d3069
100644
(file)
--- 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->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 */
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 (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--;
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)
{
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));
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;
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));
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)
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));
}
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)
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
static void
-findrecommendedsuggested(Solver *solv)
+
solver_
findrecommendedsuggested(Solver *solv)
{
Pool *pool = solv->pool;
Queue redoq, disabledq;
{
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 == 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);
{
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];
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 (!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);
}
/* 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
*/
/*
* calculate recommended/suggested packages
*/
- findrecommendedsuggested(solv);
+
solver_
findrecommendedsuggested(solv);
/*
* prepare solution queue if there were problems
/*
* prepare solution queue if there were problems
@@
-3144,6
+3152,11
@@
solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res)
map_free(&installedmap);
}
map_free(&installedmap);
}
+/*-------------------------------------------------------------------
+ *
+ * decision introspection
+ */
+
int
solver_get_decisionlevel(Solver *solv, Id p)
{
int
solver_get_decisionlevel(Solver *solv, Id p)
{