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}