[neurun] Add Logistic operation (#4523)
author윤지영/On-Device Lab(SR)/Engineer/삼성전자 <jy910.yun@samsung.com>
Thu, 28 Feb 2019 00:49:00 +0000 (09:49 +0900)
committer오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Thu, 28 Feb 2019 00:49:00 +0000 (09:49 +0900)
This commit does not have any kernel implementation.
It's only for a basic structure for Logistic operation.

Signed-off-by: Jiyoung Yun <jy910.yun@samsung.com>
runtimes/neurun/src/backend/acl_cl/StageGenerator.cc
runtimes/neurun/src/backend/cpu/StageGenerator.cc
runtimes/neurun/src/compiler/OperationValidator.cc
runtimes/neurun/src/frontend/wrapper/OperationFactory.cc
runtimes/neurun/src/frontend/wrapper/model.cc
runtimes/neurun/src/model/operation/LogisticNode.cc [new file with mode: 0644]
runtimes/neurun/src/model/operation/LogisticNode.h [new file with mode: 0644]
runtimes/neurun/src/model/operation/Node.Include.h
runtimes/neurun/src/model/operation/Op.lst

index fa0b92b..f5f40a4 100644 (file)
@@ -1178,6 +1178,11 @@ void StageGenerator::visit(const model::operation::SubNode &node)
   });
 }
 
+void StageGenerator::visit(const model::operation::LogisticNode &)
+{
+  throw std::runtime_error("LogisticNode for acl_cl is not implemented yet");
+}
+
 } // namespace acl_cl
 } // namespace backend
 } // namespace neurun
index ae75ead..fd385fc 100644 (file)
@@ -653,6 +653,11 @@ void StageGenerator::visit(const model::operation::StridedSliceNode &)
 
 void StageGenerator::visit(const model::operation::TanhNode &) { throw std::runtime_error("NYI"); }
 
+void StageGenerator::visit(const model::operation::LogisticNode &)
+{
+  throw std::runtime_error("LogisticNode for cpu is not implemented yet");
+}
+
 void StageGenerator::visit(const model::operation::PermuteNode &node)
 {
   const auto output_index{node.getOutputs().at(0)};
index e05d2e8..592737d 100644 (file)
@@ -94,6 +94,11 @@ void OperationValidator::visit(const model::operation::TanhNode &)
   // DO NOTHING
 }
 
+void OperationValidator::visit(const model::operation::LogisticNode &)
+{
+  // DO NOTHING
+}
+
 void OperationValidator::visit(const model::operation::PermuteNode &node)
 {
   VERBOSE(Permute) << "Configure Permute operation" << std::endl;
index 9f5fc9e..851c5dc 100644 (file)
@@ -199,6 +199,19 @@ OperationFactory::OperationFactory()
 
     return new operation::TanhNode{inputs, outputs};
   };
+
+  _map[ANEURALNETWORKS_LOGISTIC] = [](const OperationFactory::Param &init_param) {
+    assert(init_param.input_count == 1 && init_param.output_count == 1);
+
+    operand::IndexSet outputs{init_param.outputs[0]};
+
+    // Each input should be interpreted as follows:
+    //
+    //  0 -> Input Tensor Index
+    operand::IndexSet inputs{init_param.inputs[0]};
+
+    return new operation::LogisticNode{inputs, outputs};
+  };
 }
 
 neurun::model::operation::Node *OperationFactory::create(ANeuralNetworksOperationType type,
index aff611a..8f6e628 100644 (file)
@@ -115,6 +115,7 @@ bool ANeuralNetworksModel::addOperation(ANeuralNetworksOperationType type, uint3
       case ANEURALNETWORKS_MUL:
       case ANEURALNETWORKS_TANH:
       case ANEURALNETWORKS_STRIDED_SLICE:
+      case ANEURALNETWORKS_LOGISTIC:
       {
         auto node = factory.create(type, param);
         _model->addOperation(std::unique_ptr<neurun::model::operation::Node>{node});
diff --git a/runtimes/neurun/src/model/operation/LogisticNode.cc b/runtimes/neurun/src/model/operation/LogisticNode.cc
new file mode 100644 (file)
index 0000000..990e189
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "LogisticNode.h"
+
+#include <cassert>
+
+#include "NodeVisitor.h"
+
+namespace neurun
+{
+namespace model
+{
+namespace operation
+{
+
+void LogisticNode::accept(NodeVisitor &&v) const { v.visit(*this); }
+
+LogisticNode::LogisticNode(const operand::IndexSet &inputs, const operand::IndexSet &outputs)
+    : model::operation::Node{OperandConstraint::createExact(1u), inputs, outputs}
+{
+}
+
+} // namespace operation
+} // namespace model
+} // namespace neurun
diff --git a/runtimes/neurun/src/model/operation/LogisticNode.h b/runtimes/neurun/src/model/operation/LogisticNode.h
new file mode 100644 (file)
index 0000000..2c622b6
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NEURUN_MODEL_OPERATION_LOGISTIC_NODE_H__
+#define __NEURUN_MODEL_OPERATION_LOGISTIC_NODE_H__
+
+#include "model/operation/Node.h"
+
+namespace neurun
+{
+namespace model
+{
+namespace operation
+{
+
+class LogisticNode : public model::operation::Node
+{
+public:
+  enum Input
+  {
+    INPUT = 0
+  };
+
+public:
+  LogisticNode(const operand::IndexSet &inputs, const operand::IndexSet &outputs);
+
+public:
+  virtual void accept(NodeVisitor &&) const override;
+  virtual std::string getName() const override { return "Tanh"; }
+};
+
+} // namespace operation
+} // namespace model
+} // namespace neurun
+
+#endif // __NEURUN_MODEL_OPERATION_LOGISTIC_NODE_H__
index 1407d6d..f89c42c 100644 (file)
@@ -30,3 +30,4 @@
 #include "StridedSliceNode.h"
 #include "MulNode.h"
 #include "TanhNode.h"
+#include "LogisticNode.h"
index 7c8630d..419f14a 100644 (file)
@@ -34,4 +34,5 @@ OP(MulNode                 , true    , MUL)
 OP(SoftmaxNode             , true    , SOFTMAX)
 OP(StridedSliceNode        , true    , STRIDED_SLICE)
 OP(TanhNode                , true    , TANH)
+OP(LogisticNode            , true    , LOGISTIC)
 OP(PermuteNode             , false   , NOT_AVAILABLE)