arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/layouts/glwe_tensor_key.rs
poulpy-core/src/layouts/glwe_tensor_key.rsRaw
  1use poulpy_hal::{
  2    layouts::{Data, DataMut, DataRef, FillUniform, ReaderFrom, WriterTo},
  3    source::Source,
  4};
  5
  6use crate::layouts::{
  7    Base2K, Degree, Dnum, Dsize, GGLWE, GGLWEInfos, GGLWEToMut, GGLWEToRef, GLWEInfos, LWEInfos, Rank, TorusPrecision,
  8};
  9
 10use std::fmt;
 11
 12#[derive(PartialEq, Eq, Copy, Clone, Debug)]
 13pub struct GLWETensorKeyLayout {
 14    pub n: Degree,
 15    pub base2k: Base2K,
 16    pub k: TorusPrecision,
 17    pub rank: Rank,
 18    pub dnum: Dnum,
 19    pub dsize: Dsize,
 20}
 21
 22#[derive(PartialEq, Eq, Clone)]
 23pub struct GLWETensorKey<D: Data>(pub(crate) GGLWE<D>);
 24
 25impl<D: Data> LWEInfos for GLWETensorKey<D> {
 26    fn n(&self) -> Degree {
 27        self.0.n()
 28    }
 29
 30    fn base2k(&self) -> Base2K {
 31        self.0.base2k()
 32    }
 33
 34    fn k(&self) -> TorusPrecision {
 35        self.0.k()
 36    }
 37
 38    fn size(&self) -> usize {
 39        self.0.size()
 40    }
 41}
 42
 43impl<D: Data> GLWEInfos for GLWETensorKey<D> {
 44    fn rank(&self) -> Rank {
 45        self.0.rank_out()
 46    }
 47}
 48
 49impl<D: Data> GGLWEInfos for GLWETensorKey<D> {
 50    fn rank_in(&self) -> Rank {
 51        self.rank_out()
 52    }
 53
 54    fn rank_out(&self) -> Rank {
 55        self.0.rank_out()
 56    }
 57
 58    fn dsize(&self) -> Dsize {
 59        self.0.dsize()
 60    }
 61
 62    fn dnum(&self) -> Dnum {
 63        self.0.dnum()
 64    }
 65}
 66
 67impl LWEInfos for GLWETensorKeyLayout {
 68    fn n(&self) -> Degree {
 69        self.n
 70    }
 71
 72    fn base2k(&self) -> Base2K {
 73        self.base2k
 74    }
 75
 76    fn k(&self) -> TorusPrecision {
 77        self.k
 78    }
 79}
 80
 81impl GLWEInfos for GLWETensorKeyLayout {
 82    fn rank(&self) -> Rank {
 83        self.rank_out()
 84    }
 85}
 86
 87impl GGLWEInfos for GLWETensorKeyLayout {
 88    fn rank_in(&self) -> Rank {
 89        self.rank
 90    }
 91
 92    fn dsize(&self) -> Dsize {
 93        self.dsize
 94    }
 95
 96    fn rank_out(&self) -> Rank {
 97        self.rank
 98    }
 99
100    fn dnum(&self) -> Dnum {
101        self.dnum
102    }
103}
104
105impl<D: DataRef> fmt::Debug for GLWETensorKey<D> {
106    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
107        write!(f, "{self}")
108    }
109}
110
111impl<D: DataMut> FillUniform for GLWETensorKey<D> {
112    fn fill_uniform(&mut self, log_bound: usize, source: &mut Source) {
113        self.0.fill_uniform(log_bound, source)
114    }
115}
116
117impl<D: DataRef> fmt::Display for GLWETensorKey<D> {
118    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
119        writeln!(f, "(GLWETensorKey)",)?;
120        write!(f, "{}", self.0)?;
121        Ok(())
122    }
123}
124
125impl GLWETensorKey<Vec<u8>> {
126    pub fn alloc_from_infos<A>(infos: &A) -> Self
127    where
128        A: GGLWEInfos,
129    {
130        assert_eq!(
131            infos.rank_in(),
132            infos.rank_out(),
133            "rank_in != rank_out is not supported for GGLWETensorKey"
134        );
135        Self::alloc(
136            infos.n(),
137            infos.base2k(),
138            infos.k(),
139            infos.rank(),
140            infos.dnum(),
141            infos.dsize(),
142        )
143    }
144
145    pub fn alloc(n: Degree, base2k: Base2K, k: TorusPrecision, rank: Rank, dnum: Dnum, dsize: Dsize) -> Self {
146        let pairs: u32 = (((rank.0 + 1) * rank.0) >> 1).max(1);
147        GLWETensorKey(GGLWE::alloc(n, base2k, k, Rank(pairs), rank, dnum, dsize))
148    }
149
150    pub fn bytes_of_from_infos<A>(infos: &A) -> usize
151    where
152        A: GGLWEInfos,
153    {
154        assert_eq!(
155            infos.rank_in(),
156            infos.rank_out(),
157            "rank_in != rank_out is not supported for GGLWETensorKey"
158        );
159        Self::bytes_of(
160            infos.n(),
161            infos.base2k(),
162            infos.k(),
163            infos.rank(),
164            infos.dnum(),
165            infos.dsize(),
166        )
167    }
168
169    pub fn bytes_of(n: Degree, base2k: Base2K, k: TorusPrecision, rank: Rank, dnum: Dnum, dsize: Dsize) -> usize {
170        let pairs: u32 = (((rank.0 + 1) * rank.0) >> 1).max(1);
171        GGLWE::bytes_of(n, base2k, k, Rank(pairs), rank, dnum, dsize)
172    }
173}
174
175impl<D: DataMut> ReaderFrom for GLWETensorKey<D> {
176    fn read_from<R: std::io::Read>(&mut self, reader: &mut R) -> std::io::Result<()> {
177        self.0.read_from(reader)?;
178        Ok(())
179    }
180}
181
182impl<D: DataRef> WriterTo for GLWETensorKey<D> {
183    fn write_to<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
184        self.0.write_to(writer)?;
185        Ok(())
186    }
187}
188
189impl<D: DataRef> GGLWEToRef for GLWETensorKey<D>
190where
191    GGLWE<D>: GGLWEToRef,
192{
193    fn to_ref(&self) -> GGLWE<&[u8]> {
194        self.0.to_ref()
195    }
196}
197
198impl<D: DataMut> GGLWEToMut for GLWETensorKey<D>
199where
200    GGLWE<D>: GGLWEToMut,
201{
202    fn to_mut(&mut self) -> GGLWE<&mut [u8]> {
203        self.0.to_mut()
204    }
205}