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 "OpPrinter.h"
19 #include <mio_circle/Helper.h>
23 #include <flatbuffers/flexbuffers.h>
25 using std::make_unique;
30 // TODO move to some header
31 std::ostream &operator<<(std::ostream &os, const std::vector<int32_t> &vect);
33 // TODO Re-arrange in alphabetical order
35 class AddPrinter : public OpPrinter
38 void options(const circle::Operator *op, std::ostream &os) const override
40 if (auto *params = op->builtin_options_as_AddOptions())
43 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
50 class ArgMaxPrinter : public OpPrinter
53 void options(const circle::Operator *op, std::ostream &os) const override
55 if (auto *params = op->builtin_options_as_ArgMaxOptions())
58 os << "OutputType(" << EnumNameTensorType(params->output_type()) << ") ";
64 class ArgMinPrinter : public OpPrinter
67 void options(const circle::Operator *op, std::ostream &os) const override
69 if (auto *params = op->builtin_options_as_ArgMinOptions())
72 os << "OutputType(" << EnumNameTensorType(params->output_type()) << ") ";
78 class BatchMatMulPrinter : public OpPrinter
81 void options(const circle::Operator *op, std::ostream &os) const override
83 if (auto *params = op->builtin_options_as_BatchMatMulOptions())
87 os << "adjoint_lhs(" << params->adjoint_lhs() << ") ";
88 os << "adjoint_rhs(" << params->adjoint_rhs() << ") ";
89 os << std::noboolalpha;
95 class BidirectionalSequenceLSTMPrinter : public OpPrinter
98 void options(const circle::Operator *op, std::ostream &os) const override
100 if (auto *params = op->builtin_options_as_BidirectionalSequenceLSTMOptions())
103 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
105 os << "cell_clip(" << params->cell_clip() << ") ";
106 os << "proj_clip(" << params->proj_clip() << ") ";
107 os << "time_major(" << params->time_major() << ") ";
108 os << "asymmetric_quantize_inputs(" << params->asymmetric_quantize_inputs() << ") ";
109 os << "merge_outputs(" << params->merge_outputs() << ") ";
115 class CastPrinter : public OpPrinter
118 void options(const circle::Operator *op, std::ostream &os) const override
120 if (auto cast_params = op->builtin_options_as_CastOptions())
123 os << "in_data_type(" << circle::EnumNameTensorType(cast_params->in_data_type()) << ") ";
124 os << "out_data_type(" << circle::EnumNameTensorType(cast_params->out_data_type()) << ") ";
130 class Conv2DPrinter : public OpPrinter
133 void options(const circle::Operator *op, std::ostream &os) const override
135 if (auto conv_params = op->builtin_options_as_Conv2DOptions())
138 os << "Padding(" << conv_params->padding() << ") ";
139 os << "Stride.W(" << conv_params->stride_w() << ") ";
140 os << "Stride.H(" << conv_params->stride_h() << ") ";
141 os << "Dilation.W(" << conv_params->dilation_w_factor() << ") ";
142 os << "Dilation.H(" << conv_params->dilation_h_factor() << ") ";
144 << EnumNameActivationFunctionType(conv_params->fused_activation_function()) << ")";
150 class DepthToSpacePrinter : public OpPrinter
153 void options(const circle::Operator *op, std::ostream &os) const override
155 if (auto *std_params = op->builtin_options_as_DepthToSpaceOptions())
158 os << "BlockSize(" << std_params->block_size() << ")";
164 class DivPrinter : public OpPrinter
167 void options(const circle::Operator *op, std::ostream &os) const override
169 if (auto *params = op->builtin_options_as_DivOptions())
172 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
179 class Pool2DPrinter : public OpPrinter
182 void options(const circle::Operator *op, std::ostream &os) const override
184 if (auto pool_params = op->builtin_options_as_Pool2DOptions())
187 os << "Padding(" << pool_params->padding() << ") ";
188 os << "Stride.W(" << pool_params->stride_w() << ") ";
189 os << "Stride.H(" << pool_params->stride_h() << ") ";
190 os << "Filter.W(" << pool_params->filter_width() << ") ";
191 os << "Filter.H(" << pool_params->filter_height() << ") ";
193 << EnumNameActivationFunctionType(pool_params->fused_activation_function()) << ")";
199 class ConcatenationPrinter : public OpPrinter
202 void options(const circle::Operator *op, std::ostream &os) const override
204 if (auto *concatenation_params = op->builtin_options_as_ConcatenationOptions())
208 << EnumNameActivationFunctionType(concatenation_params->fused_activation_function())
210 os << "Axis(" << concatenation_params->axis() << ")";
216 class ReducerPrinter : public OpPrinter
219 void options(const circle::Operator *op, std::ostream &os) const override
221 if (auto reducer_params = op->builtin_options_as_ReducerOptions())
224 os << "keep_dims(" << reducer_params->keep_dims() << ") ";
230 class ReshapePrinter : public OpPrinter
233 void options(const circle::Operator *op, std::ostream &os) const override
235 if (auto *reshape_params = op->builtin_options_as_ReshapeOptions())
237 auto new_shape = mio::circle::as_index_vector(reshape_params->new_shape());
239 os << "NewShape(" << new_shape << ")";
245 class ResizeBilinearPrinter : public OpPrinter
248 void options(const circle::Operator *op, std::ostream &os) const override
250 if (auto *resize_params = op->builtin_options_as_ResizeBilinearOptions())
253 os << std::boolalpha;
254 os << "align_corners(" << resize_params->align_corners() << ")";
255 os << "half_pixel_centers(" << resize_params->half_pixel_centers() << ")";
256 os << std::noboolalpha;
262 class ResizeNearestNeighborPrinter : public OpPrinter
265 void options(const circle::Operator *op, std::ostream &os) const override
267 if (auto *resize_params = op->builtin_options_as_ResizeNearestNeighborOptions())
270 os << std::boolalpha;
271 os << "align_corners(" << resize_params->align_corners() << ")";
272 os << std::noboolalpha;
278 class ReverseSequencePrinter : public OpPrinter
281 void options(const circle::Operator *op, std::ostream &os) const override
283 if (auto *params = op->builtin_options_as_ReverseSequenceOptions())
286 os << "seq_dim(" << params->seq_dim() << ") ";
287 os << "batch_dim(" << params->batch_dim() << ") ";
293 class DepthwiseConv2DPrinter : public OpPrinter
296 void options(const circle::Operator *op, std::ostream &os) const override
298 if (auto conv_params = op->builtin_options_as_DepthwiseConv2DOptions())
301 os << "Padding(" << conv_params->padding() << ") ";
302 os << "Stride.W(" << conv_params->stride_w() << ") ";
303 os << "Stride.H(" << conv_params->stride_h() << ") ";
304 os << "DepthMultiplier(" << conv_params->depth_multiplier() << ") ";
305 os << "Dilation.W(" << conv_params->dilation_w_factor() << ") ";
306 os << "Dilation.H(" << conv_params->dilation_h_factor() << ") ";
308 << EnumNameActivationFunctionType(conv_params->fused_activation_function()) << ") ";
314 class FakeQuantPrinter : public OpPrinter
317 void options(const circle::Operator *op, std::ostream &os) const override
319 if (auto *params = op->builtin_options_as_FakeQuantOptions())
322 os << "Min(" << params->min() << ") ";
323 os << "Max(" << params->max() << ") ";
324 os << "NumBits(" << params->num_bits() << ") ";
325 os << std::boolalpha;
326 os << "NarrowRange(" << params->narrow_range() << ") ";
327 os << std::noboolalpha;
333 class FullyConnectedPrinter : public OpPrinter
336 void options(const circle::Operator *op, std::ostream &os) const override
338 if (auto *params = op->builtin_options_as_FullyConnectedOptions())
341 os << "WeightFormat(" << EnumNameFullyConnectedOptionsWeightsFormat(params->weights_format())
343 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
345 os << "keep_num_dims(" << params->keep_num_dims() << ") ";
352 class GatherPrinter : public OpPrinter
355 void options(const circle::Operator *op, std::ostream &os) const override
357 if (auto *params = op->builtin_options_as_GatherOptions())
360 os << "Axis(" << params->axis() << ") ";
367 class GeluPrinter : public OpPrinter
370 void options(const circle::Operator *op, std::ostream &os) const override
372 if (auto *params = op->builtin_options_as_GeluOptions())
375 os << std::boolalpha;
376 os << "approximate(" << params->approximate() << ") ";
377 os << std::noboolalpha;
383 class IfPrinter : public OpPrinter
386 void options(const circle::Operator *op, std::ostream &os) const override
388 if (auto *params = op->builtin_options_as_IfOptions())
391 os << "then_subgraph_index(" << params->then_subgraph_index() << ") ";
392 os << "else_subgraph_index(" << params->else_subgraph_index() << ") ";
398 class L2NormPrinter : public OpPrinter
401 void options(const circle::Operator *op, std::ostream &os) const override
403 if (auto *params = op->builtin_options_as_L2NormOptions())
406 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
413 class LeakyReluPrinter : public OpPrinter
416 void options(const circle::Operator *op, std::ostream &os) const override
418 if (auto *params = op->builtin_options_as_LeakyReluOptions())
421 os << "alpha(" << params->alpha() << ") ";
426 class LocalResponseNormalizationPrinter : public OpPrinter
429 void options(const circle::Operator *op, std::ostream &os) const override
431 if (auto *params = op->builtin_options_as_LocalResponseNormalizationOptions())
434 os << "radius(" << params->radius() << ") ";
435 os << "bias(" << params->bias() << ") ";
436 os << "alpha(" << params->alpha() << ") ";
437 os << "beta(" << params->beta() << ") ";
443 class MirrorPadPrinter : public OpPrinter
446 void options(const circle::Operator *op, std::ostream &os) const override
448 if (auto *params = op->builtin_options_as_MirrorPadOptions())
451 os << "mode(" << EnumNameMirrorPadMode(params->mode()) << ") ";
457 class MulPrinter : public OpPrinter
460 void options(const circle::Operator *op, std::ostream &os) const override
462 if (auto *params = op->builtin_options_as_MulOptions())
465 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
472 class OneHotPrinter : public OpPrinter
475 void options(const circle::Operator *op, std::ostream &os) const override
477 if (auto *params = op->builtin_options_as_OneHotOptions())
480 os << "Axis(" << params->axis() << ") ";
487 class PackPrinter : public OpPrinter
490 void options(const circle::Operator *op, std::ostream &os) const override
492 if (auto *params = op->builtin_options_as_PackOptions())
495 os << "ValuesCount(" << params->values_count() << ") ";
496 os << "Axis(" << params->axis() << ") ";
502 class ShapePrinter : public OpPrinter
505 void options(const circle::Operator *op, std::ostream &os) const override
507 if (auto *params = op->builtin_options_as_ShapeOptions())
510 os << "out_type(" << EnumNameTensorType(params->out_type()) << ") ";
516 class SoftmaxPrinter : public OpPrinter
519 void options(const circle::Operator *op, std::ostream &os) const override
521 if (auto *softmax_params = op->builtin_options_as_SoftmaxOptions())
524 os << "Beta(" << softmax_params->beta() << ")";
530 class SpaceToDepthPrinter : public OpPrinter
533 void options(const circle::Operator *op, std::ostream &os) const override
535 if (auto *std_params = op->builtin_options_as_SpaceToDepthOptions())
538 os << "BlockSize(" << std_params->block_size() << ")";
544 class SparseToDensePrinter : public OpPrinter
547 void options(const circle::Operator *op, std::ostream &os) const override
549 if (auto *std_params = op->builtin_options_as_SparseToDenseOptions())
552 os << "ValidateIndices(" << std_params->validate_indices() << ")";
558 class SplitPrinter : public OpPrinter
561 void options(const circle::Operator *op, std::ostream &os) const override
563 if (auto *params = op->builtin_options_as_SplitOptions())
566 os << "num_splits(" << params->num_splits() << ") ";
572 class SplitVPrinter : public OpPrinter
575 void options(const circle::Operator *op, std::ostream &os) const override
577 if (auto *params = op->builtin_options_as_SplitVOptions())
580 os << "num_splits(" << params->num_splits() << ") ";
586 class SqueezePrinter : public OpPrinter
589 void options(const circle::Operator *op, std::ostream &os) const override
591 if (auto *params = op->builtin_options_as_SqueezeOptions())
594 os << "SqueezeDims(";
595 for (int i = 0; i < params->squeeze_dims()->size(); ++i)
599 os << params->squeeze_dims()->Get(i);
607 class StridedSlicePrinter : public OpPrinter
610 void options(const circle::Operator *op, std::ostream &os) const override
612 if (auto *strided_slice_params = op->builtin_options_as_StridedSliceOptions())
615 os << "begin_mask(" << strided_slice_params->begin_mask() << ") ";
616 os << "end_mask(" << strided_slice_params->end_mask() << ") ";
617 os << "ellipsis_mask(" << strided_slice_params->ellipsis_mask() << ") ";
618 os << "new_axis_mask(" << strided_slice_params->new_axis_mask() << ") ";
619 os << "shrink_axis_mask(" << strided_slice_params->shrink_axis_mask() << ") ";
625 class SubPrinter : public OpPrinter
628 void options(const circle::Operator *op, std::ostream &os) const override
630 if (auto *params = op->builtin_options_as_SubOptions())
633 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
640 class SVDFPrinter : public OpPrinter
643 void options(const circle::Operator *op, std::ostream &os) const override
645 if (auto *params = op->builtin_options_as_SVDFOptions())
648 os << "rank(" << params->rank() << ") ";
649 os << "activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
651 os << "asymmetric_quantize_inputs(" << params->asymmetric_quantize_inputs() << ") ";
657 class TransposeConvPrinter : public OpPrinter
660 void options(const circle::Operator *op, std::ostream &os) const override
662 if (auto params = op->builtin_options_as_TransposeConvOptions())
665 os << "Padding(" << params->padding() << ") ";
666 os << "Stride.W(" << params->stride_w() << ") ";
667 os << "Stride.H(" << params->stride_h() << ") ";
668 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
675 class UnidirectionalSequenceLSTMPrinter : public OpPrinter
678 void options(const circle::Operator *op, std::ostream &os) const override
680 if (auto *params = op->builtin_options_as_UnidirectionalSequenceLSTMOptions())
683 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
685 os << "cell_clip(" << params->cell_clip() << ") ";
686 os << "proj_clip(" << params->proj_clip() << ") ";
687 os << "time_major(" << params->time_major() << ") ";
688 os << "asymmetric_quantize_inputs(" << params->asymmetric_quantize_inputs() << ") ";
694 class UniquePrinter : public OpPrinter
697 void options(const circle::Operator *op, std::ostream &os) const override
699 if (auto *params = op->builtin_options_as_UniqueOptions())
702 os << "idx_out_type(" << EnumNameTensorType(params->idx_out_type()) << ") ";
708 class WhilePrinter : public OpPrinter
711 void options(const circle::Operator *op, std::ostream &os) const override
713 if (auto *params = op->builtin_options_as_WhileOptions())
716 os << "cond_subgraph_index(" << params->cond_subgraph_index() << ") ";
717 os << "body_subgraph_index(" << params->body_subgraph_index() << ") ";
723 class CustomOpPrinter : public OpPrinter
726 void options(const circle::Operator *op, std::ostream &os) const override
728 if (op->custom_options_format() != circle::CustomOptionsFormat::CustomOptionsFormat_FLEXBUFFERS)
731 os << "Unknown custom option format";
735 const flatbuffers::Vector<uint8_t> *option_buf = op->custom_options();
737 if (option_buf == nullptr || option_buf->size() == 0)
739 os << "No attrs found." << std::endl;
744 // attrs of custom ops are encoded in flexbuffer format
745 auto attr_map = flexbuffers::GetRoot(option_buf->data(), option_buf->size()).AsMap();
748 auto keys = attr_map.Keys();
749 for (int i = 0; i < keys.size(); i++)
751 auto key = keys[i].ToString();
752 os << key << "(" << attr_map[key].ToString() << ") ";
755 // Note: attr in "Shape" type does not seem to be converted by circle_convert.
756 // When the converted circle file (with custom op) is opened with hexa editory,
757 // attrs names can be found but attr name in "Shape" type is not found.
763 class BCQFullyConnectedPrinter : public OpPrinter
766 void options(const circle::Operator *op, std::ostream &os) const override
768 if (auto *params = op->builtin_options_as_BCQFullyConnectedOptions())
771 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
773 os << "weights_hidden_size(" << params->weights_hidden_size() << ") ";
779 class BCQGatherPrinter : public OpPrinter
782 void options(const circle::Operator *op, std::ostream &os) const override
784 if (auto *params = op->builtin_options_as_BCQGatherOptions())
787 os << "axis(" << params->axis() << ") ";
788 os << "weights_hidden_size(" << params->input_hidden_size() << ") ";
794 class InstanceNormPrinter : public OpPrinter
797 void options(const circle::Operator *op, std::ostream &os) const override
799 if (auto *params = op->builtin_options_as_InstanceNormOptions())
802 os << "epsilon(" << params->epsilon() << ") ";
803 os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function())
810 OpPrinterRegistry::OpPrinterRegistry()
812 _op_map[circle::BuiltinOperator_ADD] = make_unique<AddPrinter>();
813 // There is no Option for ADD_N
814 _op_map[circle::BuiltinOperator_ARG_MAX] = make_unique<ArgMaxPrinter>();
815 _op_map[circle::BuiltinOperator_ARG_MIN] = make_unique<ArgMinPrinter>();
816 _op_map[circle::BuiltinOperator_AVERAGE_POOL_2D] = make_unique<Pool2DPrinter>();
817 _op_map[circle::BuiltinOperator_BATCH_MATMUL] = make_unique<BatchMatMulPrinter>();
818 _op_map[circle::BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM] =
819 make_unique<BidirectionalSequenceLSTMPrinter>();
820 _op_map[circle::BuiltinOperator_CAST] = make_unique<CastPrinter>();
821 // There is no Option for CEIL
822 _op_map[circle::BuiltinOperator_CONCATENATION] = make_unique<ConcatenationPrinter>();
823 _op_map[circle::BuiltinOperator_CONV_2D] = make_unique<Conv2DPrinter>();
824 // There is no Option for DENSIFY
825 _op_map[circle::BuiltinOperator_DEPTH_TO_SPACE] = make_unique<DepthToSpacePrinter>();
826 _op_map[circle::BuiltinOperator_DEPTHWISE_CONV_2D] = make_unique<DepthwiseConv2DPrinter>();
827 // There is no Option for DEQUANTIZE
828 _op_map[circle::BuiltinOperator_DIV] = make_unique<DivPrinter>();
829 _op_map[circle::BuiltinOperator_FAKE_QUANT] = make_unique<FakeQuantPrinter>();
830 // There is no Option for FLOOR
831 // There is no Option for FLOOR_MOD
832 _op_map[circle::BuiltinOperator_FULLY_CONNECTED] = make_unique<FullyConnectedPrinter>();
833 _op_map[circle::BuiltinOperator_GATHER] = make_unique<GatherPrinter>();
834 _op_map[circle::BuiltinOperator_GELU] = make_unique<GeluPrinter>();
835 _op_map[circle::BuiltinOperator_IF] = make_unique<IfPrinter>();
836 _op_map[circle::BuiltinOperator_L2_NORMALIZATION] = make_unique<L2NormPrinter>();
837 _op_map[circle::BuiltinOperator_L2_POOL_2D] = make_unique<Pool2DPrinter>();
838 _op_map[circle::BuiltinOperator_LEAKY_RELU] = make_unique<LeakyReluPrinter>();
839 _op_map[circle::BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION] =
840 make_unique<LocalResponseNormalizationPrinter>();
841 // There is no Option for LOG
842 // There is no Option for LOGISTIC
843 // There is no Option for LOG_SOFTMAX
844 _op_map[circle::BuiltinOperator_MAX_POOL_2D] = make_unique<Pool2DPrinter>();
845 _op_map[circle::BuiltinOperator_MIRROR_PAD] = make_unique<MirrorPadPrinter>();
846 _op_map[circle::BuiltinOperator_MUL] = make_unique<MulPrinter>();
847 // There is no Option for NON_MAX_SUPPRESSION_V4
848 // There is no Option for NON_MAX_SUPPRESSION_V5
849 _op_map[circle::BuiltinOperator_ONE_HOT] = make_unique<OneHotPrinter>();
850 _op_map[circle::BuiltinOperator_PACK] = make_unique<PackPrinter>();
851 // There is no Option for PAD
852 // There is no Option for PADV2
853 // There is no Option for PRELU
854 // There is no Option for RELU
855 // There is no Option for RELU6
856 // There is no Option for RELU_N1_TO_1
857 _op_map[circle::BuiltinOperator_REDUCE_ANY] = make_unique<ReducerPrinter>();
858 _op_map[circle::BuiltinOperator_REDUCE_MAX] = make_unique<ReducerPrinter>();
859 _op_map[circle::BuiltinOperator_REDUCE_MIN] = make_unique<ReducerPrinter>();
860 _op_map[circle::BuiltinOperator_REDUCE_PROD] = make_unique<ReducerPrinter>();
861 _op_map[circle::BuiltinOperator_RESHAPE] = make_unique<ReshapePrinter>();
862 _op_map[circle::BuiltinOperator_RESIZE_BILINEAR] = make_unique<ResizeBilinearPrinter>();
863 _op_map[circle::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR] =
864 make_unique<ResizeNearestNeighborPrinter>();
865 _op_map[circle::BuiltinOperator_REVERSE_SEQUENCE] = make_unique<ReverseSequencePrinter>();
866 // There is no Option for ROUND
867 // There is no Option for SELECT
868 // There is no Option for SELECT_V2
869 _op_map[circle::BuiltinOperator_SHAPE] = make_unique<ShapePrinter>();
870 // There is no Option for SIN
871 // There is no Option for SLICE
872 _op_map[circle::BuiltinOperator_SOFTMAX] = make_unique<SoftmaxPrinter>();
873 _op_map[circle::BuiltinOperator_SPACE_TO_DEPTH] = make_unique<SpaceToDepthPrinter>();
874 // There is no Option for SPACE_TO_BATCH_ND
875 _op_map[circle::BuiltinOperator_SPARSE_TO_DENSE] = make_unique<SparseToDensePrinter>();
876 _op_map[circle::BuiltinOperator_SPLIT] = make_unique<SplitPrinter>();
877 _op_map[circle::BuiltinOperator_SPLIT_V] = make_unique<SplitVPrinter>();
878 _op_map[circle::BuiltinOperator_SQUEEZE] = make_unique<SqueezePrinter>();
879 _op_map[circle::BuiltinOperator_STRIDED_SLICE] = make_unique<StridedSlicePrinter>();
880 _op_map[circle::BuiltinOperator_SUB] = make_unique<SubPrinter>();
881 _op_map[circle::BuiltinOperator_SUM] = make_unique<ReducerPrinter>();
882 _op_map[circle::BuiltinOperator_SVDF] = make_unique<SVDFPrinter>();
883 _op_map[circle::BuiltinOperator_TRANSPOSE_CONV] = make_unique<TransposeConvPrinter>();
884 // There is no Option for TOPK_V2
885 _op_map[circle::BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM] =
886 make_unique<UnidirectionalSequenceLSTMPrinter>();
887 _op_map[circle::BuiltinOperator_UNIQUE] = make_unique<UniquePrinter>();
888 _op_map[circle::BuiltinOperator_WHILE] = make_unique<WhilePrinter>();
889 _op_map[circle::BuiltinOperator_CUSTOM] = make_unique<CustomOpPrinter>();
892 _op_map[circle::BuiltinOperator_BCQ_FULLY_CONNECTED] = make_unique<BCQFullyConnectedPrinter>();
893 _op_map[circle::BuiltinOperator_BCQ_GATHER] = make_unique<BCQGatherPrinter>();
894 _op_map[circle::BuiltinOperator_INSTANCE_NORM] = make_unique<InstanceNormPrinter>();
897 } // namespace circledump