[Tensor] Add erf operation to Tensor
authorSeungbaek Hong <sb92.hong@samsung.com>
Thu, 17 Aug 2023 05:52:26 +0000 (14:52 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Tue, 10 Oct 2023 08:20:54 +0000 (17:20 +0900)
Added gaussian error function(erf) to Tensor
and unittest for this.

It was already added pr #2208,
but it is deleted in pr #2238 (I don't know why it is deleted).

So, I restored that function for our tensor operation.

**Self evaluation:**
1. Build test:  [X]Passed [ ]Failed [ ]Skipped
2. Run test:  [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: Seungbaek Hong <sb92.hong@samsung.com>
nntrainer/tensor/tensor.cpp

index f9038813c44002596289d7d38f60ffccde2d2b6f..e63b190f898cfa827a33fd39b590b3e7992df144 100644 (file)
@@ -3255,6 +3255,31 @@ std::vector<unsigned int> Tensor::argmax() const {
   return result;
 }
 
+int Tensor::erf_i() {
+  erf(*this);
+  return ML_ERROR_NONE;
+}
+
+Tensor Tensor::erf() const {
+  Tensor t;
+  return erf(t);
+}
+
+Tensor &Tensor::erf(Tensor &out) const {
+  if (dim.getDataType() == ml::train::TensorDim::DataType::FP32) {
+    auto f = [](float in) { return std::erf(in); };
+    apply<float>(f, out);
+  } else if (dim.getDataType() == ml::train::TensorDim::DataType::FP16) {
+#ifdef ENABLE_FP16
+    auto f = [](_FP16 in) { return std::erf(in); };
+    apply<_FP16>(f, out);
+#else
+    throw std::invalid_argument("Error: enable-fp16 is not enabled");
+#endif
+  }
+  return out;
+}
+
 float Tensor::l2norm() const {
   NNTR_THROW_IF(!contiguous, std::invalid_argument)
     << getName() << " is not contiguous, cannot get l2norm.";