snark_tool/graph/undirected/simple_edge_graph/
graph.rs

1use std::{fmt, slice};
2
3use crate::graph::edge::{Edge, EdgeConstructor};
4use crate::graph::graph::{Graph, GraphConstructor};
5use crate::graph::undirected::edge::UndirectedEdge;
6use crate::graph::undirected::simple_edge_graph::simple_vertex::SimpleVertex;
7use crate::graph::undirected::UndirectedGraph;
8use crate::graph::vertex::{Vertex, VertexConstructor};
9
10///
11/// undirected, without loops or multiple edges
12///
13#[derive(Debug, Clone)]
14pub struct SimpleEdgeGraph {
15    pub size: usize,
16    pub vertices: Vec<SimpleVertex>,
17    pub edges: Vec<UndirectedEdge>,
18}
19
20impl UndirectedGraph for SimpleEdgeGraph {}
21
22impl Graph for SimpleEdgeGraph {
23    type V = SimpleVertex;
24    type E = UndirectedEdge;
25
26    fn size(&self) -> usize {
27        self.vertices.len()
28    }
29
30    fn has_edge(&self, from: usize, to: usize) -> bool {
31        let edge_to_check = UndirectedEdge::new(from, to);
32        for edge in &self.edges {
33            if edge.from() == edge_to_check.from() && edge.to() == edge_to_check.to() {
34                return true;
35            }
36        }
37        false
38    }
39
40    fn add_vertex(&mut self) {
41        self.vertices.push(SimpleVertex::new(self.vertices.len()));
42    }
43
44    fn add_edge(&mut self, from: usize, to: usize) {
45        let edge = UndirectedEdge::new(from, to);
46        if self.has_edge(from, to) {
47            return;
48        }
49        self.edges.push(edge.clone());
50        self.edges.sort_by(|a, b| {
51            if a.from() == b.from() {
52                return a.to().cmp(&b.to());
53            }
54            a.from().cmp(&b.from())
55        });
56        while self.vertices.len() <= edge.to() {
57            self.add_vertex();
58        }
59    }
60
61    fn remove_edge(&mut self, from: usize, to: usize) {
62        let to_remove = UndirectedEdge::new(from, to);
63        self.edges
64            .retain(|edge| edge.from() != to_remove.from() || edge.to() != to_remove.to());
65    }
66
67    fn remove_edges_of_vertex(&mut self, vertex: usize) /*-> Self*/
68    {
69        self.edges
70            .retain(|edge| edge.from() != vertex && edge.to() != vertex);
71    }
72
73    fn remove_vertex(&mut self, vertex_index: usize) {
74        self.remove_edges_of_vertex(vertex_index)
75    }
76
77    fn vertices<'a>(&'a self) -> Box<dyn Iterator<Item = &'a SimpleVertex> + 'a> {
78        let iter: slice::Iter<'a, SimpleVertex> = self.vertices.iter();
79        Box::new(iter)
80    }
81
82    fn edges<'a>(&'a self) -> Box<dyn Iterator<Item = &'a UndirectedEdge> + 'a> {
83        Box::new(self.edges.iter())
84    }
85
86    fn edges_of_vertex<'a>(
87        &'a self,
88        vertex: usize,
89    ) -> Box<dyn Iterator<Item = &'a UndirectedEdge> + 'a> {
90        Box::new(Edges::of_vertex(self.edges.iter(), vertex))
91    }
92
93    fn neighbors_of_vertex(&self, vertex: usize) -> Vec<usize> {
94        let mut neighbors = vec![];
95        let mut edges = self.edges_of_vertex(vertex);
96        while let Some(edge) = edges.next() {
97            if edge.from() == vertex {
98                neighbors.push(edge.to());
99            } else {
100                neighbors.push(edge.from());
101            }
102        }
103        neighbors
104    }
105}
106
107impl GraphConstructor for SimpleEdgeGraph {
108    fn new() -> Self {
109        Self::with_vertices_capacity(20)
110    }
111
112    fn with_capacity(vertices: usize, edges: usize) -> Self {
113        SimpleEdgeGraph {
114            size: 0,
115            vertices: Vec::with_capacity(vertices),
116            edges: Vec::with_capacity(edges),
117        }
118    }
119
120    fn with_vertices_capacity(vertices: usize) -> Self {
121        Self::with_capacity(vertices, vertices * 2)
122    }
123}
124
125impl SimpleEdgeGraph {
126    #[allow(dead_code)]
127    pub fn from_graph<G: Graph>(graph: &G) -> Self {
128        let mut vertices = vec![];
129        for vertex in graph.vertices() {
130            vertices.push(SimpleVertex::new(vertex.index()));
131        }
132        let mut edges = vec![];
133        for edge in graph.edges() {
134            edges.push(UndirectedEdge::new(edge.from(), edge.to()));
135        }
136        SimpleEdgeGraph {
137            size: graph.size(),
138            vertices,
139            edges,
140        }
141    }
142}
143
144impl fmt::Display for SimpleEdgeGraph {
145    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
146        for vertex in &self.vertices {
147            write!(f, "{}: ", vertex.index())?;
148            let mut separ = String::from("");
149            for edges_of_vertex in self.edges_of_vertex(vertex.index()) {
150                if edges_of_vertex.from() == vertex.index() {
151                    write!(f, "{}{}", separ, edges_of_vertex.to())?;
152                } else {
153                    write!(f, "{}{}", separ, edges_of_vertex.from())?;
154                }
155                separ = String::from(", ");
156            }
157            writeln!(f)?;
158        }
159        Ok(())
160    }
161}
162
163impl PartialEq for SimpleEdgeGraph {
164    fn eq(&self, other: &Self) -> bool {
165        if self.size != other.size {
166            return false;
167        }
168        if self.edges[..] != other.edges[..] {
169            return false;
170        }
171        if self.vertices[..] != other.vertices[..] {
172            return false;
173        }
174        true
175    }
176}
177
178impl Eq for SimpleEdgeGraph {}
179
180/// Edges
181pub struct Edges<'a, E> {
182    vertex: Option<usize>,
183    iter: slice::Iter<'a, E>,
184}
185
186impl<'a, E> Edges<'a, E> {
187    pub fn of_vertex(iter: slice::Iter<'a, E>, vertex: usize) -> Self {
188        Edges {
189            vertex: Some(vertex),
190            iter,
191        }
192    }
193}
194
195impl<'a, E> Iterator for Edges<'a, E>
196where
197    E: Edge,
198{
199    type Item = &'a E;
200    fn next(&mut self) -> Option<Self::Item> {
201        if self.vertex.is_some() {
202            let mut edge_opt = self.iter.next();
203            while edge_opt.is_some() {
204                let edge = edge_opt.unwrap();
205                if edge.from() == self.vertex.unwrap() || edge.to() == self.vertex.unwrap() {
206                    return edge_opt;
207                }
208                edge_opt = self.iter.next();
209            }
210            return None;
211        }
212        self.iter.next()
213    }
214}