summaryrefslogtreecommitdiffstats
path: root/vendor/petgraph/src/graph_impl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /vendor/petgraph/src/graph_impl
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/petgraph/src/graph_impl')
-rw-r--r--vendor/petgraph/src/graph_impl/frozen.rs96
-rw-r--r--vendor/petgraph/src/graph_impl/mod.rs2172
-rw-r--r--vendor/petgraph/src/graph_impl/serialization.rs345
-rw-r--r--vendor/petgraph/src/graph_impl/stable_graph/mod.rs1817
-rw-r--r--vendor/petgraph/src/graph_impl/stable_graph/serialization.rs296
5 files changed, 0 insertions, 4726 deletions
diff --git a/vendor/petgraph/src/graph_impl/frozen.rs b/vendor/petgraph/src/graph_impl/frozen.rs
deleted file mode 100644
index 1ba06d9d9..000000000
--- a/vendor/petgraph/src/graph_impl/frozen.rs
+++ /dev/null
@@ -1,96 +0,0 @@
-use std::ops::{Deref, Index, IndexMut};
-
-use super::Frozen;
-use crate::data::{DataMap, DataMapMut};
-use crate::graph::Graph;
-use crate::graph::{GraphIndex, IndexType};
-use crate::visit::{Data, GraphProp, IntoNeighborsDirected, IntoNodeIdentifiers, NodeIndexable};
-use crate::visit::{
- GetAdjacencyMatrix, IntoEdges, IntoEdgesDirected, NodeCompactIndexable, NodeCount,
-};
-use crate::visit::{IntoEdgeReferences, IntoNeighbors, IntoNodeReferences, Visitable};
-use crate::{Direction, EdgeType};
-
-impl<'a, G> Frozen<'a, G> {
- /// Create a new `Frozen` from a mutable reference to a graph.
- pub fn new(gr: &'a mut G) -> Self {
- Frozen(gr)
- }
-}
-
-/// Deref allows transparent access to all shared reference (read-only)
-/// functionality in the underlying graph.
-impl<'a, G> Deref for Frozen<'a, G> {
- type Target = G;
- fn deref(&self) -> &G {
- self.0
- }
-}
-
-impl<'a, G, I> Index<I> for Frozen<'a, G>
-where
- G: Index<I>,
-{
- type Output = G::Output;
- fn index(&self, i: I) -> &G::Output {
- self.0.index(i)
- }
-}
-
-impl<'a, G, I> IndexMut<I> for Frozen<'a, G>
-where
- G: IndexMut<I>,
-{
- fn index_mut(&mut self, i: I) -> &mut G::Output {
- self.0.index_mut(i)
- }
-}
-
-impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// Index the `Graph` by two indices, any combination of
- /// node or edge indices is fine.
- ///
- /// **Panics** if the indices are equal or if they are out of bounds.
- pub fn index_twice_mut<T, U>(
- &mut self,
- i: T,
- j: U,
- ) -> (
- &mut <Graph<N, E, Ty, Ix> as Index<T>>::Output,
- &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output,
- )
- where
- Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>,
- T: GraphIndex,
- U: GraphIndex,
- {
- self.0.index_twice_mut(i, j)
- }
-}
-
-macro_rules! access0 {
- ($e:expr) => {
- $e.0
- };
-}
-
-Data! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-DataMap! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-DataMapMut! {delegate_impl [['a, G], G, Frozen<'a, G>, access0]}
-GetAdjacencyMatrix! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-IntoEdgeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoEdges! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoEdgesDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNeighbors! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNeighborsDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNodeIdentifiers! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNodeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-NodeCompactIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-NodeCount! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-NodeIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-GraphProp! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-Visitable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
diff --git a/vendor/petgraph/src/graph_impl/mod.rs b/vendor/petgraph/src/graph_impl/mod.rs
deleted file mode 100644
index 9fb43b3c4..000000000
--- a/vendor/petgraph/src/graph_impl/mod.rs
+++ /dev/null
@@ -1,2172 +0,0 @@
-use std::cmp;
-use std::fmt;
-use std::hash::Hash;
-use std::iter;
-use std::marker::PhantomData;
-use std::mem::size_of;
-use std::ops::{Index, IndexMut, Range};
-use std::slice;
-
-use crate::{Directed, Direction, EdgeType, Incoming, IntoWeightedEdge, Outgoing, Undirected};
-
-use crate::iter_format::{DebugMap, IterFormatExt, NoPretty};
-
-use crate::util::enumerate;
-use crate::visit::EdgeRef;
-use crate::visit::{IntoEdges, IntoEdgesDirected, IntoNodeReferences};
-
-#[cfg(feature = "serde-1")]
-mod serialization;
-
-/// The default integer type for graph indices.
-/// `u32` is the default to reduce the size of the graph's data and improve
-/// performance in the common case.
-///
-/// Used for node and edge indices in `Graph` and `StableGraph`, used
-/// for node indices in `Csr`.
-pub type DefaultIx = u32;
-
-/// Trait for the unsigned integer type used for node and edge indices.
-///
-/// Marked `unsafe` because: the trait must faithfully preserve
-/// and convert index values.
-pub unsafe trait IndexType: Copy + Default + Hash + Ord + fmt::Debug + 'static {
- fn new(x: usize) -> Self;
- fn index(&self) -> usize;
- fn max() -> Self;
-}
-
-unsafe impl IndexType for usize {
- #[inline(always)]
- fn new(x: usize) -> Self {
- x
- }
- #[inline(always)]
- fn index(&self) -> Self {
- *self
- }
- #[inline(always)]
- fn max() -> Self {
- ::std::usize::MAX
- }
-}
-
-unsafe impl IndexType for u32 {
- #[inline(always)]
- fn new(x: usize) -> Self {
- x as u32
- }
- #[inline(always)]
- fn index(&self) -> usize {
- *self as usize
- }
- #[inline(always)]
- fn max() -> Self {
- ::std::u32::MAX
- }
-}
-
-unsafe impl IndexType for u16 {
- #[inline(always)]
- fn new(x: usize) -> Self {
- x as u16
- }
- #[inline(always)]
- fn index(&self) -> usize {
- *self as usize
- }
- #[inline(always)]
- fn max() -> Self {
- ::std::u16::MAX
- }
-}
-
-unsafe impl IndexType for u8 {
- #[inline(always)]
- fn new(x: usize) -> Self {
- x as u8
- }
- #[inline(always)]
- fn index(&self) -> usize {
- *self as usize
- }
- #[inline(always)]
- fn max() -> Self {
- ::std::u8::MAX
- }
-}
-
-/// Node identifier.
-#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
-pub struct NodeIndex<Ix = DefaultIx>(Ix);
-
-impl<Ix: IndexType> NodeIndex<Ix> {
- #[inline]
- pub fn new(x: usize) -> Self {
- NodeIndex(IndexType::new(x))
- }
-
- #[inline]
- pub fn index(self) -> usize {
- self.0.index()
- }
-
- #[inline]
- pub fn end() -> Self {
- NodeIndex(IndexType::max())
- }
-
- fn _into_edge(self) -> EdgeIndex<Ix> {
- EdgeIndex(self.0)
- }
-}
-
-impl<Ix: IndexType> From<Ix> for NodeIndex<Ix> {
- fn from(ix: Ix) -> Self {
- NodeIndex(ix)
- }
-}
-
-impl<Ix: fmt::Debug> fmt::Debug for NodeIndex<Ix> {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "NodeIndex({:?})", self.0)
- }
-}
-
-/// Short version of `NodeIndex::new`
-pub fn node_index<Ix: IndexType>(index: usize) -> NodeIndex<Ix> {
- NodeIndex::new(index)
-}
-
-/// Short version of `EdgeIndex::new`
-pub fn edge_index<Ix: IndexType>(index: usize) -> EdgeIndex<Ix> {
- EdgeIndex::new(index)
-}
-
-/// Edge identifier.
-#[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
-pub struct EdgeIndex<Ix = DefaultIx>(Ix);
-
-impl<Ix: IndexType> EdgeIndex<Ix> {
- #[inline]
- pub fn new(x: usize) -> Self {
- EdgeIndex(IndexType::new(x))
- }
-
- #[inline]
- pub fn index(self) -> usize {
- self.0.index()
- }
-
- /// An invalid `EdgeIndex` used to denote absence of an edge, for example
- /// to end an adjacency list.
- #[inline]
- pub fn end() -> Self {
- EdgeIndex(IndexType::max())
- }
-
- fn _into_node(self) -> NodeIndex<Ix> {
- NodeIndex(self.0)
- }
-}
-
-impl<Ix: IndexType> From<Ix> for EdgeIndex<Ix> {
- fn from(ix: Ix) -> Self {
- EdgeIndex(ix)
- }
-}
-
-impl<Ix: fmt::Debug> fmt::Debug for EdgeIndex<Ix> {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "EdgeIndex({:?})", self.0)
- }
-}
-/*
- * FIXME: Use this impl again, when we don't need to add so many bounds
-impl<Ix: IndexType> fmt::Debug for EdgeIndex<Ix>
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- try!(write!(f, "EdgeIndex("));
- if *self == EdgeIndex::end() {
- try!(write!(f, "End"));
- } else {
- try!(write!(f, "{}", self.index()));
- }
- write!(f, ")")
- }
-}
-*/
-
-const DIRECTIONS: [Direction; 2] = [Outgoing, Incoming];
-
-/// The graph's node type.
-#[derive(Debug)]
-pub struct Node<N, Ix = DefaultIx> {
- /// Associated node data.
- pub weight: N,
- /// Next edge in outgoing and incoming edge lists.
- next: [EdgeIndex<Ix>; 2],
-}
-
-impl<E, Ix> Clone for Node<E, Ix>
-where
- E: Clone,
- Ix: Copy,
-{
- clone_fields!(Node, weight, next,);
-}
-
-impl<N, Ix: IndexType> Node<N, Ix> {
- /// Accessor for data structure internals: the first edge in the given direction.
- pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> {
- self.next[dir.index()]
- }
-}
-
-/// The graph's edge type.
-#[derive(Debug)]
-pub struct Edge<E, Ix = DefaultIx> {
- /// Associated edge data.
- pub weight: E,
- /// Next edge in outgoing and incoming edge lists.
- next: [EdgeIndex<Ix>; 2],
- /// Start and End node index
- node: [NodeIndex<Ix>; 2],
-}
-
-impl<E, Ix> Clone for Edge<E, Ix>
-where
- E: Clone,
- Ix: Copy,
-{
- clone_fields!(Edge, weight, next, node,);
-}
-
-impl<E, Ix: IndexType> Edge<E, Ix> {
- /// Accessor for data structure internals: the next edge for the given direction.
- pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> {
- self.next[dir.index()]
- }
-
- /// Return the source node index.
- pub fn source(&self) -> NodeIndex<Ix> {
- self.node[0]
- }
-
- /// Return the target node index.
- pub fn target(&self) -> NodeIndex<Ix> {
- self.node[1]
- }
-}
-
-/// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation.
-///
-/// `Graph` is parameterized over:
-///
-/// - Associated data `N` for nodes and `E` for edges, called *weights*.
-/// The associated data can be of arbitrary type.
-/// - Edge type `Ty` that determines whether the graph edges are directed or undirected.
-/// - Index type `Ix`, which determines the maximum size of the graph.
-///
-/// The `Graph` is a regular Rust collection and is `Send` and `Sync` (as long
-/// as associated data `N` and `E` are).
-///
-/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert,
-/// efficient graph search and graph algorithms.
-/// It implements **O(e')** edge lookup and edge and node removals, where **e'**
-/// is some local measure of edge count.
-/// Based on the graph datastructure used in rustc.
-///
-/// Here's an example of building a graph with directed edges, and below
-/// an illustration of how it could be rendered with graphviz (see
-/// [`Dot`](../dot/struct.Dot.html)):
-///
-/// ```
-/// use petgraph::Graph;
-///
-/// let mut deps = Graph::<&str, &str>::new();
-/// let pg = deps.add_node("petgraph");
-/// let fb = deps.add_node("fixedbitset");
-/// let qc = deps.add_node("quickcheck");
-/// let rand = deps.add_node("rand");
-/// let libc = deps.add_node("libc");
-/// deps.extend_with_edges(&[
-/// (pg, fb), (pg, qc),
-/// (qc, rand), (rand, libc), (qc, libc),
-/// ]);
-/// ```
-///
-/// ![graph-example](https://bluss.github.io/ndarray/images/graph-example.svg)
-///
-/// ### Graph Indices
-///
-/// The graph maintains indices for nodes and edges, and node and edge
-/// weights may be accessed mutably. Indices range in a compact interval, for
-/// example for *n* nodes indices are 0 to *n* - 1 inclusive.
-///
-/// `NodeIndex` and `EdgeIndex` are types that act as references to nodes and edges,
-/// but these are only stable across certain operations:
-///
-/// * **Removing nodes or edges may shift other indices.** Removing a node will
-/// force the last node to shift its index to take its place. Similarly,
-/// removing an edge shifts the index of the last edge.
-/// * Adding nodes or edges keeps indices stable.
-///
-/// The `Ix` parameter is `u32` by default. The goal is that you can ignore this parameter
-/// completely unless you need a very big graph -- then you can use `usize`.
-///
-/// * The fact that the node and edge indices in the graph each are numbered in compact
-/// intervals (from 0 to *n* - 1 for *n* nodes) simplifies some graph algorithms.
-///
-/// * You can select graph index integer type after the size of the graph. A smaller
-/// size may have better performance.
-///
-/// * Using indices allows mutation while traversing the graph, see `Dfs`,
-/// and `.neighbors(a).detach()`.
-///
-/// * You can create several graphs using the equal node indices but with
-/// differing weights or differing edges.
-///
-/// * Indices don't allow as much compile time checking as references.
-///
-pub struct Graph<N, E, Ty = Directed, Ix = DefaultIx> {
- nodes: Vec<Node<N, Ix>>,
- edges: Vec<Edge<E, Ix>>,
- ty: PhantomData<Ty>,
-}
-
-/// A `Graph` with directed edges.
-///
-/// For example, an edge from *1* to *2* is distinct from an edge from *2* to
-/// *1*.
-pub type DiGraph<N, E, Ix = DefaultIx> = Graph<N, E, Directed, Ix>;
-
-/// A `Graph` with undirected edges.
-///
-/// For example, an edge between *1* and *2* is equivalent to an edge between
-/// *2* and *1*.
-pub type UnGraph<N, E, Ix = DefaultIx> = Graph<N, E, Undirected, Ix>;
-
-/// The resulting cloned graph has the same graph indices as `self`.
-impl<N, E, Ty, Ix: IndexType> Clone for Graph<N, E, Ty, Ix>
-where
- N: Clone,
- E: Clone,
-{
- fn clone(&self) -> Self {
- Graph {
- nodes: self.nodes.clone(),
- edges: self.edges.clone(),
- ty: self.ty,
- }
- }
-
- fn clone_from(&mut self, rhs: &Self) {
- self.nodes.clone_from(&rhs.nodes);
- self.edges.clone_from(&rhs.edges);
- self.ty = rhs.ty;
- }
-}
-
-impl<N, E, Ty, Ix> fmt::Debug for Graph<N, E, Ty, Ix>
-where
- N: fmt::Debug,
- E: fmt::Debug,
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let etype = if self.is_directed() {
- "Directed"
- } else {
- "Undirected"
- };
- let mut fmt_struct = f.debug_struct("Graph");
- fmt_struct.field("Ty", &etype);
- fmt_struct.field("node_count", &self.node_count());
- fmt_struct.field("edge_count", &self.edge_count());
- if self.edge_count() > 0 {
- fmt_struct.field(
- "edges",
- &self
- .edges
- .iter()
- .map(|e| NoPretty((e.source().index(), e.target().index())))
- .format(", "),
- );
- }
- // skip weights if they are ZST!
- if size_of::<N>() != 0 {
- fmt_struct.field(
- "node weights",
- &DebugMap(|| self.nodes.iter().map(|n| &n.weight).enumerate()),
- );
- }
- if size_of::<E>() != 0 {
- fmt_struct.field(
- "edge weights",
- &DebugMap(|| self.edges.iter().map(|n| &n.weight).enumerate()),
- );
- }
- fmt_struct.finish()
- }
-}
-
-enum Pair<T> {
- Both(T, T),
- One(T),
- None,
-}
-
-use std::cmp::max;
-
-/// Get mutable references at index `a` and `b`.
-fn index_twice<T>(slc: &mut [T], a: usize, b: usize) -> Pair<&mut T> {
- if max(a, b) >= slc.len() {
- Pair::None
- } else if a == b {
- Pair::One(&mut slc[max(a, b)])
- } else {
- // safe because a, b are in bounds and distinct
- unsafe {
- let ar = &mut *(slc.get_unchecked_mut(a) as *mut _);
- let br = &mut *(slc.get_unchecked_mut(b) as *mut _);
- Pair::Both(ar, br)
- }
- }
-}
-
-impl<N, E> Graph<N, E, Directed> {
- /// Create a new `Graph` with directed edges.
- ///
- /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
- /// a constructor that is generic in all the type parameters of `Graph`.
- pub fn new() -> Self {
- Graph {
- nodes: Vec::new(),
- edges: Vec::new(),
- ty: PhantomData,
- }
- }
-}
-
-impl<N, E> Graph<N, E, Undirected> {
- /// Create a new `Graph` with undirected edges.
- ///
- /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
- /// a constructor that is generic in all the type parameters of `Graph`.
- pub fn new_undirected() -> Self {
- Graph {
- nodes: Vec::new(),
- edges: Vec::new(),
- ty: PhantomData,
- }
- }
-}
-
-impl<N, E, Ty, Ix> Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// Create a new `Graph` with estimated capacity.
- pub fn with_capacity(nodes: usize, edges: usize) -> Self {
- Graph {
- nodes: Vec::with_capacity(nodes),
- edges: Vec::with_capacity(edges),
- ty: PhantomData,
- }
- }
-
- /// Return the number of nodes (vertices) in the graph.
- ///
- /// Computes in **O(1)** time.
- pub fn node_count(&self) -> usize {
- self.nodes.len()
- }
-
- /// Return the number of edges in the graph.
- ///
- /// Computes in **O(1)** time.
- pub fn edge_count(&self) -> usize {
- self.edges.len()
- }
-
- /// Whether the graph has directed edges or not.
- #[inline]
- pub fn is_directed(&self) -> bool {
- Ty::is_directed()
- }
-
- /// Add a node (also called vertex) with associated data `weight` to the graph.
- ///
- /// Computes in **O(1)** time.
- ///
- /// Return the index of the new node.
- ///
- /// **Panics** if the Graph is at the maximum number of nodes for its index
- /// type (N/A if usize).
- pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
- let node = Node {
- weight,
- next: [EdgeIndex::end(), EdgeIndex::end()],
- };
- let node_idx = NodeIndex::new(self.nodes.len());
- // check for max capacity, except if we use usize
- assert!(<Ix as IndexType>::max().index() == !0 || NodeIndex::end() != node_idx);
- self.nodes.push(node);
- node_idx
- }
-
- /// Access the weight for node `a`.
- ///
- /// Also available with indexing syntax: `&graph[a]`.
- pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> {
- self.nodes.get(a.index()).map(|n| &n.weight)
- }
-
- /// Access the weight for node `a`, mutably.
- ///
- /// Also available with indexing syntax: `&mut graph[a]`.
- pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> {
- self.nodes.get_mut(a.index()).map(|n| &mut n.weight)
- }
-
- /// Add an edge from `a` to `b` to the graph, with its associated
- /// data `weight`.
- ///
- /// Return the index of the new edge.
- ///
- /// Computes in **O(1)** time.
- ///
- /// **Panics** if any of the nodes don't exist.<br>
- /// **Panics** if the Graph is at the maximum number of edges for its index
- /// type (N/A if usize).
- ///
- /// **Note:** `Graph` allows adding parallel (“duplicate”) edges. If you want
- /// to avoid this, use [`.update_edge(a, b, weight)`](#method.update_edge) instead.
- pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
- let edge_idx = EdgeIndex::new(self.edges.len());
- assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
- let mut edge = Edge {
- weight,
- node: [a, b],
- next: [EdgeIndex::end(); 2],
- };
- match index_twice(&mut self.nodes, a.index(), b.index()) {
- Pair::None => panic!("Graph::add_edge: node indices out of bounds"),
- Pair::One(an) => {
- edge.next = an.next;
- an.next[0] = edge_idx;
- an.next[1] = edge_idx;
- }
- Pair::Both(an, bn) => {
- // a and b are different indices
- edge.next = [an.next[0], bn.next[1]];
- an.next[0] = edge_idx;
- bn.next[1] = edge_idx;
- }
- }
- self.edges.push(edge);
- edge_idx
- }
-
- /// Add or update an edge from `a` to `b`.
- /// If the edge already exists, its weight is updated.
- ///
- /// Return the index of the affected edge.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- ///
- /// **Panics** if any of the nodes don't exist.
- pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
- if let Some(ix) = self.find_edge(a, b) {
- if let Some(ed) = self.edge_weight_mut(ix) {
- *ed = weight;
- return ix;
- }
- }
- self.add_edge(a, b, weight)
- }
-
- /// Access the weight for edge `e`.
- ///
- /// Also available with indexing syntax: `&graph[e]`.
- pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> {
- self.edges.get(e.index()).map(|ed| &ed.weight)
- }
-
- /// Access the weight for edge `e`, mutably.
- ///
- /// Also available with indexing syntax: `&mut graph[e]`.
- pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> {
- self.edges.get_mut(e.index()).map(|ed| &mut ed.weight)
- }
-
- /// Access the source and target nodes for `e`.
- pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> {
- self.edges
- .get(e.index())
- .map(|ed| (ed.source(), ed.target()))
- }
-
- /// Remove `a` from the graph if it exists, and return its weight.
- /// If it doesn't exist in the graph, return `None`.
- ///
- /// Apart from `a`, this invalidates the last node index in the graph
- /// (that node will adopt the removed node index). Edge indices are
- /// invalidated as they would be following the removal of each edge
- /// with an endpoint in `a`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of affected
- /// edges, including *n* calls to `.remove_edge()` where *n* is the number
- /// of edges with an endpoint in `a`, and including the edges with an
- /// endpoint in the displaced node.
- pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> {
- self.nodes.get(a.index())?;
- for d in &DIRECTIONS {
- let k = d.index();
-
- // Remove all edges from and to this node.
- loop {
- let next = self.nodes[a.index()].next[k];
- if next == EdgeIndex::end() {
- break;
- }
- let ret = self.remove_edge(next);
- debug_assert!(ret.is_some());
- let _ = ret;
- }
- }
-
- // Use swap_remove -- only the swapped-in node is going to change
- // NodeIndex<Ix>, so we only have to walk its edges and update them.
-
- let node = self.nodes.swap_remove(a.index());
-
- // Find the edge lists of the node that had to relocate.
- // It may be that no node had to relocate, then we are done already.
- let swap_edges = match self.nodes.get(a.index()) {
- None => return Some(node.weight),
- Some(ed) => ed.next,
- };
-
- // The swapped element's old index
- let old_index = NodeIndex::new(self.nodes.len());
- let new_index = a;
-
- // Adjust the starts of the out edges, and ends of the in edges.
- for &d in &DIRECTIONS {
- let k = d.index();
- let mut edges = edges_walker_mut(&mut self.edges, swap_edges[k], d);
- while let Some(curedge) = edges.next_edge() {
- debug_assert!(curedge.node[k] == old_index);
- curedge.node[k] = new_index;
- }
- }
- Some(node.weight)
- }
-
- /// For edge `e` with endpoints `edge_node`, replace links to it,
- /// with links to `edge_next`.
- fn change_edge_links(
- &mut self,
- edge_node: [NodeIndex<Ix>; 2],
- e: EdgeIndex<Ix>,
- edge_next: [EdgeIndex<Ix>; 2],
- ) {
- for &d in &DIRECTIONS {
- let k = d.index();
- let node = match self.nodes.get_mut(edge_node[k].index()) {
- Some(r) => r,
- None => {
- debug_assert!(
- false,
- "Edge's endpoint dir={:?} index={:?} not found",
- d, edge_node[k]
- );
- return;
- }
- };
- let fst = node.next[k];
- if fst == e {
- //println!("Updating first edge 0 for node {}, set to {}", edge_node[0], edge_next[0]);
- node.next[k] = edge_next[k];
- } else {
- let mut edges = edges_walker_mut(&mut self.edges, fst, d);
- while let Some(curedge) = edges.next_edge() {
- if curedge.next[k] == e {
- curedge.next[k] = edge_next[k];
- break; // the edge can only be present once in the list.
- }
- }
- }
- }
- }
-
- /// Remove an edge and return its edge weight, or `None` if it didn't exist.
- ///
- /// Apart from `e`, this invalidates the last edge index in the graph
- /// (that edge will adopt the removed edge index).
- ///
- /// Computes in **O(e')** time, where **e'** is the size of four particular edge lists, for
- /// the vertices of `e` and the vertices of another affected edge.
- pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
- // every edge is part of two lists,
- // outgoing and incoming edges.
- // Remove it from both
- let (edge_node, edge_next) = match self.edges.get(e.index()) {
- None => return None,
- Some(x) => (x.node, x.next),
- };
- // Remove the edge from its in and out lists by replacing it with
- // a link to the next in the list.
- self.change_edge_links(edge_node, e, edge_next);
- self.remove_edge_adjust_indices(e)
- }
-
- fn remove_edge_adjust_indices(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
- // swap_remove the edge -- only the removed edge
- // and the edge swapped into place are affected and need updating
- // indices.
- let edge = self.edges.swap_remove(e.index());
- let swap = match self.edges.get(e.index()) {
- // no elment needed to be swapped.
- None => return Some(edge.weight),
- Some(ed) => ed.node,
- };
- let swapped_e = EdgeIndex::new(self.edges.len());
-
- // Update the edge lists by replacing links to the old index by references to the new
- // edge index.
- self.change_edge_links(swap, swapped_e, [e, e]);
- Some(edge.weight)
- }
-
- /// Return an iterator of all nodes with an edge starting from `a`.
- ///
- /// - `Directed`: Outgoing edges from `a`.
- /// - `Undirected`: All edges from or to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
- self.neighbors_directed(a, Outgoing)
- }
-
- /// Return an iterator of all neighbors that have an edge between them and
- /// `a`, in the specified direction.
- /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
- ///
- /// - `Directed`, `Outgoing`: All edges from `a`.
- /// - `Directed`, `Incoming`: All edges to `a`.
- /// - `Undirected`: All edges from or to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// For a `Directed` graph, neighbors are listed in reverse order of their
- /// addition to the graph, so the most recently added edge's neighbor is
- /// listed first. The order in an `Undirected` graph is arbitrary.
- ///
- /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> {
- let mut iter = self.neighbors_undirected(a);
- if self.is_directed() {
- let k = dir.index();
- iter.next[1 - k] = EdgeIndex::end();
- iter.skip_start = NodeIndex::end();
- }
- iter
- }
-
- /// Return an iterator of all neighbors that have an edge between them and
- /// `a`, in either direction.
- /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
- ///
- /// - `Directed` and `Undirected`: All edges from or to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- ///
- pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
- Neighbors {
- skip_start: a,
- edges: &self.edges,
- next: match self.nodes.get(a.index()) {
- None => [EdgeIndex::end(), EdgeIndex::end()],
- Some(n) => n.next,
- },
- }
- }
-
- /// Return an iterator of all edges of `a`.
- ///
- /// - `Directed`: Outgoing edges from `a`.
- /// - `Undirected`: All edges connected to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
- self.edges_directed(a, Outgoing)
- }
-
- /// Return an iterator of all edges of `a`, in the specified direction.
- ///
- /// - `Directed`, `Outgoing`: All edges from `a`.
- /// - `Directed`, `Incoming`: All edges to `a`.
- /// - `Undirected`, `Outgoing`: All edges connected to `a`, with `a` being the source of each
- /// edge.
- /// - `Undirected`, `Incoming`: All edges connected to `a`, with `a` being the target of each
- /// edge.
- ///
- /// Produces an empty iterator if the node `a` doesn't exist.<br>
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> {
- Edges {
- skip_start: a,
- edges: &self.edges,
- direction: dir,
- next: match self.nodes.get(a.index()) {
- None => [EdgeIndex::end(), EdgeIndex::end()],
- Some(n) => n.next,
- },
- ty: PhantomData,
- }
- }
-
- /// Return an iterator over all the edges connecting `a` and `b`.
- ///
- /// - `Directed`: Outgoing edges from `a`.
- /// - `Undirected`: All edges connected to `a`.
- ///
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edges_connecting(
- &self,
- a: NodeIndex<Ix>,
- b: NodeIndex<Ix>,
- ) -> EdgesConnecting<E, Ty, Ix> {
- EdgesConnecting {
- target_node: b,
- edges: self.edges_directed(a, Direction::Outgoing),
- ty: PhantomData,
- }
- }
-
- /// Lookup if there is an edge from `a` to `b`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
- self.find_edge(a, b).is_some()
- }
-
- /// Lookup an edge from `a` to `b`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> {
- if !self.is_directed() {
- self.find_edge_undirected(a, b).map(|(ix, _)| ix)
- } else {
- match self.nodes.get(a.index()) {
- None => None,
- Some(node) => self.find_edge_directed_from_node(node, b),
- }
- }
- }
-
- fn find_edge_directed_from_node(
- &self,
- node: &Node<N, Ix>,
- b: NodeIndex<Ix>,
- ) -> Option<EdgeIndex<Ix>> {
- let mut edix = node.next[0];
- while let Some(edge) = self.edges.get(edix.index()) {
- if edge.node[1] == b {
- return Some(edix);
- }
- edix = edge.next[0];
- }
- None
- }
-
- /// Lookup an edge between `a` and `b`, in either direction.
- ///
- /// If the graph is undirected, then this is equivalent to `.find_edge()`.
- ///
- /// Return the edge index and its directionality, with `Outgoing` meaning
- /// from `a` to `b` and `Incoming` the reverse,
- /// or `None` if the edge does not exist.
- pub fn find_edge_undirected(
- &self,
- a: NodeIndex<Ix>,
- b: NodeIndex<Ix>,
- ) -> Option<(EdgeIndex<Ix>, Direction)> {
- match self.nodes.get(a.index()) {
- None => None,
- Some(node) => self.find_edge_undirected_from_node(node, b),
- }
- }
-
- fn find_edge_undirected_from_node(
- &self,
- node: &Node<N, Ix>,
- b: NodeIndex<Ix>,
- ) -> Option<(EdgeIndex<Ix>, Direction)> {
- for &d in &DIRECTIONS {
- let k = d.index();
- let mut edix = node.next[k];
- while let Some(edge) = self.edges.get(edix.index()) {
- if edge.node[1 - k] == b {
- return Some((edix, d));
- }
- edix = edge.next[k];
- }
- }
- None
- }
-
- /// Return an iterator over either the nodes without edges to them
- /// (`Incoming`) or from them (`Outgoing`).
- ///
- /// An *internal* node has both incoming and outgoing edges.
- /// The nodes in `.externals(Incoming)` are the source nodes and
- /// `.externals(Outgoing)` are the sinks of the graph.
- ///
- /// For a graph with undirected edges, both the sinks and the sources are
- /// just the nodes without edges.
- ///
- /// The whole iteration computes in **O(|V|)** time.
- pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> {
- Externals {
- iter: self.nodes.iter().enumerate(),
- dir,
- ty: PhantomData,
- }
- }
-
- /// Return an iterator over the node indices of the graph.
- ///
- /// For example, in a rare case where a graph algorithm were not applicable,
- /// the following code will iterate through all nodes to find a
- /// specific index:
- ///
- /// ```
- /// # use petgraph::Graph;
- /// # let mut g = Graph::<&str, i32>::new();
- /// # g.add_node("book");
- /// let index = g.node_indices().find(|i| g[*i] == "book").unwrap();
- /// ```
- pub fn node_indices(&self) -> NodeIndices<Ix> {
- NodeIndices {
- r: 0..self.node_count(),
- ty: PhantomData,
- }
- }
-
- /// Return an iterator yielding mutable access to all node weights.
- ///
- /// The order in which weights are yielded matches the order of their
- /// node indices.
- pub fn node_weights_mut(&mut self) -> NodeWeightsMut<N, Ix> {
- NodeWeightsMut {
- nodes: self.nodes.iter_mut(),
- }
- }
-
- /// Return an iterator over the edge indices of the graph
- pub fn edge_indices(&self) -> EdgeIndices<Ix> {
- EdgeIndices {
- r: 0..self.edge_count(),
- ty: PhantomData,
- }
- }
-
- /// Create an iterator over all edges, in indexed order.
- ///
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edge_references(&self) -> EdgeReferences<E, Ix> {
- EdgeReferences {
- iter: self.edges.iter().enumerate(),
- }
- }
-
- /// Return an iterator yielding mutable access to all edge weights.
- ///
- /// The order in which weights are yielded matches the order of their
- /// edge indices.
- pub fn edge_weights_mut(&mut self) -> EdgeWeightsMut<E, Ix> {
- EdgeWeightsMut {
- edges: self.edges.iter_mut(),
- }
- }
-
- // Remaining methods are of the more internal flavour, read-only access to
- // the data structure's internals.
-
- /// Access the internal node array.
- pub fn raw_nodes(&self) -> &[Node<N, Ix>] {
- &self.nodes
- }
-
- /// Access the internal edge array.
- pub fn raw_edges(&self) -> &[Edge<E, Ix>] {
- &self.edges
- }
-
- /// Convert the graph into a vector of Nodes and a vector of Edges
- pub fn into_nodes_edges(self) -> (Vec<Node<N, Ix>>, Vec<Edge<E, Ix>>) {
- (self.nodes, self.edges)
- }
-
- /// Accessor for data structure internals: the first edge in the given direction.
- pub fn first_edge(&self, a: NodeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> {
- match self.nodes.get(a.index()) {
- None => None,
- Some(node) => {
- let edix = node.next[dir.index()];
- if edix == EdgeIndex::end() {
- None
- } else {
- Some(edix)
- }
- }
- }
- }
-
- /// Accessor for data structure internals: the next edge for the given direction.
- pub fn next_edge(&self, e: EdgeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> {
- match self.edges.get(e.index()) {
- None => None,
- Some(node) => {
- let edix = node.next[dir.index()];
- if edix == EdgeIndex::end() {
- None
- } else {
- Some(edix)
- }
- }
- }
- }
-
- /// Index the `Graph` by two indices, any combination of
- /// node or edge indices is fine.
- ///
- /// **Panics** if the indices are equal or if they are out of bounds.
- ///
- /// ```
- /// use petgraph::{Graph, Incoming};
- /// use petgraph::visit::Dfs;
- ///
- /// let mut gr = Graph::new();
- /// let a = gr.add_node(0.);
- /// let b = gr.add_node(0.);
- /// let c = gr.add_node(0.);
- /// gr.add_edge(a, b, 3.);
- /// gr.add_edge(b, c, 2.);
- /// gr.add_edge(c, b, 1.);
- ///
- /// // walk the graph and sum incoming edges into the node weight
- /// let mut dfs = Dfs::new(&gr, a);
- /// while let Some(node) = dfs.next(&gr) {
- /// // use a walker -- a detached neighbors iterator
- /// let mut edges = gr.neighbors_directed(node, Incoming).detach();
- /// while let Some(edge) = edges.next_edge(&gr) {
- /// let (nw, ew) = gr.index_twice_mut(node, edge);
- /// *nw += *ew;
- /// }
- /// }
- ///
- /// // check the result
- /// assert_eq!(gr[a], 0.);
- /// assert_eq!(gr[b], 4.);
- /// assert_eq!(gr[c], 2.);
- /// ```
- pub fn index_twice_mut<T, U>(
- &mut self,
- i: T,
- j: U,
- ) -> (
- &mut <Self as Index<T>>::Output,
- &mut <Self as Index<U>>::Output,
- )
- where
- Self: IndexMut<T> + IndexMut<U>,
- T: GraphIndex,
- U: GraphIndex,
- {
- assert!(T::is_node_index() != U::is_node_index() || i.index() != j.index());
-
- // Allow two mutable indexes here -- they are nonoverlapping
- unsafe {
- let self_mut = self as *mut _;
- (
- <Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
- <Self as IndexMut<U>>::index_mut(&mut *self_mut, j),
- )
- }
- }
-
- /// Reverse the direction of all edges
- pub fn reverse(&mut self) {
- // swap edge endpoints,
- // edge incoming / outgoing lists,
- // node incoming / outgoing lists
- for edge in &mut self.edges {
- edge.node.swap(0, 1);
- edge.next.swap(0, 1);
- }
- for node in &mut self.nodes {
- node.next.swap(0, 1);
- }
- }
-
- /// Remove all nodes and edges
- pub fn clear(&mut self) {
- self.nodes.clear();
- self.edges.clear();
- }
-
- /// Remove all edges
- pub fn clear_edges(&mut self) {
- self.edges.clear();
- for node in &mut self.nodes {
- node.next = [EdgeIndex::end(), EdgeIndex::end()];
- }
- }
-
- /// Return the current node and edge capacity of the graph.
- pub fn capacity(&self) -> (usize, usize) {
- (self.nodes.capacity(), self.edges.capacity())
- }
-
- /// Reserves capacity for at least `additional` more nodes to be inserted in
- /// the graph. Graph may reserve more space to avoid frequent reallocations.
- ///
- /// **Panics** if the new capacity overflows `usize`.
- pub fn reserve_nodes(&mut self, additional: usize) {
- self.nodes.reserve(additional);
- }
-
- /// Reserves capacity for at least `additional` more edges to be inserted in
- /// the graph. Graph may reserve more space to avoid frequent reallocations.
- ///
- /// **Panics** if the new capacity overflows `usize`.
- pub fn reserve_edges(&mut self, additional: usize) {
- self.edges.reserve(additional);
- }
-
- /// Reserves the minimum capacity for exactly `additional` more nodes to be
- /// inserted in the graph. Does nothing if the capacity is already
- /// sufficient.
- ///
- /// Prefer `reserve_nodes` if future insertions are expected.
- ///
- /// **Panics** if the new capacity overflows `usize`.
- pub fn reserve_exact_nodes(&mut self, additional: usize) {
- self.nodes.reserve_exact(additional);
- }
-
- /// Reserves the minimum capacity for exactly `additional` more edges to be
- /// inserted in the graph.
- /// Does nothing if the capacity is already sufficient.
- ///
- /// Prefer `reserve_edges` if future insertions are expected.
- ///
- /// **Panics** if the new capacity overflows `usize`.
- pub fn reserve_exact_edges(&mut self, additional: usize) {
- self.edges.reserve_exact(additional);
- }
-
- /// Shrinks the capacity of the underlying nodes collection as much as possible.
- pub fn shrink_to_fit_nodes(&mut self) {
- self.nodes.shrink_to_fit();
- }
-
- /// Shrinks the capacity of the underlying edges collection as much as possible.
- pub fn shrink_to_fit_edges(&mut self) {
- self.edges.shrink_to_fit();
- }
-
- /// Shrinks the capacity of the graph as much as possible.
- pub fn shrink_to_fit(&mut self) {
- self.nodes.shrink_to_fit();
- self.edges.shrink_to_fit();
- }
-
- /// Keep all nodes that return `true` from the `visit` closure,
- /// remove the others.
- ///
- /// `visit` is provided a proxy reference to the graph, so that
- /// the graph can be walked and associated data modified.
- ///
- /// The order nodes are visited is not specified.
- pub fn retain_nodes<F>(&mut self, mut visit: F)
- where
- F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool,
- {
- for index in self.node_indices().rev() {
- if !visit(Frozen(self), index) {
- let ret = self.remove_node(index);
- debug_assert!(ret.is_some());
- let _ = ret;
- }
- }
- }
-
- /// Keep all edges that return `true` from the `visit` closure,
- /// remove the others.
- ///
- /// `visit` is provided a proxy reference to the graph, so that
- /// the graph can be walked and associated data modified.
- ///
- /// The order edges are visited is not specified.
- pub fn retain_edges<F>(&mut self, mut visit: F)
- where
- F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool,
- {
- for index in self.edge_indices().rev() {
- if !visit(Frozen(self), index) {
- let ret = self.remove_edge(index);
- debug_assert!(ret.is_some());
- let _ = ret;
- }
- }
- }
-
- /// Create a new `Graph` from an iterable of 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.
- ///
- /// ```
- /// use petgraph::Graph;
- ///
- /// let gr = Graph::<(), i32>::from_edges(&[
- /// (0, 1), (0, 2), (0, 3),
- /// (1, 2), (1, 3),
- /// (2, 3),
- /// ]);
- /// ```
- pub fn from_edges<I>(iterable: I) -> Self
- where
- I: IntoIterator,
- I::Item: IntoWeightedEdge<E>,
- <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
- N: Default,
- {
- let mut g = Self::with_capacity(0, 0);
- g.extend_with_edges(iterable);
- g
- }
-
- /// Extend the graph from an iterable of 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.
- pub fn extend_with_edges<I>(&mut self, iterable: I)
- where
- I: IntoIterator,
- I::Item: IntoWeightedEdge<E>,
- <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
- N: Default,
- {
- let iter = iterable.into_iter();
- let (low, _) = iter.size_hint();
- self.edges.reserve(low);
-
- for elt in iter {
- let (source, target, weight) = elt.into_weighted_edge();
- let (source, target) = (source.into(), target.into());
- let nx = cmp::max(source, target);
- while nx.index() >= self.node_count() {
- self.add_node(N::default());
- }
- self.add_edge(source, target, weight);
- }
- }
-
- /// 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`.
- pub fn map<'a, F, G, N2, E2>(
- &'a self,
- mut node_map: F,
- mut edge_map: G,
- ) -> Graph<N2, E2, Ty, Ix>
- where
- F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
- G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
- {
- let mut g = Graph::with_capacity(self.node_count(), self.edge_count());
- g.nodes.extend(enumerate(&self.nodes).map(|(i, node)| Node {
- weight: node_map(NodeIndex::new(i), &node.weight),
- next: node.next,
- }));
- g.edges.extend(enumerate(&self.edges).map(|(i, edge)| Edge {
- weight: edge_map(EdgeIndex::new(i), &edge.weight),
- next: edge.next,
- node: edge.node,
- }));
- g
- }
-
- /// Create a new `Graph` by mapping nodes and edges.
- /// A node or edge may be mapped to `None` to exclude it from
- /// the resulting graph.
- ///
- /// 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 nodes 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`.
- pub fn filter_map<'a, F, G, N2, E2>(
- &'a self,
- mut node_map: F,
- mut edge_map: G,
- ) -> Graph<N2, E2, Ty, Ix>
- where
- F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
- G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
- {
- let mut g = Graph::with_capacity(0, 0);
- // mapping from old node index to new node index, end represents removed.
- let mut node_index_map = vec![NodeIndex::end(); self.node_count()];
- for (i, node) in enumerate(&self.nodes) {
- if let Some(nw) = node_map(NodeIndex::new(i), &node.weight) {
- node_index_map[i] = g.add_node(nw);
- }
- }
- for (i, edge) in enumerate(&self.edges) {
- // skip edge if any endpoint was removed
- let source = node_index_map[edge.source().index()];
- let target = node_index_map[edge.target().index()];
- if source != NodeIndex::end() && target != NodeIndex::end() {
- if let Some(ew) = edge_map(EdgeIndex::new(i), &edge.weight) {
- g.add_edge(source, target, ew);
- }
- }
- }
- g
- }
-
- /// Convert the graph into either undirected or directed. No edge adjustments
- /// are done, so you may want to go over the result to remove or add edges.
- ///
- /// Computes in **O(1)** time.
- pub fn into_edge_type<NewTy>(self) -> Graph<N, E, NewTy, Ix>
- where
- NewTy: EdgeType,
- {
- Graph {
- nodes: self.nodes,
- edges: self.edges,
- ty: PhantomData,
- }
- }
-
- //
- // internal methods
- //
- #[cfg(feature = "serde-1")]
- /// Fix up node and edge links after deserialization
- fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> {
- for (edge_index, edge) in enumerate(&mut self.edges) {
- let a = edge.source();
- let b = edge.target();
- let edge_idx = EdgeIndex::new(edge_index);
- match index_twice(&mut self.nodes, a.index(), b.index()) {
- Pair::None => return Err(if a > b { a } else { b }),
- Pair::One(an) => {
- edge.next = an.next;
- an.next[0] = edge_idx;
- an.next[1] = edge_idx;
- }
- Pair::Both(an, bn) => {
- // a and b are different indices
- edge.next = [an.next[0], bn.next[1]];
- an.next[0] = edge_idx;
- bn.next[1] = edge_idx;
- }
- }
- }
- Ok(())
- }
-}
-
-/// An iterator over either the nodes without edges to them or from them.
-pub struct Externals<'a, N: 'a, Ty, Ix: IndexType = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>,
- dir: Direction,
- ty: PhantomData<Ty>,
-}
-
-impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Item = NodeIndex<Ix>;
- fn next(&mut self) -> Option<NodeIndex<Ix>> {
- let k = self.dir.index();
- loop {
- match self.iter.next() {
- None => return None,
- Some((index, node)) => {
- if node.next[k] == EdgeIndex::end()
- && (Ty::is_directed() || node.next[1 - k] == EdgeIndex::end())
- {
- return Some(NodeIndex::new(index));
- } else {
- continue;
- }
- }
- }
- }
- }
-}
-
-/// Iterator over the neighbors of a node.
-///
-/// Iterator element type is `NodeIndex<Ix>`.
-///
-/// Created with [`.neighbors()`][1], [`.neighbors_directed()`][2] or
-/// [`.neighbors_undirected()`][3].
-///
-/// [1]: struct.Graph.html#method.neighbors
-/// [2]: struct.Graph.html#method.neighbors_directed
-/// [3]: struct.Graph.html#method.neighbors_undirected
-pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> {
- /// starting node to skip over
- skip_start: NodeIndex<Ix>,
- edges: &'a [Edge<E, Ix>],
- next: [EdgeIndex<Ix>; 2],
-}
-
-impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type Item = NodeIndex<Ix>;
-
- fn next(&mut self) -> Option<NodeIndex<Ix>> {
- // First any outgoing edges
- match self.edges.get(self.next[0].index()) {
- None => {}
- Some(edge) => {
- self.next[0] = edge.next[0];
- return Some(edge.node[1]);
- }
- }
- // Then incoming edges
- // For an "undirected" iterator (traverse both incoming
- // and outgoing edge lists), make sure we don't double
- // count selfloops by skipping them in the incoming list.
- while let Some(edge) = self.edges.get(self.next[1].index()) {
- self.next[1] = edge.next[1];
- if edge.node[0] != self.skip_start {
- return Some(edge.node[0]);
- }
- }
- None
- }
-}
-
-impl<'a, E, Ix> Clone for Neighbors<'a, E, Ix>
-where
- Ix: IndexType,
-{
- clone_fields!(Neighbors, skip_start, edges, next,);
-}
-
-impl<'a, E, Ix> Neighbors<'a, E, Ix>
-where
- Ix: IndexType,
-{
- /// Return a “walker” object that can be used to step through the
- /// neighbors and edges from the origin node.
- ///
- /// Note: The walker does not borrow from the graph, this is to allow mixing
- /// edge walking with mutating the graph's weights.
- pub fn detach(&self) -> WalkNeighbors<Ix> {
- WalkNeighbors {
- skip_start: self.skip_start,
- next: self.next,
- }
- }
-}
-
-struct EdgesWalkerMut<'a, E: 'a, Ix: IndexType = DefaultIx> {
- edges: &'a mut [Edge<E, Ix>],
- next: EdgeIndex<Ix>,
- dir: Direction,
-}
-
-fn edges_walker_mut<E, Ix>(
- edges: &mut [Edge<E, Ix>],
- next: EdgeIndex<Ix>,
- dir: Direction,
-) -> EdgesWalkerMut<E, Ix>
-where
- Ix: IndexType,
-{
- EdgesWalkerMut { edges, next, dir }
-}
-
-impl<'a, E, Ix> EdgesWalkerMut<'a, E, Ix>
-where
- Ix: IndexType,
-{
- fn next_edge(&mut self) -> Option<&mut Edge<E, Ix>> {
- self.next().map(|t| t.1)
- }
-
- fn next(&mut self) -> Option<(EdgeIndex<Ix>, &mut Edge<E, Ix>)> {
- let this_index = self.next;
- let k = self.dir.index();
- match self.edges.get_mut(self.next.index()) {
- None => None,
- Some(edge) => {
- self.next = edge.next[k];
- Some((this_index, edge))
- }
- }
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoEdges for &'a Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Edges = Edges<'a, E, Ty, Ix>;
- fn edges(self, a: Self::NodeId) -> Self::Edges {
- self.edges(a)
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type EdgesDirected = Edges<'a, E, Ty, Ix>;
- fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
- self.edges_directed(a, dir)
- }
-}
-
-/// Iterator over the edges of from or to a node
-pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// starting node to skip over
- skip_start: NodeIndex<Ix>,
- edges: &'a [Edge<E, Ix>],
-
- /// Next edge to visit.
- next: [EdgeIndex<Ix>; 2],
-
- /// For directed graphs: the direction to iterate in
- /// For undirected graphs: the direction of edges
- direction: Direction,
- ty: PhantomData<Ty>,
-}
-
-impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Item = EdgeReference<'a, E, Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- // type direction | iterate over reverse
- // |
- // Directed Outgoing | outgoing no
- // Directed Incoming | incoming no
- // Undirected Outgoing | both incoming
- // Undirected Incoming | both outgoing
-
- // For iterate_over, "both" is represented as None.
- // For reverse, "no" is represented as None.
- let (iterate_over, reverse) = if Ty::is_directed() {
- (Some(self.direction), None)
- } else {
- (None, Some(self.direction.opposite()))
- };
-
- if iterate_over.unwrap_or(Outgoing) == Outgoing {
- let i = self.next[0].index();
- if let Some(Edge { node, weight, next }) = self.edges.get(i) {
- self.next[0] = next[0];
- return Some(EdgeReference {
- index: edge_index(i),
- node: if reverse == Some(Outgoing) {
- swap_pair(*node)
- } else {
- *node
- },
- weight,
- });
- }
- }
-
- if iterate_over.unwrap_or(Incoming) == Incoming {
- while let Some(Edge { node, weight, next }) = self.edges.get(self.next[1].index()) {
- let edge_index = self.next[1];
- self.next[1] = next[1];
- // In any of the "both" situations, self-loops would be iterated over twice.
- // Skip them here.
- if iterate_over.is_none() && node[0] == self.skip_start {
- continue;
- }
-
- return Some(EdgeReference {
- index: edge_index,
- node: if reverse == Some(Incoming) {
- swap_pair(*node)
- } else {
- *node
- },
- weight,
- });
- }
- }
-
- None
- }
-}
-
-/// Iterator over the multiple directed edges connecting a source node to a target node
-pub struct EdgesConnecting<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- target_node: NodeIndex<Ix>,
- edges: Edges<'a, E, Ty, Ix>,
- ty: PhantomData<Ty>,
-}
-
-impl<'a, E, Ty, Ix> Iterator for EdgesConnecting<'a, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Item = EdgeReference<'a, E, Ix>;
-
- fn next(&mut self) -> Option<EdgeReference<'a, E, Ix>> {
- while let Some(edge) = self.edges.next() {
- if edge.node[1] == self.target_node {
- return Some(edge);
- }
- }
-
- None
- }
-}
-
-fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
- x.swap(0, 1);
- x
-}
-
-impl<'a, E, Ty, Ix> Clone for Edges<'a, E, Ty, Ix>
-where
- Ix: IndexType,
- Ty: EdgeType,
-{
- fn clone(&self) -> Self {
- Edges {
- skip_start: self.skip_start,
- edges: self.edges,
- next: self.next,
- direction: self.direction,
- ty: self.ty,
- }
- }
-}
-
-/// Iterator yielding mutable access to all node weights.
-pub struct NodeWeightsMut<'a, N: 'a, Ix: IndexType = DefaultIx> {
- nodes: ::std::slice::IterMut<'a, Node<N, Ix>>,
-}
-
-impl<'a, N, Ix> Iterator for NodeWeightsMut<'a, N, Ix>
-where
- Ix: IndexType,
-{
- type Item = &'a mut N;
-
- fn next(&mut self) -> Option<&'a mut N> {
- self.nodes.next().map(|node| &mut node.weight)
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.nodes.size_hint()
- }
-}
-
-/// Iterator yielding mutable access to all edge weights.
-pub struct EdgeWeightsMut<'a, E: 'a, Ix: IndexType = DefaultIx> {
- edges: ::std::slice::IterMut<'a, Edge<E, Ix>>,
-}
-
-impl<'a, E, Ix> Iterator for EdgeWeightsMut<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type Item = &'a mut E;
-
- fn next(&mut self) -> Option<&'a mut E> {
- self.edges.next().map(|edge| &mut edge.weight)
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.edges.size_hint()
- }
-}
-
-/// Index the `Graph` by `NodeIndex` to access node weights.
-///
-/// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Output = N;
- fn index(&self, index: NodeIndex<Ix>) -> &N {
- &self.nodes[index.index()].weight
- }
-}
-
-/// Index the `Graph` by `NodeIndex` to access node weights.
-///
-/// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
- &mut self.nodes[index.index()].weight
- }
-}
-
-/// Index the `Graph` by `EdgeIndex` to access edge weights.
-///
-/// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Output = E;
- fn index(&self, index: EdgeIndex<Ix>) -> &E {
- &self.edges[index.index()].weight
- }
-}
-
-/// Index the `Graph` by `EdgeIndex` to access edge weights.
-///
-/// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E {
- &mut self.edges[index.index()].weight
- }
-}
-
-/// Create a new empty `Graph`.
-impl<N, E, Ty, Ix> Default for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn default() -> Self {
- Self::with_capacity(0, 0)
- }
-}
-
-/// A `GraphIndex` is a node or edge index.
-pub trait GraphIndex: Copy {
- #[doc(hidden)]
- fn index(&self) -> usize;
- #[doc(hidden)]
- fn is_node_index() -> bool;
-}
-
-impl<Ix: IndexType> GraphIndex for NodeIndex<Ix> {
- #[inline]
- fn index(&self) -> usize {
- NodeIndex::index(*self)
- }
- #[inline]
- fn is_node_index() -> bool {
- true
- }
-}
-
-impl<Ix: IndexType> GraphIndex for EdgeIndex<Ix> {
- #[inline]
- fn index(&self) -> usize {
- EdgeIndex::index(*self)
- }
- #[inline]
- fn is_node_index() -> bool {
- false
- }
-}
-
-/// A “walker” object that can be used to step through the edge list of a node.
-///
-/// Created with [`.detach()`](struct.Neighbors.html#method.detach).
-///
-/// The walker does not borrow from the graph, so it lets you step through
-/// neighbors or incident edges while also mutating graph weights, as
-/// in the following example:
-///
-/// ```
-/// use petgraph::{Graph, Incoming};
-/// use petgraph::visit::Dfs;
-///
-/// let mut gr = Graph::new();
-/// let a = gr.add_node(0.);
-/// let b = gr.add_node(0.);
-/// let c = gr.add_node(0.);
-/// gr.add_edge(a, b, 3.);
-/// gr.add_edge(b, c, 2.);
-/// gr.add_edge(c, b, 1.);
-///
-/// // step through the graph and sum incoming edges into the node weight
-/// let mut dfs = Dfs::new(&gr, a);
-/// while let Some(node) = dfs.next(&gr) {
-/// // use a detached neighbors walker
-/// let mut edges = gr.neighbors_directed(node, Incoming).detach();
-/// while let Some(edge) = edges.next_edge(&gr) {
-/// gr[node] += gr[edge];
-/// }
-/// }
-///
-/// // check the result
-/// assert_eq!(gr[a], 0.);
-/// assert_eq!(gr[b], 4.);
-/// assert_eq!(gr[c], 2.);
-/// ```
-pub struct WalkNeighbors<Ix> {
- skip_start: NodeIndex<Ix>,
- next: [EdgeIndex<Ix>; 2],
-}
-
-impl<Ix> Clone for WalkNeighbors<Ix>
-where
- Ix: IndexType,
-{
- fn clone(&self) -> Self {
- WalkNeighbors {
- skip_start: self.skip_start,
- next: self.next,
- }
- }
-}
-
-impl<Ix: IndexType> WalkNeighbors<Ix> {
- /// Step to the next edge and its endpoint node in the walk for graph `g`.
- ///
- /// The next node indices are always the others than the starting point
- /// where the `WalkNeighbors` value was created.
- /// For an `Outgoing` walk, the target nodes,
- /// for an `Incoming` walk, the source nodes of the edge.
- pub fn next<N, E, Ty: EdgeType>(
- &mut self,
- g: &Graph<N, E, Ty, Ix>,
- ) -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
- // First any outgoing edges
- match g.edges.get(self.next[0].index()) {
- None => {}
- Some(edge) => {
- let ed = self.next[0];
- self.next[0] = edge.next[0];
- return Some((ed, edge.node[1]));
- }
- }
- // Then incoming edges
- // For an "undirected" iterator (traverse both incoming
- // and outgoing edge lists), make sure we don't double
- // count selfloops by skipping them in the incoming list.
- while let Some(edge) = g.edges.get(self.next[1].index()) {
- let ed = self.next[1];
- self.next[1] = edge.next[1];
- if edge.node[0] != self.skip_start {
- return Some((ed, edge.node[0]));
- }
- }
- None
- }
-
- pub fn next_node<N, E, Ty: EdgeType>(
- &mut self,
- g: &Graph<N, E, Ty, Ix>,
- ) -> Option<NodeIndex<Ix>> {
- self.next(g).map(|t| t.1)
- }
-
- pub fn next_edge<N, E, Ty: EdgeType>(
- &mut self,
- g: &Graph<N, E, Ty, Ix>,
- ) -> Option<EdgeIndex<Ix>> {
- self.next(g).map(|t| t.0)
- }
-}
-
-/// Iterator over the node indices of a graph.
-#[derive(Clone, Debug)]
-pub struct NodeIndices<Ix = DefaultIx> {
- r: Range<usize>,
- ty: PhantomData<fn() -> Ix>,
-}
-
-impl<Ix: IndexType> Iterator for NodeIndices<Ix> {
- type Item = NodeIndex<Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.r.next().map(node_index)
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.r.size_hint()
- }
-}
-
-impl<Ix: IndexType> DoubleEndedIterator for NodeIndices<Ix> {
- fn next_back(&mut self) -> Option<Self::Item> {
- self.r.next_back().map(node_index)
- }
-}
-
-impl<Ix: IndexType> ExactSizeIterator for NodeIndices<Ix> {}
-
-/// Iterator over the edge indices of a graph.
-#[derive(Clone, Debug)]
-pub struct EdgeIndices<Ix = DefaultIx> {
- r: Range<usize>,
- ty: PhantomData<fn() -> Ix>,
-}
-
-impl<Ix: IndexType> Iterator for EdgeIndices<Ix> {
- type Item = EdgeIndex<Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.r.next().map(edge_index)
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.r.size_hint()
- }
-}
-
-impl<Ix: IndexType> DoubleEndedIterator for EdgeIndices<Ix> {
- fn next_back(&mut self) -> Option<Self::Item> {
- self.r.next_back().map(edge_index)
- }
-}
-
-impl<Ix: IndexType> ExactSizeIterator for EdgeIndices<Ix> {}
-
-/// Reference to a `Graph` edge.
-#[derive(Debug)]
-pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> {
- index: EdgeIndex<Ix>,
- node: [NodeIndex<Ix>; 2],
- weight: &'a E,
-}
-
-impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> {
- fn clone(&self) -> Self {
- *self
- }
-}
-
-impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> {}
-
-impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
-where
- E: PartialEq,
-{
- fn eq(&self, rhs: &Self) -> bool {
- self.index == rhs.index && self.weight == rhs.weight
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type NodeRef = (NodeIndex<Ix>, &'a N);
- type NodeReferences = NodeReferences<'a, N, Ix>;
- fn node_references(self) -> Self::NodeReferences {
- NodeReferences {
- iter: self.nodes.iter().enumerate(),
- }
- }
-}
-
-/// Iterator over all nodes of a graph.
-pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Node<N, Ix>>>,
-}
-
-impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
-where
- Ix: IndexType,
-{
- type Item = (NodeIndex<Ix>, &'a N);
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter
- .next()
- .map(|(i, node)| (node_index(i), &node.weight))
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.iter.size_hint()
- }
-}
-
-impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
-where
- Ix: IndexType,
-{
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter
- .next_back()
- .map(|(i, node)| (node_index(i), &node.weight))
- }
-}
-
-impl<'a, N, Ix> ExactSizeIterator for NodeReferences<'a, N, Ix> where Ix: IndexType {}
-
-impl<'a, Ix, E> EdgeReference<'a, E, Ix>
-where
- Ix: IndexType,
-{
- /// Access the edge’s weight.
- ///
- /// **NOTE** that this method offers a longer lifetime
- /// than the trait (unfortunately they don't match yet).
- pub fn weight(&self) -> &'a E {
- self.weight
- }
-}
-
-impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type NodeId = NodeIndex<Ix>;
- type EdgeId = EdgeIndex<Ix>;
- type Weight = E;
-
- fn source(&self) -> Self::NodeId {
- self.node[0]
- }
- fn target(&self) -> Self::NodeId {
- self.node[1]
- }
- fn weight(&self) -> &E {
- self.weight
- }
- fn id(&self) -> Self::EdgeId {
- self.index
- }
-}
-
-/// Iterator over all edges of a graph.
-pub struct EdgeReferences<'a, E: 'a, Ix: IndexType = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Edge<E, Ix>>>,
-}
-
-impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type Item = EdgeReference<'a, E, Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter.next().map(|(i, edge)| EdgeReference {
- index: edge_index(i),
- node: edge.node,
- weight: &edge.weight,
- })
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.iter.size_hint()
- }
-}
-
-impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
-where
- Ix: IndexType,
-{
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter.next_back().map(|(i, edge)| EdgeReference {
- index: edge_index(i),
- node: edge.node,
- weight: &edge.weight,
- })
- }
-}
-
-impl<'a, E, Ix> ExactSizeIterator for EdgeReferences<'a, E, Ix> where Ix: IndexType {}
-
-mod frozen;
-#[cfg(feature = "stable_graph")]
-pub mod stable_graph;
-
-/// `Frozen` is a graph wrapper.
-///
-/// The `Frozen` only allows shared access (read-only) to the
-/// underlying graph `G`, but it allows mutable access to its
-/// node and edge weights.
-///
-/// This is used to ensure immutability of the graph's structure
-/// while permitting weights to be both read and written.
-///
-/// See indexing implementations and the traits `Data` and `DataMap`
-/// for read-write access to the graph's weights.
-pub struct Frozen<'a, G: 'a>(&'a mut G);
diff --git a/vendor/petgraph/src/graph_impl/serialization.rs b/vendor/petgraph/src/graph_impl/serialization.rs
deleted file mode 100644
index e108f3dd4..000000000
--- a/vendor/petgraph/src/graph_impl/serialization.rs
+++ /dev/null
@@ -1,345 +0,0 @@
-use serde::de::Error;
-
-use std::marker::PhantomData;
-
-use crate::prelude::*;
-
-use crate::graph::Node;
-use crate::graph::{Edge, IndexType};
-use crate::serde_utils::CollectSeqWithLength;
-use crate::serde_utils::MappedSequenceVisitor;
-use crate::serde_utils::{FromDeserialized, IntoSerializable};
-use crate::EdgeType;
-
-use super::{EdgeIndex, NodeIndex};
-use serde::{Deserialize, Deserializer, Serialize, Serializer};
-
-/// Serialization representation for Graph
-/// Keep in sync with deserialization and StableGraph
-///
-/// The serialization format is as follows, in Pseudorust:
-///
-/// Graph {
-/// nodes: [N],
-/// node_holes: [NodeIndex<Ix>],
-/// edge_property: EdgeProperty,
-/// edges: [Option<(NodeIndex<Ix>, NodeIndex<Ix>, E)>]
-/// }
-///
-/// The same format is used by both Graph and StableGraph.
-///
-/// For graph there are restrictions:
-/// node_holes is always empty and edges are always Some
-///
-/// A stable graph serialization that obeys these restrictions
-/// (effectively, it has no interior vacancies) can de deserialized
-/// as a graph.
-///
-/// Node indices are serialized as integers and are fixed size for
-/// binary formats, so the Ix parameter matters there.
-#[derive(Serialize)]
-#[serde(rename = "Graph")]
-#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))]
-pub struct SerGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> {
- #[serde(serialize_with = "ser_graph_nodes")]
- nodes: &'a [Node<N, Ix>],
- node_holes: &'a [NodeIndex<Ix>],
- edge_property: EdgeProperty,
- #[serde(serialize_with = "ser_graph_edges")]
- edges: &'a [Edge<E, Ix>],
-}
-
-// Deserialization representation for Graph
-// Keep in sync with serialization and StableGraph
-#[derive(Deserialize)]
-#[serde(rename = "Graph")]
-#[serde(bound(
- deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"
-))]
-pub struct DeserGraph<N, E, Ix> {
- #[serde(deserialize_with = "deser_graph_nodes")]
- nodes: Vec<Node<N, Ix>>,
- #[serde(deserialize_with = "deser_graph_node_holes")]
- #[allow(unused)]
- #[serde(default = "Vec::new")]
- node_holes: Vec<NodeIndex<Ix>>,
- edge_property: EdgeProperty,
- #[serde(deserialize_with = "deser_graph_edges")]
- edges: Vec<Edge<E, Ix>>,
-}
-
-impl<Ix> Serialize for NodeIndex<Ix>
-where
- Ix: IndexType + Serialize,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- self.0.serialize(serializer)
- }
-}
-
-impl<'de, Ix> Deserialize<'de> for NodeIndex<Ix>
-where
- Ix: IndexType + Deserialize<'de>,
-{
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: Deserializer<'de>,
- {
- Ok(NodeIndex(Ix::deserialize(deserializer)?))
- }
-}
-
-impl<Ix> Serialize for EdgeIndex<Ix>
-where
- Ix: IndexType + Serialize,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- self.0.serialize(serializer)
- }
-}
-
-impl<'de, Ix> Deserialize<'de> for EdgeIndex<Ix>
-where
- Ix: IndexType + Deserialize<'de>,
-{
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: Deserializer<'de>,
- {
- Ok(EdgeIndex(Ix::deserialize(deserializer)?))
- }
-}
-
-#[derive(Serialize, Deserialize)]
-#[serde(rename_all = "lowercase")]
-#[derive(Debug)]
-pub enum EdgeProperty {
- Undirected,
- Directed,
-}
-
-impl EdgeProperty {
- pub fn is_directed(&self) -> bool {
- match *self {
- EdgeProperty::Directed => true,
- EdgeProperty::Undirected => false,
- }
- }
-}
-
-impl<Ty> From<PhantomData<Ty>> for EdgeProperty
-where
- Ty: EdgeType,
-{
- fn from(_: PhantomData<Ty>) -> Self {
- if Ty::is_directed() {
- EdgeProperty::Directed
- } else {
- EdgeProperty::Undirected
- }
- }
-}
-
-impl<Ty> FromDeserialized for PhantomData<Ty>
-where
- Ty: EdgeType,
-{
- type Input = EdgeProperty;
- fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
- where
- E2: Error,
- {
- if input.is_directed() != Ty::is_directed() {
- Err(E2::custom(format_args!(
- "graph edge property mismatch, \
- expected {:?}, found {:?}",
- EdgeProperty::from(PhantomData::<Ty>),
- input
- )))
- } else {
- Ok(PhantomData)
- }
- }
-}
-
-fn ser_graph_nodes<S, N, Ix>(nodes: &&[Node<N, Ix>], serializer: S) -> Result<S::Ok, S::Error>
-where
- S: Serializer,
- N: Serialize,
- Ix: Serialize + IndexType,
-{
- serializer.collect_seq_exact(nodes.iter().map(|node| &node.weight))
-}
-
-fn ser_graph_edges<S, E, Ix>(edges: &&[Edge<E, Ix>], serializer: S) -> Result<S::Ok, S::Error>
-where
- S: Serializer,
- E: Serialize,
- Ix: Serialize + IndexType,
-{
- serializer.collect_seq_exact(
- edges
- .iter()
- .map(|edge| Some((edge.source(), edge.target(), &edge.weight))),
- )
-}
-
-fn deser_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<N, Ix>>, D::Error>
-where
- D: Deserializer<'de>,
- N: Deserialize<'de>,
- Ix: IndexType + Deserialize<'de>,
-{
- deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| {
- Ok(Node {
- weight: n,
- next: [EdgeIndex::end(); 2],
- })
- }))
-}
-
-fn deser_graph_node_holes<'de, D, Ix>(deserializer: D) -> Result<Vec<NodeIndex<Ix>>, D::Error>
-where
- D: Deserializer<'de>,
- Ix: IndexType + Deserialize<'de>,
-{
- deserializer.deserialize_seq(
- MappedSequenceVisitor::<NodeIndex<Ix>, NodeIndex<Ix>, _>::new(|_| {
- Err("Graph can not have holes in the node set, found non-empty node_holes")
- }),
- )
-}
-
-fn deser_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<N, Ix>>, D::Error>
-where
- D: Deserializer<'de>,
- N: Deserialize<'de>,
- Ix: IndexType + Deserialize<'de>,
-{
- deserializer.deserialize_seq(MappedSequenceVisitor::<
- Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>,
- _,
- _,
- >::new(|x| {
- if let Some((i, j, w)) = x {
- Ok(Edge {
- weight: w,
- node: [i, j],
- next: [EdgeIndex::end(); 2],
- })
- } else {
- Err("Graph can not have holes in the edge set, found None, expected edge")
- }
- }))
-}
-
-impl<'a, N, E, Ty, Ix> IntoSerializable for &'a Graph<N, E, Ty, Ix>
-where
- Ix: IndexType,
- Ty: EdgeType,
-{
- type Output = SerGraph<'a, N, E, Ix>;
- fn into_serializable(self) -> Self::Output {
- SerGraph {
- nodes: &self.nodes,
- node_holes: &[],
- edges: &self.edges,
- edge_property: EdgeProperty::from(PhantomData::<Ty>),
- }
- }
-}
-
-/// Requires crate feature `"serde-1"`
-impl<N, E, Ty, Ix> Serialize for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType + Serialize,
- N: Serialize,
- E: Serialize,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- self.into_serializable().serialize(serializer)
- }
-}
-
-pub fn invalid_node_err<E>(node_index: usize, len: usize) -> E
-where
- E: Error,
-{
- E::custom(format_args!(
- "invalid value: node index `{}` does not exist in graph \
- with node bound {}",
- node_index, len
- ))
-}
-
-pub fn invalid_length_err<Ix, E>(node_or_edge: &str, len: usize) -> E
-where
- E: Error,
- Ix: IndexType,
-{
- E::custom(format_args!(
- "invalid size: graph {} count {} exceeds index type maximum {}",
- node_or_edge,
- len,
- <Ix as IndexType>::max().index()
- ))
-}
-
-impl<'a, N, E, Ty, Ix> FromDeserialized for Graph<N, E, Ty, Ix>
-where
- Ix: IndexType,
- Ty: EdgeType,
-{
- type Input = DeserGraph<N, E, Ix>;
- fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
- where
- E2: Error,
- {
- let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
- let nodes = input.nodes;
- let edges = input.edges;
- if nodes.len() >= <Ix as IndexType>::max().index() {
- Err(invalid_length_err::<Ix, _>("node", nodes.len()))?
- }
-
- if edges.len() >= <Ix as IndexType>::max().index() {
- Err(invalid_length_err::<Ix, _>("edge", edges.len()))?
- }
-
- let mut gr = Graph {
- nodes: nodes,
- edges: edges,
- ty: ty,
- };
- let nc = gr.node_count();
- gr.link_edges()
- .map_err(|i| invalid_node_err(i.index(), nc))?;
- Ok(gr)
- }
-}
-
-/// Requires crate feature `"serde-1"`
-impl<'de, N, E, Ty, Ix> Deserialize<'de> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType + Deserialize<'de>,
- N: Deserialize<'de>,
- E: Deserialize<'de>,
-{
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: Deserializer<'de>,
- {
- Self::from_deserialized(DeserGraph::deserialize(deserializer)?)
- }
-}
diff --git a/vendor/petgraph/src/graph_impl/stable_graph/mod.rs b/vendor/petgraph/src/graph_impl/stable_graph/mod.rs
deleted file mode 100644
index 142aaebed..000000000
--- a/vendor/petgraph/src/graph_impl/stable_graph/mod.rs
+++ /dev/null
@@ -1,1817 +0,0 @@
-//! `StableGraph` keeps indices stable across removals.
-//!
-//! Depends on `feature = "stable_graph"`.
-//!
-
-use std::cmp;
-use std::fmt;
-use std::iter;
-use std::marker::PhantomData;
-use std::mem::replace;
-use std::mem::size_of;
-use std::ops::{Index, IndexMut};
-use std::slice;
-
-use crate::{Directed, Direction, EdgeType, Graph, Incoming, Outgoing, Undirected};
-
-use crate::iter_format::{DebugMap, IterFormatExt, NoPretty};
-use crate::iter_utils::IterUtilsExt;
-
-use super::{index_twice, Edge, Frozen, Node, Pair, DIRECTIONS};
-use crate::visit::{
- EdgeRef, IntoEdgeReferences, IntoEdges, IntoEdgesDirected, IntoNodeReferences, NodeIndexable,
-};
-use crate::IntoWeightedEdge;
-
-// reexport those things that are shared with Graph
-#[doc(no_inline)]
-pub use crate::graph::{
- edge_index, node_index, DefaultIx, EdgeIndex, GraphIndex, IndexType, NodeIndex,
-};
-
-use crate::util::enumerate;
-
-#[cfg(feature = "serde-1")]
-mod serialization;
-
-/// `StableGraph<N, E, Ty, Ix>` is a graph datastructure using an adjacency
-/// list representation.
-///
-/// The graph **does not invalidate** any unrelated node or edge indices when
-/// items are removed.
-///
-/// `StableGraph` is parameterized over:
-///
-/// - Associated data `N` for nodes and `E` for edges, also called *weights*.
-/// The associated data can be of arbitrary type.
-/// - Edge type `Ty` that determines whether the graph edges are directed or undirected.
-/// - Index type `Ix`, which determines the maximum size of the graph.
-///
-/// The graph uses **O(|V| + |E|)** space, and allows fast node and edge insert
-/// and efficient graph search.
-///
-/// It implements **O(e')** edge lookup and edge and node removals, where **e'**
-/// is some local measure of edge count.
-///
-/// - Nodes and edges are each numbered in an interval from *0* to some number
-/// *m*, but *not all* indices in the range are valid, since gaps are formed
-/// by deletions.
-///
-/// - You can select graph index integer type after the size of the graph. A smaller
-/// size may have better performance.
-///
-/// - Using indices allows mutation while traversing the graph, see `Dfs`.
-///
-/// - The `StableGraph` is a regular rust collection and is `Send` and `Sync`
-/// (as long as associated data `N` and `E` are).
-///
-/// - Indices don't allow as much compile time checking as references.
-///
-/// Depends on crate feature `stable_graph` (default). *Stable Graph is still
-/// missing a few methods compared to Graph. You can contribute to help it
-/// achieve parity.*
-pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx> {
- g: Graph<Option<N>, Option<E>, Ty, Ix>,
- node_count: usize,
- edge_count: usize,
-
- // node and edge free lists (both work the same way)
- //
- // free_node, if not NodeIndex::end(), points to a node index
- // that is vacant (after a deletion). The next item in the list is kept in
- // that Node's Node.next[0] field. For Node, it's a node index stored
- // in an EdgeIndex location, and the _into_edge()/_into_node() methods
- // convert.
- free_node: NodeIndex<Ix>,
- free_edge: EdgeIndex<Ix>,
-}
-
-/// A `StableGraph` with directed edges.
-///
-/// For example, an edge from *1* to *2* is distinct from an edge from *2* to
-/// *1*.
-pub type StableDiGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Directed, Ix>;
-
-/// A `StableGraph` with undirected edges.
-///
-/// For example, an edge between *1* and *2* is equivalent to an edge between
-/// *2* and *1*.
-pub type StableUnGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Undirected, Ix>;
-
-impl<N, E, Ty, Ix> fmt::Debug for StableGraph<N, E, Ty, Ix>
-where
- N: fmt::Debug,
- E: fmt::Debug,
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let etype = if self.is_directed() {
- "Directed"
- } else {
- "Undirected"
- };
- let mut fmt_struct = f.debug_struct("StableGraph");
- fmt_struct.field("Ty", &etype);
- fmt_struct.field("node_count", &self.node_count);
- fmt_struct.field("edge_count", &self.edge_count);
- if self.g.edges.iter().any(|e| e.weight.is_some()) {
- fmt_struct.field(
- "edges",
- &self
- .g
- .edges
- .iter()
- .filter(|e| e.weight.is_some())
- .map(|e| NoPretty((e.source().index(), e.target().index())))
- .format(", "),
- );
- }
- // skip weights if they are ZST!
- if size_of::<N>() != 0 {
- fmt_struct.field(
- "node weights",
- &DebugMap(|| {
- self.g
- .nodes
- .iter()
- .map(|n| n.weight.as_ref())
- .enumerate()
- .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
- }),
- );
- }
- if size_of::<E>() != 0 {
- fmt_struct.field(
- "edge weights",
- &DebugMap(|| {
- self.g
- .edges
- .iter()
- .map(|n| n.weight.as_ref())
- .enumerate()
- .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
- }),
- );
- }
- fmt_struct.field("free_node", &self.free_node);
- fmt_struct.field("free_edge", &self.free_edge);
- fmt_struct.finish()
- }
-}
-
-impl<N, E> StableGraph<N, E, Directed> {
- /// Create a new `StableGraph` with directed edges.
- ///
- /// This is a convenience method. See `StableGraph::with_capacity`
- /// or `StableGraph::default` for a constructor that is generic in all the
- /// type parameters of `StableGraph`.
- pub fn new() -> Self {
- Self::with_capacity(0, 0)
- }
-}
-
-impl<N, E, Ty, Ix> StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// Create a new `StableGraph` with estimated capacity.
- pub fn with_capacity(nodes: usize, edges: usize) -> Self {
- StableGraph {
- g: Graph::with_capacity(nodes, edges),
- node_count: 0,
- edge_count: 0,
- free_node: NodeIndex::end(),
- free_edge: EdgeIndex::end(),
- }
- }
-
- /// Return the current node and edge capacity of the graph.
- pub fn capacity(&self) -> (usize, usize) {
- self.g.capacity()
- }
-
- /// Remove all nodes and edges
- pub fn clear(&mut self) {
- self.node_count = 0;
- self.edge_count = 0;
- self.free_node = NodeIndex::end();
- self.free_edge = EdgeIndex::end();
- self.g.clear();
- }
-
- /// Remove all edges
- pub fn clear_edges(&mut self) {
- self.edge_count = 0;
- self.free_edge = EdgeIndex::end();
- self.g.edges.clear();
- // clear edges without touching the free list
- for node in &mut self.g.nodes {
- if node.weight.is_some() {
- node.next = [EdgeIndex::end(), EdgeIndex::end()];
- }
- }
- }
-
- /// Return the number of nodes (vertices) in the graph.
- ///
- /// Computes in **O(1)** time.
- pub fn node_count(&self) -> usize {
- self.node_count
- }
-
- /// Return the number of edges in the graph.
- ///
- /// Computes in **O(1)** time.
- pub fn edge_count(&self) -> usize {
- self.edge_count
- }
-
- /// Whether the graph has directed edges or not.
- #[inline]
- pub fn is_directed(&self) -> bool {
- Ty::is_directed()
- }
-
- /// Add a node (also called vertex) with associated data `weight` to the graph.
- ///
- /// Computes in **O(1)** time.
- ///
- /// Return the index of the new node.
- ///
- /// **Panics** if the `StableGraph` is at the maximum number of nodes for
- /// its index type.
- pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
- let index = if self.free_node != NodeIndex::end() {
- let node_idx = self.free_node;
- let node_slot = &mut self.g.nodes[node_idx.index()];
- let _old = replace(&mut node_slot.weight, Some(weight));
- debug_assert!(_old.is_none());
- self.free_node = node_slot.next[0]._into_node();
- node_slot.next[0] = EdgeIndex::end();
- node_idx
- } else {
- self.g.add_node(Some(weight))
- };
- self.node_count += 1;
- index
- }
-
- /// free_node: Which free list to update for the vacancy
- fn add_vacant_node(&mut self, free_node: &mut NodeIndex<Ix>) {
- let node_idx = self.g.add_node(None);
- // link the free list
- let node_slot = &mut self.g.nodes[node_idx.index()];
- node_slot.next[0] = free_node._into_edge();
- *free_node = node_idx;
- }
-
- /// Remove `a` from the graph if it exists, and return its weight.
- /// If it doesn't exist in the graph, return `None`.
- ///
- /// The node index `a` is invalidated, but none other.
- /// Edge indices are invalidated as they would be following the removal of
- /// each edge with an endpoint in `a`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of affected
- /// edges, including *n* calls to `.remove_edge()` where *n* is the number
- /// of edges with an endpoint in `a`.
- pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> {
- let node_weight = self.g.nodes.get_mut(a.index())?.weight.take()?;
- for d in &DIRECTIONS {
- let k = d.index();
-
- // Remove all edges from and to this node.
- loop {
- let next = self.g.nodes[a.index()].next[k];
- if next == EdgeIndex::end() {
- break;
- }
- let ret = self.remove_edge(next);
- debug_assert!(ret.is_some());
- let _ = ret;
- }
- }
-
- let node_slot = &mut self.g.nodes[a.index()];
- //let node_weight = replace(&mut self.g.nodes[a.index()].weight, Entry::Empty(self.free_node));
- //self.g.nodes[a.index()].next = [EdgeIndex::end(), EdgeIndex::end()];
- node_slot.next = [self.free_node._into_edge(), EdgeIndex::end()];
- self.free_node = a;
- self.node_count -= 1;
-
- Some(node_weight)
- }
-
- pub fn contains_node(&self, a: NodeIndex<Ix>) -> bool {
- self.get_node(a).is_some()
- }
-
- // Return the Node if it is not vacant (non-None weight)
- fn get_node(&self, a: NodeIndex<Ix>) -> Option<&Node<Option<N>, Ix>> {
- self.g
- .nodes
- .get(a.index())
- .and_then(|node| node.weight.as_ref().map(move |_| node))
- }
-
- /// Add an edge from `a` to `b` to the graph, with its associated
- /// data `weight`.
- ///
- /// Return the index of the new edge.
- ///
- /// Computes in **O(1)** time.
- ///
- /// **Panics** if any of the nodes don't exist.<br>
- /// **Panics** if the `StableGraph` is at the maximum number of edges for
- /// its index type.
- ///
- /// **Note:** `StableGraph` allows adding parallel (“duplicate”) edges.
- pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
- let edge_idx;
- let mut new_edge = None::<Edge<_, _>>;
- {
- let edge: &mut Edge<_, _>;
-
- if self.free_edge != EdgeIndex::end() {
- edge_idx = self.free_edge;
- edge = &mut self.g.edges[edge_idx.index()];
- let _old = replace(&mut edge.weight, Some(weight));
- debug_assert!(_old.is_none());
- self.free_edge = edge.next[0];
- edge.node = [a, b];
- } else {
- edge_idx = EdgeIndex::new(self.g.edges.len());
- assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
- new_edge = Some(Edge {
- weight: Some(weight),
- node: [a, b],
- next: [EdgeIndex::end(); 2],
- });
- edge = new_edge.as_mut().unwrap();
- }
-
- let wrong_index = match index_twice(&mut self.g.nodes, a.index(), b.index()) {
- Pair::None => Some(cmp::max(a.index(), b.index())),
- Pair::One(an) => {
- if an.weight.is_none() {
- Some(a.index())
- } else {
- edge.next = an.next;
- an.next[0] = edge_idx;
- an.next[1] = edge_idx;
- None
- }
- }
- Pair::Both(an, bn) => {
- // a and b are different indices
- if an.weight.is_none() {
- Some(a.index())
- } else if bn.weight.is_none() {
- Some(b.index())
- } else {
- edge.next = [an.next[0], bn.next[1]];
- an.next[0] = edge_idx;
- bn.next[1] = edge_idx;
- None
- }
- }
- };
- if let Some(i) = wrong_index {
- panic!(
- "StableGraph::add_edge: node index {} is not a node in the graph",
- i
- );
- }
- self.edge_count += 1;
- }
- if let Some(edge) = new_edge {
- self.g.edges.push(edge);
- }
- edge_idx
- }
-
- /// free_edge: Which free list to update for the vacancy
- fn add_vacant_edge(&mut self, free_edge: &mut EdgeIndex<Ix>) {
- let edge_idx = EdgeIndex::new(self.g.edges.len());
- debug_assert!(edge_idx != EdgeIndex::end());
- let mut edge = Edge {
- weight: None,
- node: [NodeIndex::end(); 2],
- next: [EdgeIndex::end(); 2],
- };
- edge.next[0] = *free_edge;
- *free_edge = edge_idx;
- self.g.edges.push(edge);
- }
-
- /// Add or update an edge from `a` to `b`.
- /// If the edge already exists, its weight is updated.
- ///
- /// Return the index of the affected edge.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- ///
- /// **Panics** if any of the nodes don't exist.
- pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
- if let Some(ix) = self.find_edge(a, b) {
- self[ix] = weight;
- return ix;
- }
- self.add_edge(a, b, weight)
- }
-
- /// Remove an edge and return its edge weight, or `None` if it didn't exist.
- ///
- /// Invalidates the edge index `e` but no other.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to the same endpoints as `e`.
- pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
- // every edge is part of two lists,
- // outgoing and incoming edges.
- // Remove it from both
- let (is_edge, edge_node, edge_next) = match self.g.edges.get(e.index()) {
- None => return None,
- Some(x) => (x.weight.is_some(), x.node, x.next),
- };
- if !is_edge {
- return None;
- }
-
- // Remove the edge from its in and out lists by replacing it with
- // a link to the next in the list.
- self.g.change_edge_links(edge_node, e, edge_next);
-
- // Clear the edge and put it in the free list
- let edge = &mut self.g.edges[e.index()];
- edge.next = [self.free_edge, EdgeIndex::end()];
- edge.node = [NodeIndex::end(), NodeIndex::end()];
- self.free_edge = e;
- self.edge_count -= 1;
- edge.weight.take()
- }
-
- /// Access the weight for node `a`.
- ///
- /// Also available with indexing syntax: `&graph[a]`.
- pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> {
- match self.g.nodes.get(a.index()) {
- Some(no) => no.weight.as_ref(),
- None => None,
- }
- }
-
- /// Access the weight for node `a`, mutably.
- ///
- /// Also available with indexing syntax: `&mut graph[a]`.
- pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> {
- match self.g.nodes.get_mut(a.index()) {
- Some(no) => no.weight.as_mut(),
- None => None,
- }
- }
-
- /// Return an iterator yielding mutable access to all node weights.
- ///
- /// The order in which weights are yielded matches the order of their node
- /// indices.
- pub fn node_weights_mut(&mut self) -> impl Iterator<Item = &mut N> {
- self.g
- .node_weights_mut()
- .flat_map(|maybe_node| maybe_node.iter_mut())
- }
-
- /// Return an iterator over the node indices of the graph
- pub fn node_indices(&self) -> NodeIndices<N, Ix> {
- NodeIndices {
- iter: enumerate(self.raw_nodes()),
- }
- }
-
- /// Access the weight for edge `e`.
- ///
- /// Also available with indexing syntax: `&graph[e]`.
- pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> {
- match self.g.edges.get(e.index()) {
- Some(ed) => ed.weight.as_ref(),
- None => None,
- }
- }
-
- /// Access the weight for edge `e`, mutably
- ///
- /// Also available with indexing syntax: `&mut graph[e]`.
- pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> {
- match self.g.edges.get_mut(e.index()) {
- Some(ed) => ed.weight.as_mut(),
- None => None,
- }
- }
-
- /// Return an iterator yielding mutable access to all edge weights.
- ///
- /// The order in which weights are yielded matches the order of their edge
- /// indices.
- pub fn edge_weights_mut(&mut self) -> impl Iterator<Item = &mut E> {
- self.g
- .edge_weights_mut()
- .flat_map(|maybe_edge| maybe_edge.iter_mut())
- }
-
- /// Access the source and target nodes for `e`.
- pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> {
- match self.g.edges.get(e.index()) {
- Some(ed) if ed.weight.is_some() => Some((ed.source(), ed.target())),
- _otherwise => None,
- }
- }
-
- /// Return an iterator over the edge indices of the graph
- pub fn edge_indices(&self) -> EdgeIndices<E, Ix> {
- EdgeIndices {
- iter: enumerate(self.raw_edges()),
- }
- }
-
- /// Lookup if there is an edge from `a` to `b`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- pub fn contains_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
- self.find_edge(a, b).is_some()
- }
-
- /// Lookup an edge from `a` to `b`.
- ///
- /// Computes in **O(e')** time, where **e'** is the number of edges
- /// connected to `a` (and `b`, if the graph edges are undirected).
- pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> {
- if !self.is_directed() {
- self.find_edge_undirected(a, b).map(|(ix, _)| ix)
- } else {
- match self.get_node(a) {
- None => None,
- Some(node) => self.g.find_edge_directed_from_node(node, b),
- }
- }
- }
-
- /// Lookup an edge between `a` and `b`, in either direction.
- ///
- /// If the graph is undirected, then this is equivalent to `.find_edge()`.
- ///
- /// Return the edge index and its directionality, with `Outgoing` meaning
- /// from `a` to `b` and `Incoming` the reverse,
- /// or `None` if the edge does not exist.
- pub fn find_edge_undirected(
- &self,
- a: NodeIndex<Ix>,
- b: NodeIndex<Ix>,
- ) -> Option<(EdgeIndex<Ix>, Direction)> {
- match self.get_node(a) {
- None => None,
- Some(node) => self.g.find_edge_undirected_from_node(node, b),
- }
- }
-
- /// Return an iterator of all nodes with an edge starting from `a`.
- ///
- /// - `Directed`: Outgoing edges from `a`.
- /// - `Undirected`: All edges connected to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// Use [`.neighbors(a).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
- self.neighbors_directed(a, Outgoing)
- }
-
- /// Return an iterator of all neighbors that have an edge between them and `a`,
- /// in the specified direction.
- /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
- ///
- /// - `Directed`, `Outgoing`: All edges from `a`.
- /// - `Directed`, `Incoming`: All edges to `a`.
- /// - `Undirected`: All edges connected to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// Use [`.neighbors_directed(a, dir).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> {
- let mut iter = self.neighbors_undirected(a);
- if self.is_directed() {
- let k = dir.index();
- iter.next[1 - k] = EdgeIndex::end();
- iter.skip_start = NodeIndex::end();
- }
- iter
- }
-
- /// Return an iterator of all neighbors that have an edge between them and `a`,
- /// in either direction.
- /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
- ///
- /// - `Directed` and `Undirected`: All edges connected to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `NodeIndex<Ix>`.
- ///
- /// Use [`.neighbors_undirected(a).detach()`][1] to get a neighbor walker that does
- /// not borrow from the graph.
- ///
- /// [1]: struct.Neighbors.html#method.detach
- pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
- Neighbors {
- skip_start: a,
- edges: &self.g.edges,
- next: match self.get_node(a) {
- None => [EdgeIndex::end(), EdgeIndex::end()],
- Some(n) => n.next,
- },
- }
- }
-
- /// Return an iterator of all edges of `a`.
- ///
- /// - `Directed`: Outgoing edges from `a`.
- /// - `Undirected`: All edges connected to `a`.
- ///
- /// Produces an empty iterator if the node doesn't exist.<br>
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edges(&self, a: NodeIndex<Ix>) -> Edges<E, Ty, Ix> {
- self.edges_directed(a, Outgoing)
- }
-
- /// Return an iterator of all edges of `a`, in the specified direction.
- ///
- /// - `Directed`, `Outgoing`: All edges from `a`.
- /// - `Directed`, `Incoming`: All edges to `a`.
- /// - `Undirected`, `Outgoing`: All edges connected to `a`, with `a` being the source of each
- /// edge.
- /// - `Undirected`, `Incoming`: All edges connected to `a`, with `a` being the target of each
- /// edge.
- ///
- /// Produces an empty iterator if the node `a` doesn't exist.<br>
- /// Iterator element type is `EdgeReference<E, Ix>`.
- pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> {
- Edges {
- skip_start: a,
- edges: &self.g.edges,
- direction: dir,
- next: match self.get_node(a) {
- None => [EdgeIndex::end(), EdgeIndex::end()],
- Some(n) => n.next,
- },
- ty: PhantomData,
- }
- }
-
- /// Return an iterator over either the nodes without edges to them
- /// (`Incoming`) or from them (`Outgoing`).
- ///
- /// An *internal* node has both incoming and outgoing edges.
- /// The nodes in `.externals(Incoming)` are the source nodes and
- /// `.externals(Outgoing)` are the sinks of the graph.
- ///
- /// For a graph with undirected edges, both the sinks and the sources are
- /// just the nodes without edges.
- ///
- /// The whole iteration computes in **O(|V|)** time.
- pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> {
- Externals {
- iter: self.raw_nodes().iter().enumerate(),
- dir,
- ty: PhantomData,
- }
- }
-
- /// Index the `StableGraph` by two indices, any combination of
- /// node or edge indices is fine.
- ///
- /// **Panics** if the indices are equal or if they are out of bounds.
- pub fn index_twice_mut<T, U>(
- &mut self,
- i: T,
- j: U,
- ) -> (
- &mut <Self as Index<T>>::Output,
- &mut <Self as Index<U>>::Output,
- )
- where
- Self: IndexMut<T> + IndexMut<U>,
- T: GraphIndex,
- U: GraphIndex,
- {
- assert!(T::is_node_index() != U::is_node_index() || i.index() != j.index());
-
- // Allow two mutable indexes here -- they are nonoverlapping
- unsafe {
- let self_mut = self as *mut _;
- (
- <Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
- <Self as IndexMut<U>>::index_mut(&mut *self_mut, j),
- )
- }
- }
-
- /// Keep all nodes that return `true` from the `visit` closure,
- /// remove the others.
- ///
- /// `visit` is provided a proxy reference to the graph, so that
- /// the graph can be walked and associated data modified.
- ///
- /// The order nodes are visited is not specified.
- ///
- /// The node indices of the removed nodes are invalidated, but none other.
- /// Edge indices are invalidated as they would be following the removal of
- /// each edge with an endpoint in a removed node.
- ///
- /// Computes in **O(n + e')** time, where **n** is the number of node indices and
- /// **e'** is the number of affected edges, including *n* calls to `.remove_edge()`
- /// where *n* is the number of edges with an endpoint in a removed node.
- pub fn retain_nodes<F>(&mut self, mut visit: F)
- where
- F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool,
- {
- for i in 0..self.node_bound() {
- let ix = node_index(i);
- if self.contains_node(ix) && !visit(Frozen(self), ix) {
- self.remove_node(ix);
- }
- }
- self.check_free_lists();
- }
-
- /// Keep all edges that return `true` from the `visit` closure,
- /// remove the others.
- ///
- /// `visit` is provided a proxy reference to the graph, so that
- /// the graph can be walked and associated data modified.
- ///
- /// The order edges are visited is not specified.
- ///
- /// The edge indices of the removed edes are invalidated, but none other.
- ///
- /// Computes in **O(e'')** time, **e'** is the number of affected edges,
- /// including the calls to `.remove_edge()` for each removed edge.
- pub fn retain_edges<F>(&mut self, mut visit: F)
- where
- F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool,
- {
- for i in 0..self.edge_bound() {
- let ix = edge_index(i);
- if self.edge_weight(ix).is_some() && !visit(Frozen(self), ix) {
- self.remove_edge(ix);
- }
- }
- self.check_free_lists();
- }
-
- /// Create a new `StableGraph` from an iterable of 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.
- ///
- /// ```
- /// use petgraph::stable_graph::StableGraph;
- ///
- /// let gr = StableGraph::<(), i32>::from_edges(&[
- /// (0, 1), (0, 2), (0, 3),
- /// (1, 2), (1, 3),
- /// (2, 3),
- /// ]);
- /// ```
- pub fn from_edges<I>(iterable: I) -> Self
- where
- I: IntoIterator,
- I::Item: IntoWeightedEdge<E>,
- <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
- N: Default,
- {
- let mut g = Self::with_capacity(0, 0);
- g.extend_with_edges(iterable);
- g
- }
-
- /// Create a new `StableGraph` by mapping node and
- /// edge weights to new values.
- ///
- /// The resulting graph has the same structure and the same
- /// graph indices as `self`.
- pub fn map<'a, F, G, N2, E2>(
- &'a self,
- mut node_map: F,
- mut edge_map: G,
- ) -> StableGraph<N2, E2, Ty, Ix>
- where
- F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
- G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
- {
- let g = self.g.map(
- move |i, w| w.as_ref().map(|w| node_map(i, w)),
- move |i, w| w.as_ref().map(|w| edge_map(i, w)),
- );
- StableGraph {
- g,
- node_count: self.node_count,
- edge_count: self.edge_count,
- free_node: self.free_node,
- free_edge: self.free_edge,
- }
- }
-
- /// Create a new `StableGraph` by mapping nodes and edges.
- /// A node or edge may be mapped to `None` to exclude it from
- /// the resulting graph.
- ///
- /// 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.
- /// Nodes and edges that are not removed maintain their old node or edge
- /// indices.
- pub fn filter_map<'a, F, G, N2, E2>(
- &'a self,
- mut node_map: F,
- mut edge_map: G,
- ) -> StableGraph<N2, E2, Ty, Ix>
- where
- F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
- G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
- {
- let node_bound = self.node_bound();
- let edge_bound = self.edge_bound();
- let mut result_g = StableGraph::with_capacity(node_bound, edge_bound);
- // use separate free lists so that
- // add_node / add_edge below do not reuse the tombstones
- let mut free_node = NodeIndex::end();
- let mut free_edge = EdgeIndex::end();
-
- // the stable graph keeps the node map itself
-
- for (i, node) in enumerate(self.raw_nodes()) {
- if i >= node_bound {
- break;
- }
- if let Some(node_weight) = node.weight.as_ref() {
- if let Some(new_weight) = node_map(NodeIndex::new(i), node_weight) {
- result_g.add_node(new_weight);
- continue;
- }
- }
- result_g.add_vacant_node(&mut free_node);
- }
- for (i, edge) in enumerate(self.raw_edges()) {
- if i >= edge_bound {
- break;
- }
- let source = edge.source();
- let target = edge.target();
- if let Some(edge_weight) = edge.weight.as_ref() {
- if result_g.contains_node(source) && result_g.contains_node(target) {
- if let Some(new_weight) = edge_map(EdgeIndex::new(i), edge_weight) {
- result_g.add_edge(source, target, new_weight);
- continue;
- }
- }
- }
- result_g.add_vacant_edge(&mut free_edge);
- }
- result_g.free_node = free_node;
- result_g.free_edge = free_edge;
- result_g.check_free_lists();
- result_g
- }
-
- /// Extend the graph from an iterable of 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.
- pub fn extend_with_edges<I>(&mut self, iterable: I)
- where
- I: IntoIterator,
- I::Item: IntoWeightedEdge<E>,
- <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
- N: Default,
- {
- let iter = iterable.into_iter();
-
- for elt in iter {
- let (source, target, weight) = elt.into_weighted_edge();
- let (source, target) = (source.into(), target.into());
- let nx = cmp::max(source, target);
- while nx.index() >= self.node_count() {
- self.add_node(N::default());
- }
- self.add_edge(source, target, weight);
- }
- }
-
- //
- // internal methods
- //
- fn raw_nodes(&self) -> &[Node<Option<N>, Ix>] {
- self.g.raw_nodes()
- }
-
- fn raw_edges(&self) -> &[Edge<Option<E>, Ix>] {
- self.g.raw_edges()
- }
-
- fn edge_bound(&self) -> usize {
- self.edge_references()
- .next_back()
- .map_or(0, |edge| edge.id().index() + 1)
- }
-
- #[cfg(feature = "serde-1")]
- /// Fix up node and edge links after deserialization
- fn link_edges(&mut self) -> Result<(), NodeIndex<Ix>> {
- // set up free node list
- self.node_count = 0;
- self.edge_count = 0;
- let mut free_node = NodeIndex::end();
- for (node_index, node) in enumerate(&mut self.g.nodes) {
- if node.weight.is_some() {
- self.node_count += 1;
- } else {
- // free node
- node.next = [free_node._into_edge(), EdgeIndex::end()];
- free_node = NodeIndex::new(node_index);
- }
- }
- self.free_node = free_node;
-
- let mut free_edge = EdgeIndex::end();
- for (edge_index, edge) in enumerate(&mut self.g.edges) {
- if edge.weight.is_none() {
- // free edge
- edge.next = [free_edge, EdgeIndex::end()];
- free_edge = EdgeIndex::new(edge_index);
- continue;
- }
- let a = edge.source();
- let b = edge.target();
- let edge_idx = EdgeIndex::new(edge_index);
- match index_twice(&mut self.g.nodes, a.index(), b.index()) {
- Pair::None => return Err(if a > b { a } else { b }),
- Pair::One(an) => {
- edge.next = an.next;
- an.next[0] = edge_idx;
- an.next[1] = edge_idx;
- }
- Pair::Both(an, bn) => {
- // a and b are different indices
- edge.next = [an.next[0], bn.next[1]];
- an.next[0] = edge_idx;
- bn.next[1] = edge_idx;
- }
- }
- self.edge_count += 1;
- }
- self.free_edge = free_edge;
- Ok(())
- }
-
- #[cfg(not(debug_assertions))]
- fn check_free_lists(&self) {}
- #[cfg(debug_assertions)]
- // internal method to debug check the free lists (linked lists)
- fn check_free_lists(&self) {
- let mut free_node = self.free_node;
- let mut free_node_len = 0;
- while free_node != NodeIndex::end() {
- if let Some(n) = self.g.nodes.get(free_node.index()) {
- if n.weight.is_none() {
- free_node = n.next[0]._into_node();
- free_node_len += 1;
- continue;
- }
- debug_assert!(
- false,
- "Corrupt free list: pointing to existing {:?}",
- free_node.index()
- );
- }
- debug_assert!(false, "Corrupt free list: missing {:?}", free_node.index());
- }
- debug_assert_eq!(self.node_count(), self.raw_nodes().len() - free_node_len);
-
- let mut free_edge_len = 0;
- let mut free_edge = self.free_edge;
- while free_edge != EdgeIndex::end() {
- if let Some(n) = self.g.edges.get(free_edge.index()) {
- if n.weight.is_none() {
- free_edge = n.next[0];
- free_edge_len += 1;
- continue;
- }
- debug_assert!(
- false,
- "Corrupt free list: pointing to existing {:?}",
- free_node.index()
- );
- }
- debug_assert!(false, "Corrupt free list: missing {:?}", free_edge.index());
- }
- debug_assert_eq!(self.edge_count(), self.raw_edges().len() - free_edge_len);
- }
-}
-
-/// The resulting cloned graph has the same graph indices as `self`.
-impl<N, E, Ty, Ix: IndexType> Clone for StableGraph<N, E, Ty, Ix>
-where
- N: Clone,
- E: Clone,
-{
- fn clone(&self) -> Self {
- StableGraph {
- g: self.g.clone(),
- node_count: self.node_count,
- edge_count: self.edge_count,
- free_node: self.free_node,
- free_edge: self.free_edge,
- }
- }
-
- fn clone_from(&mut self, rhs: &Self) {
- self.g.clone_from(&rhs.g);
- self.node_count = rhs.node_count;
- self.edge_count = rhs.edge_count;
- self.free_node = rhs.free_node;
- self.free_edge = rhs.free_edge;
- }
-}
-
-/// Index the `StableGraph` by `NodeIndex` to access node weights.
-///
-/// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Output = N;
- fn index(&self, index: NodeIndex<Ix>) -> &N {
- self.node_weight(index).unwrap()
- }
-}
-
-/// Index the `StableGraph` by `NodeIndex` to access node weights.
-///
-/// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
- self.node_weight_mut(index).unwrap()
- }
-}
-
-/// Index the `StableGraph` by `EdgeIndex` to access edge weights.
-///
-/// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Output = E;
- fn index(&self, index: EdgeIndex<Ix>) -> &E {
- self.edge_weight(index).unwrap()
- }
-}
-
-/// Index the `StableGraph` by `EdgeIndex` to access edge weights.
-///
-/// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn index_mut(&mut self, index: EdgeIndex<Ix>) -> &mut E {
- self.edge_weight_mut(index).unwrap()
- }
-}
-
-/// Create a new empty `StableGraph`.
-impl<N, E, Ty, Ix> Default for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn default() -> Self {
- Self::with_capacity(0, 0)
- }
-}
-
-/// Convert a `Graph` into a `StableGraph`
-///
-/// Computes in **O(|V| + |E|)** time.
-///
-/// The resulting graph has the same node and edge indices as
-/// the original graph.
-impl<N, E, Ty, Ix> From<Graph<N, E, Ty, Ix>> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn from(g: Graph<N, E, Ty, Ix>) -> Self {
- let nodes = g.nodes.into_iter().map(|e| Node {
- weight: Some(e.weight),
- next: e.next,
- });
- let edges = g.edges.into_iter().map(|e| Edge {
- weight: Some(e.weight),
- node: e.node,
- next: e.next,
- });
- StableGraph {
- node_count: nodes.len(),
- edge_count: edges.len(),
- g: Graph {
- edges: edges.collect(),
- nodes: nodes.collect(),
- ty: g.ty,
- },
- free_node: NodeIndex::end(),
- free_edge: EdgeIndex::end(),
- }
- }
-}
-
-/// Convert a `StableGraph` into a `Graph`
-///
-/// Computes in **O(|V| + |E|)** time.
-///
-/// This translates the stable graph into a graph with node and edge indices in
-/// a compact interval without holes (like `Graph`s always are).
-///
-/// Only if the stable graph had no vacancies after deletions (if node bound was
-/// equal to node count, and the same for edges), would the resulting graph have
-/// the same node and edge indices as the input.
-impl<N, E, Ty, Ix> From<StableGraph<N, E, Ty, Ix>> for Graph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- fn from(graph: StableGraph<N, E, Ty, Ix>) -> Self {
- let mut result_g = Graph::with_capacity(graph.node_count(), graph.edge_count());
- // mapping from old node index to new node index
- let mut node_index_map = vec![NodeIndex::end(); graph.node_bound()];
-
- for (i, node) in enumerate(graph.g.nodes) {
- if let Some(nw) = node.weight {
- node_index_map[i] = result_g.add_node(nw);
- }
- }
- for edge in graph.g.edges {
- let source_index = edge.source().index();
- let target_index = edge.target().index();
- if let Some(ew) = edge.weight {
- let source = node_index_map[source_index];
- let target = node_index_map[target_index];
- debug_assert!(source != NodeIndex::end());
- debug_assert!(target != NodeIndex::end());
- result_g.add_edge(source, target, ew);
- }
- }
- result_g
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type NodeRef = (NodeIndex<Ix>, &'a N);
- type NodeReferences = NodeReferences<'a, N, Ix>;
- fn node_references(self) -> Self::NodeReferences {
- NodeReferences {
- iter: enumerate(self.raw_nodes()),
- }
- }
-}
-
-/// Iterator over all nodes of a graph.
-pub struct NodeReferences<'a, N: 'a, Ix: IndexType = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
-}
-
-impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
-where
- Ix: IndexType,
-{
- type Item = (NodeIndex<Ix>, &'a N);
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter
- .ex_find_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- let (_, hi) = self.iter.size_hint();
- (0, hi)
- }
-}
-
-impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
-where
- Ix: IndexType,
-{
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter
- .ex_rfind_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
- }
-}
-
-/// Reference to a `StableGraph` edge.
-#[derive(Debug)]
-pub struct EdgeReference<'a, E: 'a, Ix = DefaultIx> {
- index: EdgeIndex<Ix>,
- node: [NodeIndex<Ix>; 2],
- weight: &'a E,
-}
-
-impl<'a, E, Ix: IndexType> Clone for EdgeReference<'a, E, Ix> {
- fn clone(&self) -> Self {
- *self
- }
-}
-
-impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> {}
-
-impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
-where
- E: PartialEq,
-{
- fn eq(&self, rhs: &Self) -> bool {
- self.index == rhs.index && self.weight == rhs.weight
- }
-}
-
-impl<'a, Ix, E> EdgeReference<'a, E, Ix>
-where
- Ix: IndexType,
-{
- /// Access the edge’s weight.
- ///
- /// **NOTE** that this method offers a longer lifetime
- /// than the trait (unfortunately they don't match yet).
- pub fn weight(&self) -> &'a E {
- self.weight
- }
-}
-
-impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type NodeId = NodeIndex<Ix>;
- type EdgeId = EdgeIndex<Ix>;
- type Weight = E;
-
- fn source(&self) -> Self::NodeId {
- self.node[0]
- }
- fn target(&self) -> Self::NodeId {
- self.node[1]
- }
- fn weight(&self) -> &E {
- self.weight
- }
- fn id(&self) -> Self::EdgeId {
- self.index
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoEdges for &'a StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Edges = Edges<'a, E, Ty, Ix>;
- fn edges(self, a: Self::NodeId) -> Self::Edges {
- self.edges(a)
- }
-}
-
-impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type EdgesDirected = Edges<'a, E, Ty, Ix>;
- fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
- self.edges_directed(a, dir)
- }
-}
-
-/// Iterator over the edges of from or to a node
-pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// starting node to skip over
- skip_start: NodeIndex<Ix>,
- edges: &'a [Edge<Option<E>, Ix>],
-
- /// Next edge to visit.
- next: [EdgeIndex<Ix>; 2],
-
- /// For directed graphs: the direction to iterate in
- /// For undirected graphs: the direction of edges
- direction: Direction,
- ty: PhantomData<Ty>,
-}
-
-impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Item = EdgeReference<'a, E, Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- // type direction | iterate over reverse
- // |
- // Directed Outgoing | outgoing no
- // Directed Incoming | incoming no
- // Undirected Outgoing | both incoming
- // Undirected Incoming | both outgoing
-
- // For iterate_over, "both" is represented as None.
- // For reverse, "no" is represented as None.
- let (iterate_over, reverse) = if Ty::is_directed() {
- (Some(self.direction), None)
- } else {
- (None, Some(self.direction.opposite()))
- };
-
- if iterate_over.unwrap_or(Outgoing) == Outgoing {
- let i = self.next[0].index();
- if let Some(Edge {
- node,
- weight: Some(weight),
- next,
- }) = self.edges.get(i)
- {
- self.next[0] = next[0];
- return Some(EdgeReference {
- index: edge_index(i),
- node: if reverse == Some(Outgoing) {
- swap_pair(*node)
- } else {
- *node
- },
- weight,
- });
- }
- }
-
- if iterate_over.unwrap_or(Incoming) == Incoming {
- while let Some(Edge { node, weight, next }) = self.edges.get(self.next[1].index()) {
- debug_assert!(weight.is_some());
- let edge_index = self.next[1];
- self.next[1] = next[1];
- // In any of the "both" situations, self-loops would be iterated over twice.
- // Skip them here.
- if iterate_over.is_none() && node[0] == self.skip_start {
- continue;
- }
-
- return Some(EdgeReference {
- index: edge_index,
- node: if reverse == Some(Incoming) {
- swap_pair(*node)
- } else {
- *node
- },
- weight: weight.as_ref().unwrap(),
- });
- }
- }
-
- None
- }
-}
-
-fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
- x.swap(0, 1);
- x
-}
-
-impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type EdgeRef = EdgeReference<'a, E, Ix>;
- type EdgeReferences = EdgeReferences<'a, E, Ix>;
-
- /// Create an iterator over all edges in the graph, in indexed order.
- ///
- /// Iterator element type is `EdgeReference<E, Ix>`.
- fn edge_references(self) -> Self::EdgeReferences {
- EdgeReferences {
- iter: self.g.edges.iter().enumerate(),
- }
- }
-}
-
-/// Iterator over all edges of a graph.
-pub struct EdgeReferences<'a, E: 'a, Ix: 'a = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
-}
-
-impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type Item = EdgeReference<'a, E, Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter.ex_find_map(|(i, edge)| {
- edge.weight.as_ref().map(move |weight| EdgeReference {
- index: edge_index(i),
- node: edge.node,
- weight,
- })
- })
- }
-}
-
-impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
-where
- Ix: IndexType,
-{
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter.ex_rfind_map(|(i, edge)| {
- edge.weight.as_ref().map(move |weight| EdgeReference {
- index: edge_index(i),
- node: edge.node,
- weight,
- })
- })
- }
-}
-
-/// An iterator over either the nodes without edges to them or from them.
-pub struct Externals<'a, N: 'a, Ty, Ix: IndexType = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
- dir: Direction,
- ty: PhantomData<Ty>,
-}
-
-impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- type Item = NodeIndex<Ix>;
- fn next(&mut self) -> Option<NodeIndex<Ix>> {
- let k = self.dir.index();
- loop {
- match self.iter.next() {
- None => return None,
- Some((index, node)) => {
- if node.weight.is_some()
- && node.next[k] == EdgeIndex::end()
- && (Ty::is_directed() || node.next[1 - k] == EdgeIndex::end())
- {
- return Some(NodeIndex::new(index));
- } else {
- continue;
- }
- }
- }
- }
- }
-}
-
-/// Iterator over the neighbors of a node.
-///
-/// Iterator element type is `NodeIndex`.
-pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> {
- /// starting node to skip over
- skip_start: NodeIndex<Ix>,
- edges: &'a [Edge<Option<E>, Ix>],
- next: [EdgeIndex<Ix>; 2],
-}
-
-impl<'a, E, Ix> Neighbors<'a, E, Ix>
-where
- Ix: IndexType,
-{
- /// Return a “walker” object that can be used to step through the
- /// neighbors and edges from the origin node.
- ///
- /// Note: The walker does not borrow from the graph, this is to allow mixing
- /// edge walking with mutating the graph's weights.
- pub fn detach(&self) -> WalkNeighbors<Ix> {
- WalkNeighbors {
- inner: super::WalkNeighbors {
- skip_start: self.skip_start,
- next: self.next,
- },
- }
- }
-}
-
-impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix>
-where
- Ix: IndexType,
-{
- type Item = NodeIndex<Ix>;
-
- fn next(&mut self) -> Option<NodeIndex<Ix>> {
- // First any outgoing edges
- match self.edges.get(self.next[0].index()) {
- None => {}
- Some(edge) => {
- debug_assert!(edge.weight.is_some());
- self.next[0] = edge.next[0];
- return Some(edge.node[1]);
- }
- }
- // Then incoming edges
- // For an "undirected" iterator (traverse both incoming
- // and outgoing edge lists), make sure we don't double
- // count selfloops by skipping them in the incoming list.
- while let Some(edge) = self.edges.get(self.next[1].index()) {
- debug_assert!(edge.weight.is_some());
- self.next[1] = edge.next[1];
- if edge.node[0] != self.skip_start {
- return Some(edge.node[0]);
- }
- }
- None
- }
-}
-
-/// A “walker” object that can be used to step through the edge list of a node.
-///
-/// See [*.detach()*](struct.Neighbors.html#method.detach) for more information.
-///
-/// The walker does not borrow from the graph, so it lets you step through
-/// neighbors or incident edges while also mutating graph weights, as
-/// in the following example:
-///
-/// ```
-/// use petgraph::visit::Dfs;
-/// use petgraph::Incoming;
-/// use petgraph::stable_graph::StableGraph;
-///
-/// let mut gr = StableGraph::new();
-/// let a = gr.add_node(0.);
-/// let b = gr.add_node(0.);
-/// let c = gr.add_node(0.);
-/// gr.add_edge(a, b, 3.);
-/// gr.add_edge(b, c, 2.);
-/// gr.add_edge(c, b, 1.);
-///
-/// // step through the graph and sum incoming edges into the node weight
-/// let mut dfs = Dfs::new(&gr, a);
-/// while let Some(node) = dfs.next(&gr) {
-/// // use a detached neighbors walker
-/// let mut edges = gr.neighbors_directed(node, Incoming).detach();
-/// while let Some(edge) = edges.next_edge(&gr) {
-/// gr[node] += gr[edge];
-/// }
-/// }
-///
-/// // check the result
-/// assert_eq!(gr[a], 0.);
-/// assert_eq!(gr[b], 4.);
-/// assert_eq!(gr[c], 2.);
-/// ```
-pub struct WalkNeighbors<Ix> {
- inner: super::WalkNeighbors<Ix>,
-}
-
-impl<Ix: IndexType> Clone for WalkNeighbors<Ix> {
- clone_fields!(WalkNeighbors, inner);
-}
-
-impl<Ix: IndexType> WalkNeighbors<Ix> {
- /// Step to the next edge and its endpoint node in the walk for graph `g`.
- ///
- /// The next node indices are always the others than the starting point
- /// where the `WalkNeighbors` value was created.
- /// For an `Outgoing` walk, the target nodes,
- /// for an `Incoming` walk, the source nodes of the edge.
- pub fn next<N, E, Ty: EdgeType>(
- &mut self,
- g: &StableGraph<N, E, Ty, Ix>,
- ) -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
- self.inner.next(&g.g)
- }
-
- pub fn next_node<N, E, Ty: EdgeType>(
- &mut self,
- g: &StableGraph<N, E, Ty, Ix>,
- ) -> Option<NodeIndex<Ix>> {
- self.next(g).map(|t| t.1)
- }
-
- pub fn next_edge<N, E, Ty: EdgeType>(
- &mut self,
- g: &StableGraph<N, E, Ty, Ix>,
- ) -> Option<EdgeIndex<Ix>> {
- self.next(g).map(|t| t.0)
- }
-}
-
-/// Iterator over the node indices of a graph.
-pub struct NodeIndices<'a, N: 'a, Ix: 'a = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Node<Option<N>, Ix>>>,
-}
-
-impl<'a, N, Ix: IndexType> Iterator for NodeIndices<'a, N, Ix> {
- type Item = NodeIndex<Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter.ex_find_map(|(i, node)| {
- if node.weight.is_some() {
- Some(node_index(i))
- } else {
- None
- }
- })
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- let (_, hi) = self.iter.size_hint();
- (0, hi)
- }
-}
-
-impl<'a, N, Ix: IndexType> DoubleEndedIterator for NodeIndices<'a, N, Ix> {
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter.ex_rfind_map(|(i, node)| {
- if node.weight.is_some() {
- Some(node_index(i))
- } else {
- None
- }
- })
- }
-}
-
-impl<N, E, Ty, Ix> NodeIndexable for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType,
-{
- /// Return an upper bound of the node indices in the graph
- fn node_bound(&self) -> usize {
- self.node_indices().next_back().map_or(0, |i| i.index() + 1)
- }
- fn to_index(&self, ix: NodeIndex<Ix>) -> usize {
- ix.index()
- }
- fn from_index(&self, ix: usize) -> Self::NodeId {
- NodeIndex::new(ix)
- }
-}
-
-/// Iterator over the edge indices of a graph.
-pub struct EdgeIndices<'a, E: 'a, Ix: 'a = DefaultIx> {
- iter: iter::Enumerate<slice::Iter<'a, Edge<Option<E>, Ix>>>,
-}
-
-impl<'a, E, Ix: IndexType> Iterator for EdgeIndices<'a, E, Ix> {
- type Item = EdgeIndex<Ix>;
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter.ex_find_map(|(i, node)| {
- if node.weight.is_some() {
- Some(edge_index(i))
- } else {
- None
- }
- })
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- let (_, hi) = self.iter.size_hint();
- (0, hi)
- }
-}
-
-impl<'a, E, Ix: IndexType> DoubleEndedIterator for EdgeIndices<'a, E, Ix> {
- fn next_back(&mut self) -> Option<Self::Item> {
- self.iter.ex_rfind_map(|(i, node)| {
- if node.weight.is_some() {
- Some(edge_index(i))
- } else {
- None
- }
- })
- }
-}
-
-#[test]
-fn stable_graph() {
- let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
- let a = gr.add_node(0);
- let b = gr.add_node(1);
- let c = gr.add_node(2);
- let _ed = gr.add_edge(a, b, 1);
- println!("{:?}", gr);
- gr.remove_node(b);
- println!("{:?}", gr);
- let d = gr.add_node(3);
- println!("{:?}", gr);
- gr.check_free_lists();
- gr.remove_node(a);
- gr.check_free_lists();
- gr.remove_node(c);
- gr.check_free_lists();
- println!("{:?}", gr);
- gr.add_edge(d, d, 2);
- println!("{:?}", gr);
-
- let e = gr.add_node(4);
- gr.add_edge(d, e, 3);
- println!("{:?}", gr);
- for neigh in gr.neighbors(d) {
- println!("edge {:?} -> {:?}", d, neigh);
- }
- gr.check_free_lists();
-}
-
-#[test]
-fn dfs() {
- use crate::visit::Dfs;
-
- let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
- let a = gr.add_node("a");
- let b = gr.add_node("b");
- let c = gr.add_node("c");
- let d = gr.add_node("d");
- gr.add_edge(a, b, 1);
- gr.add_edge(a, c, 2);
- gr.add_edge(b, c, 3);
- gr.add_edge(b, d, 4);
- gr.add_edge(c, d, 5);
- gr.add_edge(d, b, 6);
- gr.add_edge(c, b, 7);
- println!("{:?}", gr);
-
- let mut dfs = Dfs::new(&gr, a);
- while let Some(next) = dfs.next(&gr) {
- println!("dfs visit => {:?}, weight={:?}", next, &gr[next]);
- }
-}
-
-#[test]
-fn test_retain_nodes() {
- let mut gr = StableGraph::<_, _>::with_capacity(6, 6);
- let a = gr.add_node("a");
- let f = gr.add_node("f");
- let b = gr.add_node("b");
- let c = gr.add_node("c");
- let d = gr.add_node("d");
- let e = gr.add_node("e");
- gr.add_edge(a, b, 1);
- gr.add_edge(a, c, 2);
- gr.add_edge(b, c, 3);
- gr.add_edge(b, d, 4);
- gr.add_edge(c, d, 5);
- gr.add_edge(d, b, 6);
- gr.add_edge(c, b, 7);
- gr.add_edge(d, e, 8);
- gr.remove_node(f);
-
- assert_eq!(gr.node_count(), 5);
- assert_eq!(gr.edge_count(), 8);
- gr.retain_nodes(|frozen_gr, ix| frozen_gr[ix] >= "c");
- assert_eq!(gr.node_count(), 3);
- assert_eq!(gr.edge_count(), 2);
-
- gr.check_free_lists();
-}
diff --git a/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs b/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs
deleted file mode 100644
index c24ca636b..000000000
--- a/vendor/petgraph/src/graph_impl/stable_graph/serialization.rs
+++ /dev/null
@@ -1,296 +0,0 @@
-use serde::de::Error;
-use serde::{Deserialize, Deserializer, Serialize, Serializer};
-
-use std::marker::PhantomData;
-
-use crate::prelude::*;
-
-use crate::graph::Node;
-use crate::graph::{Edge, IndexType};
-use crate::serde_utils::CollectSeqWithLength;
-use crate::serde_utils::MappedSequenceVisitor;
-use crate::serde_utils::{FromDeserialized, IntoSerializable};
-use crate::stable_graph::StableGraph;
-use crate::util::rev;
-use crate::visit::NodeIndexable;
-use crate::EdgeType;
-
-use super::super::serialization::{invalid_length_err, invalid_node_err, EdgeProperty};
-
-// Serialization representation for StableGraph
-// Keep in sync with deserialization and Graph
-#[derive(Serialize)]
-#[serde(rename = "Graph")]
-#[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))]
-pub struct SerStableGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> {
- nodes: Somes<&'a [Node<Option<N>, Ix>]>,
- node_holes: Holes<&'a [Node<Option<N>, Ix>]>,
- edge_property: EdgeProperty,
- #[serde(serialize_with = "ser_stable_graph_edges")]
- edges: &'a [Edge<Option<E>, Ix>],
-}
-
-// Deserialization representation for StableGraph
-// Keep in sync with serialization and Graph
-#[derive(Deserialize)]
-#[serde(rename = "Graph")]
-#[serde(bound(
- deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"
-))]
-pub struct DeserStableGraph<N, E, Ix> {
- #[serde(deserialize_with = "deser_stable_graph_nodes")]
- nodes: Vec<Node<Option<N>, Ix>>,
- #[serde(default = "Vec::new")]
- node_holes: Vec<NodeIndex<Ix>>,
- edge_property: EdgeProperty,
- #[serde(deserialize_with = "deser_stable_graph_edges")]
- edges: Vec<Edge<Option<E>, Ix>>,
-}
-
-/// `Somes` are the present node weights N, with known length.
-struct Somes<T>(usize, T);
-
-impl<'a, N, Ix> Serialize for Somes<&'a [Node<Option<N>, Ix>]>
-where
- N: Serialize,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- serializer.collect_seq_with_length(
- self.0,
- self.1.iter().filter_map(|node| node.weight.as_ref()),
- )
- }
-}
-
-/// Holes are the node indices of vacancies, with known length
-struct Holes<T>(usize, T);
-
-impl<'a, N, Ix> Serialize for Holes<&'a [Node<Option<N>, Ix>]>
-where
- Ix: Serialize + IndexType,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- serializer.collect_seq_with_length(
- self.0,
- self.1.iter().enumerate().filter_map(|(i, node)| {
- if node.weight.is_none() {
- Some(NodeIndex::<Ix>::new(i))
- } else {
- None
- }
- }),
- )
- }
-}
-
-fn ser_stable_graph_edges<S, E, Ix>(
- edges: &&[Edge<Option<E>, Ix>],
- serializer: S,
-) -> Result<S::Ok, S::Error>
-where
- S: Serializer,
- E: Serialize,
- Ix: Serialize + IndexType,
-{
- serializer.collect_seq_exact(edges.iter().map(|edge| {
- edge.weight
- .as_ref()
- .map(|w| (edge.source(), edge.target(), w))
- }))
-}
-
-fn deser_stable_graph_nodes<'de, D, N, Ix>(
- deserializer: D,
-) -> Result<Vec<Node<Option<N>, Ix>>, D::Error>
-where
- D: Deserializer<'de>,
- N: Deserialize<'de>,
- Ix: IndexType + Deserialize<'de>,
-{
- deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| {
- Ok(Node {
- weight: Some(n),
- next: [EdgeIndex::end(); 2],
- })
- }))
-}
-
-fn deser_stable_graph_edges<'de, D, N, Ix>(
- deserializer: D,
-) -> Result<Vec<Edge<Option<N>, Ix>>, D::Error>
-where
- D: Deserializer<'de>,
- N: Deserialize<'de>,
- Ix: IndexType + Deserialize<'de>,
-{
- deserializer.deserialize_seq(MappedSequenceVisitor::<
- Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>,
- _,
- _,
- >::new(|x| {
- if let Some((i, j, w)) = x {
- Ok(Edge {
- weight: Some(w),
- node: [i, j],
- next: [EdgeIndex::end(); 2],
- })
- } else {
- Ok(Edge {
- weight: None,
- node: [NodeIndex::end(); 2],
- next: [EdgeIndex::end(); 2],
- })
- }
- }))
-}
-
-impl<'a, N, E, Ty, Ix> IntoSerializable for &'a StableGraph<N, E, Ty, Ix>
-where
- Ix: IndexType,
- Ty: EdgeType,
-{
- type Output = SerStableGraph<'a, N, E, Ix>;
- fn into_serializable(self) -> Self::Output {
- let nodes = &self.raw_nodes()[..self.node_bound()];
- let node_count = self.node_count();
- let hole_count = nodes.len() - node_count;
- let edges = &self.raw_edges()[..self.edge_bound()];
- SerStableGraph {
- nodes: Somes(node_count, nodes),
- node_holes: Holes(hole_count, nodes),
- edges: edges,
- edge_property: EdgeProperty::from(PhantomData::<Ty>),
- }
- }
-}
-
-/// Requires crate feature `"serde-1"`
-impl<N, E, Ty, Ix> Serialize for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType + Serialize,
- N: Serialize,
- E: Serialize,
-{
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
- where
- S: Serializer,
- {
- self.into_serializable().serialize(serializer)
- }
-}
-
-impl<'a, N, E, Ty, Ix> FromDeserialized for StableGraph<N, E, Ty, Ix>
-where
- Ix: IndexType,
- Ty: EdgeType,
-{
- type Input = DeserStableGraph<N, E, Ix>;
- fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
- where
- E2: Error,
- {
- let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
- let mut nodes = input.nodes;
- let node_holes = input.node_holes;
- let edges = input.edges;
- if edges.len() >= <Ix as IndexType>::max().index() {
- Err(invalid_length_err::<Ix, _>("edge", edges.len()))?
- }
-
- // insert Nones for each hole
- let mut offset = node_holes.len();
- let node_bound = node_holes.len() + nodes.len();
- for hole_pos in rev(node_holes) {
- offset -= 1;
- if hole_pos.index() >= node_bound {
- Err(invalid_node_err(hole_pos.index(), node_bound))?;
- }
- let insert_pos = hole_pos.index() - offset;
- nodes.insert(
- insert_pos,
- Node {
- weight: None,
- next: [EdgeIndex::end(); 2],
- },
- );
- }
-
- if nodes.len() >= <Ix as IndexType>::max().index() {
- Err(invalid_length_err::<Ix, _>("node", nodes.len()))?
- }
-
- let node_bound = nodes.len();
- let mut sgr = StableGraph {
- g: Graph {
- nodes: nodes,
- edges: edges,
- ty: ty,
- },
- node_count: 0,
- edge_count: 0,
- free_edge: EdgeIndex::end(),
- free_node: NodeIndex::end(),
- };
- sgr.link_edges()
- .map_err(|i| invalid_node_err(i.index(), node_bound))?;
- Ok(sgr)
- }
-}
-
-/// Requires crate feature `"serde-1"`
-impl<'de, N, E, Ty, Ix> Deserialize<'de> for StableGraph<N, E, Ty, Ix>
-where
- Ty: EdgeType,
- Ix: IndexType + Deserialize<'de>,
- N: Deserialize<'de>,
- E: Deserialize<'de>,
-{
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
- where
- D: Deserializer<'de>,
- {
- Self::from_deserialized(DeserStableGraph::deserialize(deserializer)?)
- }
-}
-
-#[test]
-fn test_from_deserialized_with_holes() {
- use crate::graph::node_index;
- use crate::stable_graph::StableUnGraph;
- use itertools::assert_equal;
- use serde::de::value::Error as SerdeError;
-
- let input = DeserStableGraph::<_, (), u32> {
- nodes: vec![
- Node {
- weight: Some(1),
- next: [EdgeIndex::end(); 2],
- },
- Node {
- weight: Some(4),
- next: [EdgeIndex::end(); 2],
- },
- Node {
- weight: Some(5),
- next: [EdgeIndex::end(); 2],
- },
- ],
- node_holes: vec![node_index(0), node_index(2), node_index(3), node_index(6)],
- edges: vec![],
- edge_property: EdgeProperty::Undirected,
- };
- let graph = StableUnGraph::from_deserialized::<SerdeError>(input).unwrap();
-
- assert_eq!(graph.node_count(), 3);
- assert_equal(
- graph.raw_nodes().iter().map(|n| n.weight.as_ref().cloned()),
- vec![None, Some(1), None, None, Some(4), Some(5), None],
- );
-}