Skip to main content

poulpy_core/api/
transfer.rs

1use poulpy_hal::layouts::{Backend, DataView, MatZnx, Module, ScalarZnx, TransferFrom, VecZnx};
2
3use crate::layouts::{
4    BackendGGLWE, BackendGGSW, BackendGLWE, BackendGLWEPlaintext, BackendGLWESecret, BackendLWE, BackendLWEPlaintext,
5    BackendLWESecret, GGLWE, GGSW, GLWE, GLWEPlaintext, GLWESecret, LWE, LWEPlaintext, LWESecret,
6};
7
8fn transfer_vec_znx<From, To>(src: &VecZnx<From::OwnedBuf>) -> VecZnx<To::OwnedBuf>
9where
10    From: Backend,
11    To: Backend + TransferFrom<From>,
12{
13    VecZnx::from_data_with_max_size(
14        <To as TransferFrom<From>>::transfer_buf(src.data()),
15        src.n(),
16        src.cols(),
17        src.size(),
18        src.max_size(),
19    )
20}
21
22fn transfer_mat_znx<From, To>(src: &MatZnx<From::OwnedBuf>) -> MatZnx<To::OwnedBuf>
23where
24    From: Backend,
25    To: Backend + TransferFrom<From>,
26{
27    MatZnx::from_data(
28        <To as TransferFrom<From>>::transfer_buf(src.data()),
29        src.n(),
30        src.rows(),
31        src.cols_in(),
32        src.cols_out(),
33        src.size(),
34    )
35}
36
37fn transfer_scalar_znx<From, To>(src: &ScalarZnx<From::OwnedBuf>) -> ScalarZnx<To::OwnedBuf>
38where
39    From: Backend,
40    To: Backend + TransferFrom<From>,
41{
42    ScalarZnx::from_data(<To as TransferFrom<From>>::transfer_buf(src.data()), src.n(), src.cols())
43}
44
45pub trait ModuleTransfer<To: Backend> {
46    fn upload_glwe<From>(&self, src: &BackendGLWE<From>) -> BackendGLWE<To>
47    where
48        From: Backend,
49        To: TransferFrom<From>;
50
51    fn download_glwe<From>(&self, src: &BackendGLWE<From>) -> BackendGLWE<To>
52    where
53        From: Backend,
54        To: TransferFrom<From>;
55
56    fn upload_lwe<From>(&self, src: &BackendLWE<From>) -> BackendLWE<To>
57    where
58        From: Backend,
59        To: TransferFrom<From>;
60
61    fn download_lwe<From>(&self, src: &BackendLWE<From>) -> BackendLWE<To>
62    where
63        From: Backend,
64        To: TransferFrom<From>;
65
66    fn upload_gglwe<From>(&self, src: &BackendGGLWE<From>) -> BackendGGLWE<To>
67    where
68        From: Backend,
69        To: TransferFrom<From>;
70
71    fn download_gglwe<From>(&self, src: &BackendGGLWE<From>) -> BackendGGLWE<To>
72    where
73        From: Backend,
74        To: TransferFrom<From>;
75
76    fn upload_ggsw<From>(&self, src: &BackendGGSW<From>) -> BackendGGSW<To>
77    where
78        From: Backend,
79        To: TransferFrom<From>;
80
81    fn download_ggsw<From>(&self, src: &BackendGGSW<From>) -> BackendGGSW<To>
82    where
83        From: Backend,
84        To: TransferFrom<From>;
85
86    fn upload_glwe_secret<From>(&self, src: &BackendGLWESecret<From>) -> BackendGLWESecret<To>
87    where
88        From: Backend,
89        To: TransferFrom<From>;
90
91    fn download_glwe_secret<From>(&self, src: &BackendGLWESecret<From>) -> BackendGLWESecret<To>
92    where
93        From: Backend,
94        To: TransferFrom<From>;
95
96    fn upload_lwe_secret<From>(&self, src: &BackendLWESecret<From>) -> BackendLWESecret<To>
97    where
98        From: Backend,
99        To: TransferFrom<From>;
100
101    fn download_lwe_secret<From>(&self, src: &BackendLWESecret<From>) -> BackendLWESecret<To>
102    where
103        From: Backend,
104        To: TransferFrom<From>;
105
106    fn upload_glwe_plaintext<From>(&self, src: &BackendGLWEPlaintext<From>) -> BackendGLWEPlaintext<To>
107    where
108        From: Backend,
109        To: TransferFrom<From>;
110
111    fn download_glwe_plaintext<From>(&self, src: &BackendGLWEPlaintext<From>) -> BackendGLWEPlaintext<To>
112    where
113        From: Backend,
114        To: TransferFrom<From>;
115
116    fn upload_lwe_plaintext<From>(&self, src: &BackendLWEPlaintext<From>) -> BackendLWEPlaintext<To>
117    where
118        From: Backend,
119        To: TransferFrom<From>;
120
121    fn download_lwe_plaintext<From>(&self, src: &BackendLWEPlaintext<From>) -> BackendLWEPlaintext<To>
122    where
123        From: Backend,
124        To: TransferFrom<From>;
125}
126
127impl<To: Backend> ModuleTransfer<To> for Module<To> {
128    fn upload_glwe<From>(&self, src: &BackendGLWE<From>) -> BackendGLWE<To>
129    where
130        From: Backend,
131        To: TransferFrom<From>,
132    {
133        let _ = self;
134        GLWE {
135            data: transfer_vec_znx::<From, To>(&src.data),
136            base2k: src.base2k,
137        }
138    }
139
140    fn download_glwe<From>(&self, src: &BackendGLWE<From>) -> BackendGLWE<To>
141    where
142        From: Backend,
143        To: TransferFrom<From>,
144    {
145        self.upload_glwe(src)
146    }
147
148    fn upload_lwe<From>(&self, src: &BackendLWE<From>) -> BackendLWE<To>
149    where
150        From: Backend,
151        To: TransferFrom<From>,
152    {
153        let _ = self;
154        LWE {
155            body: transfer_vec_znx::<From, To>(&src.body),
156            mask: transfer_vec_znx::<From, To>(&src.mask),
157            base2k: src.base2k,
158        }
159    }
160
161    fn download_lwe<From>(&self, src: &BackendLWE<From>) -> BackendLWE<To>
162    where
163        From: Backend,
164        To: TransferFrom<From>,
165    {
166        self.upload_lwe(src)
167    }
168
169    fn upload_gglwe<From>(&self, src: &BackendGGLWE<From>) -> BackendGGLWE<To>
170    where
171        From: Backend,
172        To: TransferFrom<From>,
173    {
174        let _ = self;
175        GGLWE {
176            data: transfer_mat_znx::<From, To>(&src.data),
177            base2k: src.base2k,
178            dsize: src.dsize,
179        }
180    }
181
182    fn download_gglwe<From>(&self, src: &BackendGGLWE<From>) -> BackendGGLWE<To>
183    where
184        From: Backend,
185        To: TransferFrom<From>,
186    {
187        self.upload_gglwe(src)
188    }
189
190    fn upload_ggsw<From>(&self, src: &BackendGGSW<From>) -> BackendGGSW<To>
191    where
192        From: Backend,
193        To: TransferFrom<From>,
194    {
195        let _ = self;
196        GGSW {
197            data: transfer_mat_znx::<From, To>(&src.data),
198            base2k: src.base2k,
199            dsize: src.dsize,
200        }
201    }
202
203    fn download_ggsw<From>(&self, src: &BackendGGSW<From>) -> BackendGGSW<To>
204    where
205        From: Backend,
206        To: TransferFrom<From>,
207    {
208        self.upload_ggsw(src)
209    }
210
211    fn upload_glwe_secret<From>(&self, src: &BackendGLWESecret<From>) -> BackendGLWESecret<To>
212    where
213        From: Backend,
214        To: TransferFrom<From>,
215    {
216        let _ = self;
217        GLWESecret {
218            data: transfer_scalar_znx::<From, To>(&src.data),
219            dist: src.dist,
220        }
221    }
222
223    fn download_glwe_secret<From>(&self, src: &BackendGLWESecret<From>) -> BackendGLWESecret<To>
224    where
225        From: Backend,
226        To: TransferFrom<From>,
227    {
228        self.upload_glwe_secret(src)
229    }
230
231    fn upload_lwe_secret<From>(&self, src: &BackendLWESecret<From>) -> BackendLWESecret<To>
232    where
233        From: Backend,
234        To: TransferFrom<From>,
235    {
236        let _ = self;
237        LWESecret {
238            data: transfer_scalar_znx::<From, To>(&src.data),
239            dist: src.dist,
240        }
241    }
242
243    fn download_lwe_secret<From>(&self, src: &BackendLWESecret<From>) -> BackendLWESecret<To>
244    where
245        From: Backend,
246        To: TransferFrom<From>,
247    {
248        self.upload_lwe_secret(src)
249    }
250
251    fn upload_glwe_plaintext<From>(&self, src: &BackendGLWEPlaintext<From>) -> BackendGLWEPlaintext<To>
252    where
253        From: Backend,
254        To: TransferFrom<From>,
255    {
256        let _ = self;
257        GLWEPlaintext {
258            data: transfer_vec_znx::<From, To>(&src.data),
259            base2k: src.base2k,
260        }
261    }
262
263    fn download_glwe_plaintext<From>(&self, src: &BackendGLWEPlaintext<From>) -> BackendGLWEPlaintext<To>
264    where
265        From: Backend,
266        To: TransferFrom<From>,
267    {
268        self.upload_glwe_plaintext(src)
269    }
270
271    fn upload_lwe_plaintext<From>(&self, src: &BackendLWEPlaintext<From>) -> BackendLWEPlaintext<To>
272    where
273        From: Backend,
274        To: TransferFrom<From>,
275    {
276        let _ = self;
277        LWEPlaintext {
278            data: transfer_vec_znx::<From, To>(&src.data),
279            base2k: src.base2k,
280        }
281    }
282
283    fn download_lwe_plaintext<From>(&self, src: &BackendLWEPlaintext<From>) -> BackendLWEPlaintext<To>
284    where
285        From: Backend,
286        To: TransferFrom<From>,
287    {
288        self.upload_lwe_plaintext(src)
289    }
290}