use anyhow::Result;
use poulpy_core::layouts::GLWEToBackendMut;
use poulpy_core::layouts::{GGLWEInfos, GLWEToBackendRef, prepared::GLWETensorKeyPreparedToBackendRef};
use poulpy_hal::layouts::{Backend, ScratchArena};
use crate::{CKKSCtBounds, CKKSInfos, SetCKKSInfos};
pub trait CKKSMulOps<BE: Backend> {
fn ckks_mul_tmp_bytes<R, T>(&self, res: &R, tsk: &T) -> usize
where
R: CKKSCtBounds,
T: GGLWEInfos;
fn ckks_square_tmp_bytes<R, T>(&self, res: &R, tsk: &T) -> usize
where
R: CKKSCtBounds,
T: GGLWEInfos;
fn ckks_mul_pt_vec_tmp_bytes<R, A, P>(&self, res: &R, a: &A, b: &P) -> usize
where
R: CKKSCtBounds,
A: CKKSCtBounds,
P: CKKSInfos;
fn ckks_mul_pt_const_tmp_bytes<R, A, P>(&self, res: &R, a: &A, b: &P) -> usize
where
R: CKKSCtBounds,
A: CKKSCtBounds,
P: CKKSInfos;
fn ckks_mul_into<Dst, A, B, T>(&self, dst: &mut Dst, a: &A, b: &B, tsk: &T, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
B: GLWEToBackendRef<BE> + CKKSCtBounds,
T: GGLWEInfos + GLWETensorKeyPreparedToBackendRef<BE>;
fn ckks_mul_assign<Dst, A, T>(&self, dst: &mut Dst, a: &A, tsk: &T, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + GLWEToBackendRef<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
T: GGLWEInfos + GLWETensorKeyPreparedToBackendRef<BE>;
fn ckks_square_into<Dst, A, T>(&self, dst: &mut Dst, a: &A, tsk: &T, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + CKKSCtBounds + SetCKKSInfos,
A: GLWEToBackendRef<BE> + CKKSCtBounds,
T: GGLWEInfos + GLWETensorKeyPreparedToBackendRef<BE>;
fn ckks_square_assign<Dst, T>(&self, dst: &mut Dst, tsk: &T, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + GLWEToBackendRef<BE> + CKKSCtBounds + SetCKKSInfos,
T: GGLWEInfos + GLWETensorKeyPreparedToBackendRef<BE>;
fn ckks_mul_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_mul_pt_vec_assign<Dst, P>(&self, dst: &mut Dst, pt: &P, scratch: &mut ScratchArena<'_, BE>) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + GLWEToBackendRef<BE> + CKKSCtBounds + SetCKKSInfos,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
fn ckks_mul_pt_const_into<Dst, A, P>(
&self,
dst: &mut Dst,
a: &A,
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_mul_pt_const_assign<Dst, P>(
&self,
dst: &mut Dst,
pt: &P,
pt_coeff: usize,
scratch: &mut ScratchArena<'_, BE>,
) -> Result<()>
where
Dst: GLWEToBackendMut<BE> + GLWEToBackendRef<BE> + CKKSCtBounds + SetCKKSInfos,
P: GLWEToBackendRef<BE> + CKKSCtBounds;
}