[coco] Support ReLU6 for tflite in coco (#2191)
author남궁석/동작제어Lab(SR)/Engineer/삼성전자 <sk.namkoong@samsung.com>
Fri, 9 Nov 2018 07:35:08 +0000 (16:35 +0900)
committer박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Fri, 9 Nov 2018 07:35:08 +0000 (16:35 +0900)
* [coco] Support ReLU6 for tflite in coco

This commit will enable ReLU6 operation for tflite in coco

Signed-off-by: Seok NamKoong <sk.namkoong@samsung.com>
* Add comment

* modify comment

contrib/coco/core/include/coco/IR/Op.lst
contrib/coco/core/include/coco/IR/Ops.h
contrib/coco/core/src/IR/OpManager.test.cpp
contrib/coco/core/src/IR/ReLU6.test.cpp [new file with mode: 0644]

index 96467be..78db035 100644 (file)
@@ -10,6 +10,7 @@ OP(MaxPool2D)
 OP(AvgPool2D)
 OP(PadF)
 OP(ReLU)
+OP(ReLU6)
 OP(Add)
 OP(Mul)
 OP(ConcatF)
index 6534d27..c197a17 100644 (file)
@@ -255,6 +255,24 @@ public:
 };
 
 /**
+ * @brief Apply ReLU6 over elements
+ * @note ReLU6 is subject to change
+ */
+class ReLU6 final : public UnaryOp
+{
+public:
+  explicit ReLU6() = default;
+
+public:
+  ReLU6(const ReLU6 &) = delete;
+  ReLU6(ReLU6 &&) = delete;
+
+public:
+  ReLU6 *asReLU6(void) override { return this; }
+  const ReLU6 *asReLU6(void) const override { return this; }
+};
+
+/**
  * @brief Element-wise addition
  *
  * Add(L, R) is valid only when L and R have identical kind/shape/dtype
index ec9816d..daaea4c 100644 (file)
@@ -54,6 +54,13 @@ TEST_F(OpManagerTest, ReLU)
   ASSERT_NE(obj, nullptr);
 }
 
+TEST_F(OpManagerTest, ReLU6)
+{
+  auto obj = mgr.create<coco::ReLU6>();
+
+  ASSERT_NE(obj, nullptr);
+}
+
 TEST_F(OpManagerTest, PadF)
 {
   auto op = mgr.create<coco::PadF>();
diff --git a/contrib/coco/core/src/IR/ReLU6.test.cpp b/contrib/coco/core/src/IR/ReLU6.test.cpp
new file mode 100644 (file)
index 0000000..938bb04
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2018 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 "coco/IR/Ops.h"
+
+#include <memory>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace
+{
+struct IsReLU6 : public coco::Op::DefaultVisitor<bool>
+{
+  bool visit(const coco::ReLU6 *) override { return true; }
+};
+
+class ReLU6Test : public ::testing::Test
+{
+public:
+  ReLU6Test()
+  {
+    // DO NOTHING
+  }
+
+protected:
+  coco::ReLU6 *allocate(void)
+  {
+    auto op = new coco::ReLU6;
+    _allocated.emplace_back(op);
+    return op;
+  }
+
+private:
+  std::vector<std::unique_ptr<coco::ReLU6>> _allocated;
+};
+} // namespace
+
+TEST_F(ReLU6Test, initialization)
+{
+  auto op = allocate();
+
+  // uses() should be empty on construction
+  ASSERT_EQ(op->uses().size(), 0);
+  // parent() should be nullptr on construction
+  ASSERT_EQ(op->parent(), nullptr);
+
+  ASSERT_EQ(op->arg(), nullptr);
+}
+
+TEST_F(ReLU6Test, asReLU6)
+{
+  auto op = allocate();
+
+  coco::Op *mutable_base = op;
+  const coco::Op *immutable_base = op;
+
+  ASSERT_EQ(mutable_base->asReLU6(), op);
+  ASSERT_EQ(mutable_base->asReLU6(), immutable_base->asReLU6());
+}
+
+TEST_F(ReLU6Test, accept)
+{
+  // Test 'ReLU6' class
+  auto op = allocate();
+
+  coco::ReLU6 *mutable_ptr = op;
+  const coco::ReLU6 *immutable_ptr = op;
+
+  ASSERT_TRUE(mutable_ptr->accept(IsReLU6{}));
+  ASSERT_TRUE(immutable_ptr->accept(IsReLU6{}));
+}