poulpy_ckks/default/
copy.rs1use anyhow::Result;
2use poulpy_core::{
3 GLWECopy, GLWEShift,
4 layouts::{GLWEToBackendMut, GLWEToBackendRef, LWEInfos},
5};
6use poulpy_hal::layouts::{Backend, ScratchArena};
7
8use crate::{CKKSInfos, SetCKKSInfos, checked_log_budget_sub, ckks_offset_unary};
9
10pub trait CKKSCopyDefault<BE: Backend> {
11 fn ckks_copy_tmp_bytes_default(&self) -> usize
12 where
13 Self: GLWEShift<BE>,
14 {
15 self.glwe_shift_tmp_bytes()
16 }
17
18 fn ckks_copy_default<Dst, Src>(&self, dst: &mut Dst, src: &Src, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
19 where
20 Self: GLWECopy<BE> + GLWEShift<BE>,
21 Dst: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
22 Src: GLWEToBackendRef<BE> + LWEInfos + CKKSInfos,
23 {
24 let offset = ckks_offset_unary(dst, src);
25 if offset == 0 {
26 self.glwe_copy(dst, src);
27 dst.set_meta(src.meta());
28 } else {
29 self.glwe_lsh(dst, src, offset, scratch);
30 dst.set_meta(src.meta());
31 dst.set_log_budget(checked_log_budget_sub("copy", src.log_budget(), offset)?);
32 }
33 Ok(())
34 }
35}