lattices/
semiring_application.rs
1use crate::{Addition, Multiplication, One, Zero};
4#[derive(PartialEq, Debug)]
5pub struct BinaryTrust(bool);
9
10impl BinaryTrust {
11 pub fn new() -> Self {
13 Self(true)
14 }
15}
16
17impl Default for BinaryTrust {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23impl Addition<BinaryTrust> for BinaryTrust {
25 fn add(&mut self, other: BinaryTrust) {
27 self.0 = self.0 || other.0;
28 }
29}
30
31impl Multiplication<BinaryTrust> for BinaryTrust {
33 fn mul(&mut self, other: BinaryTrust) {
35 self.0 = self.0 && other.0;
36 }
37}
38
39impl Zero<bool> for BinaryTrust {
41 fn zero(&self) -> bool {
43 false
44 }
45}
46
47impl One<bool> for BinaryTrust {
49 fn one(&self) -> bool {
51 true
52 }
53}
54
55pub struct Multiplicity(u32);
57
58impl Multiplicity {
59 pub fn new(value: u32) -> Self {
61 Multiplicity(value)
62 }
63}
64
65impl Addition<Multiplicity> for Multiplicity {
67 fn add(&mut self, other: Multiplicity) {
69 self.0 = self.0.checked_add(other.0).unwrap();
70 }
71}
72
73impl Multiplication<Multiplicity> for Multiplicity {
75 fn mul(&mut self, other: Multiplicity) {
77 self.0 = self.0.checked_mul(other.0).unwrap();
78 }
79}
80
81impl Zero<u32> for Multiplicity {
83 fn zero(&self) -> u32 {
85 0
86 }
87}
88
89impl One<u32> for Multiplicity {
91 fn one(&self) -> u32 {
93 1
94 }
95}
96
97#[derive(Copy, Clone, Debug, PartialEq, Eq)]
98pub enum U32WithInfinity {
100 Infinity,
102 Finite(u32),
104}
105
106pub struct Cost(U32WithInfinity);
108
109impl Cost {
110 pub fn new(value: U32WithInfinity) -> Self {
112 Cost(value)
113 }
114}
115
116impl Addition<Cost> for Cost {
118 fn add(&mut self, other: Cost) {
120 self.0 = match (self.0, other.0) {
121 (U32WithInfinity::Infinity, x) | (x, U32WithInfinity::Infinity) => x,
122 (U32WithInfinity::Finite(a), U32WithInfinity::Finite(b)) => {
123 U32WithInfinity::Finite(a.min(b))
124 }
125 };
126 }
127}
128
129impl Multiplication<Cost> for Cost {
131 fn mul(&mut self, other: Cost) {
133 self.0 = match (self.0, other.0) {
134 (U32WithInfinity::Infinity, _) | (_, U32WithInfinity::Infinity) => {
135 U32WithInfinity::Infinity
136 }
137 (U32WithInfinity::Finite(a), U32WithInfinity::Finite(b)) => {
138 U32WithInfinity::Finite(a + b)
139 }
140 };
141 }
142}
143
144impl Zero<U32WithInfinity> for Cost {
146 fn zero(&self) -> U32WithInfinity {
148 U32WithInfinity::Infinity
149 }
150}
151
152impl One<U32WithInfinity> for Cost {
154 fn one(&self) -> U32WithInfinity {
156 U32WithInfinity::Finite(0)
157 }
158}
159
160pub struct ConfidenceScore(f64);
162
163impl ConfidenceScore {
164 pub fn new(value: f64) -> Self {
166 assert!((0.0..=1.0).contains(&value));
168 ConfidenceScore(value)
169 }
170}
171
172impl Addition<ConfidenceScore> for ConfidenceScore {
174 fn add(&mut self, other: ConfidenceScore) {
176 self.0 = f64::max(self.0, other.0);
177 }
178}
179
180impl Multiplication<ConfidenceScore> for ConfidenceScore {
182 fn mul(&mut self, other: ConfidenceScore) {
184 self.0 *= other.0;
185 }
186}
187
188impl Zero<f64> for ConfidenceScore {
190 fn zero(&self) -> f64 {
192 0.0
193 }
194}
195
196impl One<f64> for ConfidenceScore {
198 fn one(&self) -> f64 {
200 1.0
201 }
202}
203
204pub struct FuzzyLogic(f64);
206
207impl FuzzyLogic {
208 pub fn new(value: f64) -> Self {
210 assert!((0.0..=1.0).contains(&value));
212 FuzzyLogic(value)
213 }
214}
215
216impl Addition<FuzzyLogic> for FuzzyLogic {
218 fn add(&mut self, other: FuzzyLogic) {
220 self.0 = f64::max(self.0, other.0);
221 }
222}
223
224impl Multiplication<FuzzyLogic> for FuzzyLogic {
226 fn mul(&mut self, other: FuzzyLogic) {
228 self.0 = f64::min(self.0, other.0);
229 }
230}
231
232impl Zero<f64> for FuzzyLogic {
234 fn zero(&self) -> f64 {
236 0.0
237 }
238}
239
240impl One<f64> for FuzzyLogic {
242 fn one(&self) -> f64 {
244 1.0
245 }
246}
247
248#[cfg(test)]
249mod test {
250
251 use super::*;
252
253 #[test]
255 fn test_binary_trust() {
256 let mut binary_trust = BinaryTrust::new();
257
258 binary_trust.add(BinaryTrust(true));
260 assert!(binary_trust.0);
261 binary_trust = BinaryTrust::new();
262 binary_trust.add(BinaryTrust(false));
263 assert!(binary_trust.0);
264
265 binary_trust = BinaryTrust::new();
267 binary_trust.mul(BinaryTrust(true));
268 assert!(binary_trust.0);
269 binary_trust = BinaryTrust::new();
270 binary_trust.mul(BinaryTrust(false));
271 assert!(!binary_trust.0);
272
273 assert!(!BinaryTrust(false).zero());
275
276 assert!(BinaryTrust(true).one());
278 }
279
280 #[test]
282 fn test_multiplicity() {
283 let mut multiplicity = Multiplicity::new(5);
284
285 multiplicity.add(Multiplicity(10));
287 assert_eq!(multiplicity.0, 15);
288 multiplicity = Multiplicity::new(5);
289 multiplicity.add(Multiplicity(0));
290 assert_eq!(multiplicity.0, 5);
291
292 multiplicity = Multiplicity::new(5);
294 multiplicity.mul(Multiplicity(10));
295 assert_eq!(multiplicity.0, 50);
296 multiplicity = Multiplicity::new(10);
297 multiplicity.mul(Multiplicity(5));
298 assert_eq!(multiplicity.0, 50);
299 multiplicity = Multiplicity::new(5);
300 multiplicity.mul(Multiplicity(0));
301 assert_eq!(multiplicity.0, 0);
302
303 assert_eq!(multiplicity.zero(), 0);
305
306 assert_eq!(multiplicity.one(), 1);
308 }
309
310 #[test]
312 fn test_cost() {
313 let mut cost = Cost::new(U32WithInfinity::Finite(5));
314
315 cost.add(Cost::new(U32WithInfinity::Finite(10)));
317 assert_eq!(cost.0, U32WithInfinity::Finite(5));
318 cost = Cost::new(U32WithInfinity::Finite(5));
319 cost.add(Cost::new(U32WithInfinity::Infinity));
320 assert_eq!(cost.0, U32WithInfinity::Finite(5));
321 cost = Cost::new(U32WithInfinity::Infinity);
322 cost.add(Cost::new(U32WithInfinity::Finite(5)));
323 assert_eq!(cost.0, U32WithInfinity::Finite(5));
324 cost = Cost::new(U32WithInfinity::Infinity);
325 cost.add(Cost::new(U32WithInfinity::Infinity));
326 assert_eq!(cost.0, U32WithInfinity::Infinity);
327
328 cost = Cost::new(U32WithInfinity::Finite(5));
330 cost.mul(Cost::new(U32WithInfinity::Finite(10)));
331 assert_eq!(cost.0, U32WithInfinity::Finite(15));
332 cost = Cost::new(U32WithInfinity::Finite(5));
333 cost.mul(Cost::new(U32WithInfinity::Infinity));
334 assert_eq!(cost.0, U32WithInfinity::Infinity);
335 cost = Cost::new(U32WithInfinity::Infinity);
336 cost.mul(Cost::new(U32WithInfinity::Finite(5)));
337 assert_eq!(cost.0, U32WithInfinity::Infinity);
338
339 assert_eq!(cost.zero(), U32WithInfinity::Infinity);
341
342 assert_eq!(cost.one(), U32WithInfinity::Finite(0));
344 }
345
346 #[test]
348 fn test_confidence_score() {
349 let mut confidence_score = ConfidenceScore::new(0.5);
350
351 confidence_score.add(ConfidenceScore::new(0.6));
353 assert_eq!(confidence_score.0, 0.6);
354 confidence_score = ConfidenceScore::new(0.5);
355 confidence_score.add(ConfidenceScore::new(0.4));
356 assert_eq!(confidence_score.0, 0.5);
357
358 confidence_score = ConfidenceScore::new(0.5);
360 confidence_score.mul(ConfidenceScore::new(0.6));
361 assert_eq!(confidence_score.0, 0.3);
362 confidence_score = ConfidenceScore::new(0.5);
363 confidence_score.mul(ConfidenceScore::new(0.4));
364 assert_eq!(confidence_score.0, 0.2);
365
366 assert_eq!(confidence_score.zero(), 0.0);
368
369 assert_eq!(confidence_score.one(), 1.0);
371 }
372
373 #[test]
375 fn test_fuzzy_logic() {
376 let mut fuzzy_logic = FuzzyLogic::new(0.5);
377
378 fuzzy_logic.add(FuzzyLogic::new(0.6));
380 assert_eq!(fuzzy_logic.0, 0.6);
381 fuzzy_logic = FuzzyLogic::new(0.5);
382 fuzzy_logic.add(FuzzyLogic::new(0.4));
383 assert_eq!(fuzzy_logic.0, 0.5);
384
385 fuzzy_logic = FuzzyLogic::new(0.5);
387 fuzzy_logic.mul(FuzzyLogic::new(0.6));
388 assert_eq!(fuzzy_logic.0, 0.5);
389 fuzzy_logic = FuzzyLogic::new(0.5);
390 fuzzy_logic.mul(FuzzyLogic::new(0.4));
391 assert_eq!(fuzzy_logic.0, 0.4);
392
393 assert_eq!(fuzzy_logic.zero(), 0.0);
395
396 assert_eq!(fuzzy_logic.one(), 1.0);
398 }
399}