*/
static void
-analyze_unsolvable_rule(Solver *solv, Rule *r, Id *lastweakp)
+analyze_unsolvable_rule(Solver *solv, Rule *r, Id *lastweakp, Map *rseen)
{
Pool *pool = solv->pool;
int i;
IF_POOLDEBUG (SAT_DEBUG_UNSOLVABLE)
solver_printruleclass(solv, SAT_DEBUG_UNSOLVABLE, r);
+ MAPSET(rseen, why);
if (solv->learntrules && why >= solv->learntrules)
{
for (i = solv->learnt_why.elements[why - solv->learntrules]; solv->learnt_pool.elements[i]; i++)
- if (solv->learnt_pool.elements[i] > 0)
- analyze_unsolvable_rule(solv, solv->rules + solv->learnt_pool.elements[i], lastweakp);
+ if (solv->learnt_pool.elements[i] > 0 && !MAPTST(rseen, solv->learnt_pool.elements[i]))
+ analyze_unsolvable_rule(solv, solv->rules + solv->learnt_pool.elements[i], lastweakp, rseen);
return;
}
if (MAPTST(&solv->weakrulemap, why))
int oldproblemcount;
int oldlearntpoolcount;
Id lastweak;
+ Map rseen;
POOL_DEBUG(SAT_DEBUG_UNSOLVABLE, "ANALYZE UNSOLVABLE ----------------------\n");
solv->stats_unsolvable++;
r = cr;
map_init(&seen, pool->nsolvables);
+ map_init(&rseen, solv->nrules);
queue_push(&solv->learnt_pool, r - solv->rules);
lastweak = 0;
- analyze_unsolvable_rule(solv, r, &lastweak);
+ analyze_unsolvable_rule(solv, r, &lastweak, &rseen);
d = r->d < 0 ? -r->d - 1 : r->d;
dp = d ? pool->whatprovidesdata + d : 0;
for (i = -1; ; i++)
assert(why > 0);
queue_push(&solv->learnt_pool, why);
r = solv->rules + why;
- analyze_unsolvable_rule(solv, r, &lastweak);
+ if (!MAPTST(&rseen, why))
+ analyze_unsolvable_rule(solv, r, &lastweak, &rseen);
d = r->d < 0 ? -r->d - 1 : r->d;
dp = d ? pool->whatprovidesdata + d : 0;
for (i = -1; ; i++)
}
}
map_free(&seen);
+ map_free(&rseen);
queue_push(&solv->problems, 0); /* mark end of this problem */
if (lastweak)