poulpy/poulpy-core/src/external_product/gglwe_atk.rs
poulpy-core/src/external_product/gglwe_atk.rsRaw
1use poulpy_hal::{
2 api::{
3 ScratchAvailable, TakeVecZnx, TakeVecZnxDft, VecZnxBigNormalize, VecZnxDftAllocBytes, VecZnxDftApply,
4 VecZnxIdftApplyConsume, VecZnxNormalize, VecZnxNormalizeTmpBytes, VmpApplyDftToDft, VmpApplyDftToDftAdd,
5 VmpApplyDftToDftTmpBytes,
6 },
7 layouts::{Backend, DataMut, DataRef, Module, Scratch},
8};
9
10use crate::layouts::{GGLWEAutomorphismKey, GGLWELayoutInfos, GGLWESwitchingKey, GGSWInfos, prepared::GGSWCiphertextPrepared};
11
12impl GGLWEAutomorphismKey<Vec<u8>> {
13 pub fn external_product_scratch_space<B: Backend, OUT, IN, GGSW>(
14 module: &Module<B>,
15 out_infos: &OUT,
16 in_infos: &IN,
17 ggsw_infos: &GGSW,
18 ) -> usize
19 where
20 OUT: GGLWELayoutInfos,
21 IN: GGLWELayoutInfos,
22 GGSW: GGSWInfos,
23 Module<B>: VecZnxDftAllocBytes + VmpApplyDftToDftTmpBytes + VecZnxNormalizeTmpBytes,
24 {
25 GGLWESwitchingKey::external_product_scratch_space(module, out_infos, in_infos, ggsw_infos)
26 }
27
28 pub fn external_product_inplace_scratch_space<B: Backend, OUT, GGSW>(
29 module: &Module<B>,
30 out_infos: &OUT,
31 ggsw_infos: &GGSW,
32 ) -> usize
33 where
34 OUT: GGLWELayoutInfos,
35 GGSW: GGSWInfos,
36 Module<B>: VecZnxDftAllocBytes + VmpApplyDftToDftTmpBytes + VecZnxNormalizeTmpBytes,
37 {
38 GGLWESwitchingKey::external_product_inplace_scratch_space(module, out_infos, ggsw_infos)
39 }
40}
41
42impl<DataSelf: DataMut> GGLWEAutomorphismKey<DataSelf> {
43 pub fn external_product<DataLhs: DataRef, DataRhs: DataRef, B: Backend>(
44 &mut self,
45 module: &Module<B>,
46 lhs: &GGLWEAutomorphismKey<DataLhs>,
47 rhs: &GGSWCiphertextPrepared<DataRhs, B>,
48 scratch: &mut Scratch<B>,
49 ) where
50 Module<B>: VecZnxDftAllocBytes
51 + VmpApplyDftToDftTmpBytes
52 + VecZnxNormalizeTmpBytes
53 + VecZnxDftApply<B>
54 + VmpApplyDftToDft<B>
55 + VmpApplyDftToDftAdd<B>
56 + VecZnxIdftApplyConsume<B>
57 + VecZnxBigNormalize<B>
58 + VecZnxNormalize<B>,
59 Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx,
60 {
61 self.key.external_product(module, &lhs.key, rhs, scratch);
62 }
63
64 pub fn external_product_inplace<DataRhs: DataRef, B: Backend>(
65 &mut self,
66 module: &Module<B>,
67 rhs: &GGSWCiphertextPrepared<DataRhs, B>,
68 scratch: &mut Scratch<B>,
69 ) where
70 Module<B>: VecZnxDftAllocBytes
71 + VmpApplyDftToDftTmpBytes
72 + VecZnxNormalizeTmpBytes
73 + VecZnxDftApply<B>
74 + VmpApplyDftToDft<B>
75 + VmpApplyDftToDftAdd<B>
76 + VecZnxIdftApplyConsume<B>
77 + VecZnxBigNormalize<B>
78 + VecZnxNormalize<B>,
79 Scratch<B>: TakeVecZnxDft<B> + ScratchAvailable + TakeVecZnx,
80 {
81 self.key.external_product_inplace(module, rhs, scratch);
82 }
83}