diff --git a/concrete-optimizer-cpp/src/concrete-optimizer.rs b/concrete-optimizer-cpp/src/concrete-optimizer.rs index cd33a89b4..6a663ce99 100644 --- a/concrete-optimizer-cpp/src/concrete-optimizer.rs +++ b/concrete-optimizer-cpp/src/concrete-optimizer.rs @@ -131,7 +131,7 @@ impl From for ffi::DagSolution { use_wop_pbs: true, cb_decomposition_level_count: sol.cb_decomposition_level_count, cb_decomposition_base_log: sol.cb_decomposition_base_log, - crt_decomposition: vec![], + crt_decomposition: sol.crt_decomposition, }, } } diff --git a/concrete-optimizer/src/optimization/dag/solo_key/optimize_generic.rs b/concrete-optimizer/src/optimization/dag/solo_key/optimize_generic.rs index 24b1fd744..4e5dcd830 100644 --- a/concrete-optimizer/src/optimization/dag/solo_key/optimize_generic.rs +++ b/concrete-optimizer/src/optimization/dag/solo_key/optimize_generic.rs @@ -66,13 +66,12 @@ pub fn optimize( } else if max_precision > MAXIMAL_WOP_PRECISION { None } else { - let fallback_16b_precision = 16; let default_log_norm = default_log_norm2_woppbs; let worst_log_norm = analyze::worst_log_norm(dag); let nb_luts = analyze::lut_count_from_dag(dag); let log_norm = default_log_norm.min(worst_log_norm); let opt_sol = wop_optimize::( - fallback_16b_precision, + max_precision as u64, security_level, log_norm, maximum_acceptable_error_probability, diff --git a/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs b/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs index f9bc2ed62..9dc16cde2 100644 --- a/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs +++ b/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs @@ -44,7 +44,7 @@ pub struct OptimizationState { pub count_domain: usize, } -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Debug)] pub struct Solution { pub input_lwe_dimension: u64, //n_big @@ -69,6 +69,7 @@ pub struct Solution { // error probability pub cb_decomposition_level_count: u64, pub cb_decomposition_base_log: u64, + pub crt_decomposition: Vec, } impl Solution { @@ -88,6 +89,7 @@ impl Solution { global_p_error: 0.0, cb_decomposition_level_count: 0, cb_decomposition_base_log: 0, + crt_decomposition: vec![], } } } @@ -241,8 +243,14 @@ fn update_state_with_best_decompositions( return; } - let mut best_complexity = state.best_solution.map_or(f64::INFINITY, |s| s.complexity); - let mut best_variance = state.best_solution.map_or(f64::INFINITY, |s| s.noise_max); + let mut best_complexity = state + .best_solution + .as_ref() + .map_or(f64::INFINITY, |s| s.complexity); + let mut best_variance = state + .best_solution + .as_ref() + .map_or(f64::INFINITY, |s| s.noise_max); let variance_cost_opt = compute_noise_cost_by_micro_param::( consts, @@ -437,6 +445,7 @@ fn update_state_with_best_decompositions( global_p_error: f64::NAN, cb_decomposition_level_count: circuit_pbs_decomposition_parameter.level, cb_decomposition_base_log: circuit_pbs_decomposition_parameter.log2_base, + crt_decomposition: vec![], }); } } @@ -535,7 +544,7 @@ pub fn optimize_one( let nb_words = partitionning.len() as u64; let max_word_precision = *partitionning.iter().max().unwrap() as u64; let n_functions = 1; - optimize_raw::( + let mut state = optimize_raw::( max_word_precision, log_norm, security_level, @@ -545,7 +554,12 @@ pub fn optimize_one( internal_lwe_dimensions, n_functions, nb_words, // Tau - ) + ); + state.best_solution = state.best_solution.map(|mut sol| -> Solution { + sol.crt_decomposition = coprimes; + sol + }); + state } #[allow(clippy::too_many_lines)]