1 #![cfg(feature = "stable_graph")]
4 extern crate itertools
;
5 #[macro_use] extern crate defmac;
7 use petgraph
::prelude
::*;
8 use petgraph
::stable_graph
::node_index
as n
;
9 use petgraph
::EdgeType
;
10 use petgraph
::algo
::{kosaraju_scc, tarjan_scc}
;
11 use petgraph
::visit
::{
16 use petgraph
::dot
::Dot
;
18 use itertools
::assert_equal
;
22 let mut g
= StableGraph
::<_
, ()>::new();
23 let a
= g
.add_node(0);
24 let b
= g
.add_node(1);
25 let c
= g
.add_node(2);
27 let mut iter
= g
.node_indices();
28 assert_eq
!(iter
.next(), Some(a
));
29 assert_eq
!(iter
.next(), Some(c
));
30 assert_eq
!(iter
.next(), None
);
35 let mut g
= StableGraph
::<_
, ()>::new();
36 assert_eq
!(g
.node_bound(), g
.node_count());
39 assert_eq
!(g
.node_bound(), g
.node_count());
41 let full_count
= g
.node_count();
44 assert_eq
!(g
.node_bound(), full_count
);
46 assert_eq
!(g
.node_bound(), 0);
51 let mut gr
= scc_graph();
54 // check that we use the free list for the vacancies
55 assert_eq
!(gr
.add_node(()), n(1));
56 assert_eq
!(gr
.add_node(()), n(4));
57 assert
!(gr
.edge_references().next().is_none());
58 assert
!(gr
.node_indices().all(|i
| gr
.neighbors(i
).next().is_none()));
61 fn assert_sccs_eq(mut res
: Vec
<Vec
<NodeIndex
>>, normalized
: Vec
<Vec
<NodeIndex
>>) {
62 // normalize the result and compare with the answer.
66 // sort by minimum element
67 res
.sort_by(|v
, w
| v
[0].cmp(&w
[0]));
68 assert_eq
!(res
, normalized
);
71 fn scc_graph() -> StableGraph
<(), ()> {
72 let mut gr
: StableGraph
<(), ()> = StableGraph
::from_edges(&[
77 (2, 5), (5, 8), (7, 5),
81 // make an identical replacement of n(4) and leave a hole
82 let x
= gr
.add_node(());
83 gr
.add_edge(n(7), x
, ());
84 gr
.add_edge(x
, n(1), ());
94 let x
= n(gr
.node_bound() - 1);
95 assert_sccs_eq(kosaraju_scc(&gr
), vec
![
96 vec
![n(0), n(3), n(6)],
98 vec
![n(2), n(5), n(8)],
104 fn test_tarjan_scc() {
105 let gr
= scc_graph();
107 let x
= n(gr
.node_bound() - 1);
108 assert_sccs_eq(tarjan_scc(&gr
), vec
![
109 vec
![n(0), n(3), n(6)],
110 vec
![n(1), n(7), x
],
111 vec
![n(2), n(5), n(8)],
115 fn make_graph
<Ty
>() -> StableGraph
<(), i32, Ty
>
118 let mut gr
= StableGraph
::default();
120 let mut e
= || -> i32 { c.next().unwrap() }
;
121 gr
.extend_with_edges(&[
132 (8, 6, e()), // parallel edge
134 // make an identical replacement of n(4) and leave a hole
135 let x
= gr
.add_node(());
136 gr
.add_edge(n(7), x
, e());
137 gr
.add_edge(x
, n(1), e());
138 gr
.add_edge(x
, x
, e()); // make two self loops
139 let rm_self_loop
= gr
.add_edge(x
, x
, e());
140 gr
.add_edge(x
, x
, e());
141 gr
.remove_node(n(4));
142 gr
.remove_node(n(6));
143 gr
.remove_edge(rm_self_loop
);
147 defmac
!(edges
ref gr
, x
=> gr
.edges(x
).map(|r
| (r
.target(), *r
.weight())));
150 fn test_edges_directed() {
151 let gr
= make_graph
::<Directed
>();
153 assert_equal(edges
!(gr
, x
), vec
![(x
, 16), (x
, 14), (n(1), 13)]);
154 assert_equal(edges
!(gr
, n(0)), vec
![(n(3), 1)]);
155 assert_equal(edges
!(gr
, n(4)), vec
![]);
159 fn test_edge_references() {
160 let gr
= make_graph
::<Directed
>();
161 assert_eq
!(gr
.edge_count(), gr
.edge_references().count());
165 fn test_edges_undirected() {
166 let gr
= make_graph
::<Undirected
>();
168 assert_equal(edges
!(gr
, x
), vec
![(x
, 16), (x
, 14), (n(1), 13), (n(7), 12)]);
169 assert_equal(edges
!(gr
, n(0)), vec
![(n(3), 1)]);
170 assert_equal(edges
!(gr
, n(4)), vec
![]);
174 fn test_edge_iterators_directed() {
175 let gr
= make_graph
::<Directed
>();
176 for i
in gr
.node_indices() {
177 itertools
::assert_equal(
178 gr
.edges_directed(i
, Outgoing
),
181 let mut incoming
= vec
![Vec
::new(); gr
.node_bound()];
183 for i
in gr
.node_indices() {
184 for j
in gr
.neighbors(i
) {
185 incoming
[j
.index()].push(i
);
189 println
!("{:#?}", gr
);
190 for i
in gr
.node_indices() {
191 itertools
::assert_equal(
192 gr
.edges_directed(i
, Incoming
).map(|e
| e
.source()),
193 incoming
[i
.index()].iter().rev().cloned());
198 fn test_edge_iterators_undir() {
199 let gr
= make_graph
::<Undirected
>();
200 for i
in gr
.node_indices() {
201 itertools
::assert_equal(
202 gr
.edges_directed(i
, Outgoing
),
205 for i
in gr
.node_indices() {
206 itertools
::assert_equal(
207 gr
.edges_directed(i
, Incoming
),
213 #[should_panic(expected="is not a node")]
214 fn add_edge_vacant() {
215 let mut g
= StableGraph
::<_
, _
>::new();
216 let a
= g
.add_node(0);
217 let b
= g
.add_node(1);
218 let _
= g
.add_node(2);
219 let _
= g
.remove_node(b
);
224 #[should_panic(expected="is not a node")]
226 let mut g
= StableGraph
::<_
, _
>::new();
227 let a
= g
.add_node(0);
228 let _
= g
.add_node(1);
229 let _
= g
.add_node(2);
230 g
.add_edge(a
, n(4), 1);
234 fn test_node_references() {
235 let gr
= scc_graph();
237 itertools
::assert_equal(
238 gr
.node_references().map(|(i
, _
)| i
),
243 fn iterators_undir() {
244 let mut g
= StableUnGraph
::<_
, _
>::default();
245 let a
= g
.add_node(0);
246 let b
= g
.add_node(1);
247 let c
= g
.add_node(2);
248 let d
= g
.add_node(3);
249 g
.extend_with_edges(&[
258 itertools
::assert_equal(
262 itertools
::assert_equal(
266 itertools
::assert_equal(
271 // the node that was removed
272 itertools
::assert_equal(
279 itertools
::assert_equal(
287 let mut gr
= StableGraph
::new();
288 let a
= gr
.add_node("x");
289 let b
= gr
.add_node("y");
290 gr
.add_edge(a
, a
, "10");
291 gr
.add_edge(a
, b
, "20");
292 let dot_output
= format
!("{}", Dot
::new(&gr
));
293 assert_eq
!(dot_output
,
303 defmac
!(iter_eq a
, b
=> a
.eq(b
));
304 defmac
!(nodes_eq
ref a
, ref b
=> a
.node_references().eq(b
.node_references()));
305 defmac
!(edgew_eq
ref a
, ref b
=> a
.edge_references().eq(b
.edge_references()));
306 defmac
!(edges_eq
ref a
, ref b
=>
308 a
.edge_references().map(|e
| (e
.source(), e
.target())),
309 b
.edge_references().map(|e
| (e
.source(), e
.target()))));
313 let mut gr1
= StableGraph
::new();
314 let a
= gr1
.add_node(1);
315 let b
= gr1
.add_node(2);
316 let c
= gr1
.add_node(3);
317 gr1
.add_edge(a
, a
, 10);
318 gr1
.add_edge(a
, b
, 20);
319 gr1
.add_edge(b
, c
, 30);
320 gr1
.add_edge(a
, c
, 40);
322 let gr2
= Graph
::from(gr1
.clone());
323 let gr3
= StableGraph
::from(gr2
.clone());
324 assert
!(nodes_eq
!(gr1
, gr3
));
325 assert
!(edgew_eq
!(gr1
, gr3
));
326 assert
!(edges_eq
!(gr1
, gr3
));
330 let gr4
= Graph
::from(gr1
.clone());
331 let gr5
= StableGraph
::from(gr4
.clone());
333 let mut ans
= StableGraph
::new();
334 let a
= ans
.add_node(1);
335 let c
= ans
.add_node(3);
336 ans
.add_edge(a
, a
, 10);
337 ans
.add_edge(a
, c
, 40);
339 assert
!(nodes_eq
!(gr4
, ans
));
340 assert
!(edges_eq
!(gr4
, ans
));
342 assert
!(nodes_eq
!(gr5
, ans
));
343 assert
!(edgew_eq
!(gr5
, ans
));
344 assert
!(edges_eq
!(gr5
, ans
));