arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}