mirror of
https://github.com/zama-ai/tfhe-rs.git
synced 2026-01-11 07:38:08 -05:00
Compare commits
7 Commits
al/doc_erc
...
al/debug_l
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
592e2fcc89 | ||
|
|
611315255e | ||
|
|
44177c98f0 | ||
|
|
a1fde5bf18 | ||
|
|
c8e878fabe | ||
|
|
38d1842596 | ||
|
|
740d4697e7 |
@@ -62,7 +62,7 @@ void update_degrees_after_bitor(uint64_t *output_degrees,
|
||||
auto min = std::min(lwe_array_1_degrees[i], lwe_array_2_degrees[i]);
|
||||
auto result = max;
|
||||
|
||||
for (uint j = 0; j < min + 1; j++) {
|
||||
for (uint64_t j = 0; j < min + 1; j++) {
|
||||
if (max | j > result) {
|
||||
result = max | j;
|
||||
}
|
||||
@@ -79,13 +79,16 @@ void update_degrees_after_bitxor(uint64_t *output_degrees,
|
||||
auto max = std::max(lwe_array_1_degrees[i], lwe_array_2_degrees[i]);
|
||||
auto min = std::min(lwe_array_1_degrees[i], lwe_array_2_degrees[i]);
|
||||
auto result = max;
|
||||
printf("max %lu, min %lu, result %d\n", max, min, result);
|
||||
|
||||
// Try every possibility to find the worst case
|
||||
for (uint j = 0; j < min + 1; j++) {
|
||||
if (max ^ j > result) {
|
||||
for (uint64_t j = 0; j < min + 1; j++) {
|
||||
printf("j %lu, max ^ j %lu \n", j, max ^ j);
|
||||
if ((max ^ j) > result) {
|
||||
result = max ^ j;
|
||||
}
|
||||
}
|
||||
output_degrees[i] = result;
|
||||
printf("output degree %lu\n", result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ __host__ void host_integer_radix_bitop_kb(
|
||||
update_degrees_after_bitor(degrees, lwe_array_1->degrees,
|
||||
lwe_array_2->degrees,
|
||||
lwe_array_1->num_radix_blocks);
|
||||
} else if (mem_ptr->op == BITXOR) {
|
||||
} else if (mem_ptr->op == BITOP_TYPE::BITXOR) {
|
||||
update_degrees_after_bitxor(degrees, lwe_array_1->degrees,
|
||||
lwe_array_2->degrees,
|
||||
lwe_array_1->num_radix_blocks);
|
||||
|
||||
@@ -17,39 +17,39 @@ where
|
||||
P: Into<TestParameters> + Clone,
|
||||
{
|
||||
// Binary Ops Executors
|
||||
let add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::add);
|
||||
let sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::sub);
|
||||
//let add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::add);
|
||||
//let sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::sub);
|
||||
let bitwise_and_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitand);
|
||||
let bitwise_or_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitor);
|
||||
let bitwise_xor_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitxor);
|
||||
let mul_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::mul);
|
||||
let rotate_left_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_left);
|
||||
let left_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::left_shift);
|
||||
let rotate_right_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_right);
|
||||
let right_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::right_shift);
|
||||
let max_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::max);
|
||||
let min_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::min);
|
||||
//let rotate_left_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_left);
|
||||
//let left_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::left_shift);
|
||||
//let rotate_right_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_right);
|
||||
//let right_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::right_shift);
|
||||
//let max_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::max);
|
||||
//let min_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::min);
|
||||
|
||||
// Binary Ops Clear functions
|
||||
let clear_add = |x, y| x + y;
|
||||
let clear_sub = |x, y| x - y;
|
||||
//let clear_add = |x, y| x + y;
|
||||
//let clear_sub = |x, y| x - y;
|
||||
let clear_bitwise_and = |x, y| x & y;
|
||||
let clear_bitwise_or = |x, y| x | y;
|
||||
let clear_bitwise_xor = |x, y| x ^ y;
|
||||
let clear_mul = |x, y| x * y;
|
||||
// Warning this rotate definition only works with 64-bit ciphertexts
|
||||
let clear_rotate_left = |x: u64, y: u64| x.rotate_left(y as u32);
|
||||
let clear_left_shift = |x, y| x << y;
|
||||
// Warning this rotate definition only works with 64-bit ciphertexts
|
||||
let clear_rotate_right = |x: u64, y: u64| x.rotate_right(y as u32);
|
||||
let clear_right_shift = |x, y| x >> y;
|
||||
let clear_max = |x: u64, y: u64| max(x, y);
|
||||
let clear_min = |x: u64, y: u64| min(x, y);
|
||||
//let clear_rotate_left = |x: u64, y: u64| x.rotate_left(y as u32);
|
||||
//let clear_left_shift = |x, y| x << y;
|
||||
//// Warning this rotate definition only works with 64-bit ciphertexts
|
||||
//let clear_rotate_right = |x: u64, y: u64| x.rotate_right(y as u32);
|
||||
//let clear_right_shift = |x, y| x >> y;
|
||||
//let clear_max = |x: u64, y: u64| max(x, y);
|
||||
//let clear_min = |x: u64, y: u64| min(x, y);
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut binary_ops: Vec<(BinaryOpExecutor, &dyn Fn(u64, u64) -> u64, String)> = vec![
|
||||
(Box::new(add_executor), &clear_add, "add".to_string()),
|
||||
(Box::new(sub_executor), &clear_sub, "sub".to_string()),
|
||||
//(Box::new(add_executor), &clear_add, "add".to_string()),
|
||||
//(Box::new(sub_executor), &clear_sub, "sub".to_string()),
|
||||
(
|
||||
Box::new(bitwise_and_executor),
|
||||
&clear_bitwise_and,
|
||||
@@ -66,28 +66,28 @@ where
|
||||
"bitxor".to_string(),
|
||||
),
|
||||
(Box::new(mul_executor), &clear_mul, "mul".to_string()),
|
||||
(
|
||||
Box::new(rotate_left_executor),
|
||||
&clear_rotate_left,
|
||||
"rotate left".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(left_shift_executor),
|
||||
&clear_left_shift,
|
||||
"left shift".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(rotate_right_executor),
|
||||
&clear_rotate_right,
|
||||
"rotate right".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(right_shift_executor),
|
||||
&clear_right_shift,
|
||||
"right shift".to_string(),
|
||||
),
|
||||
(Box::new(max_executor), &clear_max, "max".to_string()),
|
||||
(Box::new(min_executor), &clear_min, "min".to_string()),
|
||||
//(
|
||||
// Box::new(rotate_left_executor),
|
||||
// &clear_rotate_left,
|
||||
// "rotate left".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(left_shift_executor),
|
||||
// &clear_left_shift,
|
||||
// "left shift".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(rotate_right_executor),
|
||||
// &clear_rotate_right,
|
||||
// "rotate right".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(right_shift_executor),
|
||||
// &clear_right_shift,
|
||||
// "right shift".to_string(),
|
||||
//),
|
||||
//(Box::new(max_executor), &clear_max, "max".to_string()),
|
||||
//(Box::new(min_executor), &clear_min, "min".to_string()),
|
||||
];
|
||||
|
||||
// Unary Ops Executors
|
||||
@@ -115,8 +115,8 @@ where
|
||||
];
|
||||
|
||||
// Scalar binary Ops Executors
|
||||
let scalar_add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_add);
|
||||
let scalar_sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_sub);
|
||||
//let scalar_add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_add);
|
||||
//let scalar_sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_sub);
|
||||
let scalar_bitwise_and_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_bitand);
|
||||
let scalar_bitwise_or_executor =
|
||||
@@ -124,27 +124,27 @@ where
|
||||
let scalar_bitwise_xor_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_bitxor);
|
||||
let scalar_mul_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_mul);
|
||||
let scalar_rotate_left_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_left);
|
||||
let scalar_left_shift_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_left_shift);
|
||||
let scalar_rotate_right_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_right);
|
||||
let scalar_right_shift_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_right_shift);
|
||||
//let scalar_rotate_left_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_left);
|
||||
//let scalar_left_shift_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_left_shift);
|
||||
//let scalar_rotate_right_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_right);
|
||||
//let scalar_right_shift_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_right_shift);
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut scalar_binary_ops: Vec<(ScalarBinaryOpExecutor, &dyn Fn(u64, u64) -> u64, String)> = vec![
|
||||
(
|
||||
Box::new(scalar_add_executor),
|
||||
&clear_add,
|
||||
"scalar add".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_sub_executor),
|
||||
&clear_sub,
|
||||
"scalar sub".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_add_executor),
|
||||
// &clear_add,
|
||||
// "scalar add".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_sub_executor),
|
||||
// &clear_sub,
|
||||
// "scalar sub".to_string(),
|
||||
//),
|
||||
(
|
||||
Box::new(scalar_bitwise_and_executor),
|
||||
&clear_bitwise_and,
|
||||
@@ -165,26 +165,26 @@ where
|
||||
&clear_mul,
|
||||
"scalar mul".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_rotate_left_executor),
|
||||
&clear_rotate_left,
|
||||
"scalar rotate left".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_left_shift_executor),
|
||||
&clear_left_shift,
|
||||
"scalar left shift".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_rotate_right_executor),
|
||||
&clear_rotate_right,
|
||||
"scalar rotate right".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_right_shift_executor),
|
||||
&clear_right_shift,
|
||||
"scalar right shift".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_rotate_left_executor),
|
||||
// &clear_rotate_left,
|
||||
// "scalar rotate left".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_left_shift_executor),
|
||||
// &clear_left_shift,
|
||||
// "scalar left shift".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_rotate_right_executor),
|
||||
// &clear_rotate_right,
|
||||
// "scalar rotate right".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_right_shift_executor),
|
||||
// &clear_right_shift,
|
||||
// "scalar right shift".to_string(),
|
||||
//),
|
||||
];
|
||||
|
||||
// Overflowing Ops Executors
|
||||
@@ -249,37 +249,37 @@ where
|
||||
|
||||
// Comparison Ops Executors
|
||||
let gt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::gt);
|
||||
let ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ge);
|
||||
let lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::lt);
|
||||
let le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::le);
|
||||
let eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::eq);
|
||||
let ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ne);
|
||||
//let ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ge);
|
||||
//let lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::lt);
|
||||
//let le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::le);
|
||||
//let eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::eq);
|
||||
//let ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ne);
|
||||
|
||||
// Comparison Ops Clear functions
|
||||
let clear_gt = |x: u64, y: u64| -> bool { x > y };
|
||||
let clear_ge = |x: u64, y: u64| -> bool { x >= y };
|
||||
let clear_lt = |x: u64, y: u64| -> bool { x < y };
|
||||
let clear_le = |x: u64, y: u64| -> bool { x <= y };
|
||||
let clear_eq = |x: u64, y: u64| -> bool { x == y };
|
||||
let clear_ne = |x: u64, y: u64| -> bool { x != y };
|
||||
//let clear_ge = |x: u64, y: u64| -> bool { x >= y };
|
||||
//let clear_lt = |x: u64, y: u64| -> bool { x < y };
|
||||
//let clear_le = |x: u64, y: u64| -> bool { x <= y };
|
||||
//let clear_eq = |x: u64, y: u64| -> bool { x == y };
|
||||
//let clear_ne = |x: u64, y: u64| -> bool { x != y };
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut comparison_ops: Vec<(ComparisonOpExecutor, &dyn Fn(u64, u64) -> bool, String)> = vec![
|
||||
(Box::new(gt_executor), &clear_gt, "gt".to_string()),
|
||||
(Box::new(ge_executor), &clear_ge, "ge".to_string()),
|
||||
(Box::new(lt_executor), &clear_lt, "lt".to_string()),
|
||||
(Box::new(le_executor), &clear_le, "le".to_string()),
|
||||
(Box::new(eq_executor), &clear_eq, "eq".to_string()),
|
||||
(Box::new(ne_executor), &clear_ne, "ne".to_string()),
|
||||
//(Box::new(ge_executor), &clear_ge, "ge".to_string()),
|
||||
//(Box::new(lt_executor), &clear_lt, "lt".to_string()),
|
||||
//(Box::new(le_executor), &clear_le, "le".to_string()),
|
||||
//(Box::new(eq_executor), &clear_eq, "eq".to_string()),
|
||||
//(Box::new(ne_executor), &clear_ne, "ne".to_string()),
|
||||
];
|
||||
|
||||
// Scalar Comparison Ops Executors
|
||||
let scalar_gt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_gt);
|
||||
let scalar_ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ge);
|
||||
let scalar_lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_lt);
|
||||
let scalar_le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_le);
|
||||
let scalar_eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_eq);
|
||||
let scalar_ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ne);
|
||||
//let scalar_ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ge);
|
||||
//let scalar_lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_lt);
|
||||
//let scalar_le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_le);
|
||||
//let scalar_eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_eq);
|
||||
//let scalar_ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ne);
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut scalar_comparison_ops: Vec<(
|
||||
@@ -292,31 +292,31 @@ where
|
||||
&clear_gt,
|
||||
"scalar gt".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_ge_executor),
|
||||
&clear_ge,
|
||||
"scalar ge".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_lt_executor),
|
||||
&clear_lt,
|
||||
"scalar lt".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_le_executor),
|
||||
&clear_le,
|
||||
"scalar le".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_eq_executor),
|
||||
&clear_eq,
|
||||
"scalar eq".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_ne_executor),
|
||||
&clear_ne,
|
||||
"scalar ne".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_ge_executor),
|
||||
// &clear_ge,
|
||||
// "scalar ge".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_lt_executor),
|
||||
// &clear_lt,
|
||||
// "scalar lt".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_le_executor),
|
||||
// &clear_le,
|
||||
// "scalar le".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_eq_executor),
|
||||
// &clear_eq,
|
||||
// "scalar eq".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_ne_executor),
|
||||
// &clear_ne,
|
||||
// "scalar ne".to_string(),
|
||||
//),
|
||||
];
|
||||
|
||||
// Select Executor
|
||||
|
||||
@@ -19,29 +19,29 @@ where
|
||||
P: Into<TestParameters> + Clone,
|
||||
{
|
||||
// Binary Ops Executors
|
||||
let add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::add);
|
||||
let sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::sub);
|
||||
//let add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::add);
|
||||
//let sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::sub);
|
||||
let bitwise_and_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitand);
|
||||
let bitwise_or_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitor);
|
||||
let bitwise_xor_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::bitxor);
|
||||
let mul_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::mul);
|
||||
let max_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::max);
|
||||
let min_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::min);
|
||||
//let max_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::max);
|
||||
//let min_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::min);
|
||||
|
||||
// Binary Ops Clear functions
|
||||
let clear_add = |x, y| x + y;
|
||||
let clear_sub = |x, y| x - y;
|
||||
//let clear_add = |x, y| x + y;
|
||||
//let clear_sub = |x, y| x - y;
|
||||
let clear_bitwise_and = |x, y| x & y;
|
||||
let clear_bitwise_or = |x, y| x | y;
|
||||
let clear_bitwise_xor = |x, y| x ^ y;
|
||||
let clear_mul = |x, y| x * y;
|
||||
let clear_max = |x: i64, y: i64| max(x, y);
|
||||
let clear_min = |x: i64, y: i64| min(x, y);
|
||||
//let clear_max = |x: i64, y: i64| max(x, y);
|
||||
//let clear_min = |x: i64, y: i64| min(x, y);
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut binary_ops: Vec<(SignedBinaryOpExecutor, &dyn Fn(i64, i64) -> i64, String)> = vec![
|
||||
(Box::new(add_executor), &clear_add, "add".to_string()),
|
||||
(Box::new(sub_executor), &clear_sub, "sub".to_string()),
|
||||
//(Box::new(add_executor), &clear_add, "add".to_string()),
|
||||
//(Box::new(sub_executor), &clear_sub, "sub".to_string()),
|
||||
(
|
||||
Box::new(bitwise_and_executor),
|
||||
&clear_bitwise_and,
|
||||
@@ -58,14 +58,14 @@ where
|
||||
"bitxor".to_string(),
|
||||
),
|
||||
(Box::new(mul_executor), &clear_mul, "mul".to_string()),
|
||||
(Box::new(max_executor), &clear_max, "max".to_string()),
|
||||
(Box::new(min_executor), &clear_min, "min".to_string()),
|
||||
//(Box::new(max_executor), &clear_max, "max".to_string()),
|
||||
//(Box::new(min_executor), &clear_min, "min".to_string()),
|
||||
];
|
||||
|
||||
let rotate_left_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_left);
|
||||
let left_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::left_shift);
|
||||
let rotate_right_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_right);
|
||||
let right_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::right_shift);
|
||||
//let left_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::left_shift);
|
||||
//let rotate_right_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::rotate_right);
|
||||
//let right_shift_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::right_shift);
|
||||
// Warning this rotate definition only works with 64-bit ciphertexts
|
||||
let clear_rotate_left = |x: i64, y: u64| x.rotate_left(y as u32);
|
||||
let clear_left_shift = |x: i64, y: u64| x << y;
|
||||
@@ -83,21 +83,21 @@ where
|
||||
&clear_rotate_left,
|
||||
"rotate left".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(left_shift_executor),
|
||||
&clear_left_shift,
|
||||
"left shift".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(rotate_right_executor),
|
||||
&clear_rotate_right,
|
||||
"rotate right".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(right_shift_executor),
|
||||
&clear_right_shift,
|
||||
"right shift".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(left_shift_executor),
|
||||
// &clear_left_shift,
|
||||
// "left shift".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(rotate_right_executor),
|
||||
// &clear_rotate_right,
|
||||
// "rotate right".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(right_shift_executor),
|
||||
// &clear_right_shift,
|
||||
// "right shift".to_string(),
|
||||
//),
|
||||
];
|
||||
|
||||
// Unary Ops Executors
|
||||
@@ -125,8 +125,8 @@ where
|
||||
];
|
||||
|
||||
// Scalar binary Ops Executors
|
||||
let scalar_add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_add);
|
||||
let scalar_sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_sub);
|
||||
//let scalar_add_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_add);
|
||||
//let scalar_sub_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_sub);
|
||||
let scalar_bitwise_and_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_bitand);
|
||||
let scalar_bitwise_or_executor =
|
||||
@@ -141,16 +141,16 @@ where
|
||||
&dyn Fn(i64, i64) -> i64,
|
||||
String,
|
||||
)> = vec![
|
||||
(
|
||||
Box::new(scalar_add_executor),
|
||||
&clear_add,
|
||||
"scalar add".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_sub_executor),
|
||||
&clear_sub,
|
||||
"scalar sub".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_add_executor),
|
||||
// &clear_add,
|
||||
// "scalar add".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_sub_executor),
|
||||
// &clear_sub,
|
||||
// "scalar sub".to_string(),
|
||||
//),
|
||||
(
|
||||
Box::new(scalar_bitwise_and_executor),
|
||||
&clear_bitwise_and,
|
||||
@@ -175,12 +175,12 @@ where
|
||||
|
||||
let scalar_rotate_left_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_left);
|
||||
let scalar_left_shift_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_left_shift);
|
||||
let scalar_rotate_right_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_right);
|
||||
let scalar_right_shift_executor =
|
||||
GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_right_shift);
|
||||
//let scalar_left_shift_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_left_shift);
|
||||
//let scalar_rotate_right_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_rotate_right);
|
||||
//let scalar_right_shift_executor =
|
||||
// GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_right_shift);
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut scalar_shift_rotate_ops: Vec<(
|
||||
SignedScalarShiftRotateExecutor,
|
||||
@@ -192,21 +192,21 @@ where
|
||||
&clear_rotate_left,
|
||||
"scalar rotate left".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_left_shift_executor),
|
||||
&clear_left_shift,
|
||||
"scalar left shift".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_rotate_right_executor),
|
||||
&clear_rotate_right,
|
||||
"scalar rotate right".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_right_shift_executor),
|
||||
&clear_right_shift,
|
||||
"scalar right shift".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_left_shift_executor),
|
||||
// &clear_left_shift,
|
||||
// "scalar left shift".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_rotate_right_executor),
|
||||
// &clear_rotate_right,
|
||||
// "scalar rotate right".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_right_shift_executor),
|
||||
// &clear_right_shift,
|
||||
// "scalar right shift".to_string(),
|
||||
//),
|
||||
];
|
||||
|
||||
// Overflowing Ops Executors
|
||||
@@ -271,11 +271,11 @@ where
|
||||
|
||||
// Comparison Ops Executors
|
||||
let gt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::gt);
|
||||
let ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ge);
|
||||
let lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::lt);
|
||||
let le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::le);
|
||||
let eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::eq);
|
||||
let ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ne);
|
||||
//let ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ge);
|
||||
//let lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::lt);
|
||||
//let le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::le);
|
||||
//let eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::eq);
|
||||
//let ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::ne);
|
||||
|
||||
// Comparison Ops Clear functions
|
||||
let clear_gt = |x: i64, y: i64| -> bool { x > y };
|
||||
@@ -292,20 +292,20 @@ where
|
||||
String,
|
||||
)> = vec![
|
||||
(Box::new(gt_executor), &clear_gt, "gt".to_string()),
|
||||
(Box::new(ge_executor), &clear_ge, "ge".to_string()),
|
||||
(Box::new(lt_executor), &clear_lt, "lt".to_string()),
|
||||
(Box::new(le_executor), &clear_le, "le".to_string()),
|
||||
(Box::new(eq_executor), &clear_eq, "eq".to_string()),
|
||||
(Box::new(ne_executor), &clear_ne, "ne".to_string()),
|
||||
//(Box::new(ge_executor), &clear_ge, "ge".to_string()),
|
||||
//(Box::new(lt_executor), &clear_lt, "lt".to_string()),
|
||||
//(Box::new(le_executor), &clear_le, "le".to_string()),
|
||||
//(Box::new(eq_executor), &clear_eq, "eq".to_string()),
|
||||
//(Box::new(ne_executor), &clear_ne, "ne".to_string()),
|
||||
];
|
||||
|
||||
// Scalar Comparison Ops Executors
|
||||
let scalar_gt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_gt);
|
||||
let scalar_ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ge);
|
||||
let scalar_lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_lt);
|
||||
let scalar_le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_le);
|
||||
let scalar_eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_eq);
|
||||
let scalar_ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ne);
|
||||
//let scalar_ge_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ge);
|
||||
//let scalar_lt_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_lt);
|
||||
//let scalar_le_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_le);
|
||||
//let scalar_eq_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_eq);
|
||||
//let scalar_ne_executor = GpuMultiDeviceFunctionExecutor::new(&CudaServerKey::scalar_ne);
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
let mut scalar_comparison_ops: Vec<(
|
||||
@@ -318,31 +318,31 @@ where
|
||||
&clear_gt,
|
||||
"scalar gt".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_ge_executor),
|
||||
&clear_ge,
|
||||
"scalar ge".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_lt_executor),
|
||||
&clear_lt,
|
||||
"scalar lt".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_le_executor),
|
||||
&clear_le,
|
||||
"scalar le".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_eq_executor),
|
||||
&clear_eq,
|
||||
"scalar eq".to_string(),
|
||||
),
|
||||
(
|
||||
Box::new(scalar_ne_executor),
|
||||
&clear_ne,
|
||||
"scalar ne".to_string(),
|
||||
),
|
||||
//(
|
||||
// Box::new(scalar_ge_executor),
|
||||
// &clear_ge,
|
||||
// "scalar ge".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_lt_executor),
|
||||
// &clear_lt,
|
||||
// "scalar lt".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_le_executor),
|
||||
// &clear_le,
|
||||
// "scalar le".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_eq_executor),
|
||||
// &clear_eq,
|
||||
// "scalar eq".to_string(),
|
||||
//),
|
||||
//(
|
||||
// Box::new(scalar_ne_executor),
|
||||
// &clear_ne,
|
||||
// "scalar ne".to_string(),
|
||||
//),
|
||||
];
|
||||
|
||||
// Select Executor
|
||||
|
||||
@@ -3,4 +3,4 @@ pub(crate) mod test_random_op_sequence;
|
||||
pub(crate) mod test_signed_erc20;
|
||||
pub(crate) mod test_signed_random_op_sequence;
|
||||
pub(crate) const NB_CTXT_LONG_RUN: usize = 32;
|
||||
pub(crate) const NB_TESTS_LONG_RUN: usize = 20000;
|
||||
pub(crate) const NB_TESTS_LONG_RUN: usize = 200;
|
||||
|
||||
@@ -578,16 +578,19 @@ pub(crate) fn random_op_sequence_test<P>(
|
||||
"Noise level greater than nominal value on op {fn_name} for block {k}",
|
||||
)
|
||||
});
|
||||
// Determinism check
|
||||
let res_1 = binary_op_executor.execute((&left_vec[i], &right_vec[i]));
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right}.",
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
right_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
// Determinism check
|
||||
let res_1 = binary_op_executor.execute((&left_vec[i], &right_vec[i]));
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right} with input degrees {input_degrees_left:?} and {input_degrees_right:?}",
|
||||
);
|
||||
println!("Input degrees left: {input_degrees_left:?}, right {input_degrees_right:?}, Output degrees {:?}", output_degrees);
|
||||
let decrypted_res: u64 = cks.decrypt(&res);
|
||||
let expected_res: u64 = clear_fn(clear_left, clear_right);
|
||||
|
||||
@@ -633,13 +636,13 @@ pub(crate) fn random_op_sequence_test<P>(
|
||||
"Noise level greater than nominal value on op {fn_name} for block {k}",
|
||||
)
|
||||
});
|
||||
let input_degrees: Vec<u64> = input.blocks.iter().map(|b| b.degree.0).collect();
|
||||
// Determinism check
|
||||
let res_1 = unary_op_executor.execute(input);
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on unary op {fn_name} with clear input {clear_input}.",
|
||||
"Determinism check failed on unary op {fn_name} with clear input {clear_input} with input degrees {input_degrees:?}.",
|
||||
);
|
||||
let input_degrees: Vec<u64> = input.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let decrypted_res: u64 = cks.decrypt(&res);
|
||||
let expected_res: u64 = clear_fn(clear_input);
|
||||
if i % 2 == 0 {
|
||||
@@ -675,16 +678,16 @@ pub(crate) fn random_op_sequence_test<P>(
|
||||
"Noise level greater than nominal value on op {fn_name} for block {k}",
|
||||
)
|
||||
});
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
// Determinism check
|
||||
let res_1 = scalar_binary_op_executor.execute((&left_vec[i], clear_right_vec[i]));
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right}.",
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right} with input degrees {input_degrees_left:?}.",
|
||||
);
|
||||
let decrypted_res: u64 = cks.decrypt(&res);
|
||||
let expected_res: u64 = clear_fn(clear_left, clear_right);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
|
||||
if i % 2 == 0 {
|
||||
left_vec[j] = res.clone();
|
||||
|
||||
@@ -670,16 +670,19 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
"Noise level greater than nominal value on op {fn_name} for block {k}",
|
||||
)
|
||||
});
|
||||
// Determinism check
|
||||
let res_1 = binary_op_executor.execute((&left_vec[i], &right_vec[i]));
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right}.",
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
right_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
// Determinism check
|
||||
let res_1 = binary_op_executor.execute((&left_vec[i], &right_vec[i]));
|
||||
assert_eq!(
|
||||
res, res_1,
|
||||
"Determinism check failed on binary op {fn_name} with clear inputs {clear_left} and {clear_right} with input degrees {input_degrees_left:?} and {input_degrees_right:?}",
|
||||
);
|
||||
println!("Input degrees left: {input_degrees_left:?}, right {input_degrees_right:?}, Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res: i64 = clear_fn(clear_left, clear_right);
|
||||
|
||||
@@ -731,6 +734,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
"Determinism check failed on unary op {fn_name} with clear input {clear_input}.",
|
||||
);
|
||||
let input_degrees: Vec<u64> = input.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res: i64 = clear_fn(clear_input);
|
||||
if i % 2 == 0 {
|
||||
@@ -774,6 +780,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res: i64 = clear_fn(clear_left, clear_right);
|
||||
|
||||
@@ -829,6 +838,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
right_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let decrypt_signed_overflow = cks.decrypt_bool(&overflow);
|
||||
let (expected_res, expected_overflow) = clear_fn(clear_left, clear_right);
|
||||
@@ -889,6 +901,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let decrypt_signed_overflow = cks.decrypt_bool(&overflow);
|
||||
let (expected_res, expected_overflow) = clear_fn(clear_left, clear_right);
|
||||
@@ -1020,6 +1035,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
right_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res = clear_fn(clear_bool, clear_left, clear_right);
|
||||
|
||||
@@ -1081,6 +1099,12 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
right_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees_q: Vec<u64> =
|
||||
res_q.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees_r: Vec<u64> =
|
||||
res_r.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees_q);
|
||||
println!("Output degrees {:?}", output_degrees_r);
|
||||
let decrypt_signed_res_q: i64 = cks.decrypt_signed(&res_q);
|
||||
let decrypt_signed_res_r: i64 = cks.decrypt_signed(&res_r);
|
||||
let (expected_res_q, expected_res_r) = clear_fn(clear_left, clear_right);
|
||||
@@ -1147,6 +1171,12 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_q_degrees: Vec<u64> =
|
||||
res_r.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_r_degrees: Vec<u64> =
|
||||
res_r.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output r degrees {:?}", output_r_degrees);
|
||||
println!("Output q degrees {:?}", output_q_degrees);
|
||||
let decrypt_signed_res_q: i64 = cks.decrypt_signed(&res_q);
|
||||
let decrypt_signed_res_r: i64 = cks.decrypt_signed(&res_r);
|
||||
let (expected_res_q, expected_res_r) = clear_fn(clear_left, clear_right);
|
||||
@@ -1205,6 +1235,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
"Determinism check failed on op {fn_name} with clear input {clear_input}.",
|
||||
);
|
||||
let input_degrees: Vec<u64> = input.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let cast_res = sks.cast_to_signed(res, NB_CTXT_LONG_RUN);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&cast_res);
|
||||
let expected_res = clear_fn(clear_input) as i64;
|
||||
@@ -1252,6 +1285,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let input_degrees_right: Vec<u64> =
|
||||
unsigned_right.blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res: i64 = clear_fn(clear_left, clear_right as u64);
|
||||
|
||||
@@ -1297,6 +1333,9 @@ pub(crate) fn signed_random_op_sequence_test<P>(
|
||||
);
|
||||
let input_degrees_left: Vec<u64> =
|
||||
left_vec[i].blocks.iter().map(|b| b.degree.0).collect();
|
||||
let output_degrees: Vec<u64> =
|
||||
res.blocks.iter().map(|b| b.degree.0).collect();
|
||||
println!("Output degrees {:?}", output_degrees);
|
||||
let decrypt_signed_res: i64 = cks.decrypt_signed(&res);
|
||||
let expected_res: i64 = clear_fn(clear_left, clear_right as u64);
|
||||
|
||||
|
||||
@@ -171,6 +171,7 @@ impl Degree {
|
||||
pub(crate) fn after_bitxor(self, other: Self) -> Self {
|
||||
let max = cmp::max(self.0, other.0);
|
||||
let min = cmp::min(self.0, other.0);
|
||||
println!("max {max}, min {min}");
|
||||
let mut result = max;
|
||||
|
||||
//Try every possibility to find the worst case
|
||||
@@ -179,6 +180,7 @@ impl Degree {
|
||||
result = max ^ i;
|
||||
}
|
||||
}
|
||||
println!("result {result}");
|
||||
|
||||
Self(result)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user