void
solver_reset(Solver *solv)
{
- Pool *pool = solv->pool;
int i;
Id v;
/* adapt learnt rule status to new set of enabled/disabled rules */
enabledisablelearntrules(solv);
-
- /* redo all assertion rule decisions */
- makeruledecisions(solv);
- POOL_DEBUG(SOLV_DEBUG_UNSOLVABLE, "decisions so far: %d\n", solv->decisionq.count);
}
if (!r)
break;
if (level == 1)
- {
- if (analyze_unsolvable(solv, r, disablerules) < 0)
- return -1;
- continue; /* propagate initial decisions */
- }
+ return analyze_unsolvable(solv, r, disablerules);
POOL_DEBUG(SOLV_DEBUG_ANALYZE, "conflict with rule #%d\n", (int)(r - solv->rules));
level = analyze(solv, level, r, &lr);
/* the new rule is unit by design */
solver_printruleclass(solv, SOLV_DEBUG_RULE_CREATION, solv->rules + i);
}
- POOL_DEBUG(SOLV_DEBUG_SOLVER, "initial decisions: %d\n", solv->decisionq.count);
-
/* start SAT algorithm */
- level = 1;
+ level = 0;
systemlevel = level + 1;
POOL_DEBUG(SOLV_DEBUG_SOLVER, "solving...\n");
/*
* here's the main loop:
- * 1) propagate new decisions (only needed once)
+ * 1) decide assertion rules and propagate
* 2) fulfill jobs
* 3) try to keep installed packages
* 4) fulfill all unresolved rules
/*
* initial propagation of the assertions
*/
- if (level == 1)
+ if (level <= 0)
{
- POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "propagating (propagate_index: %d; size decisionq: %d)...\n", solv->propagate_index, solv->decisionq.count);
- if ((r = propagate(solv, level)) != 0)
+ if (level < 0)
+ break;
+ makeruledecisions(solv);
+ level = 1;
+ if (!disablerules && solv->problems.count)
{
- if (analyze_unsolvable(solv, r, disablerules) >= 0)
- continue;
level = -1;
- break; /* unsolvable */
+ break;
}
+ POOL_DEBUG(SOLV_DEBUG_PROPAGATE, "initial propagate (propagate_index: %d; size decisionq: %d)...\n", solv->propagate_index, solv->decisionq.count);
+ if ((r = propagate(solv, level)) != 0)
+ {
+ level = analyze_unsolvable(solv, r, disablerules);
+ continue;
+ }
+ systemlevel = level + 1;
}
/*
olevel = level;
level = resolve_jobrules(solv, level, disablerules, &dq);
if (level < olevel)
- {
- if (level < 0)
- break; /* unsolvable */
- continue;
- }
+ continue;
systemlevel = level + 1;
}
{
olevel = level;
level = selectandinstall(solv, level, &dq, disablerules, rr - solv->rules);
- if (level < 0)
- break;
if (level <= olevel)
{
- if (level == 1 || level < passlevel)
+ if (level < passlevel)
break; /* trouble */
if (level < olevel)
n = installed->start; /* redo all */
POOL_DEBUG(SOLV_DEBUG_POLICY, "keeping %s\n", pool_solvid2str(pool, i));
level = setpropagatelearn(solv, level, i, disablerules, r - solv->rules);
}
- if (level < 0)
- break;
if (level <= olevel)
{
- if (level == 1 || level < passlevel)
+ if (level < passlevel)
break; /* trouble */
if (level < olevel)
n = installed->start; /* redo all */
}
installedpos = installed->start; /* reset installedpos */
}
- if (level < 0)
- break; /* unsolvable */
systemlevel = level + 1;
if (pass < 2)
continue; /* had trouble, retry */
olevel = level;
level = resolve_jobrules(solv, level, disablerules, &dq);
if (level < olevel)
- {
- if (level == 0)
- break; /* unsolvable */
- continue;
- }
+ continue;
systemlevel = level + 1;
}
olevel = level;
level = selectandinstall(solv, level, &dq, disablerules, r - solv->rules);
- if (level < 0)
- break; /* unsolvable */
- if (level < systemlevel || level == 1)
+ if (level < systemlevel)
break; /* trouble */
/* something changed, so look at all rules again */
n = 0;
}
if (n < solv->nrules) /* ran into trouble? */
- {
- if (level < 0)
- break; /* unsolvable */
- continue; /* start over */
- }
+ continue; /* start over */
/* decide leftover cleandeps packages */
if (solv->cleandepsmap.size && solv->installed)
else
POOL_DEBUG(SOLV_DEBUG_POLICY, "installing recommended %s\n", pool_solvid2str(pool, p));
level = setpropagatelearn(solv, level, p, 0, 0);
- if (level < 0)
- break;
continue; /* back to main loop */
}
if (i < dqs.count || solv->decisionq.count < decisioncount)
{
map_free(&dqmap);
- if (level < 0)
- break;
continue;
}
break; /* had a problem above, quit loop */
}
map_free(&dqmap);
- if (level < 0)
- break;
continue; /* back to main loop so that all deps are checked */
}
}
break;
}
if (installedone || i < solv->orphaned.count)
- {
- if (level < 0)
- break;
- continue; /* back to main loop */
- }
+ continue; /* back to main loop */
for (i = 0; i < solv->orphaned.count; i++)
{
p = solv->orphaned.elements[i];
break;
}
if (i < solv->orphaned.count)
- {
- if (level < 0)
- break;
- continue; /* back to main loop */
- }
+ continue; /* back to main loop */
if (solv->brokenorphanrules)
{
solver_check_brokenorphanrules(solv, &dq);
if (level < olevel)
break;
}
- if (level < 0)
- break;
continue;
}
}
break;
}
if (p < solv->installed->end)
- {
- if (level < 0)
- break;
- continue; /* back to main loop */
- }
+ continue; /* back to main loop */
}
if (solv->installed && solv->cleandepsmap.size)
{
if (cleandeps_check_mistakes(solv, level))
{
- level = 1; /* restart from scratch */
- systemlevel = level + 1;
+ level = 0; /* restart from scratch */
continue;
}
}
while (i > 0 && solv->branches.elements[i - 1] > 0)
i--;
level = takebranch(solv, i, endi, "branching", disablerules);
- if (level < 0)
- break;
continue;
}
}
{
minimizationsteps++;
level = takebranch(solv, lasti, lastiend, "minimizing", disablerules);
- if (level < 0)
- break;
continue; /* back to main loop */
}
}
if (solv->dupmap_all && solv->orphaned.count && solv->break_orphans)
solver_breakorphans(solv);
- /* make initial decisions based on assertion rules */
- makeruledecisions(solv);
- POOL_DEBUG(SOLV_DEBUG_SOLVER, "problems so far: %d\n", solv->problems.count);
-
/*
* ********************************************
* solve!