Add new builtin code field to operator code

This is for addressing the builtin code shortage problem.

PiperOrigin-RevId: 336083510
Change-Id: I0ca615ed0893e948ad6299221117e2c59f81cdba
This commit is contained in:
Jaesung Chung 2020-10-08 07:47:03 -07:00 committed by TensorFlower Gardener
parent 1e68aaed08
commit 54151bec86
46 changed files with 1437 additions and 145 deletions

View File

@ -459,11 +459,13 @@ node {
# CHECK-LABEL: {
# CHECK: version: 3,
# CHECK: operator_codes: [ {
# CHECK: builtin_code: CONV_2D,
# CHECK: version: 3
# CHECK: deprecated_builtin_code: 3,
# CHECK: version: 3,
# CHECK: builtin_code: CONV_2D
# CHECK: }, {
# CHECK: builtin_code: RESHAPE,
# CHECK: deprecated_builtin_code: 22,
# CHECK: version: 1
# CHECK: builtin_code: RESHAPE
# CHECK: } ],
# CHECK: subgraphs: [ {
# CHECK: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(tensor<1x384xf32>, tensor<1x96xf32>, tensor<384x480xf32>, tensor<384x
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: LSTM,
// CHECK-NEXT: deprecated_builtin_code: 16,
// CHECK-NEXT: version: 2
// CHECK-NEXT: builtin_code: LSTM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -6,14 +6,17 @@ func @main(tensor<4xf32>) -> tensor<4xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 1
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: custom_code: "MyCustomOp"
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "MyCustomOp",
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: EXP,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 47,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: EXP
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,11 +5,13 @@ func @main(tensor<1x224x224x3xf32>) -> tensor<1x112x112x32xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: DEQUANTIZE,
// CHECK-NEXT: deprecated_builtin_code: 6,
// CHECK-NEXT: version: 1
// CHECK-NEXT: builtin_code: DEQUANTIZE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: DEPTHWISE_CONV_2D,
// CHECK-NEXT: deprecated_builtin_code: 4,
// CHECK-NEXT: version: 1
// CHECK-NEXT: builtin_code: DEPTHWISE_CONV_2D
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,11 +5,13 @@ func @main(tensor<1x224x224x3xf32>) -> tensor<1x112x112x32xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: DEQUANTIZE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 6,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: DEQUANTIZE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: DEPTHWISE_CONV_2D,
// CHECK-NEXT: version: 2
// CHECK-NEXT: deprecated_builtin_code: 4,
// CHECK-NEXT: version: 2,
// CHECK-NEXT: builtin_code: DEPTHWISE_CONV_2D
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,11 +5,13 @@ func @main(tensor<4xf32>) -> tensor<4xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: EXP,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 47,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: EXP
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -6,8 +6,9 @@ func @main(tensor<4xf32>) -> tensor<4xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: FAKE_QUANT,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 80,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: FAKE_QUANT
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(%arg0: tensor<3x2xf32>) -> tensor<3x2xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "FlexAddV2"
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<4xcomplex<f64>>, tensor<4xcomplex<f64>>) -> tensor<4xcomplex<f
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: custom_code: "FlexAdd"
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "FlexAdd",
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<4xf64>, tensor<4xf64>) -> tensor<4xf64> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: custom_code: "FlexAdd"
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "FlexAdd",
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,14 +5,17 @@ func @main(tensor<4xf32>) -> tensor<4xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: version: 1
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: custom_code: "FlexDiv"
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "FlexDiv",
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: }, {
// CHECK-NEXT: deprecated_builtin_code: 47,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: EXP
// CHECK-NEXT: version: 1
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<40x37xf32>, tensor<40x37xf32>) -> tensor<40x40xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: FULLY_CONNECTED,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 9,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: FULLY_CONNECTED
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<40x37xf32>, tensor<40x37xf32>) -> tensor<40x40xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: FULLY_CONNECTED,
// CHECK-NEXT: version: 2
// CHECK-NEXT: deprecated_builtin_code: 9,
// CHECK-NEXT: version: 2,
// CHECK-NEXT: builtin_code: FULLY_CONNECTED
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -3,8 +3,9 @@
// CHECK: {
// CHECK: version: 3,
// CHECK: operator_codes: [ {
// CHECK: builtin_code: CUSTOM,
// CHECK: custom_code: "HashTableV2"
// CHECK: deprecated_builtin_code: 32,
// CHECK: custom_code: "HashTableV2",
// CHECK: builtin_code: CUSTOM
// CHECK: } ],
// CHECK: subgraphs: [ {
// CHECK: tensors: [ {

