for disconnected, use Vec instead of HashSet to reduce insert overhead (#7744)
# Objective - Improve `Schedule::initialize` performance ## Solution - replace `disconnected`'s type from HashSet to Vec in `check_graph`
This commit is contained in:
parent
bd54c4d2d1
commit
d46427b4e4
@ -135,7 +135,7 @@ pub(crate) struct CheckGraphResults<V> {
|
|||||||
/// Pairs of nodes that have a path connecting them.
|
/// Pairs of nodes that have a path connecting them.
|
||||||
pub(crate) connected: HashSet<(V, V)>,
|
pub(crate) connected: HashSet<(V, V)>,
|
||||||
/// Pairs of nodes that don't have a path connecting them.
|
/// Pairs of nodes that don't have a path connecting them.
|
||||||
pub(crate) disconnected: HashSet<(V, V)>,
|
pub(crate) disconnected: Vec<(V, V)>,
|
||||||
/// Edges that are redundant because a longer path exists.
|
/// Edges that are redundant because a longer path exists.
|
||||||
pub(crate) transitive_edges: Vec<(V, V)>,
|
pub(crate) transitive_edges: Vec<(V, V)>,
|
||||||
/// Variant of the graph with no transitive edges.
|
/// Variant of the graph with no transitive edges.
|
||||||
@ -151,7 +151,7 @@ impl<V: NodeTrait + Debug> Default for CheckGraphResults<V> {
|
|||||||
Self {
|
Self {
|
||||||
reachable: FixedBitSet::new(),
|
reachable: FixedBitSet::new(),
|
||||||
connected: HashSet::new(),
|
connected: HashSet::new(),
|
||||||
disconnected: HashSet::new(),
|
disconnected: Vec::new(),
|
||||||
transitive_edges: Vec::new(),
|
transitive_edges: Vec::new(),
|
||||||
transitive_reduction: DiGraphMap::new(),
|
transitive_reduction: DiGraphMap::new(),
|
||||||
transitive_closure: DiGraphMap::new(),
|
transitive_closure: DiGraphMap::new(),
|
||||||
@ -198,7 +198,7 @@ where
|
|||||||
|
|
||||||
let mut reachable = FixedBitSet::with_capacity(n * n);
|
let mut reachable = FixedBitSet::with_capacity(n * n);
|
||||||
let mut connected = HashSet::new();
|
let mut connected = HashSet::new();
|
||||||
let mut disconnected = HashSet::new();
|
let mut disconnected = Vec::new();
|
||||||
|
|
||||||
let mut transitive_edges = Vec::new();
|
let mut transitive_edges = Vec::new();
|
||||||
let mut transitive_reduction = DiGraphMap::<V, ()>::new();
|
let mut transitive_reduction = DiGraphMap::<V, ()>::new();
|
||||||
@ -255,7 +255,7 @@ where
|
|||||||
if reachable[index] {
|
if reachable[index] {
|
||||||
connected.insert(pair);
|
connected.insert(pair);
|
||||||
} else {
|
} else {
|
||||||
disconnected.insert(pair);
|
disconnected.push(pair);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1126,7 +1126,7 @@ impl ScheduleGraph {
|
|||||||
|
|
||||||
// check for conflicts
|
// check for conflicts
|
||||||
let mut conflicting_systems = Vec::new();
|
let mut conflicting_systems = Vec::new();
|
||||||
for &(a, b) in flat_results.disconnected.iter() {
|
for &(a, b) in &flat_results.disconnected {
|
||||||
if self.ambiguous_with_flattened.contains_edge(a, b)
|
if self.ambiguous_with_flattened.contains_edge(a, b)
|
||||||
|| self.ambiguous_with_all.contains(&a)
|
|| self.ambiguous_with_all.contains(&a)
|
||||||
|| self.ambiguous_with_all.contains(&b)
|
|| self.ambiguous_with_all.contains(&b)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user