poulpy/core/src/glwe/plaintext.rs
core/src/glwe/plaintext.rsRaw
1use backend::hal::{
2 api::{VecZnxAlloc, VecZnxAllocBytes},
3 layouts::{Backend, Data, DataMut, DataRef, Module, VecZnx, VecZnxToMut, VecZnxToRef},
4};
5
6use crate::{GLWECiphertext, GLWECiphertextToMut, GLWECiphertextToRef, GLWEOps, Infos, SetMetaData};
7
8pub struct GLWEPlaintext<D: Data> {
9 pub data: VecZnx<D>,
10 pub basek: usize,
11 pub k: usize,
12}
13
14impl<D: Data> Infos for GLWEPlaintext<D> {
15 type Inner = VecZnx<D>;
16
17 fn inner(&self) -> &Self::Inner {
18 &self.data
19 }
20
21 fn basek(&self) -> usize {
22 self.basek
23 }
24
25 fn k(&self) -> usize {
26 self.k
27 }
28}
29
30impl<D: DataMut> SetMetaData for GLWEPlaintext<D> {
31 fn set_k(&mut self, k: usize) {
32 self.k = k
33 }
34
35 fn set_basek(&mut self, basek: usize) {
36 self.basek = basek
37 }
38}
39
40impl GLWEPlaintext<Vec<u8>> {
41 pub fn alloc<B: Backend>(module: &Module<B>, basek: usize, k: usize) -> Self
42 where
43 Module<B>: VecZnxAlloc,
44 {
45 Self {
46 data: module.vec_znx_alloc(1, k.div_ceil(basek)),
47 basek: basek,
48 k,
49 }
50 }
51
52 pub fn byte_of<B: Backend>(module: &Module<B>, basek: usize, k: usize) -> usize
53 where
54 Module<B>: VecZnxAllocBytes,
55 {
56 module.vec_znx_alloc_bytes(1, k.div_ceil(basek))
57 }
58}
59
60impl<D: DataRef> GLWECiphertextToRef for GLWEPlaintext<D> {
61 fn to_ref(&self) -> GLWECiphertext<&[u8]> {
62 GLWECiphertext {
63 data: self.data.to_ref(),
64 basek: self.basek,
65 k: self.k,
66 }
67 }
68}
69
70impl<D: DataMut> GLWECiphertextToMut for GLWEPlaintext<D> {
71 fn to_mut(&mut self) -> GLWECiphertext<&mut [u8]> {
72 GLWECiphertext {
73 data: self.data.to_mut(),
74 basek: self.basek,
75 k: self.k,
76 }
77 }
78}
79
80impl<D> GLWEOps for GLWEPlaintext<D>
81where
82 D: DataMut,
83 GLWEPlaintext<D>: GLWECiphertextToMut + Infos + SetMetaData,
84{
85}