use crate::layouts::{GLWEPlaintext, LWEInfos, LWEPlaintext, TorusPrecision};
use dashu_float::{FBig, round::mode::HalfEven};
use poulpy_hal::layouts::{HostDataMut, HostDataRef, Stats};
impl<D: HostDataMut> GLWEPlaintext<D> {
pub fn encode_vec_i64(&mut self, data: &[i64], k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_vec_i64(base2k, 0, k.into(), data);
}
pub fn encode_vec_i128(&mut self, data: &[i128], k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_vec_i128(base2k, 0, k.into(), data);
}
pub fn encode_coeff_i64(&mut self, data: i64, k: TorusPrecision, idx: usize) {
let base2k: usize = self.base2k().into();
self.data.encode_coeff_i64(base2k, 0, k.into(), idx, data);
}
}
impl<D: HostDataRef> GLWEPlaintext<D> {
pub fn decode_vec_i64(&self, data: &mut [i64], k: TorusPrecision) {
self.data.decode_vec_i64(self.base2k().into(), 0, k.into(), data);
}
pub fn decode_vec_i128(&self, data: &mut [i128], k: TorusPrecision) {
self.data.decode_vec_i128(self.base2k().into(), 0, k.into(), data);
}
pub fn decode_coeff_i64(&self, k: TorusPrecision, idx: usize) -> i64 {
self.data.decode_coeff_i64(self.base2k().into(), 0, k.into(), idx)
}
pub fn decode_vec_float(&self, data: &mut [FBig<HalfEven>]) {
self.data.decode_vec_float(self.base2k().into(), 0, data);
}
pub fn stats(&self) -> Stats {
self.data.stats(self.base2k().into(), 0)
}
}
impl<D: HostDataMut> LWEPlaintext<D> {
pub fn encode_i64(&mut self, data: i64, k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_coeff_i64(base2k, 0, k.into(), 0, data);
}
pub fn encode_i128(&mut self, data: i128, k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_vec_i128(base2k, 0, k.into(), &[data]);
}
}
impl<D: HostDataRef> LWEPlaintext<D> {
pub fn decode_i64(&self, k: TorusPrecision) -> i64 {
self.data.decode_coeff_i64(self.base2k().into(), 0, k.into(), 0)
}
pub fn decode_float(&self) -> FBig<HalfEven> {
let mut out = [FBig::<HalfEven>::ZERO];
self.data.decode_vec_float(self.base2k().into(), 0, &mut out);
out[0].clone()
}
}