poulpy_ckks/default/
neg.rs1use 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}