arnaucube
arnaucube/poulpyPublic Self-hosted repository
Merge branch 'dev-phantom_features'
Pro7ech jeanphilippe.bossuat@gmail.com
Fri, 07 Nov 2025 08:49:41 +0100
commit

c99bc86120640a74e39231c144afd91fe8d3bfc4

parent

c32db7d9637bead4d71f25c983175038e4c3b7ba

M poulpy-backend/src/cpu_fft64_avx/vmp.rs → poulpy-backend/src/cpu_fft64_avx/vmp.rs

@@ -6,10 +6,11 @@ VmpPMatToMut, VmpPMatToRef, ZnxInfos,

}, oep::{ VmpApplyDftToDftAddImpl, VmpApplyDftToDftAddTmpBytesImpl, VmpApplyDftToDftImpl, VmpApplyDftToDftTmpBytesImpl, - VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, + VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, VmpZeroImpl, }, reference::fft64::vmp::{ vmp_apply_dft_to_dft, vmp_apply_dft_to_dft_add, vmp_apply_dft_to_dft_tmp_bytes, vmp_prepare, vmp_prepare_tmp_bytes, + vmp_zero, }, };

@@ -141,3 +142,12 @@ ) -> usize {

vmp_apply_dft_to_dft_tmp_bytes(a_size, b_rows, b_cols_in) } } + +unsafe impl VmpZeroImpl<Self> for FFT64Avx { + fn vmp_zero_impl<R>(_module: &Module<Self>, res: &mut R) + where + R: VmpPMatToMut<Self>, + { + vmp_zero(res); + } +}
M poulpy-backend/src/cpu_fft64_ref/vmp.rs → poulpy-backend/src/cpu_fft64_ref/vmp.rs

@@ -6,10 +6,11 @@ VmpPMatToMut, VmpPMatToRef, ZnxInfos,

}, oep::{ VmpApplyDftToDftAddImpl, VmpApplyDftToDftAddTmpBytesImpl, VmpApplyDftToDftImpl, VmpApplyDftToDftTmpBytesImpl, - VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, + VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, VmpZeroImpl, }, reference::fft64::vmp::{ vmp_apply_dft_to_dft, vmp_apply_dft_to_dft_add, vmp_apply_dft_to_dft_tmp_bytes, vmp_prepare, vmp_prepare_tmp_bytes, + vmp_zero, }, };

@@ -141,3 +142,12 @@ ) -> usize {

vmp_apply_dft_to_dft_tmp_bytes(a_size, b_rows, b_cols_in) } } + +unsafe impl VmpZeroImpl<Self> for FFT64Ref { + fn vmp_zero_impl<R>(_module: &Module<Self>, res: &mut R) + where + R: VmpPMatToMut<Self>, + { + vmp_zero(res); + } +}
M poulpy-backend/src/cpu_spqlios/fft64/vmp_pmat.rs → poulpy-backend/src/cpu_spqlios/fft64/vmp_pmat.rs

@@ -6,8 +6,9 @@ VmpPMatToMut, VmpPMatToRef, ZnxInfos, ZnxView, ZnxViewMut,

}, oep::{ VmpApplyDftToDftAddImpl, VmpApplyDftToDftAddTmpBytesImpl, VmpApplyDftToDftImpl, VmpApplyDftToDftTmpBytesImpl, - VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPMatFromBytesImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, + VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPMatFromBytesImpl, VmpPrepareImpl, VmpPrepareTmpBytesImpl, VmpZeroImpl, }, + reference::fft64::vmp::vmp_zero, }; use crate::cpu_spqlios::{

@@ -269,3 +270,12 @@ )

} } } + +unsafe impl VmpZeroImpl<Self> for FFT64Spqlios { + fn vmp_zero_impl<R>(_module: &Module<Self>, res: &mut R) + where + R: VmpPMatToMut<Self>, + { + vmp_zero(res); + } +}
M poulpy-core/src/layouts/prepared/ggsw.rs → poulpy-core/src/layouts/prepared/ggsw.rs

@@ -1,5 +1,5 @@

use poulpy_hal::{ - api::{VmpPMatAlloc, VmpPMatBytesOf, VmpPrepare, VmpPrepareTmpBytes}, + api::{VmpPMatAlloc, VmpPMatBytesOf, VmpPrepare, VmpPrepareTmpBytes, VmpZero}, layouts::{Backend, Data, DataMut, DataRef, Module, Scratch, VmpPMat, VmpPMatToMut, VmpPMatToRef, ZnxInfos}, };

@@ -51,7 +51,7 @@ }

