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 #include "luci/FormattedGraph.h"
19 #include <luci/IR/CircleDialect.h>
20 #include <luci/IR/CircleNodes.h>
22 #include <pepper/str.h>
29 * @brief dump std::vector<int64_t> values to stream
31 std::ostream &operator<<(std::ostream &os, const std::vector<int64_t> &vi64)
44 const char *to_str(loco::DataType type)
48 case loco::DataType::U8:
50 case loco::DataType::U16:
52 case loco::DataType::U32:
54 case loco::DataType::U64:
57 case loco::DataType::S8:
59 case loco::DataType::S16:
61 case loco::DataType::S32:
63 case loco::DataType::S64:
66 case loco::DataType::FLOAT16:
68 case loco::DataType::FLOAT32:
70 case loco::DataType::FLOAT64:
73 case loco::DataType::BOOL:
81 const char *to_str(bool value) { return value ? "true" : "false"; }
83 const char *to_str(luci::FusedActFunc fused)
87 case luci::FusedActFunc::NONE:
89 case luci::FusedActFunc::RELU:
91 case luci::FusedActFunc::RELU_N1_TO_1:
92 return "RELU_N1_TO_1";
93 case luci::FusedActFunc::RELU6:
100 const char *to_str(luci::Padding padding)
104 case luci::Padding::SAME:
106 case luci::Padding::VALID:
113 const char *to_str(luci::MirrorPadMode mode)
117 case luci::MirrorPadMode::REFLECT:
119 case luci::MirrorPadMode::SYMMETRIC:
126 std::string to_str(const luci::Stride *stride)
128 return pepper::str(stride->h(), ",", stride->w());
131 std::string to_str(const luci::Filter *filter)
133 return pepper::str(filter->h(), ",", filter->w());
136 std::string circle_opname(uint32_t opnum)
138 static const std::string prefix{"circle."};
140 switch (static_cast<luci::CircleOpcode>(opnum))
142 #define CIRCLE_NODE(OPCODE, CLASS) \
143 case luci::CircleOpcode::OPCODE: \
144 return prefix + #OPCODE;
145 #include <luci/IR/CircleNodes.lst>
151 return prefix + "Invalid";
154 // CircleNodeSummaryBuilder with default implementation
155 class CircleNodeSummaryBuilderBase : public locop::NodeSummaryBuilder
158 CircleNodeSummaryBuilderBase(const locop::SymbolTable *tbl) : _tbl{tbl}
164 bool build(const loco::Node *, locop::NodeSummary &s) const final;
167 #define CIRCLE_NODE(OPCODE, CLASS) \
168 virtual bool summary(const CLASS *, locop::NodeSummary &s) const \
170 s.comments().append("Emitted by Default CircleNodeSummaryBuilder"); \
171 s.state(locop::NodeSummary::State::PartiallyKnown); \
174 #include <luci/IR/CircleNodes.lst>
178 const locop::SymbolTable *tbl(void) const { return _tbl; }
180 // Please do not use _tbl directly and use tbl().
181 // This will be changed to private in near future.
183 const locop::SymbolTable *_tbl;
186 class CircleNodeSummaryBuilder final : public CircleNodeSummaryBuilderBase
189 CircleNodeSummaryBuilder(const locop::SymbolTable *tbl) : CircleNodeSummaryBuilderBase(tbl)
195 #define IMPLEMENT(CLASS) bool summary(const CLASS *, locop::NodeSummary &) const final;
196 IMPLEMENT(luci::CircleAbs)
197 IMPLEMENT(luci::CircleAdd)
198 IMPLEMENT(luci::CircleAddN)
199 IMPLEMENT(luci::CircleArgMax)
200 IMPLEMENT(luci::CircleArgMin)
201 IMPLEMENT(luci::CircleAveragePool2D)
202 IMPLEMENT(luci::CircleBatchMatMul)
203 IMPLEMENT(luci::CircleBatchToSpaceND)
204 IMPLEMENT(luci::CircleCast)
205 IMPLEMENT(luci::CircleCeil)
206 IMPLEMENT(luci::CircleConcatenation)
207 IMPLEMENT(luci::CircleConst)
208 IMPLEMENT(luci::CircleConv2D)
209 IMPLEMENT(luci::CircleCos)
210 IMPLEMENT(luci::CircleCustom)
211 IMPLEMENT(luci::CircleDepthToSpace)
212 IMPLEMENT(luci::CircleDepthwiseConv2D)
213 IMPLEMENT(luci::CircleDiv)
214 IMPLEMENT(luci::CircleElu)
215 IMPLEMENT(luci::CircleExp)
216 IMPLEMENT(luci::CircleExpandDims)
217 IMPLEMENT(luci::CircleFill)
218 IMPLEMENT(luci::CircleFloor)
219 IMPLEMENT(luci::CircleFloorDiv)
220 IMPLEMENT(luci::CircleFloorMod)
221 IMPLEMENT(luci::CircleFullyConnected)
222 IMPLEMENT(luci::CircleGather)
223 IMPLEMENT(luci::CircleGatherNd)
224 IMPLEMENT(luci::CircleGreater)
225 IMPLEMENT(luci::CircleGreaterEqual)
226 IMPLEMENT(luci::CircleIf)
227 IMPLEMENT(luci::CircleL2Normalize)
228 IMPLEMENT(luci::CircleLeakyRelu)
229 IMPLEMENT(luci::CircleLess)
230 IMPLEMENT(luci::CircleLessEqual)
231 IMPLEMENT(luci::CircleLocalResponseNormalization)
232 IMPLEMENT(luci::CircleLog)
233 IMPLEMENT(luci::CircleLogicalAnd)
234 IMPLEMENT(luci::CircleLogicalNot)
235 IMPLEMENT(luci::CircleLogicalOr)
236 IMPLEMENT(luci::CircleLogistic)
237 IMPLEMENT(luci::CircleLogSoftmax)
238 IMPLEMENT(luci::CircleMatrixDiag)
239 IMPLEMENT(luci::CircleMatrixSetDiag)
240 IMPLEMENT(luci::CircleMaximum)
241 IMPLEMENT(luci::CircleMaxPool2D)
242 IMPLEMENT(luci::CircleMean)
243 IMPLEMENT(luci::CircleMinimum)
244 IMPLEMENT(luci::CircleMirrorPad)
245 IMPLEMENT(luci::CircleMul)
246 IMPLEMENT(luci::CircleNeg)
247 IMPLEMENT(luci::CircleNonMaxSuppressionV4)
248 IMPLEMENT(luci::CircleNonMaxSuppressionV5)
249 IMPLEMENT(luci::CircleNotEqual)
250 IMPLEMENT(luci::CircleOneHot)
251 IMPLEMENT(luci::CirclePack)
252 IMPLEMENT(luci::CirclePad)
253 IMPLEMENT(luci::CirclePadV2)
254 IMPLEMENT(luci::CirclePow)
255 IMPLEMENT(luci::CirclePRelu)
256 IMPLEMENT(luci::CircleRange)
257 IMPLEMENT(luci::CircleRank)
258 IMPLEMENT(luci::CircleReduceAny)
259 IMPLEMENT(luci::CircleReduceMax)
260 IMPLEMENT(luci::CircleReduceMin)
261 IMPLEMENT(luci::CircleReduceProd)
262 IMPLEMENT(luci::CircleRelu)
263 IMPLEMENT(luci::CircleRelu6)
264 IMPLEMENT(luci::CircleReluN1To1)
265 IMPLEMENT(luci::CircleReshape)
266 IMPLEMENT(luci::CircleResizeBilinear)
267 IMPLEMENT(luci::CircleResizeNearestNeighbor)
268 IMPLEMENT(luci::CircleReverseSequence)
269 IMPLEMENT(luci::CircleReverseV2)
270 IMPLEMENT(luci::CircleRound)
271 IMPLEMENT(luci::CircleRsqrt)
272 IMPLEMENT(luci::CircleScatterNd)
273 IMPLEMENT(luci::CircleSegmentSum)
274 IMPLEMENT(luci::CircleSelect)
275 IMPLEMENT(luci::CircleSelectV2)
276 IMPLEMENT(luci::CircleShape)
277 IMPLEMENT(luci::CircleSin)
278 IMPLEMENT(luci::CircleSlice)
279 IMPLEMENT(luci::CircleSoftmax)
280 IMPLEMENT(luci::CircleSpaceToBatchND)
281 IMPLEMENT(luci::CircleSpaceToDepth)
282 IMPLEMENT(luci::CircleSparseToDense)
283 IMPLEMENT(luci::CircleSplit)
284 IMPLEMENT(luci::CircleSplitV)
285 IMPLEMENT(luci::CircleSqrt)
286 IMPLEMENT(luci::CircleSquare)
287 IMPLEMENT(luci::CircleSquaredDifference)
288 IMPLEMENT(luci::CircleSqueeze)
289 IMPLEMENT(luci::CircleStridedSlice)
290 IMPLEMENT(luci::CircleSub)
291 IMPLEMENT(luci::CircleSum)
292 IMPLEMENT(luci::CircleTanh)
293 IMPLEMENT(luci::CircleTile)
294 IMPLEMENT(luci::CircleTopKV2)
295 IMPLEMENT(luci::CircleTranspose)
296 IMPLEMENT(luci::CircleTransposeConv)
297 IMPLEMENT(luci::CircleUnique)
298 IMPLEMENT(luci::CircleUnpack)
299 IMPLEMENT(luci::CircleWhere)
300 IMPLEMENT(luci::CircleWhile)
301 IMPLEMENT(luci::CircleZerosLike)
303 IMPLEMENT(luci::CircleBCQFullyConnected)
304 IMPLEMENT(luci::CircleBCQGather)
305 IMPLEMENT(luci::CircleInstanceNorm)
307 IMPLEMENT(luci::CircleInput)
308 IMPLEMENT(luci::CircleOutput)
309 IMPLEMENT(luci::CircleIfOut)
310 IMPLEMENT(luci::CircleNonMaxSuppressionV4Out)
311 IMPLEMENT(luci::CircleNonMaxSuppressionV5Out)
312 IMPLEMENT(luci::CircleSplitOut)
313 IMPLEMENT(luci::CircleSplitVOut)
314 IMPLEMENT(luci::CircleTopKV2Out)
315 IMPLEMENT(luci::CircleUniqueOut)
316 IMPLEMENT(luci::CircleUnpackOut)
317 IMPLEMENT(luci::CircleWhileOut)
321 template <class CIRCLENODE>
322 bool use_x(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
324 s.args().append("x", tbl->lookup(node->x()));
325 s.state(locop::NodeSummary::State::Complete);
329 template <class CIRCLENODE>
330 bool use_input(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
332 s.args().append("input", tbl->lookup(node->input()));
333 s.state(locop::NodeSummary::State::Complete);
337 template <class CIRCLENODE>
338 bool use_features(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
340 s.args().append("features", tbl->lookup(node->features()));
341 s.state(locop::NodeSummary::State::Complete);
345 template <class CIRCLENODE>
346 bool use_xy(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
348 s.args().append("x", tbl->lookup(node->x()));
349 s.args().append("y", tbl->lookup(node->y()));
350 s.state(locop::NodeSummary::State::Complete);
354 template <class CIRCLENODE>
355 bool use_xy_act(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
357 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
359 s.args().append("x", tbl->lookup(node->x()));
360 s.args().append("y", tbl->lookup(node->y()));
361 s.args().append("fused_activation_function", to_str(node->fusedActivationFunction()));
362 s.state(locop::NodeSummary::State::Complete);
366 template <class CIRCLENODE>
367 bool use_reducer(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
369 s.args().append("input", tbl->lookup(node->input()));
370 s.args().append("reduction_indices", tbl->lookup(node->reduction_indices()));
371 s.args().append("keep_dims", node->keep_dims() ? "true" : "false");
372 s.state(locop::NodeSummary::State::Complete);
376 template <class CIRCLENODE>
377 bool use_ido(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
379 s.args().append("input", tbl->lookup(node->input()));
380 s.args().append("dimension", tbl->lookup(node->dimension()));
381 s.args().append("output_type", to_str(node->output_type()));
382 s.state(locop::NodeSummary::State::Complete);
386 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleAddN *node,
387 locop::NodeSummary &s)
389 for (uint32_t i = 0; i < node->arity(); ++i)
390 s.args().append("inputs", tbl->lookup(node->inputs(i)));
391 s.state(locop::NodeSummary::State::Complete);
395 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleAveragePool2D *node,
396 locop::NodeSummary &s)
398 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
400 s.args().append("value", tbl->lookup(node->value()));
401 s.args().append("filter(h,w)", to_str(node->filter()));
402 s.args().append("stride(h,w)", to_str(node->stride()));
403 s.args().append("padding", to_str(node->padding()));
404 s.args().append("fused", to_str(node->fusedActivationFunction()));
405 s.state(locop::NodeSummary::State::Complete);
409 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleBatchMatMul *node,
410 locop::NodeSummary &s)
412 s.args().append("x", tbl->lookup(node->x()));
413 s.args().append("y", tbl->lookup(node->y()));
414 s.args().append("adj_x", to_str(node->adj_x()));
415 s.args().append("adj_y", to_str(node->adj_y()));
416 s.state(locop::NodeSummary::State::Complete);
420 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleBatchToSpaceND *node,
421 locop::NodeSummary &s)
423 s.args().append("input", tbl->lookup(node->input()));
424 s.args().append("block_shape", tbl->lookup(node->block_shape()));
425 s.args().append("crops", tbl->lookup(node->crops()));
426 s.state(locop::NodeSummary::State::Complete);
430 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleCast *node,
431 locop::NodeSummary &s)
433 s.args().append("x", tbl->lookup(node->x()));
434 s.args().append("in_data_type", to_str(node->in_data_type()));
435 s.args().append("out_data_type", to_str(node->out_data_type()));
436 s.state(locop::NodeSummary::State::Complete);
440 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleConcatenation *node,
441 locop::NodeSummary &s)
443 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
445 for (uint32_t i = 0; i < node->numValues(); ++i)
446 s.args().append("values", tbl->lookup(node->values(i)));
447 s.args().append("axis", pepper::str(node->axis()));
448 s.args().append("fused", to_str(node->fusedActivationFunction()));
449 s.state(locop::NodeSummary::State::Complete);
453 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleConv2D *node,
454 locop::NodeSummary &s)
456 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
457 assert(node->padding() != luci::Padding::UNDEFINED);
459 s.args().append("input", tbl->lookup(node->input()));
460 s.args().append("filter", tbl->lookup(node->filter()));
461 s.args().append("bias", tbl->lookup(node->bias()));
462 s.args().append("stride(h,w)", to_str(node->stride()));
463 s.args().append("dilation(h,w)", to_str(node->dilation()));
464 s.args().append("padding", to_str(node->padding()));
465 s.args().append("fused", to_str(node->fusedActivationFunction()));
466 s.state(locop::NodeSummary::State::Complete);
470 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleCustom *node,
471 locop::NodeSummary &s)
473 for (uint32_t i = 0; i < node->numInputs(); i++)
475 s.args().append("input" + std::to_string(i), tbl->lookup(node->inputs(i)));
477 s.args().append("custom_code", node->custom_code());
478 s.state(locop::NodeSummary::State::Complete);
482 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleDepthToSpace *node,
483 locop::NodeSummary &s)
485 s.args().append("input", tbl->lookup(node->input()));
486 s.args().append("block_size", std::to_string(node->block_size()));
487 s.state(locop::NodeSummary::State::Complete);
491 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleDepthwiseConv2D *node,
492 locop::NodeSummary &s)
494 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
495 assert(node->padding() != luci::Padding::UNDEFINED);
497 s.args().append("input", tbl->lookup(node->input()));
498 s.args().append("filter", tbl->lookup(node->filter()));
499 s.args().append("bias", tbl->lookup(node->bias()));
500 s.args().append("stride(h,w)", to_str(node->stride()));
501 s.args().append("dilation(h,w)", to_str(node->dilation()));
502 s.args().append("padding", to_str(node->padding()));
503 s.args().append("depthMultiplier", std::to_string(node->depthMultiplier()));
504 s.args().append("fused", to_str(node->fusedActivationFunction()));
505 s.state(locop::NodeSummary::State::Complete);
509 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleExpandDims *node,
510 locop::NodeSummary &s)
512 s.args().append("input", tbl->lookup(node->input()));
513 s.args().append("axis", tbl->lookup(node->axis()));
514 s.state(locop::NodeSummary::State::Complete);
518 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleFill *node,
519 locop::NodeSummary &s)
521 s.args().append("dims", tbl->lookup(node->dims()));
522 s.args().append("value", tbl->lookup(node->value()));
523 s.state(locop::NodeSummary::State::Complete);
527 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleFullyConnected *node,
528 locop::NodeSummary &s)
530 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
532 s.args().append("input", tbl->lookup(node->input()));
533 s.args().append("weights", tbl->lookup(node->weights()));
534 s.args().append("bias", tbl->lookup(node->bias()));
535 s.args().append("fused", to_str(node->fusedActivationFunction()));
536 s.state(locop::NodeSummary::State::Complete);
540 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleGather *node,
541 locop::NodeSummary &s)
543 s.args().append("params", tbl->lookup(node->params()));
544 s.args().append("indices", tbl->lookup(node->indices()));
545 s.args().append("axis", pepper::str(node->axis()));
546 s.state(locop::NodeSummary::State::Complete);
550 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleGatherNd *node,
551 locop::NodeSummary &s)
553 s.args().append("params", tbl->lookup(node->params()));
554 s.args().append("indices", tbl->lookup(node->indices()));
555 s.state(locop::NodeSummary::State::Complete);
559 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleIf *node, locop::NodeSummary &s)
561 s.args().append("cond", tbl->lookup(node->cond()));
562 for (uint32_t i = 0; i < node->input_count(); ++i)
563 s.args().append("input", tbl->lookup(node->input(i)));
565 if (node->then_graph() != nullptr)
566 s.args().append("then_graph", node->then_graph()->name());
568 s.args().append("then_branch", pepper::str(node->then_branch()));
570 if (node->else_graph() != nullptr)
571 s.args().append("else_graph", node->else_graph()->name());
573 s.args().append("else_branch", pepper::str(node->else_branch()));
575 s.state(locop::NodeSummary::State::Complete);
579 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleL2Normalize *node,
580 locop::NodeSummary &s)
582 s.args().append("x", tbl->lookup(node->x()));
583 s.args().append("fused_activation_function", to_str(node->fusedActivationFunction()));
584 s.state(locop::NodeSummary::State::Complete);
588 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleLeakyRelu *node,
589 locop::NodeSummary &s)
591 s.args().append("features", tbl->lookup(node->features()));
592 s.args().append("alpha", std::to_string(node->alpha()));
593 s.state(locop::NodeSummary::State::Complete);
597 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleLocalResponseNormalization *node,
598 locop::NodeSummary &s)
600 s.args().append("input", tbl->lookup(node->input()));
601 s.args().append("radius", pepper::str(node->radius()));
602 s.args().append("bias", pepper::str(node->bias()));
603 s.args().append("alpha", pepper::str(node->alpha()));
604 s.args().append("beta", pepper::str(node->beta()));
605 s.state(locop::NodeSummary::State::Complete);
609 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleLogSoftmax *node,
610 locop::NodeSummary &s)
612 s.args().append("logits", tbl->lookup(node->logits()));
613 s.state(locop::NodeSummary::State::Complete);
617 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleMatrixDiag *node,
618 locop::NodeSummary &s)
620 s.args().append("diagonal", tbl->lookup(node->diagonal()));
621 s.state(locop::NodeSummary::State::Complete);
625 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleMatrixSetDiag *node,
626 locop::NodeSummary &s)
628 s.args().append("input", tbl->lookup(node->input()));
629 s.args().append("diagonal", tbl->lookup(node->diagonal()));
630 s.state(locop::NodeSummary::State::Complete);
634 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleMaxPool2D *node,
635 locop::NodeSummary &s)
637 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
639 s.args().append("value", tbl->lookup(node->value()));
640 s.args().append("filter(h,w)", to_str(node->filter()));
641 s.args().append("stride(h,w)", to_str(node->stride()));
642 s.args().append("padding", to_str(node->padding()));
643 s.args().append("fused", to_str(node->fusedActivationFunction()));
644 s.state(locop::NodeSummary::State::Complete);
648 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleMirrorPad *node,
649 locop::NodeSummary &s)
651 s.args().append("input", tbl->lookup(node->input()));
652 s.args().append("paddings", tbl->lookup(node->paddings()));
653 s.args().append("mode", to_str(node->mode()));
654 s.state(locop::NodeSummary::State::Complete);
658 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleNonMaxSuppressionV4 *node,
659 locop::NodeSummary &s)
661 s.args().append("boxes", tbl->lookup(node->boxes()));
662 s.args().append("scores", tbl->lookup(node->scores()));
663 s.args().append("max_output_size", tbl->lookup(node->max_output_size()));
664 s.args().append("iou_threshold", tbl->lookup(node->iou_threshold()));
665 s.args().append("score_threshold", tbl->lookup(node->score_threshold()));
666 s.state(locop::NodeSummary::State::Complete);
670 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleNonMaxSuppressionV5 *node,
671 locop::NodeSummary &s)
673 s.args().append("boxes", tbl->lookup(node->boxes()));
674 s.args().append("scores", tbl->lookup(node->scores()));
675 s.args().append("max_output_size", tbl->lookup(node->max_output_size()));
676 s.args().append("iou_threshold", tbl->lookup(node->iou_threshold()));
677 s.args().append("score_threshold", tbl->lookup(node->score_threshold()));
678 s.args().append("soft_nms_sigma", tbl->lookup(node->soft_nms_sigma()));
679 s.state(locop::NodeSummary::State::Complete);
683 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleOneHot *node,
684 locop::NodeSummary &s)
686 s.args().append("indices", tbl->lookup(node->indices()));
687 s.args().append("depth", tbl->lookup(node->depth()));
688 s.args().append("on_value", tbl->lookup(node->on_value()));
689 s.args().append("off_value", tbl->lookup(node->off_value()));
690 s.args().append("axis", pepper::str(node->axis()));
692 s.state(locop::NodeSummary::State::Complete);
696 bool summary_node(const locop::SymbolTable *tbl, const luci::CirclePack *node,
697 locop::NodeSummary &s)
699 for (uint32_t i = 0; i < node->values_count(); ++i)
700 s.args().append("values", tbl->lookup(node->values(i)));
701 s.args().append("values_count", pepper::str(node->values_count()));
702 s.args().append("axis", pepper::str(node->axis()));
703 s.state(locop::NodeSummary::State::Complete);
707 bool summary_node(const locop::SymbolTable *tbl, const luci::CirclePad *node, locop::NodeSummary &s)
709 s.args().append("input", tbl->lookup(node->input()));
710 s.args().append("paddings", tbl->lookup(node->paddings()));
711 s.state(locop::NodeSummary::State::Complete);
715 bool summary_node(const locop::SymbolTable *tbl, const luci::CirclePadV2 *node,
716 locop::NodeSummary &s)
718 s.args().append("input", tbl->lookup(node->input()));
719 s.args().append("paddings", tbl->lookup(node->paddings()));
720 s.args().append("constant_values", tbl->lookup(node->constant_values()));
721 s.state(locop::NodeSummary::State::Complete);
725 bool summary_node(const locop::SymbolTable *tbl, const luci::CirclePRelu *node,
726 locop::NodeSummary &s)
728 s.args().append("input", tbl->lookup(node->input()));
729 s.args().append("alpha", tbl->lookup(node->alpha()));
730 s.state(locop::NodeSummary::State::Complete);
734 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleRange *node,
735 locop::NodeSummary &s)
737 s.args().append("start", tbl->lookup(node->start()));
738 s.args().append("limit", tbl->lookup(node->limit()));
739 s.args().append("delta", tbl->lookup(node->delta()));
740 s.state(locop::NodeSummary::State::Complete);
744 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleReshape *node,
745 locop::NodeSummary &s)
747 s.args().append("tensor", tbl->lookup(node->tensor()));
748 s.args().append("shape", tbl->lookup(node->shape()));
749 // TODO Show newShape info
750 s.state(locop::NodeSummary::State::PartiallyKnown);
754 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleResizeBilinear *node,
755 locop::NodeSummary &s)
757 s.args().append("input", tbl->lookup(node->input()));
758 s.args().append("size", tbl->lookup(node->size()));
759 s.args().append("align_corners", node->align_corners() ? "true" : "false");
760 s.args().append("half_pixel_centers", node->half_pixel_centers() ? "true" : "false");
761 s.state(locop::NodeSummary::State::Complete);
765 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleResizeNearestNeighbor *node,
766 locop::NodeSummary &s)
768 s.args().append("input", tbl->lookup(node->input()));
769 s.args().append("size", tbl->lookup(node->size()));
770 s.args().append("align_corners", node->align_corners() ? "true" : "false");
771 s.state(locop::NodeSummary::State::Complete);
775 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleReverseSequence *node,
776 locop::NodeSummary &s)
778 s.args().append("input", tbl->lookup(node->input()));
779 s.args().append("seq_lengths", tbl->lookup(node->seq_lengths()));
780 s.args().append("seq_axis", std::to_string(node->seq_axis()));
781 s.args().append("batch_axis", std::to_string(node->batch_axis()));
782 s.state(locop::NodeSummary::State::Complete);
786 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleReverseV2 *node,
787 locop::NodeSummary &s)
789 s.args().append("tensor", tbl->lookup(node->tensor()));
790 s.args().append("axis", tbl->lookup(node->axis()));
791 s.state(locop::NodeSummary::State::Complete);
795 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleScatterNd *node,
796 locop::NodeSummary &s)
798 s.args().append("indices", tbl->lookup(node->indices()));
799 s.args().append("updates", tbl->lookup(node->updates()));
800 s.args().append("shape", tbl->lookup(node->shape()));
801 s.state(locop::NodeSummary::State::Complete);
805 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSegmentSum *node,
806 locop::NodeSummary &s)
808 s.args().append("input", tbl->lookup(node->input()));
809 s.args().append("segment_ids", tbl->lookup(node->segment_ids()));
810 s.state(locop::NodeSummary::State::Complete);
814 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSelect *node,
815 locop::NodeSummary &s)
817 s.args().append("condition", tbl->lookup(node->condition()));
818 s.args().append("t", tbl->lookup(node->t()));
819 s.args().append("e", tbl->lookup(node->e()));
820 s.state(locop::NodeSummary::State::Complete);
824 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSelectV2 *node,
825 locop::NodeSummary &s)
827 s.args().append("condition", tbl->lookup(node->condition()));
828 s.args().append("t", tbl->lookup(node->t()));
829 s.args().append("e", tbl->lookup(node->e()));
830 s.state(locop::NodeSummary::State::Complete);
834 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleShape *node,
835 locop::NodeSummary &s)
837 s.args().append("input", tbl->lookup(node->input()));
838 s.args().append("out_type", to_str(node->out_type()));
839 s.state(locop::NodeSummary::State::Complete);
843 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSlice *node,
844 locop::NodeSummary &s)
846 s.args().append("input", tbl->lookup(node->input()));
847 s.args().append("begin", tbl->lookup(node->begin()));
848 s.args().append("size", tbl->lookup(node->size()));
849 s.state(locop::NodeSummary::State::Complete);
853 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSoftmax *node,
854 locop::NodeSummary &s)
856 s.args().append("logits", tbl->lookup(node->logits()));
857 s.args().append("beta", pepper::str(node->beta()));
858 s.state(locop::NodeSummary::State::Complete);
862 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSpaceToBatchND *node,
863 locop::NodeSummary &s)
865 s.args().append("input", tbl->lookup(node->input()));
866 s.args().append("block_shape", tbl->lookup(node->block_shape()));
867 s.args().append("paddings", tbl->lookup(node->paddings()));
868 s.state(locop::NodeSummary::State::Complete);
872 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSpaceToDepth *node,
873 locop::NodeSummary &s)
875 s.args().append("input", tbl->lookup(node->input()));
876 s.args().append("block_size", pepper::str(node->block_size()));
877 s.state(locop::NodeSummary::State::Complete);
881 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSparseToDense *node,
882 locop::NodeSummary &s)
884 s.args().append("indices", tbl->lookup(node->indices()));
885 s.args().append("output_shape", tbl->lookup(node->output_shape()));
886 s.args().append("values", tbl->lookup(node->values()));
887 s.args().append("default_value", tbl->lookup(node->default_value()));
888 s.args().append("Validate_indices", pepper::str(node->validate_indices()));
889 s.state(locop::NodeSummary::State::Complete);
893 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSplit *node,
894 locop::NodeSummary &s)
896 s.args().append("split_dim", tbl->lookup(node->split_dim()));
897 s.args().append("input", tbl->lookup(node->input()));
898 s.args().append("num_split", pepper::str(node->num_split()));
899 s.state(locop::NodeSummary::State::Complete);
903 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSplitV *node,
904 locop::NodeSummary &s)
906 s.args().append("input", tbl->lookup(node->input()));
907 s.args().append("size_splits", tbl->lookup(node->size_splits()));
908 s.args().append("split_dim", tbl->lookup(node->split_dim()));
909 s.args().append("num_split", pepper::str(node->num_split()));
910 s.state(locop::NodeSummary::State::Complete);
914 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleSqueeze *node,
915 locop::NodeSummary &s)
917 s.args().append("input", tbl->lookup(node->input()));
919 std::stringstream ss{"("};
920 for (size_t i = 0; i < node->squeeze_dims().size(); ++i)
924 ss << node->squeeze_dims()[i];
927 s.args().append("squeeze_dims", ss.str());
928 s.state(locop::NodeSummary::State::Complete);
932 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleStridedSlice *node,
933 locop::NodeSummary &s)
935 s.args().append("input", tbl->lookup(node->input()));
936 s.args().append("begin", tbl->lookup(node->begin()));
937 s.args().append("end", tbl->lookup(node->end()));
938 s.args().append("strides", tbl->lookup(node->strides()));
939 s.args().append("begin_mask", pepper::str(node->begin_mask()));
940 s.args().append("end_mask", pepper::str(node->end_mask()));
941 s.args().append("ellipsis_mask", pepper::str(node->ellipsis_mask()));
942 s.args().append("new_axis_mask", pepper::str(node->new_axis_mask()));
943 s.args().append("shrink_axis_mask", pepper::str(node->shrink_axis_mask()));
944 s.state(locop::NodeSummary::State::Complete);
948 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleTile *node,
949 locop::NodeSummary &s)
951 s.args().append("input", tbl->lookup(node->input()));
952 s.args().append("multiples", tbl->lookup(node->multiples()));
953 s.state(locop::NodeSummary::State::Complete);
957 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleTopKV2 *node,
958 locop::NodeSummary &s)
960 s.args().append("input", tbl->lookup(node->input()));
961 s.args().append("k", tbl->lookup(node->k()));
962 s.state(locop::NodeSummary::State::Complete);
966 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleTranspose *node,
967 locop::NodeSummary &s)
969 s.args().append("a", tbl->lookup(node->a()));
970 s.args().append("perm", tbl->lookup(node->perm()));
971 s.state(locop::NodeSummary::State::Complete);
975 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleTransposeConv *node,
976 locop::NodeSummary &s)
978 assert(node->padding() != luci::Padding::UNDEFINED);
980 s.args().append("inputSizes", tbl->lookup(node->inputSizes()));
981 s.args().append("filter", tbl->lookup(node->filter()));
982 s.args().append("outBackprop", tbl->lookup(node->outBackprop()));
983 s.args().append("stride(h,w)", to_str(node->stride()));
984 s.args().append("padding", to_str(node->padding()));
985 s.state(locop::NodeSummary::State::Complete);
989 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleUnique *node,
990 locop::NodeSummary &s)
992 s.args().append("input", tbl->lookup(node->input()));
993 s.args().append("idx_out_type", to_str(node->idx_out_type()));
994 s.state(locop::NodeSummary::State::Complete);
998 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleUnpack *node,
999 locop::NodeSummary &s)
1001 s.args().append("value", tbl->lookup(node->value()));
1002 s.args().append("num", pepper::str(node->num()));
1003 s.args().append("axis", pepper::str(node->axis()));
1004 s.state(locop::NodeSummary::State::Complete);
1008 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleWhere *node,
1009 locop::NodeSummary &s)
1011 s.args().append("condition", tbl->lookup(node->condition()));
1012 s.state(locop::NodeSummary::State::Complete);
1016 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleWhile *node,
1017 locop::NodeSummary &s)
1019 for (uint32_t i = 0; i < node->input_count(); ++i)
1020 s.args().append("input", tbl->lookup(node->input(i)));
1022 if (node->cond_graph() != nullptr)
1023 s.args().append("cond_graph", node->cond_graph()->name());
1025 s.args().append("cond_branch", pepper::str(node->cond_branch()));
1027 if (node->body_graph() != nullptr)
1028 s.args().append("body_graph", node->body_graph()->name());
1030 s.args().append("body_branch", pepper::str(node->body_branch()));
1032 s.state(locop::NodeSummary::State::Complete);
1036 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleTopKV2Out *node,
1037 locop::NodeSummary &s)
1039 s.args().append("topkv2", tbl->lookup(node->input()));
1040 s.state(locop::NodeSummary::State::Complete);
1044 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleUniqueOut *node,
1045 locop::NodeSummary &s)
1047 s.args().append("unique", tbl->lookup(node->input()));
1048 s.state(locop::NodeSummary::State::Complete);
1052 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleUnpackOut *node,
1053 locop::NodeSummary &s)
1055 s.args().append("unpack", tbl->lookup(node->input()));
1056 s.state(locop::NodeSummary::State::Complete);
1060 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleWhileOut *node,
1061 locop::NodeSummary &s)
1063 s.args().append("while", tbl->lookup(node->input()));
1064 s.state(locop::NodeSummary::State::Complete);
1068 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleOutput *node,
1069 locop::NodeSummary &s)
1071 s.args().append("from", tbl->lookup(node->from()));
1072 s.state(locop::NodeSummary::State::Complete);
1076 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleBCQFullyConnected *node,
1077 locop::NodeSummary &s)
1079 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
1080 s.args().append("input", tbl->lookup(node->input()));
1081 s.args().append("weights_scales", tbl->lookup(node->weights_scales()));
1082 s.args().append("weights_binary", tbl->lookup(node->weights_binary()));
1083 s.args().append("bias", tbl->lookup(node->bias()));
1084 s.args().append("weights_clusters", tbl->lookup(node->weights_clusters()));
1085 s.args().append("fused", to_str(node->fusedActivationFunction()));
1086 s.args().append("weights_hidden_size", pepper::str(node->weights_hidden_size()));
1087 s.state(locop::NodeSummary::State::Complete);
1091 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleBCQGather *node,
1092 locop::NodeSummary &s)
1094 s.args().append("input_scales", tbl->lookup(node->input_scales()));
1095 s.args().append("input_binary", tbl->lookup(node->input_binary()));
1096 s.args().append("indices", tbl->lookup(node->indices()));
1097 s.args().append("input_clusters", tbl->lookup(node->input_clusters()));
1098 s.args().append("axis", pepper::str(node->axis()));
1099 s.args().append("input_hidden_size", pepper::str(node->input_hidden_size()));
1100 s.state(locop::NodeSummary::State::Complete);
1104 bool summary_node(const locop::SymbolTable *tbl, const luci::CircleInstanceNorm *node,
1105 locop::NodeSummary &s)
1107 auto fused = node->fusedActivationFunction();
1108 assert(fused != luci::FusedActFunc::UNDEFINED);
1110 s.args().append("input", tbl->lookup(node->input()));
1111 s.args().append("gamma", tbl->lookup(node->gamma()));
1112 s.args().append("beta", tbl->lookup(node->beta()));
1113 s.args().append("epsilon", pepper::str(node->epsilon()));
1114 s.args().append("fused_activation_function", to_str(fused));
1115 s.state(locop::NodeSummary::State::Complete);
1119 bool CircleNodeSummaryBuilderBase::build(const loco::Node *node, locop::NodeSummary &s) const
1121 if (node->dialect() != luci::CircleDialect::get())
1124 #define CIRCLE_NODE(OPCODE, CLASS) \
1125 if (dynamic_cast<const CLASS *>(node)) \
1127 s.opname(circle_opname(node->opnum())); \
1128 return summary(dynamic_cast<const CLASS *>(node), s); \
1130 #include <luci/IR/CircleNodes.lst>
1136 bool CircleNodeSummaryBuilder::summary(const luci::CircleAbs *node, locop::NodeSummary &s) const
1138 return use_x(tbl(), node, s);
1141 bool CircleNodeSummaryBuilder::summary(const luci::CircleAdd *node, locop::NodeSummary &s) const
1143 return use_xy_act(tbl(), node, s);
1146 bool CircleNodeSummaryBuilder::summary(const luci::CircleAddN *node, locop::NodeSummary &s) const
1148 return summary_node(tbl(), node, s);
1151 bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMax *node, locop::NodeSummary &s) const
1153 return use_ido(tbl(), node, s);
1156 bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMin *node, locop::NodeSummary &s) const
1158 return use_ido(tbl(), node, s);
1161 bool CircleNodeSummaryBuilder::summary(const luci::CircleAveragePool2D *node,
1162 locop::NodeSummary &s) const
1164 return summary_node(tbl(), node, s);
1167 bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchMatMul *node,
1168 locop::NodeSummary &s) const
1170 return summary_node(tbl(), node, s);
1173 bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchToSpaceND *node,
1174 locop::NodeSummary &s) const
1176 return summary_node(tbl(), node, s);
1179 bool CircleNodeSummaryBuilder::summary(const luci::CircleCast *node, locop::NodeSummary &s) const
1181 return summary_node(tbl(), node, s);
1184 bool CircleNodeSummaryBuilder::summary(const luci::CircleCeil *node, locop::NodeSummary &s) const
1186 return use_x(tbl(), node, s);
1189 bool CircleNodeSummaryBuilder::summary(const luci::CircleConcatenation *node,
1190 locop::NodeSummary &s) const
1192 return summary_node(tbl(), node, s);
1195 bool CircleNodeSummaryBuilder::summary(const luci::CircleConst *, locop::NodeSummary &s) const
1197 s.state(locop::NodeSummary::State::PartiallyKnown);
1201 bool CircleNodeSummaryBuilder::summary(const luci::CircleConv2D *node, locop::NodeSummary &s) const
1203 return summary_node(tbl(), node, s);
1206 bool CircleNodeSummaryBuilder::summary(const luci::CircleCos *node, locop::NodeSummary &s) const
1208 return use_x(tbl(), node, s);
1211 bool CircleNodeSummaryBuilder::summary(const luci::CircleCustom *node, locop::NodeSummary &s) const
1213 return summary_node(tbl(), node, s);
1216 bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthToSpace *node,
1217 locop::NodeSummary &s) const
1219 return summary_node(tbl(), node, s);
1222 bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthwiseConv2D *node,
1223 locop::NodeSummary &s) const
1225 return summary_node(tbl(), node, s);
1228 bool CircleNodeSummaryBuilder::summary(const luci::CircleDiv *node, locop::NodeSummary &s) const
1230 return use_xy(tbl(), node, s);
1233 bool CircleNodeSummaryBuilder::summary(const luci::CircleElu *node, locop::NodeSummary &s) const
1235 return use_features(tbl(), node, s);
1238 bool CircleNodeSummaryBuilder::summary(const luci::CircleExp *node, locop::NodeSummary &s) const
1240 return use_x(tbl(), node, s);
1243 bool CircleNodeSummaryBuilder::summary(const luci::CircleExpandDims *node,
1244 locop::NodeSummary &s) const
1246 return summary_node(tbl(), node, s);
1249 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloor *node, locop::NodeSummary &s) const
1251 return use_x(tbl(), node, s);
1254 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorDiv *node,
1255 locop::NodeSummary &s) const
1257 return use_xy(tbl(), node, s);
1260 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorMod *node,
1261 locop::NodeSummary &s) const
1263 return use_xy(tbl(), node, s);
1266 bool CircleNodeSummaryBuilder::summary(const luci::CircleFill *node, locop::NodeSummary &s) const
1268 return summary_node(tbl(), node, s);
1271 bool CircleNodeSummaryBuilder::summary(const luci::CircleFullyConnected *node,
1272 locop::NodeSummary &s) const
1274 return summary_node(tbl(), node, s);
1277 bool CircleNodeSummaryBuilder::summary(const luci::CircleGather *node, locop::NodeSummary &s) const
1279 return summary_node(tbl(), node, s);
1282 bool CircleNodeSummaryBuilder::summary(const luci::CircleGatherNd *node,
1283 locop::NodeSummary &s) const
1285 return summary_node(tbl(), node, s);
1288 bool CircleNodeSummaryBuilder::summary(const luci::CircleGreater *node, locop::NodeSummary &s) const
1290 return use_xy(tbl(), node, s);
1293 bool CircleNodeSummaryBuilder::summary(const luci::CircleGreaterEqual *node,
1294 locop::NodeSummary &s) const
1296 return use_xy(tbl(), node, s);
1299 bool CircleNodeSummaryBuilder::summary(const luci::CircleIf *node, locop::NodeSummary &s) const
1301 return summary_node(tbl(), node, s);
1304 bool CircleNodeSummaryBuilder::summary(const luci::CircleL2Normalize *node,
1305 locop::NodeSummary &s) const
1307 return summary_node(tbl(), node, s);
1310 bool CircleNodeSummaryBuilder::summary(const luci::CircleLess *node, locop::NodeSummary &s) const
1312 return use_xy(tbl(), node, s);
1315 bool CircleNodeSummaryBuilder::summary(const luci::CircleLessEqual *node,
1316 locop::NodeSummary &s) const
1318 return use_xy(tbl(), node, s);
1321 bool CircleNodeSummaryBuilder::summary(const luci::CircleLeakyRelu *node,
1322 locop::NodeSummary &s) const
1324 return summary_node(tbl(), node, s);
1327 bool CircleNodeSummaryBuilder::summary(const luci::CircleLocalResponseNormalization *node,
1328 locop::NodeSummary &s) const
1330 return summary_node(tbl(), node, s);
1333 bool CircleNodeSummaryBuilder::summary(const luci::CircleLog *node, locop::NodeSummary &s) const
1335 return use_x(tbl(), node, s);
1338 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalAnd *node,
1339 locop::NodeSummary &s) const
1341 return use_xy(tbl(), node, s);
1344 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalNot *node,
1345 locop::NodeSummary &s) const
1347 return use_x(tbl(), node, s);
1350 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalOr *node,
1351 locop::NodeSummary &s) const
1353 return use_xy(tbl(), node, s);
1356 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogistic *node,
1357 locop::NodeSummary &s) const
1359 return use_x(tbl(), node, s);
1362 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogSoftmax *node,
1363 locop::NodeSummary &s) const
1365 return summary_node(tbl(), node, s);
1368 bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixDiag *node,
1369 locop::NodeSummary &s) const
1371 return summary_node(tbl(), node, s);
1374 bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixSetDiag *node,
1375 locop::NodeSummary &s) const
1377 return summary_node(tbl(), node, s);
1380 bool CircleNodeSummaryBuilder::summary(const luci::CircleMaximum *node, locop::NodeSummary &s) const
1382 return use_xy(tbl(), node, s);
1385 bool CircleNodeSummaryBuilder::summary(const luci::CircleMaxPool2D *node,
1386 locop::NodeSummary &s) const
1388 return summary_node(tbl(), node, s);
1391 bool CircleNodeSummaryBuilder::summary(const luci::CircleMean *node, locop::NodeSummary &s) const
1393 return use_reducer(tbl(), node, s);
1396 bool CircleNodeSummaryBuilder::summary(const luci::CircleMinimum *node, locop::NodeSummary &s) const
1398 return use_xy(tbl(), node, s);
1401 bool CircleNodeSummaryBuilder::summary(const luci::CircleMirrorPad *node,
1402 locop::NodeSummary &s) const
1404 return summary_node(tbl(), node, s);
1407 bool CircleNodeSummaryBuilder::summary(const luci::CircleMul *node, locop::NodeSummary &s) const
1409 return use_xy_act(tbl(), node, s);
1412 bool CircleNodeSummaryBuilder::summary(const luci::CircleNeg *node, locop::NodeSummary &s) const
1414 return use_x(tbl(), node, s);
1417 bool CircleNodeSummaryBuilder::summary(const luci::CircleNonMaxSuppressionV4 *node,
1418 locop::NodeSummary &s) const
1420 return summary_node(tbl(), node, s);
1423 bool CircleNodeSummaryBuilder::summary(const luci::CircleNonMaxSuppressionV5 *node,
1424 locop::NodeSummary &s) const
1426 return summary_node(tbl(), node, s);
1429 bool CircleNodeSummaryBuilder::summary(const luci::CircleNotEqual *node,
1430 locop::NodeSummary &s) const
1432 return use_xy(tbl(), node, s);
1435 bool CircleNodeSummaryBuilder::summary(const luci::CircleOneHot *node, locop::NodeSummary &s) const
1437 return summary_node(tbl(), node, s);
1440 bool CircleNodeSummaryBuilder::summary(const luci::CirclePack *node, locop::NodeSummary &s) const
1442 return summary_node(tbl(), node, s);
1445 bool CircleNodeSummaryBuilder::summary(const luci::CirclePad *node, locop::NodeSummary &s) const
1447 return summary_node(tbl(), node, s);
1450 bool CircleNodeSummaryBuilder::summary(const luci::CirclePadV2 *node, locop::NodeSummary &s) const
1452 return summary_node(tbl(), node, s);
1455 bool CircleNodeSummaryBuilder::summary(const luci::CirclePow *node, locop::NodeSummary &s) const
1457 return use_xy(tbl(), node, s);
1460 bool CircleNodeSummaryBuilder::summary(const luci::CirclePRelu *node, locop::NodeSummary &s) const
1462 return summary_node(tbl(), node, s);
1465 bool CircleNodeSummaryBuilder::summary(const luci::CircleRange *node, locop::NodeSummary &s) const
1467 return summary_node(tbl(), node, s);
1470 bool CircleNodeSummaryBuilder::summary(const luci::CircleRank *node, locop::NodeSummary &s) const
1472 return use_input(tbl(), node, s);
1475 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceAny *node,
1476 locop::NodeSummary &s) const
1478 return use_reducer(tbl(), node, s);
1481 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMax *node,
1482 locop::NodeSummary &s) const
1484 return use_reducer(tbl(), node, s);
1487 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMin *node,
1488 locop::NodeSummary &s) const
1490 return use_reducer(tbl(), node, s);
1493 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceProd *node,
1494 locop::NodeSummary &s) const
1496 return use_reducer(tbl(), node, s);
1499 bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu *node, locop::NodeSummary &s) const
1501 return use_features(tbl(), node, s);
1504 bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu6 *node, locop::NodeSummary &s) const
1506 return use_features(tbl(), node, s);
1509 bool CircleNodeSummaryBuilder::summary(const luci::CircleReluN1To1 *node,
1510 locop::NodeSummary &s) const
1512 return use_features(tbl(), node, s);
1515 bool CircleNodeSummaryBuilder::summary(const luci::CircleReshape *node, locop::NodeSummary &s) const
1517 return summary_node(tbl(), node, s);
1520 bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeBilinear *node,
1521 locop::NodeSummary &s) const
1523 return summary_node(tbl(), node, s);
1526 bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeNearestNeighbor *node,
1527 locop::NodeSummary &s) const
1529 return summary_node(tbl(), node, s);
1532 bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseSequence *node,
1533 locop::NodeSummary &s) const
1535 return summary_node(tbl(), node, s);
1538 bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseV2 *node,
1539 locop::NodeSummary &s) const
1541 return summary_node(tbl(), node, s);
1544 bool CircleNodeSummaryBuilder::summary(const luci::CircleRound *node, locop::NodeSummary &s) const
1546 return use_x(tbl(), node, s);
1549 bool CircleNodeSummaryBuilder::summary(const luci::CircleRsqrt *node, locop::NodeSummary &s) const
1551 return use_x(tbl(), node, s);
1554 bool CircleNodeSummaryBuilder::summary(const luci::CircleScatterNd *node,
1555 locop::NodeSummary &s) const
1557 return summary_node(tbl(), node, s);
1560 bool CircleNodeSummaryBuilder::summary(const luci::CircleSegmentSum *node,
1561 locop::NodeSummary &s) const
1563 return summary_node(tbl(), node, s);
1566 bool CircleNodeSummaryBuilder::summary(const luci::CircleSelect *node, locop::NodeSummary &s) const
1568 return summary_node(tbl(), node, s);
1571 bool CircleNodeSummaryBuilder::summary(const luci::CircleSelectV2 *node,
1572 locop::NodeSummary &s) const
1574 return summary_node(tbl(), node, s);
1577 bool CircleNodeSummaryBuilder::summary(const luci::CircleShape *node, locop::NodeSummary &s) const
1579 return summary_node(tbl(), node, s);
1582 bool CircleNodeSummaryBuilder::summary(const luci::CircleSin *node, locop::NodeSummary &s) const
1584 return use_x(tbl(), node, s);
1587 bool CircleNodeSummaryBuilder::summary(const luci::CircleSlice *node, locop::NodeSummary &s) const
1589 return summary_node(tbl(), node, s);
1592 bool CircleNodeSummaryBuilder::summary(const luci::CircleSoftmax *node, locop::NodeSummary &s) const
1594 return summary_node(tbl(), node, s);
1597 bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToBatchND *node,
1598 locop::NodeSummary &s) const
1600 return summary_node(tbl(), node, s);
1603 bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToDepth *node,
1604 locop::NodeSummary &s) const
1606 return summary_node(tbl(), node, s);
1609 bool CircleNodeSummaryBuilder::summary(const luci::CircleSparseToDense *node,
1610 locop::NodeSummary &s) const
1612 return summary_node(tbl(), node, s);
1615 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplit *node, locop::NodeSummary &s) const
1617 return summary_node(tbl(), node, s);
1620 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitV *node, locop::NodeSummary &s) const
1622 return summary_node(tbl(), node, s);
1625 bool CircleNodeSummaryBuilder::summary(const luci::CircleSqrt *node, locop::NodeSummary &s) const
1627 return use_x(tbl(), node, s);
1630 bool CircleNodeSummaryBuilder::summary(const luci::CircleSquare *node, locop::NodeSummary &s) const
1632 return use_x(tbl(), node, s);
1635 bool CircleNodeSummaryBuilder::summary(const luci::CircleSquaredDifference *node,
1636 locop::NodeSummary &s) const
1638 return use_xy(tbl(), node, s);
1641 bool CircleNodeSummaryBuilder::summary(const luci::CircleSqueeze *node, locop::NodeSummary &s) const
1643 return summary_node(tbl(), node, s);
1646 bool CircleNodeSummaryBuilder::summary(const luci::CircleStridedSlice *node,
1647 locop::NodeSummary &s) const
1649 return summary_node(tbl(), node, s);
1652 bool CircleNodeSummaryBuilder::summary(const luci::CircleSub *node, locop::NodeSummary &s) const
1654 return use_xy(tbl(), node, s);
1657 bool CircleNodeSummaryBuilder::summary(const luci::CircleSum *node, locop::NodeSummary &s) const
1659 return use_reducer(tbl(), node, s);
1662 bool CircleNodeSummaryBuilder::summary(const luci::CircleTanh *node, locop::NodeSummary &s) const
1664 return use_x(tbl(), node, s);
1667 bool CircleNodeSummaryBuilder::summary(const luci::CircleTile *node, locop::NodeSummary &s) const
1669 return summary_node(tbl(), node, s);
1672 bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2 *node, locop::NodeSummary &s) const
1674 return summary_node(tbl(), node, s);
1677 bool CircleNodeSummaryBuilder::summary(const luci::CircleTranspose *node,
1678 locop::NodeSummary &s) const
1680 return summary_node(tbl(), node, s);
1683 bool CircleNodeSummaryBuilder::summary(const luci::CircleTransposeConv *node,
1684 locop::NodeSummary &s) const
1686 return summary_node(tbl(), node, s);
1689 bool CircleNodeSummaryBuilder::summary(const luci::CircleUnique *node, locop::NodeSummary &s) const
1691 return summary_node(tbl(), node, s);
1694 bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpack *node, locop::NodeSummary &s) const
1696 return summary_node(tbl(), node, s);
1699 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhere *node, locop::NodeSummary &s) const
1701 return summary_node(tbl(), node, s);
1704 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhile *node, locop::NodeSummary &s) const
1706 return summary_node(tbl(), node, s);
1709 bool CircleNodeSummaryBuilder::summary(const luci::CircleZerosLike *node,
1710 locop::NodeSummary &s) const
1712 return use_input(tbl(), node, s);
1715 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitOut *node,
1716 locop::NodeSummary &s) const
1718 return use_input(tbl(), node, s);
1721 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitVOut *node,
1722 locop::NodeSummary &s) const
1724 return use_input(tbl(), node, s);
1727 bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2Out *node,
1728 locop::NodeSummary &s) const
1730 return summary_node(tbl(), node, s);
1733 bool CircleNodeSummaryBuilder::summary(const luci::CircleUniqueOut *node,
1734 locop::NodeSummary &s) const
1736 return summary_node(tbl(), node, s);
1739 bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpackOut *node,
1740 locop::NodeSummary &s) const
1742 return summary_node(tbl(), node, s);
1745 bool CircleNodeSummaryBuilder::summary(const luci::CircleIfOut *node, locop::NodeSummary &s) const
1747 return use_input(tbl(), node, s);
1750 bool CircleNodeSummaryBuilder::summary(const luci::CircleNonMaxSuppressionV4Out *node,
1751 locop::NodeSummary &s) const
1753 return use_input(tbl(), node, s);
1756 bool CircleNodeSummaryBuilder::summary(const luci::CircleNonMaxSuppressionV5Out *node,
1757 locop::NodeSummary &s) const
1759 return use_input(tbl(), node, s);
1762 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhileOut *node,
1763 locop::NodeSummary &s) const
1765 return summary_node(tbl(), node, s);
1768 bool CircleNodeSummaryBuilder::summary(const luci::CircleInput *, locop::NodeSummary &s) const
1770 s.state(locop::NodeSummary::State::Complete);
1774 bool CircleNodeSummaryBuilder::summary(const luci::CircleOutput *node, locop::NodeSummary &s) const
1776 return summary_node(tbl(), node, s);
1779 bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQFullyConnected *node,
1780 locop::NodeSummary &s) const
1782 return summary_node(tbl(), node, s);
1785 bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQGather *node,
1786 locop::NodeSummary &s) const
1788 return summary_node(tbl(), node, s);
1791 bool CircleNodeSummaryBuilder::summary(const luci::CircleInstanceNorm *node,
1792 locop::NodeSummary &s) const
1794 return summary_node(tbl(), node, s);
1802 bool NodeSummaryBuilder::build(const loco::Node *node, locop::NodeSummary &s) const
1804 if (locop::CanonicalNodeSummaryBuilder(_tbl).build(node, s))
1809 if (CircleNodeSummaryBuilder(_tbl).build(node, s))