fuzzy_logic_rs/
variables.rs

1use crate::membership_functions::{
2    linear_membership, GetDegree, MembershipFunction, TSKMembershipFunction,
3};
4use crate::membership_ranges::MembershipRange;
5
6#[derive(Debug, Clone)]
7pub struct InputVariable {
8    name: String,
9    range: (f64, f64),
10    mfs: Vec<MembershipFunction>,
11}
12
13impl InputVariable {
14    pub fn new(name: String, range: (f64, f64)) -> Self {
15        Self {
16            name,
17            range,
18            mfs: Vec::new(),
19        }
20    }
21    pub fn add_membership(&mut self, mf: MembershipFunction) {
22        self.mfs.push(mf);
23    }
24
25    pub fn fuzzify(&self, idx: usize, x: f64) -> f64 {
26        self.mfs[idx].get_degree(x)
27    }
28    pub fn membership_function_name(&self, idx: i32) -> String {
29        self.mfs[idx as usize].get_name().clone()
30    }
31    pub fn get_name(&self) -> &String {
32        &self.name
33    }
34
35    pub fn get_range(&self) -> &(f64, f64) {
36        &self.range
37    }
38}
39
40#[derive(Debug)]
41pub struct OutputVariable {
42    name: String,
43    mrs: Vec<MembershipRange>,
44    universe: Vec<f64>,
45}
46
47impl OutputVariable {
48    pub fn new(name: String, range: (f64, f64), n: i32) -> Self {
49        let mut universe = Vec::new();
50        let (start, stop) = range;
51        let delta = (stop - start) / (n as f64);
52        for i in 0..n {
53            universe.push(start + delta * (i as f64))
54        }
55        Self {
56            name,
57            mrs: Vec::new(),
58            universe,
59        }
60    }
61    pub fn add_membership(&mut self, membership_rang: MembershipRange) {
62        self.mrs.push(membership_rang)
63    }
64
65    pub fn get_mu(&self, idx: usize) -> &Vec<f64> {
66        self.mrs[idx].get_mu()
67    }
68
69    pub fn get_universe(&self) -> &Vec<f64> {
70        &self.universe
71    }
72
73    pub fn get_name(&self) -> &String {
74        &self.name
75    }
76
77    pub fn get_universe_by_idx(&self, idx: usize) -> f64 {
78        self.universe[idx].clone()
79    }
80}
81
82#[derive(Debug)]
83pub struct TSKOutputVariable {
84    name: String,
85    mfs: Vec<TSKMembershipFunction>,
86}
87
88impl TSKOutputVariable {
89    pub fn new(name: String) -> Self {
90        Self {
91            name,
92            mfs: Vec::new(),
93        }
94    }
95
96    pub fn add_membership(&mut self, membership: TSKMembershipFunction) {
97        self.mfs.push(membership);
98    }
99
100    pub fn add_constant_membership(&mut self, value: f64) {
101        self.mfs.push(TSKMembershipFunction::Constant(value));
102    }
103
104    pub fn add_linear_membership(&mut self, coefficients: Vec<f64>) {
105        self.mfs.push(TSKMembershipFunction::Linear(coefficients));
106    }
107
108    pub fn get_mu(&self, idx: usize, input_vec: &Vec<f64>) -> f64 {
109        match &self.mfs[idx] {
110            TSKMembershipFunction::Constant(c) => *c,
111            TSKMembershipFunction::Linear(coeff) => linear_membership(&coeff, input_vec),
112            TSKMembershipFunction::Custom(fun) => fun(input_vec),
113        }
114    }
115
116    pub fn get_name(&self) -> &String {
117        &self.name
118    }
119}