diff --git a/compiler/include/concretelang/Support/CompilationFeedback.h b/compiler/include/concretelang/Support/CompilationFeedback.h index bf93d0ff1..bbebe5250 100644 --- a/compiler/include/concretelang/Support/CompilationFeedback.h +++ b/compiler/include/concretelang/Support/CompilationFeedback.h @@ -22,6 +22,12 @@ using StringError = ::concretelang::error::StringError; struct CompilationFeedback { double complexity; + /// @brief Probability of error for every PBS. + double pError; + + /// @brief Probability of error for the whole programs. + double globalPError; + /// @brief the total number of bytes of secret keys uint64_t totalSecretKeysSize; diff --git a/compiler/lib/Bindings/Python/CompilerAPIModule.cpp b/compiler/lib/Bindings/Python/CompilerAPIModule.cpp index be9c1203c..1822b1644 100644 --- a/compiler/lib/Bindings/Python/CompilerAPIModule.cpp +++ b/compiler/lib/Bindings/Python/CompilerAPIModule.cpp @@ -76,6 +76,9 @@ void mlir::concretelang::python::populateCompilerAPISubmodule( m, "CompilationFeedback") .def_readonly("complexity", &mlir::concretelang::CompilationFeedback::complexity) + .def_readonly("p_error", &mlir::concretelang::CompilationFeedback::pError) + .def_readonly("global_p_error", + &mlir::concretelang::CompilationFeedback::globalPError) .def_readonly( "total_secret_keys_size", &mlir::concretelang::CompilationFeedback::totalSecretKeysSize) diff --git a/compiler/lib/Bindings/Python/concrete/compiler/compilation_feedback.py b/compiler/lib/Bindings/Python/concrete/compiler/compilation_feedback.py index ec5e77d54..e0bbe10df 100644 --- a/compiler/lib/Bindings/Python/concrete/compiler/compilation_feedback.py +++ b/compiler/lib/Bindings/Python/concrete/compiler/compilation_feedback.py @@ -31,6 +31,8 @@ class CompilationFeedback(WrapperCpp): ) self.complexity = compilation_feedback.complexity + self.p_error = compilation_feedback.p_error + self.global_p_error = compilation_feedback.global_p_error self.total_secret_keys_size = compilation_feedback.total_secret_keys_size self.total_bootstrap_keys_size = compilation_feedback.total_bootstrap_keys_size self.total_keyswitch_keys_size = compilation_feedback.total_keyswitch_keys_size diff --git a/compiler/lib/Support/CompilationFeedback.cpp b/compiler/lib/Support/CompilationFeedback.cpp index 9ca87a8cf..fb9a7b8f5 100644 --- a/compiler/lib/Support/CompilationFeedback.cpp +++ b/compiler/lib/Support/CompilationFeedback.cpp @@ -84,6 +84,8 @@ CompilationFeedback::load(std::string jsonPath) { llvm::json::Value toJSON(const mlir::concretelang::CompilationFeedback &v) { llvm::json::Object object{ {"complexity", v.complexity}, + {"pError", v.pError}, + {"globalPError", v.globalPError}, {"totalSecretKeysSize", v.totalSecretKeysSize}, {"totalBootstrapKeysSize", v.totalBootstrapKeysSize}, {"totalKeyswitchKeysSize", v.totalKeyswitchKeysSize}, @@ -97,7 +99,8 @@ llvm::json::Value toJSON(const mlir::concretelang::CompilationFeedback &v) { bool fromJSON(const llvm::json::Value j, mlir::concretelang::CompilationFeedback &v, llvm::json::Path p) { llvm::json::ObjectMapper O(j, p); - return O && O.map("complexity", v.complexity) && + return O && O.map("complexity", v.complexity) && O.map("pError", v.pError) && + O.map("globalPError", v.globalPError) && O.map("totalSecretKeysSize", v.totalSecretKeysSize) && O.map("totalBootstrapKeysSize", v.totalBootstrapKeysSize) && O.map("totalKeyswitchKeysSize", v.totalKeyswitchKeysSize) && diff --git a/compiler/lib/Support/V0Parameters.cpp b/compiler/lib/Support/V0Parameters.cpp index c8dcd40d2..e96fce324 100644 --- a/compiler/lib/Support/V0Parameters.cpp +++ b/compiler/lib/Support/V0Parameters.cpp @@ -241,6 +241,9 @@ llvm::Expected getParameter(optimizer::Description &descr, } feedback.complexity = sol.complexity; + feedback.pError = sol.p_error; + feedback.globalPError = + std::isnan(sol.global_p_error) ? 0 : sol.global_p_error; return params; } diff --git a/compiler/tests/python/test_compilation.py b/compiler/tests/python/test_compilation.py index 49905fa77..1f140bc7f 100644 --- a/compiler/tests/python/test_compilation.py +++ b/compiler/tests/python/test_compilation.py @@ -30,6 +30,14 @@ def run(engine, args, compilation_result, keyset_cache): # Dev compilation_feedback = engine.load_compilation_feedback(compilation_result) assert isinstance(compilation_feedback, CompilationFeedback) + assert isinstance(compilation_feedback.complexity, float) + assert isinstance(compilation_feedback.p_error, float) + assert isinstance(compilation_feedback.global_p_error, float) + assert isinstance(compilation_feedback.total_secret_keys_size, int) + assert isinstance(compilation_feedback.total_bootstrap_keys_size, int) + assert isinstance(compilation_feedback.total_inputs_size, int) + assert isinstance(compilation_feedback.total_output_size, int) + # Client client_parameters = engine.load_client_parameters(compilation_result) key_set = ClientSupport.key_set(client_parameters, keyset_cache)