graph_algo_ptas/data_structure/link_graph/
example.rs

1//! Contains example LinkGraphs
2use crate::data_structure::link_graph::{LinkDart, LinkGraph, LinkVertex};
3
4/// Returns an example LinkGraph which contains three interconnected circles.
5/// The first circle contains one vertex.
6/// The second circle contains four vertex.
7/// The third circle contains eight vertex.
8pub fn three_ring_graph() -> (LinkGraph, Vec<LinkVertex>, Vec<LinkDart>) {
9    let mut g = LinkGraph::new();
10    let vertexes = (0..13).map(|_| g.new_vertex()).collect::<Vec<_>>();
11
12    let edge_definition = [
13        (1, 2, None, None),
14        (2, 3, Some(1), None),
15        (3, 1, Some(2), None),
16        (1, 3, None, Some(3)),
17        (3, 4, Some(4), None),
18        (4, 1, Some(5), None),
19        (1, 4, None, Some(6)),
20        (4, 5, Some(7), None),
21        (5, 1, Some(8), None),
22        (1, 5, None, Some(9)),
23        (5, 2, Some(10), None),
24        (2, 1, Some(11), Some(1)),
25        (2, 6, None, None),
26        (6, 7, Some(13), None),
27        (7, 2, Some(14), None),
28        (2, 7, None, Some(15)),
29        (7, 3, Some(16), None),
30        (3, 2, Some(17), Some(2)),
31        (3, 7, None, Some(17)),
32        (7, 8, Some(19), None),
33        (8, 3, Some(20), None),
34        (3, 8, None, Some(21)),
35        (8, 9, Some(22), None),
36        (9, 3, Some(23), None),
37        (3, 9, None, Some(24)),
38        (9, 4, Some(25), None),
39        (4, 3, Some(26), Some(5)),
40        (4, 9, None, Some(26)),
41        (9, 10, Some(28), None),
42        (10, 4, Some(29), None),
43        (4, 10, None, Some(30)),
44        (10, 11, Some(31), None),
45        (11, 4, Some(32), None),
46        (4, 11, None, Some(33)),
47        (11, 5, Some(34), None),
48        (5, 4, Some(35), Some(8)),
49        (5, 11, None, Some(35)),
50        (11, 12, Some(37), None),
51        (12, 5, Some(38), None),
52        (5, 12, None, Some(39)),
53        (12, 13, Some(40), None),
54        (13, 5, Some(41), None),
55        (5, 13, None, Some(42)),
56        (13, 2, Some(43), None),
57        (2, 5, Some(44), Some(11)),
58        (2, 13, None, Some(44)),
59        (13, 6, Some(46), None),
60        (6, 2, Some(47), Some(13)),
61        (7, 6, None, Some(14)),
62        (8, 7, Some(49), Some(20)),
63        (9, 8, Some(50), Some(23)),
64        (10, 9, Some(51), Some(29)),
65        (11, 10, Some(52), Some(32)),
66        (12, 11, Some(53), Some(38)),
67        (13, 12, Some(54), Some(41)),
68        (6, 13, Some(55), Some(47)),
69    ];
70    let mut edges: Vec<LinkDart> = Vec::with_capacity(edge_definition.len());
71    for (from, to, prev, twin) in edge_definition {
72        edges.push(g.new_dart(
73            vertexes[from - 1].clone(),
74            vertexes[to - 1].clone(),
75            prev.map(|p| edges[p - 1].clone()),
76            None,
77            twin.map(|t| edges[t - 1].clone()),
78            None,
79        ));
80    }
81    g.auto_face();
82    (g, vertexes, edges)
83}
84
85#[cfg(test)]
86mod test {
87    use crate::data_structure::link_graph::example::three_ring_graph;
88
89    #[test]
90    pub fn validate_three_ring_graph() {
91        let (g, _, _) = three_ring_graph();
92        g.validate();
93    }
94}