rust_fuzzylogic/
aggregate.rs

1// Aggregation utilities for combining rule outputs across consequents.
2
3use crate::{mamdani::Rule, prelude::*, variable::Variable};
4use std::{borrow::Borrow, collections::HashMap, hash::Hash};
5
6/// Combine two membership sample vectors by taking the pointwise maximum.
7pub fn elements_max(data: &mut Vec<Float>, src: &Vec<Float>) {
8    for (d, s) in data.iter_mut().zip(src) {
9        *d = d.max(*s)
10    }
11}
12
13/// Aggregate the contributions of all rules into output membership functions.
14pub fn aggregation<KI, KV>(
15    rules: Vec<Rule>,
16    input: &HashMap<KI, Float>,
17    vars: &HashMap<KV, Variable>,
18    sampler: UniformSampler,
19) -> Result<HashMap<String, Vec<Float>>>
20where
21    KI: Eq + Hash + Borrow<str>,
22    KV: Eq + Hash + Borrow<str>,
23{
24    let mut implicated_map: HashMap<String, Vec<Float>> = HashMap::new();
25    for i in 0..rules.len() {
26        let alpha = rules[i].activation(&input, &vars)?;
27        let implicated = rules[i].implicate(alpha, vars, &sampler)?;
28
29        for (k, v) in implicated {
30            implicated_map
31                .entry(k)
32                .and_modify(|cur| elements_max(cur, &v))
33                .or_insert(v);
34        }
35    }
36
37    return Ok(implicated_map);
38}