use itertools::Itertools;
use crate::{
models::{DiGraph, Graph},
set,
types::Result,
};
pub trait VStructures {
fn v_structures(&self) -> Result<Vec<(usize, usize, usize)>>;
}
impl VStructures for DiGraph {
fn v_structures(&self) -> Result<Vec<(usize, usize, usize)>> {
let mut v_structs = Vec::new();
for &z in &self.vertices() {
let pa_z = self.parents(&set![z])?;
if pa_z.len() >= 2 {
for x_y in pa_z.iter().copied().combinations(2) {
let (x, y) = (x_y[0], x_y[1]);
if !self.has_edge(x, y)? && !self.has_edge(y, x)? {
v_structs.push((x, z, y));
}
}
}
}
Ok(v_structs)
}
}