From b3ff8425e36a641ef13405e1db7be5484e3df5cb Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Fri, 13 Sep 2013 17:39:35 +0200 Subject: [PATCH] add solver_rule2rules: learnt rule introspection --- src/libsolv.ver | 1 + src/rules.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/rules.h | 1 + 3 files changed, 45 insertions(+) diff --git a/src/libsolv.ver b/src/libsolv.ver index 555b676..a902591 100644 --- a/src/libsolv.ver +++ b/src/libsolv.ver @@ -357,6 +357,7 @@ SOLV_1.0 { solver_problemruleinfo2str; solver_rule2job; solver_rule2jobidx; + solver_rule2rules; solver_rule2solvable; solver_ruleclass; solver_ruleinfo; diff --git a/src/rules.c b/src/rules.c index cefae35..af3b6b1 100644 --- a/src/rules.c +++ b/src/rules.c @@ -2291,6 +2291,7 @@ solver_rule2jobidx(Solver *solv, Id rid) return solv->ruletojob.elements[rid - solv->jobrules] + 1; } +/* job rule introspection */ Id solver_rule2job(Solver *solv, Id rid, Id *whatp) { @@ -2307,6 +2308,7 @@ solver_rule2job(Solver *solv, Id rid, Id *whatp) return solv->job.elements[idx]; } +/* update/feature rule introspection */ Id solver_rule2solvable(Solver *solv, Id rid) { @@ -2317,6 +2319,47 @@ solver_rule2solvable(Solver *solv, Id rid) return 0; } +static void +solver_rule2rules_rec(Solver *solv, Id rid, Queue *q, Map *seen) +{ + int i; + Id rid2; + + if (seen) + MAPSET(seen, rid); + for (i = solv->learnt_why.elements[rid - solv->learntrules]; (rid2 = solv->learnt_pool.elements[i]) != 0; i++) + { + if (seen) + { + if (MAPTST(seen, rid2)) + continue; + if (rid2 >= solv->learntrules) + solver_rule2rules_rec(solv, rid2, q, seen); + continue; + } + queue_push(q, rid2); + } +} + +/* learnt rule introspection */ +void +solver_rule2rules(Solver *solv, Id rid, Queue *q, int recursive) +{ + queue_empty(q); + if (rid < solv->learntrules || rid >= solv->nrules) + return; + if (recursive) + { + Map seen; + map_init(&seen, solv->nrules); + solver_rule2rules_rec(solv, rid, q, &seen); + map_free(&seen); + } + else + solver_rule2rules_rec(solv, rid, q, 0); +} + + /* check if the newest versions of pi still provides the dependency we're looking for */ static int solver_choicerulecheck(Solver *solv, Id pi, Rule *r, Map *m) diff --git a/src/rules.h b/src/rules.h index 42e8285..34caf21 100644 --- a/src/rules.h +++ b/src/rules.h @@ -139,6 +139,7 @@ extern void solver_ruleliterals(struct _Solver *solv, Id rid, Queue *q); extern int solver_rule2jobidx(struct _Solver *solv, Id rid); extern Id solver_rule2job(struct _Solver *solv, Id rid, Id *whatp); extern Id solver_rule2solvable(struct _Solver *solv, Id rid); +extern void solver_rule2rules(struct _Solver *solv, Id rid, Queue *q, int recursive); #ifdef __cplusplus -- 2.7.4