pub(crate) struct MergedNodeFlowGraph<Node: Idx> {
supernodes: FrozenUnionFind<Node>,
succ_supernodes: IndexVec<Node, Node>,
}Expand description
View of some underlying graph, in which each node’s successors have been merged into a single “supernode”.
The resulting supernodes have no obvious meaning on their own. However, merging successor nodes means that a node’s out-edges can all be combined into a single out-edge, whose flow is the same as the flow (execution count) of its corresponding node in the original graph.
With all node flows now in the original graph now represented as edge flows in the merged graph, it becomes possible to analyze the original node flows using techniques for analyzing edge flows.
Fields§
§supernodes: FrozenUnionFind<Node>Maps each node to the supernode that contains it, indicated by some arbitrary “root” node that is part of that supernode.
succ_supernodes: IndexVec<Node, Node>For each node, stores the single supernode that all of its successors have been merged into.
(Note that each node in a supernode can potentially have a different successor supernode from its peers.)
Implementations§
Source§impl<Node: Idx> MergedNodeFlowGraph<Node>
impl<Node: Idx> MergedNodeFlowGraph<Node>
Sourcepub(crate) fn for_balanced_graph<G>(graph: G) -> Selfwhere
G: DirectedGraph<Node = Node> + Successors,
pub(crate) fn for_balanced_graph<G>(graph: G) -> Selfwhere
G: DirectedGraph<Node = Node> + Successors,
Creates a “merged” view of an underlying graph.
The given graph is assumed to have “balanced flow”,
though it does not necessarily have to be a BalancedFlowGraph.
fn num_nodes(&self) -> usize
fn is_supernode(&self, node: Node) -> bool
Sourcepub(crate) fn make_node_counters(
&self,
all_nodes_permutation: &[Node],
) -> NodeCounters<Node>
pub(crate) fn make_node_counters( &self, all_nodes_permutation: &[Node], ) -> NodeCounters<Node>
Using the information in this merged graph, together with a given permutation of all nodes in the graph, to create physical counters and counter expressions for each node in the underlying graph.
The given list must contain exactly one copy of each node in the underlying balanced-flow graph. The order of nodes is used as a hint to influence counter allocation:
- Earlier nodes are more likely to receive counter expressions.
- Later nodes are more likely to receive physical counters.
Trait Implementations§
Auto Trait Implementations§
impl<Node> DynSend for MergedNodeFlowGraph<Node>where
Node: DynSend,
impl<Node> DynSync for MergedNodeFlowGraph<Node>where
Node: DynSync,
impl<Node> Freeze for MergedNodeFlowGraph<Node>
impl<Node> RefUnwindSafe for MergedNodeFlowGraph<Node>where
Node: RefUnwindSafe,
impl<Node> Send for MergedNodeFlowGraph<Node>where
Node: Send,
impl<Node> Sync for MergedNodeFlowGraph<Node>where
Node: Sync,
impl<Node> Unpin for MergedNodeFlowGraph<Node>where
Node: Unpin,
impl<Node> UnwindSafe for MergedNodeFlowGraph<Node>where
Node: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 48 bytes