From 8ebfccd9a7b8f3f5f5723154f1c2c17242dd397c Mon Sep 17 00:00:00 2001 From: rudy Date: Mon, 6 Mar 2023 09:22:39 +0100 Subject: [PATCH] fix: global_p_error fails on big 16b circuits Resolve zama-ai/concrete-numpy-internal#1858 --- .../compiler/lib/Support/V0Parameters.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/compilers/concrete-compiler/compiler/lib/Support/V0Parameters.cpp b/compilers/concrete-compiler/compiler/lib/Support/V0Parameters.cpp index d5118adde..d58f5a858 100644 --- a/compilers/concrete-compiler/compiler/lib/Support/V0Parameters.cpp +++ b/compilers/concrete-compiler/compiler/lib/Support/V0Parameters.cpp @@ -76,8 +76,19 @@ optimizer::DagSolution getV1ParameterGlobalPError(optimizer::Dag &dag, auto surrogate_p_local_success = pow(ref_global_p_success, power_global_to_local); - options.maximum_acceptable_error_probability = - 1.0 - surrogate_p_local_success; + auto surrogate_p_error = 1.0 - surrogate_p_local_success; + + // only valid when p_error is not too small + auto valid = 0 < surrogate_p_error && surrogate_p_error < 1.0; + + if (!valid) { + // linear approximation, only precise for small p_error + auto linear_correction = sol.p_error / sol.global_p_error; + surrogate_p_error = + options.maximum_acceptable_error_probability * linear_correction; + }; + + options.maximum_acceptable_error_probability = surrogate_p_error; sol = dag->optimize(options); if (sol.global_p_error <= config.global_p_error) {