#[derive(Clone, PartialEq, Eq, Copy, Debug, Serialize, Deserialize)]
pub enum EdgeType {
Init,
Dict,
Unk,
Pat,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Edge {
pub w: usize,
pub unk: usize,
pub p: usize,
pub etype: EdgeType,
}
impl Edge {
pub fn is_unk(&self) -> bool {
self.etype == EdgeType::Unk
}
pub fn better_than(&self, o: &Edge) -> bool {
if self.etype == EdgeType::Pat && o.etype == EdgeType::Unk {
return true;
}
if self.etype == EdgeType::Unk && o.etype == EdgeType::Pat {
return false;
}
if self.unk < o.unk {
return true;
}
if self.unk > o.unk {
return false;
}
if self.w < o.w {
return true;
}
if self.w > o.w {
return false;
}
if o.is_unk() && !self.is_unk() {
return true;
}
false
}
pub fn better(a: &Option<Edge>, b: &Option<Edge>) -> bool {
match (a, b) {
(None, _) => false,
(_, None) => true,
(Some(edge_a), Some(edge_b)) => edge_a.better_than(edge_b),
}
}
}