int i;
Rule *r;
+ if (!solv->weakrulemap.size)
+ return;
for (i = 1, r = solv->rules + i; i < solv->learntrules; i++, r++)
{
if (r->d >= 0) /* already enabled? */
int njob, nfeature, nupdate, pass;
queue_empty(&solv->problems);
solver_reset(solv);
-
- if (!solv->problems.count)
- solver_run_sat(solv, 0, 0);
+ solver_run_sat(solv, 0, 0);
if (!solv->problems.count)
{
{
Pool *pool = solv->pool;
Queue redoq;
- Queue problem, solution, problems_save;
+ Queue problem, solution, problems_save, branches_save, decisionq_reason_save;
int i, j, nsol;
int essentialok;
unsigned int now;
int oldmistakes = solv->cleandeps_mistakes ? solv->cleandeps_mistakes->count : 0;
Id extraflags = -1;
- int decisioncnt_update;
- int decisioncnt_keep;
- int decisioncnt_resolve;
- int decisioncnt_weak;
- int decisioncnt_orphan;
now = solv_timems(0);
queue_init(&redoq);
queue_push(&redoq, solv->decisionq_why.elements[i]);
queue_push(&redoq, solv->decisionmap[p > 0 ? p : -p]);
}
- decisioncnt_update = solv->decisioncnt_update;
- decisioncnt_keep = solv->decisioncnt_keep;
- decisioncnt_resolve = solv->decisioncnt_resolve;
- decisioncnt_weak = solv->decisioncnt_weak;
- decisioncnt_orphan = solv->decisioncnt_orphan;
/* save problems queue */
problems_save = solv->problems;
memset(&solv->problems, 0, sizeof(solv->problems));
+ /* save branches queue */
+ branches_save = solv->problems;
+ memset(&solv->branches, 0, sizeof(solv->branches));
+
+ /* save decisionq_reason */
+ decisionq_reason_save = solv->decisionq_reason;
+ memset(&solv->decisionq_reason, 0, sizeof(solv->decisionq_reason));
+
/* extract problem from queue */
queue_init(&problem);
for (i = solidx + 1; i < solv->solutions.count; i++)
solv->decisionmap[p > 0 ? p : -p] = redoq.elements[i + 2];
}
queue_free(&redoq);
- solv->decisioncnt_update = decisioncnt_update;
- solv->decisioncnt_keep = decisioncnt_keep;
- solv->decisioncnt_resolve = decisioncnt_resolve;
- solv->decisioncnt_weak = decisioncnt_weak;
- solv->decisioncnt_orphan = decisioncnt_orphan;
+
+ /* restore decision reasons */
+ queue_free(&solv->decisionq_reason);
+ solv->decisionq_reason = decisionq_reason_save;
/* restore problems */
queue_free(&solv->problems);
solv->problems = problems_save;
+ /* restore branches */
+ queue_free(&solv->branches);
+ solv->branches = branches_save;
+
if (solv->cleandeps_mistakes)
{
if (oldmistakes)
{
if (*reqrp > 0 && r->p < -1)
{
+ Pool *pool = solv->pool;
Id op = -solv->rules[*reqrp].p;
- if (op > 1 && solv->pool->solvables[op].arch != solv->pool->solvables[-r->p].arch)
+ if (op > 1 && pool->solvables[op].arch != pool->solvables[-r->p].arch &&
+ pool->solvables[op].arch != pool->noarchid &&
+ pool->solvables[-r->p].arch != pool->noarchid)
continue; /* different arch, skip */
}
/* prefer assertions */