// ---------------------------------------------------------------- // IMPORTS // ---------------------------------------------------------------- // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CLASS Graph // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** A data structure for graphs */ pub struct Graph { pub nodes: Vec, pub edges: Vec<(T,T)>, #[allow(dead_code)] string: String, } impl Graph where T: PartialEq + Clone + ToString { /// Creates new typed instance of stack. pub fn new(nodes: Vec, edges: Vec<(T,T)>) -> Graph { return Graph { nodes: nodes, edges: edges, string: String::from(""), }; } /// @returns number of elements in stack. #[allow(dead_code)] pub fn len(self: &Self) -> usize { return self.nodes.len(); } /// @returns graph induced by subset of nodes #[allow(dead_code)] pub fn subgraph(self: Self, nodes: Vec) -> Graph { let nodes_ = self.nodes .iter() .filter(|&u| (nodes.contains(u))) .map(|u| u.clone()) .collect::>(); let edges_ = self.edges .iter() .filter(|&(u, v)| (nodes.contains(u) && nodes.contains(v))) .map(|(u, v)| (u.clone(), v.clone())) .collect::>(); return Graph::new(nodes_, edges_); } /// @returns all successor nodes of a particular node pub fn successors(self: &Self, u: &T) -> Vec { return self.edges .iter() .filter(|&(u_, _)| (*u_ == *u)) .map(|(_, v)| (v.clone())) .collect::>(); } /// @returns all predecessors nodes of a particular node #[allow(dead_code)] pub fn predecessors(self: &Self, v: &T) -> Vec { return self.edges .iter() .filter(|&(_, v_)| (*v_ == *v)) .map(|(u, _)| (u.clone())) .collect::>(); } }