Selaa lähdekoodia

Adding 12 new functions

Hovsep Papoyan 10 kuukautta sitten
vanhempi
commit
722531f883
3 muutettua tiedostoa jossa 153 lisäystä ja 0 poistoa
  1. 87 0
      src/CryptoContext.cc
  2. 24 0
      src/CryptoContext.h
  3. 42 0
      src/lib.rs

+ 87 - 0
src/CryptoContext.cc

@@ -164,6 +164,28 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddByCiphertextAn
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAdd(
         ciphertext.GetInternal(), constant));
 }
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertexts(
+    const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(
+        c1, c2));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByCiphertextAndPlaintext(
+    const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(c,
+        plaintext.GetInternal()));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalAddMutableByPlaintextAndCiphertext(
+    const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalAddMutable(
+        plaintext.GetInternal(), c));
+}
 void CryptoContextDCRTPoly::EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
     const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -194,6 +216,13 @@ void CryptoContextDCRTPoly::EvalAddInPlaceByConstAndCiphertext(const double cons
     std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
     m_cryptoContextImplSharedPtr->EvalAddInPlace(constant, c);
 }
+void CryptoContextDCRTPoly::EvalAddMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+    const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalAddMutableInPlace(c1, c2);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertexts(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -224,6 +253,28 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubByCiphertextAn
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSub(
         ciphertext.GetInternal(), constant));
 }
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertexts(
+    const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(
+        c1, c2));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByCiphertextAndPlaintext(
+    const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(c,
+        plaintext.GetInternal()));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalSubMutableByPlaintextAndCiphertext(
+    const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalSubMutable(
+        plaintext.GetInternal(), c));
+}
 void CryptoContextDCRTPoly::EvalSubInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
     const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -242,6 +293,13 @@ void CryptoContextDCRTPoly::EvalSubInPlaceByConstAndCiphertext(const double cons
     std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
     m_cryptoContextImplSharedPtr->EvalSubInPlace(constant, c);
 }
