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]); });
}