feat: option to force optimization with a particular encoding

This commit is contained in:
rudy
2022-12-02 11:56:10 +01:00
committed by rudy-6-4
parent 0d7cb97e7e
commit 34764edf50
6 changed files with 115 additions and 25 deletions

View File

@@ -18,11 +18,13 @@ 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;
options.use_gpu_constraints = false;
return options;
return concrete_optimizer::Options {
.security_level = SECURITY_128B,
.maximum_acceptable_error_probability = P_ERROR,
.default_log_norm2_woppbs = WOP_FALLBACK_LOG_NORM,
.use_gpu_constraints = false,
.encoding = concrete_optimizer::Encoding::Auto
};
}
void test_v0() {
@@ -48,8 +50,7 @@ void test_dag_no_lut() {
rust::cxxbridge1::Box<concrete_optimizer::Weights> weights =
concrete_optimizer::weights::vector(slice(weight_vec));
concrete_optimizer::dag::OperatorIndex node2 =
dag->add_dot(slice(inputs), std::move(weights));
dag->add_dot(slice(inputs), std::move(weights));
auto solution = dag->optimize_v0(default_options());
assert(solution.glwe_polynomial_size == 256);
@@ -64,8 +65,7 @@ void test_dag_lut() {
dag->add_input(PRECISION_8B, slice(shape));
std::vector<u_int64_t> table = {};
concrete_optimizer::dag::OperatorIndex node2 =
dag->add_lut(input, slice(table), PRECISION_8B);
dag->add_lut(input, slice(table), PRECISION_8B);
auto solution = dag->optimize(default_options());
assert(solution.glwe_dimension == 1);
@@ -82,8 +82,7 @@ void test_dag_lut_wop() {
dag->add_input(PRECISION_16B, slice(shape));
std::vector<u_int64_t> table = {};
concrete_optimizer::dag::OperatorIndex node2 =
dag->add_lut(input, slice(table), PRECISION_16B);
dag->add_lut(input, slice(table), PRECISION_16B);
auto solution = dag->optimize(default_options());
assert(solution.glwe_dimension == 2);
@@ -91,11 +90,29 @@ void test_dag_lut_wop() {
assert(solution.use_wop_pbs);
}
int main(int argc, char *argv[]) {
void test_dag_lut_force_wop() {
auto dag = concrete_optimizer::dag::empty();
std::vector<uint64_t> shape = {3};
concrete_optimizer::dag::OperatorIndex input =
dag->add_input(PRECISION_8B, slice(shape));
std::vector<u_int64_t> table = {};
dag->add_lut(input, slice(table), PRECISION_8B);
auto options = default_options();
options.encoding = concrete_optimizer::Encoding::Crt;
auto solution = dag->optimize(options);
assert(solution.use_wop_pbs);
}
int main() {
test_v0();
test_dag_no_lut();
test_dag_lut();
test_dag_lut_wop();
test_dag_lut_force_wop();
return 0;
}