From d98af37726755f14d1d9fc1a5fd303436e5f616e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=B2=9C=EA=B5=90/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Mon, 13 May 2019 12:46:54 +0900 Subject: [PATCH] [locomotiv] Support Forward node (#3436) This commit starts to support loco::Forward node. In terms of node execution, Forward calculation is same with Push's. Signed-off-by: Cheongyo Bahk --- contrib/locomotiv/src/Node.lst | 1 + contrib/locomotiv/src/Node/Forward.cpp | 58 ++++++++++++++++++++ contrib/locomotiv/src/Node/Forward.test.cpp | 83 +++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 contrib/locomotiv/src/Node/Forward.cpp create mode 100644 contrib/locomotiv/src/Node/Forward.test.cpp diff --git a/contrib/locomotiv/src/Node.lst b/contrib/locomotiv/src/Node.lst index 0754a22..a7c689c 100644 --- a/contrib/locomotiv/src/Node.lst +++ b/contrib/locomotiv/src/Node.lst @@ -4,5 +4,6 @@ // NODE(Name) : alphabetic order please +NODE(Forward) NODE(Pull) NODE(Push) diff --git a/contrib/locomotiv/src/Node/Forward.cpp b/contrib/locomotiv/src/Node/Forward.cpp new file mode 100644 index 0000000..1c22aa0 --- /dev/null +++ b/contrib/locomotiv/src/Node/Forward.cpp @@ -0,0 +1,58 @@ +/* + * 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 "NodeExecution.h" + +#include "NodeDataImpl.h" + +#include + +namespace locomotiv +{ + +void NodeExecution::execute(loco::Forward *forward) +{ + auto input_data = annot_data(forward->input()); + + if (!input_data) + { + throw std::runtime_error("Ingredient not ready"); + } + + switch (input_data->dtype()) + { + case loco::DataType::S32: + { + auto input_bufptr = input_data->as_s32_bufptr(); + auto forward_data = make_data(*input_bufptr); + erase_annot_data(forward); + annot_data(forward, std::move(forward_data)); + break; + } + case loco::DataType::FLOAT32: + { + auto input_bufptr = input_data->as_f32_bufptr(); + auto forward_data = make_data(*input_bufptr); + erase_annot_data(forward); + annot_data(forward, std::move(forward_data)); + break; + } + default: + throw std::runtime_error("NYI for this DataType"); + } +} + +} // namespace locomotiv diff --git a/contrib/locomotiv/src/Node/Forward.test.cpp b/contrib/locomotiv/src/Node/Forward.test.cpp new file mode 100644 index 0000000..0e1c989 --- /dev/null +++ b/contrib/locomotiv/src/Node/Forward.test.cpp @@ -0,0 +1,83 @@ +/* + * 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 "NodeExecution.h" + +#include "locomotiv/NodeData.h" +#include "NodeDataImpl.h" + +#include +#include +#include + +#include + +using nncc::core::ADT::tensor::Index; +using nncc::core::ADT::tensor::Shape; +using nncc::core::ADT::tensor::LexicalLayout; +using nncc::core::ADT::tensor::make_buffer; + +TEST(NodeExecution_Forward, s32) +{ + // Make pull-forward graph + auto g = loco::make_graph(); + auto pull = g->nodes()->create(); + pull->dtype(loco::DataType::S32); + pull->rank(1); + pull->dim(0) = loco::make_dimension(1); + auto forward = g->nodes()->create(); + forward->input(pull); + + // Make and assign data to pull node + auto pull_buf = make_buffer(Shape{1}); + pull_buf.at(Index{0}) = 42; + auto pull_data = locomotiv::make_data(pull_buf); + locomotiv::annot_data(pull, std::move(pull_data)); + + locomotiv::NodeExecution::get().run(forward); + + auto forward_data = locomotiv::annot_data(forward); + ASSERT_NE(forward_data, nullptr); + ASSERT_EQ(forward_data->dtype(), loco::DataType::S32); + ASSERT_EQ(*(forward_data->shape()), Shape{1}); + ASSERT_EQ(forward_data->as_s32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); +} + +TEST(NodeExecution_Forward, f32) +{ + // Make pull-forward graph + auto g = loco::make_graph(); + auto pull = g->nodes()->create(); + pull->dtype(loco::DataType::FLOAT32); + pull->rank(1); + pull->dim(0) = loco::make_dimension(1); + auto forward = g->nodes()->create(); + forward->input(pull); + + // Make and assign data to pull node + auto pull_buf = make_buffer(Shape{1}); + pull_buf.at(Index{0}) = 3.14f; + auto pull_data = locomotiv::make_data(pull_buf); + locomotiv::annot_data(pull, std::move(pull_data)); + + locomotiv::NodeExecution::get().run(forward); + + auto forward_data = locomotiv::annot_data(forward); + ASSERT_NE(forward_data, nullptr); + ASSERT_EQ(forward_data->dtype(), loco::DataType::FLOAT32); + ASSERT_EQ(*(forward_data->shape()), Shape{1}); + ASSERT_FLOAT_EQ(forward_data->as_f32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); +} -- 2.7.4