1#[derive(Clone, PartialEq, Eq, Copy, Debug, Serialize, Deserialize)]
2pub enum EdgeType {
3 Init,
4 Dict,
5 Unk,
6 Pat,
7}
8
9#[derive(Clone, Copy, Debug, PartialEq)]
10pub struct Edge {
11 pub w: usize,
12 pub unk: usize,
13 pub p: usize,
14 pub etype: EdgeType,
15}
16
17impl Edge {
18 pub fn is_unk(&self) -> bool {
19 self.etype == EdgeType::Unk
20 }
21
22 pub fn better_than(&self, o: &Edge) -> bool {
23 if self.etype == EdgeType::Pat && o.etype == EdgeType::Unk {
24 return true;
25 }
26
27 if self.etype == EdgeType::Unk && o.etype == EdgeType::Pat {
28 return false;
29 }
30 if self.unk < o.unk {
31 return true;
32 }
33
34 if self.unk > o.unk {
35 return false;
36 }
37
38 if self.w < o.w {
39 return true;
40 }
41
42 if self.w > o.w {
43 return false;
44 }
45
46 if o.is_unk() && !self.is_unk() {
47 return true;
48 }
49
50 false
51 }
52
53 pub fn better(a: &Option<Edge>, b: &Option<Edge>) -> bool {
54 if a.is_none() {
55 return false;
56 }
57
58 if b.is_none() {
59 return true;
60 }
61
62 a.unwrap().better_than(&b.unwrap())
63 }
64}