1 #![cfg(feature = "stable_graph")]
3 extern crate itertools
;
8 use itertools
::assert_equal
;
9 use petgraph
::algo
::{kosaraju_scc, min_spanning_tree, tarjan_scc}
;
10 use petgraph
::dot
::Dot
;
11 use petgraph
::prelude
::*;
12 use petgraph
::stable_graph
::node_index
as n
;
13 use petgraph
::visit
::{IntoEdgeReferences, IntoNodeReferences, NodeIndexable}
;
14 use petgraph
::EdgeType
;
18 let mut g
= StableGraph
::<_
, ()>::new();
19 let a
= g
.add_node(0);
20 let b
= g
.add_node(1);
21 let c
= g
.add_node(2);
23 let mut iter
= g
.node_indices();
24 assert_eq
!(iter
.next(), Some(a
));
25 assert_eq
!(iter
.next(), Some(c
));
26 assert_eq
!(iter
.next(), None
);
31 let mut g
= StableGraph
::<_
, ()>::new();
32 assert_eq
!(g
.node_bound(), g
.node_count());
35 assert_eq
!(g
.node_bound(), g
.node_count());
37 let full_count
= g
.node_count();
40 assert_eq
!(g
.node_bound(), full_count
);
42 assert_eq
!(g
.node_bound(), 0);
47 let mut gr
= scc_graph();
50 // check that we use the free list for the vacancies
51 assert_eq
!(gr
.add_node(()), n(1));
52 assert_eq
!(gr
.add_node(()), n(4));
53 assert
!(gr
.edge_references().next().is_none());
54 assert
!(gr
.node_indices().all(|i
| gr
.neighbors(i
).next().is_none()));
57 fn assert_sccs_eq(mut res
: Vec
<Vec
<NodeIndex
>>, normalized
: Vec
<Vec
<NodeIndex
>>) {
58 // normalize the result and compare with the answer.
62 // sort by minimum element
63 res
.sort_by(|v
, w
| v
[0].cmp(&w
[0]));
64 assert_eq
!(res
, normalized
);
67 fn scc_graph() -> StableGraph
<(), ()> {
68 let mut gr
: StableGraph
<(), ()> = StableGraph
::from_edges(&[
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);
98 vec
![n(0), n(3), n(6)],
100 vec
![n(2), n(5), n(8)],
106 fn test_tarjan_scc() {
107 let gr
= scc_graph();
109 let x
= n(gr
.node_bound() - 1);
113 vec
![n(0), n(3), n(6)],
115 vec
![n(2), n(5), n(8)],
120 fn make_graph
<Ty
>() -> StableGraph
<(), i32, Ty
>
124 let mut gr
= StableGraph
::default();
126 let mut e
= || -> i32 { c.next().unwrap() }
;
127 gr
.extend_with_edges(&[
138 (8, 6, e()), // parallel edge
141 // make an identical replacement of n(4) and leave a hole
142 let x
= gr
.add_node(());
143 gr
.add_edge(n(7), x
, e());
144 gr
.add_edge(x
, n(1), e());
145 gr
.add_edge(x
, x
, e()); // make two self loops
146 let rm_self_loop
= gr
.add_edge(x
, x
, e());
147 gr
.add_edge(x
, x
, e());
148 gr
.remove_node(n(4));
149 gr
.remove_node(n(6));
150 gr
.remove_edge(rm_self_loop
);
154 defmac
!(edges
ref gr
, x
=> gr
.edges(x
).map(|r
| (r
.target(), *r
.weight())));
157 fn test_edges_directed() {
158 let gr
= make_graph
::<Directed
>();
160 assert_equal(edges
!(gr
, x
), vec
![(x
, 16), (x
, 14), (n(1), 13)]);
161 assert_equal(edges
!(gr
, n(0)), vec
![(n(3), 1)]);
162 assert_equal(edges
!(gr
, n(4)), vec
![]);
166 fn test_edge_references() {
167 let gr
= make_graph
::<Directed
>();
168 assert_eq
!(gr
.edge_count(), gr
.edge_references().count());
172 fn test_edges_undirected() {
173 let gr
= make_graph
::<Undirected
>();
177 vec
![(x
, 16), (x
, 14), (n(1), 13), (n(7), 12)],
179 assert_equal(edges
!(gr
, n(0)), vec
![(n(3), 1)]);
180 assert_equal(edges
!(gr
, n(4)), vec
![]);
184 fn test_edge_iterators_directed() {
185 let gr
= make_graph
::<Directed
>();
186 for i
in gr
.node_indices() {
187 itertools
::assert_equal(gr
.edges_directed(i
, Outgoing
), gr
.edges(i
));
188 for edge
in gr
.edges_directed(i
, Outgoing
) {
192 "outgoing edges should have a fixed source"
196 let mut incoming
= vec
![Vec
::new(); gr
.node_bound()];
198 for i
in gr
.node_indices() {
199 for j
in gr
.neighbors(i
) {
200 incoming
[j
.index()].push(i
);
204 println
!("{:#?}", gr
);
205 for i
in gr
.node_indices() {
206 itertools
::assert_equal(
207 gr
.edges_directed(i
, Incoming
).map(|e
| e
.source()),
208 incoming
[i
.index()].iter().rev().cloned(),
210 for edge
in gr
.edges_directed(i
, Incoming
) {
214 "incoming edges should have a fixed target"
221 fn test_edge_iterators_undir() {
222 let gr
= make_graph
::<Undirected
>();
223 for i
in gr
.node_indices() {
224 itertools
::assert_equal(gr
.edges_directed(i
, Outgoing
), gr
.edges(i
));
225 for edge
in gr
.edges_directed(i
, Outgoing
) {
229 "outgoing edges should have a fixed source"
233 for i
in gr
.node_indices() {
234 itertools
::assert_equal(gr
.edges_directed(i
, Incoming
), gr
.edges(i
));
235 for edge
in gr
.edges_directed(i
, Incoming
) {
239 "incoming edges should have a fixed target"
246 #[should_panic(expected = "is not a node")]
247 fn add_edge_vacant() {
248 let mut g
= StableGraph
::<_
, _
>::new();
249 let a
= g
.add_node(0);
250 let b
= g
.add_node(1);
251 let _
= g
.add_node(2);
252 let _
= g
.remove_node(b
);
257 #[should_panic(expected = "is not a node")]
259 let mut g
= StableGraph
::<_
, _
>::new();
260 let a
= g
.add_node(0);
261 let _
= g
.add_node(1);
262 let _
= g
.add_node(2);
263 g
.add_edge(a
, n(4), 1);
267 fn test_node_references() {
268 let gr
= scc_graph();
270 itertools
::assert_equal(gr
.node_references().map(|(i
, _
)| i
), gr
.node_indices());
274 fn iterators_undir() {
275 let mut g
= StableUnGraph
::<_
, _
>::default();
276 let a
= g
.add_node(0);
277 let b
= g
.add_node(1);
278 let c
= g
.add_node(2);
279 let d
= g
.add_node(3);
280 g
.extend_with_edges(&[(a
, b
, 1), (a
, c
, 2), (b
, c
, 3), (c
, c
, 4), (a
, d
, 5)]);
283 itertools
::assert_equal(g
.neighbors(a
), vec
![d
, c
]);
284 itertools
::assert_equal(g
.neighbors(c
), vec
![c
, a
]);
285 itertools
::assert_equal(g
.neighbors(d
), vec
![a
]);
287 // the node that was removed
288 itertools
::assert_equal(g
.neighbors(b
), vec
![]);
292 itertools
::assert_equal(g
.neighbors(c
), vec
![]);
297 let mut gr
= StableGraph
::new();
298 let a
= gr
.add_node("x");
299 let b
= gr
.add_node("y");
300 gr
.add_edge(a
, a
, "10");
301 gr
.add_edge(a
, b
, "20");
302 let dot_output
= format
!("{}", Dot
::new(&gr
));
308 0 -> 0 [ label = "10" ]
309 0 -> 1 [ label = "20" ]
315 defmac
!(iter_eq a
, b
=> a
.eq(b
));
316 defmac
!(nodes_eq
ref a
, ref b
=> a
.node_references().eq(b
.node_references()));
317 defmac
!(edgew_eq
ref a
, ref b
=> a
.edge_references().eq(b
.edge_references()));
318 defmac
!(edges_eq
ref a
, ref b
=>
320 a
.edge_references().map(|e
| (e
.source(), e
.target())),
321 b
.edge_references().map(|e
| (e
.source(), e
.target()))));
325 let mut gr1
= StableGraph
::new();
326 let a
= gr1
.add_node(1);
327 let b
= gr1
.add_node(2);
328 let c
= gr1
.add_node(3);
329 gr1
.add_edge(a
, a
, 10);
330 gr1
.add_edge(a
, b
, 20);
331 gr1
.add_edge(b
, c
, 30);
332 gr1
.add_edge(a
, c
, 40);
334 let gr2
= Graph
::from(gr1
.clone());
335 let gr3
= StableGraph
::from(gr2
);
336 assert
!(nodes_eq
!(gr1
, gr3
));
337 assert
!(edgew_eq
!(gr1
, gr3
));
338 assert
!(edges_eq
!(gr1
, gr3
));
342 let gr4
= Graph
::from(gr1
);
343 let gr5
= StableGraph
::from(gr4
.clone());
345 let mut ans
= StableGraph
::new();
346 let a
= ans
.add_node(1);
347 let c
= ans
.add_node(3);
348 ans
.add_edge(a
, a
, 10);
349 ans
.add_edge(a
, c
, 40);
351 assert
!(nodes_eq
!(gr4
, ans
));
352 assert
!(edges_eq
!(gr4
, ans
));
354 assert
!(nodes_eq
!(gr5
, ans
));
355 assert
!(edgew_eq
!(gr5
, ans
));
356 assert
!(edges_eq
!(gr5
, ans
));
359 use petgraph
::data
::FromElements
;
360 use petgraph
::stable_graph
::StableGraph
;
363 fn from_min_spanning_tree() {
364 let mut g
= StableGraph
::new();
365 let mut nodes
= Vec
::new();
367 nodes
.push(g
.add_node(()));
369 let es
= [(4, 5), (3, 4), (3, 5)];
370 for &(a
, b
) in es
.iter() {
371 g
.add_edge(NodeIndex
::new(a
), NodeIndex
::new(b
), ());
374 let _
= g
.remove_node(nodes
[i
]);
376 let _
= StableGraph
::<(), (), Undirected
, usize>::from_elements(min_spanning_tree(&g
));
380 fn weights_mut_iterator() {
381 let mut gr
= StableGraph
::new();
382 let a
= gr
.add_node(1);
383 let b
= gr
.add_node(2);
384 let c
= gr
.add_node(3);
385 let e1
= gr
.add_edge(a
, a
, 10);
386 let e2
= gr
.add_edge(a
, b
, 20);
387 let e3
= gr
.add_edge(b
, c
, 30);
388 let e4
= gr
.add_edge(a
, c
, 40);
390 for n
in gr
.node_weights_mut() {
393 assert_eq
!(gr
[a
], 2);
394 assert_eq
!(gr
[b
], 3);
395 assert_eq
!(gr
[c
], 4);
397 for e
in gr
.edge_weights_mut() {
400 assert_eq
!(gr
[e1
], 9);
401 assert_eq
!(gr
[e2
], 19);
402 assert_eq
!(gr
[e3
], 29);
403 assert_eq
!(gr
[e4
], 39);
407 assert_eq
!(gr
.node_weights_mut().count(), gr
.node_count());
408 assert_eq
!(gr
.edge_weights_mut().count(), gr
.edge_count());