[coco] Introduce PadF op (#1381)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 6 Sep 2018 06:43:16 +0000 (15:43 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 6 Sep 2018 06:43:16 +0000 (15:43 +0900)
This commit introduces PadF op, and extends OpManager to support PadF
construction.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/Op.lst
contrib/coco/core/include/coco/IR/OpManager.h
contrib/coco/core/include/coco/IR/PadF.h [new file with mode: 0644]
contrib/coco/core/src/IR/OpManager.cpp
contrib/coco/core/src/IR/OpManager.test.cpp
contrib/coco/core/src/IR/PadF.cpp [new file with mode: 0644]
contrib/coco/core/src/IR/PadF.test.cpp [new file with mode: 0644]

index 25572ba..6bad25c 100644 (file)
@@ -7,4 +7,5 @@
 OP(Conv2D)
 OP(MaxPool2D)
 OP(AvgPool2D)
+OP(PadF)
 OP(ReLU)
index 05e4f98..4dbc40d 100644 (file)
@@ -5,6 +5,7 @@
 #include "coco/IR/Conv2D.h"
 #include "coco/IR/MaxPool2D.h"
 #include "coco/IR/AvgPool2D.h"
+#include "coco/IR/PadF.h"
 #include "coco/IR/ReLU.h"
 #include "coco/IR/Instr.forward.h"
 
diff --git a/contrib/coco/core/include/coco/IR/PadF.h b/contrib/coco/core/include/coco/IR/PadF.h
new file mode 100644 (file)
index 0000000..09f684b
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef __COCO_IR_PAD_F_H__
+#define __COCO_IR_PAD_F_H__
+
+#include "coco/IR/Op.h"
+#include "coco/IR/Padding2D.h"
+
+namespace coco
+{
+
+/**
+ * @brief Introduce padding area
+ */
+class PadF : public Op
+{
+public:
+  explicit PadF(const PtrLink<Op, Instr> *);
+
+public:
+  PadF(const PadF &) = delete;
+  PadF(PadF &&) = delete;
+
+public:
+  std::set<Object *> uses(void) const override;
+
+public:
+  PadF *asPadF(void) override { return this; }
+  const PadF *asPadF(void) const override { return this; }
+
+public:
+  void dispose(void) override;
+
+public:
+  Padding2D *pad(void) { return &_pad; }
+  const Padding2D *pad(void) const { return &_pad; }
+
+private:
+  void get(const PtrLink<Op, Instr> **out) const override { *out = _op_link; }
+
+private:
+  const PtrLink<Op, Instr> *const _op_link;
+
+private:
+  Padding2D _pad;
+};
+
+} // namespace coco
+
+#endif // __COCO_IR_PAD_F_H__
index d17627a..7f8f082 100644 (file)
@@ -31,6 +31,7 @@ template <> AvgPool2D *OpManager::create<AvgPool2D>(void)
 }
 
 template <> ReLU *OpManager::create<ReLU>(void) { return take(make_unique<ReLU>(_op_link)); }
+template <> PadF *OpManager::create<PadF>(void) { return take(make_unique<PadF>(_op_link)); }
 
 void OpManager::destroy(Op *op)
 {
index 908ea6d..28159cf 100644 (file)
@@ -44,6 +44,13 @@ TEST_F(OpManagerTest, ReLU)
   ASSERT_NE(obj, nullptr);
 }
 
+TEST_F(OpManagerTest, PadF)
+{
+  auto op = mgr.create<coco::PadF>();
+  ASSERT_NE(op, nullptr);
+  mgr.destroy(op);
+}
+
 TEST_F(OpManagerTest, destroy)
 {
   auto op = mgr.create<coco::Conv2D>();
diff --git a/contrib/coco/core/src/IR/PadF.cpp b/contrib/coco/core/src/IR/PadF.cpp
new file mode 100644 (file)
index 0000000..0eca3b7
--- /dev/null
@@ -0,0 +1,23 @@
+#include "coco/IR/PadF.h"
+
+namespace coco
+{
+
+PadF::PadF(const PtrLink<Op, Instr> *op_link) : _op_link{op_link}
+{
+  // DO NOTHING
+}
+
+std::set<Object *> PadF::uses(void) const
+{
+  // NOTE PadF accesses no object
+  std::set<Object *> res;
+  return res;
+}
+
+void PadF::dispose(void)
+{
+  // NOTE PadF has nothing to release
+}
+
+} // namespace coco
diff --git a/contrib/coco/core/src/IR/PadF.test.cpp b/contrib/coco/core/src/IR/PadF.test.cpp
new file mode 100644 (file)
index 0000000..d5cffc6
--- /dev/null
@@ -0,0 +1,73 @@
+#include "coco/IR/PadF.h"
+
+#include <memory>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace
+{
+struct IsPadF : public coco::Op::DefaultVisitor<bool>
+{
+  bool visit(const coco::PadF *) override { return true; }
+};
+
+class PadFTest : public ::testing::Test
+{
+public:
+  PadFTest()
+  {
+    // DO NOTHING
+  }
+
+protected:
+  coco::PadF *allocate(void)
+  {
+    auto op = new coco::PadF{&op_link};
+    _allocated.emplace_back(op);
+    return op;
+  }
+
+protected:
+  coco::PtrLink<coco::Op, coco::Instr> op_link;
+
+private:
+  std::vector<std::unique_ptr<coco::PadF>> _allocated;
+};
+} // namespace
+
+TEST_F(PadFTest, 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);
+
+  // pad() should be a valid
+  ASSERT_NE(op->pad(), nullptr);
+}
+
+TEST_F(PadFTest, asPadF)
+{
+  auto op = allocate();
+
+  coco::Op *mutable_base = op;
+  const coco::Op *immutable_base = op;
+
+  ASSERT_EQ(mutable_base->asPadF(), op);
+  ASSERT_EQ(mutable_base->asPadF(), immutable_base->asPadF());
+}
+
+TEST_F(PadFTest, accept)
+{
+  // Test 'PadF' class
+  auto op = allocate();
+
+  coco::PadF *mutable_ptr = op;
+  const coco::PadF *immutable_ptr = op;
+
+  ASSERT_TRUE(mutable_ptr->accept(IsPadF{}));
+  ASSERT_TRUE(immutable_ptr->accept(IsPadF{}));
+}