From e7c8edc5b099676446391a17c32e7dbf1c65ac17 Mon Sep 17 00:00:00 2001 From: "G. Ramalingam" Date: Wed, 14 Jul 2021 07:47:27 -0700 Subject: [PATCH 1/2] Add Cast-like operator (#3558) * Add Cast-like operator Signed-off-by: Ganesan Ramalingam * Add function body and TestCoverage.md Signed-off-by: Ganesan Ramalingam * Add test case Signed-off-by: Ganesan Ramalingam * Generate Operators.md Signed-off-by: Ganesan Ramalingam * Fix flake8 warning Signed-off-by: Ganesan Ramalingam * Regenerate TestCoverage.md Signed-off-by: Ganesan Ramalingam * Add upgrade test Signed-off-by: Ganesan Ramalingam Co-authored-by: Ashwini Khade Co-authored-by: Chun-Wei Chen --- docs/Changelog.md | 35 +++++ docs/Operators.md | 124 ++++++++++++++++++ docs/TestCoverage.md | 89 ++++++++++++- onnx/backend/test/case/node/castlike.py | 100 ++++++++++++++ .../model.onnx | 16 +++ .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | Bin 0 -> 16 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes .../model.onnx | Bin 0 -> 172 bytes .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | Bin 0 -> 16 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes .../test_castlike_DOUBLE_to_FLOAT/model.onnx | 16 +++ .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 1 + .../model.onnx | 18 +++ .../test_data_set_0/input_0.pb | Bin 0 -> 111 bytes .../test_data_set_0/input_1.pb | 2 + .../test_data_set_0/output_0.pb | 2 + .../model.onnx | Bin 0 -> 172 bytes .../test_data_set_0/input_0.pb | Bin 0 -> 111 bytes .../test_data_set_0/input_1.pb | 2 + .../test_data_set_0/output_0.pb | 2 + .../model.onnx | Bin 0 -> 170 bytes .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 1 + .../model.onnx | 17 +++ .../test_data_set_0/input_0.pb | 2 + .../test_data_set_0/input_1.pb | Bin 0 -> 20 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 112 bytes .../model.onnx | Bin 0 -> 172 bytes .../test_data_set_0/input_0.pb | 2 + .../test_data_set_0/input_1.pb | Bin 0 -> 20 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 112 bytes .../test_castlike_FLOAT16_to_FLOAT/model.onnx | 17 +++ .../test_data_set_0/input_0.pb | 2 + .../test_data_set_0/input_1.pb | Bin 0 -> 16 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes .../model.onnx | Bin 0 -> 171 bytes .../test_data_set_0/input_0.pb | 2 + .../test_data_set_0/input_1.pb | Bin 0 -> 16 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes .../model.onnx | 16 +++ .../test_data_set_0/input_0.pb | Bin 0 -> 63 bytes .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 1 + .../model.onnx | Bin 0 -> 172 bytes .../test_data_set_0/input_0.pb | Bin 0 -> 63 bytes .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 1 + .../test_castlike_FLOAT_to_DOUBLE/model.onnx | 16 +++ .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | Bin 0 -> 20 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 112 bytes .../model.onnx | Bin 0 -> 170 bytes .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | Bin 0 -> 20 bytes .../test_data_set_0/output_0.pb | Bin 0 -> 112 bytes .../test_castlike_FLOAT_to_FLOAT16/model.onnx | 18 +++ .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 2 + .../test_data_set_0/output_0.pb | Bin 0 -> 40 bytes .../model.onnx | Bin 0 -> 171 bytes .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 2 + .../test_data_set_0/output_0.pb | Bin 0 -> 40 bytes .../test_castlike_FLOAT_to_STRING/model.onnx | 16 +++ .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 6 + .../model.onnx | Bin 0 -> 170 bytes .../test_data_set_0/input_0.pb | 1 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | 6 + .../test_castlike_STRING_to_FLOAT/model.onnx | 16 +++ .../test_data_set_0/input_0.pb | 7 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes .../model.onnx | Bin 0 -> 170 bytes .../test_data_set_0/input_0.pb | 7 + .../test_data_set_0/input_1.pb | 1 + .../test_data_set_0/output_0.pb | Bin 0 -> 64 bytes onnx/defs/operator_sets.h | 2 + onnx/defs/tensor/defs.cc | 96 ++++++++++++++ onnx/test/automatic_upgrade_test.py | 7 + onnx/test/shape_inference_test.py | 7 + 88 files changed, 693 insertions(+), 1 deletion(-) create mode 100644 onnx/backend/test/case/node/castlike.py create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/output_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/model.onnx create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/test_data_set_0/input_0.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/test_data_set_0/input_1.pb create mode 100644 onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/test_data_set_0/output_0.pb diff --git a/docs/Changelog.md b/docs/Changelog.md index 4c6c75b16e0..d18deee3d84 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -19607,6 +19607,41 @@ This version of the operator has been available since version 15 of the default
Constrain output types to all numeric tensors and bool tensors.
+### **CastLike-15** + + The operator casts the elements of a given input tensor (the first input) to + the same data type as the elements of the second input tensor. + See documentation of the Cast operator for further details. + +#### Version + +This version of the operator has been available since version 15 of the default ONNX operator set. + +#### Inputs + +
+
input (differentiable) : T1
+
Input tensor to be cast.
+
target_type (non-differentiable) : T2
+
The (first) input tensor will be cast to produce a tensor of the same type as this (second input) tensor.
+
+ +#### Outputs + +
+
output (differentiable) : T2
+
Output tensor produced by casting the first input tensor to have the same type as the second input tensor.
+
+ +#### Type Constraints + +
+
T1 : tensor(float16), tensor(float), tensor(double), tensor(int8), tensor(int16), tensor(int32), tensor(int64), tensor(uint8), tensor(uint16), tensor(uint32), tensor(uint64), tensor(bool), tensor(string), tensor(bfloat16)
+
Constrain input types. Casting from complex is not supported.
+
T2 : tensor(float16), tensor(float), tensor(double), tensor(int8), tensor(int16), tensor(int32), tensor(int64), tensor(uint8), tensor(uint16), tensor(uint32), tensor(uint64), tensor(bool), tensor(string), tensor(bfloat16)
+
Constrain output types. Casting to complex is not supported.
+
+ ### **Pow-15** Pow takes input data (Tensor) and exponent Tensor, and diff --git a/docs/Operators.md b/docs/Operators.md index e9cee11d7ff..6172822547f 100755 --- a/docs/Operators.md +++ b/docs/Operators.md @@ -166,6 +166,7 @@ For an operator input/output's differentiability, it can be differentiable, |Xor|7, 1| |**Function**|**Since version**| |Bernoulli|15| +|CastLike|15| |Celu|12| |DynamicQuantizeLinear|11| |GreaterOrEqual|12| @@ -2527,6 +2528,129 @@ for from_type, to_type in test_cases: +### **CastLike** + + The operator casts the elements of a given input tensor (the first input) to + the same data type as the elements of the second input tensor. + See documentation of the Cast operator for further details. + +#### Version + +This version of the operator has been available since version 15 of the default ONNX operator set. + +#### Inputs + +
+
input (differentiable) : T1
+
Input tensor to be cast.
+
target_type (non-differentiable) : T2
+
The (first) input tensor will be cast to produce a tensor of the same type as this (second input) tensor.
+
+ +#### Outputs + +
+
output (differentiable) : T2
+
Output tensor produced by casting the first input tensor to have the same type as the second input tensor.
+
+ +#### Type Constraints + +
+
T1 : tensor(float16), tensor(float), tensor(double), tensor(int8), tensor(int16), tensor(int32), tensor(int64), tensor(uint8), tensor(uint16), tensor(uint32), tensor(uint64), tensor(bool), tensor(string), tensor(bfloat16)
+
Constrain input types. Casting from complex is not supported.
+
T2 : tensor(float16), tensor(float), tensor(double), tensor(int8), tensor(int16), tensor(int32), tensor(int64), tensor(uint8), tensor(uint16), tensor(uint32), tensor(uint64), tensor(bool), tensor(string), tensor(bfloat16)
+
Constrain output types. Casting to complex is not supported.
+
+ + +#### Examples + +
+castlike + +```python +shape = (3, 4) +test_cases = [ + ('FLOAT', 'FLOAT16'), + ('FLOAT', 'DOUBLE'), + ('FLOAT16', 'FLOAT'), + ('FLOAT16', 'DOUBLE'), + ('DOUBLE', 'FLOAT'), + ('DOUBLE', 'FLOAT16'), + ('FLOAT', 'STRING'), + ('STRING', 'FLOAT'), + ('FLOAT', 'BFLOAT16'), + ('BFLOAT16', 'FLOAT'), +] + +for from_type, to_type in test_cases: + input_type = None + output_type = None + if 'BFLOAT16' == from_type or 'BFLOAT16' == to_type: + np_fp32 = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.float32) + little_endisan = sys.byteorder == 'little' + np_uint16_view = np_fp32.view(dtype=np.uint16) + np_bfp16 = np_uint16_view[1::2] if little_endisan else np_uint16_view[0::2] + if 'BFLOAT16' == to_type: + assert from_type == 'FLOAT' + input = np_fp32.reshape([3, 4]) + output = np_bfp16.reshape([3, 4]) + input_type = int(TensorProto.FLOAT) + output_type = int(TensorProto.BFLOAT16) + else: + assert to_type == 'FLOAT' + input = np_bfp16.reshape([3, 4]) + #convert bfloat to FLOAT + np_fp32_zeros = np.zeros((len(np_bfp16) * 2,), dtype=np.uint16) + if little_endisan: + np_fp32_zeros[1::2] = np_bfp16 + else: + np_fp32_zeros[0::2] = np_bfp16 + np_fp32_from_bfloat = np_fp32_zeros.view(dtype=np.float32) + output = np_fp32_from_bfloat.reshape([3, 4]) + input_type = int(TensorProto.BFLOAT16) + output_type = int(TensorProto.FLOAT) + elif 'STRING' != from_type: + input = np.random.random_sample(shape).astype( + TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, from_type)]) + if ('STRING' == to_type): + # Converting input to str, then give it np.object dtype for generating script + ss = [] + for i in input.flatten(): + s = str(i).encode('utf-8') + su = s.decode('utf-8') + ss.append(su) + + output = np.array(ss).astype(np.object).reshape([3, 4]) + else: + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + else: + input = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.dtype(np.object)).reshape([3, 4]) + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + like = output.flatten()[0:1] + node = onnx.helper.make_node( + 'CastLike', + inputs=['input', 'like'], + outputs=['output'], + ) + if input_type and output_type: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type, + input_types=[input_type, output_type], + output_types=[output_type]) + else: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type) +``` + +
+ + ### **Ceil** Ceil takes one input data (Tensor) and produces one output data diff --git a/docs/TestCoverage.md b/docs/TestCoverage.md index d7876481f5b..38560b3a35b 100755 --- a/docs/TestCoverage.md +++ b/docs/TestCoverage.md @@ -6,7 +6,7 @@ * [Overall Test Coverage](#overall-test-coverage) # Node Test Coverage ## Summary -Node tests have covered 150/164 (91.46%, 5 generators excluded) common operators. +Node tests have covered 151/165 (91.52%, 5 generators excluded) common operators. Node tests have covered 0/0 (N/A) experimental operators. @@ -1717,6 +1717,93 @@ for from_type, to_type in test_cases: +### CastLike +There are 1 test cases, listed as following: +
+castlike + +```python +shape = (3, 4) +test_cases = [ + ('FLOAT', 'FLOAT16'), + ('FLOAT', 'DOUBLE'), + ('FLOAT16', 'FLOAT'), + ('FLOAT16', 'DOUBLE'), + ('DOUBLE', 'FLOAT'), + ('DOUBLE', 'FLOAT16'), + ('FLOAT', 'STRING'), + ('STRING', 'FLOAT'), + ('FLOAT', 'BFLOAT16'), + ('BFLOAT16', 'FLOAT'), +] + +for from_type, to_type in test_cases: + input_type = None + output_type = None + if 'BFLOAT16' == from_type or 'BFLOAT16' == to_type: + np_fp32 = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.float32) + little_endisan = sys.byteorder == 'little' + np_uint16_view = np_fp32.view(dtype=np.uint16) + np_bfp16 = np_uint16_view[1::2] if little_endisan else np_uint16_view[0::2] + if 'BFLOAT16' == to_type: + assert from_type == 'FLOAT' + input = np_fp32.reshape([3, 4]) + output = np_bfp16.reshape([3, 4]) + input_type = int(TensorProto.FLOAT) + output_type = int(TensorProto.BFLOAT16) + else: + assert to_type == 'FLOAT' + input = np_bfp16.reshape([3, 4]) + #convert bfloat to FLOAT + np_fp32_zeros = np.zeros((len(np_bfp16) * 2,), dtype=np.uint16) + if little_endisan: + np_fp32_zeros[1::2] = np_bfp16 + else: + np_fp32_zeros[0::2] = np_bfp16 + np_fp32_from_bfloat = np_fp32_zeros.view(dtype=np.float32) + output = np_fp32_from_bfloat.reshape([3, 4]) + input_type = int(TensorProto.BFLOAT16) + output_type = int(TensorProto.FLOAT) + elif 'STRING' != from_type: + input = np.random.random_sample(shape).astype( + TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, from_type)]) + if ('STRING' == to_type): + # Converting input to str, then give it np.object dtype for generating script + ss = [] + for i in input.flatten(): + s = str(i).encode('utf-8') + su = s.decode('utf-8') + ss.append(su) + + output = np.array(ss).astype(np.object).reshape([3, 4]) + else: + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + else: + input = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.dtype(np.object)).reshape([3, 4]) + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + like = output.flatten()[0:1] + node = onnx.helper.make_node( + 'CastLike', + inputs=['input', 'like'], + outputs=['output'], + ) + if input_type and output_type: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type, + input_types=[input_type, output_type], + output_types=[output_type]) + else: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type) +``` + +
+ + ### Ceil There are 1 test cases, listed as following:
diff --git a/onnx/backend/test/case/node/castlike.py b/onnx/backend/test/case/node/castlike.py new file mode 100644 index 00000000000..f79ee256fc6 --- /dev/null +++ b/onnx/backend/test/case/node/castlike.py @@ -0,0 +1,100 @@ +# SPDX-License-Identifier: Apache-2.0 + +# coding: utf-8 + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import numpy as np # type: ignore + +import onnx +from onnx import TensorProto +from onnx.mapping import TENSOR_TYPE_TO_NP_TYPE + +from ..base import Base +from . import expect +import sys + + +class CastLike(Base): + + @staticmethod + def export(): # type: () -> None + shape = (3, 4) + test_cases = [ + ('FLOAT', 'FLOAT16'), + ('FLOAT', 'DOUBLE'), + ('FLOAT16', 'FLOAT'), + ('FLOAT16', 'DOUBLE'), + ('DOUBLE', 'FLOAT'), + ('DOUBLE', 'FLOAT16'), + ('FLOAT', 'STRING'), + ('STRING', 'FLOAT'), + ('FLOAT', 'BFLOAT16'), + ('BFLOAT16', 'FLOAT'), + ] + + for from_type, to_type in test_cases: + input_type = None + output_type = None + if 'BFLOAT16' == from_type or 'BFLOAT16' == to_type: + np_fp32 = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.float32) + little_endisan = sys.byteorder == 'little' + np_uint16_view = np_fp32.view(dtype=np.uint16) + np_bfp16 = np_uint16_view[1::2] if little_endisan else np_uint16_view[0::2] + if 'BFLOAT16' == to_type: + assert from_type == 'FLOAT' + input = np_fp32.reshape([3, 4]) + output = np_bfp16.reshape([3, 4]) + input_type = int(TensorProto.FLOAT) + output_type = int(TensorProto.BFLOAT16) + else: + assert to_type == 'FLOAT' + input = np_bfp16.reshape([3, 4]) + #convert bfloat to FLOAT + np_fp32_zeros = np.zeros((len(np_bfp16) * 2,), dtype=np.uint16) + if little_endisan: + np_fp32_zeros[1::2] = np_bfp16 + else: + np_fp32_zeros[0::2] = np_bfp16 + np_fp32_from_bfloat = np_fp32_zeros.view(dtype=np.float32) + output = np_fp32_from_bfloat.reshape([3, 4]) + input_type = int(TensorProto.BFLOAT16) + output_type = int(TensorProto.FLOAT) + elif 'STRING' != from_type: + input = np.random.random_sample(shape).astype( + TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, from_type)]) + if ('STRING' == to_type): + # Converting input to str, then give it np.object dtype for generating script + ss = [] + for i in input.flatten(): + s = str(i).encode('utf-8') + su = s.decode('utf-8') + ss.append(su) + + output = np.array(ss).astype(np.object).reshape([3, 4]) + else: + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + else: + input = np.array([u'0.47892547', u'0.48033667', u'0.49968487', u'0.81910545', + u'0.47031248', u'0.816468', u'0.21087195', u'0.7229038', + u'NaN', u'INF', u'+INF', u'-INF'], dtype=np.dtype(np.object)).reshape([3, 4]) + output = input.astype(TENSOR_TYPE_TO_NP_TYPE[getattr(TensorProto, to_type)]) + like = output.flatten()[0:1] + node = onnx.helper.make_node( + 'CastLike', + inputs=['input', 'like'], + outputs=['output'], + ) + if input_type and output_type: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type, + input_types=[input_type, output_type], + output_types=[output_type]) + else: + expect(node, inputs=[input, like], outputs=[output], + name='test_castlike_' + from_type + '_to_' + to_type) diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/model.onnx b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/model.onnx new file mode 100644 index 00000000000..f3cc97f688a --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_BFLOAT16_to_FLOATZ +input +  + +Z +like + + +b +output +  + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..e7fbb216db4 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BinputJ>>>Q?>Q?W>9? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..c739ea465af64fe0814bcf7ff2d122314f3d7c71 GIT binary patch literal 16 Xcmd;J6kv2>$;r%4^O literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..80a9fe87a0b212c841b48601d72afc38f95eabec GIT binary patch literal 64 zcmd;J=3o(EbYjadEh#81@iJgw_-Y5i|ABO%Jp;oBC>;)@ErI+4^$ZLRF#I0?)U^** literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..b3598c7ca2f9e7b168b3dbd626219858b2e2cf68 GIT binary patch literal 172 zcmdI qOdQNW%n~KU#RAeR#KpzI!6?K66k|-1;DXvI1X9h2Q0>Gdzz+bYktc-! literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..e7fbb216db4 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BinputJ>>>Q?>Q?W>9? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..c739ea465af64fe0814bcf7ff2d122314f3d7c71 GIT binary patch literal 16 Xcmd;J6kv2>$;r%4^O literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_BFLOAT16_to_FLOAT_expanded/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..80a9fe87a0b212c841b48601d72afc38f95eabec GIT binary patch literal 64 zcmd;J=3o(EbYjadEh#81@iJgw_-Y5i|ABO%Jp;oBC>;)@ErI+4^$ZLRF#I0?)U^** literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/model.onnx b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/model.onnx new file mode 100644 index 00000000000..363c44c5d77 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_DOUBLE_to_FLOATZ +input +   + +Z +like + + +b +output +  + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..2f262521e8f --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/input_0.pb @@ -0,0 +1 @@ + BinputJ`Rd/?\ G?X'L ??F ?+ ?ԛ?|3):y? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..5f760bfd848 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT/test_data_set_0/output_0.pb @@ -0,0 +1 @@ +BoutputJ0>L8>j?a>}?=U>R.%>2'?p>I>Jz> \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/model.onnx b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/model.onnx new file mode 100644 index 00000000000..ead7aa56c58 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/model.onnx @@ -0,0 +1,18 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_DOUBLE_to_FLOAT16Z +input +   + +Z +like + + + +b +output +  + + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16/test_data_set_0/input_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..a1a2cd292a8c422a45a34b134da614a583f6e3d6 GIT binary patch literal 111 zcmV-#0FeI(0|*2V3ql2HZg6#UN?@#dXoVeF#6KvKmz9e_yg!K0MCqmgObgO?h~QgxIfg>vDR_W>OWvC8o%e6xIZRE RgXnjNHrHiwG)#7KLD_BC!PQR literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT16_expanded/test_data_set_0/input_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..a1a2cd292a8c422a45a34b134da614a583f6e3d6 GIT binary patch literal 111 zcmV-#0FeI(0|*2V3ql2HZg6#UN?@#dXoVeF#6KvKmz9e_yg!K0MCqmgObgO?h~QgxIfg>vDR_W>OWvC8o%e6xIZRE RgX literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..2f262521e8f --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/input_0.pb @@ -0,0 +1 @@ + BinputJ`Rd/?\ G?X'L ??F ?+ ?ԛ?|3):y? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..5f760bfd848 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_DOUBLE_to_FLOAT_expanded/test_data_set_0/output_0.pb @@ -0,0 +1 @@ +BoutputJ0>L8>j?a>}?=U>R.%>2'?p>I>Jz> \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/model.onnx new file mode 100644 index 00000000000..bf61a448bec --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/model.onnx @@ -0,0 +1,17 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_FLOAT16_to_DOUBLEZ +input +  + + +Z +like + +  +b +output +   + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..1454185c4ff --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_0.pb @@ -0,0 +1,2 @@ + +BinputJ88;t9569+V9]92 0 \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..a01a391921a2e81278e2575c06ff6f20a4618167 GIT binary patch literal 20 Ycmd;J6ySDZ$;r%4_2OUvffnjNHsS?wG)#7KLD=UC!hcT literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..1454185c4ff --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_0.pb @@ -0,0 +1,2 @@ + +BinputJ88;t9569+V9]92 0 \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_DOUBLE_expanded/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..a01a391921a2e81278e2575c06ff6f20a4618167 GIT binary patch literal 20 Ycmd;J6ySDZ$;r%4_2OUvff$;r%4^~ T8eRg~g7yp#X4)_)$k_t`D&!H? literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT16_to_FLOAT_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..18f1e659f1369c848fb93fa78f2b4ca81bc72eec GIT binary patch literal 171 zcmd#hRH{P+B6ymS0)|q?K5l6N^i$;r%4^~ T8eRg~g7yp#X4)_)$k_t`D&!H? literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/model.onnx new file mode 100644 index 00000000000..2ddf9e195f3 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_FLOAT_to_BFLOAT16Z +input +  + +Z +like + + +b +output +  + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..fc06bd1b5f4811cfe314ccf5d921457d7c0cf66a GIT binary patch literal 63 zcmd;J=3o(EbYjiSD=01TGT34I)o#PPuXdZR{kMC%A<+KJnGbe6EP?hH--X**3Rv1R NFdV37U}%8h{{R8I7%Tt) literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..d3235bb24f6 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/input_1.pb @@ -0,0 +1 @@ +BlikeJ> \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..5d313b3c56c --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16/test_data_set_0/output_0.pb @@ -0,0 +1 @@ +BoutputJ>>>Q?>Q?W>9? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..8403d07fd98ee080e0f567b3f3e904ce7ef80b0f GIT binary patch literal 172 zcmdGdzz+bilP9A9 literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..fc06bd1b5f4811cfe314ccf5d921457d7c0cf66a GIT binary patch literal 63 zcmd;J=3o(EbYjiSD=01TGT34I)o#PPuXdZR{kMC%A<+KJnGbe6EP?hH--X**3Rv1R NFdV37U}%8h{{R8I7%Tt) literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..d3235bb24f6 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/input_1.pb @@ -0,0 +1 @@ +BlikeJ> \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..5d313b3c56c --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_BFLOAT16_expanded/test_data_set_0/output_0.pb @@ -0,0 +1 @@ +BoutputJ>>>Q?>Q?W>9? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/model.onnx new file mode 100644 index 00000000000..c3489a1b61d --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_FLOAT_to_DOUBLEZ +input +  + +Z +like + +  +b +output +   + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..a3a4dfd28ad --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BinputJ0^k?l?Z{=p= <&U?H5G?^?z?L?G>G? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..9d880ecb0e3e7419d2c40991143db23276280aff GIT binary patch literal 20 bcmd;J6ySDZ$;r%4_2OV)U^tMi`^X*uCb$IK literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..ab6a834d8e1c5b2bfe43e42268abd65159ffdbb8 GIT binary patch literal 112 zcmd;J=3o)vc4EsfEh#81@k(G|U^tMi`^X+hKd71a7DPK_>u&kX0p;tj!Q$5g-h;)rPI?Izf6#FkEH3fug*^cB&LW@y literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..f5064b546b9a9cf05d1f60746e3146b012908f54 GIT binary patch literal 170 zcmdG? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/input_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..9d880ecb0e3e7419d2c40991143db23276280aff GIT binary patch literal 20 bcmd;J6ySDZ$;r%4_2OV)U^tMi`^X*uCb$IK literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_DOUBLE_expanded/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..ab6a834d8e1c5b2bfe43e42268abd65159ffdbb8 GIT binary patch literal 112 zcmd;J=3o)vc4EsfEh#81@k(G|U^tMi`^X+hKd71a7DPK_>u&kX0p;tj!Q$5g-h;)rPI?Izf6#FkEH3fug*^cB&LW@y literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/model.onnx new file mode 100644 index 00000000000..43fc912b1d6 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/model.onnx @@ -0,0 +1,18 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_FLOAT_to_FLOAT16Z +input +  + +Z +like + + + +b +output +  + + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..11115432265 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BinputJ0  ?7?N?w} ?H>QY%?n >~J?e? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..5b8b689b798 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/input_1.pb @@ -0,0 +1,2 @@ + +BlikeJd8 \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..2fa7f21ce789dfb3c9ef0c0de663bc7184fbaac8 GIT binary patch literal 40 vcmd;J=3o)va$?IbEh#81@sdcf*lBsmBF5slnYJZ^xsvrZYh|-gD{Bh?(lrYD literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..fce76c7e48321d6da87dc8388ad1c00b7344df4e GIT binary patch literal 171 zcmd#hRH{P+B6ymS0)|q?K5l6N^iQY%?n >~J?e? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..5b8b689b798 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/input_1.pb @@ -0,0 +1,2 @@ + +BlikeJd8 \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_FLOAT16_expanded/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..2fa7f21ce789dfb3c9ef0c0de663bc7184fbaac8 GIT binary patch literal 40 vcmd;J=3o)va$?IbEh#81@sdcf*lBsmBF5slnYJZ^xsvrZYh|-gD{Bh?(lrYD literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/model.onnx new file mode 100644 index 00000000000..be377f75fc4 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_FLOAT_to_STRINGZ +input +  + +Z +like + + +b +output +  + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..4b0bb0708c6 --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_0.pb @@ -0,0 +1 @@ +BinputJ0 z?(?a@=?a =̐>)=>'=΢>G>_=E1? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..796cde0030a --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/input_1.pb @@ -0,0 +1 @@ +2 0.9767611Blike \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..8d2b65fc18b --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING/test_data_set_0/output_0.pb @@ -0,0 +1,6 @@ +2 0.97676112 0.60484552 0.73926362 0.0391877932 +0.282806962 +0.120196562 0.29614022 +0.118727722 +0.317983182 +0.414262982 0.0641474952 0.6924721Boutput \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..24fdcc07bcd258f664a76da520a97f0aa31be5f4 GIT binary patch literal 170 zcmd)=>'=΢>G>_=E1? \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..796cde0030a --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/input_1.pb @@ -0,0 +1 @@ +2 0.9767611Blike \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/output_0.pb new file mode 100644 index 00000000000..8d2b65fc18b --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_FLOAT_to_STRING_expanded/test_data_set_0/output_0.pb @@ -0,0 +1,6 @@ +2 0.97676112 0.60484552 0.73926362 0.0391877932 +0.282806962 +0.120196562 0.29614022 +0.118727722 +0.317983182 +0.414262982 0.0641474952 0.6924721Boutput \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/model.onnx b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/model.onnx new file mode 100644 index 00000000000..c3e70b8089b --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/model.onnx @@ -0,0 +1,16 @@ + backend-test: + +input +likeoutput"CastLiketest_castlike_STRING_to_FLOATZ +input +  + +Z +like + + +b +output +  + +B \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_0.pb new file mode 100644 index 00000000000..fbe920e572d --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_0.pb @@ -0,0 +1,7 @@ +2 +0.478925472 +0.480336672 +0.499684872 +0.819105452 +0.4703124820.8164682 +0.210871952 0.72290382NaN2INF2+INF2-INFBinput \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_1.pb new file mode 100644 index 00000000000..7cb044382ca --- /dev/null +++ b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/input_1.pb @@ -0,0 +1 @@ +BlikeJ5> \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..20e739450902a13b964a86fb1bd145fcb9693ee0 GIT binary patch literal 64 zcmd;J=3o(EbYjadEh#81@iN$9`qgg3yRUYeuKl-rx*^d1%$W~%JS>6s7vF{3SqfO% OGcX*eXJBZ6;r{?0gcz;> literal 0 HcmV?d00001 diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/model.onnx b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..7014726d5992b2eb2e74a30c4e926b0962f86ed3 GIT binary patch literal 170 zcmd \ No newline at end of file diff --git a/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_castlike_STRING_to_FLOAT_expanded/test_data_set_0/output_0.pb new file mode 100644 index 0000000000000000000000000000000000000000..20e739450902a13b964a86fb1bd145fcb9693ee0 GIT binary patch literal 64 zcmd;J=3o(EbYjadEh#81@iN$9`qgg3yRUYeuKl-rx*^d1%$W~%JS>6s7vF{3SqfO% OGcX*eXJBZ6;r{?0gcz;> literal 0 HcmV?d00001 diff --git a/onnx/defs/operator_sets.h b/onnx/defs/operator_sets.h index d89fd5747cb..88cb9cc23c7 100644 --- a/onnx/defs/operator_sets.h +++ b/onnx/defs/operator_sets.h @@ -969,6 +969,7 @@ class OpSet_Onnx_ver14 { class ONNX_OPERATOR_SET_SCHEMA_CLASS_NAME(Onnx, 15, BatchNormalization); class ONNX_OPERATOR_SET_SCHEMA_CLASS_NAME(Onnx, 15, Bernoulli); class ONNX_OPERATOR_SET_SCHEMA_CLASS_NAME(Onnx, 15, Pow); +class ONNX_OPERATOR_SET_SCHEMA_CLASS_NAME(Onnx, 15, CastLike); // Iterate over schema from ai.onnx version 15 class OpSet_Onnx_ver15 { @@ -977,6 +978,7 @@ class OpSet_Onnx_ver15 { fn(GetOpSchema()); fn(GetOpSchema()); fn(GetOpSchema()); + fn(GetOpSchema()); } }; diff --git a/onnx/defs/tensor/defs.cc b/onnx/defs/tensor/defs.cc index 785d79a49b3..c5eab356f0a 100644 --- a/onnx/defs/tensor/defs.cc +++ b/onnx/defs/tensor/defs.cc @@ -4,6 +4,7 @@ #include "onnx/defs/tensor/utils.h" +#include "onnx/defs/function.h" #include #include @@ -103,6 +104,101 @@ ONNX_OPERATOR_SET_SCHEMA( } })); +static const char* CastLike_ver15_doc = R"DOC( +The operator casts the elements of a given input tensor (the first input) to +the same data type as the elements of the second input tensor. +See documentation of the Cast operator for further details. +)DOC"; + +ONNX_OPERATOR_SET_SCHEMA( + CastLike, + 15, + OpSchema() + .SetDoc(CastLike_ver15_doc) + .Input( + 0, + "input", + "Input tensor to be cast.", + "T1", + OpSchema::Single, + true, + 1, + OpSchema::Differentiable) + .Input( + 1, + "target_type", + "The (first) input tensor will be cast to produce a tensor of the same type as this (second input) tensor.", + "T2", + OpSchema::Single, + true, + 1, + OpSchema::NonDifferentiable) + .Output( + 0, + "output", + "Output tensor produced by casting the first input tensor to have the same type as the second input tensor.", + "T2", + OpSchema::Single, + true, + 1, + OpSchema::Differentiable) + .TypeConstraint( + "T1", + { "tensor(float16)", + "tensor(float)", + "tensor(double)", + "tensor(int8)", + "tensor(int16)", + "tensor(int32)", + "tensor(int64)", + "tensor(uint8)", + "tensor(uint16)", + "tensor(uint32)", + "tensor(uint64)", + "tensor(bool)", + "tensor(string)", + "tensor(bfloat16)" }, + "Constrain input types. Casting from complex is not supported.") + .TypeConstraint( + "T2", + { "tensor(float16)", + "tensor(float)", + "tensor(double)", + "tensor(int8)", + "tensor(int16)", + "tensor(int32)", + "tensor(int64)", + "tensor(uint8)", + "tensor(uint16)", + "tensor(uint32)", + "tensor(uint64)", + "tensor(bool)", + "tensor(string)", + "tensor(bfloat16)" }, + "Constrain output types. Casting to complex is not supported.") + .TypeAndShapeInferenceFunction([](InferenceContext& ctx) { + propagateElemTypeFromInputToOutput(ctx, 1, 0); + if (hasNInputShapes(ctx, 1)) { + propagateShapeFromInputToOutput(ctx, 0, 0); + } +}) +.SetContextDependentFunctionBodyBuilder( + [](const FunctionBodyBuildContext& ctx, + const OpSchema& schema, + FunctionProto& functionProto) -> bool { + auto target_type = ctx.getInputType(1); + if ((target_type == nullptr) || (!target_type->has_tensor_type())) { + // we cannot create a correct function body without knowing the target element type + return false; + } + auto target_elt_type = target_type->tensor_type().elem_type(); + std::vector body{ + // nodes: {outputs, op, inputs, attributes} + { {"output"}, "Cast", {"input"}, {MakeAttribute("to", (int64_t)(target_elt_type))} } + }; + return FunctionBodyHelper::BuildFunctionProto(functionProto, schema, body, {}); +})); + static const char* Reshape_ver14_doc = R"DOC( Reshape the input tensor similar to numpy.reshape. First input is the data tensor, second input is a shape tensor which specifies the output shape. It outputs the reshaped tensor. diff --git a/onnx/test/automatic_upgrade_test.py b/onnx/test/automatic_upgrade_test.py index 8d66a2a4827..e0d3862350b 100644 --- a/onnx/test/automatic_upgrade_test.py +++ b/onnx/test/automatic_upgrade_test.py @@ -1011,6 +1011,13 @@ def test_Xor(self): # type: () -> None [TensorProto.BOOL, TensorProto.BOOL], [TensorProto.BOOL] ) + def test_CastLike(self): # type: () -> None + self._test_op_upgrade('CastLike', 15, + [[2, 3, 4], [2, 1, 4]], + [[2, 3, 4]], + input_types=[TensorProto.FLOAT, TensorProto.FLOAT16], + output_types=[TensorProto.FLOAT16]) + def test_ops_tested(self): # type: () -> None all_schemas = onnx.defs.get_all_schemas() all_op_names = [schema.name for schema in all_schemas if schema.domain == ''] diff --git a/onnx/test/shape_inference_test.py b/onnx/test/shape_inference_test.py index 13ee94ae960..d8c817e287c 100644 --- a/onnx/test/shape_inference_test.py +++ b/onnx/test/shape_inference_test.py @@ -170,6 +170,13 @@ def test_cast(self): # type: () -> None []) self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.UINT8, (2, 4, 3))]) + def test_cast_like(self): # type: () -> None + graph = self._make_graph( + [("x", TensorProto.FLOAT, (2, 4, 3)), ("t", TensorProto.FLOAT16, ("N",))], + [make_node("CastLike", ["x", "t"], ["y"])], + []) + self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT16, (2, 4, 3))]) + def test_concat(self): # type: () -> None graph = self._make_graph( [("x", TensorProto.FLOAT, (2, 4, 3)), From 2e5caf717817953f312e46e697557a51468715d7 Mon Sep 17 00:00:00 2001 From: Takeshi Watanabe Date: Thu, 15 Jul 2021 01:21:20 +0900 Subject: [PATCH 2/2] Add xfail marking support to backend test runner (#3542) Signed-off-by: twata Co-authored-by: Ashwini Khade --- onnx/backend/test/runner/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/onnx/backend/test/runner/__init__.py b/onnx/backend/test/runner/__init__.py index bf2cb920af3..049ed57bf9d 100644 --- a/onnx/backend/test/runner/__init__.py +++ b/onnx/backend/test/runner/__init__.py @@ -58,6 +58,7 @@ def __init__(self, backend, parent_module=None): # type: (Type[Backend], Option self._parent_module = parent_module self._include_patterns = set() # type: Set[Pattern[Text]] self._exclude_patterns = set() # type: Set[Pattern[Text]] + self._xfail_patterns = set() # type: Set[Pattern[Text]] # This is the source of the truth of all test functions. # Properties `test_cases`, `test_suite` and `tests` will be @@ -94,6 +95,10 @@ def exclude(self, pattern): # type: (Text) -> Runner self._exclude_patterns.add(re.compile(pattern)) return self + def xfail(self, pattern): # type: (Text) -> Runner + self._xfail_patterns.add(re.compile(pattern)) + return self + def enable_report(self): # type: () -> Runner import pytest # type: ignore @@ -120,6 +125,9 @@ def _filtered_test_items(self): # type: () -> Dict[Text, Dict[Text, TestItem]] 'matched exclude pattern "{}"'.format( exclude.pattern) )(item.func) + for xfail in self._xfail_patterns: + if xfail.search(name): + item.func = unittest.expectedFailure(item.func) filtered[category][name] = item return filtered