Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix noise in woppbs #592

Merged
merged 2 commits into from
Nov 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions backends/concrete-cpu/implementation/include/concrete-cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,12 @@ void simulation_circuit_bootstrap_boolean_vertical_packing_lwe_ciphertext_u64(co
uint64_t glwe_dimension,
uint64_t log_poly_size,
uint64_t lwe_dimension,
uint64_t pbs_level,
uint64_t pbs_log_base,
uint64_t cb_level,
uint64_t cb_log_base,
uint64_t pp_level,
uint64_t pp_log_base,
uint32_t ciphertext_modulus_log,
uint64_t security_level);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,12 @@ pub unsafe extern "C" fn simulation_circuit_bootstrap_boolean_vertical_packing_l
glwe_dimension: u64,
log_poly_size: u64,
lwe_dimension: u64,
pbs_level: u64,
pbs_log_base: u64,
cb_level: u64,
cb_log_base: u64,
pp_level: u64,
pp_log_base: u64,
ciphertext_modulus_log: u32,
security_level: u64,
) {
Expand All @@ -76,8 +80,12 @@ pub unsafe extern "C" fn simulation_circuit_bootstrap_boolean_vertical_packing_l
glwe_dimension,
log_poly_size,
lwe_dimension,
pbs_level,
pbs_log_base,
cb_level,
cb_log_base,
pp_level,
pp_log_base,
ciphertext_modulus_log,
security_level,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::implementation::{from_torus, zip_eq};
use concrete_cpu_noise_model::gaussian_noise::noise::blind_rotate::variance_blind_rotate;
use concrete_cpu_noise_model::gaussian_noise::noise::keyswitch::variance_keyswitch;
use concrete_cpu_noise_model::gaussian_noise::noise::modulus_switching::estimate_modulus_switching_noise_with_binary_key;
use concrete_cpu_noise_model::gaussian_noise::noise::private_packing_keyswitch::estimate_packing_private_keyswitch;
use concrete_csprng::generators::{RandomGenerator, SoftwareRandomGenerator};
use concrete_csprng::seeders::Seed;
use concrete_security_curves::gaussian::security::{minimal_variance_glwe, minimal_variance_lwe};
Expand Down Expand Up @@ -410,8 +411,13 @@ fn log2(a: usize) -> usize {
pub fn blind_rotate(
log_poly_size: u64,
glwe_dimension: u64,
lwe_dimension: u64,
fpks_log_base: u64,
fpks_level: u64,
cb_log_base: u64,
cb_level: u64,
pbs_log_base: u64,
pbs_level: u64,
lookup_table: &mut [u64],
ggsw_list: &[u64],
ciphertext_modulus_log: u32,
Expand Down Expand Up @@ -441,6 +447,29 @@ pub fn blind_rotate(
security_level,
);

let blind_rotate_variance = variance_blind_rotate(
lwe_dimension,
glwe_dimension,
polynomial_size,
pbs_log_base,
pbs_level,
ciphertext_modulus_log,
53,
variance_bsk,
);

let ppks_variance = estimate_packing_private_keyswitch(
0.,
variance_bsk,
fpks_log_base,
fpks_level,
glwe_dimension,
polynomial_size,
ciphertext_modulus_log,
);

let ggsw_variance = blind_rotate_variance + ppks_variance;

let vertical_packing_variance = variance_blind_rotate(
ggsw_list.len() as u64,
glwe_dimension,
Expand All @@ -449,7 +478,7 @@ pub fn blind_rotate(
cb_level,
ciphertext_modulus_log,
53,
variance_bsk,
ggsw_variance,
);

let (vertical_packing_variance, _) =
Expand All @@ -470,8 +499,13 @@ pub fn vertical_packing(
ggsw_list: &[u64],
log_poly_size: u64,
glwe_dimension: u64,
lwe_dimension: u64,
fpks_log_base: u64,
fpks_level: u64,
cb_log_base: u64,
cb_level: u64,
pbs_log_base: u64,
pbs_level: u64,
ciphertext_modulus_log: u32,
security_level: u64,
sw_csprng: &mut SoftwareRandomGenerator,
Expand Down Expand Up @@ -534,8 +568,13 @@ pub fn vertical_packing(
blind_rotate(
log_poly_size,
glwe_dimension,
lwe_dimension,
fpks_log_base,
fpks_level,
cb_log_base,
cb_level,
pbs_log_base,
pbs_level,
&mut cmux_tree_lut_res,
br_ggsw,
ciphertext_modulus_log,
Expand All @@ -558,8 +597,12 @@ pub fn circuit_bootstrap_boolean_vertical_packing(
glwe_dimension: u64,
log_poly_size: u64,
lwe_dimension: u64,
pbs_level: u64,
pbs_log_base: u64,
cb_level: u64,
cb_log_base: u64,
pp_level: u64,
pp_log_base: u64,
ciphertext_modulus_log: u32,
security_level: u64,
) {
Expand All @@ -584,8 +627,13 @@ pub fn circuit_bootstrap_boolean_vertical_packing(
&ggsw_list,
log_poly_size,
glwe_dimension,
lwe_dimension,
pp_log_base,
pp_level,
cb_log_base,
cb_level,
pbs_log_base,
pbs_level,
ciphertext_modulus_log,
security_level,
sw_csprng,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ void sim_wop_pbs_crt(
// Additional crypto parameters
uint32_t lwe_small_dim, uint32_t cbs_level_count, uint32_t cbs_base_log,
uint32_t ksk_level_count, uint32_t ksk_base_log, uint32_t bsk_level_count,
uint32_t bsk_base_log, uint32_t polynomial_size, uint32_t glwe_dim);
uint32_t bsk_base_log, uint32_t polynomial_size, uint32_t pksk_base_log,
uint32_t pksk_level_count, uint32_t glwe_dim);

void sim_encode_expand_lut_for_boostrap(
uint64_t *in_allocated, uint64_t *in_aligned, uint64_t in_offset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,10 @@ struct WopPBSGLWEOpPattern
wopPbs.getLoc(), adaptor.getBsk().getLevels(), 32);
auto bskBaseLogCst = rewriter.create<mlir::arith::ConstantIntOp>(
wopPbs.getLoc(), adaptor.getBsk().getBaseLog(), 32);
auto fpkskLevelCountCst = rewriter.create<mlir::arith::ConstantIntOp>(
wopPbs.getLoc(), adaptor.getPksk().getLevels(), 32);
auto fpkskBaseLogCst = rewriter.create<mlir::arith::ConstantIntOp>(
wopPbs.getLoc(), adaptor.getPksk().getBaseLog(), 32);
auto polySizeCst = rewriter.create<mlir::arith::ConstantIntOp>(
wopPbs.getLoc(), adaptor.getPksk().getOutputPolySize(), 32);
auto glweDimCst = rewriter.create<mlir::arith::ConstantIntOp>(
Expand All @@ -370,6 +374,7 @@ struct WopPBSGLWEOpPattern
rewriter.getIntegerType(32), rewriter.getIntegerType(32),
rewriter.getIntegerType(32), rewriter.getIntegerType(32),
rewriter.getIntegerType(32), rewriter.getIntegerType(32),
rewriter.getIntegerType(32), rewriter.getIntegerType(32),
rewriter.getIntegerType(32), rewriter.getIntegerType(32)},
{}))
.failed()) {
Expand All @@ -382,7 +387,7 @@ struct WopPBSGLWEOpPattern
crtDecompValue, lweDimCst, cbsLevelCountCst,
cbsBaseLogCst, kskLevelCountCst, kskBaseLogCst,
bskLevelCountCst, bskBaseLogCst, polySizeCst,
glweDimCst}));
fpkskLevelCountCst, fpkskBaseLogCst, glweDimCst}));

