# Copyright (C) 2020-2021 Arm Limited or its affiliates. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the License); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an AS IS BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Description: # TensorFlow Lite mapping functions used by both reader and writer. # Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code # generator, to Vela's internal format. import struct import numpy as np from .data_type import DataType from .operation import CustomType from .operation import Op from .operation import Padding as opPad from .tflite import AbsOptions from .tflite import AddNOptions from .tflite import AddOptions from .tflite import ArgMaxOptions from .tflite import ArgMinOptions from .tflite import BatchMatMulOptions from .tflite import BatchToSpaceNDOptions from .tflite import BidirectionalSequenceLSTMOptions from .tflite import BidirectionalSequenceRNNOptions from .tflite import CallOptions from .tflite import CastOptions from .tflite import ConcatEmbeddingsOptions from .tflite import ConcatenationOptions from .tflite import Conv2DOptions from .tflite import CosOptions from .tflite import CumsumOptions from .tflite import DensifyOptions from .tflite import DepthToSpaceOptions from .tflite import DepthwiseConv2DOptions from .tflite import DequantizeOptions from .tflite import DivOptions from .tflite import EmbeddingLookupSparseOptions from .tflite import EqualOptions from .tflite import ExpandDimsOptions from .tflite import ExpOptions from .tflite import FakeQuantOptions from .tflite import FillOptions from .tflite import FloorDivOptions from .tflite import FloorModOptions from .tflite import FullyConnectedOptions from .tflite import GatherNdOptions from .tflite import GatherOptions from .tflite import GreaterEqualOptions from .tflite import GreaterOptions from .tflite import HardSwishOptions from .tflite import IfOptions from .tflite import L2NormOptions from .tflite import LeakyReluOptions from .tflite import LessEqualOptions from .tflite import LessOptions from .tflite import LocalResponseNormalizationOptions from .tflite import LogicalAndOptions from .tflite import LogicalNotOptions from .tflite import LogicalOrOptions from .tflite import LogSoftmaxOptions from .tflite import LSHProjectionOptions from .tflite import LSTMOptions from .tflite import MatrixDiagOptions from .tflite import MatrixSetDiagOptions from .tflite import MaximumMinimumOptions from .tflite import MirrorPadOptions from .tflite import MulOptions from .tflite import NegOptions from .tflite import NonMaxSuppressionV4Options from .tflite import NonMaxSuppressionV5Options from .tflite import NotEqualOptions from .tflite import OneHotOptions from .tflite import PackOptions from .tflite import PadOptions from .tflite import PadV2Options from .tflite import Pool2DOptions from .tflite import PowOptions from .tflite import QuantizeOptions from .tflite import RangeOptions from .tflite import RankOptions from .tflite import ReducerOptions from .tflite import ReshapeOptions from .tflite import ResizeBilinearOptions from .tflite import ResizeNearestNeighborOptions from .tflite import ReverseSequenceOptions from .tflite import ReverseV2Options from .tflite import RNNOptions from .tflite import ScatterNdOptions from .tflite import SegmentSumOptions from .tflite import SelectOptions from .tflite import SelectV2Options from .tflite import SequenceRNNOptions from .tflite import ShapeOptions from .tflite import SkipGramOptions from .tflite import SliceOptions from .tflite import SoftmaxOptions from .tflite import SpaceToBatchNDOptions from .tflite import SpaceToDepthOptions from .tflite import SparseToDenseOptions from .tflite import SplitOptions from .tflite import SplitVOptions from .tflite import SquaredDifferenceOptions from .tflite import SquareOptions from .tflite import SqueezeOptions from .tflite import StridedSliceOptions from .tflite import SubOptions from .tflite import SVDFOptions from .tflite import TileOptions from .tflite import TopKV2Options from .tflite import TransposeConvOptions from .tflite import TransposeOptions from .tflite import UnidirectionalSequenceLSTMOptions from .tflite import UniqueOptions from .tflite import UnpackOptions from .tflite import WhereOptions from .tflite import WhileOptions from .tflite import ZerosLikeOptions from .tflite.ActivationFunctionType import ActivationFunctionType from .tflite.BuiltinOperator import BuiltinOperator from .tflite.BuiltinOptions import BuiltinOptions from .tflite.Padding import Padding from .tflite.TensorType import TensorType def inverse_map(map): return {v: k for k, v in map.items()} datatype_map = { TensorType.UINT8: DataType.uint8, TensorType.INT8: DataType.int8, TensorType.INT16: DataType.int16, TensorType.INT32: DataType.int32, TensorType.INT64: DataType.int64, TensorType.FLOAT16: DataType.float16, TensorType.FLOAT32: DataType.float32, TensorType.FLOAT64: DataType.float64, TensorType.STRING: DataType.string, TensorType.BOOL: DataType.bool, TensorType.COMPLEX64: DataType.complex64, TensorType.COMPLEX128: DataType.complex128, } datatype_inv_map = inverse_map(datatype_map) datatype_inv_map[DataType.quint8] = TensorType.UINT8 datatype_inv_map[DataType.qint8] = TensorType.INT8 datatype_inv_map[DataType.qint16] = TensorType.INT16 datatype_inv_map[DataType.qint32] = TensorType.INT32 datatype_map_numpy = { TensorType.UINT8: np.uint8, TensorType.INT8: np.int8, TensorType.INT16: np.int16, TensorType.INT32: np.int32, TensorType.INT64: np.int64, TensorType.FLOAT16: np.float16, TensorType.FLOAT32: np.float32, TensorType.FLOAT64: np.float64, TensorType.BOOL: np.bool, TensorType.COMPLEX64: np.complex64, TensorType.COMPLEX128: np.complex128, TensorType.STRING: np.uint8, } builtin_options_map = { BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions, BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions, BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions, BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions, BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions, BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions, BuiltinOptions.RNNOptions: RNNOptions.RNNOptions, BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions, BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions, BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions, BuiltinOptions.AddOptions: AddOptions.AddOptions, BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions, BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions, BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions, BuiltinOptions.CallOptions: CallOptions.CallOptions, BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions, BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions, BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions, BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions, BuiltinOptions.MulOptions: MulOptions.MulOptions, BuiltinOptions.PadOptions: PadOptions.PadOptions, BuiltinOptions.GatherOptions: GatherOptions.GatherOptions, BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions, BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions, BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions, BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions, BuiltinOptions.SubOptions: SubOptions.SubOptions, BuiltinOptions.DivOptions: DivOptions.DivOptions, BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions, BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions, BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions, BuiltinOptions.ExpOptions: ExpOptions.ExpOptions, BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options, BuiltinOptions.SplitOptions: SplitOptions.SplitOptions, BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions, BuiltinOptions.CastOptions: CastOptions.CastOptions, BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions, BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions, BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions, BuiltinOptions.LessOptions: LessOptions.LessOptions, BuiltinOptions.NegOptions: NegOptions.NegOptions, BuiltinOptions.PadV2Options: PadV2Options.PadV2Options, BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions, BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions, BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions, BuiltinOptions.SelectOptions: SelectOptions.SelectOptions, BuiltinOptions.SliceOptions: SliceOptions.SliceOptions, BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions, BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions, BuiltinOptions.TileOptions: TileOptions.TileOptions, BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions, BuiltinOptions.EqualOptions: EqualOptions.EqualOptions, BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions, BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions, BuiltinOptions.PowOptions: PowOptions.PowOptions, BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions, BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions, BuiltinOptions.PackOptions: PackOptions.PackOptions, BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions, BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions, BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions, BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions, BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions, BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions, BuiltinOptions.SquareOptions: SquareOptions.SquareOptions, BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions, BuiltinOptions.FillOptions: FillOptions.FillOptions, BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions, BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions, BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions, BuiltinOptions.RangeOptions: RangeOptions.RangeOptions, BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions, BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions, BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions, BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions, BuiltinOptions.AbsOptions: AbsOptions.AbsOptions, BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions, BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions, BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options, BuiltinOptions.AddNOptions: AddNOptions.AddNOptions, BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions, BuiltinOptions.CosOptions: CosOptions.CosOptions, BuiltinOptions.WhereOptions: WhereOptions.WhereOptions, BuiltinOptions.RankOptions: RankOptions.RankOptions, BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions, BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions, BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions, BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions, BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions, BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions, BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions, BuiltinOptions.IfOptions: IfOptions.IfOptions, BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options, BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options, BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions, BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions, BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options, BuiltinOptions.WhileOptions: WhileOptions.WhileOptions, BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions, BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions, } builtin_options_inv_map = inverse_map(builtin_options_map) def underscore_to_camel_case(s): return "".join(x.title() for x in s.split("_")) def padding_deserialize(x): return padding_map[x] def padding_serialize(builder, x): return padding_inv_map[x] def activation_deserialize(x): return activation_function_map[x] def activation_serialize(builder, x): return activation_function_inv_map[x] def datatype_deserialize(x): return datatype_map[x] def datatype_serialize(builder, x): return datatype_inv_map[x] def identity(x): return x def identity_serialize(builder, x): return x def write_byte_vector(builder, v): builder.StartVector(1, len(v), 1) for e in v[::-1]: builder.PrependByte(e) return builder.EndVector(len(v)) def write_int_vector(builder, v): builder.StartVector(4, len(v), 4) for e in v[::-1]: builder.PrependInt32(e) return builder.EndVector(len(v)) class OptionsSerializer: def __init__(self, name, members=None): self.name = name self.module = globals()[self.name] self.cls = getattr(self.module, self.name) self.builtin_opt_type = builtin_options_inv_map[self.cls] self.members = [] if members is not None: for mem in members: deserialize = identity serialize = identity_serialize is_vector = False if isinstance(mem, tuple): if len(mem) == 3: mem, deserialize, serialize = mem elif len(mem) == 2: mem, is_vector = mem deserialize = tuple serialize = write_int_vector else: assert 0 underscore_mem = mem camelcase_mem = underscore_to_camel_case(mem) self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector)) def deserialize(self, op_data): builtin_options = op_data.BuiltinOptions() attrs = {} if builtin_options: tfattrs = self.cls() tfattrs.Init(builtin_options.Bytes, builtin_options.Pos) for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members: fun = camelcase_mem if is_vector: fun += "AsNumpy" attr = getattr(tfattrs, fun)() try: attrs[underscore_mem] = deserialize(attr) except TypeError: print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem)) return attrs def serialize(self, builder, attrs): ser_attrs = [] for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members: a = serialize(builder, attrs[underscore_mem]) ser_attrs.append((camelcase_mem, a)) getattr(self.module, self.name + "Start")(builder) for camelcase_mem, a in ser_attrs: getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a) return getattr(self.module, self.name + "End")(builder), None class CustomOptionsSerializer: CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0 def __init__(self): self.custom_opt_format = 0 def deserialize(self, op_data): attrs = {} custom_options = op_data.CustomOptionsAsNumpy() attrs["custom_options"] = custom_options attrs["custom_options_format"] = op_data.CustomOptionsFormat() if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP): attrs["custom_type"] = CustomType.ExistingNpuOp return attrs def serialize(self, builder, attrs): custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp) self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT) # Set NPU op custom options for the TensorFlow Lite custom operator if custom_type == CustomType.NpuOp: custom_options = self.CUSTOM_OPTIONS_NPU_OP else: custom_options = attrs.get("custom_options", []) custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options) custom_offset = write_byte_vector(builder, custom_options_bytes) return None, custom_offset padding_map = { Padding.SAME: opPad.SAME, Padding.VALID: opPad.VALID, } padding_inv_map = inverse_map(padding_map) activation_function_map = { ActivationFunctionType.NONE: None, ActivationFunctionType.RELU: Op.Relu, ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1, ActivationFunctionType.RELU6: Op.Relu6, ActivationFunctionType.TANH: Op.Tanh, ActivationFunctionType.SIGN_BIT: Op.SignBit, } activation_function_inv_map = inverse_map(activation_function_map) fused_act = ("fused_activation_function", activation_deserialize, activation_serialize) padding = ("padding", padding_deserialize, padding_serialize) pool2d_opts = OptionsSerializer( "Pool2DOptions", (padding, "stride_w", "stride_h", "filter_width", "filter_height", fused_act,) ) depthwise_opts = OptionsSerializer( "DepthwiseConv2DOptions", (padding, "stride_w", "stride_h", "depth_multiplier", fused_act, "dilation_w_factor", "dilation_h_factor",), ) conv2d_opts = OptionsSerializer( "Conv2DOptions", (padding, "stride_w", "stride_h", fused_act, "dilation_w_factor", "dilation_h_factor",) ) lstm_opts = OptionsSerializer( "LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type", "asymmetric_quantize_inputs") ) unidir_seq_lstm_opts = OptionsSerializer( "UnidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "time_major", "asymmetric_quantize_inputs",), ) bidir_seq_lstm_opts = OptionsSerializer( "BidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major", "asymmetric_quantize_inputs"), ) rnn_opts = OptionsSerializer("RNNOptions", (fused_act, "asymmetric_quantize_inputs")) seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act, "asymmetric_quantize_inputs",)) bidir_seq_rnn_opts = OptionsSerializer( "BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs", "asymmetric_quantize_inputs") ) reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",)) is_int_vec = True builtin_operator_map = { BuiltinOperator.ADD: (Op.Add, OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16"))), BuiltinOperator.AVERAGE_POOL_2D: (Op.AvgPool, pool2d_opts), BuiltinOperator.CONCATENATION: (Op.ConcatTFLite, OptionsSerializer("ConcatenationOptions", ("axis", fused_act))), BuiltinOperator.CONV_2D: (Op.Conv2DBias, conv2d_opts), BuiltinOperator.DEPTHWISE_CONV_2D: (Op.DepthwiseConv2DBias, depthwise_opts), BuiltinOperator.DEPTH_TO_SPACE: (Op.DepthToSpace, OptionsSerializer("DepthToSpaceOptions", ("block_size",))), BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions")), BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None), BuiltinOperator.FLOOR: (Op.Floor, None), BuiltinOperator.FULLY_CONNECTED: ( Op.FullyConnected, OptionsSerializer( "FullyConnectedOptions", (fused_act, "weights_format", "asymmetric_quantize_inputs", "keep_num_dims") ), ), BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None), BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,))), BuiltinOperator.L2_POOL_2D: (Op.L2Pool2D, pool2d_opts), BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: ( Op.LRN, OptionsSerializer("LocalResponseNormalizationOptions", ("radius", "bias", "alpha", "beta")), ), BuiltinOperator.LOGISTIC: (Op.Sigmoid, None), BuiltinOperator.LSH_PROJECTION: (Op.LSHProjection, OptionsSerializer("LSHProjectionOptions", ("type",))), BuiltinOperator.LSTM: (Op.Lstm, lstm_opts), BuiltinOperator.MAX_POOL_2D: (Op.MaxPool, pool2d_opts), BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,))), BuiltinOperator.RELU: (Op.Relu, None), BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None), BuiltinOperator.RELU6: (Op.Relu6, None), BuiltinOperator.RESHAPE: (Op.Reshape, OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),))), BuiltinOperator.RESIZE_BILINEAR: ( Op.ResizeBilinear, OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")), ), BuiltinOperator.RNN: (Op.Rnn, rnn_opts), BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",))), BuiltinOperator.SPACE_TO_DEPTH: (Op.SpaceToDepth, OptionsSerializer("SpaceToDepthOptions", ("block_size",))), BuiltinOperator.SVDF: ( Op.Svdf, OptionsSerializer("SVDFOptions", ("rank", fused_act, "asymmetric_quantize_inputs")), ), BuiltinOperator.TANH: (Op.Tanh, None), BuiltinOperator.CONCAT_EMBEDDINGS: ( Op.ConcatEmbeddings, OptionsSerializer( "ConcatEmbeddingsOptions", ( "num_channels", "num_columns_per_channel", "num_columns_per_channel_as_numpy", "num_columns_per_channel_as_length", "embedding_dim_per_channel", "embedding_dim_per_channel_as_numpy", "embedding_dim_per_channel_as_length", ), ), ), BuiltinOperator.SKIP_GRAM: ( Op.SkipGram, OptionsSerializer("SkipGramOptions", ("ngram_size", "max_skip_size", "include_all_ngrams")), ), BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",))), BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: ( Op.EmbeddingLookupSparse, OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)), ), BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions")), BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (Op.UnidirectionalSequenceRnn, seq_rnn_opts), BuiltinOperator.GATHER: (Op.GatherV2, OptionsSerializer("GatherOptions", ("axis",))), BuiltinOperator.BATCH_TO_SPACE_ND: (Op.BatchToSpaceND, OptionsSerializer("BatchToSpaceNDOptions")), BuiltinOperator.SPACE_TO_BATCH_ND: (Op.SpaceToBatchND, OptionsSerializer("SpaceToBatchNDOptions")), BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions")), BuiltinOperator.MEAN: (Op.Mean, None), BuiltinOperator.SUB: (Op.Sub, OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16",))), BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,))), BuiltinOperator.SQUEEZE: (Op.Squeeze, OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))), BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (Op.UnidirectionalSequenceLstm, unidir_seq_lstm_opts), BuiltinOperator.STRIDED_SLICE: ( Op.StridedSlice, OptionsSerializer( "StridedSliceOptions", ("begin_mask", "end_mask", "ellipsis_mask", "new_axis_mask", "shrink_axis_mask") ), ), BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (Op.BidirectionalSequenceRnn, bidir_seq_rnn_opts), BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions")), BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options")), BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",))), BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions")), BuiltinOperator.DELEGATE: (Op.Delegate, None), BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (Op.BidirectionalSequenceLstm, bidir_seq_lstm_opts), BuiltinOperator.CAST: ( Op.Cast, OptionsSerializer( "CastOptions", ( ("in_data_type", datatype_deserialize, datatype_serialize), ("out_data_type", datatype_deserialize, datatype_serialize), ), ), ), BuiltinOperator.PRELU: (Op.Prelu, None), BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions")), BuiltinOperator.ARG_MAX: ( Op.ArgMax, OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)), ), BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions")), BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions")), BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions")), BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options")), BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions")), BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions")), BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions")), BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions")), BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions")), BuiltinOperator.SIN: (Op.Sin, None), BuiltinOperator.TRANSPOSE_CONV: ( Op.Conv2DBackpropInput, OptionsSerializer("TransposeConvOptions", (padding, "stride_w", "stride_h")), ), BuiltinOperator.SPARSE_TO_DENSE: ( Op.SparseToDense, OptionsSerializer("SparseToDenseOptions", ("validate_indices",)), ), BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions")), BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions")), BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions")), BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions")), BuiltinOperator.LOG: (Op.Log, None), BuiltinOperator.SUM: (Op.Sum, reducer_opts), BuiltinOperator.SQRT: (Op.Sqrt, None), BuiltinOperator.RSQRT: (Op.Rsqrt, None), BuiltinOperator.SHAPE: ( Op.Shape, OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)), ), BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions")), BuiltinOperator.ARG_MIN: ( Op.ArgMin, OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)), ), BuiltinOperator.FAKE_QUANT: ( Op.FakeQuantWithMinMaxArgs, OptionsSerializer("FakeQuantOptions", ("min", "max", "num_bits", "narrow_range")), ), BuiltinOperator.REDUCE_PROD: (Op.Prod, reducer_opts), BuiltinOperator.REDUCE_MAX: (Op.Max, reducer_opts), BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("values_count", "axis"))), BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions")), BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",))), BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions")), BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions")), BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("num", "axis"))), BuiltinOperator.REDUCE_MIN: (Op.Min, reducer_opts), BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions")), BuiltinOperator.REDUCE_ANY: (Op.Any, reducer_opts), BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions")), BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions")), BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions")), BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions")), BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions")), BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: ( Op.ResizeNearestNeighbor, OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")), ), BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",))), BuiltinOperator.SQUARED_DIFFERENCE: (Op.SquaredDifference, OptionsSerializer("SquaredDifferenceOptions")), BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",))), BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions")), BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",))), BuiltinOperator.UNIQUE: ( Op.Unique, OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)), ), BuiltinOperator.CEIL: (Op.Ceil, None), BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options")), BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions")), BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions")), BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions")), BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions")), BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions")), BuiltinOperator.ELU: (Op.Elu, None), BuiltinOperator.REVERSE_SEQUENCE: ( Op.ReverseSequence, OptionsSerializer("ReverseSequenceOptions", ("seq_dim", "batch_dim")), ), BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions")), BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions")), BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions")), BuiltinOperator.ROUND: (Op.Round, None), BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions")), BuiltinOperator.IF: (Op.If, OptionsSerializer("IfOptions", ("then_subgraph_index", "else_subgraph_index"))), BuiltinOperator.WHILE: ( Op.While, OptionsSerializer("WhileOptions", ("cond_subgraph_index", "body_subgraph_index")), ), BuiltinOperator.NON_MAX_SUPPRESSION_V4: (Op.NonMaxSuppressionV4, OptionsSerializer("NonMaxSuppressionV4Options")), BuiltinOperator.NON_MAX_SUPPRESSION_V5: (Op.NonMaxSuppressionV5, OptionsSerializer("NonMaxSuppressionV5Options")), BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions")), BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options")), BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions")), BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions")), BuiltinOperator.BATCH_MATMUL: (Op.BatchMatMul, OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y"))), BuiltinOperator.CUMSUM: (Op.Cumsum, OptionsSerializer("CumsumOptions", ("exclusive", "reverse"))), BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer()), } builtin_operator_inv_map = {v[0]: (k, v[1]) for k, v in builtin_operator_map.items()} builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer()) BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN" def builtin_type_name(builtin): return next(k for k, v in vars(BuiltinOperator).items() if v == builtin) def optype_to_builtintype(op_type): if op_type in builtin_operator_inv_map: return builtin_type_name(builtin_operator_inv_map[op_type][0]) else: return BUILTIN_OPERATOR_UNKNOWN