Browse Source

Adding 10 new functions

Hovsep Papoyan 9 months ago
parent
commit
40ee801fb1
3 changed files with 107 additions and 5 deletions
  1. 63 5
      src/CryptoContext.cc
  2. 20 0
      src/CryptoContext.h
  3. 24 0
      src/lib.rs

+ 63 - 5
src/CryptoContext.cc

@@ -96,9 +96,8 @@ void CryptoContextDCRTPoly::EvalMultKeysGen(const std::shared_ptr<PrivateKeyImpl
 {
     m_cryptoContextImplSharedPtr->EvalMultKeysGen(key);
 }
-void CryptoContextDCRTPoly::EvalRotateKeyGen(
-    const std::shared_ptr<PrivateKeyImpl> privateKey, const std::vector<int32_t>& indexList,
-    const std::shared_ptr<PublicKeyImpl> publicKey) const
+void CryptoContextDCRTPoly::EvalRotateKeyGen(const std::shared_ptr<PrivateKeyImpl> privateKey,
+    const std::vector<int32_t>& indexList, const std::shared_ptr<PublicKeyImpl> publicKey) const
 {
     m_cryptoContextImplSharedPtr->EvalRotateKeyGen(privateKey, indexList, publicKey);
 }
@@ -118,8 +117,7 @@ std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeStringPlaintext(const std:
     return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeStringPlaintext(s));
 }
 std::unique_ptr<Plaintext> CryptoContextDCRTPoly::MakeCoefPackedPlaintext(
-    const std::vector<int64_t>& value, const size_t noiseScaleDeg,
-    const uint32_t level) const
+    const std::vector<int64_t>& value, const size_t noiseScaleDeg, const uint32_t level) const
 {
     return std::make_unique<Plaintext>(m_cryptoContextImplSharedPtr->MakeCoefPackedPlaintext(value,
         noiseScaleDeg, level));
@@ -166,6 +164,36 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAn
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
         ciphertext.GetInternal(), constant));
 }
+void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
+    const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddInPlace(c1, ciphertext2.GetInternal());
+}
+void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndPlaintext(
+    const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddInPlace(c, plaintext.GetInternal());
+}
+void CryptoContextDCRTPoly::EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
+    const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddInPlace(plaintext.GetInternal(), c);
+}
+void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertextAndConst(
+    const CiphertextDCRTPoly& ciphertext, const double constant) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddInPlace(c, constant);
+}
+void CryptoContextDCRTPoly::EvalAddInPlaceByConstAndCiphertext(const double constant,
+    const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddInPlace(constant, c);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertexts(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -196,6 +224,24 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAn
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
         ciphertext.GetInternal(), constant));
 }
+void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
+    const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalSubInPlace(c1, ciphertext2.GetInternal());
+}
+void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertextAndConst(
+    const CiphertextDCRTPoly& ciphertext, const double constant) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalSubInPlace(c, constant);
+}
+void CryptoContextDCRTPoly::EvalSubInPlaceByConstAndCiphertext(const double constant,
+    const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalSubInPlace(constant, c);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertexts(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -226,6 +272,18 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextA
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
         ciphertext.GetInternal(), constant));
 }
+void CryptoContextDCRTPoly::EvalMultInPlaceByCiphertextAndConst(
+    const CiphertextDCRTPoly& ciphertext, const double constant) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalMultInPlace(c, constant);
+}
+void CryptoContextDCRTPoly::EvalMultInPlaceByConstAndCiphertext(const double constant,
+    const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalMultInPlace(constant, c);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultNoRelin(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {

+ 20 - 0
src/CryptoContext.h

@@ -111,6 +111,16 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    void EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
+        const CiphertextDCRTPoly& ciphertext2) const;
+    void EvalAddInPlaceByCiphertextAndPlaintext(const CiphertextDCRTPoly& ciphertext,
+        const Plaintext& plaintext) const;
+    void EvalAddInPlaceByPlaintextAndCiphertext(const Plaintext& plaintext,
+        const CiphertextDCRTPoly& ciphertext) const;
+    void EvalAddInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
+        const double constant) const;
+    void EvalAddInPlaceByConstAndCiphertext(const double constant,
+        const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertexts(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndPlaintext(
@@ -121,6 +131,12 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    void EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
+        const CiphertextDCRTPoly& ciphertext2) const;
+    void EvalSubInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
+        const double constant) const;
+    void EvalSubInPlaceByConstAndCiphertext(const double constant,
+        const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertexts(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndPlaintext(
@@ -131,6 +147,10 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    void EvalMultInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
+        const double constant) const;
+    void EvalMultInPlaceByConstAndCiphertext(const double constant,
+        const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultNoRelin(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultAndRelinearize(

+ 24 - 0
src/lib.rs

@@ -566,6 +566,19 @@ pub mod ffi
         fn EvalAddByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                        ciphertext: &CiphertextDCRTPoly, constant: f64)
                                        -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalAddInPlaceByCiphertexts(self: &CryptoContextDCRTPoly,
+                                       ciphertext1: &CiphertextDCRTPoly,
+                                       ciphertext2: &CiphertextDCRTPoly);
+        fn EvalAddInPlaceByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
+                                                  ciphertext: &CiphertextDCRTPoly,
+                                                  plaintext: &Plaintext);
+        fn EvalAddInPlaceByPlaintextAndCiphertext(self: &CryptoContextDCRTPoly,
+                                                  plaintext: &Plaintext,
+                                                  ciphertext: &CiphertextDCRTPoly);
+        fn EvalAddInPlaceByCiphertextAndConst(self: &CryptoContextDCRTPoly,
+                                              ciphertext: &CiphertextDCRTPoly, constant: f64);
+        fn EvalAddInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
+                                              ciphertext: &CiphertextDCRTPoly);
         fn EvalSubByCiphertexts(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                                 ciphertext2: &CiphertextDCRTPoly) -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalSubByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
@@ -580,6 +593,13 @@ pub mod ffi
         fn EvalSubByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                        ciphertext: &CiphertextDCRTPoly, constant: f64)
                                        -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalSubInPlaceByCiphertexts(self: &CryptoContextDCRTPoly,
+                                       ciphertext1: &CiphertextDCRTPoly,
+                                       ciphertext2: &CiphertextDCRTPoly);
+        fn EvalSubInPlaceByCiphertextAndConst(self: &CryptoContextDCRTPoly,
+                                              ciphertext: &CiphertextDCRTPoly, constant: f64);
+        fn EvalSubInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
+                                              ciphertext: &CiphertextDCRTPoly);
         fn EvalMultByCiphertexts(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                                  ciphertext2: &CiphertextDCRTPoly)
                                  -> UniquePtr<CiphertextDCRTPoly>;
@@ -595,6 +615,10 @@ pub mod ffi
         fn EvalMultByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                         ciphertext: &CiphertextDCRTPoly, constant: f64)
                                         -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalMultInPlaceByCiphertextAndConst(self: &CryptoContextDCRTPoly,
+                                               ciphertext: &CiphertextDCRTPoly, constant: f64);
+        fn EvalMultInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
+                                               ciphertext: &CiphertextDCRTPoly);
         fn EvalMultNoRelin(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                            ciphertext2: &CiphertextDCRTPoly) -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalMultAndRelinearize(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,