rewriter.replaceOp(wopPbs, outputBuffer);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@ void sim_wop_pbs_crt(
// Additional crypto parameters
uint32_t lwe_small_dim, uint32_t cbs_level_count, uint32_t cbs_base_log,
uint32_t ksk_level_count, uint32_t ksk_base_log, uint32_t bsk_level_count,
uint32_t bsk_base_log, uint32_t polynomial_size, uint32_t glwe_dim) {
uint32_t bsk_base_log, uint32_t polynomial_size, uint32_t pksk_base_log,
uint32_t pksk_level_count, uint32_t glwe_dim) {

// Check number of blocks
assert(out_size == in_size && out_size == crt_decomp_size);
Expand Down Expand Up @@ -174,8 +175,8 @@ void sim_wop_pbs_crt(
simulation_circuit_bootstrap_boolean_vertical_packing_lwe_ciphertext_u64(
extract_bits_output_buffer, out_aligned + out_offset, ct_in_count,
ct_out_count, lut_size, lut_count, lut_ct_aligned + lut_ct_offset,
glwe_dim, log_poly_size, lwe_small_dim, cbs_level_count, cbs_base_log, 64,
128);
glwe_dim, log_poly_size, lwe_small_dim, bsk_level_count, bsk_base_log,
cbs_level_count, cbs_base_log, pksk_level_count, pksk_base_log, 64, 128);
}

uint64_t sim_neg_lwe_u64(uint64_t plaintext) { return ~plaintext + 1; }
Expand Down