pub trait GGSWPreparedFactory<B: Backend> where - Self: GetDegree + VmpPMatAlloc<B> + VmpPMatBytesOf + VmpPrepareTmpBytes + VmpPrepare<B>, + Self: GetDegree + VmpPMatAlloc<B> + VmpPMatBytesOf + VmpPrepareTmpBytes + VmpPrepare<B> + VmpZero<B>, { fn alloc_ggsw_prepared( &self,

@@ -163,7 +163,7 @@ }

} impl<B: Backend> GGSWPreparedFactory<B> for Module<B> where - Self: GetDegree + VmpPMatAlloc<B> + VmpPMatBytesOf + VmpPrepareTmpBytes + VmpPrepare<B> + Self: GetDegree + VmpPMatAlloc<B> + VmpPMatBytesOf + VmpPrepareTmpBytes + VmpPrepare<B> + VmpZero<B> { }

@@ -222,6 +222,13 @@ O: GGSWToRef,

M: GGSWPreparedFactory<B>, { module.ggsw_prepare(self, other, scratch); + } + + pub fn zero<M>(&mut self, module: &M) + where + M: GGSWPreparedFactory<B>, + { + module.vmp_zero(&mut self.data); } }
M poulpy-core/src/scratch.rs → poulpy-core/src/scratch.rs

@@ -155,11 +155,7 @@ scratch,

) } - fn take_ggsw_slice<A>( - &mut self, - size: usize, - infos: &A, - ) -> (Vec<GGSW<&mut [u8]>>, &mut Self) + fn take_ggsw_slice<A>(&mut self, size: usize, infos: &A) -> (Vec<GGSW<&mut [u8]>>, &mut Self) where A: GGSWInfos, {
M poulpy-hal/src/api/vmp_pmat.rs → poulpy-hal/src/api/vmp_pmat.rs

@@ -111,3 +111,9 @@ R: VecZnxDftToMut<B>,

A: VecZnxDftToRef<B>, C: VmpPMatToRef<B>; } + +pub trait VmpZero<B: Backend> { + fn vmp_zero<R>(&self, res: &mut R) + where + R: VmpPMatToMut<B>; +}
M poulpy-hal/src/delegates/vmp_pmat.rs → poulpy-hal/src/delegates/vmp_pmat.rs

@@ -1,7 +1,7 @@

use crate::{ api::{ VmpApplyDft, VmpApplyDftTmpBytes, VmpApplyDftToDft, VmpApplyDftToDftAdd, VmpApplyDftToDftAddTmpBytes, - VmpApplyDftToDftTmpBytes, VmpPMatAlloc, VmpPMatBytesOf, VmpPMatFromBytes, VmpPrepare, VmpPrepareTmpBytes, + VmpApplyDftToDftTmpBytes, VmpPMatAlloc, VmpPMatBytesOf, VmpPMatFromBytes, VmpPrepare, VmpPrepareTmpBytes, VmpZero, }, layouts::{ Backend, MatZnxToRef, Module, Scratch, VecZnxDftToMut, VecZnxDftToRef, VecZnxToRef, VmpPMatOwned, VmpPMatToMut,

@@ -10,7 +10,7 @@ },

oep::{ VmpApplyDftImpl, VmpApplyDftTmpBytesImpl, VmpApplyDftToDftAddImpl, VmpApplyDftToDftAddTmpBytesImpl, VmpApplyDftToDftImpl, VmpApplyDftToDftTmpBytesImpl, VmpPMatAllocBytesImpl, VmpPMatAllocImpl, VmpPMatFromBytesImpl, VmpPrepareImpl, - VmpPrepareTmpBytesImpl, + VmpPrepareTmpBytesImpl, VmpZeroImpl, }, };

@@ -161,3 +161,15 @@ {

B::vmp_apply_dft_to_dft_add_impl(self, res, a, b, scale, scratch); } } + +impl<B> VmpZero<B> for Module<B> +where + B: Backend + VmpZeroImpl<B>, +{ + fn vmp_zero<R>(&self, res: &mut R) + where + R: VmpPMatToMut<B>, + { + B::vmp_zero_impl(self, res); + } +}
M poulpy-hal/src/oep/vmp_pmat.rs → poulpy-hal/src/oep/vmp_pmat.rs

@@ -145,3 +145,13 @@ R: VecZnxDftToMut<B>,

A: VecZnxDftToRef<B>, C: VmpPMatToRef<B>; } + +/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe) +/// * See TODO. +/// * See [crate::api::VmpZero] for corresponding public API. +/// # Safety [crate::doc::backend_safety] for safety contract. +pub unsafe trait VmpZeroImpl<B: Backend> { + fn vmp_zero_impl<R>(module: &Module<B>, res: &mut R) + where + R: VmpPMatToMut<B>; +}
M poulpy-hal/src/reference/fft64/vmp.rs → poulpy-hal/src/reference/fft64/vmp.rs

@@ -1,6 +1,6 @@

