use petgraph::graph::{NodeIndex, EdgeIndex};
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct Morphism {
pub node_map: HashMap<NodeIndex, NodeIndex>,
pub edge_map: HashMap<EdgeIndex, EdgeIndex>,
}
impl Morphism {
pub fn new() -> Self {
Morphism {
node_map: HashMap::new(),
edge_map: HashMap::new(),
}
}
pub fn insert_node(&mut self, src: NodeIndex, dst: NodeIndex) {
self.node_map.insert(src, dst);
}
pub fn insert_edge(&mut self, src: EdgeIndex, dst: EdgeIndex) {
self.edge_map.insert(src, dst);
}
pub fn map_node(&self, src: &NodeIndex) -> Option<&NodeIndex> {
self.node_map.get(src)
}
pub fn map_edge(&self, src: &EdgeIndex) -> Option<&EdgeIndex> {
self.edge_map.get(src)
}
pub fn compose(&self, other: &Morphism) -> Morphism {
let mut composed = Morphism::new();
for (&s, &m) in &other.node_map {
if let Some(&t) = self.node_map.get(&m) {
composed.node_map.insert(s, t);
}
}
for (&s_e, &m_e) in &other.edge_map {
if let Some(&t_e) = self.edge_map.get(&m_e) {
composed.edge_map.insert(s_e, t_e);
}
}
composed
}
pub fn invert(&self) -> Morphism {
let mut inv = Morphism::new();
for (&s, &t) in &self.node_map {
inv.node_map.insert(t, s);
}
for (&s_e, &t_e) in &self.edge_map {
inv.edge_map.insert(t_e, s_e);
}
inv
}
}