Struct daggy::Dag [] [src]

pub struct Dag<N, E, Ix: IndexType = DefaultIx> { /* fields omitted */ }

A Directed acyclic graph (DAG) data structure.

Dag is a thin wrapper around petgraph's Graph data structure, providing a refined API for dealing specifically with DAGs.

Note: The following documentation is adapted from petgraph's [Graph documentation] (http://bluss.github.io/petulant-avenger-graphlibrary/doc/petgraph/graph/struct.Graph.html).

Dag is parameterized over the node weight N, edge weight E and index type Ix.

NodeIndex is a type that acts as a reference to nodes, but these are only stable across certain operations. Removing nodes may shift other indices. Adding kids to the Dag keeps all indices stable, but removing a node will force the last node to shift its index to take its place.

The fact that the node indices in the Dag are numbered in a compact interval from 0 to n-1 simplifies some graph algorithms.

The Ix parameter is u32 by default. The goal is that you can ignore this parameter completely unless you need a very large Dag -- then you can use usize.

The Dag also offers methods for accessing the underlying Graph, which can be useful for taking advantage of petgraph's various graph-related algorithms.

Methods

impl<N, E, Ix> Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Create a new, empty Dag.

[src]

Create a new Dag with estimated capacity for its node and edge Vecs.

[src]

Create a Dag from an iterator yielding edges.

Node weights N are set to default values.

Edge weights E may either be specified in the list, or they are filled with default values.

Nodes are inserted automatically to match the edges.

Returns an Err if adding any of the edges would cause a cycle.

[src]

Extend the Dag with the given edges.

Node weights N are set to default values.

Edge weights E may either be specified in the list, or they are filled with default values.

Nodes are inserted automatically to match the edges.

Returns an Err if adding an edge would cause a cycle.

[src]

Create a Dag from an iterator yielding elements.

Returns an Err if an edge would cause a cycle within the graph.

[src]

Create a new Graph by mapping node and edge weights to new values.

The resulting graph has the same structure and the same graph indices as self.

[src]

Create a new Dag by mapping node and edge weights. A node or edge may be mapped to None to exclude it from the resulting Dag.

Nodes are mapped first with the node_map closure, then edge_map is called for the edges that have not had any endpoint removed.

The resulting graph has the structure of a subgraph of the original graph. If no noodes are removed, the resulting graph has compatible node indices.

If neither nodes nor edges are removed, the resulting graph has compatible node indices. If neither nodes nor edges are removed the result has the same graph indices as self.

The resulting graph has the same structure and the same graph indices as self.

[src]

Removes all nodes and edges from the Dag.

[src]

The total number of nodes in the Dag.

[src]

The total number of edgees in the Dag.

[src]

Borrow the Dag's underlying DiGraph<N, Ix>.

All existing indices may be used to index into this DiGraph the same way they may be used to index into the Dag.

[src]

Take ownership of the Dag and return the internal DiGraph.

All existing indices may be used to index into this DiGraph the same way they may be used to index into the Dag.

[src]

Add a new node to the Dag with the given weight.

Computes in O(1) time.

Returns the index of the new node.

Note: If you're adding a new node and immediately adding a single edge to that node from some other node, consider using the add_child or add_parent methods instead for better performance.

Panics if the Graph is at the maximum number of nodes for its index type.

[src]

Add a new directed edge to the Dag with the given weight.

The added edge will be in the direction a -> b

Checks if the edge would create a cycle in the Graph.

If adding the edge would not cause the graph to cycle, the edge will be added and its EdgeIndex returned.

If adding the edge would cause the graph to cycle, the edge will not be added and instead a WouldCycle<E> error with the given weight will be returned.

In the worst case, petgraph's [is_cyclic_directed] (http://bluss.github.io/petulant-avenger-graphlibrary/doc/petgraph/algo/fn.is_cyclic_directed.html) function is used to check whether or not adding the edge would create a cycle.

Note: Dag allows adding parallel ("duplicate") edges. If you want to avoid this, use update_edge instead.

Note: If you're adding a new node and immediately adding a single edge to that node from some other node, consider using the add_child or add_parent methods instead for better performance.

Panics if either a or b do not exist within the Dag.

Panics if the Graph is at the maximum number of edges for its index type.

[src]

Adds the given directed edges to the Dag, each with their own given weight.

The given iterator should yield a NodeIndex pair along with a weight for each Edge to be added in a tuple.

If we were to describe the tuple as (a, b, weight), the connection would be directed as follows:

a -> b