use crate::{ cast_mut, - layouts::{MatZnx, MatZnxToRef, VecZnx, VecZnxToRef, VmpPMatToMut, ZnxView, ZnxViewMut}, + layouts::{DataViewMut, MatZnx, MatZnxToRef, VecZnx, VecZnxToRef, VmpPMatToMut, ZnxView, ZnxViewMut}, oep::VecZnxDftAllocBytesImpl, reference::fft64::{ reim::{ReimDFTExecute, ReimFFTTable, ReimFromZnx, ReimZero},

@@ -155,6 +155,13 @@

pub fn vmp_apply_dft_to_dft_tmp_bytes(a_size: usize, prows: usize, pcols_in: usize) -> usize { let row_max: usize = (a_size).min(prows); (16 + 8 * row_max * pcols_in) * size_of::<f64>() +} + +pub fn vmp_zero<R, BE: Backend>(res: &mut R) +where + R: VmpPMatToMut<BE>, +{ + res.to_mut().data_mut().fill(0); } pub fn vmp_apply_dft_to_dft<R, A, M, BE>(res: &mut R, a: &A, pmat: &M, tmp_bytes: &mut [f64])
M poulpy-schemes/src/tfhe/bdd_arithmetic/ciphertexts/fhe_uint_prepared.rs → poulpy-schemes/src/tfhe/bdd_arithmetic/ciphertexts/fhe_uint_prepared.rs

@@ -217,6 +217,19 @@ DM: DataMut,

DB: DataRef, DK: DataRef, K: BDDKeyHelper<DK, BRA, BE>; + fn fhe_uint_prepare_custom<DM, DB, DK, K>( + &self, + res: &mut FheUintPrepared<DM, T, BE>, + bits: &FheUint<DB, T>, + bit_start: usize, + bit_end: usize, + key: &K, + scratch: &mut Scratch<BE>, + ) where + DM: DataMut, + DB: DataRef, + DK: DataRef, + K: BDDKeyHelper<DK, BRA, BE>; } impl<BRA: BlindRotationAlgo, BE: Backend, T: UnsignedInteger> FheUintPrepare<BRA, T, BE> for Module<BE>

@@ -241,6 +254,23 @@ fn fhe_uint_prepare<DM, DB, DK, K>(

&self, res: &mut FheUintPrepared<DM, T, BE>, bits: &FheUint<DB, T>, + key: &K, + scratch: &mut Scratch<BE>, + ) where + DM: DataMut, + DB: DataRef, + DK: DataRef, + K: BDDKeyHelper<DK, BRA, BE>, + { + self.fhe_uint_prepare_custom(res, bits, 0, T::BITS as usize, key, scratch); + } + + fn fhe_uint_prepare_custom<DM, DB, DK, K>( + &self, + res: &mut FheUintPrepared<DM, T, BE>, + bits: &FheUint<DB, T>, + bit_start: usize, + bit_end: usize, key: &K, scratch: &mut Scratch<BE>, ) where

@@ -253,11 +283,20 @@ let (cbt, ks) = key.get_cbt_key();

let mut lwe: LWE<Vec<u8>> = LWE::alloc_from_infos(bits); //TODO: add TakeLWE let (mut tmp_ggsw, scratch_1) = scratch.take_ggsw(res); - for (bit, dst) in res.bits.iter_mut().enumerate() { + for (bit, dst) in res.bits[bit_start..bit_end].iter_mut().enumerate() { + // TODO: set the rest of the bits to a prepared zero GGSW bits.get_bit_lwe(self, bit, &mut lwe, ks, scratch_1); cbt.execute_to_constant(self, &mut tmp_ggsw, &lwe, 1, 1, scratch_1); dst.prepare(self, &tmp_ggsw, scratch_1); } + + for i in 0..bit_start { + res.bits[i].zero(self); + } + + for i in bit_end..T::BITS as usize { + res.bits[i].zero(self); + } } }

@@ -272,5 +311,23 @@ M: FheUintPrepare<BRA, T, BE>,

Scratch<BE>: ScratchTakeCore<BE>, { module.fhe_uint_prepare(self, other, key, scratch); + } + pub fn prepare_partial<BRA, M, O, K, DK>( + &mut self, + module: &M, + other: &FheUint<O, T>, + bit_start: usize, + bit_end: usize, + key: &K, + scratch: &mut Scratch<BE>, + ) where + BRA: BlindRotationAlgo, + O: DataRef, + DK: DataRef, + K: BDDKeyHelper<DK, BRA, BE>, + M: FheUintPrepare<BRA, T, BE>, + Scratch<BE>: ScratchTakeCore<BE>, + { + module.fhe_uint_prepare_custom(self, other, bit_start, bit_end, key, scratch); } }