mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-17 16:11:26 -05:00
chore(compiler): refactor e2e tlu tests to use dynamic lut.
This commit is contained in:
@@ -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("---")
|
||||
|
||||
Reference in New Issue
Block a user