feat(optimizer): multiparameters compiler entry point

This commit is contained in:
rudy
2023-03-23 11:56:34 +01:00
committed by Quentin Bourgerie
parent 3e05aa47a4
commit d2a342fc84
10 changed files with 475 additions and 88 deletions

View File

@@ -109,7 +109,7 @@ void test_dag_lut_force_wop() {
assert(!solution.crt_decomposition.empty());
}
void test_multi_parameters() {
void test_multi_parameters_1_precision() {
auto dag = concrete_optimizer::dag::empty();
std::vector<uint64_t> shape = {3};
@@ -122,8 +122,53 @@ void test_multi_parameters() {
auto options = default_options();
auto circuit_solution = dag->optimize_multi(options);
auto secret_keys = circuit_solution.circuit_keys.keyswitch_keys;
assert(!secret_keys.empty());
assert(circuit_solution.is_feasible);
auto secret_keys = circuit_solution.circuit_keys.secret_keys;
assert(circuit_solution.circuit_keys.secret_keys.size() == 2);
assert(circuit_solution.circuit_keys.secret_keys[0].identifier == 0);
assert(circuit_solution.circuit_keys.secret_keys[1].identifier == 1);
assert(circuit_solution.circuit_keys.bootstrap_keys.size() == 1);
assert(circuit_solution.circuit_keys.keyswitch_keys.size() == 1);
assert(circuit_solution.circuit_keys.keyswitch_keys[0].identifier == 0);
assert(circuit_solution.circuit_keys.keyswitch_keys[0].identifier == 0);
assert(circuit_solution.circuit_keys.conversion_keyswitch_keys.size() == 0);
}
void test_multi_parameters_2_precision() {
auto dag = concrete_optimizer::dag::empty();
std::vector<uint64_t> shape = {3};
concrete_optimizer::dag::OperatorIndex input1 =
dag->add_input(PRECISION_8B, slice(shape));
concrete_optimizer::dag::OperatorIndex input2 =
dag->add_input(PRECISION_1B, slice(shape));
std::vector<u_int64_t> table = {};
auto lut1 = dag->add_lut(input1, slice(table), PRECISION_8B);
auto lut2 = dag->add_lut(input2, slice(table), PRECISION_8B);
std::vector<concrete_optimizer::dag::OperatorIndex> inputs = {lut1, lut2};
std::vector<int64_t> weight_vec = {1, 1};
rust::cxxbridge1::Box<concrete_optimizer::Weights> weights =
concrete_optimizer::weights::vector(slice(weight_vec));
dag->add_dot(slice(inputs), std::move(weights));
auto options = default_options();
auto circuit_solution = dag->optimize_multi(options);
assert(circuit_solution.is_feasible);
auto secret_keys = circuit_solution.circuit_keys.secret_keys;
assert(circuit_solution.circuit_keys.secret_keys.size() == 4);
assert(circuit_solution.circuit_keys.bootstrap_keys.size() == 2);
assert(circuit_solution.circuit_keys.keyswitch_keys.size() == 2); // 1 layer so less ks
std::string actual = circuit_solution.circuit_keys.conversion_keyswitch_keys[0].description.c_str();
std::string expected = "fks[1->0]";
assert(actual == expected);
}
int main() {
@@ -132,7 +177,8 @@ int main() {
test_dag_lut();
test_dag_lut_wop();
test_dag_lut_force_wop();
test_multi_parameters();
test_multi_parameters_1_precision();
test_multi_parameters_2_precision();
return 0;
}