rust_fuzzylogic/
aggregate.rs1use crate::{mamdani::Rule, prelude::*, variable::Variable};
4use std::{borrow::Borrow, collections::HashMap, hash::Hash};
5
6pub 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
13pub fn aggregation<KI, KV>(
15 rules: &[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}