View File

@ -4,16 +4,19 @@
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: LESS,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 58,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: LESS
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: IF,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 118,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: IF
// CHECK-NEXT: }, {
// CHECK-NEXT: version: 1
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,11 +5,13 @@ func @main(tensor<4xi1>) -> tensor<4xi1> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: LOGICAL_OR,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 84,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: LOGICAL_OR
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: LOGICAL_AND,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 86,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: LOGICAL_AND
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(tensor<1x4xf32>, tensor<4x4xf32>, tensor<4x4xf32>, tensor<4x4xf32>, t
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: LSTM,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 16,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: LSTM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -7,8 +7,9 @@ func @main(%arg0: tensor<1x528x!quant.uniform<i8:f32, 0.037248000502586365:-19>>
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: LSTM,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 16,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: LSTM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,20 +5,25 @@ func @main(tensor<4xf32>) -> tensor<4xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: SQUARED_DIFFERENCE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 99,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SQUARED_DIFFERENCE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: DIV,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 42,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: DIV
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: EXP,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 47,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: EXP
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: NEG,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 59,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: NEG
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<3x!quant.uniform<i8:f32, 0.1>>) -> tensor<3x!quant.uniform<i8:
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: version: 2
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 2,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<3x!quant.uniform<i8:f32, 1.0>>) -> tensor<3x!quant.uniform<i8:
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: MUL,
// CHECK-NEXT: version: 3
// CHECK-NEXT: deprecated_builtin_code: 18,
// CHECK-NEXT: version: 3,
// CHECK-NEXT: builtin_code: MUL
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<1x6x6x16xf32>) -> tensor<1x1x1x16xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: AVERAGE_POOL_2D,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 1,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: AVERAGE_POOL_2D
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -3,8 +3,9 @@
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: CUSTOM,
// CHECK-NEXT: custom_code: "NumericVerify"
// CHECK-NEXT: deprecated_builtin_code: 32,
// CHECK-NEXT: custom_code: "NumericVerify",
// CHECK-NEXT: builtin_code: CUSTOM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -4,20 +4,25 @@ func @main(%arg0: tensor<1x224x224x3xf32>) -> tensor<1x1001xf32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: QUANTIZE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 114,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: QUANTIZE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: CONV_2D,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 3,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: CONV_2D
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: RESHAPE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 22,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: RESHAPE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: SOFTMAX,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 25,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SOFTMAX
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: DEQUANTIZE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 6,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: DEQUANTIZE
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -5,8 +5,9 @@ func @main(tensor<3x2xi32>) -> tensor<6xi32> {
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: RESHAPE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 22,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: RESHAPE
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -7,8 +7,9 @@ func @main(tensor<3x2xi32>) -> tensor<3x2xi32>
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: SUB,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 41,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SUB
// CHECK-NEXT: }, {
// CHECK-NEXT: version: 1
// CHECK-NEXT: } ],

View File

@ -4,8 +4,9 @@ func @main(tensor<4 x f32>, tensor<4 x f32>, tensor<4 x f32>, tensor<4 x f32>) -
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: SVDF,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 27,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SVDF
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(tensor<4 x f32>, tensor<4 x i8>, tensor<4 x f32>, tensor<4 x f32>) ->
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: SVDF,
// CHECK-NEXT: version: 2
// CHECK-NEXT: deprecated_builtin_code: 27,
// CHECK-NEXT: version: 2,
// CHECK-NEXT: builtin_code: SVDF
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -3,14 +3,17 @@
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: WHILE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 119,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: WHILE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: GREATER,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 61,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: GREATER
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: SUB,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 41,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SUB
// CHECK-NEXT: }, {
// CHECK-NEXT: version: 1
// CHECK-NEXT: } ],

View File

@ -4,8 +4,9 @@ func @main(%arg0: tensor<4xi32>, %arg1: tensor<32x4x4x128xf32>, %arg2: tensor<1x
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: TRANSPOSE_CONV,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 67,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: TRANSPOSE_CONV
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -3,8 +3,9 @@
// CHECK: {
// CHECK: version: 3,
// CHECK: operator_codes: [ {
// CHECK: builtin_code: CUSTOM,
// CHECK: custom_code: "SomeOperation"
// CHECK: deprecated_builtin_code: 32,
// CHECK: custom_code: "SomeOperation",
// CHECK: builtin_code: CUSTOM
// CHECK: } ],
// CHECK: subgraphs: [ {
// CHECK: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(tensor<4x4xf32>, tensor<4x4xf32>, tensor<4x4xf32>, tensor<4x4xf32>, t
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: UNIDIRECTIONAL_SEQUENCE_LSTM,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 44,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: UNIDIRECTIONAL_SEQUENCE_LSTM
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -4,8 +4,9 @@ func @main(tensor<4 x f32>, tensor<4 x f32>, tensor<4 x f32>, tensor<4 x f32>) -
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: UNIDIRECTIONAL_SEQUENCE_RNN,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 35,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: UNIDIRECTIONAL_SEQUENCE_RNN
// CHECK-NEXT: } ],
// CHECK-NEXT: subgraphs: [ {
// CHECK-NEXT: tensors: [ {

View File

@ -3,14 +3,17 @@
// CHECK: {
// CHECK-NEXT: version: 3,
// CHECK-NEXT: operator_codes: [ {
// CHECK-NEXT: builtin_code: WHILE,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 119,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: WHILE
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: GREATER,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 61,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: GREATER
// CHECK-NEXT: }, {
// CHECK-NEXT: builtin_code: SUB,
// CHECK-NEXT: version: 1
// CHECK-NEXT: deprecated_builtin_code: 41,
// CHECK-NEXT: version: 1,
// CHECK-NEXT: builtin_code: SUB
// CHECK-NEXT: }, {
// CHECK-NEXT: version: 1
// CHECK-NEXT: } ],

View File

@ -24,7 +24,8 @@ extern "C" {
#endif // __cplusplus
// The enum for builtin operators.
// Note: CUSTOM and DELEGATE are 2 special ops which are not real built-in ops.
// Note: CUSTOM, DELEGATE, and PLACEHOLDER_FOR_GREATER_OP_CODES are 3 special
// ops which are not real built-in ops.
typedef enum {
kTfLiteBuiltinAdd = 0,
kTfLiteBuiltinAveragePool2d = 1,
@ -153,6 +154,7 @@ typedef enum {
kTfLiteBuiltinDensify = 124,
kTfLiteBuiltinSegmentSum = 125,
kTfLiteBuiltinBatchMatmul = 126,
kTfLiteBuiltinPlaceholderForGreaterOpCodes = 127,
} TfLiteBuiltinOperator;
#ifdef __cplusplus

View File

@ -803,6 +803,8 @@ TfLiteStatus ParseOpDataTfLite(const Operator* op, BuiltinOperator op_type,
case BuiltinOperator_DENSIFY:
case BuiltinOperator_SEGMENT_SUM:
return kTfLiteOk;
case BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES:
return kTfLiteError;
}
return kTfLiteError;
} // NOLINT[readability/fn_size]

View File

@ -163,8 +163,11 @@ class OpOptionData {
op_to_option_["UNIDIRECTIONAL_SEQUENCE_RNN"] = "SequenceRNNOptions";
op_to_option_["MAXIMUM"] = "MaximumMinimumOptions";
op_to_option_["MINIMUM"] = "MaximumMinimumOptions";
// These operators are not real ones.
op_to_option_["CUSTOM"] = ""; // TODO(aselle): maybe something else.
op_to_option_["DELEGATE"] = ""; // TODO(aselle): maybe something else.
op_to_option_["PLACEHOLDER_FOR_GREATER_OP_CODES"] = "";
// Manually specified mappings between ops to "none" options -- these are
// ops without a corresponding Options message in schema as yet. If these

View File

@ -73,6 +73,7 @@ exports_files([
"schema_v1.fbs",
"schema_v2.fbs",
"schema_v3.fbs",
"schema_v3a.fbs",
])
flatbuffer_cc_library(
@ -115,7 +116,7 @@ cc_test(
srcs = ["flatbuffer_compatibility_test.cc"],
data = [
"schema.fbs",
"schema_v3.fbs",
"schema_v3a.fbs",
],
tags = [
"no_oss",

View File

@ -46,7 +46,8 @@ extern "C" {
#endif // __cplusplus
// The enum for builtin operators.
// Note: CUSTOM and DELEGATE are 2 special ops which are not real built-in ops.
// Note: CUSTOM, DELEGATE, and PLACEHOLDER_FOR_GREATER_OP_CODES are 3 special
// ops which are not real built-in ops.
typedef enum {
)";

View File

@ -61,8 +61,7 @@ TEST(SchemaTest, TestCompatibility) {
// Read file contents of schemas into strings
// TODO(aselle): Need a reliable way to load files.
std::string base_contents, current_contents;
const char *base_filename =
TFLITE_TF_PREFIX "lite/schema/schema_v3.fbs";
const char *base_filename = TFLITE_TF_PREFIX "lite/schema/schema_v3a.fbs";
const char *current_filename =
TFLITE_TF_PREFIX "lite/schema/schema.fbs";

View File

@ -17,6 +17,8 @@
// Version 1: Add subgraphs to schema.
// Version 2: Rename operators to conform to NN API.
// Version 3: Move buffer data from Model.Subgraph.Tensors to Model.Buffers.
// Version 3a: Add new builtin op code field. Has backward compatibility with
// version 3.
namespace tflite;
@ -215,7 +217,7 @@ table Tensor {
// object containing configuration parameters, builtins have a predetermined
// set of acceptable options.
enum BuiltinOperator : byte {
enum BuiltinOperator : int32 {
ADD = 0,
AVERAGE_POOL_2D = 1,
CONCATENATION = 2,
@ -248,7 +250,6 @@ enum BuiltinOperator : byte {
SPACE_TO_DEPTH = 26,
SVDF = 27,
TANH = 28,
// TODO(aselle): Consider rename to CONCATENATE_EMBEDDINGS
CONCAT_EMBEDDINGS = 29,
SKIP_GRAM = 30,
CALL = 31,
@ -349,7 +350,8 @@ enum BuiltinOperator : byte {
SELECT_V2 = 123,
DENSIFY = 124,
SEGMENT_SUM = 125,
BATCH_MATMUL = 126
BATCH_MATMUL = 126,
PLACEHOLDER_FOR_GREATER_OP_CODES = 127
}
@ -982,12 +984,21 @@ table BatchMatMulOptions {
// An OperatorCode can be an enum value (BuiltinOperator) if the operator is a
// builtin, or a string if the operator is custom.
table OperatorCode {
builtin_code:BuiltinOperator;
// This field is for backward compatibility. This field will be used when
// the value of the extended builtin_code field has less than
// BulitinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES.
deprecated_builtin_code:byte;
custom_code:string;
// The version of the operator. The version need to be bumped whenever new
// parameters are introduced into an op.
version:int = 1;
// This field is introduced for resolving op builtin code shortage problem
// (the original BuiltinOperator enum field was represented as a byte).
// This field will be used when the value of the extended builtin_code field
// has greater than BulitinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES.
builtin_code:BuiltinOperator;
}
enum CustomOptionsFormat : byte {

View File

@ -781,11 +781,12 @@ enum BuiltinOperator {
BuiltinOperator_DENSIFY = 124,
BuiltinOperator_SEGMENT_SUM = 125,
BuiltinOperator_BATCH_MATMUL = 126,
BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES = 127,
BuiltinOperator_MIN = BuiltinOperator_ADD,
BuiltinOperator_MAX = BuiltinOperator_BATCH_MATMUL
BuiltinOperator_MAX = BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES
};
inline const BuiltinOperator (&EnumValuesBuiltinOperator())[127] {
inline const BuiltinOperator (&EnumValuesBuiltinOperator())[128] {
static const BuiltinOperator values[] = {
BuiltinOperator_ADD,
BuiltinOperator_AVERAGE_POOL_2D,
@ -913,13 +914,14 @@ inline const BuiltinOperator (&EnumValuesBuiltinOperator())[127] {
BuiltinOperator_SELECT_V2,
BuiltinOperator_DENSIFY,
BuiltinOperator_SEGMENT_SUM,
BuiltinOperator_BATCH_MATMUL
BuiltinOperator_BATCH_MATMUL,
BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES
};
return values;
}
inline const char * const *EnumNamesBuiltinOperator() {
static const char * const names[128] = {
static const char * const names[129] = {
"ADD",
"AVERAGE_POOL_2D",
"CONCATENATION",
@ -1047,13 +1049,14 @@ inline const char * const *EnumNamesBuiltinOperator() {
"DENSIFY",
"SEGMENT_SUM",
"BATCH_MATMUL",
"PLACEHOLDER_FOR_GREATER_OP_CODES",
nullptr
};
return names;
}
inline const char *EnumNameBuiltinOperator(BuiltinOperator e) {
if (flatbuffers::IsOutRange(e, BuiltinOperator_ADD, BuiltinOperator_BATCH_MATMUL)) return "";
if (flatbuffers::IsOutRange(e, BuiltinOperator_ADD, BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesBuiltinOperator()[index];
}
@ -9336,24 +9339,27 @@ flatbuffers::Offset<BatchMatMulOptions> CreateBatchMatMulOptions(flatbuffers::Fl
struct OperatorCodeT : public flatbuffers::NativeTable {
typedef OperatorCode TableType;
tflite::BuiltinOperator builtin_code;
int8_t deprecated_builtin_code;
std::string custom_code;
int32_t version;
tflite::BuiltinOperator builtin_code;
OperatorCodeT()
: builtin_code(tflite::BuiltinOperator_ADD),
version(1) {
: deprecated_builtin_code(0),
version(1),
builtin_code(tflite::BuiltinOperator_ADD) {
}
};
struct OperatorCode FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef OperatorCodeT NativeTableType;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_BUILTIN_CODE = 4,
VT_DEPRECATED_BUILTIN_CODE = 4,
VT_CUSTOM_CODE = 6,
VT_VERSION = 8
VT_VERSION = 8,
VT_BUILTIN_CODE = 10
};
tflite::BuiltinOperator builtin_code() const {
return static_cast<tflite::BuiltinOperator>(GetField<int8_t>(VT_BUILTIN_CODE, 0));
int8_t deprecated_builtin_code() const {
return GetField<int8_t>(VT_DEPRECATED_BUILTIN_CODE, 0);
}
const flatbuffers::String *custom_code() const {
return GetPointer<const flatbuffers::String *>(VT_CUSTOM_CODE);
@ -9361,12 +9367,16 @@ struct OperatorCode FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
int32_t version() const {
return GetField<int32_t>(VT_VERSION, 1);
}
tflite::BuiltinOperator builtin_code() const {
return static_cast<tflite::BuiltinOperator>(GetField<int32_t>(VT_BUILTIN_CODE, 0));
}
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<int8_t>(verifier, VT_BUILTIN_CODE) &&
VerifyField<int8_t>(verifier, VT_DEPRECATED_BUILTIN_CODE) &&
VerifyOffset(verifier, VT_CUSTOM_CODE) &&
verifier.VerifyString(custom_code()) &&
VerifyField<int32_t>(verifier, VT_VERSION) &&
VerifyField<int32_t>(verifier, VT_BUILTIN_CODE) &&
verifier.EndTable();
}
OperatorCodeT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
@ -9377,8 +9387,8 @@ struct OperatorCode FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
struct OperatorCodeBuilder {
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_builtin_code(tflite::BuiltinOperator builtin_code) {
fbb_.AddElement<int8_t>(OperatorCode::VT_BUILTIN_CODE, static_cast<int8_t>(builtin_code), 0);
void add_deprecated_builtin_code(int8_t deprecated_builtin_code) {
fbb_.AddElement<int8_t>(OperatorCode::VT_DEPRECATED_BUILTIN_CODE, deprecated_builtin_code, 0);
}
void add_custom_code(flatbuffers::Offset<flatbuffers::String> custom_code) {
fbb_.AddOffset(OperatorCode::VT_CUSTOM_CODE, custom_code);
@ -9386,6 +9396,9 @@ struct OperatorCodeBuilder {
void add_version(int32_t version) {
fbb_.AddElement<int32_t>(OperatorCode::VT_VERSION, version, 1);
}
void add_builtin_code(tflite::BuiltinOperator builtin_code) {
fbb_.AddElement<int32_t>(OperatorCode::VT_BUILTIN_CODE, static_cast<int32_t>(builtin_code), 0);
}
explicit OperatorCodeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
@ -9400,27 +9413,31 @@ struct OperatorCodeBuilder {
inline flatbuffers::Offset<OperatorCode> CreateOperatorCode(
flatbuffers::FlatBufferBuilder &_fbb,
tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD,
int8_t deprecated_builtin_code = 0,
flatbuffers::Offset<flatbuffers::String> custom_code = 0,
int32_t version = 1) {
int32_t version = 1,
tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD) {
OperatorCodeBuilder builder_(_fbb);
builder_.add_builtin_code(builtin_code);
builder_.add_version(version);
builder_.add_custom_code(custom_code);
builder_.add_builtin_code(builtin_code);
builder_.add_deprecated_builtin_code(deprecated_builtin_code);
return builder_.Finish();
}
inline flatbuffers::Offset<OperatorCode> CreateOperatorCodeDirect(
flatbuffers::FlatBufferBuilder &_fbb,
tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD,
int8_t deprecated_builtin_code = 0,
const char *custom_code = nullptr,
int32_t version = 1) {
int32_t version = 1,
tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD) {
auto custom_code__ = custom_code ? _fbb.CreateString(custom_code) : 0;
return tflite::CreateOperatorCode(
_fbb,
builtin_code,
deprecated_builtin_code,
custom_code__,
version);
version,
builtin_code);
}
flatbuffers::Offset<OperatorCode> CreateOperatorCode(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
@ -13695,9 +13712,10 @@ inline OperatorCodeT *OperatorCode::UnPack(const flatbuffers::resolver_function_
inline void OperatorCode::UnPackTo(OperatorCodeT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
{ auto _e = builtin_code(); _o->builtin_code = _e; }
{ auto _e = deprecated_builtin_code(); _o->deprecated_builtin_code = _e; }
{ auto _e = custom_code(); if (_e) _o->custom_code = _e->str(); }
{ auto _e = version(); _o->version = _e; }
{ auto _e = builtin_code(); _o->builtin_code = _e; }
}
inline flatbuffers::Offset<OperatorCode> OperatorCode::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@ -13708,14 +13726,16 @@ inline flatbuffers::Offset<OperatorCode> CreateOperatorCode(flatbuffers::FlatBuf
(void)_rehasher;
(void)_o;
struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const OperatorCodeT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
auto _builtin_code = _o->builtin_code;
auto _deprecated_builtin_code = _o->deprecated_builtin_code;
auto _custom_code = _o->custom_code.empty() ? 0 : _fbb.CreateString(_o->custom_code);
auto _version = _o->version;
auto _builtin_code = _o->builtin_code;
return tflite::CreateOperatorCode(
_fbb,
_builtin_code,
_deprecated_builtin_code,
_custom_code,
_version);
_version,
_builtin_code);
}
inline OperatorT *Operator::UnPack(const flatbuffers::resolver_function_t *_resolver) const {

View File

@ -19,21 +19,90 @@ limitations under the License.
namespace tflite {
// The following GetBuiltinCode methods are the utility methods for reading
// builtin operatore code. Later, theses method will be used for upcoming
// builtin code compatibility changes.
// builtin operatore code, ensuring compatibility issues between v3 and v3a
// schema. Always the maximum value of the two fields always will be the correct
// value as follows:
//
// - Supporting schema version v3 models
//
// The `builtin_code` field is not available in the v3 models. Flatbuffer
// library will feed zero value, which is the default value in the v3a schema.
// The actual builtin operatore code value will exist in the
// `deprecated_builtin_code` field. At the same time, it implies that
// `deprecated_builtin_code` >= `builtin_code` and the maximum value of the two
// fields will be same with `deprecated_builtin_code'.
//
// - Supporting builtin operator codes beyonds 127
//
// New builtin operators, whose operator code is larger than 127, can not be
// assigned to the `deprecated_builtin_code` field. In such cases, the
// value of the `builtin_code` field should be used for the builtin operator
// code. In the case, the maximum value of the two fields will be the value of
// the `builtin_code` as the right value.
BuiltinOperator GetBuiltinCode(const OperatorCode *op_code) {
// Caller should guarantee that the given argument value is not a nullptr.
TFLITE_DCHECK(op_code != nullptr);
return op_code->builtin_code();
return (op_code->builtin_code() ? op_code->builtin_code()
: static_cast<BuiltinOperator>(
op_code->deprecated_builtin_code()));
}
BuiltinOperator GetBuiltinCode(const OperatorCodeT *op_code) {
// Caller should guarantee that the given argument value is not a nullptr.
TFLITE_DCHECK(op_code != nullptr);
return op_code->builtin_code;
return (op_code->builtin_code
? op_code->builtin_code
: static_cast<BuiltinOperator>(op_code->deprecated_builtin_code));
}
int8_t ConvertBuiltinCodeToDeprecatedBuiltinCode(
const BuiltinOperator builtin_code) {
return (builtin_code < BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES)
? static_cast<int8_t>(builtin_code)
: static_cast<int8_t>(
BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES);
}
// The following methods are the following `OperatorCode` table object creation
// methods for backward compatibility. These are manually copied from the
// flatbuffer generated code from schema v3. They serve as overloads for the
// v3a's CreateOperatorCode functions in schema_generated.h and enable code that
// still assumes flatbuffer schema v3 to be unchanged with the inclusion of the
// schema_utils header.
// TODO(b/162392898): remove once all callers are updated to use schema v3a
// functions.
flatbuffers::Offset<OperatorCode> CreateOperatorCode(
flatbuffers::FlatBufferBuilder &_fbb, BuiltinOperator builtin_code,
flatbuffers::Offset<flatbuffers::String> custom_code, int32_t version) {
OperatorCodeBuilder builder_(_fbb);
builder_.add_version(version);
int8_t deprecated_builtin_code =
static_cast<int8_t>(BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES);
if (builtin_code < BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES) {
deprecated_builtin_code = static_cast<int8_t>(builtin_code);
}
builder_.add_deprecated_builtin_code(deprecated_builtin_code);
builder_.add_custom_code(custom_code);
builder_.add_builtin_code(builtin_code);
return builder_.Finish();
}
flatbuffers::Offset<OperatorCode> CreateOperatorCodeDirect(
flatbuffers::FlatBufferBuilder &_fbb, BuiltinOperator builtin_code,
const char *custom_code, int32_t version) {
auto custom_code__ = custom_code ? _fbb.CreateString(custom_code) : 0;
int8_t deprecated_builtin_code =
static_cast<int8_t>(BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES);
if (builtin_code < BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES) {
deprecated_builtin_code = static_cast<int8_t>(builtin_code);
}
return CreateOperatorCode(_fbb, deprecated_builtin_code, custom_code__,
version, builtin_code);
}
} // namespace tflite

View File

@ -28,6 +28,22 @@ BuiltinOperator GetBuiltinCode(const OperatorCode *op_code);
BuiltinOperator GetBuiltinCode(const OperatorCodeT *op_code);
int8_t ConvertBuiltinCodeToDeprecatedBuiltinCode(
const BuiltinOperator builtin_code);
// The following methods are for backward compatibility for the early version
// three, which does not have an extended builtin code.
flatbuffers::Offset<OperatorCode> CreateOperatorCode(
flatbuffers::FlatBufferBuilder &_fbb,
BuiltinOperator builtin_code = BuiltinOperator_ADD,
flatbuffers::Offset<flatbuffers::String> custom_code = 0,
int32_t version = 1);
flatbuffers::Offset<OperatorCode> CreateOperatorCodeDirect(
flatbuffers::FlatBufferBuilder &_fbb,
BuiltinOperator builtin_code = BuiltinOperator_ADD,
const char *custom_code = nullptr, int32_t version = 1);
} // namespace tflite
#endif // TENSORFLOW_LITE_SCHEMA_SCHEMA_UTILS_H_

File diff suppressed because it is too large Load Diff

View File

@ -297,6 +297,8 @@ int32_t GetOrInsertDequantizeOpCodeIndex(ModelT* model) {
model->operator_codes.push_back(absl::make_unique<OperatorCodeT>());
int op_code_idx = model->operator_codes.size() - 1;
model->operator_codes[op_code_idx]->builtin_code = BuiltinOperator_DEQUANTIZE;
model->operator_codes[op_code_idx]->deprecated_builtin_code =
static_cast<int8_t>(BuiltinOperator_DEQUANTIZE);
// Version 2 and onwards supports INT8 inputs.
model->operator_codes[op_code_idx]->version = 2;