refactor(tests): Move apply_lookup_table test to yaml file

This commit is contained in:
Quentin Bourgerie
2022-03-21 10:19:55 +01:00
parent e959f2f4d8
commit fe13853286
2 changed files with 143 additions and 50 deletions

View File

@@ -230,6 +230,149 @@ tests:
outputs:
- scalar: 2
---
description: apply_lookup_table_1_bits
program: |
func @main(%arg0: !FHE.eint<1>) -> !FHE.eint<1> {
%tlu = arith.constant dense<[0, 1]> : tensor<2xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<1>, tensor<2xi64>) -> (!FHE.eint<1>)
return %1: !FHE.eint<1>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 1
outputs:
- scalar: 1
---
description: apply_lookup_table_2_bits
program: |
func @main(%arg0: !FHE.eint<2>) -> !FHE.eint<2> {
%tlu = arith.constant dense<[0, 1, 2, 3]> : tensor<4xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<2>, tensor<4xi64>) -> (!FHE.eint<2>)
return %1: !FHE.eint<2>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 2
outputs:
- scalar: 2
- inputs:
- scalar: 3
outputs:
- scalar: 3
---
description: apply_lookup_table_3_bits
program: |
func @main(%arg0: !FHE.eint<3>) -> !FHE.eint<3> {
%tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7]> : tensor<8xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<3>, tensor<8xi64>) -> (!FHE.eint<3>)
return %1: !FHE.eint<3>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 7
outputs:
- scalar: 7
- inputs:
- scalar: 2
outputs:
- scalar: 2
---
description: apply_lookup_table_4_bits
program: |
func @main(%arg0: !FHE.eint<4>) -> !FHE.eint<4> {
%tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]> : tensor<16xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<4>, tensor<16xi64>) -> (!FHE.eint<4>)
return %1: !FHE.eint<4>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 15
outputs:
- scalar: 15
- inputs:
- scalar: 12
outputs:
- scalar: 12
---
description: apply_lookup_table_5_bits
program: |
func @main(%arg0: !FHE.eint<5>) -> !FHE.eint<5> {
%tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]> : tensor<32xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<5>, tensor<32xi64>) -> (!FHE.eint<5>)
return %1: !FHE.eint<5>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 31
outputs:
- scalar: 31
- inputs:
- scalar: 23
outputs:
- scalar: 23
---
description: apply_lookup_table_6_bits
program: |
func @main(%arg0: !FHE.eint<6>) -> !FHE.eint<6> {
%tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]> : tensor<64xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<6>, tensor<64xi64>) -> (!FHE.eint<6>)
return %1: !FHE.eint<6>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 63
outputs:
- scalar: 63
- inputs:
- scalar: 59
outputs:
- scalar: 59
---
description: apply_lookup_table_7_bits
program: |
func @main(%arg0: !FHE.eint<7>) -> !FHE.eint<7> {
%tlu = arith.constant dense<[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127]> : tensor<128xi64>
%1 = "FHE.apply_lookup_table"(%arg0, %tlu): (!FHE.eint<7>, tensor<128xi64>) -> (!FHE.eint<7>)
return %1: !FHE.eint<7>
}
tests:
- inputs:
- scalar: 0
outputs:
- scalar: 0
- inputs:
- scalar: 127
outputs:
- scalar: 127
- inputs:
- scalar: 96
outputs:
- scalar: 96
---
description: apply_lookup_table_multiple_precision
program: |
func @main(%arg0: !FHE.eint<6>, %arg1: !FHE.eint<3>) -> !FHE.eint<6> {

View File

@@ -54,53 +54,3 @@ INSTANTIATE_END_TO_END_JIT_TEST_SUITE_FROM_FILE(
FHE, "tests/unittest/end_to_end_fhe.yaml")
INSTANTIATE_END_TO_END_JIT_TEST_SUITE_FROM_FILE(
EncryptedTensor, "tests/unittest/end_to_end_encrypted_tensor.yaml")
// FHE.apply_lookup_table /////////////////////////////////////////////////////
class ApplyLookupTableWithPrecision : public ::testing::TestWithParam<int> {};
TEST_P(ApplyLookupTableWithPrecision, identity_func) {
uint64_t precision = GetParam();
std::ostringstream mlirProgram;
uint64_t sizeOfTLU = 1 << precision;
mlirProgram << "func @main(%arg0: !FHE.eint<" << precision
<< ">) -> !FHE.eint<" << precision << "> { \n"
<< " %tlu = arith.constant dense<[0";
for (uint64_t i = 1; i < sizeOfTLU; i++)
mlirProgram << ", " << i;
mlirProgram << "]> : tensor<" << sizeOfTLU << "xi64>\n"
<< " %1 = \"FHE.apply_lookup_table\"(%arg0, %tlu): "
<< "(!FHE.eint<" << precision << ">, tensor<" << sizeOfTLU
<< "xi64>) -> (!FHE.eint<" << precision << ">)\n "
<< "return %1: !FHE.eint<" << precision << ">\n"
<< "}\n";
checkedJit(lambda, mlirProgram.str());
if (precision >= 6) {
// This test often fails for this precision, so we need retries.
// Reason: the current encryption parameters are a little short for this
// precision.
static const int max_tries = 10;
for (uint64_t i = 0; i < sizeOfTLU; i++) {
for (int retry = 0; retry <= max_tries; retry++) {
if (retry == max_tries)
GTEST_FATAL_FAILURE_("Maximum number of tries exceeded");
llvm::Expected<uint64_t> val = lambda(i);
ASSERT_EXPECTED_SUCCESS(val);
if (*val == i)
break;
}
}
} else {
for (uint64_t i = 0; i < sizeOfTLU; i++)
ASSERT_EXPECTED_VALUE(lambda(i), i);
}
}