Skip to content

Commit 3f2c1b9

Browse files
Eh2406mpizenberg
andauthored
perf: don't reuse the same incompatibility repeatedly (#88)
* perf: don't reuse the same incompatibility repeatedly * refactor: rename used_incompatibilities > contradicted_incompatibilities Co-authored-by: Matthieu Pizenberg <matthieu.pizenberg@gmail.com>
1 parent 54851df commit 3f2c1b9

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/internal/core.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ pub struct State<P: Package, V: Version> {
2525

2626
incompatibilities: Map<P, Vec<IncompId<P, V>>>,
2727

28+
/// Store the ids of incompatibilities that are already contradicted
29+
/// and will stay that way until the next conflict and backtrack is operated.
30+
contradicted_incompatibilities: rustc_hash::FxHashSet<IncompId<P, V>>,
31+
2832
/// Partial solution.
2933
/// TODO: remove pub.
3034
pub partial_solution: PartialSolution<P, V>,
@@ -52,6 +56,7 @@ impl<P: Package, V: Version> State<P, V> {
5256
root_package,
5357
root_version,
5458
incompatibilities,
59+
contradicted_incompatibilities: rustc_hash::FxHashSet::default(),
5560
partial_solution: PartialSolution::empty(),
5661
incompatibility_store,
5762
unit_propagation_buffer: vec![],
@@ -100,6 +105,9 @@ impl<P: Package, V: Version> State<P, V> {
100105
let mut conflict_id = None;
101106
// We only care about incompatibilities if it contains the current package.
102107
for &incompat_id in self.incompatibilities[&current_package].iter().rev() {
108+
if self.contradicted_incompatibilities.contains(&incompat_id) {
109+
continue;
110+
}
103111
let current_incompat = &self.incompatibility_store[incompat_id];
104112
match self.partial_solution.relation(current_incompat) {
105113
// If the partial solution satisfies the incompatibility
@@ -116,6 +124,11 @@ impl<P: Package, V: Version> State<P, V> {
116124
incompat_id,
117125
&self.incompatibility_store,
118126
);
127+
// With the partial solution updated, the incompatibility is now contradicted.
128+
self.contradicted_incompatibilities.insert(incompat_id);
129+
}
130+
Relation::Contradicted(_) => {
131+
self.contradicted_incompatibilities.insert(incompat_id);
119132
}
120133
_ => {}
121134
}
@@ -130,6 +143,9 @@ impl<P: Package, V: Version> State<P, V> {
130143
root_cause,
131144
&self.incompatibility_store,
132145
);
146+
// After conflict resolution and the partial solution update,
147+
// the root cause incompatibility is now contradicted.
148+
self.contradicted_incompatibilities.insert(root_cause);
133149
}
134150
}
135151
// If there are no more changed packages, unit propagation is done.
@@ -200,6 +216,7 @@ impl<P: Package, V: Version> State<P, V> {
200216
) {
201217
self.partial_solution
202218
.backtrack(decision_level, &self.incompatibility_store);
219+
self.contradicted_incompatibilities.clear();
203220
if incompat_changed {
204221
self.merge_incompatibility(incompat);
205222
}

0 commit comments

Comments
 (0)