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::CircleNotEqual)
248 IMPLEMENT(luci::CircleOneHot)
249 IMPLEMENT(luci::CirclePack)
250 IMPLEMENT(luci::CirclePad)
251 IMPLEMENT(luci::CirclePow)
252 IMPLEMENT(luci::CirclePRelu)
253 IMPLEMENT(luci::CircleRange)
254 IMPLEMENT(luci::CircleRank)
255 IMPLEMENT(luci::CircleReduceAny)
256 IMPLEMENT(luci::CircleReduceMax)
257 IMPLEMENT(luci::CircleReduceMin)
258 IMPLEMENT(luci::CircleReduceProd)
259 IMPLEMENT(luci::CircleRelu)
260 IMPLEMENT(luci::CircleRelu6)
261 IMPLEMENT(luci::CircleReluN1To1)
262 IMPLEMENT(luci::CircleReshape)
263 IMPLEMENT(luci::CircleResizeBilinear)
264 IMPLEMENT(luci::CircleResizeNearestNeighbor)
265 IMPLEMENT(luci::CircleReverseSequence)
266 IMPLEMENT(luci::CircleReverseV2)
267 IMPLEMENT(luci::CircleRound)
268 IMPLEMENT(luci::CircleRsqrt)
269 IMPLEMENT(luci::CircleScatterNd)
270 IMPLEMENT(luci::CircleSegmentSum)
271 IMPLEMENT(luci::CircleSelect)
272 IMPLEMENT(luci::CircleSelectV2)
273 IMPLEMENT(luci::CircleShape)
274 IMPLEMENT(luci::CircleSin)
275 IMPLEMENT(luci::CircleSlice)
276 IMPLEMENT(luci::CircleSoftmax)
277 IMPLEMENT(luci::CircleSpaceToBatchND)
278 IMPLEMENT(luci::CircleSpaceToDepth)
279 IMPLEMENT(luci::CircleSparseToDense)
280 IMPLEMENT(luci::CircleSplit)
281 IMPLEMENT(luci::CircleSplitV)
282 IMPLEMENT(luci::CircleSqrt)
283 IMPLEMENT(luci::CircleSquare)
284 IMPLEMENT(luci::CircleSquaredDifference)
285 IMPLEMENT(luci::CircleSqueeze)
286 IMPLEMENT(luci::CircleStridedSlice)
287 IMPLEMENT(luci::CircleSub)
288 IMPLEMENT(luci::CircleSum)
289 IMPLEMENT(luci::CircleTanh)
290 IMPLEMENT(luci::CircleTile)
291 IMPLEMENT(luci::CircleTopKV2)
292 IMPLEMENT(luci::CircleTranspose)
293 IMPLEMENT(luci::CircleTransposeConv)
294 IMPLEMENT(luci::CircleUnpack)
295 IMPLEMENT(luci::CircleWhere)
296 IMPLEMENT(luci::CircleWhile)
297 IMPLEMENT(luci::CircleZerosLike)
299 IMPLEMENT(luci::CircleBCQFullyConnected)
300 IMPLEMENT(luci::CircleBCQGather)
301 IMPLEMENT(luci::CircleInstanceNorm)
303 IMPLEMENT(luci::CircleInput)
304 IMPLEMENT(luci::CircleOutput)
305 IMPLEMENT(luci::CircleIfOut)
306 IMPLEMENT(luci::CircleSplitOut)
307 IMPLEMENT(luci::CircleSplitVOut)
308 IMPLEMENT(luci::CircleTopKV2Out)
309 IMPLEMENT(luci::CircleUnpackOut)
310 IMPLEMENT(luci::CircleWhileOut)
314 template <class CIRCLENODE>
315 bool use_x(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
317 s.args().append("x", tbl->lookup(node->x()));
318 s.state(locop::NodeSummary::State::Complete);
322 template <class CIRCLENODE>
323 bool use_input(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
325 s.args().append("input", tbl->lookup(node->input()));
326 s.state(locop::NodeSummary::State::Complete);
330 template <class CIRCLENODE>
331 bool use_features(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
333 s.args().append("features", tbl->lookup(node->features()));
334 s.state(locop::NodeSummary::State::Complete);
338 template <class CIRCLENODE>
339 bool use_xy(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
341 s.args().append("x", tbl->lookup(node->x()));
342 s.args().append("y", tbl->lookup(node->y()));
343 s.state(locop::NodeSummary::State::Complete);
347 template <class CIRCLENODE>
348 bool use_xy_act(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
350 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
352 s.args().append("x", tbl->lookup(node->x()));
353 s.args().append("y", tbl->lookup(node->y()));
354 s.args().append("fused_activation_function", to_str(node->fusedActivationFunction()));
355 s.state(locop::NodeSummary::State::Complete);
359 template <class CIRCLENODE>
360 bool use_reducer(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
362 s.args().append("input", tbl->lookup(node->input()));
363 s.args().append("reduction_indices", tbl->lookup(node->reduction_indices()));
364 s.args().append("keep_dims", node->keep_dims() ? "true" : "false");
365 s.state(locop::NodeSummary::State::Complete);
369 template <class CIRCLENODE>
370 bool use_ido(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s)
372 s.args().append("input", tbl->lookup(node->input()));
373 s.args().append("dimension", tbl->lookup(node->dimension()));
374 s.args().append("output_type", to_str(node->output_type()));
375 s.state(locop::NodeSummary::State::Complete);
379 bool CircleNodeSummaryBuilderBase::build(const loco::Node *node, locop::NodeSummary &s) const
381 if (node->dialect() != luci::CircleDialect::get())
384 #define CIRCLE_NODE(OPCODE, CLASS) \
385 if (dynamic_cast<const CLASS *>(node)) \
387 s.opname(circle_opname(node->opnum())); \
388 return summary(dynamic_cast<const CLASS *>(node), s); \
390 #include <luci/IR/CircleNodes.lst>
396 bool CircleNodeSummaryBuilder::summary(const luci::CircleAbs *node, locop::NodeSummary &s) const
398 return use_x(tbl(), node, s);
401 bool CircleNodeSummaryBuilder::summary(const luci::CircleAdd *node, locop::NodeSummary &s) const
403 return use_xy_act(tbl(), node, s);
406 bool CircleNodeSummaryBuilder::summary(const luci::CircleAddN *node, locop::NodeSummary &s) const
408 for (uint32_t i = 0; i < node->arity(); ++i)
409 s.args().append("inputs", tbl()->lookup(node->inputs(i)));
411 s.state(locop::NodeSummary::State::Complete);
415 bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMax *node, locop::NodeSummary &s) const
417 return use_ido(tbl(), node, s);
420 bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMin *node, locop::NodeSummary &s) const
422 return use_ido(tbl(), node, s);
425 bool CircleNodeSummaryBuilder::summary(const luci::CircleAveragePool2D *node,
426 locop::NodeSummary &s) const
428 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
430 s.args().append("value", tbl()->lookup(node->value()));
431 s.args().append("filter(h,w)", to_str(node->filter()));
432 s.args().append("stride(h,w)", to_str(node->stride()));
433 s.args().append("padding", to_str(node->padding()));
434 s.args().append("fused", to_str(node->fusedActivationFunction()));
436 s.state(locop::NodeSummary::State::Complete);
441 bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchMatMul *node,
442 locop::NodeSummary &s) const
444 s.args().append("x", tbl()->lookup(node->x()));
445 s.args().append("y", tbl()->lookup(node->y()));
446 s.args().append("adj_x", to_str(node->adj_x()));
447 s.args().append("adj_y", to_str(node->adj_y()));
448 s.state(locop::NodeSummary::State::Complete);
452 bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchToSpaceND *node,
453 locop::NodeSummary &s) const
455 s.args().append("input", tbl()->lookup(node->input()));
456 s.args().append("block_shape", tbl()->lookup(node->block_shape()));
457 s.args().append("crops", tbl()->lookup(node->crops()));
459 s.state(locop::NodeSummary::State::Complete);
464 bool CircleNodeSummaryBuilder::summary(const luci::CircleCast *node, locop::NodeSummary &s) const
466 s.args().append("x", tbl()->lookup(node->x()));
467 s.args().append("in_data_type", to_str(node->in_data_type()));
468 s.args().append("out_data_type", to_str(node->out_data_type()));
469 s.state(locop::NodeSummary::State::Complete);
473 bool CircleNodeSummaryBuilder::summary(const luci::CircleCeil *node, locop::NodeSummary &s) const
475 return use_x(tbl(), node, s);
478 bool CircleNodeSummaryBuilder::summary(const luci::CircleConcatenation *node,
479 locop::NodeSummary &s) const
481 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
483 for (uint32_t i = 0; i < node->numValues(); ++i)
484 s.args().append("values", tbl()->lookup(node->values(i)));
485 s.args().append("axis", pepper::str(node->axis()));
486 s.args().append("fused", to_str(node->fusedActivationFunction()));
487 s.state(locop::NodeSummary::State::Complete);
491 bool CircleNodeSummaryBuilder::summary(const luci::CircleConst *, locop::NodeSummary &s) const
493 s.state(locop::NodeSummary::State::PartiallyKnown);
497 bool CircleNodeSummaryBuilder::summary(const luci::CircleConv2D *node, locop::NodeSummary &s) const
499 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
500 assert(node->padding() != luci::Padding::UNDEFINED);
502 s.args().append("input", tbl()->lookup(node->input()));
503 s.args().append("filter", tbl()->lookup(node->filter()));
504 s.args().append("bias", tbl()->lookup(node->bias()));
506 s.args().append("stride(h,w)", to_str(node->stride()));
507 s.args().append("dilation(h,w)", to_str(node->dilation()));
509 s.args().append("padding", to_str(node->padding()));
510 s.args().append("fused", to_str(node->fusedActivationFunction()));
512 s.state(locop::NodeSummary::State::Complete);
517 bool CircleNodeSummaryBuilder::summary(const luci::CircleCos *node, locop::NodeSummary &s) const
519 return use_x(tbl(), node, s);
522 bool CircleNodeSummaryBuilder::summary(const luci::CircleCustom *node, locop::NodeSummary &s) const
524 for (uint32_t i = 0; i < node->numInputs(); i++)
526 s.args().append("input" + std::to_string(i), tbl()->lookup(node->inputs(i)));
528 s.args().append("custom_code", node->custom_code());
529 s.state(locop::NodeSummary::State::Complete);
533 bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthToSpace *node,
534 locop::NodeSummary &s) const
536 s.args().append("input", tbl()->lookup(node->input()));
537 s.args().append("block_size", std::to_string(node->block_size()));
539 s.state(locop::NodeSummary::State::Complete);
544 bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthwiseConv2D *node,
545 locop::NodeSummary &s) const
547 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
548 assert(node->padding() != luci::Padding::UNDEFINED);
550 s.args().append("input", tbl()->lookup(node->input()));
551 s.args().append("filter", tbl()->lookup(node->filter()));
552 s.args().append("bias", tbl()->lookup(node->bias()));
554 s.args().append("stride(h,w)", to_str(node->stride()));
555 s.args().append("dilation(h,w)", to_str(node->dilation()));
556 s.args().append("padding", to_str(node->padding()));
557 s.args().append("depthMultiplier", std::to_string(node->depthMultiplier()));
558 s.args().append("fused", to_str(node->fusedActivationFunction()));
560 s.state(locop::NodeSummary::State::Complete);
565 bool CircleNodeSummaryBuilder::summary(const luci::CircleDiv *node, locop::NodeSummary &s) const
567 return use_xy(tbl(), node, s);
570 bool CircleNodeSummaryBuilder::summary(const luci::CircleElu *node, locop::NodeSummary &s) const
572 return use_features(tbl(), node, s);
575 bool CircleNodeSummaryBuilder::summary(const luci::CircleExp *node, locop::NodeSummary &s) const
577 return use_x(tbl(), node, s);
580 bool CircleNodeSummaryBuilder::summary(const luci::CircleExpandDims *node,
581 locop::NodeSummary &s) const
583 s.args().append("input", tbl()->lookup(node->input()));
584 s.args().append("axis", tbl()->lookup(node->axis()));
585 s.state(locop::NodeSummary::State::Complete);
589 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloor *node, locop::NodeSummary &s) const
591 return use_x(tbl(), node, s);
594 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorDiv *node,
595 locop::NodeSummary &s) const
597 return use_xy(tbl(), node, s);
600 bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorMod *node,
601 locop::NodeSummary &s) const
603 return use_xy(tbl(), node, s);
606 bool CircleNodeSummaryBuilder::summary(const luci::CircleFill *node, locop::NodeSummary &s) const
608 s.args().append("dims", tbl()->lookup(node->dims()));
609 s.args().append("value", tbl()->lookup(node->value()));
610 s.state(locop::NodeSummary::State::Complete);
614 bool CircleNodeSummaryBuilder::summary(const luci::CircleFullyConnected *node,
615 locop::NodeSummary &s) const
617 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
619 s.args().append("input", tbl()->lookup(node->input()));
620 s.args().append("weights", tbl()->lookup(node->weights()));
621 s.args().append("bias", tbl()->lookup(node->bias()));
622 s.args().append("fused", to_str(node->fusedActivationFunction()));
624 s.state(locop::NodeSummary::State::Complete);
629 bool CircleNodeSummaryBuilder::summary(const luci::CircleGather *node, locop::NodeSummary &s) const
631 s.args().append("params", tbl()->lookup(node->params()));
632 s.args().append("indices", tbl()->lookup(node->indices()));
633 s.args().append("axis", pepper::str(node->axis()));
635 s.state(locop::NodeSummary::State::Complete);
639 bool CircleNodeSummaryBuilder::summary(const luci::CircleGatherNd *node,
640 locop::NodeSummary &s) const
642 s.args().append("params", tbl()->lookup(node->params()));
643 s.args().append("indices", tbl()->lookup(node->indices()));
644 s.state(locop::NodeSummary::State::Complete);
648 bool CircleNodeSummaryBuilder::summary(const luci::CircleGreater *node, locop::NodeSummary &s) const
650 return use_xy(tbl(), node, s);
653 bool CircleNodeSummaryBuilder::summary(const luci::CircleGreaterEqual *node,
654 locop::NodeSummary &s) const
656 return use_xy(tbl(), node, s);
659 bool CircleNodeSummaryBuilder::summary(const luci::CircleIf *node, locop::NodeSummary &s) const
661 s.args().append("cond", tbl()->lookup(node->cond()));
662 for (uint32_t i = 0; i < node->input_count(); ++i)
663 s.args().append("input", tbl()->lookup(node->input(i)));
665 if (node->then_graph() != nullptr)
666 s.args().append("then_graph", node->then_graph()->name());
668 s.args().append("then_branch", pepper::str(node->then_branch()));
670 if (node->else_graph() != nullptr)
671 s.args().append("else_graph", node->else_graph()->name());
673 s.args().append("else_branch", pepper::str(node->else_branch()));
675 s.state(locop::NodeSummary::State::Complete);
680 bool CircleNodeSummaryBuilder::summary(const luci::CircleL2Normalize *node,
681 locop::NodeSummary &s) const
683 s.args().append("x", tbl()->lookup(node->x()));
684 s.args().append("fused_activation_function", to_str(node->fusedActivationFunction()));
685 s.state(locop::NodeSummary::State::Complete);
689 bool CircleNodeSummaryBuilder::summary(const luci::CircleLess *node, locop::NodeSummary &s) const
691 return use_xy(tbl(), node, s);
694 bool CircleNodeSummaryBuilder::summary(const luci::CircleLessEqual *node,
695 locop::NodeSummary &s) const
697 return use_xy(tbl(), node, s);
700 bool CircleNodeSummaryBuilder::summary(const luci::CircleLeakyRelu *node,
701 locop::NodeSummary &s) const
703 s.args().append("features", tbl()->lookup(node->features()));
704 s.args().append("alpha", std::to_string(node->alpha()));
705 s.state(locop::NodeSummary::State::Complete);
709 bool CircleNodeSummaryBuilder::summary(const luci::CircleLocalResponseNormalization *node,
710 locop::NodeSummary &s) const
712 s.args().append("input", tbl()->lookup(node->input()));
713 s.args().append("radius", pepper::str(node->radius()));
714 s.args().append("bias", pepper::str(node->bias()));
715 s.args().append("alpha", pepper::str(node->alpha()));
716 s.args().append("beta", pepper::str(node->beta()));
717 s.state(locop::NodeSummary::State::Complete);
721 bool CircleNodeSummaryBuilder::summary(const luci::CircleLog *node, locop::NodeSummary &s) const
723 return use_x(tbl(), node, s);
726 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalAnd *node,
727 locop::NodeSummary &s) const
729 return use_xy(tbl(), node, s);
732 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalNot *node,
733 locop::NodeSummary &s) const
735 return use_x(tbl(), node, s);
738 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalOr *node,
739 locop::NodeSummary &s) const
741 return use_xy(tbl(), node, s);
744 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogistic *node,
745 locop::NodeSummary &s) const
747 return use_x(tbl(), node, s);
750 bool CircleNodeSummaryBuilder::summary(const luci::CircleLogSoftmax *node,
751 locop::NodeSummary &s) const
753 s.args().append("logits", tbl()->lookup(node->logits()));
754 s.state(locop::NodeSummary::State::Complete);
758 bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixDiag *node,
759 locop::NodeSummary &s) const
761 s.args().append("diagonal", tbl()->lookup(node->diagonal()));
762 s.state(locop::NodeSummary::State::Complete);
766 bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixSetDiag *node,
767 locop::NodeSummary &s) const
769 s.args().append("input", tbl()->lookup(node->input()));
770 s.args().append("diagonal", tbl()->lookup(node->diagonal()));
771 s.state(locop::NodeSummary::State::Complete);
775 bool CircleNodeSummaryBuilder::summary(const luci::CircleMaximum *node, locop::NodeSummary &s) const
777 return use_xy(tbl(), node, s);
780 bool CircleNodeSummaryBuilder::summary(const luci::CircleMaxPool2D *node,
781 locop::NodeSummary &s) const
783 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
785 s.args().append("value", tbl()->lookup(node->value()));
786 s.args().append("filter(h,w)", to_str(node->filter()));
787 s.args().append("stride(h,w)", to_str(node->stride()));
788 s.args().append("padding", to_str(node->padding()));
789 s.args().append("fused", to_str(node->fusedActivationFunction()));
791 s.state(locop::NodeSummary::State::Complete);
796 bool CircleNodeSummaryBuilder::summary(const luci::CircleMean *node, locop::NodeSummary &s) const
798 return use_reducer(tbl(), node, s);
801 bool CircleNodeSummaryBuilder::summary(const luci::CircleMinimum *node, locop::NodeSummary &s) const
803 return use_xy(tbl(), node, s);
806 bool CircleNodeSummaryBuilder::summary(const luci::CircleMirrorPad *node,
807 locop::NodeSummary &s) const
809 s.args().append("input", tbl()->lookup(node->input()));
810 s.args().append("paddings", tbl()->lookup(node->paddings()));
811 s.args().append("mode", to_str(node->mode()));
812 s.state(locop::NodeSummary::State::Complete);
816 bool CircleNodeSummaryBuilder::summary(const luci::CircleMul *node, locop::NodeSummary &s) const
818 return use_xy_act(tbl(), node, s);
821 bool CircleNodeSummaryBuilder::summary(const luci::CircleNeg *node, locop::NodeSummary &s) const
823 return use_x(tbl(), node, s);
826 bool CircleNodeSummaryBuilder::summary(const luci::CircleNotEqual *node,
827 locop::NodeSummary &s) const
829 return use_xy(tbl(), node, s);
832 bool CircleNodeSummaryBuilder::summary(const luci::CircleOneHot *node, locop::NodeSummary &s) const
834 s.args().append("indices", tbl()->lookup(node->indices()));
835 s.args().append("depth", tbl()->lookup(node->depth()));
836 s.args().append("on_value", tbl()->lookup(node->on_value()));
837 s.args().append("off_value", tbl()->lookup(node->off_value()));
838 s.args().append("axis", pepper::str(node->axis()));
840 s.state(locop::NodeSummary::State::Complete);
844 bool CircleNodeSummaryBuilder::summary(const luci::CirclePack *node, locop::NodeSummary &s) const
846 for (uint32_t i = 0; i < node->values_count(); ++i)
847 s.args().append("values", tbl()->lookup(node->values(i)));
848 s.args().append("values_count", pepper::str(node->values_count()));
849 s.args().append("axis", pepper::str(node->axis()));
850 s.state(locop::NodeSummary::State::Complete);
854 bool CircleNodeSummaryBuilder::summary(const luci::CirclePad *node, locop::NodeSummary &s) const
856 s.args().append("input", tbl()->lookup(node->input()));
857 s.args().append("paddings", tbl()->lookup(node->paddings()));
858 s.state(locop::NodeSummary::State::Complete);
862 bool CircleNodeSummaryBuilder::summary(const luci::CirclePow *node, locop::NodeSummary &s) const
864 return use_xy(tbl(), node, s);
867 bool CircleNodeSummaryBuilder::summary(const luci::CirclePRelu *node, locop::NodeSummary &s) const
869 s.args().append("input", tbl()->lookup(node->input()));
870 s.args().append("alpha", tbl()->lookup(node->alpha()));
871 s.state(locop::NodeSummary::State::Complete);
875 bool CircleNodeSummaryBuilder::summary(const luci::CircleRange *node, locop::NodeSummary &s) const
877 s.args().append("start", tbl()->lookup(node->start()));
878 s.args().append("limit", tbl()->lookup(node->limit()));
879 s.args().append("delta", tbl()->lookup(node->delta()));
881 s.state(locop::NodeSummary::State::Complete);
885 bool CircleNodeSummaryBuilder::summary(const luci::CircleRank *node, locop::NodeSummary &s) const
887 return use_input(tbl(), node, s);
890 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceAny *node,
891 locop::NodeSummary &s) const
893 return use_reducer(tbl(), node, s);
896 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMax *node,
897 locop::NodeSummary &s) const
899 return use_reducer(tbl(), node, s);
902 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMin *node,
903 locop::NodeSummary &s) const
905 return use_reducer(tbl(), node, s);
908 bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceProd *node,
909 locop::NodeSummary &s) const
911 return use_reducer(tbl(), node, s);
914 bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu *node, locop::NodeSummary &s) const
916 return use_features(tbl(), node, s);
919 bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu6 *node, locop::NodeSummary &s) const
921 return use_features(tbl(), node, s);
924 bool CircleNodeSummaryBuilder::summary(const luci::CircleReluN1To1 *node,
925 locop::NodeSummary &s) const
927 return use_features(tbl(), node, s);
930 bool CircleNodeSummaryBuilder::summary(const luci::CircleReshape *node, locop::NodeSummary &s) const
932 s.args().append("tensor", tbl()->lookup(node->tensor()));
933 s.args().append("shape", tbl()->lookup(node->shape()));
934 // TODO Show newShape info
935 s.state(locop::NodeSummary::State::PartiallyKnown);
939 bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeBilinear *node,
940 locop::NodeSummary &s) const
942 s.args().append("input", tbl()->lookup(node->input()));
943 s.args().append("size", tbl()->lookup(node->size()));
944 s.args().append("align_corners", node->align_corners() ? "true" : "false");
945 s.args().append("half_pixel_centers", node->half_pixel_centers() ? "true" : "false");
946 s.state(locop::NodeSummary::State::Complete);
950 bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeNearestNeighbor *node,
951 locop::NodeSummary &s) const
953 s.args().append("input", tbl()->lookup(node->input()));
954 s.args().append("size", tbl()->lookup(node->size()));
955 s.args().append("align_corners", node->align_corners() ? "true" : "false");
956 s.state(locop::NodeSummary::State::Complete);
960 bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseSequence *node,
961 locop::NodeSummary &s) const
963 s.args().append("input", tbl()->lookup(node->input()));
964 s.args().append("seq_lengths", tbl()->lookup(node->seq_lengths()));
965 s.args().append("seq_axis", std::to_string(node->seq_axis()));
966 s.args().append("batch_axis", std::to_string(node->batch_axis()));
967 s.state(locop::NodeSummary::State::Complete);
971 bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseV2 *node,
972 locop::NodeSummary &s) const
974 s.args().append("tensor", tbl()->lookup(node->tensor()));
975 s.args().append("axis", tbl()->lookup(node->axis()));
976 s.state(locop::NodeSummary::State::Complete);
980 bool CircleNodeSummaryBuilder::summary(const luci::CircleRound *node, locop::NodeSummary &s) const
982 return use_x(tbl(), node, s);
985 bool CircleNodeSummaryBuilder::summary(const luci::CircleRsqrt *node, locop::NodeSummary &s) const
987 return use_x(tbl(), node, s);
990 bool CircleNodeSummaryBuilder::summary(const luci::CircleScatterNd *node,
991 locop::NodeSummary &s) const
993 s.args().append("indices", tbl()->lookup(node->indices()));
994 s.args().append("updates", tbl()->lookup(node->updates()));
995 s.args().append("shape", tbl()->lookup(node->shape()));
996 s.state(locop::NodeSummary::State::Complete);
1000 bool CircleNodeSummaryBuilder::summary(const luci::CircleSegmentSum *node,
1001 locop::NodeSummary &s) const
1003 s.args().append("input", tbl()->lookup(node->input()));
1004 s.args().append("segment_ids", tbl()->lookup(node->segment_ids()));
1005 s.state(locop::NodeSummary::State::Complete);
1009 bool CircleNodeSummaryBuilder::summary(const luci::CircleSelect *node, locop::NodeSummary &s) const
1011 s.args().append("condition", tbl()->lookup(node->condition()));
1012 s.args().append("t", tbl()->lookup(node->t()));
1013 s.args().append("e", tbl()->lookup(node->e()));
1014 s.state(locop::NodeSummary::State::Complete);
1018 bool CircleNodeSummaryBuilder::summary(const luci::CircleSelectV2 *node,
1019 locop::NodeSummary &s) const
1021 s.args().append("condition", tbl()->lookup(node->condition()));
1022 s.args().append("t", tbl()->lookup(node->t()));
1023 s.args().append("e", tbl()->lookup(node->e()));
1024 s.state(locop::NodeSummary::State::Complete);
1028 bool CircleNodeSummaryBuilder::summary(const luci::CircleShape *node, locop::NodeSummary &s) const
1030 s.args().append("input", tbl()->lookup(node->input()));
1031 s.args().append("out_type", to_str(node->out_type()));
1032 s.state(locop::NodeSummary::State::Complete);
1036 bool CircleNodeSummaryBuilder::summary(const luci::CircleSin *node, locop::NodeSummary &s) const
1038 return use_x(tbl(), node, s);
1041 bool CircleNodeSummaryBuilder::summary(const luci::CircleSlice *node, locop::NodeSummary &s) const
1043 s.args().append("input", tbl()->lookup(node->input()));
1044 s.args().append("begin", tbl()->lookup(node->begin()));
1045 s.args().append("size", tbl()->lookup(node->size()));
1046 s.state(locop::NodeSummary::State::Complete);
1050 bool CircleNodeSummaryBuilder::summary(const luci::CircleSoftmax *node, locop::NodeSummary &s) const
1052 s.args().append("logits", tbl()->lookup(node->logits()));
1053 s.args().append("beta", pepper::str(node->beta()));
1054 s.state(locop::NodeSummary::State::Complete);
1058 bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToBatchND *node,
1059 locop::NodeSummary &s) const
1061 s.args().append("input", tbl()->lookup(node->input()));
1062 s.args().append("block_shape", tbl()->lookup(node->block_shape()));
1063 s.args().append("paddings", tbl()->lookup(node->paddings()));
1065 s.state(locop::NodeSummary::State::Complete);
1070 bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToDepth *node,
1071 locop::NodeSummary &s) const
1073 s.args().append("input", tbl()->lookup(node->input()));
1074 s.args().append("block_size", pepper::str(node->block_size()));
1076 s.state(locop::NodeSummary::State::Complete);
1081 bool CircleNodeSummaryBuilder::summary(const luci::CircleSparseToDense *node,
1082 locop::NodeSummary &s) const
1084 s.args().append("indices", tbl()->lookup(node->indices()));
1085 s.args().append("output_shape", tbl()->lookup(node->output_shape()));
1086 s.args().append("values", tbl()->lookup(node->values()));
1087 s.args().append("default_value", tbl()->lookup(node->default_value()));
1089 s.args().append("Validate_indices", pepper::str(node->validate_indices()));
1091 s.state(locop::NodeSummary::State::Complete);
1096 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplit *node, locop::NodeSummary &s) const
1098 s.args().append("split_dim", tbl()->lookup(node->split_dim()));
1099 s.args().append("input", tbl()->lookup(node->input()));
1101 s.args().append("num_split", pepper::str(node->num_split()));
1103 s.state(locop::NodeSummary::State::Complete);
1108 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitV *node, locop::NodeSummary &s) const
1110 s.args().append("input", tbl()->lookup(node->input()));
1111 s.args().append("size_splits", tbl()->lookup(node->size_splits()));
1112 s.args().append("split_dim", tbl()->lookup(node->split_dim()));
1114 s.args().append("num_split", pepper::str(node->num_split()));
1116 s.state(locop::NodeSummary::State::Complete);
1121 bool CircleNodeSummaryBuilder::summary(const luci::CircleSqrt *node, locop::NodeSummary &s) const
1123 return use_x(tbl(), node, s);
1126 bool CircleNodeSummaryBuilder::summary(const luci::CircleSquare *node, locop::NodeSummary &s) const
1128 return use_x(tbl(), node, s);
1131 bool CircleNodeSummaryBuilder::summary(const luci::CircleSquaredDifference *node,
1132 locop::NodeSummary &s) const
1134 return use_xy(tbl(), node, s);
1137 bool CircleNodeSummaryBuilder::summary(const luci::CircleSqueeze *node, locop::NodeSummary &s) const
1139 s.args().append("input", tbl()->lookup(node->input()));
1141 std::stringstream ss{"("};
1142 for (size_t i = 0; i < node->squeeze_dims().size(); ++i)
1146 ss << node->squeeze_dims()[i];
1150 s.args().append("squeeze_dims", ss.str());
1151 s.state(locop::NodeSummary::State::Complete);
1155 bool CircleNodeSummaryBuilder::summary(const luci::CircleStridedSlice *node,
1156 locop::NodeSummary &s) const
1158 s.args().append("input", tbl()->lookup(node->input()));
1159 s.args().append("begin", tbl()->lookup(node->begin()));
1160 s.args().append("end", tbl()->lookup(node->end()));
1161 s.args().append("strides", tbl()->lookup(node->strides()));
1163 s.args().append("begin_mask", pepper::str(node->begin_mask()));
1164 s.args().append("end_mask", pepper::str(node->end_mask()));
1165 s.args().append("ellipsis_mask", pepper::str(node->ellipsis_mask()));
1166 s.args().append("new_axis_mask", pepper::str(node->new_axis_mask()));
1167 s.args().append("shrink_axis_mask", pepper::str(node->shrink_axis_mask()));
1169 s.state(locop::NodeSummary::State::Complete);
1173 bool CircleNodeSummaryBuilder::summary(const luci::CircleSub *node, locop::NodeSummary &s) const
1175 return use_xy(tbl(), node, s);
1178 bool CircleNodeSummaryBuilder::summary(const luci::CircleSum *node, locop::NodeSummary &s) const
1180 return use_reducer(tbl(), node, s);
1183 bool CircleNodeSummaryBuilder::summary(const luci::CircleTanh *node, locop::NodeSummary &s) const
1185 return use_x(tbl(), node, s);
1188 bool CircleNodeSummaryBuilder::summary(const luci::CircleTile *node, locop::NodeSummary &s) const
1190 s.args().append("input", tbl()->lookup(node->input()));
1191 s.args().append("multiples", tbl()->lookup(node->multiples()));
1192 s.state(locop::NodeSummary::State::Complete);
1196 bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2 *node, locop::NodeSummary &s) const
1198 s.args().append("input", tbl()->lookup(node->input()));
1199 s.args().append("k", tbl()->lookup(node->k()));
1200 s.state(locop::NodeSummary::State::Complete);
1204 bool CircleNodeSummaryBuilder::summary(const luci::CircleTranspose *node,
1205 locop::NodeSummary &s) const
1207 s.args().append("a", tbl()->lookup(node->a()));
1208 s.args().append("perm", tbl()->lookup(node->perm()));
1209 s.state(locop::NodeSummary::State::Complete);
1213 bool CircleNodeSummaryBuilder::summary(const luci::CircleTransposeConv *node,
1214 locop::NodeSummary &s) const
1216 assert(node->padding() != luci::Padding::UNDEFINED);
1218 s.args().append("inputSizes", tbl()->lookup(node->inputSizes()));
1219 s.args().append("filter", tbl()->lookup(node->filter()));
1220 s.args().append("outBackprop", tbl()->lookup(node->outBackprop()));
1222 s.args().append("stride(h,w)", to_str(node->stride()));
1223 s.args().append("padding", to_str(node->padding()));
1225 s.state(locop::NodeSummary::State::Complete);
1230 bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpack *node, locop::NodeSummary &s) const
1232 s.args().append("value", tbl()->lookup(node->value()));
1234 s.args().append("num", pepper::str(node->num()));
1235 s.args().append("axis", pepper::str(node->axis()));
1237 s.state(locop::NodeSummary::State::Complete);
1242 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhere *node, locop::NodeSummary &s) const
1244 s.args().append("condition", tbl()->lookup(node->condition()));
1245 s.state(locop::NodeSummary::State::Complete);
1250 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhile *node, locop::NodeSummary &s) const
1252 for (uint32_t i = 0; i < node->input_count(); ++i)
1253 s.args().append("input", tbl()->lookup(node->input(i)));
1255 if (node->cond_graph() != nullptr)
1256 s.args().append("cond_graph", node->cond_graph()->name());
1258 s.args().append("cond_branch", pepper::str(node->cond_branch()));
1260 if (node->body_graph() != nullptr)
1261 s.args().append("body_graph", node->body_graph()->name());
1263 s.args().append("body_branch", pepper::str(node->body_branch()));
1265 s.state(locop::NodeSummary::State::Complete);
1270 bool CircleNodeSummaryBuilder::summary(const luci::CircleZerosLike *node,
1271 locop::NodeSummary &s) const
1273 return use_input(tbl(), node, s);
1276 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitOut *node,
1277 locop::NodeSummary &s) const
1279 return use_input(tbl(), node, s);
1282 bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitVOut *node,
1283 locop::NodeSummary &s) const
1285 return use_input(tbl(), node, s);
1288 bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2Out *node,
1289 locop::NodeSummary &s) const
1291 s.args().append("topkv2", tbl()->lookup(node->input()));
1292 s.state(locop::NodeSummary::State::Complete);
1296 bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpackOut *node,
1297 locop::NodeSummary &s) const
1299 s.args().append("unpack", tbl()->lookup(node->input()));
1301 s.state(locop::NodeSummary::State::Complete);
1306 bool CircleNodeSummaryBuilder::summary(const luci::CircleIfOut *node, locop::NodeSummary &s) const
1308 return use_input(tbl(), node, s);
1311 bool CircleNodeSummaryBuilder::summary(const luci::CircleWhileOut *node,
1312 locop::NodeSummary &s) const
1314 s.args().append("while", tbl()->lookup(node->input()));
1316 s.state(locop::NodeSummary::State::Complete);
1321 bool CircleNodeSummaryBuilder::summary(const luci::CircleInput *, locop::NodeSummary &s) const
1323 s.state(locop::NodeSummary::State::Complete);
1327 bool CircleNodeSummaryBuilder::summary(const luci::CircleOutput *node, locop::NodeSummary &s) const
1329 s.args().append("from", tbl()->lookup(node->from()));
1331 s.state(locop::NodeSummary::State::Complete);
1335 bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQFullyConnected *node,
1336 locop::NodeSummary &s) const
1338 assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED);
1340 s.args().append("input", tbl()->lookup(node->input()));
1341 s.args().append("weights_scales", tbl()->lookup(node->weights_scales()));
1342 s.args().append("weights_binary", tbl()->lookup(node->weights_binary()));
1343 s.args().append("bias", tbl()->lookup(node->bias()));
1344 s.args().append("weights_clusters", tbl()->lookup(node->weights_clusters()));
1346 s.args().append("fused", to_str(node->fusedActivationFunction()));
1347 s.args().append("weights_hidden_size", pepper::str(node->weights_hidden_size()));
1349 s.state(locop::NodeSummary::State::Complete);
1354 bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQGather *node,
1355 locop::NodeSummary &s) const
1357 s.args().append("input_scales", tbl()->lookup(node->input_scales()));
1358 s.args().append("input_binary", tbl()->lookup(node->input_binary()));
1359 s.args().append("indices", tbl()->lookup(node->indices()));
1360 s.args().append("input_clusters", tbl()->lookup(node->input_clusters()));
1362 s.args().append("axis", pepper::str(node->axis()));
1363 s.args().append("input_hidden_size", pepper::str(node->input_hidden_size()));
1365 s.state(locop::NodeSummary::State::Complete);
1369 bool CircleNodeSummaryBuilder::summary(const luci::CircleInstanceNorm *node,
1370 locop::NodeSummary &s) const
1372 auto fused = node->fusedActivationFunction();
1373 assert(fused != luci::FusedActFunc::UNDEFINED);
1375 s.args().append("input", tbl()->lookup(node->input()));
1376 s.args().append("gamma", tbl()->lookup(node->gamma()));
1377 s.args().append("beta", tbl()->lookup(node->beta()));
1378 s.args().append("epsilon", pepper::str(node->epsilon()));
1379 s.args().append("fused_activation_function", to_str(fused));
1381 s.state(locop::NodeSummary::State::Complete);
1391 bool NodeSummaryBuilder::build(const loco::Node *node, locop::NodeSummary &s) const
1393 if (locop::CanonicalNodeSummaryBuilder(_tbl).build(node, s))
1398 if (CircleNodeSummaryBuilder(_tbl).build(node, s))