Update doc & readme (#122) * update poulpy_arch.svg * update main readme * update lib_diagram.png & main readme * update poulpy-core readme * update backend readmes * update poulpy-hal readme * update poulpy-schemes readme * update CHANGELOG.md
@@ -1,6 +1,37 @@
# CHANGELOG -## [0.3.2] - 2025-10-27 +## [0.4.0] - 2025-10-27 + +### Summary +- Full support for base2k operations. +- Many improvments to BDD arithmetic. +- Removal of **poulpy-backend** & spqlios backend. +- Addition of individual crates for each specific backend. +- Some minor bug fixes. + +### `poulpy-hal` +- Add cross-base2k normalization + +### `poulpy-core` +- Add full support for automatic cross-base2k operations & updated tests accordingly. +- Updated noise helper API. +- Fixed many tests that didn't assess noise correctly. +- Fixed decoding function to use arithmetic rounded division instead of arithmetic right shift. +- Fixed packing to clean values correctly. + +### `poulpy-schemes` +- Renamed `tfhe` crate to `bin_fhe`. +- Improved support & API for BDD arithmetic, including multi-thread acceleration. +- Updated crate to support cross-base2k operations. +- Add additional operations, such as splice_u8, splice_u16 and sign extension. +- Add `GLWEBlindRetriever` and `GLWEBlindRetrieval`: a `GGSW`-based blind reversible retrieval (enables to instantiate encrypted ROM/RAM like object). +- Improved Cmux speed + +### `poulpy-cpu-ref` +- A new crate that provides the refernce CPU implementation of **poulpy-hal**. This replaces the previous **poulpy-backend/cpu_ref**. + +### `poulpy-cpu-avx` +- A new crate that provides an AVX/FMA accelerated CPU implementation of **poulpy-hal**. This replaces the previous **poulpy-backend/cpu_avx**. ### `poulpy-schemes` - Added `sign` argument to GGSW-based blind rotation, which enables to choose the rotation direction of the test vector.
@@ -17,8 +17,9 @@ ## Library Crates
- **`poulpy-hal`**: a crate providing layouts and a trait-based hardware acceleration layer with open extension points, matching the API and types of spqlios-arithmetic. This crate does not provide concrete implementations other than the layouts (e.g. `VecZnx`, `VmpPmat`). - **`poulpy-core`**: a backend agnostic crate implementing scheme agnostic RLWE arithmetic for LWE, GLWE, GGLWE and GGSW ciphertexts using **`poulpy-hal`**. Can be instantiated with any backend provided by **`poulpy-backend`**. -- **`poulpy-schemes`**: a backend agnostic crate implementing mainstream FHE schemes using **`poulpy-core`** and **`poulpy-hal`**. The crate can be instantiated with any backend provided by **`poulpy-backend`**. -- **`poulpy-backend`**: a crate providing concrete implementations of **`poulpy-hal`** for various representations and hardwares. +- **`poulpy-schemes`**: a backend agnostic crate implementing mainstream FHE schemes using **`poulpy-core`** and **`poulpy-hal`**. +- **`poulpy-cpu-ref`**: the reference CPU implementatin of **`poulpy-hal`**. +- **`poulpy-cpu-ref`**: an AVX accelerated CPU implementation of **`poulpy-hal`**. ## Bivariate Polynomial Representation@@ -43,7 +44,8 @@
- **`poulpy-hal`**: https://crates.io/crates/poulpy-hal - **`poulpy-core`**: https://crates.io/crates/poulpy-core - **`poulpy-schemes`**: https://crates.io/crates/poulpy-schemes -- **`poulpy-backend`**: https://crates.io/crates/poulpy-backend +- **`poulpy-cpu-ref`**: https://crates.io/crates/poulpy-cpu-ref +- **`poulpy-cpu-avx`**: https://crates.io/crates/poulpy-cpu-avx ## Documentation@@ -70,9 +72,9 @@ ## Citing
Please use the following BibTex entry for citing Poulpy @misc{poulpy, - title = {Poulpy v0.3.0}, + title = {Poulpy v0.4.0}, howpublished = {Online: \url{https://github.com/phantomzone-org/poulpy}}, - month = Oct, + month = Nov, year = 2025, note = {Phantom Zone} }
@@ -28,15 +28,15 @@ inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" inkscape:connector-spacing="0" - inkscape:zoom="1.4702523" - inkscape:cx="387.0084" - inkscape:cy="179.56101" + inkscape:zoom="1.0396254" + inkscape:cx="409.76299" + inkscape:cy="148.13028" inkscape:window-width="1781" inkscape:window-height="1214" - inkscape:window-x="1623" - inkscape:window-y="25" + inkscape:window-x="238" + inkscape:window-y="48" inkscape:window-maximized="0" - inkscape:current-layer="layer2" /><defs + inkscape:current-layer="layer1" /><defs id="defs1"><marker style="overflow:visible" id="ArrowTriangleStylized"@@ -262,13 +262,6 @@ ry="0" /></g><g
inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"><rect - style="fill:#a8aaff;fill-opacity:0.53046596;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.2, 0.4;stroke-dashoffset:0;paint-order:stroke fill markers" - id="rect1-5-5" - width="15.565245" - height="19.146524" - x="84.023781" - y="84.629219" - ry="0.93935418" /><rect style="fill:#fea891;fill-opacity:0.988235;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" id="rect1-6" width="34.694923"@@ -307,19 +300,6 @@ style="font-size:3.52778px;line-height:8.23147px;fill:#303030;fill-opacity:1;stroke:none;stroke-width:0.2;stroke-dasharray:none;stroke-opacity:1"
x="115.69688" y="40.44392">LATTICE ARITHMETIC</tspan></text><text xml:space="preserve" - style="font-size:3.52778px;line-height:3.78648px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:36.8671;display:inline;fill:#2d2d2d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers" - x="63.255154" - y="111.84376" - id="text1-1-1" - transform="translate(28.534147,-13.244033)"><tspan - x="63.255154" - y="111.84376" - id="tspan4">spqlios- -</tspan><tspan - x="63.255154" - y="115.63023" - id="tspan12">arithmetic</tspan></text><text - xml:space="preserve" style="font-size:4.23333px;line-height:4.23333px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:35.1767;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" x="63.255154" y="111.84376"@@ -327,19 +307,19 @@ id="text1-8-9-6"
transform="translate(51.948454,-100.41339)"><tspan x="63.255154" y="111.84376" - id="tspan13">Backend Agnostic<tspan + id="tspan4">Backend Agnostic<tspan y="111.84376" - id="tspan14"> </tspan></tspan><tspan + id="tspan5"> </tspan></tspan><tspan x="63.255154" y="116.07709" - id="tspan15">Applications</tspan></text><image + id="tspan6">Applications</tspan></text><image width="8.6626749" height="8.6626749" preserveAspectRatio="none" xlink:href="data:image/png;base64,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 " id="image1" - x="87.495079" - y="85.822609" /><image + x="87.604019" + y="86.295723" /><image width="8.6626749" height="8.6626749" preserveAspectRatio="none"@@ -390,9 +370,9 @@ sodipodi:role="line"
id="tspan2" style="stroke-width:0.9" x="122.01137" - y="30.592821"></tspan></text><path + y="30.592821" /></text><path style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.765;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#ArrowTriangleStylized)" - d="m 114.75405,50.175384 0.10588,12.066228" + d="m 114.75405,48.587883 0.10588,12.066228" id="path14" inkscape:connector-type="polyline" inkscape:connector-curvature="0"@@ -407,13 +387,6 @@ ry="0.93935418" /></g><g
inkscape:groupmode="layer" id="layer2" inkscape:label="Layer 2"><rect - style="fill:#9affd2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.2, 0.4;stroke-dashoffset:0;paint-order:stroke fill markers" - id="rect1-5-3" - width="36.559639" - height="15.809674" - x="96.366692" - y="64.703583" - ry="0" /><rect style="fill:#9affd2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.2, 0.4;stroke-dashoffset:0;paint-order:stroke fill markers" id="rect1-5" width="36.604614"@@ -421,22 +394,6 @@ height="15.877158"
x="35.467823" y="64.703583" ry="0" /><rect - style="fill:#91e6fe;fill-opacity:0.988235;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" - id="rect1-2" - width="34.694912" - height="8.3827906" - x="97.396133" - y="65.948601" - ry="0" /><text - xml:space="preserve" - style="font-size:5.29167px;line-height:12.3472px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:37.1169;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers" - x="63.255154" - y="111.84376" - id="text1-7" - transform="translate(51.780571,-40.099091)"><tspan - x="63.255154" - y="111.84376" - id="tspan16">poulpy-backend</tspan></text><rect style="fill:#9affd2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.2, 0.4;stroke-dashoffset:0;paint-order:stroke fill markers" id="rect1-5-1" width="36.582123"@@ -498,7 +455,46 @@ id="text1"
transform="translate(-9.6712543,-39.845796)"><tspan x="63.255154" y="111.84376" - id="tspan17">poulpy-hal</tspan></text><text + id="tspan7">poulpy-hal</tspan></text><rect + style="fill:#9affd2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:0.2, 0.4;stroke-dashoffset:0;paint-order:stroke fill markers" + id="rect1-5-4" + width="27.517208" + height="19.046377" + x="100.74423" + y="61.080173" + ry="0" /><rect + style="fill:#92e6ff;fill-opacity:0.969231;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" + id="rect1-20-2" + width="24.20676" + height="5.5814385" + x="102.5332" + y="62.53595" + ry="0" /><text + xml:space="preserve" + style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:23.1195;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" + x="63.255154" + y="111.84376" + id="text1-3" + transform="translate(51.289597,-45.340271)"><tspan + x="63.255154" + y="111.84376" + id="tspan8">poulpy-cpu-ref</tspan></text><rect + style="fill:#92e6ff;fill-opacity:0.969231;fill-rule:evenodd;stroke:#000000;stroke-width:0.4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" + id="rect1-20-2-6" + width="24.20676" + height="5.5814385" + x="102.5332" + y="69.17572" + ry="0" /><text + xml:space="preserve" + style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:24.3904;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers" + x="63.255154" + y="111.84376" + id="text1-3-8" + transform="translate(51.289586,-38.700499)"><tspan + x="63.255154" + y="111.84376" + id="tspan9">poulpy-cpu-avx</tspan></text><text xml:space="preserve" style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:36.8671;display:inline;fill:#2d2d2d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers" x="63.255154"@@ -507,18 +503,16 @@ id="text1-1"
transform="translate(-9.5719303,-32.862898)"><tspan x="63.255154" y="111.84376" - id="tspan18">ZNX API</tspan></text><text + id="tspan10">ZNX API DEF.</tspan></text><text xml:space="preserve" style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:36.8671;display:inline;fill:#2d2d2d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers" x="63.255154" y="111.84376" - id="text1-1-0" - transform="translate(51.679143,-32.882948)" - inkscape:transform-center-x="0.6362468" - inkscape:transform-center-y="1.1452442"><tspan + id="text1-1-89" + transform="translate(51.648897,-32.807355)"><tspan x="63.255154" y="111.84376" - id="tspan19">ZNX API</tspan></text><text + id="tspan11">ZNX API IMPL.</tspan></text><text xml:space="preserve" style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:36.8671;display:inline;fill:#2d2d2d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers" x="63.255154"@@ -527,7 +521,7 @@ id="text1-1-8"
transform="translate(-10.163182,-54.843723)"><tspan x="63.255154" y="111.84376" - id="tspan20">RLWE API</tspan></text><text + id="tspan12">RLWE API IMPL.</tspan></text><text xml:space="preserve" style="font-size:4.23333px;line-height:9.87776px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:36.8671;display:inline;fill:#2d2d2d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;paint-order:stroke fill markers" x="63.255154"@@ -536,7 +530,7 @@ id="text1-1-8-4"
transform="translate(-9.6181503,-75.873115)"><tspan x="63.255154" y="111.84376" - id="tspan21">SCHEME API</tspan></text><text + id="tspan13">SCHEME API IMPL.</tspan></text><text xml:space="preserve" style="font-size:5.29167px;line-height:12.3472px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:23.1195;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers" x="63.255154"@@ -545,7 +539,7 @@ id="text1-8"
transform="translate(-10.03551,-62.138412)"><tspan x="63.255154" y="111.84376" - id="tspan22">poulpy-core</tspan></text><text + id="tspan14">poulpy-core</tspan></text><text xml:space="preserve" style="font-size:5.29167px;line-height:12.3472px;font-family:Akrobat;-inkscape-font-specification:Akrobat;text-align:center;writing-mode:lr-tb;direction:ltr;text-anchor:middle;white-space:pre;inline-size:35.1767;display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers" x="63.255154"@@ -554,7 +548,7 @@ id="text1-8-9"
transform="translate(-9.3743876,-83.103301)"><tspan x="63.255154" y="111.84376" - id="tspan23">poulpy-schemes</tspan></text><path + id="tspan15">poulpy-schemes</tspan></text><path style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.264583, 0.264583;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Triangle-1-1-8)" d="M 53.646411,64.703584 V 58.682749" id="path2-3-7-9"
@@ -5,14 +5,14 @@
## Getting Started ```rust -use poulpy_backend::cpu_spqlios::FFT64; use poulpy_core::{ - GLWEOperations, SIGMA, + GLWESub, SIGMA, layouts::{ - GLWECiphertext, GLWEPlaintext, GLWESecret, Infos, - prepared::{GLWESecretPrepared, PrepareAlloc}, + Base2K, Degree, GLWE, GLWELayout, GLWEPlaintext, GLWEPlaintextLayout, GLWESecret, LWEInfos, Rank, TorusPrecision, + prepared::GLWESecretPrepared, }, }; +use poulpy_cpu_ref::FFT64Ref; use poulpy_hal::{ api::{ModuleNew, ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxFillUniform}, layouts::{Module, ScratchOwned},@@ -23,27 +23,36 @@ fn main() {
// Ring degree let log_n: usize = 10; - let n: usize = 1<<log_n; + let n: Degree = Degree(1 << log_n); // Base-2-k (implicit digit decomposition) - let base2k: usize = 14; + let base2k: Base2K = Base2K(14); // Ciphertext Torus precision (equivalent to ciphertext modulus) - let k_ct: usize = 27; + let k_ct: TorusPrecision = TorusPrecision(27); // Plaintext Torus precision (equivament to plaintext modulus) - let k_pt: usize = base2k; + let k_pt: TorusPrecision = TorusPrecision(base2k.into()); // GLWE rank - let rank: usize = 1; + let rank: Rank = Rank(1); // Instantiate Module (DFT Tables) - let module: Module<FFT64> = Module::<FFT64>::new(n as u64); + let module: Module<FFT64Ref> = Module::<FFT64Ref>::new(n.0 as u64); + + let glwe_ct_infos: GLWELayout = GLWELayout { + n, + base2k, + k: k_ct, + rank, + }; + + let glwe_pt_infos: GLWEPlaintextLayout = GLWEPlaintextLayout { n, base2k, k: k_pt }; // Allocates ciphertext & plaintexts - let mut ct: GLWECiphertext<Vec<u8>> = GLWECiphertext::alloc(n, base2k, k_ct, rank); - let mut pt_want: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n, base2k, k_pt); - let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc(n, base2k, k_pt); + let mut ct: GLWE<Vec<u8>> = GLWE::alloc_from_infos(&glwe_ct_infos); + let mut pt_want: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc_from_infos(&glwe_pt_infos); + let mut pt_have: GLWEPlaintext<Vec<u8>> = GLWEPlaintext::alloc_from_infos(&glwe_pt_infos); // CPRNG let mut source_xs: Source = Source::new([0u8; 32]);@@ -51,20 +60,20 @@ let mut source_xe: Source = Source::new([1u8; 32]);
let mut source_xa: Source = Source::new([2u8; 32]); // Scratch space - let mut scratch: ScratchOwned<FFT64> = ScratchOwned::alloc( - GLWECiphertext::encrypt_sk_tmp_bytes(&module, n, base2k, ct.k()) - | GLWECiphertext::decrypt_tmp_bytes(&module, n, base2k, ct.k()), + let mut scratch: ScratchOwned<FFT64Ref> = ScratchOwned::alloc( + GLWE::encrypt_sk_tmp_bytes(&module, &glwe_ct_infos) | GLWE::decrypt_tmp_bytes(&module, &glwe_ct_infos), ); // Generate secret-key - let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc(n, rank); + let mut sk: GLWESecret<Vec<u8>> = GLWESecret::alloc_from_infos(&glwe_ct_infos); sk.fill_ternary_prob(0.5, &mut source_xs); // Backend-prepared secret - let sk_prepared: GLWESecretPrepared<Vec<u8>, FFT64> = sk.prepare_alloc(&module, scratch.borrow()); + let mut sk_prepared: GLWESecretPrepared<Vec<u8>, FFT64Ref> = GLWESecretPrepared::alloc(&module, rank); + sk_prepared.prepare(&module, &sk); // Uniform plaintext - module.vec_znx_fill_uniform(base2k, &mut pt_want.data, 0, k_pt, &mut source_xa); + module.vec_znx_fill_uniform(base2k.into(), &mut pt_want.data, 0, &mut source_xa); // Encryption ct.encrypt_sk(@@ -80,10 +89,10 @@ // Decryption
ct.decrypt(&module, &mut pt_have, &sk_prepared, scratch.borrow()); // Diff between pt - Dec(Enc(pt)) - pt_want.sub_inplace_ab(&module, &pt_have); + module.glwe_sub_inplace(&mut pt_want, &pt_have); // Ideal vs. actual noise - let noise_have: f64 = pt_want.data.std(base2k, 0) * (ct.k() as f64).exp2(); + let noise_have: f64 = pt_want.data.stats(base2k.into(), 0).std() * (ct.k().as_u32() as f64).exp2(); let noise_want: f64 = SIGMA; // Check@@ -169,4 +178,4 @@ ---
## Tests -A fully generic test suite is available in [`src/tests/generics`](./src/tests/generics).+A fully generic test suite is available in [`src/tests/test_suite`](./src/tests/test_suite).
@@ -1,6 +1,6 @@
-# 🐙 Poulpy-Backend +# 🐙 Poulpy-CPU-REF -**Poulpy-Backend-CPU-AVX** is a Rust crate that provides concrete implementations of **`poulpy-hal`**. This crate is used to instantiate projects implemented with **`poulpy-hal`**, **`poulpy-core`** and/or **`poulpy-schemes`**. +**Poulpy-Backend-CPU-AVX** is a Rust crate that provides an AVX accelerated CPU implementation of **`poulpy-hal`**. This crate is used to instantiate projects implemented with **`poulpy-hal`**, **`poulpy-core`** and/or **`poulpy-schemes`**. ## Example@@ -14,5 +14,5 @@ ```
## Contributors -To add a backend, implement the open extension traits from **`poulpy-hal/oep`** for a struct that implements the `Backend` trait. +To add your own backend, implement the open extension traits from **`poulpy-hal/oep`** for a struct that implements the `Backend` trait. This will automatically make your backend compatible with the API of **`poulpy-hal`**, **`poulpy-core`** and **`poulpy-schemes`**.
@@ -1,38 +1,18 @@
-# 🐙 Poulpy-Backend - -**Poulpy-Backend** is a Rust crate that provides concrete implementations of **`poulpy-hal`**. This crate is used to instantiate projects implemented with **`poulpy-hal`**, **`poulpy-core`** and/or **`poulpy-schemes`**. - -## Backends - -### cpu-spqlios - -This module provides a CPU AVX2 accelerated backend through C bindings over [**spqlios-arithmetic**](https://github.com/tfhe/spqlios-arithmetic). - -- Currently supported: `FFT64` backend -- Planned: `NTT120` backend - -### Build Notes - -This backend is built and compiled automatically and has been tested on wsl/ubuntu. - -- `cmake` is invoked automatically by the build script (`build.rs`) when compiling the crate. -- No manual setup is required beyond having a standard Rust toolchain. -- Build options can be changed in `/build/cpu_spqlios.rs` -- Automatic build of cpu-spqlios/spqlios-arithmetic can be disabled in `build.rs`. +# 🐙 Poulpy-CPU-AVX -Spqlios-arithmetic is windows/mac compatible but building for those platforms is slightly different (see [spqlios-arithmetic/wiki/build](https://github.com/tfhe/spqlios-arithmetic/wiki/build)) and has not been tested in Poulpy. +**Poulpy-Backend-CPU-AVX** is a Rust crate that provides the reference CPU implementation of **`poulpy-hal`**. This crate is used to instantiate projects implemented with **`poulpy-hal`**, **`poulpy-core`** and/or **`poulpy-schemes`**. -### Example +## Example ```rust -use poulpy_backend::cpu_spqlios::FFT64; +use poulpy_backend_cpu_ref::FFT64Ref; use poulpy_hal::{api::ModuleNew, layouts::Module}; let log_n: usize = 10; -let module = Module<FFT64> = Module<FFT64>::new(1<<log_n); +let module = Module<FFT64Ref> = Module<FFT64Ref>::new(1<<log_n); ``` ## Contributors -To add a backend, implement the open extension traits from **`poulpy-hal/oep`** for a struct that implements the `Backend` trait. +To add your own backend, implement the open extension traits from **`poulpy-hal/oep`** for a struct that implements the `Backend` trait. This will automatically make your backend compatible with the API of **`poulpy-hal`**, **`poulpy-core`** and **`poulpy-schemes`**.
@@ -82,6 +82,6 @@ C[ScalarZnx] -->|prepare|D[SvpPPol]-->E
E{SvpApply}-->VecZnxDft-->|IDFT|VecZnxBig-->|Normalize|VecZnx ``` -## Testing +## Tests -A full generic and backend agnostic testing suit for the layouts and public API is planned. This will allow to test the correctness of any backend easily.+A fully generic cross-backend test suite is available in [`src/test_suite`](./src/test_suite).
@@ -8,5 +8,8 @@ See [./examples/circuit_bootstrapping.rs](./examples/circuit_bootstrapping.rs)
## Available Schemes -- TFHE/FHEW: under construction. Blind rotation & circuit bootstrapping implemented. -- CKKS: planned+- **BIN FHE**: + - **bdd_arithmetic**: high level API for u32 arithmetic (u8 to u256 planned) using binary decision circuits. Also provides API for blind retrieval, blind rotation (using encpypted integers) and blind selection. + - **blind_rotation**: API for blind rotation (LWE(m) -> GLWE(X^m)) + - **circuit_bootstrapping**: API for circuit bootstrapping (LWE(m) -> GGSW(m) or GGSW(X^m)). +- **CKKS**: planned