poulpy_core/noise/
glwe_ct.rs1use poulpy_hal::{
2 api::{
3 ScratchOwnedAlloc, ScratchOwnedBorrow, SvpApplyDftToDftInplace, VecZnxBigAddInplace, VecZnxBigAddSmallInplace,
4 VecZnxBigAllocBytes, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftApply, VecZnxIdftApplyConsume,
5 VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxSubABInplace,
6 },
7 layouts::{Backend, DataRef, Module, ScratchOwned},
8 oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl, TakeVecZnxBigImpl, TakeVecZnxDftImpl},
9};
10
11use crate::{
12 layouts::GLWEPlaintext,
13 layouts::prepared::GLWESecretPrepared,
14 layouts::{GLWECiphertext, Infos},
15};
16
17impl<D: DataRef> GLWECiphertext<D> {
18 pub fn assert_noise<B, DataSk, DataPt>(
19 &self,
20 module: &Module<B>,
21 sk_prepared: &GLWESecretPrepared<DataSk, B>,
22 pt_want: &GLWEPlaintext<DataPt>,
23 max_noise: f64,
24 ) where
25 DataSk: DataRef,
26 DataPt: DataRef,
27 Module<B>: VecZnxDftAllocBytes
28 + VecZnxBigAllocBytes
29 + VecZnxDftApply<B>
30 + SvpApplyDftToDftInplace<B>
31 + VecZnxIdftApplyConsume<B>
32 + VecZnxBigAddInplace<B>
33 + VecZnxBigAddSmallInplace<B>
34 + VecZnxBigNormalize<B>
35 + VecZnxNormalizeTmpBytes
36 + VecZnxSubABInplace
37 + VecZnxNormalizeInplace<B>,
38 B: Backend + TakeVecZnxDftImpl<B> + TakeVecZnxBigImpl<B> + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>,
39 {
40 let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(self.n(), self.basek(), self.k());
41
42 let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(GLWECiphertext::decrypt_scratch_space(
43 module,
44 self.basek(),
45 self.k(),
46 ));
47
48 self.decrypt(module, &mut pt_have, sk_prepared, scratch.borrow());
49
50 module.vec_znx_sub_ab_inplace(&mut pt_have.data, 0, &pt_want.data, 0);
51 module.vec_znx_normalize_inplace(self.basek(), &mut pt_have.data, 0, scratch.borrow());
52
53 let noise_have: f64 = pt_have.data.std(self.basek(), 0).log2();
54 assert!(noise_have <= max_noise, "{} {}", noise_have, max_noise);
55 }
56}