fix: when both sol.p_error and sol.global_p_error are near 0

This commit is contained in:
rudy
2022-09-21 12:09:32 +02:00
committed by rudy-6-4
parent e1fb417c54
commit 08ed2fc49b

View File

@@ -43,10 +43,17 @@ optimizer::DagSolution getV1ParameterGlobalPError(optimizer::Dag &dag,
auto ref_global_p_success = 1.0 - config.global_p_error;
auto sol = dag->optimize(config.security, ref_p_error,
config.fallback_log_norm_woppbs);
if (sol.global_p_error <= config.global_p_error) {
// for levelled circuit the error is almost zero
return sol;
}
for (int i = 2; i <= MAXIMUM_OPTIMIZER_CALL; i++) {
auto local_p_success = 1.0 - sol.p_error;
auto global_p_success = 1.0 - sol.global_p_error;
auto power_global_to_local = log(local_p_success) / log(global_p_success);
if (std::isnan(power_global_to_local)) {
break;
}
auto surrogate_p_local_success =
pow(ref_global_p_success, power_global_to_local);
config.p_error = 1.0 - surrogate_p_local_success;