summaryrefslogtreecommitdiff
path: root/rs/src/semiring.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rs/src/semiring.rs')
-rw-r--r--rs/src/semiring.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/rs/src/semiring.rs b/rs/src/semiring.rs
new file mode 100644
index 0000000..9a8fe3e
--- /dev/null
+++ b/rs/src/semiring.rs
@@ -0,0 +1,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);
+ }
+}