diff options
Diffstat (limited to 'semiring/src/counting.rs')
-rw-r--r-- | semiring/src/counting.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/semiring/src/counting.rs b/semiring/src/counting.rs new file mode 100644 index 0000000..9095888 --- /dev/null +++ b/semiring/src/counting.rs @@ -0,0 +1,43 @@ +//! This module implements the "counting semiring", which counts the +//! number of ways a sentence can be derived by a grammar. + +use super::*; + +/// The counting semiring is a thin wrapper around the natural numbers +/// with the usual addition and multiplication. +#[derive(Copy, Clone, Debug, Ord, PartialOrd, Hash, Eq, PartialEq)] +pub struct Count(usize); + +impl Count { + /// Wrap the count in the wrapper. + pub fn new(count: usize) -> Self { + Self(count) + } + + /// Extract the count out. + pub fn value(&self) -> usize { + self.0 + } +} + +impl Semiring for Count { + fn zero() -> Self { + Self::new(0) + } + + fn one() -> Self { + Self::new(1) + } + + fn add(&mut self, other: &Self) { + self.0 = self.value() + other.value(); + } + + fn mul(&mut self, other: &Self) { + self.0 = self.value() * other.value(); + } + + fn valuation(_pos: usize, _grammar: &Grammar) -> Self { + Self::new(1) + } +} |