1/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14==============================================================================*/
15
16#include "tensorflow/lite/kernels/register.h"
17
18#include "tensorflow/lite/c/common.h"
19#include "tensorflow/lite/kernels/builtin_op_kernels.h"
20#include "tensorflow/lite/schema/schema_generated.h"
21#include "tensorflow/lite/tflite_with_xnnpack_optional.h"
22
23namespace tflite {
24namespace ops {
25namespace custom {
26
27TfLiteRegistration* Register_NUMERIC_VERIFY();
28TfLiteRegistration* Register_AUDIO_SPECTROGRAM();
29TfLiteRegistration* Register_MFCC();
30TfLiteRegistration* Register_DETECTION_POSTPROCESS();
31
32} // namespace custom
33
34namespace builtin {
35
36BuiltinOpResolver::BuiltinOpResolver() {
37 AddBuiltin(BuiltinOperator_ABS, Register_ABS(), /* min_version = */ 1,
38 /* max_version = */ 4);
39 AddBuiltin(BuiltinOperator_HARD_SWISH, Register_HARD_SWISH());
40 AddBuiltin(BuiltinOperator_RELU, Register_RELU(), /* min_version = */ 1,
41 /* max_version = */ 3);
42 AddBuiltin(BuiltinOperator_RELU_N1_TO_1, Register_RELU_N1_TO_1());
43 AddBuiltin(BuiltinOperator_RELU_0_TO_1, Register_RELU_0_TO_1());
44 AddBuiltin(BuiltinOperator_RELU6, Register_RELU6(), /* min_version = */ 1,
45 /* max_version = */ 3);
46 AddBuiltin(BuiltinOperator_TANH, Register_TANH(), /* min_version = */ 1,
47 /* max_version = */ 3);
48 AddBuiltin(BuiltinOperator_LOGISTIC, Register_LOGISTIC(),
49 /* min_version = */ 1,
50 /* max_version = */ 3);
51 AddBuiltin(BuiltinOperator_AVERAGE_POOL_2D, Register_AVERAGE_POOL_2D(),
52 /* min_version */ 1,
53 /* max_version */ 3);
54 AddBuiltin(BuiltinOperator_MAX_POOL_2D, Register_MAX_POOL_2D(),
55 /* min_version */ 1,
56 /* max_version */ 3);
57 AddBuiltin(BuiltinOperator_L2_POOL_2D, Register_L2_POOL_2D());
58 AddBuiltin(BuiltinOperator_CONV_2D, Register_CONV_2D(),
59 /* min_version = */ 1,
60 /* max_version = */ 6);
61 AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, Register_DEPTHWISE_CONV_2D(),
62 /* min_version = */ 1,
63 /* max_version = */ 6);
64 AddBuiltin(BuiltinOperator_SVDF, Register_SVDF(),
65 /* min_version = */ 1,
66 /* max_version = */ 4);
67 AddBuiltin(BuiltinOperator_RNN, Register_RNN(),
68 /* min_version = */ 1,
69 /* max_version = */ 3);
70 AddBuiltin(BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN,
71 Register_BIDIRECTIONAL_SEQUENCE_RNN(),
72 /* min_version = */ 1,
73 /* max_version = */ 3);
74 AddBuiltin(BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN,
75 Register_UNIDIRECTIONAL_SEQUENCE_RNN(),
76 /* min_version = */ 1,
77 /* max_version = */ 3);
78 AddBuiltin(BuiltinOperator_EMBEDDING_LOOKUP, Register_EMBEDDING_LOOKUP(),
79 /* min_version = */ 1,
80 /* max_version = */ 3);
81 AddBuiltin(BuiltinOperator_EMBEDDING_LOOKUP_SPARSE,
82 Register_EMBEDDING_LOOKUP_SPARSE());
83 AddBuiltin(BuiltinOperator_FULLY_CONNECTED, Register_FULLY_CONNECTED(),
84 /* min_version = */ 1,
85 /* max_version = */ 9);
86 AddBuiltin(BuiltinOperator_LSH_PROJECTION, Register_LSH_PROJECTION());
87 AddBuiltin(BuiltinOperator_HASHTABLE_LOOKUP, Register_HASHTABLE_LOOKUP());
88 AddBuiltin(BuiltinOperator_SOFTMAX, Register_SOFTMAX(),
89 /* min_version = */ 1,
90 /* max_version = */ 3);
91 AddBuiltin(BuiltinOperator_CONCATENATION, Register_CONCATENATION(),
92 /* min_version = */ 1,
93 /* max_version = */ 3);
94 AddBuiltin(BuiltinOperator_ADD, Register_ADD(),
95 /* min_version */ 1,
96 /* max_version */ 4);
97 AddBuiltin(BuiltinOperator_SPACE_TO_BATCH_ND, Register_SPACE_TO_BATCH_ND(),
98 /* min_version = */ 1,
99 /* max_version = */ 3);
100 AddBuiltin(BuiltinOperator_BATCH_TO_SPACE_ND, Register_BATCH_TO_SPACE_ND(),
101 /* min_version = */ 1,
102 /* max_version = */ 3);
103 AddBuiltin(BuiltinOperator_MUL, Register_MUL(), /* min_version = */ 1,
104 /* max_version = */ 6);
105 AddBuiltin(BuiltinOperator_L2_NORMALIZATION, Register_L2_NORMALIZATION(),
106 /* min_version = */ 1,
107 /* max_version = */ 2);
108 AddBuiltin(BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION,
109 Register_LOCAL_RESPONSE_NORMALIZATION());
110 AddBuiltin(BuiltinOperator_LSTM, Register_LSTM(), /* min_version = */ 1,
111 /* max_version = */ 4);
112 AddBuiltin(BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM,
113 Register_BIDIRECTIONAL_SEQUENCE_LSTM(), /* min_version = */ 1,
114 /* max_version = */ 3);
115 AddBuiltin(BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM,
116 Register_UNIDIRECTIONAL_SEQUENCE_LSTM(), /* min_version = */ 1,
117 /* max_version = */ 3);
118 AddBuiltin(BuiltinOperator_PAD, Register_PAD(), /* min_version = */ 1,
119 /* max_version = */ 4);
120 AddBuiltin(BuiltinOperator_PADV2, Register_PADV2(), /* min_version = */ 1,
121 /* max_version = */ 4);
122 AddBuiltin(BuiltinOperator_RESHAPE, Register_RESHAPE());
123 AddBuiltin(BuiltinOperator_RESIZE_BILINEAR, Register_RESIZE_BILINEAR(),
124 /* min_version = */ 1,
125 /* max_version = */ 4);
126 AddBuiltin(BuiltinOperator_RESIZE_NEAREST_NEIGHBOR,
127 Register_RESIZE_NEAREST_NEIGHBOR(),
128 /* min_version = */ 1,
129 /* max_version = */ 4);
130 AddBuiltin(BuiltinOperator_SKIP_GRAM, Register_SKIP_GRAM());
131 AddBuiltin(BuiltinOperator_SPACE_TO_DEPTH, Register_SPACE_TO_DEPTH(),
132 /* min_version = */ 1,
133 /* max_version = */ 2);
134 AddBuiltin(BuiltinOperator_DEPTH_TO_SPACE, Register_DEPTH_TO_SPACE(),
135 /* min_version = */ 1,
136 /* max_version = */ 2);
137 AddBuiltin(BuiltinOperator_GATHER, Register_GATHER(),
138 /* min_version = */ 1,
139 /* max_version = */ 5);
140 AddBuiltin(BuiltinOperator_TRANSPOSE, Register_TRANSPOSE(),
141 /* min_version = */ 1,
142 /* max_version = */ 5);
143 AddBuiltin(BuiltinOperator_MEAN, Register_MEAN(),
144 /* min_version = */ 1,
145 /* max_version = */ 3);
146 AddBuiltin(BuiltinOperator_DIV, Register_DIV(),
147 /* min_version */ 1,
148 /* max_version */ 2);
149 AddBuiltin(BuiltinOperator_SUB, Register_SUB(),
150 /* min_version = */ 1,
151 /* max_version = */ 5);
152 AddBuiltin(BuiltinOperator_SPLIT, Register_SPLIT(),
153 /* min_version = */ 1,
154 /* max_version = */ 4);
155 AddBuiltin(BuiltinOperator_SPLIT_V, Register_SPLIT_V(),
156 /* min_version = */ 1,
157 /* max_version = */ 2);
158 AddBuiltin(BuiltinOperator_SQUEEZE, Register_SQUEEZE(),
159 /* min_version = */ 1,
160 /* max_version = */ 2);
161 AddBuiltin(BuiltinOperator_STRIDED_SLICE, Register_STRIDED_SLICE(),
162 /* min_version = */ 1,
163 /* max_version = */ 6);
164 AddBuiltin(BuiltinOperator_EXP, Register_EXP());
165 AddBuiltin(BuiltinOperator_TOPK_V2, Register_TOPK_V2(),
166 /* min_version = */ 1,
167 /* max_version = */ 2);
168 AddBuiltin(BuiltinOperator_LOG, Register_LOG());
169 AddBuiltin(BuiltinOperator_LOG_SOFTMAX, Register_LOG_SOFTMAX(),
170 /* min_version = */ 1,
171 /* max_version = */ 2);
172 AddBuiltin(BuiltinOperator_CAST, Register_CAST(),
173 /* min_version = */ 1,
174 /* max_version = */ 4);
175 AddBuiltin(BuiltinOperator_DEQUANTIZE, Register_DEQUANTIZE(),
176 /* min_version = */ 1,
177 /* max_version = */ 5);
178 AddBuiltin(BuiltinOperator_PRELU, Register_PRELU());
179 AddBuiltin(BuiltinOperator_MAXIMUM, Register_MAXIMUM(),
180 /* min_version = */ 1,
181 /* max_version = */ 4);
182 AddBuiltin(BuiltinOperator_MINIMUM, Register_MINIMUM(),
183 /* min_version = */ 1,
184 /* max_version = */ 4);
185 AddBuiltin(BuiltinOperator_ARG_MAX, Register_ARG_MAX(),
186 /* min_version = */ 1,
187 /* max_version = */ 3);
188 AddBuiltin(BuiltinOperator_ARG_MIN, Register_ARG_MIN(),
189 /* min_version = */ 1,
190 /* max_version = */ 3);
191 AddBuiltin(BuiltinOperator_GREATER, Register_GREATER(),
192 /* min_version = */ 1,
193 /* max_version = */ 2);
194 AddBuiltin(BuiltinOperator_GREATER_EQUAL, Register_GREATER_EQUAL(),
195 /* min_version = */ 1,
196 /* max_version = */ 2);
197 AddBuiltin(BuiltinOperator_LESS, Register_LESS(),
198 /* min_version = */ 1,
199 /* max_version = */ 2);
200 AddBuiltin(BuiltinOperator_LESS_EQUAL, Register_LESS_EQUAL(),
201 /* min_version = */ 1,
202 /* max_version = */ 2);
203 AddBuiltin(BuiltinOperator_FLOOR, Register_FLOOR());
204 AddBuiltin(BuiltinOperator_CEIL, Register_CEIL());
205 AddBuiltin(BuiltinOperator_ROUND, Register_ROUND());
206 AddBuiltin(BuiltinOperator_NEG, Register_NEG());
207 AddBuiltin(BuiltinOperator_SELECT, Register_SELECT(),
208 /* min_version = */ 1,
209 /* max_version = */ 2);
210 AddBuiltin(BuiltinOperator_SELECT_V2, Register_SELECT_V2());
211 AddBuiltin(BuiltinOperator_SLICE, Register_SLICE(),
212 /* min_version = */ 1,
213 /* max_version = */ 5);
214 AddBuiltin(BuiltinOperator_SIN, Register_SIN());
215 AddBuiltin(BuiltinOperator_COS, Register_COS());
216 AddBuiltin(BuiltinOperator_TRANSPOSE_CONV, Register_TRANSPOSE_CONV(),
217 /* min_version = */ 1,
218 /* max_version = */ 3);
219 AddBuiltin(BuiltinOperator_TILE, Register_TILE(),
220 /* min_version = */ 1,
221 /* max_version = */ 3);
222 AddBuiltin(BuiltinOperator_SUM, Register_SUM(),
223 /* min_version = */ 1,
224 /* max_version = */ 2);
225 AddBuiltin(BuiltinOperator_REDUCE_PROD, Register_REDUCE_PROD(),
226 /* min_version = */ 1,
227 /* max_version = */ 2);
228 AddBuiltin(BuiltinOperator_REDUCE_MAX, Register_REDUCE_MAX(),
229 /* min_version = */ 1,
230 /* max_version = */ 3);
231 AddBuiltin(BuiltinOperator_REDUCE_MIN, Register_REDUCE_MIN(),
232 /* min_version = */ 1,
233 /* max_version = */ 3);
234 AddBuiltin(BuiltinOperator_REDUCE_ANY, Register_REDUCE_ANY());
235 AddBuiltin(BuiltinOperator_REDUCE_ALL, Register_REDUCE_ALL());
236 AddBuiltin(BuiltinOperator_EXPAND_DIMS, Register_EXPAND_DIMS());
237 AddBuiltin(BuiltinOperator_SPARSE_TO_DENSE, Register_SPARSE_TO_DENSE(),
238 /* min_version = */ 1,
239 /* max_version = */ 3);
240 AddBuiltin(BuiltinOperator_EQUAL, Register_EQUAL(),
241 /* min_version = */ 1,
242 /* max_version = */ 3);
243 AddBuiltin(BuiltinOperator_NOT_EQUAL, Register_NOT_EQUAL(),
244 /* min_version = */ 1,
245 /* max_version = */ 3);
246 AddBuiltin(BuiltinOperator_SQRT, Register_SQRT());
247 AddBuiltin(BuiltinOperator_RSQRT, Register_RSQRT(),
248 /* min_version = */ 1,
249 /* max_version = */ 2);
250 AddBuiltin(BuiltinOperator_SHAPE, Register_SHAPE());
251 AddBuiltin(BuiltinOperator_RANK, Register_RANK());
252 AddBuiltin(BuiltinOperator_POW, Register_POW());
253 AddBuiltin(BuiltinOperator_FAKE_QUANT, Register_FAKE_QUANT(), 1, 2);
254 AddBuiltin(BuiltinOperator_PACK, Register_PACK(),
255 /* min_version = */ 1,
256 /* max_version = */ 3);
257 AddBuiltin(BuiltinOperator_ONE_HOT, Register_ONE_HOT());
258 AddBuiltin(BuiltinOperator_LOGICAL_OR, Register_LOGICAL_OR());
259 AddBuiltin(BuiltinOperator_LOGICAL_AND, Register_LOGICAL_AND());
260 AddBuiltin(BuiltinOperator_LOGICAL_NOT, Register_LOGICAL_NOT());
261 AddBuiltin(BuiltinOperator_UNPACK, Register_UNPACK(),
262 /* min_version = */ 1,
263 /* max_version = */ 4);
264 AddBuiltin(BuiltinOperator_FLOOR_DIV, Register_FLOOR_DIV(),
265 /* min_version = */ 1,
266 /* max_version = */ 2);
267 AddBuiltin(BuiltinOperator_SQUARE, Register_SQUARE());
268 AddBuiltin(BuiltinOperator_ZEROS_LIKE, Register_ZEROS_LIKE());
269 AddBuiltin(BuiltinOperator_FLOOR_MOD, Register_FLOOR_MOD());
270 AddBuiltin(BuiltinOperator_RANGE, Register_RANGE());
271 AddBuiltin(BuiltinOperator_LEAKY_RELU, Register_LEAKY_RELU(),
272 /* min_version = */ 1,
273 /* max_version = */ 2);
274 AddBuiltin(BuiltinOperator_SQUARED_DIFFERENCE, Register_SQUARED_DIFFERENCE(),
275 /* min_version = */ 1,
276 /* max_version = */ 2);
277 AddBuiltin(BuiltinOperator_FILL, Register_FILL(),
278 /* min_version = */ 1,
279 /* max_version = */ 3);
280 AddBuiltin(BuiltinOperator_MIRROR_PAD, Register_MIRROR_PAD(),
281 /* min_version = */ 1,
282 /* max_version = */ 2);
283 AddBuiltin(BuiltinOperator_UNIQUE, Register_UNIQUE());
284 AddBuiltin(BuiltinOperator_REVERSE_V2, Register_REVERSE_V2(),
285 /* min_version = */ 1,
286 /* max_version = */ 3);
287 AddBuiltin(BuiltinOperator_ADD_N, Register_ADD_N());
288 AddBuiltin(BuiltinOperator_GATHER_ND, Register_GATHER_ND(),
289 /* min_version = */ 1,
290 /* max_version = */ 3);
291 AddBuiltin(BuiltinOperator_WHERE, Register_WHERE(),
292 /* min_version = */ 1,
293 /* max_version = */ 2);
294 AddBuiltin(BuiltinOperator_ELU, Register_ELU());
295 AddBuiltin(BuiltinOperator_REVERSE_SEQUENCE, Register_REVERSE_SEQUENCE());
296 AddBuiltin(BuiltinOperator_MATRIX_DIAG, Register_MATRIX_DIAG());
297 AddBuiltin(BuiltinOperator_QUANTIZE, Register_QUANTIZE(),
298 /* min_version = */ 1,
299 /* max_version = */ 3);
300 AddBuiltin(BuiltinOperator_MATRIX_SET_DIAG, Register_MATRIX_SET_DIAG());
301 AddBuiltin(BuiltinOperator_IF, tflite::ops::builtin::Register_IF());
302 AddBuiltin(BuiltinOperator_WHILE, tflite::ops::builtin::Register_WHILE());
303 AddBuiltin(BuiltinOperator_NON_MAX_SUPPRESSION_V4,
304 Register_NON_MAX_SUPPRESSION_V4());
305 AddBuiltin(BuiltinOperator_NON_MAX_SUPPRESSION_V5,
306 Register_NON_MAX_SUPPRESSION_V5());
307 AddBuiltin(BuiltinOperator_SCATTER_ND, Register_SCATTER_ND());
308 AddBuiltin(BuiltinOperator_DENSIFY, Register_DENSIFY());
309 AddBuiltin(BuiltinOperator_SEGMENT_SUM, Register_SEGMENT_SUM());
310 AddBuiltin(BuiltinOperator_BATCH_MATMUL, Register_BATCH_MATMUL(),
311 /* min_version = */ 1,
312 /* max_version = */ 4);
313 AddBuiltin(BuiltinOperator_CUMSUM, Register_CUMSUM());
314 // The version one of broadcast to op won't be not supported since the version
315 // one was rollbacked and the builtin op code number has been changed because
316 // of builtin op code shortage problem.
317 AddBuiltin(BuiltinOperator_BROADCAST_TO, Register_BROADCAST_TO(),
318 /* min_version = */ 2,
319 /* max_version = */ 3);
320 AddBuiltin(BuiltinOperator_CALL_ONCE,
321 tflite::ops::builtin::Register_CALL_ONCE());
322 AddBuiltin(BuiltinOperator_RFFT2D, Register_RFFT2D());
323 AddBuiltin(BuiltinOperator_CONV_3D, Register_CONV_3D());
324 AddBuiltin(BuiltinOperator_IMAG, Register_IMAG());
325 AddBuiltin(BuiltinOperator_REAL, Register_REAL());
326 AddBuiltin(BuiltinOperator_COMPLEX_ABS, Register_COMPLEX_ABS());
327 AddBuiltin(BuiltinOperator_BROADCAST_ARGS, Register_BROADCAST_ARGS());
328 AddBuiltin(BuiltinOperator_HASHTABLE, Register_HASHTABLE());
329 AddBuiltin(BuiltinOperator_HASHTABLE_FIND, Register_HASHTABLE_FIND());
330 AddBuiltin(BuiltinOperator_HASHTABLE_IMPORT, Register_HASHTABLE_IMPORT());
331 AddBuiltin(BuiltinOperator_HASHTABLE_SIZE, Register_HASHTABLE_SIZE());
332 AddBuiltin(BuiltinOperator_CONV_3D_TRANSPOSE, Register_CONV_3D_TRANSPOSE());
333 AddBuiltin(BuiltinOperator_VAR_HANDLE, Register_VAR_HANDLE());
334 AddBuiltin(BuiltinOperator_READ_VARIABLE, Register_READ_VARIABLE());
335 AddBuiltin(BuiltinOperator_ASSIGN_VARIABLE, Register_ASSIGN_VARIABLE());
336 AddBuiltin(BuiltinOperator_MULTINOMIAL, Register_MULTINOMIAL());
337 AddBuiltin(BuiltinOperator_RANDOM_STANDARD_NORMAL,
338 Register_RANDOM_STANDARD_NORMAL());
339 AddBuiltin(BuiltinOperator_BUCKETIZE, Register_BUCKETIZE());
340 AddBuiltin(BuiltinOperator_RANDOM_UNIFORM, Register_RANDOM_UNIFORM());
341 AddBuiltin(BuiltinOperator_GELU, Register_GELU(),
342 /* min_version = */ 1,
343 /* max_version = */ 2);
344 AddBuiltin(BuiltinOperator_DYNAMIC_UPDATE_SLICE,
345 Register_DYNAMIC_UPDATE_SLICE());
346 AddBuiltin(BuiltinOperator_UNSORTED_SEGMENT_PROD,
347 Register_UNSORTED_SEGMENT_PROD());
348 AddBuiltin(BuiltinOperator_UNSORTED_SEGMENT_MAX,
349 Register_UNSORTED_SEGMENT_MAX());
350 AddBuiltin(BuiltinOperator_UNSORTED_SEGMENT_MIN,
351 Register_UNSORTED_SEGMENT_MIN());
352 AddBuiltin(BuiltinOperator_UNSORTED_SEGMENT_SUM,
353 Register_UNSORTED_SEGMENT_SUM());
354 AddBuiltin(BuiltinOperator_ATAN2, Register_ATAN2());
355 AddBuiltin(BuiltinOperator_SIGN, Register_SIGN());
356 AddCustom("NumericVerify", tflite::ops::custom::Register_NUMERIC_VERIFY());
357 // TODO(andrewharp, ahentz): Move these somewhere more appropriate so that
358 // custom ops aren't always included by default.
359 AddCustom("Mfcc", tflite::ops::custom::Register_MFCC());
360 AddCustom("AudioSpectrogram",
361 tflite::ops::custom::Register_AUDIO_SPECTROGRAM());
362 AddCustom("TFLite_Detection_PostProcess",
363 tflite::ops::custom::Register_DETECTION_POSTPROCESS());
364 // By definition, all of the ops added above are not user-defined ops,
365 // since they are supported by BuiltinOpResolver.
366 may_directly_contain_user_defined_ops_ = false;
367
368 // Populate the list of TF Lite delegate creators. The created delegates could
369 // be applied to the model graph by default at runtime.
370 delegate_creators_.push_back([](int num_threads) {
371 return tflite::MaybeCreateXNNPACKDelegate(num_threads);
372 });
373}
374
375} // namespace builtin
376} // namespace ops
377} // namespace tflite
378