generated from IBM/repo-template
-
Notifications
You must be signed in to change notification settings - Fork 8
Open
Description
I encountered an incorrect result when using SealCkksContext, however, OpenFheCkksContext can produce a correct result.
Here is the minimal reproducible snippet:
import pyhelayers
def run_bug_reproduction():
requirement = pyhelayers.HeConfigRequirement(
num_slots=8192,
multiplication_depth=6,
fractional_part_precision=30,
integer_part_precision=10,
security_level=128
)
he_context = pyhelayers.SealCkksContext() # BUG occurs here
# he_context = pyhelayers.OpenFheCkksContext() # Correct alternative
he_context.init(requirement)
encoder = pyhelayers.Encoder(he_context)
val_x = -73
# Expected calculation steps:
# var_0002 = 5 - (-73) = 78
# var_0003 = 12 + 78 = 90
# var_0004 = -7 - 90 = -97
# var_0005 = -14 - (-97) = 83
# res = 83 + (-97) = -14
expected_result = -14
print(f"Expected Plaintext Result: {expected_result}")
ct_x = encoder.encode_encrypt([val_x])
var_0002 = pyhelayers.CTile(ct_x)
var_0002.add_scalar(-5)
var_0002.multiply_scalar(-1)
var_0003 = pyhelayers.CTile(var_0002)
var_0003.add_scalar(12)
var_0004 = pyhelayers.CTile(var_0003)
var_0004.add_scalar(7)
var_0004.multiply_scalar(-1)
var_0005 = pyhelayers.CTile(var_0004)
var_0005.add_scalar(14)
var_0005.multiply_scalar(-1)
result_ct = pyhelayers.CTile(var_0005)
result_ct.add(var_0004)
res_vec = encoder.decrypt_decode_double(result_ct)
fhe_result = int(round(res_vec.flat[0]))
print(f"HElayers Result: {fhe_result}")
if __name__ == "__main__":
run_bug_reproduction()
If I use the SealCkksContext backend, then the program output is
Expected Plaintext Result: -14
HElayers Result: 0
However, the result from OpenFheCkksContext is correct:
Expected Plaintext Result: -14
HElayers Result: -14
Metadata
Metadata
Assignees
Labels
No labels