Skip to main content

poulpy_ckks/default/
neg.rs

1use anyhow::Result;
2use poulpy_core::{
3    GLWENegate, GLWEShift,
4    layouts::{GLWEInfos, 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 CKKSNegDefault<BE: Backend> {
11    fn ckks_neg_tmp_bytes_default(&self) -> usize
12    where
13        Self: GLWEShift<BE>,
14    {
15        self.glwe_shift_tmp_bytes()
16    }
17
18    fn ckks_neg_into_default<Dst, Src>(&self, dst: &mut Dst, src: &Src, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
19    where
20        Self: GLWENegate<BE> + GLWEShift<BE>,
21        Dst: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
22        Src: GLWEToBackendRef<BE> + GLWEInfos + LWEInfos + CKKSInfos,
23    {
24        let offset = ckks_offset_unary(dst, src);
25        if offset != 0 {
26            self.glwe_lsh(dst, src, offset, scratch);
27            dst.set_meta(src.meta());
28            dst.set_log_budget(checked_log_budget_sub("neg", src.log_budget(), offset)?);
29            self.glwe_negate_assign(dst);
30        } else {
31            self.glwe_negate(dst, src);
32            dst.set_meta(src.meta());
33        }
34        Ok(())
35    }
36
37    fn ckks_neg_assign_default<Dst>(&self, dst: &mut Dst) -> Result<()>
38    where
39        Self: GLWENegate<BE>,
40        Dst: GLWEToBackendMut<BE> + LWEInfos + CKKSInfos + SetCKKSInfos,
41    {
42        self.glwe_negate_assign(dst);
43        Ok(())
44    }
45}