pub struct Dag<Elem: Ord + Hash> { /* private fields */ }
Expand description
Directed acyclic graph representation
DAGs are used to define dependencies and pipelines between QC tests in ROVE. Each node in the DAG represents a QC test, and edges between nodes encode dependencies, where the parent node is dependent on the child node.
The generic parameter Elem
represents the data held by a node in the graph.
For most use cases we expect &'static str
to work here. Strings
containing test names seem a reasonable way to represent QC tests, and these
strings can be reasonably expected to be known at compile time, hence
'static
The following code sample shows how to construct a DAG:
use rove::Dag;
let dag = {
// create empty dag
let mut dag: Dag<&'static str> = Dag::new();
// add free-standing node
let test6 = dag.add_node("test6");
// add a node with a dependency on the previously defined node
let test4 = dag.add_node_with_children("test4", vec![test6]);
let test5 = dag.add_node_with_children("test5", vec![test6]);
let test2 = dag.add_node_with_children("test2", vec![test4]);
let test3 = dag.add_node_with_children("test3", vec![test5]);
let _test1 = dag.add_node_with_children("test1", vec![test2, test3]);
dag
};
// Resulting dag should look like:
//
// 6
// ^
// / \
// 4 5
// ^ ^
// | |
// 2 3
// ^ ^
// \ /
// 1
Implementations§
source§impl<Elem: Ord + Hash + Clone> Dag<Elem>
impl<Elem: Ord + Hash + Clone> Dag<Elem>
sourcepub fn add_edge(&mut self, parent: usize, child: usize)
pub fn add_edge(&mut self, parent: usize, child: usize)
Add an edge to the DAG. This defines a dependency, where the parent is dependent on the child
sourcepub fn add_node_with_children(
&mut self,
elem: Elem,
children: Vec<usize>
) -> usize
pub fn add_node_with_children( &mut self, elem: Elem, children: Vec<usize> ) -> usize
Add a node to the DAG, along with edges representing its dependencies (children)
sourcepub fn transitive_reduce(&mut self)
pub fn transitive_reduce(&mut self)
Performs a transitive reduction on the DAG
This essentially removes any redundant dependencies in the graph
sourcepub fn cycle_check(&self) -> bool
pub fn cycle_check(&self) -> bool
Check for cycles in the DAG
This can be used to validate a DAG, as a DAG must not contain cycles. Returns true if a cycle is detected, false otherwise.
Trait Implementations§
Auto Trait Implementations§
impl<Elem> RefUnwindSafe for Dag<Elem>where Elem: RefUnwindSafe,
impl<Elem> Send for Dag<Elem>where Elem: Send,
impl<Elem> Sync for Dag<Elem>where Elem: Sync,
impl<Elem> Unpin for Dag<Elem>where Elem: Unpin,
impl<Elem> UnwindSafe for Dag<Elem>where Elem: 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> 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> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request