solver: properly calculate decision "strength" with provides
parent
dec409c6d4
commit
831bce5cf9
30
src/solver.c
30
src/solver.c
|
@ -80,7 +80,7 @@ struct apk_decision {
|
||||||
struct apk_score saved_score;
|
struct apk_score saved_score;
|
||||||
unsigned short saved_requirers;
|
unsigned short saved_requirers;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned short requirers;
|
||||||
unsigned type : 1;
|
unsigned type : 1;
|
||||||
unsigned has_package : 1;
|
unsigned has_package : 1;
|
||||||
unsigned branching_point : 1;
|
unsigned branching_point : 1;
|
||||||
|
@ -885,6 +885,7 @@ static solver_result_t push_decision(struct apk_solver_state *ss,
|
||||||
int topology_position)
|
int topology_position)
|
||||||
{
|
{
|
||||||
struct apk_decision *d;
|
struct apk_decision *d;
|
||||||
|
int i;
|
||||||
|
|
||||||
ASSERT(ss->num_decisions <= ss->max_decisions,
|
ASSERT(ss->num_decisions <= ss->max_decisions,
|
||||||
"Decision tree overflow.");
|
"Decision tree overflow.");
|
||||||
|
@ -903,9 +904,12 @@ static solver_result_t push_decision(struct apk_solver_state *ss,
|
||||||
d->topology_position = topology_position;
|
d->topology_position = topology_position;
|
||||||
d->found_solution = 0;
|
d->found_solution = 0;
|
||||||
d->name = name;
|
d->name = name;
|
||||||
|
d->requirers = name->ss.requirers;
|
||||||
if (pkg) {
|
if (pkg) {
|
||||||
d->has_package = 1;
|
d->has_package = 1;
|
||||||
d->pkg = pkg;
|
d->pkg = pkg;
|
||||||
|
for (i = 0; i < pkg->provides->num; i++)
|
||||||
|
d->requirers += pkg->provides->item[i].name->ss.requirers;
|
||||||
} else {
|
} else {
|
||||||
d->has_package = 0;
|
d->has_package = 0;
|
||||||
d->backup_until = name->ss.last_touched_decision;
|
d->backup_until = name->ss.last_touched_decision;
|
||||||
|
@ -962,15 +966,13 @@ static int next_branch(struct apk_solver_state *ss)
|
||||||
static void apply_constraint(struct apk_solver_state *ss, struct apk_dependency *dep)
|
static void apply_constraint(struct apk_solver_state *ss, struct apk_dependency *dep)
|
||||||
{
|
{
|
||||||
struct apk_package *requirer_pkg = NULL;
|
struct apk_package *requirer_pkg = NULL;
|
||||||
struct apk_name *name = dep->name, *requirer_name = NULL;
|
struct apk_name *name = dep->name;
|
||||||
int i, strength, changed = 0;
|
int i, strength, changed = 0;
|
||||||
|
|
||||||
if (ss->num_decisions > 0) {
|
if (ss->num_decisions > 0) {
|
||||||
requirer_name = ss->decisions[ss->num_decisions].name;
|
struct apk_decision *d = &ss->decisions[ss->num_decisions];
|
||||||
requirer_pkg = decision_to_pkg(&ss->decisions[ss->num_decisions]);
|
requirer_pkg = decision_to_pkg(d);
|
||||||
/* FIXME: should probably take into account the requirer
|
strength = d->requirers;
|
||||||
* package's provided name's 'requirer strength' */
|
|
||||||
strength = requirer_name->ss.requirers ?: 1;
|
|
||||||
} else {
|
} else {
|
||||||
strength = 1;
|
strength = 1;
|
||||||
}
|
}
|
||||||
|
@ -1040,14 +1042,14 @@ static void apply_constraint(struct apk_solver_state *ss, struct apk_dependency
|
||||||
|
|
||||||
static void undo_constraint(struct apk_solver_state *ss, struct apk_dependency *dep)
|
static void undo_constraint(struct apk_solver_state *ss, struct apk_dependency *dep)
|
||||||
{
|
{
|
||||||
struct apk_name *name = dep->name, *requirer_name = NULL;
|
struct apk_name *name = dep->name;
|
||||||
struct apk_package *requirer_pkg = NULL;
|
struct apk_package *requirer_pkg = NULL;
|
||||||
int i, strength;
|
int i, strength;
|
||||||
|
|
||||||
if (ss->num_decisions > 0) {
|
if (ss->num_decisions > 0) {
|
||||||
requirer_name = ss->decisions[ss->num_decisions].name;
|
struct apk_decision *d = &ss->decisions[ss->num_decisions];
|
||||||
requirer_pkg = decision_to_pkg(&ss->decisions[ss->num_decisions]);
|
requirer_pkg = decision_to_pkg(d);
|
||||||
strength = requirer_name->ss.requirers ?: 1;
|
strength = d->requirers;
|
||||||
} else {
|
} else {
|
||||||
strength = 1;
|
strength = 1;
|
||||||
}
|
}
|
||||||
|
@ -1104,12 +1106,6 @@ static void undo_constraint(struct apk_solver_state *ss, struct apk_dependency *
|
||||||
* to store it (or hefty recalculations). */
|
* to store it (or hefty recalculations). */
|
||||||
name->ss.last_touched_decision = 0;
|
name->ss.last_touched_decision = 0;
|
||||||
|
|
||||||
if (requirer_name && requirer_name->ss.requirers != strength) {
|
|
||||||
dbg_printf("requirer %s, dependency %s: strength mismatch %d != %d\n",
|
|
||||||
requirer_name->name, name->name,
|
|
||||||
requirer_name->ss.requirers, strength);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dep->conflict) {
|
if (!dep->conflict) {
|
||||||
name->ss.requirers -= strength;
|
name->ss.requirers -= strength;
|
||||||
dbg_printf("%s requirers -= %d\n", name->name, strength);
|
dbg_printf("%s requirers -= %d\n", name->name, strength);
|
||||||
|
|
Loading…
Reference in New Issue