aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/tflite_mapping.py
diff options
context:
space:
mode:
Diffstat (limited to 'ethosu/vela/tflite_mapping.py')
-rw-r--r--ethosu/vela/tflite_mapping.py644
1 files changed, 644 insertions, 0 deletions
diff --git a/ethosu/vela/tflite_mapping.py b/ethosu/vela/tflite_mapping.py
new file mode 100644
index 00000000..8e46ef2e
--- /dev/null
+++ b/ethosu/vela/tflite_mapping.py
@@ -0,0 +1,644 @@
+# Copyright (C) 2020 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 numpy as np
+import struct
+
+from .data_type import DataType
+
+from .tflite.TensorType import TensorType
+from .tflite.BuiltinOperator import BuiltinOperator
+from .tflite.BuiltinOptions import BuiltinOptions
+
+
+from .tflite.Padding import Padding
+from .tflite.ActivationFunctionType import ActivationFunctionType
+
+from .tflite import Conv2DOptions
+from .tflite import DepthwiseConv2DOptions
+from .tflite import ConcatEmbeddingsOptions
+from .tflite import LSHProjectionOptions
+from .tflite import Pool2DOptions
+from .tflite import SVDFOptions
+from .tflite import RNNOptions
+from .tflite import FullyConnectedOptions
+from .tflite import SoftmaxOptions
+from .tflite import ConcatenationOptions
+from .tflite import AddOptions
+from .tflite import L2NormOptions
+from .tflite import LocalResponseNormalizationOptions
+from .tflite import LSTMOptions
+from .tflite import ResizeBilinearOptions
+from .tflite import CallOptions
+from .tflite import ReshapeOptions
+from .tflite import SkipGramOptions
+from .tflite import SpaceToDepthOptions
+from .tflite import EmbeddingLookupSparseOptions
+from .tflite import MulOptions
+from .tflite import PadOptions
+from .tflite import GatherOptions
+from .tflite import BatchToSpaceNDOptions
+from .tflite import SpaceToBatchNDOptions
+from .tflite import TransposeOptions
+from .tflite import ReducerOptions
+from .tflite import SubOptions
+from .tflite import DivOptions
+from .tflite import SqueezeOptions
+from .tflite import SequenceRNNOptions
+from .tflite import StridedSliceOptions
+from .tflite import ExpOptions
+from .tflite import TopKV2Options
+from .tflite import SplitOptions
+from .tflite import LogSoftmaxOptions
+from .tflite import CastOptions
+from .tflite import DequantizeOptions
+from .tflite import MaximumMinimumOptions
+from .tflite import ArgMaxOptions
+from .tflite import LessOptions
+from .tflite import NegOptions
+from .tflite import PadV2Options
+from .tflite import GreaterOptions
+from .tflite import GreaterEqualOptions
+from .tflite import LessEqualOptions
+from .tflite import SelectOptions
+from .tflite import SliceOptions
+from .tflite import TransposeConvOptions
+from .tflite import SparseToDenseOptions
+from .tflite import TileOptions
+from .tflite import ExpandDimsOptions
+from .tflite import EqualOptions
+from .tflite import NotEqualOptions
+from .tflite import ShapeOptions
+from .tflite import PowOptions
+from .tflite import ArgMinOptions
+from .tflite import FakeQuantOptions
+from .tflite import PackOptions
+from .tflite import LogicalOrOptions
+from .tflite import OneHotOptions
+from .tflite import LogicalAndOptions
+from .tflite import LogicalNotOptions
+from .tflite import UnpackOptions
+from .tflite import FloorDivOptions
+from .tflite import SquareOptions
+from .tflite import ZerosLikeOptions
+from .tflite import FillOptions
+from .tflite import BidirectionalSequenceLSTMOptions
+from .tflite import BidirectionalSequenceRNNOptions
+from .tflite import UnidirectionalSequenceLSTMOptions
+from .tflite import FloorModOptions
+from .tflite import RangeOptions
+from .tflite import ResizeNearestNeighborOptions
+from .tflite import LeakyReluOptions
+from .tflite import SquaredDifferenceOptions
+from .tflite import MirrorPadOptions
+from .tflite import AbsOptions
+from .tflite import SplitVOptions
+from .tflite import UniqueOptions
+from .tflite import ReverseV2Options
+from .tflite import AddNOptions
+from .tflite import GatherNdOptions
+from .tflite import CosOptions
+from .tflite import WhereOptions
+from .tflite import RankOptions
+from .tflite import ReverseSequenceOptions
+from .tflite import MatrixDiagOptions
+from .tflite import QuantizeOptions
+from .tflite import MatrixSetDiagOptions
+from .tflite import DensifyOptions
+from .tflite import DepthToSpaceOptions
+from .tflite import IfOptions
+from .tflite import NonMaxSuppressionV4Options
+from .tflite import NonMaxSuppressionV5Options
+from .tflite import ScatterNdOptions
+from .tflite import SegmentSumOptions
+from .tflite import SelectV2Options
+from .tflite import WhileOptions
+
+
+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.STRING: DataType.string,
+ TensorType.BOOL: DataType.bool,
+ # no TensorType.COMPLEX64 for now
+}
+
+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.BOOL: np.bool,
+}
+
+
+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.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,
+}
+
+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=[]):
+ 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.custom_opt_format = 0
+ self.members = []
+ 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, builtin_data, custom_data):
+ attrs = {}
+ if builtin_data:
+ tfattrs = self.cls()
+ tfattrs.Init(builtin_data.Bytes, builtin_data.Pos)
+ for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
+ fun = camelcase_mem
+ if is_vector:
+ fun += "AsNumpy"
+
+ a = deserialize(getattr(tfattrs, fun)())
+ attrs[underscore_mem] = a
+ 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:
+ def __init__(self):
+ self.builtin_opt_type = 0
+ self.custom_opt_format = 0
+
+ def deserialize(self, builtin_data, custom_data):
+ attrs = {}
+ attrs["custom_options"] = custom_data
+ return attrs
+
+ def serialize(self, builder, attrs):
+
+ custom_opts = attrs.get("custom_options", [])
+ custom_data = []
+
+ # Set NPU op custom options for the TensorFlow Lite custom operator
+ if custom_opts["type"] == "NpuOp":
+ custom_data = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
+
+ custom_data_bytes = struct.pack("<{0}B".format(len(custom_data)), *custom_data)
+ custom_offset = write_byte_vector(builder, custom_data_bytes)
+
+ return None, custom_offset
+
+
+padding_map = {
+ Padding.SAME: b"SAME",
+ Padding.VALID: b"VALID",
+}
+
+padding_inv_map = inverse_map(padding_map)
+
+
+activation_function_map = {
+ ActivationFunctionType.NONE: None,
+ ActivationFunctionType.RELU: "Relu",
+ ActivationFunctionType.RELU_N1_TO_1: "ReluN1To1",
+ ActivationFunctionType.RELU6: "Relu6",
+ ActivationFunctionType.TANH: "Tanh",
+ ActivationFunctionType.SIGN_BIT: "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"))
+
+unidir_seq_lstm_opts = OptionsSerializer(
+ "UnidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "time_major")
+)
+
+bidir_seq_lstm_opts = OptionsSerializer(
+ "BidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major")
+)
+
+rnn_opts = OptionsSerializer("RNNOptions", (fused_act,))
+
+seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act,))
+
+bidir_seq_rnn_opts = OptionsSerializer("BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs",))
+
+
+reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",))
+
+is_int_vec = True
+
+custom_prefix = "Custom_"
+
+builtin_operator_map = {
+ BuiltinOperator.ADD: ("AddAct", OptionsSerializer("AddOptions", (fused_act,))),
+ BuiltinOperator.AVERAGE_POOL_2D: ("AvgPoolAct", pool2d_opts),
+ BuiltinOperator.CONCATENATION: ("ConcatTFLite", OptionsSerializer("ConcatenationOptions", ("axis", fused_act))),
+ BuiltinOperator.CONV_2D: ("Conv2DBiasAct", conv2d_opts),
+ BuiltinOperator.DEPTHWISE_CONV_2D: ("DepthwiseConv2dBiasAct", depthwise_opts),
+ BuiltinOperator.DEPTH_TO_SPACE: ("DepthToSpace", OptionsSerializer("DepthToSpaceOptions", ("block_size",))),
+ BuiltinOperator.DEQUANTIZE: ("Dequantize", OptionsSerializer("DequantizeOptions")),
+ BuiltinOperator.EMBEDDING_LOOKUP: (None, None),
+ BuiltinOperator.FLOOR: ("Floor", None),
+ BuiltinOperator.FULLY_CONNECTED: (
+ "FullyConnectedAct",
+ OptionsSerializer("FullyConnectedOptions", (fused_act, "weights_format")),
+ ),
+ BuiltinOperator.HASHTABLE_LOOKUP: (None, None),
+ # BuiltinOperator.L2_NORMALIZATION : "L2NormAct",
+ BuiltinOperator.L2_POOL_2D: (None, pool2d_opts),
+ BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
+ "LRN",
+ OptionsSerializer("LocalResponseNormalizationOptions", ("radius", "bias", "alpha", "beta")),
+ ),
+ BuiltinOperator.LOGISTIC: ("Sigmoid", None),
+ # BuiltinOperator.LSH_PROJECTION : "",
+ BuiltinOperator.LSTM: ("LstmAct", lstm_opts),
+ BuiltinOperator.MAX_POOL_2D: ("MaxPool", pool2d_opts),
+ BuiltinOperator.MUL: ("MulAct", OptionsSerializer("MulOptions", (fused_act,))),
+ BuiltinOperator.RELU: ("Relu", None),
+ BuiltinOperator.RELU_N1_TO_1: (None, None),
+ BuiltinOperator.RELU6: ("Relu6", None),
+ BuiltinOperator.RESHAPE: ("Reshape", OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),))),
+ BuiltinOperator.RESIZE_BILINEAR: (
+ "ResizeBilinear",
+ OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
+ ),
+ BuiltinOperator.RNN: ("RnnAct", rnn_opts),
+ BuiltinOperator.SOFTMAX: ("Softmax", OptionsSerializer("SoftmaxOptions", ("beta",))),
+ BuiltinOperator.SPACE_TO_DEPTH: ("SpaceToDepth", OptionsSerializer("SpaceToDepthOptions", ("block_size",))),
+ BuiltinOperator.SVDF: ("SvdfAct", OptionsSerializer("SVDFOptions", ("rank", fused_act))),
+ BuiltinOperator.TANH: ("Tanh", None),
+ # BuiltinOperator.CONCAT_EMBEDDINGS : "",
+ # BuiltinOperator.SKIP_GRAM : "",
+ # BuiltinOperator.CALL : "",
+ BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (None, OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",))),
+ BuiltinOperator.PAD: ("Pad", OptionsSerializer("PadOptions")),
+ BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: ("UnidirectionalSequenceRnnAct", seq_rnn_opts),
+ BuiltinOperator.GATHER: ("GatherV2", OptionsSerializer("GatherOptions", ("axis",))),
+ BuiltinOperator.BATCH_TO_SPACE_ND: ("BatchToSpaceND", OptionsSerializer("BatchToSpaceNDOptions")),
+ BuiltinOperator.SPACE_TO_BATCH_ND: ("SpaceToBatchND", OptionsSerializer("SpaceToBatchNDOptions")),
+ BuiltinOperator.TRANSPOSE: ("Transpose", OptionsSerializer("TransposeOptions")),
+ BuiltinOperator.MEAN: ("Mean", None),
+ BuiltinOperator.SUB: ("SubAct", OptionsSerializer("SubOptions", (fused_act,))),
+ BuiltinOperator.DIV: ("DivAct", OptionsSerializer("DivOptions", (fused_act,))),
+ BuiltinOperator.SQUEEZE: ("Squeeze", OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))),
+ BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: ("UnidirectionalSequenceLstmAct", unidir_seq_lstm_opts),
+ BuiltinOperator.STRIDED_SLICE: (
+ "StridedSlice",
+ OptionsSerializer(
+ "StridedSliceOptions", ("begin_mask", "end_mask", "ellipsis_mask", "new_axis_mask", "shrink_axis_mask")
+ ),
+ ),
+ BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: ("BidirectionalSequenceRnnAct", bidir_seq_rnn_opts),
+ BuiltinOperator.EXP: ("Exp", OptionsSerializer("ExpOptions")),
+ BuiltinOperator.TOPK_V2: ("TopKV2", OptionsSerializer("TopKV2Options")),
+ BuiltinOperator.SPLIT: ("Split", OptionsSerializer("SplitOptions", ("num_splits",))),
+ BuiltinOperator.LOG_SOFTMAX: ("LogSoftmax", OptionsSerializer("LogSoftmaxOptions")),
+ # BuiltinOperator.DELEGATE : "",
+ BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: ("BidirectionalSequenceLstmAct", bidir_seq_lstm_opts),
+ BuiltinOperator.CAST: (
+ "Cast",
+ OptionsSerializer(
+ "CastOptions",
+ (
+ ("in_data_type", datatype_deserialize, datatype_serialize),
+ ("out_data_type", datatype_deserialize, datatype_serialize),
+ ),
+ ),
+ ),
+ # BuiltinOperator.PRELU : "",
+ BuiltinOperator.MAXIMUM: ("Maximum", OptionsSerializer("MaximumMinimumOptions")),
+ BuiltinOperator.ARG_MAX: (
+ "ArgMax",
+ OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
+ ),
+ BuiltinOperator.MINIMUM: ("Minimum", OptionsSerializer("MaximumMinimumOptions")),
+ BuiltinOperator.LESS: ("Less", None),
+ BuiltinOperator.NEG: ("Neg", None),
+ BuiltinOperator.PADV2: ("PadV2", None),
+ BuiltinOperator.GREATER: ("Greater", None),
+ BuiltinOperator.GREATER_EQUAL: ("GreaterEqual", None),
+ BuiltinOperator.LESS_EQUAL: ("LessEqual", None),
+ BuiltinOperator.SELECT: ("Select", None),
+ BuiltinOperator.SLICE: ("Slice", None),
+ BuiltinOperator.SIN: ("Sin", None),
+ BuiltinOperator.TRANSPOSE_CONV: (
+ "Conv2DBackpropInput",
+ OptionsSerializer("TransposeConvOptions", (padding, "stride_w", "stride_h")),
+ ),
+ BuiltinOperator.SPARSE_TO_DENSE: (
+ "SparseToDense",
+ OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
+ ),
+ BuiltinOperator.TILE: ("Tile", OptionsSerializer("TileOptions")),
+ BuiltinOperator.EXPAND_DIMS: ("ExpandDims", None),
+ BuiltinOperator.EQUAL: ("Equal", None),
+ BuiltinOperator.NOT_EQUAL: ("NotEqual", None),
+ BuiltinOperator.LOG: ("Log", None),
+ BuiltinOperator.SUM: ("Sum", None),
+ BuiltinOperator.SQRT: ("Sqrt", None),
+ BuiltinOperator.RSQRT: ("Rsqrt", None),
+ BuiltinOperator.SHAPE: (
+ "Shape",
+ OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
+ ),
+ BuiltinOperator.POW: "Pow",
+ BuiltinOperator.ARG_MIN: (
+ "ArgMin",
+ OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
+ ),
+ BuiltinOperator.FAKE_QUANT: (
+ "FakeQuantWithMinMaxArgs",
+ OptionsSerializer("FakeQuantOptions", ("min", "max", "num_bits", "narrow_range")),
+ ),
+ BuiltinOperator.REDUCE_PROD: ("Prod", reducer_opts),
+ BuiltinOperator.REDUCE_MAX: ("Max", reducer_opts),
+ BuiltinOperator.PACK: ("Pack", OptionsSerializer("PackOptions", ("values_count", "axis"))),
+ BuiltinOperator.LOGICAL_OR: ("LogicalOr", None),
+ BuiltinOperator.ONE_HOT: ("OneHot", OptionsSerializer("OneHotOptions", ("axis",))),
+ BuiltinOperator.LOGICAL_AND: ("LogicalAnd", None),
+ BuiltinOperator.LOGICAL_NOT: ("LogicalNot", None),
+ BuiltinOperator.UNPACK: ("Unpack", OptionsSerializer("UnpackOptions", ("num", "axis"))),
+ BuiltinOperator.REDUCE_MIN: ("Min", reducer_opts),
+ BuiltinOperator.FLOOR_DIV: ("FloorDiv", None),
+ BuiltinOperator.REDUCE_ANY: ("Any", reducer_opts),
+ BuiltinOperator.SQUARE: ("Square", None),
+ BuiltinOperator.ZEROS_LIKE: ("ZerosLike", None),
+ BuiltinOperator.FILL: ("Fill", None),
+ BuiltinOperator.FLOOR_MOD: ("FloorMod", None),
+ BuiltinOperator.RANGE: ("Range", None),
+ BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
+ "ResizeNearestNeighbor",
+ OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners",)),
+ ),
+ BuiltinOperator.LEAKY_RELU: ("LeakyRelu", OptionsSerializer("LeakyReluOptions", ("alpha",))),
+ BuiltinOperator.SQUARED_DIFFERENCE: ("SquaredDifference", None),
+ BuiltinOperator.MIRROR_PAD: ("MirrorPad", OptionsSerializer("MirrorPadOptions", ("mode",))),
+ BuiltinOperator.ABS: ("Abs", None),
+ BuiltinOperator.SPLIT_V: ("SplitV", OptionsSerializer("SplitVOptions", ("num_splits",))),
+ BuiltinOperator.UNIQUE: (
+ "Unique",
+ OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
+ ),
+ BuiltinOperator.CEIL: ("Ceil", None),
+ BuiltinOperator.REVERSE_V2: ("ReverseV2", None),
+ BuiltinOperator.ADD_N: ("AddN", None),
+ BuiltinOperator.GATHER_ND: ("GatherNd", None),
+ BuiltinOperator.COS: ("Cos", None),
+ BuiltinOperator.WHERE: ("Where", None),
+ BuiltinOperator.RANK: ("Rank", None),
+ BuiltinOperator.ELU: ("Elu", None),
+ BuiltinOperator.REVERSE_SEQUENCE: (
+ "ReverseSequence",
+ OptionsSerializer("ReverseSequenceOptions", ("seq_dim", "batch_dim")),
+ ),
+ BuiltinOperator.MATRIX_DIAG: ("MatrixDiag", None),
+ BuiltinOperator.QUANTIZE: ("Quantize", None),
+ BuiltinOperator.MATRIX_SET_DIAG: ("MatrixSetDiag", None),
+ BuiltinOperator.IF: ("If", OptionsSerializer("IfOptions", ("then_subgraph_index", "else_subgraph_index"))),
+ BuiltinOperator.WHILE: ("While", OptionsSerializer("WhileOptions", ("cond_subgraph_index", "body_subgraph_index"))),
+ BuiltinOperator.NON_MAX_SUPPRESSION_V4: ("NonMaxSuppressionV4", OptionsSerializer("NonMaxSuppressionV4Options")),
+ BuiltinOperator.NON_MAX_SUPPRESSION_V5: ("NonMaxSuppressionV5", OptionsSerializer("NonMaxSuppressionV5Options")),
+ BuiltinOperator.SCATTER_ND: ("ScatterNd", OptionsSerializer("ScatterNdOptions")),
+ BuiltinOperator.SELECT_V2: ("SelectV2", OptionsSerializer("SelectV2Options")),
+ BuiltinOperator.DENSIFY: ("Densify", OptionsSerializer("DensifyOptions")),
+ BuiltinOperator.SEGMENT_SUM: ("SegmentSum", OptionsSerializer("SegmentSumOptions")),
+ BuiltinOperator.CUSTOM: (custom_prefix, CustomOptionsSerializer()),
+}
+
+builtin_operator_inv_map = {v[0]: (k, v[1]) for k, v in builtin_operator_map.items()}
+
+builtin_operator_inv_map["NpuOp"] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer())