Skip to content

Commit 446fadf

Browse files
committed
conflict_count
1 parent 3741e3b commit 446fadf

File tree

5 files changed

+34
-16
lines changed

5 files changed

+34
-16
lines changed

examples/caching_dependency_provider.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ impl<DP: DependencyProvider<M = String>> DependencyProvider for CachingDependenc
5757

5858
type Priority = DP::Priority;
5959

60-
fn prioritize(&self, package: &DP::P, ranges: &DP::VS) -> Self::Priority {
61-
self.remote_dependencies.prioritize(package, ranges)
60+
fn prioritize(&self, package: &DP::P, ranges: &DP::VS, conflict_count: u32) -> Self::Priority {
61+
self.remote_dependencies.prioritize(package, ranges, conflict_count)
6262
}
6363

6464
type Err = DP::Err;

src/internal/core.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ pub(crate) struct State<DP: DependencyProvider> {
3131
#[allow(clippy::type_complexity)]
3232
merged_dependencies: Map<(Id<DP::P>, Id<DP::P>), SmallVec<IncompDpId<DP>>>,
3333

34+
pub(crate) conflict_count: Map<Id<DP::P>, u32>,
35+
3436
/// Partial solution.
3537
/// TODO: remove pub.
3638
pub(crate) partial_solution: PartialSolution<DP>,
@@ -69,6 +71,7 @@ impl<DP: DependencyProvider> State<DP> {
6971
package_store,
7072
unit_propagation_buffer: SmallVec::Empty,
7173
merged_dependencies: Map::default(),
74+
conflict_count: Map::default(),
7275
}
7376
}
7477

@@ -163,6 +166,9 @@ impl<DP: DependencyProvider> State<DP> {
163166
}
164167
}
165168
if let Some(incompat_id) = conflict_id {
169+
for (p, _) in self.incompatibility_store[incompat_id].iter() {
170+
*self.conflict_count.entry(*p).or_default() += 1;
171+
}
166172
let (package_almost, root_cause) =
167173
self.conflict_resolution(incompat_id)
168174
.map_err(|terminal_incompat_id| {

src/provider.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,19 @@ impl<P: Package, VS: VersionSet> DependencyProvider for OfflineDependencyProvide
9292
.and_then(|versions| versions.keys().rev().find(|v| range.contains(v)).cloned()))
9393
}
9494

95-
type Priority = Reverse<usize>;
95+
type Priority = (u32, Reverse<u32>);
9696

9797
#[inline]
98-
fn prioritize(&self, package: &P, range: &VS) -> Self::Priority {
99-
Reverse(
100-
self.dependencies
101-
.get(package)
102-
.map(|versions| versions.keys().filter(|v| range.contains(v)).count())
103-
.unwrap_or(0),
104-
)
98+
fn prioritize(&self, package: &P, range: &VS, conflict_count: u32) -> Self::Priority {
99+
let version_count = self
100+
.dependencies
101+
.get(package)
102+
.map(|versions| versions.keys().filter(|v| range.contains(v)).count())
103+
.unwrap_or(0);
104+
if version_count == 0 {
105+
return (u32::MAX, Reverse(0));
106+
}
107+
(conflict_count, Reverse(version_count as u32))
105108
}
106109

107110
#[inline]

src/solver.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,11 @@ pub fn resolve<DP: DependencyProvider>(
9797

9898
let Some(highest_priority_pkg) =
9999
state.partial_solution.pick_highest_priority_pkg(|p, r| {
100-
dependency_provider.prioritize(&state.package_store[p], r)
100+
dependency_provider.prioritize(
101+
&state.package_store[p],
102+
r,
103+
state.conflict_count.get(&p).cloned().unwrap_or_default(),
104+
)
101105
})
102106
else {
103107
return Ok(state
@@ -254,7 +258,12 @@ pub trait DependencyProvider {
254258
///
255259
/// Note: the resolver may call this even when the range has not changed,
256260
/// if it is more efficient for the resolvers internal data structures.
257-
fn prioritize(&self, package: &Self::P, range: &Self::VS) -> Self::Priority;
261+
fn prioritize(
262+
&self,
263+
package: &Self::P,
264+
range: &Self::VS,
265+
conflict_count: u32,
266+
) -> Self::Priority;
258267
/// The type returned from `prioritize`. The resolver does not care what type this is
259268
/// as long as it can pick a largest one and clone it.
260269
///

tests/proptest.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ impl<P: Package, VS: VersionSet> DependencyProvider for OldestVersionsDependency
4949

5050
type Priority = <OfflineDependencyProvider<P, VS> as DependencyProvider>::Priority;
5151

52-
fn prioritize(&self, package: &P, range: &VS) -> Self::Priority {
53-
self.0.prioritize(package, range)
52+
fn prioritize(&self, package: &P, range: &VS, conflict_count: u32) -> Self::Priority {
53+
self.0.prioritize(package, range, conflict_count)
5454
}
5555

5656
type Err = Infallible;
@@ -104,8 +104,8 @@ impl<DP: DependencyProvider> DependencyProvider for TimeoutDependencyProvider<DP
104104

105105
type Priority = DP::Priority;
106106

107-
fn prioritize(&self, package: &DP::P, range: &DP::VS) -> Self::Priority {
108-
self.dp.prioritize(package, range)
107+
fn prioritize(&self, package: &DP::P, range: &DP::VS, conflict_count: u32) -> Self::Priority {
108+
self.dp.prioritize(package, range, conflict_count)
109109
}
110110

111111
type Err = DP::Err;

0 commit comments

Comments
 (0)