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;
}
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++)
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);
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 */
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--;
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;
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)
}
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)
static void
-findrecommendedsuggested(Solver *solv)
+solver_findrecommendedsuggested(Solver *solv)
{
Pool *pool = solv->pool;
Queue redoq, disabledq;
/* 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];
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);
/*
* calculate recommended/suggested packages
*/
- findrecommendedsuggested(solv);
+ solver_findrecommendedsuggested(solv);
/*
* prepare solution queue if there were problems
map_free(&installedmap);
}
+/*-------------------------------------------------------------------
+ *
+ * decision introspection
+ */
+
int
solver_get_decisionlevel(Solver *solv, Id p)
{