snark_tool/graph/undirected/simple_edge_graph/
graph.rs1use 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#[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) {
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
180pub 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}