void hadamard_multiply_inplace()

in src/hit/api/linearalgebra/linearalgebra.h [755:786]


        void hadamard_multiply_inplace(T &arg1, const T &arg2) {
            TRY_AND_THROW_STREAM(arg1.validate(),
                                 "First argument to hadamard_multiply is invalid; has it been initialized?");
            TRY_AND_THROW_STREAM(arg2.validate(),
                                 "Second argument to hadamard_multiply is invalid; has it been initialized?");
            if (arg1.encoding_unit() != arg2.encoding_unit()) {
                LOG_AND_THROW_STREAM("Inputs to hadamard_multiply must have the same units: "
                                     << dim_string(arg1.encoding_unit()) << "!=" << dim_string(arg2.encoding_unit()));
            }
            if (!arg1.same_size(arg2)) {
                LOG_AND_THROW_STREAM("Dimension mismatch in hadamard_multiply: " + dim_string(arg1)
                                     << " vs " + dim_string(arg2));
            }
            if (arg1.he_level() != arg2.he_level()) {
                LOG_AND_THROW_STREAM("Inputs to hadamard_multiply must have the same level: " << arg1.he_level() << "!="
                                                                                              << arg2.he_level());
            }
            if (arg1.scale() != arg2.scale()) {
                LOG_AND_THROW_STREAM("Inputs to hadamard_multiply must have the same scale: "
                                     << log2(arg1.scale()) << "bits != " << log2(arg2.scale()) << " bits");
            }
            if (arg1.needs_rescale() || arg2.needs_rescale()) {
                LOG_AND_THROW_STREAM("Inputs to hadamard_multiply must have nominal scale: "
                                     << "Vector: " << arg1.needs_rescale() << ", Matrix: " << arg2.needs_rescale());
            }
            if (arg1.needs_relin() || arg2.needs_relin()) {
                LOG_AND_THROW_STREAM("Inputs to hadamard_multiply must be linear ciphertexts: "
                                     << "Vector: " << arg1.needs_relin() << ", Matrix: " << arg2.needs_relin());
            }

            parallel_for(arg1.num_cts(), [&](int i) { eval.multiply_inplace(arg1[i], arg2[i]); });
        }