something like this

This commit is contained in:
Ben
2021-08-10 09:46:42 +01:00
parent f72baa4b0c
commit 90d2550c65

View File

@@ -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 <iostream>
@@ -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 &parameters[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
)