Skip to main content

poulpy_core/delegates/
conversion.rs

1use poulpy_hal::layouts::{Backend, Module, ScratchArena};
2
3use crate::{
4    api::{GGSWExpandRows, GGSWFromGGLWE, GLWEExpandLWE, GLWEFromLWE, LWEFromGLWE, LWESampleExtract},
5    layouts::{
6        GGLWEInfos, GGSWInfos, GGSWToBackendMut, GLWEInfos, GLWEToBackendMut, GLWEToBackendRef, LWEInfos, LWEToBackendMut,
7        LWEToBackendRef,
8        prepared::{GGLWEPreparedToBackendRef, GGLWEToGGSWKeyPreparedToBackendRef},
9    },
10    oep::{ConversionDefault, ConversionImpl},
11};
12
13macro_rules! impl_conversion_delegate {
14    ($trait:ty, [$($bounds:tt)+], $($body:item)+) => {
15        impl<BE> $trait for Module<BE>
16        where
17            $($bounds)+
18        {
19            $($body)+
20        }
21    };
22}
23
24impl_conversion_delegate!(
25    LWESampleExtract<BE>,
26    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
27    fn lwe_sample_extract<R, A>(&self, res: &mut R, a: &A)
28    where
29        R: LWEToBackendMut<BE> + LWEInfos,
30        A: GLWEToBackendRef<BE> + GLWEInfos,
31    {
32        BE::lwe_sample_extract(self, res, a)
33    }
34);
35
36impl_conversion_delegate!(
37    GLWEFromLWE<BE>,
38    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
39    fn glwe_from_lwe_tmp_bytes<R, A, K>(&self, glwe_infos: &R, lwe_infos: &A, key_infos: &K) -> usize
40    where
41        R: GLWEInfos,
42        A: LWEInfos,
43        K: GGLWEInfos,
44    {
45        BE::glwe_from_lwe_tmp_bytes(self, glwe_infos, lwe_infos, key_infos)
46    }
47
48    fn glwe_from_lwe<R, A, K>(
49        &self,
50        res: &mut R,
51        lwe: &A,
52        ksk: &K,
53        key_size: usize,
54        scratch: &mut ScratchArena<'_, BE>,
55    )
56    where
57        R: GLWEToBackendMut<BE> + GLWEInfos,
58        A: LWEToBackendRef<BE> + LWEInfos,
59        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
60    {
61        BE::glwe_from_lwe(self, res, lwe, ksk, key_size, scratch)
62    }
63);
64
65impl_conversion_delegate!(
66    LWEFromGLWE<BE>,
67    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
68    fn lwe_from_glwe_tmp_bytes<R, A, K>(&self, lwe_infos: &R, glwe_infos: &A, key_infos: &K) -> usize
69    where
70        R: LWEInfos,
71        A: GLWEInfos,
72        K: GGLWEInfos,
73    {
74        BE::lwe_from_glwe_tmp_bytes(self, lwe_infos, glwe_infos, key_infos)
75    }
76
77    fn lwe_from_glwe<R, A, K>(
78        &self,
79        res: &mut R,
80        a: &A,
81        a_idx: usize,
82        key: &K,
83        key_size: usize,
84        scratch: &mut ScratchArena<'_, BE>,
85    )
86    where
87        R: LWEToBackendMut<BE> + LWEInfos,
88        A: GLWEToBackendRef<BE> + GLWEInfos,
89        K: GGLWEPreparedToBackendRef<BE> + GGLWEInfos,
90    {
91        BE::lwe_from_glwe(self, res, a, a_idx, key, key_size, scratch)
92    }
93);
94
95impl_conversion_delegate!(
96    GLWEExpandLWE<BE>,
97    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
98    fn glwe_expand_lwe_tmp_bytes<R, A>(&self, lwe_infos: &R, a_infos: &A) -> usize
99    where
100        R: LWEInfos,
101        A: GLWEInfos,
102    {
103        BE::glwe_expand_lwe_tmp_bytes(self, lwe_infos, a_infos)
104    }
105
106    fn glwe_expand_lwe<R, A>(&self, res: &mut [R], a: &A, scratch: &mut ScratchArena<'_, BE>)
107    where
108        R: LWEToBackendMut<BE> + LWEInfos,
109        A: GLWEToBackendRef<BE> + GLWEInfos,
110    {
111        BE::glwe_expand_lwe(self, res, a, scratch)
112    }
113);
114
115impl_conversion_delegate!(
116    GGSWFromGGLWE<BE>,
117    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
118    fn ggsw_from_gglwe_tmp_bytes<R, A>(&self, res_infos: &R, tsk_infos: &A) -> usize
119    where
120        R: GGSWInfos,
121        A: GGLWEInfos,
122    {
123        BE::ggsw_from_gglwe_tmp_bytes(self, res_infos, tsk_infos)
124    }
125
126    fn ggsw_from_gglwe<R, A, T>(
127        &self,
128        res: &mut R,
129        a: &A,
130        tsk: &T,
131        tsk_size: usize,
132        scratch: &mut ScratchArena<'_, BE>,
133    )
134    where
135        R: GGSWToBackendMut<BE> + GGSWInfos,
136        A: crate::layouts::GGLWEToBackendRef<BE> + GGLWEInfos,
137        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
138    {
139        BE::ggsw_from_gglwe(self, res, a, tsk, tsk_size, scratch)
140    }
141);
142
143impl_conversion_delegate!(
144    GGSWExpandRows<BE>,
145    [BE: Backend + ConversionImpl<BE>, Module<BE>: ConversionDefault<BE>],
146    fn ggsw_expand_rows_tmp_bytes<R, A>(&self, res_infos: &R, tsk_infos: &A) -> usize
147    where
148        R: GGSWInfos,
149        A: GGLWEInfos,
150    {
151        BE::ggsw_expand_rows_tmp_bytes(self, res_infos, tsk_infos)
152    }
153
154    fn ggsw_expand_row<R, T>(
155        &self,
156        res: &mut R,
157        tsk: &T,
158        tsk_size: usize,
159        scratch: &mut ScratchArena<'_, BE>,
160    )
161    where
162        R: GGSWToBackendMut<BE> + GGSWInfos,
163        T: GGLWEToGGSWKeyPreparedToBackendRef<BE> + GGLWEInfos,
164    {
165        BE::ggsw_expand_row(self, res, tsk, tsk_size, scratch)
166    }
167);