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}