From 90d2550c65e554294fc80102b2a9cdd7f13c6627 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 10 Aug 2021 09:46:42 +0100 Subject: [PATCH] something like this --- cpp/gen_cpp.py | 122 ++++++++++++++++--------------------------------- 1 file changed, 40 insertions(+), 82 deletions(-) diff --git a/cpp/gen_cpp.py b/cpp/gen_cpp.py index 7d5819800..ac041dfbb 100644 --- a/cpp/gen_cpp.py +++ b/cpp/gen_cpp.py @@ -1,9 +1,13 @@ from V0Parameters.compile_test import check_codegen from V0Parameters.tabulation import main_optimization_v0 from V0Parameters.compile_test import check_codegen -from V0Parameters.misc import NORM2_MAX, P_MAX, v0_parameters_path +from v0curves import curves import numpy as np +# define the number of security levels in curves +num_sec_levels = len(curves) + + import_string = f""" #include @@ -13,50 +17,35 @@ using namespace std;""" constant_string = f""" const int num_sec_levels = {num_sec_levels};""" -struct_string = """ -typedef struct V0Parameter -{ - int k; - int polynomialSize; - int nSmall; - int brLevel; - int brLogBase; - int ksLevel; - int ksLogBase; - V0Parameter(int k_, - int polynomialSize_, - int nSmall_, - int brLevel_, - int brLogBase_, - int ksLevel_, - int ksLogBase_) +struct_string = """ +typedef struct v0curves +{ + int rlweDimension; + int polynomialSize; + + v0curves(int rlweDimension, + int polynomialSize_) { - k = k_; + rlweDimension = rlweDimension_; polynomialSize = polynomialSize_; - nSmall = nSmall_; - brLevel = brLevel_; - brLogBase = brLogBase_; - ksLevel = ksLevel_; - ksLogBase = ksLogBase_; } -} V0Parameter;""" +} v0curves;""" table_string = """ -V0Parameter parameters[NORM2_MAX][P_MAX] = """ +v0curves parameters[num_sec_levels] = """ + get_string = """ -extern "C" V0Parameter *get(int norm, int p) +extern "C" int security_estimator(int rlweDimension, int polynomialSize) { - // - 1 is an offset as norm and p are in [1, ...] and not [0, ...] - return ¶meters[norm - 1][p - 1]; }""" -def constructor(k, polynomialSize, nSmall, brLevel, brLogBase, ksLevel, ksLogBase): - return f"V0Parameter({k}, {polynomialSize}, {nSmall}, {brLevel}, {brLogBase}, {ksLevel}, {ksLogBase})," +def constructor(rlweDimension, polynomialSize): + return f"v0curves({rlweDimension}, {polynomialSize})," def fill_parameters( @@ -65,21 +54,18 @@ def fill_parameters( rlwe_dimension_results, ): parameters = "{}{{".format(table_string) - for norm in range(1, NORM2_MAX + 1): + for security_level in range(num_sec_levels): line = "{" - for p in range(1, P_MAX + 1): - try: - line += constructor( - 1, - int(polynomial_size_results[(norm, p)]), - int(lwe_dimension_results[(norm, p)]), - int(br_level_results[(norm, p)]), - int(br_logbase_results[(norm, p)]), - int(ks_level_results[(norm, p)]), - int(ks_logbase_results[(norm, p)]), - ) - except ValueError: - line += constructor(0, 0, 0, 0, 0, 0, 0) + + try: + line += constructor( + 1, + int(polynomial_size_results[security_level]), + int(rlwe_dimension_results[security_level]), + + ) + except ValueError: + line += constructor(0, 0) line = line[:-1] line += "}," parameters += line @@ -90,11 +76,7 @@ def fill_parameters( def codegen( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results, ): # Generate the C++ file as a string code = f""" @@ -103,11 +85,7 @@ def codegen( {struct_string} {fill_parameters( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results, )} {get_string} """ @@ -116,23 +94,15 @@ def codegen( def write_codegen( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results, ): # Create the c++ source code = codegen( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results, ) - - with open(f"{v0_parameters_path}/parameters.cpp", "w") as f: + # TODO: insert correct filename here with a path + with open(f"test.cpp", "w") as f: f.write(code) print("> Successfully wrote C++ source to disk") @@ -141,29 +111,17 @@ def main_codegen(): # finding parameters for V0 ( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results ) = main_optimization_v0() # code generation write_codegen( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results ) # check code gen worked check_codegen( polynomial_size_results, - lwe_dimension_results, - ks_base_results, - ks_level_results, - br_base_results, - br_level_results, + rlwe_dimension_results )