poulpy-cpu-ref 0.6.0

Portable reference CPU implementations of poulpy-hal open extension points
Documentation
use poulpy_hal::{
    api::{VecZnxDftApply, VecZnxDftZero, VmpApplyDftToDft},
    layouts::{
        Backend, Module, NoiseInfos, VecZnxBackendMut, VecZnxBackendRef, VecZnxDftToBackendMut, VecZnxDftToBackendRef, ZnxInfos,
    },
    oep::{HalConvolutionImpl, HalModuleImpl, HalSvpImpl, HalVecZnxBigImpl, HalVecZnxDftImpl, HalVecZnxImpl, HalVmpImpl},
};

use crate::{
    FFT64Ref,
    hal_defaults::{
        FFT64ConvolutionDefault, FFT64ModuleDefault, FFT64SvpDefault, FFT64VecZnxBigDefault, FFT64VecZnxDftDefault,
        FFT64VmpDefault, HalVecZnxDefault, ScalarBigHadamardProduct,
    },
    reference::{
        fft64::{
            convolution::I64Ops,
            reim::{ReimArith, ReimFFTExecute, ReimFFTTable, ReimIFFTTable},
            reim4::{Reim4BlkMatVec, Reim4Convolution},
        },
        znx::{
            ZnxAdd, ZnxAddAssign, ZnxAutomorphism, ZnxCopy, ZnxExtractDigitAddMul, ZnxMulAddPowerOfTwo, ZnxMulPowerOfTwo,
            ZnxMulPowerOfTwoAssign, ZnxNegate, ZnxNegateAssign, ZnxNormalizeDigit, ZnxNormalizeFinalStep,
            ZnxNormalizeFinalStepAssign, ZnxNormalizeFinalStepSub, ZnxNormalizeFirstStep, ZnxNormalizeFirstStepAssign,
            ZnxNormalizeFirstStepCarryOnly, ZnxNormalizeMiddleStep, ZnxNormalizeMiddleStepAssign,
            ZnxNormalizeMiddleStepCarryOnly, ZnxNormalizeMiddleStepSub, ZnxRotate, ZnxSub, ZnxSubAssign, ZnxSubNegateAssign,
            ZnxSwitchRing, ZnxZero,
        },
    },
};

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub(crate) struct DelegatingFFT64Ref;

poulpy_hal::impl_backend_from!(DelegatingFFT64Ref, FFT64Ref);

macro_rules! impl_forward_znx_trait {
    ($trait_name:ident, $method:ident($($arg:ident : $ty:ty),*)) => {
        impl $trait_name for DelegatingFFT64Ref {
            #[inline(always)]
            fn $method($($arg : $ty),*) {
                <FFT64Ref as $trait_name>::$method($($arg),*)
            }
        }
    };
}

macro_rules! impl_forward_znx_const_trait {
    ($trait_name:ident, $method:ident($($arg:ident : $ty:ty),*)) => {
        impl $trait_name for DelegatingFFT64Ref {
            #[inline(always)]
            fn $method<const OVERWRITE: bool>($($arg : $ty),*) {
                <FFT64Ref as $trait_name>::$method::<OVERWRITE>($($arg),*)
            }
        }
    };
}

