use anyhow::Result;
use poulpy_core::layouts::{GLWEToBackendMut, GLWEToBackendRef};
use poulpy_hal::layouts::{Backend, Data, ScratchArena};
use crate::{CKKSCtBounds, CKKSInfos, SetCKKSInfos, layouts::UnnormalizedCKKSCiphertext};
pub trait CKKSSubOps<BE: Backend> {
fn ckks_sub_tmp_bytes(&self) -> usize;
fn ckks_sub_pt_vec_tmp_bytes(&self) -> usize;
fn ckks_sub_into<Dst, A, B>(&self, dst: &mut Dst, a: &A, b: &B, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
B: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_assign<Dst, A>(&self, dst: &mut Dst, a: &A, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_one_assign<Dst>(&self, dst: &mut Dst, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos;
fn ckks_sub_pt_vec_into<Dst, A, P>(&self, dst: &mut Dst, a: &A, pt: &P, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_vec_assign<Dst, P>(&self, dst: &mut Dst, pt: &P, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_const_tmp_bytes(&self) -> usize;
fn ckks_sub_pt_const_into<Dst, A, P>(
&self,
dst: &mut Dst,
a: &A,
dst_coeff: usize,
pt: &P,
pt_coeff: usize,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_const_assign<Dst, P>(
&self,
dst: &mut Dst,
dst_coeff: usize,
pt: &P,
pt_coeff: usize,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
}
pub trait CKKSSubOpsUnnormalized<BE: Backend> {
fn ckks_sub_into_unnormalized<Dst, A, B>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
a: &A,
b: &B,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
B: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_assign_unnormalized<Dst, A>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
a: &A,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
A: GLWEToBackendRef<BE> + CKKSInfos;
fn ckks_sub_pt_vec_into_unnormalized<Dst, A, P>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
a: &A,
pt: &P,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_vec_assign_unnormalized<Dst, P>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
pt: &P,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_const_into_unnormalized<Dst, A, P>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
a: &A,
dst_coeff: usize,
pt: &P,
pt_coeff: usize,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_sub_pt_const_assign_unnormalized<Dst, P>(
&self,
dst: &mut UnnormalizedCKKSCiphertext<Dst>,
dst_coeff: usize,
pt: &P,
pt_coeff: usize,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: Data,
UnnormalizedCKKSCiphertext<Dst>: GLWEToBackendMut<BE>,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
}