poulpy-cpu-ref 0.6.0

Portable reference CPU implementations of poulpy-hal open extension points
Documentation
use crate::{
    layouts::{Backend, HostDataMut, HostDataRef, VecZnxBackendMut, VecZnxBackendRef, ZnxView, ZnxViewMut},
    reference::znx::{ZnxCopy, ZnxZero},
};

pub fn vec_znx_copy<'r, 'a, BE>(res: &mut VecZnxBackendMut<'r, BE>, res_col: usize, a: &VecZnxBackendRef<'a, BE>, a_col: usize)
where
    BE: Backend + ZnxCopy + ZnxZero,
    BE::BufMut<'r>: HostDataMut,
    BE::BufRef<'a>: HostDataRef,
{
    #[cfg(debug_assertions)]
    {
        assert_eq!(res.n(), a.n())
    }

    let res_size = res.size();
    let a_size = a.size();

    let min_size = res_size.min(a_size);

    for j in 0..min_size {
        BE::znx_copy(res.at_mut(res_col, j), a.at(a_col, j));
    }

    for j in min_size..res_size {
        BE::znx_zero(res.at_mut(res_col, j));
    }
}

pub fn vec_znx_extract_coeff<'r, 'a, BE>(
    res: &mut VecZnxBackendMut<'r, BE>,
    res_col: usize,
    a: &VecZnxBackendRef<'a, BE>,
    a_col: usize,
    a_coeff: usize,
) where
    BE: Backend,
    BE::BufMut<'r>: HostDataMut,
    BE::BufRef<'a>: HostDataRef,
{
    #[cfg(debug_assertions)]
    {
        assert_eq!(
            res.n(),
            1,
            "vec_znx_extract_coeff expects a 1-coeff destination, got {}",
            res.n()
        );
        assert!(a_coeff < a.n(), "a_coeff: {a_coeff} >= a.n(): {}", a.n());
    }

    let min_size = res.size().min(a.size());

    for limb in 0..min_size {
        let dst = res.at_mut(res_col, limb);
        dst.fill(0);
        dst[0] = a.at(a_col, limb)[a_coeff];
    }

    for limb in min_size..res.size() {
        res.at_mut(res_col, limb).fill(0);
    }
}

#[allow(clippy::too_many_arguments)]
pub fn vec_znx_copy_range<'r, 'a, BE>(
    res: &mut VecZnxBackendMut<'r, BE>,
    res_col: usize,
    res_limb: usize,
    res_offset: usize,
    a: &VecZnxBackendRef<'a, BE>,
    a_col: usize,
    a_limb: usize,
    a_offset: usize,
    len: usize,
) where
    BE: Backend + ZnxCopy,
    BE::BufMut<'r>: HostDataMut,
    BE::BufRef<'a>: HostDataRef,
{
    assert!(res_offset + len <= res.n());
    assert!(a_offset + len <= a.n());

    BE::znx_copy(
        &mut res.at_mut(res_col, res_limb)[res_offset..res_offset + len],
        &a.at(a_col, a_limb)[a_offset..a_offset + len],
    );
}