impl_forward_znx_trait!(ZnxAdd, znx_add(res: &mut [i64], a: &[i64], b: &[i64]));
impl_forward_znx_trait!(ZnxAddAssign, znx_add_assign(res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxSub, znx_sub(res: &mut [i64], a: &[i64], b: &[i64]));
impl_forward_znx_trait!(ZnxSubAssign, znx_sub_assign(res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxSubNegateAssign, znx_sub_negate_assign(res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxMulAddPowerOfTwo, znx_muladd_power_of_two(k: i64, res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxMulPowerOfTwo, znx_mul_power_of_two(k: i64, res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxMulPowerOfTwoAssign, znx_mul_power_of_two_assign(k: i64, res: &mut [i64]));
impl_forward_znx_trait!(ZnxAutomorphism, znx_automorphism(p: i64, res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxCopy, znx_copy(res: &mut [i64], a: &[i64]));
impl_forward_znx_trait!(ZnxNegate, znx_negate(res: &mut [i64], src: &[i64]));
impl_forward_znx_trait!(ZnxNegateAssign, znx_negate_assign(res: &mut [i64]));
impl_forward_znx_trait!(ZnxRotate, znx_rotate(p: i64, res: &mut [i64], src: &[i64]));
impl_forward_znx_trait!(ZnxZero, znx_zero(res: &mut [i64]));
impl_forward_znx_trait!(ZnxSwitchRing, znx_switch_ring(res: &mut [i64], a: &[i64]));
impl_forward_znx_const_trait!(
    ZnxNormalizeFirstStep,
    znx_normalize_first_step(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64])
);
impl_forward_znx_const_trait!(
    ZnxNormalizeMiddleStep,
    znx_normalize_middle_step(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64])
);
impl_forward_znx_const_trait!(
    ZnxNormalizeFinalStep,
    znx_normalize_final_step(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeFirstStepCarryOnly,
    znx_normalize_first_step_carry_only(base2k: usize, lsh: usize, x: &[i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeFirstStepAssign,
    znx_normalize_first_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeMiddleStepCarryOnly,
    znx_normalize_middle_step_carry_only(base2k: usize, lsh: usize, x: &[i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeMiddleStepAssign,
    znx_normalize_middle_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeMiddleStepSub,
    znx_normalize_middle_step_sub(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeFinalStepSub,
    znx_normalize_final_step_sub(base2k: usize, lsh: usize, x: &mut [i64], a: &[i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxNormalizeFinalStepAssign,
    znx_normalize_final_step_assign(base2k: usize, lsh: usize, x: &mut [i64], carry: &mut [i64])
);
impl_forward_znx_trait!(
    ZnxExtractDigitAddMul,
    znx_extract_digit_addmul(base2k: usize, lsh: usize, res: &mut [i64], src: &mut [i64])
);
impl_forward_znx_trait!(ZnxNormalizeDigit, znx_normalize_digit(base2k: usize, res: &mut [i64], src: &mut [i64]));

impl ReimFFTExecute<ReimFFTTable<f64>, f64> for DelegatingFFT64Ref {
    #[inline(always)]
    fn reim_dft_execute(table: &ReimFFTTable<f64>, data: &mut [f64]) {
        <FFT64Ref as ReimFFTExecute<ReimFFTTable<f64>, f64>>::reim_dft_execute(table, data)
    }
}

impl ReimFFTExecute<ReimIFFTTable<f64>, f64> for DelegatingFFT64Ref {
    #[inline(always)]
    fn reim_dft_execute(table: &ReimIFFTTable<f64>, data: &mut [f64]) {
        <FFT64Ref as ReimFFTExecute<ReimIFFTTable<f64>, f64>>::reim_dft_execute(table, data)
    }
}

impl ReimArith for DelegatingFFT64Ref {}
impl Reim4BlkMatVec for DelegatingFFT64Ref {}
impl Reim4Convolution for DelegatingFFT64Ref {}
impl I64Ops for DelegatingFFT64Ref {}
impl ScalarBigHadamardProduct for DelegatingFFT64Ref {
    #[inline(always)]
    fn scalar_big_hadamard_product(res: &mut [i64], a: &[i64], b: &[i64]) {
        Self::i64_hadamard_product(res, a, b)
    }
}

unsafe impl HalVecZnxImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_vec_znx!();
}

unsafe impl HalModuleImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_module!(FFT64ModuleDefault);
}

unsafe impl HalVmpImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_vmp!(FFT64VmpDefault);
}

unsafe impl HalConvolutionImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_convolution!(FFT64ConvolutionDefault);
}

unsafe impl HalVecZnxBigImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_vec_znx_big!(FFT64VecZnxBigDefault);
}

unsafe impl HalSvpImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_svp!(FFT64SvpDefault);
}

unsafe impl HalVecZnxDftImpl<DelegatingFFT64Ref> for DelegatingFFT64Ref {
    crate::hal_impl_vec_znx_dft!(FFT64VecZnxDftDefault);
}