arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/layouts/lwe_sk.rs
core/src/layouts/lwe_sk.rsRaw
 1use backend::hal::{
 2    api::{ZnxInfos, ZnxView, ZnxZero},
 3    layouts::{Data, DataMut, DataRef, ScalarZnx},
 4};
 5use sampling::source::Source;
 6
 7use crate::dist::Distribution;
 8
 9pub struct LWESecret<D: Data> {
10    pub(crate) data: ScalarZnx<D>,
11    pub(crate) dist: Distribution,
12}
13
14impl LWESecret<Vec<u8>> {
15    pub fn alloc(n: usize) -> Self {
16        Self {
17            data: ScalarZnx::alloc(n, 1),
18            dist: Distribution::NONE,
19        }
20    }
21}
22
23impl<D: DataRef> LWESecret<D> {
24    pub fn raw(&self) -> &[i64] {
25        self.data.at(0, 0)
26    }
27
28    pub fn dist(&self) -> Distribution {
29        self.dist
30    }
31
32    pub fn data(&self) -> &ScalarZnx<D> {
33        &self.data
34    }
35}
36
37impl<D: Data> LWESecret<D> {
38    pub fn n(&self) -> usize {
39        self.data.n()
40    }
41
42    pub fn log_n(&self) -> usize {
43        self.data.log_n()
44    }
45
46    pub fn rank(&self) -> usize {
47        self.data.cols()
48    }
49}
50
51impl<D: DataMut> LWESecret<D> {
52    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
53        self.data.fill_ternary_prob(0, prob, source);
54        self.dist = Distribution::TernaryProb(prob);
55    }
56
57    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
58        self.data.fill_ternary_hw(0, hw, source);
59        self.dist = Distribution::TernaryFixed(hw);
60    }
61
62    pub fn fill_binary_prob(&mut self, prob: f64, source: &mut Source) {
63        self.data.fill_binary_prob(0, prob, source);
64        self.dist = Distribution::BinaryProb(prob);
65    }
66
67    pub fn fill_binary_hw(&mut self, hw: usize, source: &mut Source) {
68        self.data.fill_binary_hw(0, hw, source);
69        self.dist = Distribution::BinaryFixed(hw);
70    }
71
72    pub fn fill_binary_block(&mut self, block_size: usize, source: &mut Source) {
73        self.data.fill_binary_block(0, block_size, source);
74        self.dist = Distribution::BinaryBlock(block_size);
75    }
76
77    pub fn fill_zero(&mut self) {
78        self.data.zero();
79        self.dist = Distribution::ZERO;
80    }
81}