diff options
author | Chunseok Lee <chunseok.lee@samsung.com> | 2020-08-14 15:19:19 +0900 |
---|---|---|
committer | Chunseok Lee <chunseok.lee@samsung.com> | 2020-08-14 15:19:19 +0900 |
commit | 042b262b3633b6c0f577aed6cb4b980ad0c1dcf3 (patch) | |
tree | e79fb9ffe65b21bdc5863306db2757ab187a3306 /compiler/luci/service | |
parent | 05e0ec30a632339a8533082476f27bda31ccde16 (diff) | |
download | nnfw-042b262b3633b6c0f577aed6cb4b980ad0c1dcf3.tar.gz nnfw-042b262b3633b6c0f577aed6cb4b980ad0c1dcf3.tar.bz2 nnfw-042b262b3633b6c0f577aed6cb4b980ad0c1dcf3.zip |
Imported Upstream version 1.8.0upstream/1.8.0submit/tizen/20200814.062151
Diffstat (limited to 'compiler/luci/service')
-rw-r--r-- | compiler/luci/service/src/CircleShapeInferenceRule.cpp | 59 | ||||
-rw-r--r-- | compiler/luci/service/src/CircleTypeInferenceRule.cpp | 33 |
2 files changed, 91 insertions, 1 deletions
diff --git a/compiler/luci/service/src/CircleShapeInferenceRule.cpp b/compiler/luci/service/src/CircleShapeInferenceRule.cpp index a291cfe70..6355ec546 100644 --- a/compiler/luci/service/src/CircleShapeInferenceRule.cpp +++ b/compiler/luci/service/src/CircleShapeInferenceRule.cpp @@ -1010,6 +1010,12 @@ public: loco::NodeShape visit(const luci::CircleNeg *node) final { return use_x(node); } + loco::NodeShape visit(const luci::CircleNonMaxSuppressionV4 *node) final + { + const auto boxes_shape = loco::shape_get(node->boxes()).as<loco::TensorShape>(); + return loco::NodeShape{boxes_shape}; + } + loco::NodeShape visit(const luci::CircleNotEqual *node) final { return broadcast_xy(node); } loco::NodeShape visit(const luci::CircleOneHot *node) final @@ -1818,6 +1824,18 @@ public: return output_shape; } + loco::NodeShape visit(const luci::CircleUnique *node) final + { + auto input_shape = loco::shape_get(node->input()).as<loco::TensorShape>(); + + assert(input_shape.rank() == 1); + + loco::TensorShape shape_output; + shape_output = own_shape(node); + + return loco::NodeShape{shape_output}; + } + loco::NodeShape visit(const luci::CircleTransposeConv *node) final { // TransposeConv's output shape is written in its 'inputSizes' argument @@ -2019,6 +2037,34 @@ public: return loco::NodeShape{*then_graph_output->shape()}; } + loco::NodeShape visit(const luci::CircleNonMaxSuppressionV4Out *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto nmsv4 = dynamic_cast<const luci::CircleNonMaxSuppressionV4 *>(node->input()); + if (nmsv4 == nullptr) + INTERNAL_EXN("CircleNonMaxSuppressionV4 IR is not configured correctly"); + + auto index = node->index(); + if (index == 1) + return loco::TensorShape({0}); + + assert(index == 0); + + auto unknown = loco::TensorShape{loco::Dimension()}; + auto max_output_size = dynamic_cast<const luci::CircleConst *>(nmsv4->max_output_size()); + if (max_output_size == nullptr) + return unknown; // we need CircleConst for max output size + + LUCI_ASSERT(max_output_size->dtype() == S32, "Only support int32 for max_output_size"); + + if (max_output_size->size<S32>() < 1) + return unknown; + + auto max_output_size_value = uint32_t(max_output_size->at<S32>(0)); + return loco::TensorShape{max_output_size_value}; + } + loco::NodeShape visit(const luci::CircleSplitOut *node) final { const loco::DataType S32 = loco::DataType::S32; @@ -2142,6 +2188,19 @@ public: return loco::NodeShape{output_shape}; } + loco::NodeShape visit(const luci::CircleUniqueOut *node) final + { + auto unique = dynamic_cast<const luci::CircleUnique *>(node->input()); + if (unique == nullptr) + { + INTERNAL_EXN("CircleUnique IR is not configured correctly"); + } + + auto unique_shape = loco::shape_get(unique).as<loco::TensorShape>(); + + return loco::NodeShape{unique_shape}; + } + loco::NodeShape visit(const luci::CircleUnpackOut *node) final { auto unpack = dynamic_cast<const luci::CircleUnpack *>(node->input()); diff --git a/compiler/luci/service/src/CircleTypeInferenceRule.cpp b/compiler/luci/service/src/CircleTypeInferenceRule.cpp index de2ba3ea4..e7910bfc0 100644 --- a/compiler/luci/service/src/CircleTypeInferenceRule.cpp +++ b/compiler/luci/service/src/CircleTypeInferenceRule.cpp @@ -252,6 +252,11 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitor<loco::DataT loco::DataType visit(const luci::CircleNeg *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleNonMaxSuppressionV4 *node) final + { + return loco::dtype_get(node->boxes()); + } + loco::DataType visit(const luci::CircleNotEqual *) final { return loco::DataType::BOOL; } loco::DataType visit(const luci::CirclePack *node) final @@ -345,7 +350,10 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitor<loco::DataT return loco::dtype_get(node->tensor()); } - loco::DataType visit(const luci::CircleResizeBilinear *) final { return loco::DataType::FLOAT32; } + loco::DataType visit(const luci::CircleResizeBilinear *node) final + { + return loco::dtype_get(node->input()); + } loco::DataType visit(const luci::CircleResizeNearestNeighbor *node) final { @@ -472,6 +480,11 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitor<loco::DataT return loco::dtype_get(node->outBackprop()); } + loco::DataType visit(const luci::CircleUnique *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleUnpack *node) final { return loco::dtype_get(node->value()); @@ -569,6 +582,13 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitor<loco::DataT return then_graph_output->dtype(); } + loco::DataType visit(const luci::CircleNonMaxSuppressionV4Out *node) final + { + (void)node; + assert(node->index() == 0 || node->index() == 1); + return loco::DataType::S32; + } + loco::DataType visit(const luci::CircleSplitOut *node) final { return loco::dtype_get(node->input()); @@ -589,6 +609,17 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitor<loco::DataT return loco::DataType::S32; } + loco::DataType visit(const luci::CircleUniqueOut *node) final + { + if (node->index() == 0) + { + return loco::dtype_get(node->input()); + } + assert(node->index() == 1); + auto unique = loco::must_cast<luci::CircleUnique *>(node->input()); + return unique->idx_out_type(); + } + loco::DataType visit(const luci::CircleUnpackOut *node) final { return loco::dtype_get(node->input()); |