This method behaves similarly to the add_edge method, however rather than checking whether or not a cycle has been created after adding each edge, it only checks after all edges have been added. This makes it a slightly more performant and ergonomic option that repeatedly calling add_edge.

If adding the edges would not cause the graph to cycle, the edges will be added and their indices returned in an EdgeIndices iterator, yielding indices for each edge in the same order that they were given.

If adding the edges would cause the graph to cycle, the edges will not be added and instead a WouldCycle<Vec<E>> error with the unused weights will be returned. The order of the returned Vec will be the reverse of the given order.

Note: Dag allows adding parallel ("duplicate") edges. If you want to avoid this, use update_edges instead.

Note: If you're adding a series of new nodes and edges to a single node, consider using the add_child or [add_parent] (./struct.Dag.html#method.add_parent) methods instead for greater convenience.

Panics if the Graph is at the maximum number of nodes for its index type.

[src]

Update the edge from nodes a -> b with the given weight.

If the edge doesn't already exist, it will be added using the add_edge method.

Please read the add_edge for more important details.

Checks if the edge would create a cycle in the Graph.

Computes in O(t + e) time where "t" is the complexity of add_edge and e is the number of edges connected to the nodes a and b.

Returns the index of the edge, or a WouldCycle error if adding the edge would create a cycle.

Note: If you're adding a new node and immediately adding a single edge to that node from some parent node, consider using the add_child method instead for greater convenience.

Panics if the Graph is at the maximum number of nodes for its index type.

[src]

Find and return the index to the edge that describes a -> b if there is one.

Computes in O(e') time, where e' is the number of edges connected to the nodes a and b.

[src]

Access the parent and child nodes for the given EdgeIndex.

[src]

Remove all edges.

[src]

Add a new edge and parent node to the node at the given NodeIndex.

Returns both the edge's EdgeIndex and the node's NodeIndex.

node -> edge -> child

Computes in O(1) time.

This is faster than using add_node and add_edge. This is because we don't have to check if the graph would cycle when adding an edge to the new node, as we know it it will be the only edge connected to that node.

Panics if the given child node doesn't exist.

Panics if the Graph is at the maximum number of edges for its index.

[src]

Add a new edge and child node to the node at the given NodeIndex. Returns both the edge's EdgeIndex and the node's NodeIndex.

child -> edge -> node

Computes in O(1) time.

This is faster than using add_node and add_edge. This is because we don't have to check if the graph would cycle when adding an edge to the new node, as we know it it will be the only edge connected to that node.

Panics if the given parent node doesn't exist.

Panics if the Graph is at the maximum number of edges for its index.

[src]

Borrow the weight from the node at the given index.

[src]

Mutably borrow the weight from the node at the given index.

[src]

Read from the internal node array.

Important traits for NodeWeightsMut<'a, N, Ix>
[src]

An iterator yielding mutable access to all node weights.

The order in which weights are yielded matches the order of their node indices.

[src]

Borrow the weight from the edge at the given index.

[src]

Mutably borrow the weight from the edge at the given index.

[src]

Read from the internal edge array.

Important traits for EdgeWeightsMut<'a, E, Ix>
[src]

An iterator yielding mutable access to all edge weights.

The order in which weights are yielded matches the order of their edge indices.

[src]

Index the Dag by two indices.

Both indices can be either NodeIndexs, EdgeIndexs or a combination of the two.

Panics if the indices are equal or if they are out of bounds.

[src]

Remove the node at the given index from the Dag and return it if it exists.

Note: Calling this may shift (and in turn invalidate) previously returned node indices!

[src]

Remove an edge and return its weight, or None if it didn't exist.

Computes in O(e') time, where e' is the size of four particular edge lists, for the nodes of e and the nodes of another affected edge.

[src]

A Walker type that may be used to step through the parents of the given child node.

Unlike iterator types, Walkers do not require borrowing the internal Graph. This makes them useful for traversing the Graph while still being able to mutably borrow it.

If you require an iterator, use one of the Walker methods for converting this Walker into a similarly behaving Iterator type.

See the Walker trait for more useful methods.

[src]

A "walker" object that may be used to step through the children of the given parent node.

Unlike iterator types, Walkers do not require borrowing the internal Graph. This makes them useful for traversing the Graph while still being able to mutably borrow it.

If you require an iterator, use one of the Walker methods for converting this Walker into a similarly behaving Iterator type.

See the Walker trait for more useful methods.

[src]

A Walker type that recursively walks the Dag using the given recursive_fn.

See the Walker trait for more useful methods.

Trait Implementations

impl<N: Clone, E: Clone, Ix: Clone + IndexType> Clone for Dag<N, E, Ix>
[src]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

impl<N: Debug, E: Debug, Ix: Debug + IndexType> Debug for Dag<N, E, Ix>
[src]

[src]

Formats the value using the given formatter. Read more

impl<N, E, Ix> Into<DiGraph<N, E, Ix>> for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Performs the conversion.

impl<N, E, Ix> Default for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Returns the "default value" for a type. Read more

impl<N, E, Ix> Serialize for Dag<N, E, Ix> where
    N: Serialize,
    E: Serialize,
    Ix: IndexType + Serialize
[src]

[src]

Serialize this value into the given Serde serializer. Read more

impl<'de, N, E, Ix> Deserialize<'de> for Dag<N, E, Ix> where
    Self: Sized,
    N: Deserialize<'de>,
    E: Deserialize<'de>,
    Ix: IndexType + Deserialize<'de>, 
[src]

[src]

Deserialize this value from the given Serde deserializer. Read more

impl<N, E, Ix> GraphBase for Dag<N, E, Ix> where
    Ix: IndexType
[src]

node identifier

edge identifier

impl<N, E, Ix> NodeCount for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<N, E, Ix> GraphProp for Dag<N, E, Ix> where
    Ix: IndexType
[src]

The kind edges in the graph.

[src]

impl<N, E, Ix> Visitable for Dag<N, E, Ix> where
    Ix: IndexType
[src]

The associated map type

[src]

Create a new visitor map

[src]

Reset the visitor map (and resize to new size of graph if needed)

impl<N, E, Ix> Data for Dag<N, E, Ix> where
    Ix: IndexType
[src]

impl<N, E, Ix> DataMap for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

[src]

impl<N, E, Ix> DataMapMut for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

[src]

impl<'a, N, E, Ix> IntoNeighbors for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Return an iterator of the neighbors of node a.

impl<'a, N, E, Ix> IntoNeighborsDirected for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<'a, N, E, Ix> IntoEdgeReferences for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<'a, N, E, Ix> IntoEdges for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<'a, N, E, Ix> IntoEdgesDirected for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<'a, N, E, Ix> IntoNodeIdentifiers for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

impl<'a, N, E, Ix> IntoNodeReferences for &'a Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

impl<N, E, Ix> NodeIndexable for Dag<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Return an upper bound of the node indices in the graph (suitable for the size of a bitmap). Read more

[src]

Convert a to an integer index.

[src]

Convert i to a node index

impl<N, E, Ix> NodeCompactIndexable for Dag<N, E, Ix> where
    Ix: IndexType
[src]

impl<N, E, Ix> Index<NodeIndex<Ix>> for Dag<N, E, Ix> where
    Ix: IndexType
[src]

The returned type after indexing.

Important traits for &'a mut W
[src]

Performs the indexing (container[index]) operation.

impl<N, E, Ix> IndexMut<NodeIndex<Ix>> for Dag<N, E, Ix> where
    Ix: IndexType
[src]

Important traits for &'a mut W
[src]

Performs the mutable indexing (container[index]) operation.

impl<N, E, Ix> Index<EdgeIndex<Ix>> for Dag<N, E, Ix> where
    Ix: IndexType
[src]

The returned type after indexing.

Important traits for &'a mut W
[src]

Performs the indexing (container[index]) operation.

impl<N, E, Ix> IndexMut<EdgeIndex<Ix>> for Dag<N, E, Ix> where
    Ix: IndexType
[src]

Important traits for &'a mut W
[src]

Performs the mutable indexing (container[index]) operation.

impl<N, E, Ix> GetAdjacencyMatrix for Dag<N, E, Ix> where
    Ix: IndexType
[src]

The associated adjacency matrix type

[src]

Create the adjacency matrix

[src]

Return true if there is an edge from a to b, false otherwise. Read more

impl<'a, N, E, Ix> Walker<&'a Dag<N, E, Ix>> for Children<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Advance to the next item

Important traits for WalkerIter<W, C>
[src]

Create an iterator out of the walker and given context.

impl<'a, N, E, Ix> Walker<&'a Dag<N, E, Ix>> for Parents<N, E, Ix> where
    Ix: IndexType
[src]

[src]

Advance to the next item

Important traits for WalkerIter<W, C>
[src]

Create an iterator out of the walker and given context.

Auto Trait Implementations

impl<N, E, Ix> Send for Dag<N, E, Ix> where
    E: Send,
    Ix: Send,
    N: Send

impl<N, E, Ix> Sync for Dag<N, E, Ix> where
    E: Sync,
    Ix: Sync,
    N: Sync