[coco] Support Sub operator (#2698)
author윤지영/On-Device Lab./Engineer/삼성전자 <jy910.yun@samsung.com>
Mon, 17 Dec 2018 23:59:29 +0000 (08:59 +0900)
committer박종현/On-Device Lab./Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Mon, 17 Dec 2018 23:59:29 +0000 (08:59 +0900)
This commit add Sub operator in coco

Signed-off-by: Jiyoung Yun <jy910.yun@samsung.com>
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/Sub.test.cpp [new file with mode: 0644]

index 78db035..4ec8c2e 100644 (file)
@@ -12,5 +12,6 @@ OP(PadF)
 OP(ReLU)
 OP(ReLU6)
 OP(Add)
+OP(Sub)
 OP(Mul)
 OP(ConcatF)
index d76e8f8..c79a95e 100644 (file)
@@ -298,6 +298,25 @@ public:
 };
 
 /**
+ * @brief Element-wise subtraction
+ *
+ * Sub(L, R) is valid only when L and R have identical kind/shape/dtype
+ */
+class Sub final : public BinaryOp
+{
+public:
+  explicit Sub() = default;
+
+public:
+  Sub(const Sub &) = delete;
+  Sub(Sub &&) = delete;
+
+public:
+  Sub *asSub(void) override { return this; }
+  const Sub *asSub(void) const override { return this; }
+};
+
+/**
  * @brief Element-wise multiplication
  *
  * Mul(L, R) is valid only when L and R have identical kind/shape/dtype
index e9e97a5..62aeb53 100644 (file)
@@ -61,6 +61,13 @@ TEST_F(OpManagerTest, ReLU6)
   ASSERT_NE(obj, nullptr);
 }
 
+TEST_F(OpManagerTest, Sub)
+{
+  auto obj = mgr.create<coco::Sub>();
+
+  ASSERT_NE(obj, nullptr);
+}
+
 TEST_F(OpManagerTest, PadF)
 {
   auto op = mgr.create<coco::PadF>();
diff --git a/contrib/coco/core/src/IR/Sub.test.cpp b/contrib/coco/core/src/IR/Sub.test.cpp
new file mode 100644 (file)
index 0000000..6c8b9ba
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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 IsSub : public coco::Op::Visitor<bool>
+{
+  bool visit(const coco::Sub *) override { return true; }
+};
+
+class SubTest : public ::testing::Test
+{
+public:
+  SubTest()
+  {
+    // DO NOTHING
+  }
+
+protected:
+  coco::Sub *allocate(void)
+  {
+    auto op = new coco::Sub;
+    _allocated.emplace_back(op);
+    return op;
+  }
+
+private:
+  std::vector<std::unique_ptr<coco::Sub>> _allocated;
+};
+} // namespace
+
+TEST_F(SubTest, initialization)
+{
+  auto op = allocate();
+
+  // arguments should be empty on construction
+  ASSERT_EQ(op->left(), nullptr);
+  ASSERT_EQ(op->right(), nullptr);
+
+  // uses() should be empty on construction
+  ASSERT_EQ(op->uses().size(), 0);
+  // parent() should be nullptr on construction
+  ASSERT_EQ(op->parent(), nullptr);
+}
+
+TEST_F(SubTest, asSub)
+{
+  auto op = allocate();
+
+  coco::Op *mutable_base = op;
+  const coco::Op *immutable_base = op;
+
+  ASSERT_EQ(mutable_base->asSub(), op);
+  ASSERT_EQ(mutable_base->asSub(), immutable_base->asSub());
+}
+
+TEST_F(SubTest, accept)
+{
+  // Test 'Sub' class
+  auto op = allocate();
+
+  coco::Sub *mutable_ptr = op;
+  const coco::Sub *immutable_ptr = op;
+
+  ASSERT_TRUE(mutable_ptr->accept(IsSub{}));
+  ASSERT_TRUE(immutable_ptr->accept(IsSub{}));
+}