From 4533d854ba78134be3d5f45d28305005e147891f Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=84=B8=ED=9D=AC/On-Device=20Lab=28SR=29/Princip?= =?utf8?q?al=20Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Wed, 7 Aug 2019 10:55:30 +0900 Subject: [PATCH] [moco-tf] Canonicalizer for Sub (#6305) This will introduce Canonicalizer for TFSub node to EltwiseSub Signed-off-by: SaeHie Park --- .../src/Canonicalization/SubCanonicalizer.cpp | 109 +++++++++++++++++++++ .../src/Canonicalization/SubCanonicalizer.h | 44 +++++++++ 2 files changed, 153 insertions(+) create mode 100644 compiler/moco-tf/src/Canonicalization/SubCanonicalizer.cpp create mode 100644 compiler/moco-tf/src/Canonicalization/SubCanonicalizer.h diff --git a/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.cpp b/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.cpp new file mode 100644 index 0000000..316d9fb --- /dev/null +++ b/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.cpp @@ -0,0 +1,109 @@ +/* + * 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 "SubCanonicalizer.h" + +#include "Annotations/ShapeInferenceData.h" + +#include "Dialect/TFDialect.h" +#include "Dialect/TFNodes.h" +#include "Dialect/TFNodeVisitor.h" +#include "Dialect/TFNodeImpl.h" + +#include + +namespace +{ + +bool canonicalize_sub(loco::Graph *graph, moco::tf::TFSub *node) +{ + /** + * @note This will replace TFSub node with Canonical EltwiseSub + * + * Before + * A --- TFSub -- C + * B --/ + * After + * +------ TFSub -- + * | / + * B ------- + * | \ + * A -+------ EltwiseSub -- C + * + * Where + * A : x of TFSub + * B : y of TFSub + * C : a node that uses TFSub as an input + * TFSub is disconnected from C + */ + + auto ewsub_node = graph->nodes()->create(); + + // check condition: shape should be same + auto node_A = node->x(); + auto node_B = node->y(); + + auto x_shapedata = node_A->annot(); + assert(x_shapedata != nullptr); + auto y_shapedata = node_B->annot(); + assert(y_shapedata != nullptr); + + if (!(*x_shapedata == *y_shapedata)) + { + // TODO support broadcast Sub + return false; + } + + // update connections + ewsub_node->lhs(node_A); + ewsub_node->rhs(node_B); + + // replace node + replace(node).with(ewsub_node); + + return true; +} + +} // namespace + +namespace moco +{ +namespace tf +{ + +bool SubCanonicalizer::run(loco::Graph *graph) +{ + auto active_nodes = loco::active_nodes(loco::output_nodes(graph)); + bool changed = false; + + for (auto node : active_nodes) + { + if (node->dialect() == TFDialect::get()) + { + auto tf_node = dynamic_cast(node); + if (tf_node != nullptr) + { + if (canonicalize_sub(graph, tf_node)) + changed = true; + } + } + } + + return changed; +} + +} // namespace tf +} // namespace moco diff --git a/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.h b/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.h new file mode 100644 index 0000000..4ab4706 --- /dev/null +++ b/compiler/moco-tf/src/Canonicalization/SubCanonicalizer.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef __MOCO_TF_SUB_CANONICALIZER_H__ +#define __MOCO_TF_SUB_CANONICALIZER_H__ + +#include "Transform.h" + +#include + +namespace moco +{ +namespace tf +{ + +/** + * @brief Convert TFSub to Canonical EltwiseSub + */ +class SubCanonicalizer : public Transform +{ +public: + const char *name(void) const final { return "SubCanonicalizer"; } + +public: + bool run(loco::Graph *graph) override; +}; + +} // namespace tf +} // namespace moco + +#endif // __MOCO_TF_SUB_CANONICALIZER_H__ -- 2.7.4