cifly 0.1.3

cifly is the Rust core that powers the CIfly declarative framework for efficient causal inference algorithms.
Documentation
pub(crate) struct Array2D<T> {
    data: Vec<T>,
    dim0: usize,
    dim1: usize,
}

impl<T: Clone> Array2D<T> {
    pub(crate) fn new(dim0: usize, dim1: usize, default: T) -> Self {
        let size = dim0 * dim1;
        Self {
            data: vec![default; size],
            dim0,
            dim1,
        }
    }

    fn index(&self, i: usize, j: usize) -> usize {
        debug_assert!(i < self.dim0 && j < self.dim1);
        (i * self.dim1) + j
    }

    pub(crate) fn get(&self, i: usize, j: usize) -> &T {
        &self.data[self.index(i, j)]
    }

    pub(crate) fn get_mut(&mut self, i: usize, j: usize) -> &mut T {
        let idx = self.index(i, j);
        &mut self.data[idx]
    }
}

pub(crate) struct Array3D<T> {
    data: Vec<T>,
    dim0: usize,
    dim1: usize,
    dim2: usize,
}

impl<T: Clone> Array3D<T> {
    pub(crate) fn new(dim0: usize, dim1: usize, dim2: usize, default: T) -> Self {
        let size = dim0 * dim1 * dim2;
        Self {
            data: vec![default; size],
            dim0,
            dim1,
            dim2,
        }
    }

    fn index(&self, i: usize, j: usize, k: usize) -> usize {
        debug_assert!(i < self.dim0 && j < self.dim1 && k < self.dim2);
        ((i * self.dim1 + j) * self.dim2) + k
    }

    pub(crate) fn get(&self, i: usize, j: usize, k: usize) -> &T {
        &self.data[self.index(i, j, k)]
    }

    pub(crate) fn get_mut(&mut self, i: usize, j: usize, k: usize) -> &mut T {
        let idx = self.index(i, j, k);
        &mut self.data[idx]
    }
}

pub(crate) struct Array4D<T> {
    data: Vec<T>,
    dim0: usize,
    dim1: usize,
    dim2: usize,
    dim3: usize,
}

impl<T: Clone> Array4D<T> {
    pub(crate) fn new(dim0: usize, dim1: usize, dim2: usize, dim3: usize, default: T) -> Self {
        let size = dim0 * dim1 * dim2 * dim3;
        Self {
            data: vec![default; size],
            dim0,
            dim1,
            dim2,
            dim3,
        }
    }

    fn index(&self, i: usize, j: usize, k: usize, l: usize) -> usize {
        debug_assert!(i < self.dim0 && j < self.dim1 && k < self.dim2 && l < self.dim3);
        (((i * self.dim1 + j) * self.dim2 + k) * self.dim3) + l
    }

    pub(crate) fn get(&self, i: usize, j: usize, k: usize, l: usize) -> &T {
        &self.data[self.index(i, j, k, l)]
    }

    pub(crate) fn get_mut(&mut self, i: usize, j: usize, k: usize, l: usize) -> &mut T {
        let idx = self.index(i, j, k, l);
        &mut self.data[idx]
    }
}