polynomial_evaluation.rs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. extern crate openfhe;
  2. use cxx::{CxxVector, SharedPtr};
  3. use openfhe::ffi as ffi;
  4. fn main()
  5. {
  6. use std::time::Instant;
  7. println!("\n======EXAMPLE FOR EVALPOLY========\n");
  8. let mut _cc_params_ckksrns = ffi::GetParamsCKKSRNS();
  9. _cc_params_ckksrns.pin_mut().SetMultiplicativeDepth(6);
  10. _cc_params_ckksrns.pin_mut().SetScalingModSize(50);
  11. let mut _cc = ffi::GenCryptoContextByParamsCKKSRNS(&_cc_params_ckksrns);
  12. _cc.Enable(ffi::PKESchemeFeature::PKE);
  13. _cc.Enable(ffi::PKESchemeFeature::KEYSWITCH);
  14. _cc.Enable(ffi::PKESchemeFeature::LEVELEDSHE);
  15. _cc.Enable(ffi::PKESchemeFeature::ADVANCEDSHE);
  16. let mut _vals = CxxVector::<ffi::ComplexPair>::new();
  17. _vals.pin_mut().push(ffi::ComplexPair{re: 0.5, im: 0.0});
  18. _vals.pin_mut().push(ffi::ComplexPair{re: 0.7, im: 0.0});
  19. _vals.pin_mut().push(ffi::ComplexPair{re: 0.9, im: 0.0});
  20. _vals.pin_mut().push(ffi::ComplexPair{re: 0.95, im: 0.0});
  21. _vals.pin_mut().push(ffi::ComplexPair{re: 0.93, im: 0.0});
  22. let _input = ffi::GenVectorOfComplex(&_vals);
  23. let _encoded_length = _input.len();
  24. let mut _coefficients_1 = CxxVector::<f64>::new();
  25. _coefficients_1.pin_mut().push(0.15);
  26. _coefficients_1.pin_mut().push(0.75);
  27. _coefficients_1.pin_mut().push(0.0);
  28. _coefficients_1.pin_mut().push(1.25);
  29. _coefficients_1.pin_mut().push(0.0);
  30. _coefficients_1.pin_mut().push(0.0);
  31. _coefficients_1.pin_mut().push(1.0);
  32. _coefficients_1.pin_mut().push(0.0);
  33. _coefficients_1.pin_mut().push(1.0);
  34. _coefficients_1.pin_mut().push(2.0);
  35. _coefficients_1.pin_mut().push(0.0);
  36. _coefficients_1.pin_mut().push(1.0);
  37. _coefficients_1.pin_mut().push(0.0);
  38. _coefficients_1.pin_mut().push(0.0);
  39. _coefficients_1.pin_mut().push(0.0);
  40. _coefficients_1.pin_mut().push(0.0);
  41. _coefficients_1.pin_mut().push(1.0);
  42. let mut _coefficients_2 = CxxVector::<f64>::new();
  43. _coefficients_2.pin_mut().push(1.0);
  44. _coefficients_2.pin_mut().push(2.0);
  45. _coefficients_2.pin_mut().push(3.0);
  46. _coefficients_2.pin_mut().push(4.0);
  47. _coefficients_2.pin_mut().push(5.0);
  48. _coefficients_2.pin_mut().push(-1.0);
  49. _coefficients_2.pin_mut().push(-2.0);
  50. _coefficients_2.pin_mut().push(-3.0);
  51. _coefficients_2.pin_mut().push(-4.0);
  52. _coefficients_2.pin_mut().push(-5.0);
  53. _coefficients_2.pin_mut().push(0.1);
  54. _coefficients_2.pin_mut().push(0.2);
  55. _coefficients_2.pin_mut().push(0.3);
  56. _coefficients_2.pin_mut().push(0.4);
  57. _coefficients_2.pin_mut().push(0.5);
  58. _coefficients_2.pin_mut().push(-0.1);
  59. _coefficients_2.pin_mut().push(-0.2);
  60. _coefficients_2.pin_mut().push(-0.3);
  61. _coefficients_2.pin_mut().push(-0.4);
  62. _coefficients_2.pin_mut().push(-0.5);
  63. _coefficients_2.pin_mut().push(0.1);
  64. _coefficients_2.pin_mut().push(0.2);
  65. _coefficients_2.pin_mut().push(0.3);
  66. _coefficients_2.pin_mut().push(0.4);
  67. _coefficients_2.pin_mut().push(0.5);
  68. _coefficients_2.pin_mut().push(-0.1);
  69. _coefficients_2.pin_mut().push(-0.2);
  70. _coefficients_2.pin_mut().push(-0.3);
  71. _coefficients_2.pin_mut().push(-0.4);
  72. _coefficients_2.pin_mut().push(-0.5);
  73. let mut _plain_text_1 = _cc.MakeCKKSPackedPlaintextByVectorOfComplex(&_input, 1, 0, SharedPtr::<ffi::DCRTPolyParams>::null(), 0);
  74. let mut _key_pair = _cc.KeyGen();
  75. print!("Generating evaluation key for homomorphic multiplication...");
  76. _cc.EvalMultKeyGen(_key_pair.GetPrivateKey());
  77. println!("Completed.\n");
  78. let mut _cipher_text_1 = _cc.Encrypt(_key_pair.GetPublicKey(), _plain_text_1.GetPlainText());
  79. let mut _start = Instant::now();
  80. let mut _result = _cc.EvalPoly(_cipher_text_1.GetCipherText(), &_coefficients_1);
  81. let _time_eval_poly_1 = _start.elapsed();
  82. _start = Instant::now();
  83. let mut _result_2 = _cc.EvalPoly(_cipher_text_1.GetCipherText(), &_coefficients_2);
  84. let _time_eval_poly_2 = _start.elapsed();
  85. let mut _plain_text_dec = ffi::GenEmptyPlainText();
  86. _cc.Decrypt(_key_pair.GetPrivateKey(), _result.GetCipherText(), _plain_text_dec.pin_mut());
  87. _plain_text_dec.SetLength(_encoded_length);
  88. let mut _plain_text_dec_2 = ffi::GenEmptyPlainText();
  89. _cc.Decrypt(_key_pair.GetPrivateKey(), _result_2.GetCipherText(), _plain_text_dec_2.pin_mut());
  90. _plain_text_dec_2.SetLength(_encoded_length);
  91. println!("\n Original Plaintext #1:");
  92. println!("{}", _plain_text_1.GetString());
  93. println!("\n Result of evaluating a polynomial with coefficients [{} ]", _coefficients_1.iter().fold(String::new(), |acc, &arg| acc + " " + &arg.to_string()));
  94. println!("{}", _plain_text_dec.GetString());
  95. println!("\n Expected result: (0.70519107, 1.38285078, 3.97211180, 5.60215665, 4.86357575)");
  96. println!("\n Evaluation time: {:.0?}", _time_eval_poly_1);
  97. println!("\n Result of evaluating a polynomial with coefficients [{} ]", _coefficients_2.iter().fold(String::new(), |acc, &arg| acc + " " + &arg.to_string()));
  98. println!("{}\n", _plain_text_dec_2.GetString());
  99. println!(" Expected result: (3.4515092326, 5.3752765397, 4.8993108833, 3.2495023573, 4.0485229982)");
  100. print!("\n Evaluation time: {:.0?}\n", _time_eval_poly_2);
  101. }