arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/utils.rs
poulpy-core/src/utils.rsRaw
 1use crate::layouts::{GLWEPlaintext, LWEInfos, LWEPlaintext, TorusPrecision};
 2use poulpy_hal::layouts::{DataMut, DataRef, Stats};
 3use rug::Float;
 4
 5impl<D: DataMut> GLWEPlaintext<D> {
 6    pub fn encode_vec_i64(&mut self, data: &[i64], k: TorusPrecision) {
 7        let base2k: usize = self.base2k().into();
 8        self.data.encode_vec_i64(base2k, 0, k.into(), data);
 9    }
10
11    pub fn encode_coeff_i64(&mut self, data: i64, k: TorusPrecision, idx: usize) {
12        let base2k: usize = self.base2k().into();
13        self.data.encode_coeff_i64(base2k, 0, k.into(), idx, data);
14    }
15}
16
17impl<D: DataRef> GLWEPlaintext<D> {
18    pub fn decode_vec_i64(&self, data: &mut [i64], k: TorusPrecision) {
19        self.data.decode_vec_i64(self.base2k().into(), 0, k.into(), data);
20    }
21
22    pub fn decode_coeff_i64(&self, k: TorusPrecision, idx: usize) -> i64 {
23        self.data.decode_coeff_i64(self.base2k().into(), 0, k.into(), idx)
24    }
25
26    pub fn decode_vec_float(&self, data: &mut [Float]) {
27        self.data.decode_vec_float(self.base2k().into(), 0, data);
28    }
29
30    pub fn stats(&self) -> Stats {
31        self.data.stats(self.base2k().into(), 0)
32    }
33}
34
35impl<D: DataMut> LWEPlaintext<D> {
36    pub fn encode_i64(&mut self, data: i64, k: TorusPrecision) {
37        let base2k: usize = self.base2k().into();
38        self.data.encode_coeff_i64(base2k, 0, k.into(), 0, data);
39    }
40}
41
42impl<D: DataRef> LWEPlaintext<D> {
43    pub fn decode_i64(&self, k: TorusPrecision) -> i64 {
44        self.data.decode_coeff_i64(self.base2k().into(), 0, k.into(), 0)
45    }
46
47    pub fn decode_float(&self) -> Float {
48        let mut out: [Float; 1] = [Float::new(self.k().as_u32())];
49        self.data.decode_vec_float(self.base2k().into(), 0, &mut out);
50        out[0].clone()
51    }
52}