diff --git a/compilers/concrete-compiler/compiler/lib/Bindings/Python/CompilerAPIModule.cpp b/compilers/concrete-compiler/compiler/lib/Bindings/Python/CompilerAPIModule.cpp index 7206a6f17..923436b90 100644 --- a/compilers/concrete-compiler/compiler/lib/Bindings/Python/CompilerAPIModule.cpp +++ b/compilers/concrete-compiler/compiler/lib/Bindings/Python/CompilerAPIModule.cpp @@ -105,6 +105,35 @@ void mlir::concretelang::python::populateCompilerAPISubmodule( [](CompilationOptions &options, int security_level) { options.optimizerConfig.security = security_level; }) + .def("set_v0_parameter", + [](CompilationOptions &options, size_t glweDimension, + size_t logPolynomialSize, size_t nSmall, size_t brLevel, + size_t brLogBase, size_t ksLevel, size_t ksLogBase) { + options.v0Parameter = {glweDimension, logPolynomialSize, nSmall, + brLevel, brLogBase, ksLevel, + ksLogBase, std::nullopt}; + }) + .def("set_v0_parameter", + [](CompilationOptions &options, size_t glweDimension, + size_t logPolynomialSize, size_t nSmall, size_t brLevel, + size_t brLogBase, size_t ksLevel, size_t ksLogBase, + mlir::concretelang::CRTDecomposition crtDecomposition, + size_t cbsLevel, size_t cbsLogBase, size_t pksLevel, + size_t pksLogBase, size_t pksInputLweDimension, + size_t pksOutputPolynomialSize) { + mlir::concretelang::PackingKeySwitchParameter pksParam = { + pksInputLweDimension, pksOutputPolynomialSize, pksLevel, + pksLogBase}; + mlir::concretelang::CitcuitBoostrapParameter crbParam = { + cbsLevel, cbsLogBase}; + mlir::concretelang::WopPBSParameter wopPBSParam = {pksParam, + crbParam}; + mlir::concretelang::LargeIntegerParameter largeIntegerParam = { + crtDecomposition, wopPBSParam}; + options.v0Parameter = {glweDimension, logPolynomialSize, nSmall, + brLevel, brLogBase, ksLevel, + ksLogBase, largeIntegerParam}; + }) .def("simulation", [](CompilationOptions &options, bool simulate) { options.simulate = simulate; }); diff --git a/compilers/concrete-compiler/compiler/lib/Bindings/Python/concrete/compiler/compilation_options.py b/compilers/concrete-compiler/compiler/lib/Bindings/Python/concrete/compiler/compilation_options.py index 0b8157364..49e04b69c 100644 --- a/compilers/concrete-compiler/compiler/lib/Bindings/Python/concrete/compiler/compilation_options.py +++ b/compilers/concrete-compiler/compiler/lib/Bindings/Python/concrete/compiler/compilation_options.py @@ -3,6 +3,8 @@ """CompilationOptions.""" +from typing import List + # pylint: disable=no-name-in-module,import-error from mlir._mlir_libs._concretelang._compiler import ( CompilationOptions as _CompilationOptions, @@ -212,6 +214,142 @@ class CompilationOptions(WrapperCpp): raise TypeError("can't set security_level to a non-int value") self.cpp().set_security_level(security_level) + def set_v0_parameter( + self, + glwe_dim: int, + log_poly_size: int, + n_small: int, + br_level: int, + br_log_base: int, + ks_level: int, + ks_log_base: int, + ): + """Set the basic V0 parameters. + + Args: + glwe_dim (int): GLWE dimension + log_poly_size (int): log of polynomial size + n_small (int): n + br_level (int): bootstrap level + br_log_base (int): bootstrap base log + ks_level (int): keyswitch level + ks_log_base (int): keyswitch base log + + Raises: + TypeError: if parameters are not of type int + """ + if not isinstance(glwe_dim, int): + raise TypeError("glwe_dim need to be an integer") + if not isinstance(log_poly_size, int): + raise TypeError("log_poly_size need to be an integer") + if not isinstance(n_small, int): + raise TypeError("n_small need to be an integer") + if not isinstance(br_level, int): + raise TypeError("br_level need to be an integer") + if not isinstance(br_log_base, int): + raise TypeError("br_log_base need to be an integer") + if not isinstance(ks_level, int): + raise TypeError("ks_level need to be an integer") + if not isinstance(ks_log_base, int): + raise TypeError("ks_log_base need to be an integer") + self.cpp().set_v0_parameter( + glwe_dim, + log_poly_size, + n_small, + br_level, + br_log_base, + ks_level, + ks_log_base, + ) + + # pylint: disable=too-many-arguments,too-many-branches + + def set_all_v0_parameter( + self, + glwe_dim: int, + log_poly_size: int, + n_small: int, + br_level: int, + br_log_base: int, + ks_level: int, + ks_log_base: int, + crt_decomp: List[int], + cbs_level: int, + cbs_log_base: int, + pks_level: int, + pks_log_base: int, + pks_input_lwe_dim: int, + pks_output_poly_size: int, + ): + """Set all the V0 parameters. + + Args: + glwe_dim (int): GLWE dimension + log_poly_size (int): log of polynomial size + n_small (int): n + br_level (int): bootstrap level + br_log_base (int): bootstrap base log + ks_level (int): keyswitch level + ks_log_base (int): keyswitch base log + crt_decomp (List[int]): CRT decomposition vector + cbs_level (int): circuit bootstrap level + cbs_log_base (int): circuit bootstrap base log + pks_level (int): packing keyswitch level + pks_log_base (int): packing keyswitch base log + pks_input_lwe_dim (int): packing keyswitch input LWE dimension + pks_output_poly_size (int): packing keyswitch output polynomial size + + Raises: + TypeError: if parameters are not of type int + """ + if not isinstance(glwe_dim, int): + raise TypeError("glwe_dim need to be an integer") + if not isinstance(log_poly_size, int): + raise TypeError("log_poly_size need to be an integer") + if not isinstance(n_small, int): + raise TypeError("n_small need to be an integer") + if not isinstance(br_level, int): + raise TypeError("br_level need to be an integer") + if not isinstance(br_log_base, int): + raise TypeError("br_log_base need to be an integer") + if not isinstance(ks_level, int): + raise TypeError("ks_level need to be an integer") + if not isinstance(ks_log_base, int): + raise TypeError("ks_log_base need to be an integer") + if not isinstance(crt_decomp, list): + raise TypeError("crt_decomp need to be a list of integers") + if not isinstance(cbs_level, int): + raise TypeError("cbs_level need to be an integer") + if not isinstance(cbs_log_base, int): + raise TypeError("cbs_log_base need to be an integer") + if not isinstance(pks_level, int): + raise TypeError("pks_level need to be an integer") + if not isinstance(pks_log_base, int): + raise TypeError("pks_log_base need to be an integer") + if not isinstance(pks_input_lwe_dim, int): + raise TypeError("pks_input_lwe_dim need to be an integer") + if not isinstance(pks_output_poly_size, int): + raise TypeError("pks_output_poly_size need to be an integer") + self.cpp().set_v0_parameter( + glwe_dim, + log_poly_size, + n_small, + br_level, + br_log_base, + ks_level, + ks_log_base, + crt_decomp, + cbs_level, + cbs_log_base, + pks_level, + pks_log_base, + pks_input_lwe_dim, + pks_output_poly_size, + ) + + # pylint: enable=too-many-arguments,too-many-branches + + def simulation(self, simulate: bool): """Enable or disable simulation.