blob: b526ec58453b3ceba76c48f55564476cc5a8abe5 [file] [log] [blame]
erik.andersson@arm.com460c6892021-02-24 14:38:09 +01001# Copyright (C) 2020-2021 Arm Limited or its affiliates. All rights reserved.
Tim Hall79d07d22020-04-27 18:20:16 +01002#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the License); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an AS IS BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Tim Hall79d07d22020-04-27 18:20:16 +010016# Description:
17# TensorFlow Lite mapping functions used by both reader and writer.
18# Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code
19# generator, to Vela's internal format.
Tim Hall79d07d22020-04-27 18:20:16 +010020import struct
21
Diego Russoea6111a2020-04-14 18:41:58 +010022import numpy as np
23
Tim Hall79d07d22020-04-27 18:20:16 +010024from .data_type import DataType
Louis Verhaardaee5d752020-09-30 09:01:52 +020025from .operation import CustomType
26from .operation import Op
Michael McGeagh16895482020-12-14 15:51:20 +000027from .operation import Padding as opPad
Diego Russoe8a10452020-04-21 17:39:10 +010028from .tflite import AbsOptions
29from .tflite import AddNOptions
Tim Hall79d07d22020-04-27 18:20:16 +010030from .tflite import AddOptions
Tim Hall79d07d22020-04-27 18:20:16 +010031from .tflite import ArgMaxOptions
Tim Hall79d07d22020-04-27 18:20:16 +010032from .tflite import ArgMinOptions
Jacob Bohlin8daf6b72020-09-15 16:28:35 +020033from .tflite import BatchMatMulOptions
Diego Russoe8a10452020-04-21 17:39:10 +010034from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010035from .tflite import BidirectionalSequenceLSTMOptions
36from .tflite import BidirectionalSequenceRNNOptions
Diego Russoe8a10452020-04-21 17:39:10 +010037from .tflite import CallOptions
38from .tflite import CastOptions
39from .tflite import ConcatEmbeddingsOptions
40from .tflite import ConcatenationOptions
41from .tflite import Conv2DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010042from .tflite import CosOptions
Tim Hall42abec12021-02-04 21:31:57 +000043from .tflite import CumsumOptions
Tim Hall79d07d22020-04-27 18:20:16 +010044from .tflite import DensifyOptions
45from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010046from .tflite import DepthwiseConv2DOptions
47from .tflite import DequantizeOptions
48from .tflite import DivOptions
49from .tflite import EmbeddingLookupSparseOptions
50from .tflite import EqualOptions
51from .tflite import ExpandDimsOptions
52from .tflite import ExpOptions
53from .tflite import FakeQuantOptions
54from .tflite import FillOptions
55from .tflite import FloorDivOptions
56from .tflite import FloorModOptions
57from .tflite import FullyConnectedOptions
58from .tflite import GatherNdOptions
59from .tflite import GatherOptions
60from .tflite import GreaterEqualOptions
61from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020062from .tflite import HardSwishOptions
Tim Hall79d07d22020-04-27 18:20:16 +010063from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010064from .tflite import L2NormOptions
65from .tflite import LeakyReluOptions
66from .tflite import LessEqualOptions
67from .tflite import LessOptions
68from .tflite import LocalResponseNormalizationOptions
69from .tflite import LogicalAndOptions
70from .tflite import LogicalNotOptions
71from .tflite import LogicalOrOptions
72from .tflite import LogSoftmaxOptions
73from .tflite import LSHProjectionOptions
74from .tflite import LSTMOptions
75from .tflite import MatrixDiagOptions
76from .tflite import MatrixSetDiagOptions
77from .tflite import MaximumMinimumOptions
78from .tflite import MirrorPadOptions
79from .tflite import MulOptions
80from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010081from .tflite import NonMaxSuppressionV4Options
82from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010083from .tflite import NotEqualOptions
84from .tflite import OneHotOptions
85from .tflite import PackOptions
86from .tflite import PadOptions
87from .tflite import PadV2Options
88from .tflite import Pool2DOptions
89from .tflite import PowOptions
90from .tflite import QuantizeOptions
91from .tflite import RangeOptions
92from .tflite import RankOptions
93from .tflite import ReducerOptions
94from .tflite import ReshapeOptions
95from .tflite import ResizeBilinearOptions
96from .tflite import ResizeNearestNeighborOptions
97from .tflite import ReverseSequenceOptions
98from .tflite import ReverseV2Options
99from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100100from .tflite import ScatterNdOptions
101from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100102from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100103from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +0100104from .tflite import SequenceRNNOptions
105from .tflite import ShapeOptions
106from .tflite import SkipGramOptions
107from .tflite import SliceOptions
108from .tflite import SoftmaxOptions
109from .tflite import SpaceToBatchNDOptions
110from .tflite import SpaceToDepthOptions
111from .tflite import SparseToDenseOptions
112from .tflite import SplitOptions
113from .tflite import SplitVOptions
114from .tflite import SquaredDifferenceOptions
115from .tflite import SquareOptions
116from .tflite import SqueezeOptions
117from .tflite import StridedSliceOptions
118from .tflite import SubOptions
119from .tflite import SVDFOptions
120from .tflite import TileOptions
121from .tflite import TopKV2Options
122from .tflite import TransposeConvOptions
123from .tflite import TransposeOptions
124from .tflite import UnidirectionalSequenceLSTMOptions
125from .tflite import UniqueOptions
126from .tflite import UnpackOptions
127from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100128from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100129from .tflite import ZerosLikeOptions
130from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100131from .tflite.BuiltinOperator import BuiltinOperator
132from .tflite.BuiltinOptions import BuiltinOptions
133from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100134from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100135
136
137def inverse_map(map):
138 return {v: k for k, v in map.items()}
139
140
141datatype_map = {
142 TensorType.UINT8: DataType.uint8,
143 TensorType.INT8: DataType.int8,
144 TensorType.INT16: DataType.int16,
145 TensorType.INT32: DataType.int32,
146 TensorType.INT64: DataType.int64,
147 TensorType.FLOAT16: DataType.float16,
148 TensorType.FLOAT32: DataType.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200149 TensorType.FLOAT64: DataType.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100150 TensorType.STRING: DataType.string,
151 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200152 TensorType.COMPLEX64: DataType.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200153 TensorType.COMPLEX128: DataType.complex128,
Tim Hall79d07d22020-04-27 18:20:16 +0100154}
155
156datatype_inv_map = inverse_map(datatype_map)
157datatype_inv_map[DataType.quint8] = TensorType.UINT8
158
159datatype_inv_map[DataType.qint8] = TensorType.INT8
160datatype_inv_map[DataType.qint16] = TensorType.INT16
161datatype_inv_map[DataType.qint32] = TensorType.INT32
162
163
164datatype_map_numpy = {
165 TensorType.UINT8: np.uint8,
166 TensorType.INT8: np.int8,
167 TensorType.INT16: np.int16,
168 TensorType.INT32: np.int32,
169 TensorType.INT64: np.int64,
170 TensorType.FLOAT16: np.float16,
171 TensorType.FLOAT32: np.float32,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200172 TensorType.FLOAT64: np.float64,
Tim Hall79d07d22020-04-27 18:20:16 +0100173 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200174 TensorType.COMPLEX64: np.complex64,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200175 TensorType.COMPLEX128: np.complex128,
Louis Verhaardf4e12be2020-12-18 14:23:06 +0100176 TensorType.STRING: np.uint8,
Tim Hall79d07d22020-04-27 18:20:16 +0100177}
178
179
180builtin_options_map = {
181 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
182 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
183 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
184 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
185 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
186 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
187 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
188 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
189 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
190 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
191 BuiltinOptions.AddOptions: AddOptions.AddOptions,
192 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
193 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
194 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
195 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
196 BuiltinOptions.CallOptions: CallOptions.CallOptions,
197 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
198 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
199 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
200 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
201 BuiltinOptions.MulOptions: MulOptions.MulOptions,
202 BuiltinOptions.PadOptions: PadOptions.PadOptions,
203 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
204 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
205 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
206 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
207 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
208 BuiltinOptions.SubOptions: SubOptions.SubOptions,
209 BuiltinOptions.DivOptions: DivOptions.DivOptions,
210 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
211 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
212 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
213 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
214 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
215 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
216 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
217 BuiltinOptions.CastOptions: CastOptions.CastOptions,
218 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
219 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
220 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
221 BuiltinOptions.LessOptions: LessOptions.LessOptions,
222 BuiltinOptions.NegOptions: NegOptions.NegOptions,
223 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
224 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
225 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
226 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
227 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
228 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
229 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
230 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
231 BuiltinOptions.TileOptions: TileOptions.TileOptions,
232 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
233 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
234 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
235 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
236 BuiltinOptions.PowOptions: PowOptions.PowOptions,
237 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
238 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
239 BuiltinOptions.PackOptions: PackOptions.PackOptions,
240 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
241 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
242 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
243 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
244 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
245 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
246 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
247 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
248 BuiltinOptions.FillOptions: FillOptions.FillOptions,
249 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
250 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
251 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
252 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
253 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
254 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
255 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
256 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
257 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
258 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
259 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
260 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
261 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
262 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
263 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
264 BuiltinOptions.CosOptions: CosOptions.CosOptions,
265 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
266 BuiltinOptions.RankOptions: RankOptions.RankOptions,
267 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
268 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
269 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
270 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
271 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
272 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200273 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100274 BuiltinOptions.IfOptions: IfOptions.IfOptions,
275 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
276 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
277 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
278 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
279 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
280 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200281 BuiltinOptions.BatchMatMulOptions: BatchMatMulOptions.BatchMatMulOptions,
Tim Hall42abec12021-02-04 21:31:57 +0000282 BuiltinOptions.CumsumOptions: CumsumOptions.CumsumOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100283}
284
285builtin_options_inv_map = inverse_map(builtin_options_map)
286
287
288def underscore_to_camel_case(s):
289 return "".join(x.title() for x in s.split("_"))
290
291
292def padding_deserialize(x):
293 return padding_map[x]
294
295
296def padding_serialize(builder, x):
297 return padding_inv_map[x]
298
299
300def activation_deserialize(x):
301 return activation_function_map[x]
302
303
304def activation_serialize(builder, x):
305 return activation_function_inv_map[x]
306
307
308def datatype_deserialize(x):
309 return datatype_map[x]
310
311
312def datatype_serialize(builder, x):
313 return datatype_inv_map[x]
314
315
316def identity(x):
317 return x
318
319
320def identity_serialize(builder, x):
321 return x
322
323
324def write_byte_vector(builder, v):
325 builder.StartVector(1, len(v), 1)
326 for e in v[::-1]:
327 builder.PrependByte(e)
328 return builder.EndVector(len(v))
329
330
331def write_int_vector(builder, v):
332 builder.StartVector(4, len(v), 4)
333 for e in v[::-1]:
334 builder.PrependInt32(e)
335 return builder.EndVector(len(v))
336
337
338class OptionsSerializer:
Michael McGeagh6f725262020-12-03 15:21:36 +0000339 def __init__(self, name, members=None):
Tim Hall79d07d22020-04-27 18:20:16 +0100340 self.name = name
341 self.module = globals()[self.name]
342 self.cls = getattr(self.module, self.name)
343 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100344 self.members = []
Michael McGeagh6f725262020-12-03 15:21:36 +0000345 if members is not None:
346 for mem in members:
347 deserialize = identity
348 serialize = identity_serialize
349 is_vector = False
350 if isinstance(mem, tuple):
351 if len(mem) == 3:
352 mem, deserialize, serialize = mem
353 elif len(mem) == 2:
354 mem, is_vector = mem
355 deserialize = tuple
356 serialize = write_int_vector
357 else:
358 assert 0
359 underscore_mem = mem
360 camelcase_mem = underscore_to_camel_case(mem)
361 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
Tim Hall79d07d22020-04-27 18:20:16 +0100362
Tim Hallc8310b12020-06-17 14:53:11 +0100363 def deserialize(self, op_data):
364 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100365 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100366 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100367 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100368 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100369 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
370 fun = camelcase_mem
371 if is_vector:
372 fun += "AsNumpy"
373
Fredrik Svedberg4bb989b2020-11-16 15:32:25 +0100374 attr = getattr(tfattrs, fun)()
375 try:
376 attrs[underscore_mem] = deserialize(attr)
377 except TypeError:
378 print("Warning: {0} could not read attribute '{1}'.".format(self.name, underscore_mem))
379
Tim Hall79d07d22020-04-27 18:20:16 +0100380 return attrs
381
382 def serialize(self, builder, attrs):
383 ser_attrs = []
384 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
385 a = serialize(builder, attrs[underscore_mem])
386 ser_attrs.append((camelcase_mem, a))
387
388 getattr(self.module, self.name + "Start")(builder)
389
390 for camelcase_mem, a in ser_attrs:
391 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
392
393 return getattr(self.module, self.name + "End")(builder), None
394
395
396class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100397 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
398 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
399
Tim Hall79d07d22020-04-27 18:20:16 +0100400 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100401 self.custom_opt_format = 0
402
Tim Hallc8310b12020-06-17 14:53:11 +0100403 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100404 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100405 custom_options = op_data.CustomOptionsAsNumpy()
406 attrs["custom_options"] = custom_options
407 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
408
409 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200410 attrs["custom_type"] = CustomType.ExistingNpuOp
Tim Hallc8310b12020-06-17 14:53:11 +0100411
Tim Hall79d07d22020-04-27 18:20:16 +0100412 return attrs
413
414 def serialize(self, builder, attrs):
Louis Verhaardaee5d752020-09-30 09:01:52 +0200415 custom_type = attrs.get("custom_type", CustomType.ThirdPartyOp)
Tim Hallc8310b12020-06-17 14:53:11 +0100416 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100417
418 # Set NPU op custom options for the TensorFlow Lite custom operator
Louis Verhaardaee5d752020-09-30 09:01:52 +0200419 if custom_type == CustomType.NpuOp:
Tim Hallc8310b12020-06-17 14:53:11 +0100420 custom_options = self.CUSTOM_OPTIONS_NPU_OP
421 else:
422 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100423
Tim Hallc8310b12020-06-17 14:53:11 +0100424 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
425 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100426
427 return None, custom_offset
428
429
430padding_map = {
Michael McGeagh16895482020-12-14 15:51:20 +0000431 Padding.SAME: opPad.SAME,
432 Padding.VALID: opPad.VALID,
Tim Hall79d07d22020-04-27 18:20:16 +0100433}
434
435padding_inv_map = inverse_map(padding_map)
436
437
438activation_function_map = {
439 ActivationFunctionType.NONE: None,
Louis Verhaardaee5d752020-09-30 09:01:52 +0200440 ActivationFunctionType.RELU: Op.Relu,
441 ActivationFunctionType.RELU_N1_TO_1: Op.ReluN1To1,
442 ActivationFunctionType.RELU6: Op.Relu6,
443 ActivationFunctionType.TANH: Op.Tanh,
444 ActivationFunctionType.SIGN_BIT: Op.SignBit,
Tim Hall79d07d22020-04-27 18:20:16 +0100445}
446
447activation_function_inv_map = inverse_map(activation_function_map)
448
449fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
450padding = ("padding", padding_deserialize, padding_serialize)
451
452pool2d_opts = OptionsSerializer(
453 "Pool2DOptions", (padding, "stride_w", "stride_h", "filter_width", "filter_height", fused_act,)
454)
455
456depthwise_opts = OptionsSerializer(
457 "DepthwiseConv2DOptions",
458 (padding, "stride_w", "stride_h", "depth_multiplier", fused_act, "dilation_w_factor", "dilation_h_factor",),
459)
460
461conv2d_opts = OptionsSerializer(
462 "Conv2DOptions", (padding, "stride_w", "stride_h", fused_act, "dilation_w_factor", "dilation_h_factor",)
463)
464
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200465lstm_opts = OptionsSerializer(
466 "LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type", "asymmetric_quantize_inputs")
467)
Tim Hall79d07d22020-04-27 18:20:16 +0100468
469unidir_seq_lstm_opts = OptionsSerializer(
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200470 "UnidirectionalSequenceLSTMOptions",
471 (fused_act, "cell_clip", "proj_clip", "time_major", "asymmetric_quantize_inputs",),
Tim Hall79d07d22020-04-27 18:20:16 +0100472)
473
474bidir_seq_lstm_opts = OptionsSerializer(
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200475 "BidirectionalSequenceLSTMOptions",
476 (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major", "asymmetric_quantize_inputs"),
Tim Hall79d07d22020-04-27 18:20:16 +0100477)
478
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200479rnn_opts = OptionsSerializer("RNNOptions", (fused_act, "asymmetric_quantize_inputs"))
Tim Hall79d07d22020-04-27 18:20:16 +0100480
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200481seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act, "asymmetric_quantize_inputs",))
Tim Hall79d07d22020-04-27 18:20:16 +0100482
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200483bidir_seq_rnn_opts = OptionsSerializer(
484 "BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs", "asymmetric_quantize_inputs")
485)
Tim Hall79d07d22020-04-27 18:20:16 +0100486
487
488reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",))
489
490is_int_vec = True
491
Tim Hall79d07d22020-04-27 18:20:16 +0100492builtin_operator_map = {
Louis Verhaardaee5d752020-09-30 09:01:52 +0200493 BuiltinOperator.ADD: (Op.Add, OptionsSerializer("AddOptions", (fused_act, "pot_scale_int16"))),
494 BuiltinOperator.AVERAGE_POOL_2D: (Op.AvgPool, pool2d_opts),
495 BuiltinOperator.CONCATENATION: (Op.ConcatTFLite, OptionsSerializer("ConcatenationOptions", ("axis", fused_act))),
496 BuiltinOperator.CONV_2D: (Op.Conv2DBias, conv2d_opts),
497 BuiltinOperator.DEPTHWISE_CONV_2D: (Op.DepthwiseConv2DBias, depthwise_opts),
498 BuiltinOperator.DEPTH_TO_SPACE: (Op.DepthToSpace, OptionsSerializer("DepthToSpaceOptions", ("block_size",))),
499 BuiltinOperator.DEQUANTIZE: (Op.Dequantize, OptionsSerializer("DequantizeOptions")),
500 BuiltinOperator.EMBEDDING_LOOKUP: (Op.EmbeddingLookup, None),
501 BuiltinOperator.FLOOR: (Op.Floor, None),
Tim Hall79d07d22020-04-27 18:20:16 +0100502 BuiltinOperator.FULLY_CONNECTED: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200503 Op.FullyConnected,
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100504 OptionsSerializer(
505 "FullyConnectedOptions", (fused_act, "weights_format", "asymmetric_quantize_inputs", "keep_num_dims")
506 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100507 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200508 BuiltinOperator.HASHTABLE_LOOKUP: (Op.HashtableLookup, None),
509 BuiltinOperator.L2_NORMALIZATION: (Op.L2Norm, OptionsSerializer("L2NormOptions", (fused_act,))),
510 BuiltinOperator.L2_POOL_2D: (Op.L2Pool2D, pool2d_opts),
Tim Hall79d07d22020-04-27 18:20:16 +0100511 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200512 Op.LRN,
Tim Hall79d07d22020-04-27 18:20:16 +0100513 OptionsSerializer("LocalResponseNormalizationOptions", ("radius", "bias", "alpha", "beta")),
514 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200515 BuiltinOperator.LOGISTIC: (Op.Sigmoid, None),
516 BuiltinOperator.LSH_PROJECTION: (Op.LSHProjection, OptionsSerializer("LSHProjectionOptions", ("type",))),
517 BuiltinOperator.LSTM: (Op.Lstm, lstm_opts),
518 BuiltinOperator.MAX_POOL_2D: (Op.MaxPool, pool2d_opts),
519 BuiltinOperator.MUL: (Op.Mul, OptionsSerializer("MulOptions", (fused_act,))),
520 BuiltinOperator.RELU: (Op.Relu, None),
521 BuiltinOperator.RELU_N1_TO_1: (Op.ReluN1To1, None),
522 BuiltinOperator.RELU6: (Op.Relu6, None),
523 BuiltinOperator.RESHAPE: (Op.Reshape, OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),))),
Tim Hall79d07d22020-04-27 18:20:16 +0100524 BuiltinOperator.RESIZE_BILINEAR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200525 Op.ResizeBilinear,
Tim Hall79d07d22020-04-27 18:20:16 +0100526 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
527 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200528 BuiltinOperator.RNN: (Op.Rnn, rnn_opts),
529 BuiltinOperator.SOFTMAX: (Op.Softmax, OptionsSerializer("SoftmaxOptions", ("beta",))),
530 BuiltinOperator.SPACE_TO_DEPTH: (Op.SpaceToDepth, OptionsSerializer("SpaceToDepthOptions", ("block_size",))),
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200531 BuiltinOperator.SVDF: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200532 Op.Svdf,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200533 OptionsSerializer("SVDFOptions", ("rank", fused_act, "asymmetric_quantize_inputs")),
534 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200535 BuiltinOperator.TANH: (Op.Tanh, None),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200536 BuiltinOperator.CONCAT_EMBEDDINGS: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200537 Op.ConcatEmbeddings,
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200538 OptionsSerializer(
539 "ConcatEmbeddingsOptions",
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200540 (
541 "num_channels",
542 "num_columns_per_channel",
543 "num_columns_per_channel_as_numpy",
544 "num_columns_per_channel_as_length",
545 "embedding_dim_per_channel",
546 "embedding_dim_per_channel_as_numpy",
547 "embedding_dim_per_channel_as_length",
548 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200549 ),
550 ),
551 BuiltinOperator.SKIP_GRAM: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200552 Op.SkipGram,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200553 OptionsSerializer("SkipGramOptions", ("ngram_size", "max_skip_size", "include_all_ngrams")),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200554 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200555 BuiltinOperator.CALL: (Op.Call, OptionsSerializer("CallOptions", ("subgraph",))),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200556 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200557 Op.EmbeddingLookupSparse,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200558 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",)),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200559 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200560 BuiltinOperator.PAD: (Op.Pad, OptionsSerializer("PadOptions")),
561 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: (Op.UnidirectionalSequenceRnn, seq_rnn_opts),
562 BuiltinOperator.GATHER: (Op.GatherV2, OptionsSerializer("GatherOptions", ("axis",))),
563 BuiltinOperator.BATCH_TO_SPACE_ND: (Op.BatchToSpaceND, OptionsSerializer("BatchToSpaceNDOptions")),
564 BuiltinOperator.SPACE_TO_BATCH_ND: (Op.SpaceToBatchND, OptionsSerializer("SpaceToBatchNDOptions")),
565 BuiltinOperator.TRANSPOSE: (Op.Transpose, OptionsSerializer("TransposeOptions")),
Dwight Lidman4f728c02020-12-17 15:14:45 +0100566 BuiltinOperator.MEAN: (Op.Mean, reducer_opts),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200567 BuiltinOperator.SUB: (Op.Sub, OptionsSerializer("SubOptions", (fused_act, "pot_scale_int16",))),
568 BuiltinOperator.DIV: (Op.Div, OptionsSerializer("DivOptions", (fused_act,))),
569 BuiltinOperator.SQUEEZE: (Op.Squeeze, OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))),
570 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: (Op.UnidirectionalSequenceLstm, unidir_seq_lstm_opts),
Tim Hall79d07d22020-04-27 18:20:16 +0100571 BuiltinOperator.STRIDED_SLICE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200572 Op.StridedSlice,
Tim Hall79d07d22020-04-27 18:20:16 +0100573 OptionsSerializer(
574 "StridedSliceOptions", ("begin_mask", "end_mask", "ellipsis_mask", "new_axis_mask", "shrink_axis_mask")
575 ),
576 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200577 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: (Op.BidirectionalSequenceRnn, bidir_seq_rnn_opts),
578 BuiltinOperator.EXP: (Op.Exp, OptionsSerializer("ExpOptions")),
579 BuiltinOperator.TOPK_V2: (Op.TopKV2, OptionsSerializer("TopKV2Options")),
580 BuiltinOperator.SPLIT: (Op.Split, OptionsSerializer("SplitOptions", ("num_splits",))),
581 BuiltinOperator.LOG_SOFTMAX: (Op.LogSoftmax, OptionsSerializer("LogSoftmaxOptions")),
582 BuiltinOperator.DELEGATE: (Op.Delegate, None),
583 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: (Op.BidirectionalSequenceLstm, bidir_seq_lstm_opts),
Tim Hall79d07d22020-04-27 18:20:16 +0100584 BuiltinOperator.CAST: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200585 Op.Cast,
Tim Hall79d07d22020-04-27 18:20:16 +0100586 OptionsSerializer(
587 "CastOptions",
588 (
589 ("in_data_type", datatype_deserialize, datatype_serialize),
590 ("out_data_type", datatype_deserialize, datatype_serialize),
591 ),
592 ),
593 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200594 BuiltinOperator.PRELU: (Op.Prelu, None),
595 BuiltinOperator.MAXIMUM: (Op.Maximum, OptionsSerializer("MaximumMinimumOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100596 BuiltinOperator.ARG_MAX: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200597 Op.ArgMax,
Tim Hall79d07d22020-04-27 18:20:16 +0100598 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
599 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200600 BuiltinOperator.MINIMUM: (Op.Minimum, OptionsSerializer("MaximumMinimumOptions")),
601 BuiltinOperator.LESS: (Op.Less, OptionsSerializer("LessOptions")),
602 BuiltinOperator.NEG: (Op.Neg, OptionsSerializer("NegOptions")),
603 BuiltinOperator.PADV2: (Op.PadV2, OptionsSerializer("PadV2Options")),
604 BuiltinOperator.GREATER: (Op.Greater, OptionsSerializer("GreaterOptions")),
605 BuiltinOperator.GREATER_EQUAL: (Op.GreaterEqual, OptionsSerializer("GreaterEqualOptions")),
606 BuiltinOperator.LESS_EQUAL: (Op.LessEqual, OptionsSerializer("LessEqualOptions")),
607 BuiltinOperator.SELECT: (Op.Select, OptionsSerializer("SelectOptions")),
608 BuiltinOperator.SLICE: (Op.Slice, OptionsSerializer("SliceOptions")),
609 BuiltinOperator.SIN: (Op.Sin, None),
Tim Hall79d07d22020-04-27 18:20:16 +0100610 BuiltinOperator.TRANSPOSE_CONV: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200611 Op.Conv2DBackpropInput,
Tim Hall79d07d22020-04-27 18:20:16 +0100612 OptionsSerializer("TransposeConvOptions", (padding, "stride_w", "stride_h")),
613 ),
614 BuiltinOperator.SPARSE_TO_DENSE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200615 Op.SparseToDense,
Tim Hall79d07d22020-04-27 18:20:16 +0100616 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
617 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200618 BuiltinOperator.TILE: (Op.Tile, OptionsSerializer("TileOptions")),
619 BuiltinOperator.EXPAND_DIMS: (Op.ExpandDims, OptionsSerializer("ExpandDimsOptions")),
620 BuiltinOperator.EQUAL: (Op.Equal, OptionsSerializer("EqualOptions")),
621 BuiltinOperator.NOT_EQUAL: (Op.NotEqual, OptionsSerializer("NotEqualOptions")),
622 BuiltinOperator.LOG: (Op.Log, None),
erik.andersson@arm.com0cbb1662021-02-22 15:47:07 +0100623 BuiltinOperator.SUM: (Op.Sum, reducer_opts),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200624 BuiltinOperator.SQRT: (Op.Sqrt, None),
625 BuiltinOperator.RSQRT: (Op.Rsqrt, None),
Tim Hall79d07d22020-04-27 18:20:16 +0100626 BuiltinOperator.SHAPE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200627 Op.Shape,
Tim Hall79d07d22020-04-27 18:20:16 +0100628 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
629 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200630 BuiltinOperator.POW: (Op.Pow, OptionsSerializer("PowOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100631 BuiltinOperator.ARG_MIN: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200632 Op.ArgMin,
Tim Hall79d07d22020-04-27 18:20:16 +0100633 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
634 ),
635 BuiltinOperator.FAKE_QUANT: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200636 Op.FakeQuantWithMinMaxArgs,
Tim Hall79d07d22020-04-27 18:20:16 +0100637 OptionsSerializer("FakeQuantOptions", ("min", "max", "num_bits", "narrow_range")),
638 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200639 BuiltinOperator.REDUCE_PROD: (Op.Prod, reducer_opts),
640 BuiltinOperator.REDUCE_MAX: (Op.Max, reducer_opts),
641 BuiltinOperator.PACK: (Op.Pack, OptionsSerializer("PackOptions", ("values_count", "axis"))),
642 BuiltinOperator.LOGICAL_OR: (Op.LogicalOr, OptionsSerializer("LogicalOrOptions")),
643 BuiltinOperator.ONE_HOT: (Op.OneHot, OptionsSerializer("OneHotOptions", ("axis",))),
644 BuiltinOperator.LOGICAL_AND: (Op.LogicalAnd, OptionsSerializer("LogicalAndOptions")),
645 BuiltinOperator.LOGICAL_NOT: (Op.LogicalNot, OptionsSerializer("LogicalNotOptions")),
646 BuiltinOperator.UNPACK: (Op.Unpack, OptionsSerializer("UnpackOptions", ("num", "axis"))),
647 BuiltinOperator.REDUCE_MIN: (Op.Min, reducer_opts),
648 BuiltinOperator.FLOOR_DIV: (Op.FloorDiv, OptionsSerializer("FloorDivOptions")),
649 BuiltinOperator.REDUCE_ANY: (Op.Any, reducer_opts),
650 BuiltinOperator.SQUARE: (Op.Square, OptionsSerializer("SquareOptions")),
651 BuiltinOperator.ZEROS_LIKE: (Op.ZerosLike, OptionsSerializer("ZerosLikeOptions")),
652 BuiltinOperator.FILL: (Op.Fill, OptionsSerializer("FillOptions")),
653 BuiltinOperator.FLOOR_MOD: (Op.FloorMod, OptionsSerializer("FloorModOptions")),
654 BuiltinOperator.RANGE: (Op.Range, OptionsSerializer("RangeOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100655 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200656 Op.ResizeNearestNeighbor,
Jacob Bohlin8daf6b72020-09-15 16:28:35 +0200657 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners", "half_pixel_centers")),
Tim Hall79d07d22020-04-27 18:20:16 +0100658 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200659 BuiltinOperator.LEAKY_RELU: (Op.LeakyRelu, OptionsSerializer("LeakyReluOptions", ("alpha",))),
660 BuiltinOperator.SQUARED_DIFFERENCE: (Op.SquaredDifference, OptionsSerializer("SquaredDifferenceOptions")),
661 BuiltinOperator.MIRROR_PAD: (Op.MirrorPad, OptionsSerializer("MirrorPadOptions", ("mode",))),
662 BuiltinOperator.ABS: (Op.Abs, OptionsSerializer("AbsOptions")),
663 BuiltinOperator.SPLIT_V: (Op.SplitV, OptionsSerializer("SplitVOptions", ("num_splits",))),
Tim Hall79d07d22020-04-27 18:20:16 +0100664 BuiltinOperator.UNIQUE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200665 Op.Unique,
Tim Hall79d07d22020-04-27 18:20:16 +0100666 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
667 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200668 BuiltinOperator.CEIL: (Op.Ceil, None),
669 BuiltinOperator.REVERSE_V2: (Op.ReverseV2, OptionsSerializer("ReverseV2Options")),
670 BuiltinOperator.ADD_N: (Op.AddN, OptionsSerializer("AddNOptions")),
671 BuiltinOperator.GATHER_ND: (Op.GatherNd, OptionsSerializer("GatherNdOptions")),
672 BuiltinOperator.COS: (Op.Cos, OptionsSerializer("CosOptions")),
673 BuiltinOperator.WHERE: (Op.Where, OptionsSerializer("WhereOptions")),
674 BuiltinOperator.RANK: (Op.Rank, OptionsSerializer("RankOptions")),
675 BuiltinOperator.ELU: (Op.Elu, None),
Tim Hall79d07d22020-04-27 18:20:16 +0100676 BuiltinOperator.REVERSE_SEQUENCE: (
Louis Verhaardaee5d752020-09-30 09:01:52 +0200677 Op.ReverseSequence,
Tim Hall79d07d22020-04-27 18:20:16 +0100678 OptionsSerializer("ReverseSequenceOptions", ("seq_dim", "batch_dim")),
679 ),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200680 BuiltinOperator.MATRIX_DIAG: (Op.MatrixDiag, OptionsSerializer("MatrixDiagOptions")),
681 BuiltinOperator.QUANTIZE: (Op.Quantize, OptionsSerializer("QuantizeOptions")),
682 BuiltinOperator.MATRIX_SET_DIAG: (Op.MatrixSetDiag, OptionsSerializer("MatrixSetDiagOptions")),
683 BuiltinOperator.ROUND: (Op.Round, None),
684 BuiltinOperator.HARD_SWISH: (Op.HardSwish, OptionsSerializer("HardSwishOptions")),
685 BuiltinOperator.IF: (Op.If, OptionsSerializer("IfOptions", ("then_subgraph_index", "else_subgraph_index"))),
686 BuiltinOperator.WHILE: (
687 Op.While,
688 OptionsSerializer("WhileOptions", ("cond_subgraph_index", "body_subgraph_index")),
689 ),
690 BuiltinOperator.NON_MAX_SUPPRESSION_V4: (Op.NonMaxSuppressionV4, OptionsSerializer("NonMaxSuppressionV4Options")),
691 BuiltinOperator.NON_MAX_SUPPRESSION_V5: (Op.NonMaxSuppressionV5, OptionsSerializer("NonMaxSuppressionV5Options")),
692 BuiltinOperator.SCATTER_ND: (Op.ScatterNd, OptionsSerializer("ScatterNdOptions")),
693 BuiltinOperator.SELECT_V2: (Op.SelectV2, OptionsSerializer("SelectV2Options")),
694 BuiltinOperator.DENSIFY: (Op.Densify, OptionsSerializer("DensifyOptions")),
695 BuiltinOperator.SEGMENT_SUM: (Op.SegmentSum, OptionsSerializer("SegmentSumOptions")),
696 BuiltinOperator.BATCH_MATMUL: (Op.BatchMatMul, OptionsSerializer("BatchMatMulOptions", ("adj_x", "adj_y"))),
Tim Hall42abec12021-02-04 21:31:57 +0000697 BuiltinOperator.CUMSUM: (Op.Cumsum, OptionsSerializer("CumsumOptions", ("exclusive", "reverse"))),
Louis Verhaardaee5d752020-09-30 09:01:52 +0200698 BuiltinOperator.CUSTOM: (Op.Custom, CustomOptionsSerializer()),
Tim Hall79d07d22020-04-27 18:20:16 +0100699}
700
701builtin_operator_inv_map = {v[0]: (k, v[1]) for k, v in builtin_operator_map.items()}
702
Louis Verhaardaee5d752020-09-30 09:01:52 +0200703builtin_operator_inv_map[Op.CustomNpuOp] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer())
Michael McGeagh219ec072020-11-09 11:11:26 +0000704
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000705BUILTIN_OPERATOR_UNKNOWN = "UNKNOWN"
706
707
708def builtin_type_name(builtin):
709 return next(k for k, v in vars(BuiltinOperator).items() if v == builtin)
710
Michael McGeagh219ec072020-11-09 11:11:26 +0000711
712def optype_to_builtintype(op_type):
713 if op_type in builtin_operator_inv_map:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000714 return builtin_type_name(builtin_operator_inv_map[op_type][0])
Michael McGeagh219ec072020-11-09 11:11:26 +0000715 else:
Michael McGeagh837dc1b2020-11-10 12:38:25 +0000716 return BUILTIN_OPERATOR_UNKNOWN