summaryrefslogtreecommitdiff
path: root/rs/src/semiring.rs
blob: 9a8fe3e41db1ddfd5f71d4305916ade241682f47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
pub trait Semiring {
    fn one() -> f64;
    fn null() -> f64;
    fn add(a: f64, b: f64) -> f64;
    fn multiply(a: f64, b: f64) -> f64;
}

pub struct ViterbiSemiring;

impl Semiring for ViterbiSemiring {
    fn one() -> f64 {
        1.0
    }

    fn null() -> f64 {
        0.0
    }

    fn add(a: f64, b: f64) -> f64 {
        a.max(b)
    }

    fn multiply(a: f64, b: f64) -> f64 {
        a * b
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_viterbi() {
        assert_eq!(ViterbiSemiring::one(), 1.0);
        assert_eq!(ViterbiSemiring::null(), 0.0);
        assert_eq!(ViterbiSemiring::add(0.3, 0.7), 0.7);
        assert_eq!(ViterbiSemiring::multiply(0.5, 0.6), 0.3);
    }
}