fuzzy_logic_rs/
variables.rs1use 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}