poulpy/CHANGELOG.md
CHANGELOG.mdRaw
1# CHANGELOG
2
3## [0.4.2] - 2025-12-21
4
5## `poulpy-core`
6- Add `GLWEMulPlain` trait:
7 - `glwe_mul_plain_tmp_bytes`
8 - `glwe_mul_plain`
9 - `glwe_mul_plain_inplace`
10- Add `GLWEMulConst` trait:
11 - `glwe_mul_const_tmp_bytes`
12 - `glwe_mul_const`
13 - `glwe_mul_const_inplace`
14- Add `GLWETensoring` trait:
15 - `glwe_tensor_apply_tmp_bytes`
16 - `glwe_tensor_apply`
17 - `glwe_tensor_relinearize_tmp_bytes`
18 - `glwe_tensor_relinearize`
19- Add method tests:
20 - `test_glwe_tensoring`
21
22## `poulpy-hal`
23- Removed `Backend` generic from `VecZnxBigAllocBytesImpl`.
24- Add `CnvPVecL` and `CnvPVecR` structs.
25- Add `CnvPVecBytesOf` and `CnvPVecAlloc` traits.
26- Add `Convolution` trait, which regroups the following methods:
27 - `cnv_prepare_left_tmp_bytes`
28 - `cnv_prepare_left`
29 - `cnv_prepare_right_tmp_bytes`
30 - `cnv_prepare_right`
31 - `cnv_by_const_apply`
32 - `cnv_by_const_apply_tmp_bytes`
33 - `cnv_apply_dft_tmp_bytes`
34 - `cnv_apply_dft`
35 - `cnv_pairwise_apply_dft_tmp_bytes`
36 - `cnv_pairwise_apply_dft`
37- Add the following Reim4 traits:
38 - `Reim4Convolution`
39 - `Reim4Convolution1Coeff`
40 - `Reim4Convolution2Coeffs`
41 - `Reim4Save1BlkContiguous`
42- Add the following traits:
43 - `i64Save1BlkContiguous`
44 - `i64Extract1BlkContiguous`
45 - `i64ConvolutionByConst1Coeff`
46 - `i64ConvolutionByConst2Coeffs`
47- Update signature `Reim4Extract1Blk` to `Reim4Extract1BlkContiguous`.
48- Add fft64 backend reference code for
49 - `reim4_save_1blk_to_reim_contiguous_ref`
50 - `reim4_convolution_1coeff_ref`
51 - `reim4_convolution_2coeffs_ref`
52 - `convolution_prepare_left`
53 - `convolution_prepare_right`
54 - `convolution_apply_dft_tmp_bytes`
55 - `convolution_apply_dft`
56 - `convolution_pairwise_apply_dft_tmp_bytes`
57 - `convolution_pairwise_apply_dft`
58 - `convolution_by_const_apply_tmp_bytes`
59 - `convolution_by_const_apply`
60- Add `take_cnv_pvec_left` and `take_cnv_pvec_right` methods to `ScratchTakeBasic` trait.
61- Add the following tests methods for convolution:
62 - `test_convolution`
63 - `test_convolution_by_const`
64 - `test_convolution_pairwise`
65- Add the following benches methods for convolution:
66 - `bench_cnv_prepare_left`
67 - `bench_cnv_prepare_right`
68 - `bench_cnv_apply_dft`
69 - `bench_cnv_pairwise_apply_dft`
70 - `bench_cnv_by_const`
71- Update normalization API and OEP to take `res_offset: i64`. This allows the user to specify a bit-shift (positive or negative) applied to the normalization. Behavior-wise, the bit-shift is applied before the normalization (i.e. before applying mod 1 reduction). Since this is an API break, opportunity was taken to also re-order inputs for better consistency.
72 - `VecZnxNormalize` & `VecZnxNormalizeImpl`
73 - `VecZnxBigNormalize` & `VecZnxBigNormalizeImpl`
74 This change completes the road to unlocking full support for cross-base2k normalization, along with arbitrary positive/negative offset. Code is not ensured to be optimal, but correctness is ensured.
75
76## `poulpy-cpu-ref`
77- Implemented `ConvolutionImpl` OPE on `FFT64Ref` backend.
78- Add benchmark for convolution.
79- Add test for convolution.
80
81## `poulpy-cpu-avx`
82- Implemented `ConvolutionImpl` OPE on `FFT64Avx` backend.
83- Add benchmark for convolution.
84- Add test for convolution.
85- Add fft64 AVX code for
86 - `reim4_save_1blk_to_reim_contiguous_avx`
87 - `reim4_convolution_1coeff_avx`
88 - `reim4_convolution_2coeffs_avx`
89
90## [0.4.1] - 2025-11-21
91- Default backend set to `poulpy-cpu-ref`, `poulpy-cpu-avx` is not anymore built and compiled by default.
92- To build & use `poulpy-cpu-avx` user must use feature flag, see `poulpy-cpu-ref` and `poulpy-cpu-avx` READMEs.
93
94## [0.4.0] - 2025-11-20
95
96### Summary
97- Full support for base2k operations.
98- Many improvements to BDD arithmetic.
99- Removal of **poulpy-backend** & spqlios backend.
100- Addition of individual crates for each specific backend.
101- Some minor bug fixes.
102
103### `poulpy-hal`
104- Add cross-base2k normalization
105
106### `poulpy-core`
107- Add full support for automatic cross-base2k operations & updated tests accordingly.
108- Updated noise helper API.
109- Fixed many tests that didn't assess noise correctly.
110- Fixed decoding function to use arithmetic rounded division instead of arithmetic right shift.
111- Fixed packing to clean values correctly.
112
113### `poulpy-schemes`
114- Renamed `tfhe` crate to `bin_fhe`.
115- Improved support & API for BDD arithmetic, including multi-thread acceleration.
116- Updated crate to support cross-base2k operations.
117- Add additional operations, such as splice_u8, splice_u16 and sign extension.
118- Add `GLWEBlindRetriever` and `GLWEBlindRetrieval`: a `GGSW`-based blind reversible retrieval (enables to instantiate encrypted ROM/RAM like object).
119- Improved Cmux speed
120
121### `poulpy-cpu-ref`
122- A new crate that provides the reference CPU implementation of **poulpy-hal**. This replaces the previous **poulpy-backend/cpu_ref**.
123
124### `poulpy-cpu-avx`
125- A new crate that provides an AVX/FMA accelerated CPU implementation of **poulpy-hal**. This replaces the previous **poulpy-backend/cpu_avx**.
126
127### `poulpy-schemes`
128 - Added `sign` argument to GGSW-based blind rotation, which enables to choose the rotation direction of the test vector.
129
130## [0.3.2] - 2025-10-27
131
132### `poulpy-hal`
133- Improved convolution functionality
134
135### `poulpy-core`
136 - Rename `GLWEToLWESwitchingKey` to `GLWEToLWEKey`.
137 - Rename `LWEToGLWESwitchingKey` to `LWEToGLWEKey`.
138 - Add `GLWESecretTensor` which stores the flattened upper right of the tensor matrix of the pairs `sk[i] * sk[j]`.
139 - Add `GGLWEToGGSWKey`, `GGLWEToGGSWKeyPrepared`, `GGLWEToGGSWKeyCompressed`, which encrypts the full tensor matrix of all pairs `sk[i] * sk[j]`, with one `GGLWE` per row.
140 - Update `GGLWEToGGSW` API to take `GGLWEToGGSWKey` instead of the `GLWETensorKey`
141 - Add `GLWETensor`, the result of tensoring two `GLWE` of identical rank.
142 - Changed `GLWETensorKey` to be an encryption of `GLWESecretTensor` (preliminary work for `GLWEFromGLWETensor`, a.k.a relinearization).
143
144### `poulpy-schemes`
145 - Add `GLWEBlindRotation`, a `GGSW`-based blind rotation that evaluates `GLWE <- GLWE * X^{((k>>bit_rsh) % 2^bit_mask) << bit_lsh}.` (`k` = `FheUintBlocksPrepared`).
146 - Add `GGSWBlindRotation`, a `GGSW`-based blind rotation that evaluates `GGSW <- (GGSW or ScalarZnx) * X^{((k>>bit_rsh) % 2^bit_mask) << bit_lsh}.` (`k` = `FheUintBlocksPrepared`).
147
148## [0.3.1] - 2025-10-24
149
150### `poulpy-hal`
151 - Add bivariate convolution (X, Y) / (X^{N} + 1) with Y = 2^-K
152
153### `poulpy-core`
154 - Fix typo in impl of GGLWEToRef for GLWEAutomorphismKey that required the data to be mutable.
155
156## [0.3.0] - 2025-10-23
157
158- Fixed builds on MACOS
159
160### Breaking changes
161 - The changes to `poulpy-core` required to break some of the existing API. For example the API `prepare_alloc` has been removed and the trait `Prepare<...>` has been broken down for each different ciphertext type (e.g. GLWEPrepare). To achieve the same functionality, the user must allocated the prepared ciphertext, and then call prepare on it.
162
163### `poulpy-hal`
164 - Added cross-base2k normalization
165
166### `poulpy-core`
167 - Added functionality-based traits, which removes the need to import the low-levels traits of `poulpy-hal` and makes backend agnostic code much cleaner. For example instead of having to import each individual traits required for the encryption of a GLWE, only the trait `GLWEEncryptSk` is needed.
168
169### `poulpy-schemes`
170 - Added basic framework for binary decision circuit (BDD) arithmetic along with some operations.
171
172## [0.2.0] - 2025-09-15
173
174### Breaking changes
175 - Updated the trait `FillUniform` to take `log_bound`.
176
177### `poulpy-hal`
178 - Added pure Rust reference code for `vec_znx` and `fft64` backend.
179 - Added cross-backend generic test suite along with macros.
180 - Added benchmark generic test suite.
181
182### `poulpy-backend`
183 - Added `FFTRef` backend, which provides an implementation relying on the reference code of `poulpy-hal`.
184 - Added `FFTAvx` backend, which provides a pure Rust AVX/FMA accelerated implementation of `FFTRef` backend.
185 - Added cross-backend tests between `FFTRef` and `FFTAvx`.
186 - Added cross-backend tests between `FFTRef` and `FFT64Spqlios`.
187
188### `poulpy-core`
189 - Removed unsafe blocks.
190 - Added tests suite for `FFTRef` and `FFTAvx` backends.
191
192### Other
193 - Fixed a few minor bugs.
194
195## [0.1.0] - 2025-08-25
196 - Initial release.