icentral-sigmas 0.1.0

A Rust library providing efficient management of sigma values for nodes in graph-based data structures. Includes traits for accessing and modifying sigma values, with a focus on performance and precision.
Documentation
crate::ix!();

pub trait GetSigmaValueForNode {

    fn sigma_value_for_node(&self, node: NodeId) -> f64;
}

pub trait SetSigmaValueForNode {

    fn set_sigma_value_for_node(&mut self, node: NodeId, val: f64);
}

pub const SIGMA_ZERO: f64 = 0.0;

#[derive(Clone,Debug)]
pub struct SigmaMap {
    name: String,
    data: MaybeIndexedMap<f64>,
}

impl GetSigmaValueForNode for SigmaMap {

    fn sigma_value_for_node(&self, node: NodeId) -> f64 
    {
        self.data[node]
    }
}

impl SetSigmaValueForNode for SigmaMap {

    fn set_sigma_value_for_node(&mut self, node: NodeId, val: f64) 
    {
        debug!("setting sigma value for node {} to {}", node, val);

        self.data.set(node, val);
    }
}

impl SigmaMap {

    pub fn empty_indexed(name: &str) -> Self {

        debug!("creating new empty_indexed SigmaMap named {}", name);

        Self {
            name: name.to_owned(),
            data: MaybeIndexedMap::empty_indexed()
        }
    }

    pub fn empty_mapped(name: &str) -> Self {

        debug!("creating new empty_mapped SigmaMap named {}", name);

        Self {
            name: name.to_owned(),
            data: MaybeIndexedMap::empty_mapped()
        }
    }

    pub fn new(len: usize, name: &str) -> Self {

        debug!("creating new SigmaMap named {} of len: {}", name, len);

        Self {
            name: name.to_owned(),
            data: MaybeIndexedMap::new(len,SIGMA_ZERO),
        }
    }

    pub fn len(&self) -> usize {
        self.data.len()
    }

    pub fn update(&mut self, 
        v_p:   NodeId, 
        v_n:   NodeId, 
        sp_sn: f64) 
    {
        let t0 = self.data[v_p];
        let t1 = self.data[v_n];

        let val = t0 + t1 * sp_sn;

        debug!(
            "updating sigma value for node {} to {} = {} + {} * {}", 
            v_p, 
            val, 
            t0, 
            t1, 
            sp_sn
        );

        self.data[v_p] = val;
    }

    pub fn ratio(&self, v_p: NodeId, v_n: NodeId) -> f64 
    {
        let ratio = self.data[v_p] / self.data[v_n];

        debug!("computed sigma ratio {} for nodes {} and {}", ratio, v_p, v_n);

        ratio
    }

    pub fn set_node_to_zero(&mut self, node: NodeId) 
    {
        debug!("setting sigma value for node {} to zero", node);

        self.data.set(node, 0.0);
    }

    pub fn fill(&mut self, val: f64) 
    {
        debug!("filling SigmaMap with value: {}", val);

        self.data.fill(val);
    }

    pub fn set_node_to_one(&mut self, node: NodeId) 
    {
        debug!("setting sigma value for node {} to one", node);

        self.data.set(node, 1.0);
    }

    pub fn increment_sigma_value_for_node(&mut self, v_n: NodeId, c_t: f64) 
    {
        debug!("increasing SigmaMap value for node: {} by {}", v_n, c_t);

        self.data[v_n] += c_t;
    }

    pub fn reinit(&mut self, len: usize)
    {
        debug!("refilling SigmaMap to len: {}", len);

        self.data.refill(len, SIGMA_ZERO);
    }
}