mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-09 12:15:09 -05:00
feat(cpp_interface): add Options struct
This commit is contained in:
@@ -21,15 +21,10 @@ fn no_dag_solution() -> ffi::DagSolution {
|
||||
}
|
||||
}
|
||||
|
||||
fn optimize_bootstrap(
|
||||
precision: u64,
|
||||
security_level: u64,
|
||||
noise_factor: f64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
) -> ffi::Solution {
|
||||
fn optimize_bootstrap(precision: u64, noise_factor: f64, options: ffi::Options) -> ffi::Solution {
|
||||
let config = Config {
|
||||
security_level,
|
||||
maximum_acceptable_error_probability,
|
||||
security_level: options.security_level,
|
||||
maximum_acceptable_error_probability: options.maximum_acceptable_error_probability,
|
||||
ciphertext_modulus_log: 64,
|
||||
complexity_model: &CpuComplexity::default(),
|
||||
};
|
||||
@@ -44,7 +39,7 @@ fn optimize_bootstrap(
|
||||
config,
|
||||
noise_factor,
|
||||
&search_space,
|
||||
&decomposition::cache(security_level),
|
||||
&decomposition::cache(options.security_level),
|
||||
);
|
||||
result
|
||||
.best_solution
|
||||
@@ -203,14 +198,10 @@ impl OperationDag {
|
||||
.into()
|
||||
}
|
||||
|
||||
fn optimize_v0(
|
||||
&self,
|
||||
security_level: u64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
) -> ffi::Solution {
|
||||
fn optimize_v0(&self, options: ffi::Options) -> ffi::Solution {
|
||||
let config = Config {
|
||||
security_level,
|
||||
maximum_acceptable_error_probability,
|
||||
security_level: options.security_level,
|
||||
maximum_acceptable_error_probability: options.maximum_acceptable_error_probability,
|
||||
ciphertext_modulus_log: 64,
|
||||
complexity_model: &CpuComplexity::default(),
|
||||
};
|
||||
@@ -221,34 +212,29 @@ impl OperationDag {
|
||||
&self.0,
|
||||
config,
|
||||
&search_space,
|
||||
&decomposition::cache(security_level),
|
||||
&decomposition::cache(options.security_level),
|
||||
);
|
||||
result
|
||||
.best_solution
|
||||
.map_or_else(no_solution, |solution| solution.into())
|
||||
}
|
||||
|
||||
fn optimize(
|
||||
&self,
|
||||
security_level: u64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
default_log_norm2_woppbs: f64,
|
||||
) -> ffi::DagSolution {
|
||||
fn optimize(&self, options: ffi::Options) -> ffi::DagSolution {
|
||||
let config = Config {
|
||||
security_level,
|
||||
maximum_acceptable_error_probability,
|
||||
security_level: options.security_level,
|
||||
maximum_acceptable_error_probability: options.maximum_acceptable_error_probability,
|
||||
ciphertext_modulus_log: 64,
|
||||
complexity_model: &CpuComplexity::default(),
|
||||
};
|
||||
|
||||
let search_space = SearchSpace::default();
|
||||
let cache = decomposition::cache(security_level);
|
||||
let cache = decomposition::cache(options.security_level);
|
||||
|
||||
let result = concrete_optimizer::optimization::dag::solo_key::optimize_generic::optimize(
|
||||
&self.0,
|
||||
config,
|
||||
&search_space,
|
||||
default_log_norm2_woppbs,
|
||||
options.default_log_norm2_woppbs,
|
||||
&cache,
|
||||
);
|
||||
result.map_or_else(no_dag_solution, |solution| solution.into())
|
||||
@@ -286,12 +272,7 @@ mod ffi {
|
||||
extern "Rust" {
|
||||
|
||||
#[namespace = "concrete_optimizer::v0"]
|
||||
fn optimize_bootstrap(
|
||||
precision: u64,
|
||||
security_level: u64,
|
||||
noise_factor: f64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
) -> Solution;
|
||||
fn optimize_bootstrap(precision: u64, noise_factor: f64, options: Options) -> Solution;
|
||||
|
||||
#[namespace = "concrete_optimizer::utils"]
|
||||
fn convert_to_dag_solution(solution: &Solution) -> DagSolution;
|
||||
@@ -330,18 +311,9 @@ mod ffi {
|
||||
comment: &str,
|
||||
) -> OperatorIndex;
|
||||
|
||||
fn optimize_v0(
|
||||
self: &OperationDag,
|
||||
security_level: u64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
) -> Solution;
|
||||
fn optimize_v0(self: &OperationDag, options: Options) -> Solution;
|
||||
|
||||
fn optimize(
|
||||
self: &OperationDag,
|
||||
security_level: u64,
|
||||
maximum_acceptable_error_probability: f64,
|
||||
default_log_norm2_woppbs: f64,
|
||||
) -> DagSolution;
|
||||
fn optimize(self: &OperationDag, options: Options) -> DagSolution;
|
||||
|
||||
fn dump(self: &OperationDag) -> String;
|
||||
|
||||
@@ -393,4 +365,12 @@ mod ffi {
|
||||
pub cb_decomposition_base_log: u64,
|
||||
pub crt_decomposition: Vec<u64>,
|
||||
}
|
||||
|
||||
#[namespace = "concrete_optimizer"]
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct Options {
|
||||
pub security_level: u64,
|
||||
pub maximum_acceptable_error_probability: f64,
|
||||
pub default_log_norm2_woppbs: f64,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -941,6 +941,7 @@ union MaybeUninit {
|
||||
namespace concrete_optimizer {
|
||||
struct OperationDag;
|
||||
struct Weights;
|
||||
struct Options;
|
||||
namespace dag {
|
||||
struct OperatorIndex;
|
||||
struct DagSolution;
|
||||
@@ -958,8 +959,8 @@ struct OperationDag final : public ::rust::Opaque {
|
||||
::concrete_optimizer::dag::OperatorIndex add_lut(::concrete_optimizer::dag::OperatorIndex input, ::rust::Slice<const ::std::uint64_t> table, ::std::uint8_t out_precision) noexcept;
|
||||
::concrete_optimizer::dag::OperatorIndex add_dot(::rust::Slice<const ::concrete_optimizer::dag::OperatorIndex> inputs, ::rust::Box<::concrete_optimizer::Weights> weights) noexcept;
|
||||
::concrete_optimizer::dag::OperatorIndex add_levelled_op(::rust::Slice<const ::concrete_optimizer::dag::OperatorIndex> inputs, double lwe_dim_cost_factor, double fixed_cost, double manp, ::rust::Slice<const ::std::uint64_t> out_shape, ::rust::Str comment) noexcept;
|
||||
::concrete_optimizer::v0::Solution optimize_v0(::std::uint64_t security_level, double maximum_acceptable_error_probability) const noexcept;
|
||||
::concrete_optimizer::dag::DagSolution optimize(::std::uint64_t security_level, double maximum_acceptable_error_probability, double default_log_norm2_woppbs) const noexcept;
|
||||
::concrete_optimizer::v0::Solution optimize_v0(::concrete_optimizer::Options options) const noexcept;
|
||||
::concrete_optimizer::dag::DagSolution optimize(::concrete_optimizer::Options options) const noexcept;
|
||||
::rust::String dump() const noexcept;
|
||||
~OperationDag() = delete;
|
||||
|
||||
@@ -1044,9 +1045,20 @@ struct DagSolution final {
|
||||
#endif // CXXBRIDGE1_STRUCT_concrete_optimizer$dag$DagSolution
|
||||
} // namespace dag
|
||||
|
||||
#ifndef CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
#define CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
struct Options final {
|
||||
::std::uint64_t security_level;
|
||||
double maximum_acceptable_error_probability;
|
||||
double default_log_norm2_woppbs;
|
||||
|
||||
using IsRelocatable = ::std::true_type;
|
||||
};
|
||||
#endif // CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
|
||||
namespace v0 {
|
||||
extern "C" {
|
||||
::concrete_optimizer::v0::Solution concrete_optimizer$v0$cxxbridge1$optimize_bootstrap(::std::uint64_t precision, ::std::uint64_t security_level, double noise_factor, double maximum_acceptable_error_probability) noexcept;
|
||||
::concrete_optimizer::v0::Solution concrete_optimizer$v0$cxxbridge1$optimize_bootstrap(::std::uint64_t precision, double noise_factor, ::concrete_optimizer::Options options) noexcept;
|
||||
} // extern "C"
|
||||
} // namespace v0
|
||||
|
||||
@@ -1076,9 +1088,9 @@ extern "C" {
|
||||
|
||||
::concrete_optimizer::dag::OperatorIndex concrete_optimizer$cxxbridge1$OperationDag$add_levelled_op(::concrete_optimizer::OperationDag &self, ::rust::Slice<const ::concrete_optimizer::dag::OperatorIndex> inputs, double lwe_dim_cost_factor, double fixed_cost, double manp, ::rust::Slice<const ::std::uint64_t> out_shape, ::rust::Str comment) noexcept;
|
||||
|
||||
::concrete_optimizer::v0::Solution concrete_optimizer$cxxbridge1$OperationDag$optimize_v0(const ::concrete_optimizer::OperationDag &self, ::std::uint64_t security_level, double maximum_acceptable_error_probability) noexcept;
|
||||
::concrete_optimizer::v0::Solution concrete_optimizer$cxxbridge1$OperationDag$optimize_v0(const ::concrete_optimizer::OperationDag &self, ::concrete_optimizer::Options options) noexcept;
|
||||
|
||||
void concrete_optimizer$cxxbridge1$OperationDag$optimize(const ::concrete_optimizer::OperationDag &self, ::std::uint64_t security_level, double maximum_acceptable_error_probability, double default_log_norm2_woppbs, ::concrete_optimizer::dag::DagSolution *return$) noexcept;
|
||||
void concrete_optimizer$cxxbridge1$OperationDag$optimize(const ::concrete_optimizer::OperationDag &self, ::concrete_optimizer::Options options, ::concrete_optimizer::dag::DagSolution *return$) noexcept;
|
||||
|
||||
void concrete_optimizer$cxxbridge1$OperationDag$dump(const ::concrete_optimizer::OperationDag &self, ::rust::String *return$) noexcept;
|
||||
::std::size_t concrete_optimizer$cxxbridge1$Weights$operator$sizeof() noexcept;
|
||||
@@ -1092,8 +1104,8 @@ extern "C" {
|
||||
} // namespace weights
|
||||
|
||||
namespace v0 {
|
||||
::concrete_optimizer::v0::Solution optimize_bootstrap(::std::uint64_t precision, ::std::uint64_t security_level, double noise_factor, double maximum_acceptable_error_probability) noexcept {
|
||||
return concrete_optimizer$v0$cxxbridge1$optimize_bootstrap(precision, security_level, noise_factor, maximum_acceptable_error_probability);
|
||||
::concrete_optimizer::v0::Solution optimize_bootstrap(::std::uint64_t precision, double noise_factor, ::concrete_optimizer::Options options) noexcept {
|
||||
return concrete_optimizer$v0$cxxbridge1$optimize_bootstrap(precision, noise_factor, options);
|
||||
}
|
||||
} // namespace v0
|
||||
|
||||
@@ -1135,13 +1147,13 @@ namespace dag {
|
||||
return concrete_optimizer$cxxbridge1$OperationDag$add_levelled_op(*this, inputs, lwe_dim_cost_factor, fixed_cost, manp, out_shape, comment);
|
||||
}
|
||||
|
||||
::concrete_optimizer::v0::Solution OperationDag::optimize_v0(::std::uint64_t security_level, double maximum_acceptable_error_probability) const noexcept {
|
||||
return concrete_optimizer$cxxbridge1$OperationDag$optimize_v0(*this, security_level, maximum_acceptable_error_probability);
|
||||
::concrete_optimizer::v0::Solution OperationDag::optimize_v0(::concrete_optimizer::Options options) const noexcept {
|
||||
return concrete_optimizer$cxxbridge1$OperationDag$optimize_v0(*this, options);
|
||||
}
|
||||
|
||||
::concrete_optimizer::dag::DagSolution OperationDag::optimize(::std::uint64_t security_level, double maximum_acceptable_error_probability, double default_log_norm2_woppbs) const noexcept {
|
||||
::concrete_optimizer::dag::DagSolution OperationDag::optimize(::concrete_optimizer::Options options) const noexcept {
|
||||
::rust::MaybeUninit<::concrete_optimizer::dag::DagSolution> return$;
|
||||
concrete_optimizer$cxxbridge1$OperationDag$optimize(*this, security_level, maximum_acceptable_error_probability, default_log_norm2_woppbs, &return$.value);
|
||||
concrete_optimizer$cxxbridge1$OperationDag$optimize(*this, options, &return$.value);
|
||||
return ::std::move(return$.value);
|
||||
}
|
||||
|
||||
|
||||
@@ -922,6 +922,7 @@ std::size_t align_of() {
|
||||
namespace concrete_optimizer {
|
||||
struct OperationDag;
|
||||
struct Weights;
|
||||
struct Options;
|
||||
namespace dag {
|
||||
struct OperatorIndex;
|
||||
struct DagSolution;
|
||||
@@ -939,8 +940,8 @@ struct OperationDag final : public ::rust::Opaque {
|
||||
::concrete_optimizer::dag::OperatorIndex add_lut(::concrete_optimizer::dag::OperatorIndex input, ::rust::Slice<const ::std::uint64_t> table, ::std::uint8_t out_precision) noexcept;
|
||||
::concrete_optimizer::dag::OperatorIndex add_dot(::rust::Slice<const ::concrete_optimizer::dag::OperatorIndex> inputs, ::rust::Box<::concrete_optimizer::Weights> weights) noexcept;
|
||||
::concrete_optimizer::dag::OperatorIndex add_levelled_op(::rust::Slice<const ::concrete_optimizer::dag::OperatorIndex> inputs, double lwe_dim_cost_factor, double fixed_cost, double manp, ::rust::Slice<const ::std::uint64_t> out_shape, ::rust::Str comment) noexcept;
|
||||
::concrete_optimizer::v0::Solution optimize_v0(::std::uint64_t security_level, double maximum_acceptable_error_probability) const noexcept;
|
||||
::concrete_optimizer::dag::DagSolution optimize(::std::uint64_t security_level, double maximum_acceptable_error_probability, double default_log_norm2_woppbs) const noexcept;
|
||||
::concrete_optimizer::v0::Solution optimize_v0(::concrete_optimizer::Options options) const noexcept;
|
||||
::concrete_optimizer::dag::DagSolution optimize(::concrete_optimizer::Options options) const noexcept;
|
||||
::rust::String dump() const noexcept;
|
||||
~OperationDag() = delete;
|
||||
|
||||
@@ -1025,8 +1026,19 @@ struct DagSolution final {
|
||||
#endif // CXXBRIDGE1_STRUCT_concrete_optimizer$dag$DagSolution
|
||||
} // namespace dag
|
||||
|
||||
#ifndef CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
#define CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
struct Options final {
|
||||
::std::uint64_t security_level;
|
||||
double maximum_acceptable_error_probability;
|
||||
double default_log_norm2_woppbs;
|
||||
|
||||
using IsRelocatable = ::std::true_type;
|
||||
};
|
||||
#endif // CXXBRIDGE1_STRUCT_concrete_optimizer$Options
|
||||
|
||||
namespace v0 {
|
||||
::concrete_optimizer::v0::Solution optimize_bootstrap(::std::uint64_t precision, ::std::uint64_t security_level, double noise_factor, double maximum_acceptable_error_probability) noexcept;
|
||||
::concrete_optimizer::v0::Solution optimize_bootstrap(::std::uint64_t precision, double noise_factor, ::concrete_optimizer::Options options) noexcept;
|
||||
} // namespace v0
|
||||
|
||||
namespace utils {
|
||||
|
||||
@@ -17,10 +17,17 @@ const double PRECISION_16B = 16;
|
||||
const double WOP_FALLBACK_LOG_NORM = 8;
|
||||
const double NOISE_DEVIATION_COEFF = 1.0;
|
||||
|
||||
concrete_optimizer::Options default_options() {
|
||||
concrete_optimizer::Options options;
|
||||
options.security_level = SECURITY_128B;
|
||||
options.maximum_acceptable_error_probability = P_ERROR;
|
||||
return options;
|
||||
}
|
||||
|
||||
void test_v0() {
|
||||
concrete_optimizer::v0::Solution solution =
|
||||
concrete_optimizer::v0::optimize_bootstrap(
|
||||
PRECISION_1B, SECURITY_128B, NOISE_DEVIATION_COEFF, P_ERROR);
|
||||
PRECISION_1B, NOISE_DEVIATION_COEFF, default_options());
|
||||
|
||||
assert(solution.glwe_polynomial_size == 1024);
|
||||
}
|
||||
@@ -43,7 +50,7 @@ void test_dag_no_lut() {
|
||||
concrete_optimizer::dag::OperatorIndex node2 =
|
||||
dag->add_dot(slice(inputs), std::move(weights));
|
||||
|
||||
auto solution = dag->optimize_v0(SECURITY_128B, P_ERROR);
|
||||
auto solution = dag->optimize_v0(default_options());
|
||||
assert(solution.glwe_polynomial_size == 1024);
|
||||
}
|
||||
|
||||
@@ -59,7 +66,7 @@ void test_dag_lut() {
|
||||
concrete_optimizer::dag::OperatorIndex node2 =
|
||||
dag->add_lut(input, slice(table), PRECISION_8B);
|
||||
|
||||
auto solution = dag->optimize(SECURITY_128B, P_ERROR, WOP_FALLBACK_LOG_NORM);
|
||||
auto solution = dag->optimize(default_options());
|
||||
assert(solution.glwe_dimension == 1);
|
||||
assert(solution.glwe_polynomial_size == 8192);
|
||||
assert(!solution.use_wop_pbs);
|
||||
@@ -77,7 +84,7 @@ void test_dag_lut_wop() {
|
||||
concrete_optimizer::dag::OperatorIndex node2 =
|
||||
dag->add_lut(input, slice(table), PRECISION_16B);
|
||||
|
||||
auto solution = dag->optimize(SECURITY_128B, P_ERROR, WOP_FALLBACK_LOG_NORM);
|
||||
auto solution = dag->optimize(default_options());
|
||||
assert(solution.glwe_dimension == 2);
|
||||
assert(solution.glwe_polynomial_size == 1024);
|
||||
assert(solution.use_wop_pbs);
|
||||
|
||||
Reference in New Issue
Block a user