From b58821b1d1843d4ac324a75e845b28660a5143ad Mon Sep 17 00:00:00 2001 From: aPere3 Date: Tue, 29 Aug 2023 11:28:20 +0200 Subject: [PATCH] chore(compiler): refactor e2e tlu tests to use dynamic lut. --- .../end_to_end_apply_lookup_table_gen.py | 78 ++++++++++++++++--- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/compilers/concrete-compiler/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py b/compilers/concrete-compiler/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py index 1c59a48cd..17972299c 100644 --- a/compilers/concrete-compiler/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py +++ b/compilers/concrete-compiler/compiler/tests/end_to_end_fixture/end_to_end_apply_lookup_table_gen.py @@ -7,6 +7,19 @@ from end_to_end_linalg_leveled_gen import P_ERROR PRECISION_FORCE_CRT = 9 +def get_lut_integer_type(p): + if p <= 8: + return "i8" + if p <= 16: + return "i16" + if p <= 32: + return "i32" + if p <= 64: + return "i64" + else: + raise Exception("Unexpected precision") + + def generate(args): print("# /!\ DO NOT EDIT MANUALLY THIS FILE MANUALLY") print("# /!\ THIS FILE HAS BEEN GENERATED") @@ -15,13 +28,13 @@ def generate(args): for p in args.bitwidth: max_value = (2 ** p) - 1 random_lut = np.random.randint(max_value+1, size=2**p) + itype = get_lut_integer_type(p) print(f"description: apply_lookup_table_{p}bits") print("program: |") print( - f" func.func @main(%arg0: !FHE.eint<{p}>) -> !FHE.eint<{p}> {{") - print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") + f" func.func @main(%arg0: !FHE.eint<{p}>, %arg1: tensor<{2**p}x{itype}>) -> !FHE.eint<{p}> {{") print( - f" %1 = \"FHE.apply_lookup_table\"(%arg0, %tlu): (!FHE.eint<{p}>, tensor<{2**p}xi64>) -> (!FHE.eint<{p}>)") + f" %1 = \"FHE.apply_lookup_table\"(%arg0, %arg1): (!FHE.eint<{p}>, tensor<{2**p}x{itype}>) -> (!FHE.eint<{p}>)") print(f" return %1: !FHE.eint<{p}>") print(" }") if p >= PRECISION_FORCE_CRT: @@ -31,15 +44,21 @@ def generate(args): print(" - inputs:") random_i = np.random.randint(max_value) print(f" - scalar: {random_i}") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[random_i]}") if not args.minimal: print(" - inputs:") print(" - scalar: 0") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[0]}") print(" - inputs:") print(f" - scalar: {max_value}") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[max_value]}") print("---") @@ -49,13 +68,13 @@ def generate(args): upper_bound = (2 ** (p-1)) - 1 max_value = (2 ** p) - 1 random_lut = np.random.randint(lower_bound, upper_bound, size=2**p) + itype = get_lut_integer_type(p) print(f"description: unsigned_signed_apply_lookup_table_{p}bits") print("program: |") print( - f" func.func @main(%arg0: !FHE.eint<{p}>) -> !FHE.esint<{p}> {{") - print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") + f" func.func @main(%arg0: !FHE.eint<{p}>, %arg1: tensor<{2**p}x{itype}>) -> !FHE.esint<{p}> {{") print( - f" %1 = \"FHE.apply_lookup_table\"(%arg0, %tlu): (!FHE.eint<{p}>, tensor<{2**p}xi64>) -> (!FHE.esint<{p}>)") + f" %1 = \"FHE.apply_lookup_table\"(%arg0, %arg1): (!FHE.eint<{p}>, tensor<{2**p}x{itype}>) -> (!FHE.esint<{p}>)") print(f" return %1: !FHE.esint<{p}>") print(" }") if p >= PRECISION_FORCE_CRT: @@ -65,17 +84,26 @@ def generate(args): print(" - inputs:") random_i = np.random.randint(max_value) print(f" - scalar: {random_i}") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[random_i]}") print(f" signed: true") if not args.minimal: print(" - inputs:") print(" - scalar: 0") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[0]}") print(f" signed: true") print(" - inputs:") print(f" - scalar: {max_value}") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[max_value]}") print(f" signed: true") @@ -85,13 +113,14 @@ def generate(args): lower_bound = -(2 ** (p-1)) upper_bound = (2 ** (p-1)) - 1 random_lut = np.random.randint(lower_bound, upper_bound, size=2**p) + itype = get_lut_integer_type(p) print(f"description: signed_apply_lookup_table_{p}bits") print("program: |") print( - f" func.func @main(%arg0: !FHE.esint<{p}>) -> !FHE.esint<{p}> {{") - print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") + f" func.func @main(%arg0: !FHE.esint<{p}>, %arg1: tensor<{2**p}x{itype}>) -> !FHE.esint<{p}> {{") + print( - f" %1 = \"FHE.apply_lookup_table\"(%arg0, %tlu): (!FHE.esint<{p}>, tensor<{2**p}xi64>) -> (!FHE.esint<{p}>)") + f" %1 = \"FHE.apply_lookup_table\"(%arg0, %arg1): (!FHE.esint<{p}>, tensor<{2**p}x{itype}>) -> (!FHE.esint<{p}>)") print(f" return %1: !FHE.esint<{p}>") print(" }") if p >= PRECISION_FORCE_CRT: @@ -102,6 +131,9 @@ def generate(args): random_i = np.random.randint(lower_bound, upper_bound) print(f" - scalar: {random_i}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[random_i]}") print(f" signed: true") @@ -109,24 +141,36 @@ def generate(args): print(" - inputs:") print(f" - scalar: 0") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[0]}") print(f" signed: true") print(" - inputs:") print(f" - scalar: {upper_bound}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[upper_bound]}") print(f" signed: true") print(" - inputs:") print(f" - scalar: {lower_bound}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[lower_bound]}") print(f" signed: true") print(" - inputs:") print(f" - scalar: -1") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") + print(f" signed: true") print(" outputs:") print(f" - scalar: {random_lut[-1]}") print(f" signed: true") @@ -138,13 +182,13 @@ def generate(args): upper_bound = (2 ** (p-1)) - 1 max_value = (2 ** p) - 1 random_lut = np.random.randint(max_value+1, size=2**p) + itype = get_lut_integer_type(p) print(f"description: signed_unsigned_apply_lookup_table_{p}bits") print("program: |") print( - f" func.func @main(%arg0: !FHE.esint<{p}>) -> !FHE.eint<{p}> {{") - print(f" %tlu = arith.constant dense<[{','.join(map(str, random_lut))}]> : tensor<{2**p}xi64>") + f" func.func @main(%arg0: !FHE.esint<{p}>, %arg1: tensor<{2**p}x{itype}>) -> !FHE.eint<{p}> {{") print( - f" %1 = \"FHE.apply_lookup_table\"(%arg0, %tlu): (!FHE.esint<{p}>, tensor<{2**p}xi64>) -> (!FHE.eint<{p}>)") + f" %1 = \"FHE.apply_lookup_table\"(%arg0, %arg1): (!FHE.esint<{p}>, tensor<{2**p}x{itype}>) -> (!FHE.eint<{p}>)") print(f" return %1: !FHE.eint<{p}>") print(" }") if p >= PRECISION_FORCE_CRT: @@ -155,27 +199,37 @@ def generate(args): random_i = np.random.randint(lower_bound, upper_bound) print(f" - scalar: {random_i}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[random_i]}") if not args.minimal: print(" - inputs:") print(f" - scalar: 0") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[0]}") print(" - inputs:") print(f" - scalar: {upper_bound}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[upper_bound]}") print(" - inputs:") print(f" - scalar: {lower_bound}") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[lower_bound]}") print(" - inputs:") print(f" - scalar: -1") print(f" signed: true") + print(f" - tensor: [{','.join(map(str, random_lut))}]") + print(f" shape: [{2**p}]") print(" outputs:") print(f" - scalar: {random_lut[-1]}") print("---")