Skip to main content

poulpy_ckks/default/
copy.rs

1use 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}