fuzzy-logic_rs 0.5.0

An implementation of fuzzy logic in rust!
Documentation
use crate::membership_functions::{
    linear_membership, GetDegree, MembershipFunction, TSKMembershipFunction,
};
use crate::membership_ranges::MembershipRange;

#[derive(Debug, Clone)]
pub struct InputVariable {
    name: String,
    range: (f64, f64),
    mfs: Vec<MembershipFunction>,
}

impl InputVariable {
    pub fn new(name: String, range: (f64, f64)) -> Self {
        Self {
            name,
            range,
            mfs: Vec::new(),
        }
    }
    pub fn add_membership(&mut self, mf: MembershipFunction) {
        self.mfs.push(mf);
    }

    pub fn fuzzify(&self, idx: usize, x: f64) -> f64 {
        self.mfs[idx].get_degree(x)
    }
    pub fn membership_function_name(&self, idx: i32) -> String {
        self.mfs[idx as usize].get_name().clone()
    }
    pub fn get_name(&self) -> &String {
        &self.name
    }

    pub fn get_range(&self) -> &(f64, f64) {
        &self.range
    }
}

#[derive(Debug)]
pub struct OutputVariable {
    name: String,
    mrs: Vec<MembershipRange>,
    universe: Vec<f64>,
}

impl OutputVariable {
    pub fn new(name: String, range: (f64, f64), n: i32) -> Self {
        let mut universe = Vec::new();
        let (start, stop) = range;
        let delta = (stop - start) / (n as f64);
        for i in 0..n {
            universe.push(start + delta * (i as f64))
        }
        Self {
            name,
            mrs: Vec::new(),
            universe,
        }
    }
    pub fn add_membership(&mut self, membership_rang: MembershipRange) {
        self.mrs.push(membership_rang)
    }

    pub fn get_mu(&self, idx: usize) -> &Vec<f64> {
        self.mrs[idx].get_mu()
    }

    pub fn get_universe(&self) -> &Vec<f64> {
        &self.universe
    }

    pub fn get_name(&self) -> &String {
        &self.name
    }

    pub fn get_universe_by_idx(&self, idx: usize) -> f64 {
        self.universe[idx].clone()
    }
}

#[derive(Debug)]
pub struct TSKOutputVariable {
    name: String,
    mfs: Vec<TSKMembershipFunction>,
}

impl TSKOutputVariable {
    pub fn new(name: String) -> Self {
        Self {
            name,
            mfs: Vec::new(),
        }
    }

    pub fn add_membership(&mut self, membership: TSKMembershipFunction) {
        self.mfs.push(membership);
    }

    pub fn add_constant_membership(&mut self, value: f64) {
        self.mfs.push(TSKMembershipFunction::Constant(value));
    }

    pub fn add_linear_membership(&mut self, coefficients: Vec<f64>) {
        self.mfs.push(TSKMembershipFunction::Linear(coefficients));
    }

    pub fn get_mu(&self, idx: usize, input_vec: &Vec<f64>) -> f64 {
        match &self.mfs[idx] {
            TSKMembershipFunction::Constant(c) => *c,
            TSKMembershipFunction::Linear(coeff) => linear_membership(&coeff, input_vec),
            TSKMembershipFunction::Custom(fun) => fun(input_vec),
        }
    }

    pub fn get_name(&self) -> &String {
        &self.name
    }
}