From: 박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 Date: Thu, 6 Sep 2018 06:43:16 +0000 (+0900) Subject: [coco] Introduce PadF op (#1381) X-Git-Tag: nncc_backup~1904 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7dc6773acb001a58f34db3d41b16f07b3e2436cf;p=platform%2Fcore%2Fml%2Fnnfw.git [coco] Introduce PadF op (#1381) This commit introduces PadF op, and extends OpManager to support PadF construction. Signed-off-by: Jonghyun Park --- diff --git a/contrib/coco/core/include/coco/IR/Op.lst b/contrib/coco/core/include/coco/IR/Op.lst index 25572ba..6bad25c 100644 --- a/contrib/coco/core/include/coco/IR/Op.lst +++ b/contrib/coco/core/include/coco/IR/Op.lst @@ -7,4 +7,5 @@ OP(Conv2D) OP(MaxPool2D) OP(AvgPool2D) +OP(PadF) OP(ReLU) diff --git a/contrib/coco/core/include/coco/IR/OpManager.h b/contrib/coco/core/include/coco/IR/OpManager.h index 05e4f98..4dbc40d 100644 --- a/contrib/coco/core/include/coco/IR/OpManager.h +++ b/contrib/coco/core/include/coco/IR/OpManager.h @@ -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 index 0000000..09f684b --- /dev/null +++ b/contrib/coco/core/include/coco/IR/PadF.h @@ -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 *); + +public: + PadF(const PadF &) = delete; + PadF(PadF &&) = delete; + +public: + std::set 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 **out) const override { *out = _op_link; } + +private: + const PtrLink *const _op_link; + +private: + Padding2D _pad; +}; + +} // namespace coco + +#endif // __COCO_IR_PAD_F_H__ diff --git a/contrib/coco/core/src/IR/OpManager.cpp b/contrib/coco/core/src/IR/OpManager.cpp index d17627a..7f8f082 100644 --- a/contrib/coco/core/src/IR/OpManager.cpp +++ b/contrib/coco/core/src/IR/OpManager.cpp @@ -31,6 +31,7 @@ template <> AvgPool2D *OpManager::create(void) } template <> ReLU *OpManager::create(void) { return take(make_unique(_op_link)); } +template <> PadF *OpManager::create(void) { return take(make_unique(_op_link)); } void OpManager::destroy(Op *op) { diff --git a/contrib/coco/core/src/IR/OpManager.test.cpp b/contrib/coco/core/src/IR/OpManager.test.cpp index 908ea6d..28159cf 100644 --- a/contrib/coco/core/src/IR/OpManager.test.cpp +++ b/contrib/coco/core/src/IR/OpManager.test.cpp @@ -44,6 +44,13 @@ TEST_F(OpManagerTest, ReLU) ASSERT_NE(obj, nullptr); } +TEST_F(OpManagerTest, PadF) +{ + auto op = mgr.create(); + ASSERT_NE(op, nullptr); + mgr.destroy(op); +} + TEST_F(OpManagerTest, destroy) { auto op = mgr.create(); diff --git a/contrib/coco/core/src/IR/PadF.cpp b/contrib/coco/core/src/IR/PadF.cpp new file mode 100644 index 0000000..0eca3b7 --- /dev/null +++ b/contrib/coco/core/src/IR/PadF.cpp @@ -0,0 +1,23 @@ +#include "coco/IR/PadF.h" + +namespace coco +{ + +PadF::PadF(const PtrLink *op_link) : _op_link{op_link} +{ + // DO NOTHING +} + +std::set PadF::uses(void) const +{ + // NOTE PadF accesses no object + std::set 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 index 0000000..d5cffc6 --- /dev/null +++ b/contrib/coco/core/src/IR/PadF.test.cpp @@ -0,0 +1,73 @@ +#include "coco/IR/PadF.h" + +#include +#include + +#include + +namespace +{ +struct IsPadF : public coco::Op::DefaultVisitor +{ + 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 op_link; + +private: + std::vector> _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{})); +}