2 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef __LUCI_CIRCLE_SHAPE_INFERENCE_H__
18 #define __LUCI_CIRCLE_SHAPE_INFERENCE_H__
20 #include <luci/Service/CircleShapeInferenceRule.h>
21 #include <luci/IR/CircleNodes.h>
22 #include <luci/IR/CircleNodeVisitor.h>
24 #include <loco/IR/NodeShape.h>
25 #include <loco/IR/TensorShape.h>
30 namespace sinf // namespace for Shape Inference
35 bool infer(const luci::CircleNode *, loco::TensorShape &) const;
38 class Algorithm final : public luci::CircleNodeVisitor<loco::TensorShape>
41 // TODO Remove this when all of visit function is implemented
42 loco::TensorShape visit(const luci::CircleNode *node) final
44 loco::NodeShape shape;
45 luci::CircleShapeInferenceRule().infer(node, shape);
46 return shape.as<loco::TensorShape>();
49 // loco::TensorShape visit(const luci::CircleAbs *node) final;
50 // loco::TensorShape visit(const luci::CircleAdd *node) final;
51 // loco::TensorShape visit(const luci::CircleAddN *node) final;
52 // loco::TensorShape visit(const luci::CircleArgMax *node) final;
53 // loco::TensorShape visit(const luci::CircleArgMin *node) final;
54 // loco::TensorShape visit(const luci::CircleAveragePool2D *node) final;
55 // loco::TensorShape visit(const luci::CircleBatchMatMul *node) final;
56 // loco::TensorShape visit(const luci::CircleBatchToSpaceND *node) final;
57 // loco::TensorShape visit(const luci::CircleCast *node) final;
58 // loco::TensorShape visit(const luci::CircleCeil *node) final;
59 // loco::TensorShape visit(const luci::CircleConcatenation *node) final;
60 // loco::TensorShape visit(const luci::CircleConst *node) final;
61 // loco::TensorShape visit(const luci::CircleConv2D *node) final;
62 // loco::TensorShape visit(const luci::CircleCos *node) final;
63 // loco::TensorShape visit(const luci::CircleCustom *node) final;
64 // loco::TensorShape visit(const luci::CircleDepthToSpace *node) final;
65 // loco::TensorShape visit(const luci::CircleDepthwiseConv2D *node) final;
66 // loco::TensorShape visit(const luci::CircleDequantize *node) final;
67 // loco::TensorShape visit(const luci::CircleDiv *node) final;
68 // loco::TensorShape visit(const luci::CircleElu *node) final;
69 // loco::TensorShape visit(const luci::CircleEqual *node) final;
70 // loco::TensorShape visit(const luci::CircleExp *node) final;
71 // loco::TensorShape visit(const luci::CircleExpandDims *node) final;
72 // loco::TensorShape visit(const luci::CircleFakeQuant *node) final;
73 // loco::TensorShape visit(const luci::CircleFill *node) final;
74 // loco::TensorShape visit(const luci::CircleFloor *node) final;
75 // loco::TensorShape visit(const luci::CircleFloorDiv *node) final;
76 // loco::TensorShape visit(const luci::CircleFloorMod *node) final;
77 // loco::TensorShape visit(const luci::CircleFullyConnected *node) final;
78 // loco::TensorShape visit(const luci::CircleGather *node) final;
79 // loco::TensorShape visit(const luci::CircleGatherNd *node) final;
80 // loco::TensorShape visit(const luci::CircleGreater *node) final;
81 // loco::TensorShape visit(const luci::CircleGreaterEqual *node) final;
82 // loco::TensorShape visit(const luci::CircleHardSwish *node) final;
83 // loco::TensorShape visit(const luci::CircleIf *node) final;
84 // loco::TensorShape visit(const luci::CircleL2Normalize *node) final;
85 // loco::TensorShape visit(const luci::CircleL2Pool2D *node) final;
86 // loco::TensorShape visit(const luci::CircleLeakyRelu *node) final;
87 // loco::TensorShape visit(const luci::CircleLess *node) final;
88 // loco::TensorShape visit(const luci::CircleLessEqual *node) final;
89 // loco::TensorShape visit(const luci::CircleLocalResponseNormalization *node) final;
90 // loco::TensorShape visit(const luci::CircleLog *node) final;
91 // loco::TensorShape visit(const luci::CircleLogicalAnd *node) final;
92 // loco::TensorShape visit(const luci::CircleLogicalNot *node) final;
93 // loco::TensorShape visit(const luci::CircleLogicalOr *node) final;
94 // loco::TensorShape visit(const luci::CircleLogistic *node) final;
95 // loco::TensorShape visit(const luci::CircleLogSoftmax *node) final;
96 // loco::TensorShape visit(const luci::CircleMatrixDiag *node) final;
97 // loco::TensorShape visit(const luci::CircleMatrixSetDiag *node) final;
98 // loco::TensorShape visit(const luci::CircleMaximum *node) final;
99 // loco::TensorShape visit(const luci::CircleMaxPool2D *node) final;
100 // loco::TensorShape visit(const luci::CircleMean *node) final;
101 // loco::TensorShape visit(const luci::CircleMinimum *node) final;
102 // loco::TensorShape visit(const luci::CircleMirrorPad *node) final;
103 // loco::TensorShape visit(const luci::CircleMul *node) final;
104 // loco::TensorShape visit(const luci::CircleNeg *node) final;
105 // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV4 *node) final;
106 // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV5 *node) final;
107 // loco::TensorShape visit(const luci::CircleNotEqual *node) final;
108 // loco::TensorShape visit(const luci::CircleOneHot *node) final;
109 // loco::TensorShape visit(const luci::CirclePack *node) final;
110 // loco::TensorShape visit(const luci::CirclePad *node) final;
111 // loco::TensorShape visit(const luci::CirclePadV2 *node) final;
112 // loco::TensorShape visit(const luci::CirclePow *node) final;
113 // loco::TensorShape visit(const luci::CirclePRelu *node) final;
114 // loco::TensorShape visit(const luci::CircleQuantize *node) final;
115 // loco::TensorShape visit(const luci::CircleRange *node) final;
116 // loco::TensorShape visit(const luci::CircleRank *node) final;
117 // loco::TensorShape visit(const luci::CircleReduceAny *node) final;
118 // loco::TensorShape visit(const luci::CircleReduceMax *node) final;
119 // loco::TensorShape visit(const luci::CircleReduceMin *node) final;
120 // loco::TensorShape visit(const luci::CircleReduceProd *node) final;
121 // loco::TensorShape visit(const luci::CircleRelu *node) final;
122 // loco::TensorShape visit(const luci::CircleRelu6 *node) final;
123 // loco::TensorShape visit(const luci::CircleReluN1To1 *node) final;
124 // loco::TensorShape visit(const luci::CircleReshape *node) final;
125 // loco::TensorShape visit(const luci::CircleResizeBilinear *node) final;
126 // loco::TensorShape visit(const luci::CircleResizeNearestNeighbor *node) final;
127 // loco::TensorShape visit(const luci::CircleReverseSequence *node) final;
128 // loco::TensorShape visit(const luci::CircleReverseV2 *node) final;
129 // loco::TensorShape visit(const luci::CircleRound *node) final;
130 // loco::TensorShape visit(const luci::CircleRsqrt *node) final;
131 // loco::TensorShape visit(const luci::CircleScatterNd *node) final;
132 // loco::TensorShape visit(const luci::CircleSegmentSum *node) final;
133 // loco::TensorShape visit(const luci::CircleSelect *node) final;
134 // loco::TensorShape visit(const luci::CircleSelectV2 *node) final;
135 // loco::TensorShape visit(const luci::CircleShape *node) final;
136 // loco::TensorShape visit(const luci::CircleSin *node) final;
137 // loco::TensorShape visit(const luci::CircleSlice *node) final;
138 // loco::TensorShape visit(const luci::CircleSoftmax *node) final;
139 // loco::TensorShape visit(const luci::CircleSpaceToBatchND *node) final;
140 // loco::TensorShape visit(const luci::CircleSpaceToDepth *node) final;
141 // loco::TensorShape visit(const luci::CircleSparseToDense *node) final;
142 // loco::TensorShape visit(const luci::CircleSplit *node) final;
143 // loco::TensorShape visit(const luci::CircleSplitV *node) final;
144 // loco::TensorShape visit(const luci::CircleSqrt *node) final;
145 // loco::TensorShape visit(const luci::CircleSquare *node) final;
146 // loco::TensorShape visit(const luci::CircleSquaredDifference *node) final;
147 // loco::TensorShape visit(const luci::CircleSqueeze *node) final;
148 // loco::TensorShape visit(const luci::CircleStridedSlice *node) final;
149 // loco::TensorShape visit(const luci::CircleSub *node) final;
150 // loco::TensorShape visit(const luci::CircleSum *node) final;
151 // loco::TensorShape visit(const luci::CircleTanh *node) final;
152 // loco::TensorShape visit(const luci::CircleTile *node) final;
153 // loco::TensorShape visit(const luci::CircleTopKV2 *node) final;
154 // loco::TensorShape visit(const luci::CircleTranspose *node) final;
155 // loco::TensorShape visit(const luci::CircleTransposeConv *node) final;
156 // loco::TensorShape visit(const luci::CircleUnidirectionalSequenceLSTM *node) final;
157 // loco::TensorShape visit(const luci::CircleUnique *node) final;
158 // loco::TensorShape visit(const luci::CircleUnpack *node) final;
159 // loco::TensorShape visit(const luci::CircleWhere *node) final;
160 // loco::TensorShape visit(const luci::CircleWhile *node) final;
161 // loco::TensorShape visit(const luci::CircleZerosLike *node) final;
164 // loco::TensorShape visit(const luci::CircleBCQFullyConnected *node) final;
165 // loco::TensorShape visit(const luci::CircleBCQGather *node) final;
166 // loco::TensorShape visit(const luci::CircleInstanceNorm *node) final;
169 // loco::TensorShape visit(const luci::CircleCustomOut *node) final;
170 loco::TensorShape visit(const luci::CircleIfOut *node) final;
171 // loco::TensorShape visit(const luci::CircleInput *node) final;
172 // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV4Out *node) final;
173 // loco::TensorShape visit(const luci::CircleNonMaxSuppressionV5Out *node) final;
174 // loco::TensorShape visit(const luci::CircleOutput *node) final;
175 // loco::TensorShape visit(const luci::CircleOutputDummy *node) final;
176 // loco::TensorShape visit(const luci::CircleOutputExclude *node) final;
177 // loco::TensorShape visit(const luci::CircleSplitOut *node) final;
178 // loco::TensorShape visit(const luci::CircleSplitVOut *node) final;
179 // loco::TensorShape visit(const luci::CircleTopKV2Out *node) final;
180 // loco::TensorShape visit(const luci::CircleUniqueOut *node) final;
181 // loco::TensorShape visit(const luci::CircleUnpackOut *node) final;
182 // loco::TensorShape visit(const luci::CircleWhileOut *node) final;
189 #endif // __LUCI_CIRCLE_SHAPE_INFERENCE_H__