poulpy-hal 0.6.0

A crate providing layouts and a trait-based hardware acceleration layer with open extension points, matching the API and types of spqlios-arithmetic.
Documentation
use crate::{
    api::{
        VecZnxBigAddAssign, VecZnxBigAddInto, VecZnxBigAddNormal, VecZnxBigAddNormalBackend, VecZnxBigAddSmallAssign,
        VecZnxBigAddSmallIntoBackend, VecZnxBigAlloc, VecZnxBigAutomorphism, VecZnxBigAutomorphismAssign,
        VecZnxBigAutomorphismAssignTmpBytes, VecZnxBigBytesOf, VecZnxBigFromBytes, VecZnxBigFromSmallBackend,
        VecZnxBigInnerSumBackend, VecZnxBigNegate, VecZnxBigNegateAssign, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes,
        VecZnxBigSub, VecZnxBigSubAssign, VecZnxBigSubNegateAssign, VecZnxBigSubSmallABackend, VecZnxBigSubSmallAssign,
        VecZnxBigSubSmallBBackend, VecZnxBigSubSmallNegateAssign, VecZnxScalarProduct,
    },
    layouts::{
        Backend, Module, NoiseInfos, ScalarZnxBackendRef, ScratchArena, VecZnxBackendMut, VecZnxBackendRef, VecZnxBig,
        VecZnxBigBackendMut, VecZnxBigBackendRef, VecZnxBigOwned,
    },
    oep::HalVecZnxBigImpl,
    source::Source,
};

macro_rules! impl_vec_znx_big_delegate {
    ($trait:ty, $($body:item)+) => {
        impl<B> $trait for Module<B>
        where
            B: Backend + HalVecZnxBigImpl<B>,
        {
            $($body)+
        }
    };
}

impl_vec_znx_big_delegate!(
    VecZnxBigFromSmallBackend<B>,
    fn vec_znx_big_from_small_backend(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_from_small_backend(res, res_col, a, a_col);
    }
);

impl<B: Backend> VecZnxBigAlloc<B> for Module<B> {
    fn vec_znx_big_alloc(&self, cols: usize, size: usize) -> VecZnxBigOwned<B> {
        self.vec_znx_big_alloc_n(self.n(), cols, size)
    }

    fn vec_znx_big_alloc_n(&self, n: usize, cols: usize, size: usize) -> VecZnxBigOwned<B> {
        VecZnxBigOwned::alloc(n, cols, size)
    }
}

impl<B: Backend> VecZnxBigFromBytes<B> for Module<B> {
    fn vec_znx_big_from_bytes(&self, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxBigOwned<B> {
        self.vec_znx_big_from_bytes_n(self.n(), cols, size, bytes)
    }

    fn vec_znx_big_from_bytes_n(&self, n: usize, cols: usize, size: usize, bytes: Vec<u8>) -> VecZnxBigOwned<B> {
        VecZnxBig::<B::OwnedBuf, B>::from_bytes(n, cols, size, bytes)
    }
}

impl<B: Backend> VecZnxBigBytesOf for Module<B> {
    fn bytes_of_vec_znx_big(&self, cols: usize, size: usize) -> usize {
        self.bytes_of_vec_znx_big_n(self.n(), cols, size)
    }

    fn bytes_of_vec_znx_big_n(&self, n: usize, cols: usize, size: usize) -> usize {
        B::bytes_of_vec_znx_big(n, cols, size)
    }
}

impl_vec_znx_big_delegate!(
    VecZnxBigAddNormal<B>,
    fn vec_znx_big_add_normal(
        &self,
        base2k: usize,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        noise_infos: NoiseInfos,
        source: &mut Source,
    ) {
        B::vec_znx_big_add_normal_backend(self, base2k, res, res_col, noise_infos, source.new_seed());
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAddNormalBackend<B>,
    fn vec_znx_big_add_normal_backend(
        &self,
        base2k: usize,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        noise_infos: NoiseInfos,
        seed: [u8; 32],
    ) {
        B::vec_znx_big_add_normal_backend(self, base2k, res, res_col, noise_infos, seed);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAddInto<B>,
    fn vec_znx_big_add_into(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
        b: &VecZnxBigBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_big_add_into(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAddAssign<B>,
    fn vec_znx_big_add_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_add_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAddSmallIntoBackend<B>,
    fn vec_znx_big_add_small_into_backend(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
        b: &VecZnxBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_big_add_small_into_backend(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAddSmallAssign<B>,
    fn vec_znx_big_add_small_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_add_small_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSub<B>,
    fn vec_znx_big_sub(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
        b: &VecZnxBigBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_big_sub(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubAssign<B>,
    fn vec_znx_big_sub_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_sub_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubNegateAssign<B>,
    fn vec_znx_big_sub_negate_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_sub_negate_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubSmallABackend<B>,
    fn vec_znx_big_sub_small_a_backend(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
        b: &VecZnxBigBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_big_sub_small_a_backend(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubSmallAssign<B>,
    fn vec_znx_big_sub_small_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_sub_small_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubSmallBBackend<B>,
    fn vec_znx_big_sub_small_b_backend(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
        b: &VecZnxBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_big_sub_small_b_backend(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigSubSmallNegateAssign<B>,
    fn vec_znx_big_sub_small_negate_assign(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_sub_small_negate_assign(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigInnerSumBackend<B>,
    fn vec_znx_big_inner_sum_backend(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        res_coeff: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_inner_sum_backend(self, res, res_col, res_coeff, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxScalarProduct<B>,
    fn vec_znx_scalar_product(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBackendRef<'_, B>,
        a_col: usize,
        b: &ScalarZnxBackendRef<'_, B>,
        b_col: usize,
    ) {
        B::vec_znx_scalar_product(self, res, res_col, a, a_col, b, b_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigNegate<B>,
    fn vec_znx_big_negate(
        &self,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_negate(self, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigNegateAssign<B>,
    fn vec_znx_big_negate_assign(&self, a: &mut VecZnxBigBackendMut<'_, B>, a_col: usize) {
        B::vec_znx_big_negate_assign(self, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigNormalizeTmpBytes,
    fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
        B::vec_znx_big_normalize_tmp_bytes(self)
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigNormalize<B>,
    fn vec_znx_big_normalize(
        &self,
        res: &mut VecZnxBackendMut<'_, B>,
        res_base2k: usize,
        res_offset: i64,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_base2k: usize,
        a_col: usize,
        scratch: &mut ScratchArena<'_, B>,
    ) {
        B::vec_znx_big_normalize(self, res, res_base2k, res_offset, res_col, a, a_base2k, a_col, scratch)
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAutomorphism<B>,
    fn vec_znx_big_automorphism(
        &self,
        k: i64,
        res: &mut VecZnxBigBackendMut<'_, B>,
        res_col: usize,
        a: &VecZnxBigBackendRef<'_, B>,
        a_col: usize,
    ) {
        B::vec_znx_big_automorphism(self, k, res, res_col, a, a_col);
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAutomorphismAssignTmpBytes,
    fn vec_znx_big_automorphism_assign_tmp_bytes(&self) -> usize {
        B::vec_znx_big_automorphism_assign_tmp_bytes(self)
    }
);

impl_vec_znx_big_delegate!(
    VecZnxBigAutomorphismAssign<B>,
    fn vec_znx_big_automorphism_assign(
        &self,
        k: i64,
        a: &mut VecZnxBigBackendMut<'_, B>,
        a_col: usize,
        scratch: &mut ScratchArena<'_, B>,
    ) {
        B::vec_znx_big_automorphism_assign(self, k, a, a_col, scratch)
    }
);