arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/core/src/lwe/secret.rs
core/src/lwe/secret.rsRaw
 1use backend::hal::{
 2    api::{ZnxInfos, ZnxZero},
 3    layouts::{Data, DataMut, ScalarZnx},
 4};
 5use sampling::source::Source;
 6
 7use crate::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: Data> LWESecret<D> {
24    pub fn n(&self) -> usize {
25        self.data.n()
26    }
27
28    pub fn log_n(&self) -> usize {
29        self.data.log_n()
30    }
31
32    pub fn rank(&self) -> usize {
33        self.data.cols()
34    }
35}
36
37impl<D: DataMut> LWESecret<D> {
38    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
39        self.data.fill_ternary_prob(0, prob, source);
40        self.dist = Distribution::TernaryProb(prob);
41    }
42
43    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
44        self.data.fill_ternary_hw(0, hw, source);
45        self.dist = Distribution::TernaryFixed(hw);
46    }
47
48    pub fn fill_binary_prob(&mut self, prob: f64, source: &mut Source) {
49        self.data.fill_binary_prob(0, prob, source);
50        self.dist = Distribution::BinaryProb(prob);
51    }
52
53    pub fn fill_binary_hw(&mut self, hw: usize, source: &mut Source) {
54        self.data.fill_binary_hw(0, hw, source);
55        self.dist = Distribution::BinaryFixed(hw);
56    }
57
58    pub fn fill_binary_block(&mut self, block_size: usize, source: &mut Source) {
59        self.data.fill_binary_block(0, block_size, source);
60        self.dist = Distribution::BinaryBlock(block_size);
61    }
62
63    pub fn fill_zero(&mut self) {
64        self.data.zero();
65        self.dist = Distribution::ZERO;
66    }
67}