refactor vertex -> node

This commit is contained in:
sigil-03 2025-12-04 15:13:51 -07:00
parent 2c964737bc
commit 114176202f
4 changed files with 43 additions and 43 deletions

View file

@ -1,13 +1,13 @@
use crate::edge::Edge; use crate::edge::Edge;
use crate::vertex::Vertex; use crate::node::Node;
/// operations you might want to do on a graph or on nodes in a graph /// operations you might want to do on a graph or on nodes in a graph
pub trait Graph<V: Vertex, E: Edge> { pub trait Graph<N: Node, E: Edge> {
// Connect two nodes, and return the edge // Connect two nodes, and return the edge
// TODO: figure out a way to modify self? is that even needed? // TODO: figure out a way to modify self? is that even needed?
// same for `disconnect()` // same for `disconnect()`
// fn connect(vertex_1: &V, vertex_2: &V) -> E; // fn connect(vertex_1: &V, vertex_2: &V) -> E;
fn connect(&mut self, vertex_1: V::HANDLE, vertex_2: V::HANDLE) -> E::HANDLE; fn connect(&mut self, node_1: N::HANDLE, node_2: N::HANDLE) -> E::HANDLE;
// disconnect two nodes, and return the old edge // disconnect two nodes, and return the old edge
// fn disconnect(vertex_1: &V, vertex_2: &V) -> E; // fn disconnect(vertex_1: &V, vertex_2: &V) -> E;

View file

@ -1,6 +1,6 @@
mod edge; mod edge;
mod graph; mod graph;
mod vertex; mod node;
#[cfg(test)] #[cfg(test)]
mod test; mod test;

View file

@ -1,4 +1,4 @@
pub trait Vertex { pub trait Node {
type HANDLE; type HANDLE;
// get the degree of a given vertex - possibly put this in a GraphUtil trait? // get the degree of a given vertex - possibly put this in a GraphUtil trait?

View file

@ -1,29 +1,29 @@
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use crate::{edge::Edge, graph::Graph, vertex::Vertex}; use crate::{edge::Edge, graph::Graph, node::Node};
struct SimpleEdge { struct SimpleEdge {
id: usize, id: usize,
v1: usize, n1: usize,
v2: usize, n2: usize,
} }
impl Edge for SimpleEdge { impl Edge for SimpleEdge {
type HANDLE = usize; type HANDLE = usize;
} }
struct SimpleVertex { struct SimpleNode {
id: usize, id: usize,
edges: HashSet<<SimpleEdge as Edge>::HANDLE>, edges: HashSet<<SimpleEdge as Edge>::HANDLE>,
} }
impl SimpleVertex { impl SimpleNode {
pub fn get_id(&self) -> usize { pub fn get_id(&self) -> usize {
self.id.clone() self.id.clone()
} }
} }
impl Vertex for SimpleVertex { impl Node for SimpleNode {
type HANDLE = usize; type HANDLE = usize;
fn degree(&self) -> usize { fn degree(&self) -> usize {
@ -32,24 +32,24 @@ impl Vertex for SimpleVertex {
} }
struct SimpleGraph { struct SimpleGraph {
vertices: HashMap<usize, SimpleVertex>, nodes: HashMap<usize, SimpleNode>,
edges: HashMap<usize, SimpleEdge>, edges: HashMap<usize, SimpleEdge>,
} }
impl SimpleGraph { impl SimpleGraph {
pub fn new_vertex(&mut self) -> <SimpleVertex as Vertex>::HANDLE { pub fn new_node(&mut self) -> <SimpleNode as Node>::HANDLE {
let id = self.vertices.len(); let id = self.nodes.len();
let v = SimpleVertex { let v = SimpleNode {
id: id.clone(), id: id.clone(),
edges: HashSet::new(), edges: HashSet::new(),
}; };
self.vertices.insert(id, v); self.nodes.insert(id, v);
id id
} }
} }
impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph { impl<'a> Graph<SimpleNode, SimpleEdge> for SimpleGraph {
fn connect(&mut self, vertex_1: usize, vertex_2: usize) -> usize { fn connect(&mut self, node_1: usize, node_2: usize) -> usize {
let id = self.edges.len(); let id = self.edges.len();
// create the edge // create the edge
@ -57,16 +57,16 @@ impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph {
id, id,
SimpleEdge { SimpleEdge {
id: id.clone(), id: id.clone(),
v1: vertex_1, n1: node_1,
v2: vertex_2, n2: node_2,
}, },
); );
// add the edge handle to each vertex // add the edge handle to each vertex
if let Some(v) = self.vertices.get_mut(&vertex_1) { if let Some(v) = self.nodes.get_mut(&node_1) {
v.edges.insert(id); v.edges.insert(id);
} }
if let Some(v) = self.vertices.get_mut(&vertex_2) { if let Some(v) = self.nodes.get_mut(&node_2) {
v.edges.insert(id); v.edges.insert(id);
} }
@ -78,10 +78,10 @@ impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph {
// TODO: handle unhappy path // TODO: handle unhappy path
if let Some(e) = self.edges.remove(&edge) { if let Some(e) = self.edges.remove(&edge) {
// remove the edge handle from each vertex // remove the edge handle from each vertex
if let Some(v) = self.vertices.get_mut(&e.v1) { if let Some(v) = self.nodes.get_mut(&e.n1) {
v.edges.remove(&e.id); v.edges.remove(&e.id);
} }
if let Some(v) = self.vertices.get_mut(&e.v2) { if let Some(v) = self.nodes.get_mut(&e.n2) {
v.edges.remove(&e.id); v.edges.remove(&e.id);
} }
} }
@ -91,39 +91,39 @@ impl<'a> Graph<SimpleVertex, SimpleEdge> for SimpleGraph {
#[test] #[test]
fn simple_connect() { fn simple_connect() {
let mut g = SimpleGraph { let mut g = SimpleGraph {
vertices: HashMap::new(), nodes: HashMap::new(),
edges: HashMap::new(), edges: HashMap::new(),
}; };
let h1 = g.new_vertex(); let h1 = g.new_node();
let h2 = g.new_vertex(); let h2 = g.new_node();
assert_eq!(g.vertices.len(), 2); assert_eq!(g.nodes.len(), 2);
let e = g.connect(h1, h2); let e = g.connect(h1, h2);
assert_eq!(g.edges.len(), 1); assert_eq!(g.edges.len(), 1);
let e = g.edges.get(&e).unwrap(); let e = g.edges.get(&e).unwrap();
assert_eq!(e.id, 0); assert_eq!(e.id, 0);
assert_eq!(e.v1, h1); assert_eq!(e.n1, h1);
assert_eq!(e.v2, h2); assert_eq!(e.n2, h2);
} }
#[test] #[test]
fn simple_disconnect() { fn simple_disconnect() {
let mut g = SimpleGraph { let mut g = SimpleGraph {
vertices: HashMap::new(), nodes: HashMap::new(),
edges: HashMap::new(), edges: HashMap::new(),
}; };
let h1 = g.new_vertex(); let h1 = g.new_node();
let h2 = g.new_vertex(); let h2 = g.new_node();
assert_eq!(g.vertices.len(), 2); assert_eq!(g.nodes.len(), 2);
let e = g.connect(h1, h2); let e = g.connect(h1, h2);
assert_eq!(g.edges.len(), 1); assert_eq!(g.edges.len(), 1);
let e = g.edges.get(&e).unwrap(); let e = g.edges.get(&e).unwrap();
assert_eq!(e.id, 0); assert_eq!(e.id, 0);
assert_eq!(e.v1, h1); assert_eq!(e.n1, h1);
assert_eq!(e.v2, h2); assert_eq!(e.n2, h2);
g.disconnect(e.id); g.disconnect(e.id);
assert_eq!(g.edges.len(), 0); assert_eq!(g.edges.len(), 0);
@ -132,17 +132,17 @@ fn simple_disconnect() {
#[test] #[test]
fn simple_degree() { fn simple_degree() {
let mut g = SimpleGraph { let mut g = SimpleGraph {
vertices: HashMap::new(), nodes: HashMap::new(),
edges: HashMap::new(), edges: HashMap::new(),
}; };
let h1 = g.new_vertex(); let h1 = g.new_node();
let h2 = g.new_vertex(); let h2 = g.new_node();
let h3 = g.new_vertex(); let h3 = g.new_node();
let e1 = g.connect(h1, h2); let e1 = g.connect(h1, h2);
let e2 = g.connect(h1, h3); let e2 = g.connect(h1, h3);
assert_eq!(g.vertices.get(&h1).unwrap().degree(), 2); assert_eq!(g.nodes.get(&h1).unwrap().degree(), 2);
assert_eq!(g.vertices.get(&h2).unwrap().degree(), 1); assert_eq!(g.nodes.get(&h2).unwrap().degree(), 1);
assert_eq!(g.vertices.get(&h3).unwrap().degree(), 1); assert_eq!(g.nodes.get(&h3).unwrap().degree(), 1);
} }