pub struct Graph<N: Hash + Eq + Clone + Debug> {
repr: HashMap<N, Vec<N>>,
}Expand description
A directed graph represented with an adjacency list.
repr maps each vertex u to a vector of all vertices v such that (u, v) is an edge in the
graph.
In the context of this module, vertices correspond to Circuit Nodes, and edges represent
precedence constraints: there is an edge (u, v) if v’s input depends on u’s output.
Type N is typically a node-identifying type, such as NodeId.
Fields§
§repr: HashMap<N, Vec<N>>Implementations§
Source§impl<N: Hash + Eq + Clone + Debug> Graph<N>
impl<N: Hash + Eq + Clone + Debug> Graph<N>
Sourcefn new_from_map(map: HashMap<N, Vec<N>>) -> Self
fn new_from_map(map: HashMap<N, Vec<N>>) -> Self
Constructor given the map of dependencies.
Sourcefn new_from_circuit_nodes<F: Field>(
intermediate_circuit_nodes: &[Box<dyn CompilableNode<F>>],
input_shred_ids: &HashSet<NodeId>,
) -> Graph<NodeId>
fn new_from_circuit_nodes<F: Field>( intermediate_circuit_nodes: &[Box<dyn CompilableNode<F>>], input_shred_ids: &HashSet<NodeId>, ) -> Graph<NodeId>
Constructor specifically for a Graph<NodeId>, which will convert an
array of CompilableNode, each of which reference their sources, and
convert that into the graph representation.
Note: we only topologically sort intermediate nodes, therefore we
provide input_shred_ids to exclude them from the graph.
Sourcefn visit_node_dfs(
&self,
node: &N,
exploring_nodes: &mut HashSet<N>,
terminated_nodes: &mut HashSet<N>,
topological_order: &mut Vec<N>,
) -> Result<()>
fn visit_node_dfs( &self, node: &N, exploring_nodes: &mut HashSet<N>, terminated_nodes: &mut HashSet<N>, topological_order: &mut Vec<N>, ) -> Result<()>
Given the graph, a starting node (node), the set of visited/“marked”
nodes (exploring_nodes) and nodes that have been fully explored
(terminated_nodes), traverse the graph recursively using the DFS
algorithm from the starting node.
Returns nothing, but mutates the exploring_nodes and
terminated_nodes accordingly.
Sourcefn topo_sort(&self) -> Result<Vec<N>>
fn topo_sort(&self) -> Result<Vec<N>>
Topologically orders the graph by visiting each node via DFS. Returns the terminated nodes in order of termination.
Note: normally, the topological sort is the “reverse” order of termination via DFS. However, since we wish to order from sources -> sinks, and our dependency graph is structured as children -> parent, we do not reverse the termination order of the DFS search.
Sourcefn get_index_of_latest_dependency(
&self,
topological_order: &[N],
idx_to_check: usize,
) -> Option<usize>
fn get_index_of_latest_dependency( &self, topological_order: &[N], idx_to_check: usize, ) -> Option<usize>
Given a list of nodes that are already topologically ordered, we check all nodes that come before it to return the index in the topological sort of the latest node that it was dependent on.
Sourcefn gen_latest_dependecy_indices(
&self,
topological_order: &[N],
) -> Vec<Option<usize>>
fn gen_latest_dependecy_indices( &self, topological_order: &[N], ) -> Vec<Option<usize>>
Given a valid topological ordering topological_order == [v_0, v_1, ..., v_{n-1}], this
method returns a vector latest_dependency_indices such that latest_dependency_indices[i] == Some(j) iff:
(a) there is a edge/dependency (v_i, v_j) in the graph, and
(b) j is the maximum index for which such an edge exists.
If there are no edges coming out of v_i, then latest_dependency_indices[i] == None.
§Complexity
Linear in the size of the graph: O(|V| + |E|).
Trait Implementations§
Auto Trait Implementations§
impl<N> Freeze for Graph<N>
impl<N> RefUnwindSafe for Graph<N>where
N: RefUnwindSafe,
impl<N> Send for Graph<N>where
N: Send,
impl<N> Sync for Graph<N>where
N: Sync,
impl<N> Unpin for Graph<N>where
N: Unpin,
impl<N> UnwindSafe for Graph<N>where
N: 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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.