+void CryptoContextDCRTPoly::EvalSubMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+    const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalSubMutableInPlace(c1, c2);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertexts(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {
@@ -272,6 +330,28 @@ std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultByCiphertextA
     return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMult(
         ciphertext.GetInternal(), constant));
 }
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertexts(
+    const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(
+        c1, c2));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByCiphertextAndPlaintext(
+    const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(c,
+        plaintext.GetInternal()));
+}
+std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultMutableByPlaintextAndCiphertext(
+    const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const
+{
+    std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
+    return std::make_unique<CiphertextDCRTPoly>(m_cryptoContextImplSharedPtr->EvalMultMutable(
+        plaintext.GetInternal(), c));
+}
 void CryptoContextDCRTPoly::EvalMultInPlaceByCiphertextAndConst(
     const CiphertextDCRTPoly& ciphertext, const double constant) const
 {
@@ -284,6 +364,13 @@ void CryptoContextDCRTPoly::EvalMultInPlaceByConstAndCiphertext(const double con
     std::shared_ptr<CiphertextImpl> c = ciphertext.GetInternal();
     m_cryptoContextImplSharedPtr->EvalMultInPlace(constant, c);
 }
+void CryptoContextDCRTPoly::EvalMultMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+    const CiphertextDCRTPoly& ciphertext2) const
+{
+    std::shared_ptr<CiphertextImpl> c1 = ciphertext1.GetInternal();
+    std::shared_ptr<CiphertextImpl> c2 = ciphertext2.GetInternal();
+    m_cryptoContextImplSharedPtr->EvalMultMutableInPlace(c1, c2);
+}
 std::unique_ptr<CiphertextDCRTPoly> CryptoContextDCRTPoly::EvalMultNoRelin(
     const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const
 {

+ 24 - 0
src/CryptoContext.h

@@ -111,6 +111,12 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertexts(
+        const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByCiphertextAndPlaintext(
+        const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalAddMutableByPlaintextAndCiphertext(
+        const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
     void EvalAddInPlaceByCiphertexts(const CiphertextDCRTPoly& ciphertext1,
         const CiphertextDCRTPoly& ciphertext2) const;
     void EvalAddInPlaceByCiphertextAndPlaintext(const CiphertextDCRTPoly& ciphertext,
@@ -121,6 +127,8 @@ public:
         const double constant) const;
     void EvalAddInPlaceByConstAndCiphertext(const double constant,
         const CiphertextDCRTPoly& ciphertext) const;
+    void EvalAddMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+        const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertexts(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndPlaintext(
@@ -131,12 +139,20 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertexts(
+        const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByCiphertextAndPlaintext(
+        const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalSubMutableByPlaintextAndCiphertext(
+        const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) 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;
+    void EvalSubMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+        const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertexts(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndPlaintext(
@@ -147,10 +163,18 @@ public:
         const double constant, const CiphertextDCRTPoly& ciphertext) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultByCiphertextAndConst(
         const CiphertextDCRTPoly& ciphertext, const double constant) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertexts(
+        const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByCiphertextAndPlaintext(
+        const CiphertextDCRTPoly& ciphertext, const Plaintext& plaintext) const;
+    [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultMutableByPlaintextAndCiphertext(
+        const Plaintext& plaintext, const CiphertextDCRTPoly& ciphertext) const;
     void EvalMultInPlaceByCiphertextAndConst(const CiphertextDCRTPoly& ciphertext,
         const double constant) const;
     void EvalMultInPlaceByConstAndCiphertext(const double constant,
         const CiphertextDCRTPoly& ciphertext) const;
+    void EvalMultMutableInPlace(const CiphertextDCRTPoly& ciphertext1,
+        const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultNoRelin(
         const CiphertextDCRTPoly& ciphertext1, const CiphertextDCRTPoly& ciphertext2) const;
     [[nodiscard]] std::unique_ptr<CiphertextDCRTPoly> EvalMultAndRelinearize(

+ 42 - 0
src/lib.rs

@@ -566,6 +566,18 @@ pub mod ffi
         fn EvalAddByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                        ciphertext: &CiphertextDCRTPoly, constant: f64)
                                        -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalAddMutableByCiphertexts(self: &CryptoContextDCRTPoly,
+                                       ciphertext1: &CiphertextDCRTPoly,
+                                       ciphertext2: &CiphertextDCRTPoly)
+                                       -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalAddMutableByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
+                                                  ciphertext: &CiphertextDCRTPoly,
+                                                  plaintext: &Plaintext)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalAddMutableByPlaintextAndCiphertext(self: &CryptoContextDCRTPoly,
+                                                  plaintext: &Plaintext,
+                                                  ciphertext: &CiphertextDCRTPoly)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalAddInPlaceByCiphertexts(self: &CryptoContextDCRTPoly,
                                        ciphertext1: &CiphertextDCRTPoly,
                                        ciphertext2: &CiphertextDCRTPoly);
@@ -579,6 +591,8 @@ pub mod ffi
                                               ciphertext: &CiphertextDCRTPoly, constant: f64);
         fn EvalAddInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
                                               ciphertext: &CiphertextDCRTPoly);
+        fn EvalAddMutableInPlace(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
+                                 ciphertext2: &CiphertextDCRTPoly);
         fn EvalSubByCiphertexts(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                                 ciphertext2: &CiphertextDCRTPoly) -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalSubByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
@@ -593,6 +607,18 @@ pub mod ffi
         fn EvalSubByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                        ciphertext: &CiphertextDCRTPoly, constant: f64)
                                        -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalSubMutableByCiphertexts(self: &CryptoContextDCRTPoly,
+                                       ciphertext1: &CiphertextDCRTPoly,
+                                       ciphertext2: &CiphertextDCRTPoly)
+                                       -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalSubMutableByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
+                                                  ciphertext: &CiphertextDCRTPoly,
+                                                  plaintext: &Plaintext)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalSubMutableByPlaintextAndCiphertext(self: &CryptoContextDCRTPoly,
+                                                  plaintext: &Plaintext,
+                                                  ciphertext: &CiphertextDCRTPoly)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalSubInPlaceByCiphertexts(self: &CryptoContextDCRTPoly,
                                        ciphertext1: &CiphertextDCRTPoly,
                                        ciphertext2: &CiphertextDCRTPoly);
@@ -600,6 +626,8 @@ pub mod ffi
                                               ciphertext: &CiphertextDCRTPoly, constant: f64);
         fn EvalSubInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
                                               ciphertext: &CiphertextDCRTPoly);
+        fn EvalSubMutableInPlace(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
+                                 ciphertext2: &CiphertextDCRTPoly);
         fn EvalMultByCiphertexts(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                                  ciphertext2: &CiphertextDCRTPoly)
                                  -> UniquePtr<CiphertextDCRTPoly>;
@@ -615,10 +643,24 @@ pub mod ffi
         fn EvalMultByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                         ciphertext: &CiphertextDCRTPoly, constant: f64)
                                         -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalMultMutableByCiphertexts(self: &CryptoContextDCRTPoly,
+                                       ciphertext1: &CiphertextDCRTPoly,
+                                       ciphertext2: &CiphertextDCRTPoly)
+                                       -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalMultMutableByCiphertextAndPlaintext(self: &CryptoContextDCRTPoly,
+                                                  ciphertext: &CiphertextDCRTPoly,
+                                                  plaintext: &Plaintext)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
+        fn EvalMultMutableByPlaintextAndCiphertext(self: &CryptoContextDCRTPoly,
+                                                  plaintext: &Plaintext,
+                                                  ciphertext: &CiphertextDCRTPoly)
+                                                  -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalMultInPlaceByCiphertextAndConst(self: &CryptoContextDCRTPoly,
                                                ciphertext: &CiphertextDCRTPoly, constant: f64);
         fn EvalMultInPlaceByConstAndCiphertext(self: &CryptoContextDCRTPoly, constant: f64,
                                                ciphertext: &CiphertextDCRTPoly);
+        fn EvalMultMutableInPlace(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
+                                 ciphertext2: &CiphertextDCRTPoly);
         fn EvalMultNoRelin(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,
                            ciphertext2: &CiphertextDCRTPoly) -> UniquePtr<CiphertextDCRTPoly>;
         fn EvalMultAndRelinearize(self: &CryptoContextDCRTPoly, ciphertext1: &CiphertextDCRTPoly,