diff --git a/docs/Operators.md b/docs/Operators.md
index 47acf23822c..27096fcef0c 100644
--- a/docs/Operators.md
+++ b/docs/Operators.md
@@ -2492,6 +2492,42 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+convinteger
+
+```python
+
+x = np.array([2, 3, 4, 5, 6, 7, 8, 9, 10]).astype(np.uint8).reshape((1, 1, 3, 3))
+x_zero_point = np.array([1]).astype(np.uint8)
+w = np.array([1, 1, 1, 1]).astype(np.uint8).reshape((1, 1, 2, 2))
+
+y = np.array([12, 16, 24, 28]).astype(np.int32).reshape(1, 1, 2, 2)
+
+# ConvInteger without padding
+convinteger_node = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'])
+
+expect(convinteger_node, inputs=[x, w, x_zero_point], outputs=[y],
+ name='test_basic_convinteger')
+
+# ConvInteger with padding
+y_with_padding = np.array([1, 3, 5, 3, 5, 12, 16, 9, 11, 24, 28, 15, 7, 15, 17, 9]).astype(np.int32).reshape((1, 1, 4, 4))
+
+convinteger_node_with_padding = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'],
+ pads=[1, 1, 1, 1],)
+
+expect(convinteger_node_with_padding, inputs=[x, w, x_zero_point], outputs=[y_with_padding],
+ name='test_convinteger_with_padding')
+```
+
+
+
+
### **ConvTranspose**
The convolution transpose operator consumes an input tensor and a filter,
@@ -3105,6 +3141,29 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+dequantizelinear
+
+```python
+node = onnx.helper.make_node('DequantizeLinear',
+ inputs=['x', 'x_scale', 'x_zero_point'],
+ outputs=['y'],)
+
+# scalar zero point and scale
+x = np.array([0, 3, 128, 255]).astype(np.uint8)
+x_scale = np.array([2], dtype=np.float32)
+x_zero_point = np.array([128], dtype=np.uint8)
+y = np.array([-256, -250, 0, 254], dtype=np.float32)
+
+expect(node, inputs=[x, x_scale, x_zero_point], outputs=[y],
+ name='test_dequantizelinear')
+```
+
+
+
+
### **Div**
Performs element-wise binary division (with Numpy-style broadcasting support).
@@ -6319,6 +6378,41 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+matmulinteger
+
+```python
+node = onnx.helper.make_node('MatMulInteger',
+ inputs=['A', 'B', 'a_zero_point', 'b_zero_point'],
+ outputs=['Y'],)
+
+A = np.array([[11, 7, 3],
+ [10, 6, 2],
+ [9, 5, 1],
+ [8, 4, 0], ], dtype=np.uint8)
+
+a_zero_point = np.array([12], dtype=np.uint8)
+
+B = np.array([[1, 4],
+ [2, 5],
+ [3, 6], ], dtype=np.uint8)
+
+b_zero_point = np.array([0], dtype=np.uint8)
+
+output = np.array([[-38, -83],
+ [-44, -98],
+ [-50, -113],
+ [-56, -128], ], dtype=np.int32)
+
+expect(node, inputs=[A, B, a_zero_point, b_zero_point], outputs=[output],
+ name='test_matmulinteger')
+```
+
+
+
+
### **Max**
Element-wise max of each of the input tensors (with Numpy-style broadcasting support).
@@ -8222,6 +8316,50 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+qlinearconv
+
+```python
+node = onnx.helper.make_node('QLinearConv',
+ inputs=['x', 'x_scale', 'x_zero_point', 'w', 'w_scale', 'w_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+x = np.array([[255, 174, 162, 25, 203, 168, 58],
+ [15, 59, 237, 95, 129, 0, 64],
+ [56, 242, 153, 221, 168, 12, 166],
+ [232, 178, 186, 195, 237, 162, 237],
+ [188, 39, 124, 77, 80, 102, 43],
+ [127, 230, 21, 83, 41, 40, 134],
+ [255, 154, 92, 141, 42, 148, 247], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+x_scale = np.array([0.00369204697], dtype=np.float32)
+x_zero_point = np.array([132], dtype=np.uint8)
+
+w = np.array([0], dtype=np.uint8).reshape((1, 1, 1, 1))
+
+w_scale = np.array([0.00172794575], dtype=np.float32)
+w_zero_point = np.array([255], dtype=np.uint8)
+
+y_scale = np.array([0.00162681262], dtype=np.float32)
+y_zero_point = np.array([123], dtype=np.uint8)
+
+output = np.array([[0, 81, 93, 230, 52, 87, 197],
+ [240, 196, 18, 160, 126, 255, 191],
+ [199, 13, 102, 34, 87, 243, 89],
+ [23, 77, 69, 60, 18, 93, 18],
+ [67, 216, 131, 178, 175, 153, 212],
+ [128, 25, 234, 172, 214, 215, 121],
+ [0, 101, 163, 114, 213, 107, 8], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+expect(node, inputs=[x, x_scale, x_zero_point, w, w_scale, w_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearconv')
+```
+
+
+
+
### **QLinearMatMul**
Matrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html.
@@ -8277,6 +8415,76 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+qlinearmatmul
+
+```python
+node = onnx.helper.make_node('QLinearMatMul',
+ inputs=['a', 'a_scale', 'a_zero_point', 'b', 'b_scale', 'b_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+#2D
+a = np.array([[208, 236, 0, 238],
+ [3, 214, 255, 29], ], dtype=np.uint8)
+
+a_scale = np.array([0.0066], dtype=np.float32)
+a_zero_point = np.array([113], dtype=np.uint8)
+
+b = np.array([[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]], dtype=np.uint8)
+
+b_scale = np.array([0.00705], dtype=np.float32)
+b_zero_point = np.array([114], dtype=np.uint8)
+
+y_scale = np.array([0.0107], dtype=np.float32)
+y_zero_point = np.array([118], dtype=np.uint8)
+
+output = np.array([[168, 115, 255],
+ [1, 66, 151], ], dtype=np.uint8)
+
+expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_2D')
+
+#3D
+a = np.array([[[208, 236, 0, 238],
+ [3, 214, 255, 29]],
+ [[208, 236, 0, 238],
+ [3, 214, 255, 29]]], dtype=np.uint8)
+
+a_scale = np.array([0.0066], dtype=np.float32)
+a_zero_point = np.array([113], dtype=np.uint8)
+
+b = np.array([[[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]],
+ [[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]]], dtype=np.uint8)
+
+b_scale = np.array([0.00705], dtype=np.float32)
+b_zero_point = np.array([114], dtype=np.uint8)
+
+y_scale = np.array([0.0107], dtype=np.float32)
+y_zero_point = np.array([118], dtype=np.uint8)
+
+output = np.array([[[168, 115, 255],
+ [1, 66, 151]],
+ [[168, 115, 255],
+ [1, 66, 151]]], dtype=np.uint8)
+
+expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_3D')
+```
+
+
+
+
### **QuantizeLinear**
The linear per-tensor/layer quantization operator. It consumes a high precision tensor, a scale, a zero point to compute the low precision / quantized tensor.
@@ -8315,6 +8523,28 @@ This version of the operator has been available since version 10 of the default
+#### Examples
+
+
+quantizelinear
+
+```python
+node = onnx.helper.make_node('QuantizeLinear',
+ inputs=['x', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+x = np.array([0, 2, 3, 1000, -254, -1000]).astype(np.float32)
+y_scale = np.array([2], dtype=np.float32)
+y_zero_point = np.array([128], dtype=np.uint8)
+y = np.array([128, 129, 130, 255, 1, 0]).astype(np.uint8)
+
+expect(node, inputs=[x, y_scale, y_zero_point], outputs=[y],
+ name='test_quantizelinear')
+```
+
+
+
+
### **RNN**
Computes an one-layer simple RNN. This operator is usually supported
diff --git a/docs/TestCoverage.md b/docs/TestCoverage.md
index 365d40d2c3b..b95aa62c0de 100644
--- a/docs/TestCoverage.md
+++ b/docs/TestCoverage.md
@@ -5,7 +5,7 @@
* [Overall Test Coverage](#overall-test-coverage)
# Node Test Coverage
## Summary
-Node tests have covered 115/128 (89.84%, 5 generators excluded) common operators.
+Node tests have covered 121/128 (94.53%, 5 generators excluded) common operators.
Node tests have covered 0/0 (N/A) experimental operators.
@@ -1379,6 +1379,42 @@ expect(node_with_asymmetric_padding, inputs=[x, W], outputs=[y_with_asymmetric_p
+### ConvInteger
+There are 1 test cases, listed as following:
+
+convinteger
+
+```python
+
+x = np.array([2, 3, 4, 5, 6, 7, 8, 9, 10]).astype(np.uint8).reshape((1, 1, 3, 3))
+x_zero_point = np.array([1]).astype(np.uint8)
+w = np.array([1, 1, 1, 1]).astype(np.uint8).reshape((1, 1, 2, 2))
+
+y = np.array([12, 16, 24, 28]).astype(np.int32).reshape(1, 1, 2, 2)
+
+# ConvInteger without padding
+convinteger_node = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'])
+
+expect(convinteger_node, inputs=[x, w, x_zero_point], outputs=[y],
+ name='test_basic_convinteger')
+
+# ConvInteger with padding
+y_with_padding = np.array([1, 3, 5, 3, 5, 12, 16, 9, 11, 24, 28, 15, 7, 15, 17, 9]).astype(np.int32).reshape((1, 1, 4, 4))
+
+convinteger_node_with_padding = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'],
+ pads=[1, 1, 1, 1],)
+
+expect(convinteger_node_with_padding, inputs=[x, w, x_zero_point], outputs=[y_with_padding],
+ name='test_convinteger_with_padding')
+```
+
+
+
+
### ConvTranspose
There are 6 test cases, listed as following:
@@ -1775,6 +1811,29 @@ expect(node, inputs=[x], outputs=[y],
+### DequantizeLinear
+There are 1 test cases, listed as following:
+
+dequantizelinear
+
+```python
+node = onnx.helper.make_node('DequantizeLinear',
+ inputs=['x', 'x_scale', 'x_zero_point'],
+ outputs=['y'],)
+
+# scalar zero point and scale
+x = np.array([0, 3, 128, 255]).astype(np.uint8)
+x_scale = np.array([2], dtype=np.float32)
+x_zero_point = np.array([128], dtype=np.uint8)
+y = np.array([-256, -250, 0, 254], dtype=np.float32)
+
+expect(node, inputs=[x, x_scale, x_zero_point], outputs=[y],
+ name='test_dequantizelinear')
+```
+
+
+
+
### Div
There are 2 test cases, listed as following:
@@ -3156,6 +3215,41 @@ expect(node, inputs=[a, b], outputs=[c],
+### MatMulInteger
+There are 1 test cases, listed as following:
+
+matmulinteger
+
+```python
+node = onnx.helper.make_node('MatMulInteger',
+ inputs=['A', 'B', 'a_zero_point', 'b_zero_point'],
+ outputs=['Y'],)
+
+A = np.array([[11, 7, 3],
+ [10, 6, 2],
+ [9, 5, 1],
+ [8, 4, 0], ], dtype=np.uint8)
+
+a_zero_point = np.array([12], dtype=np.uint8)
+
+B = np.array([[1, 4],
+ [2, 5],
+ [3, 6], ], dtype=np.uint8)
+
+b_zero_point = np.array([0], dtype=np.uint8)
+
+output = np.array([[-38, -83],
+ [-44, -98],
+ [-50, -113],
+ [-56, -128], ], dtype=np.int32)
+
+expect(node, inputs=[A, B, a_zero_point, b_zero_point], outputs=[output],
+ name='test_matmulinteger')
+```
+
+
+
+
### Max
There are 1 test cases, listed as following:
@@ -4208,6 +4302,142 @@ expect(node, inputs=[x, y], outputs=[z],
+### QLinearConv
+There are 1 test cases, listed as following:
+
+qlinearconv
+
+```python
+node = onnx.helper.make_node('QLinearConv',
+ inputs=['x', 'x_scale', 'x_zero_point', 'w', 'w_scale', 'w_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+x = np.array([[255, 174, 162, 25, 203, 168, 58],
+ [15, 59, 237, 95, 129, 0, 64],
+ [56, 242, 153, 221, 168, 12, 166],
+ [232, 178, 186, 195, 237, 162, 237],
+ [188, 39, 124, 77, 80, 102, 43],
+ [127, 230, 21, 83, 41, 40, 134],
+ [255, 154, 92, 141, 42, 148, 247], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+x_scale = np.array([0.00369204697], dtype=np.float32)
+x_zero_point = np.array([132], dtype=np.uint8)
+
+w = np.array([0], dtype=np.uint8).reshape((1, 1, 1, 1))
+
+w_scale = np.array([0.00172794575], dtype=np.float32)
+w_zero_point = np.array([255], dtype=np.uint8)
+
+y_scale = np.array([0.00162681262], dtype=np.float32)
+y_zero_point = np.array([123], dtype=np.uint8)
+
+output = np.array([[0, 81, 93, 230, 52, 87, 197],
+ [240, 196, 18, 160, 126, 255, 191],
+ [199, 13, 102, 34, 87, 243, 89],
+ [23, 77, 69, 60, 18, 93, 18],
+ [67, 216, 131, 178, 175, 153, 212],
+ [128, 25, 234, 172, 214, 215, 121],
+ [0, 101, 163, 114, 213, 107, 8], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+expect(node, inputs=[x, x_scale, x_zero_point, w, w_scale, w_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearconv')
+```
+
+
+
+
+### QLinearMatMul
+There are 1 test cases, listed as following:
+
+qlinearmatmul
+
+```python
+node = onnx.helper.make_node('QLinearMatMul',
+ inputs=['a', 'a_scale', 'a_zero_point', 'b', 'b_scale', 'b_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+#2D
+a = np.array([[208, 236, 0, 238],
+ [3, 214, 255, 29], ], dtype=np.uint8)
+
+a_scale = np.array([0.0066], dtype=np.float32)
+a_zero_point = np.array([113], dtype=np.uint8)
+
+b = np.array([[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]], dtype=np.uint8)
+
+b_scale = np.array([0.00705], dtype=np.float32)
+b_zero_point = np.array([114], dtype=np.uint8)
+
+y_scale = np.array([0.0107], dtype=np.float32)
+y_zero_point = np.array([118], dtype=np.uint8)
+
+output = np.array([[168, 115, 255],
+ [1, 66, 151], ], dtype=np.uint8)
+
+expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_2D')
+
+#3D
+a = np.array([[[208, 236, 0, 238],
+ [3, 214, 255, 29]],
+ [[208, 236, 0, 238],
+ [3, 214, 255, 29]]], dtype=np.uint8)
+
+a_scale = np.array([0.0066], dtype=np.float32)
+a_zero_point = np.array([113], dtype=np.uint8)
+
+b = np.array([[[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]],
+ [[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]]], dtype=np.uint8)
+
+b_scale = np.array([0.00705], dtype=np.float32)
+b_zero_point = np.array([114], dtype=np.uint8)
+
+y_scale = np.array([0.0107], dtype=np.float32)
+y_zero_point = np.array([118], dtype=np.uint8)
+
+output = np.array([[[168, 115, 255],
+ [1, 66, 151]],
+ [[168, 115, 255],
+ [1, 66, 151]]], dtype=np.uint8)
+
+expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_3D')
+```
+
+
+
+
+### QuantizeLinear
+There are 1 test cases, listed as following:
+
+quantizelinear
+
+```python
+node = onnx.helper.make_node('QuantizeLinear',
+ inputs=['x', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+x = np.array([0, 2, 3, 1000, -254, -1000]).astype(np.float32)
+y_scale = np.array([2], dtype=np.float32)
+y_zero_point = np.array([128], dtype=np.uint8)
+y = np.array([128, 129, 130, 255, 1, 0]).astype(np.uint8)
+
+expect(node, inputs=[x, y_scale, y_zero_point], outputs=[y],
+ name='test_quantizelinear')
+```
+
+
+
+
### RNN
There are 3 test cases, listed as following:
@@ -7115,12 +7345,6 @@ expect(node, inputs=[x, y], outputs=[z],
## 💔No Cover Common Operators
-### ConvInteger (call for test cases)
-
-
-### DequantizeLinear (call for test cases)
-
-
### GlobalLpPool (call for test cases)
@@ -7136,24 +7360,12 @@ expect(node, inputs=[x, y], outputs=[z],
### LpPool (call for test cases)
-### MatMulInteger (call for test cases)
-
-
### MaxRoiPool (call for test cases)
### Multinomial (random generator operator)
-### QLinearConv (call for test cases)
-
-
-### QLinearMatMul (call for test cases)
-
-
-### QuantizeLinear (call for test cases)
-
-
### RandomNormal (random generator operator)
diff --git a/onnx/backend/test/case/node/convinteger.py b/onnx/backend/test/case/node/convinteger.py
new file mode 100644
index 00000000000..58985abbbe0
--- /dev/null
+++ b/onnx/backend/test/case/node/convinteger.py
@@ -0,0 +1,40 @@
+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 ..base import Base
+from . import expect
+
+
+class ConvInteger(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+
+ x = np.array([2, 3, 4, 5, 6, 7, 8, 9, 10]).astype(np.uint8).reshape((1, 1, 3, 3))
+ x_zero_point = np.array([1]).astype(np.uint8)
+ w = np.array([1, 1, 1, 1]).astype(np.uint8).reshape((1, 1, 2, 2))
+
+ y = np.array([12, 16, 24, 28]).astype(np.int32).reshape(1, 1, 2, 2)
+
+ # ConvInteger without padding
+ convinteger_node = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'])
+
+ expect(convinteger_node, inputs=[x, w, x_zero_point], outputs=[y],
+ name='test_basic_convinteger')
+
+ # ConvInteger with padding
+ y_with_padding = np.array([1, 3, 5, 3, 5, 12, 16, 9, 11, 24, 28, 15, 7, 15, 17, 9]).astype(np.int32).reshape((1, 1, 4, 4))
+
+ convinteger_node_with_padding = onnx.helper.make_node('ConvInteger',
+ inputs=['x', 'w', 'x_zero_point'],
+ outputs=['y'],
+ pads=[1, 1, 1, 1],)
+
+ expect(convinteger_node_with_padding, inputs=[x, w, x_zero_point], outputs=[y_with_padding],
+ name='test_convinteger_with_padding')
diff --git a/onnx/backend/test/case/node/dequantizelinear.py b/onnx/backend/test/case/node/dequantizelinear.py
new file mode 100644
index 00000000000..4dde6362e0c
--- /dev/null
+++ b/onnx/backend/test/case/node/dequantizelinear.py
@@ -0,0 +1,27 @@
+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 ..base import Base
+from . import expect
+
+
+class DequantizeLinear(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+ node = onnx.helper.make_node('DequantizeLinear',
+ inputs=['x', 'x_scale', 'x_zero_point'],
+ outputs=['y'],)
+
+ # scalar zero point and scale
+ x = np.array([0, 3, 128, 255]).astype(np.uint8)
+ x_scale = np.array([2], dtype=np.float32)
+ x_zero_point = np.array([128], dtype=np.uint8)
+ y = np.array([-256, -250, 0, 254], dtype=np.float32)
+
+ expect(node, inputs=[x, x_scale, x_zero_point], outputs=[y],
+ name='test_dequantizelinear')
diff --git a/onnx/backend/test/case/node/matmulinteger.py b/onnx/backend/test/case/node/matmulinteger.py
new file mode 100644
index 00000000000..99b8b20e844
--- /dev/null
+++ b/onnx/backend/test/case/node/matmulinteger.py
@@ -0,0 +1,39 @@
+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 ..base import Base
+from . import expect
+
+
+class MatMulInteger(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+ node = onnx.helper.make_node('MatMulInteger',
+ inputs=['A', 'B', 'a_zero_point', 'b_zero_point'],
+ outputs=['Y'],)
+
+ A = np.array([[11, 7, 3],
+ [10, 6, 2],
+ [9, 5, 1],
+ [8, 4, 0], ], dtype=np.uint8)
+
+ a_zero_point = np.array([12], dtype=np.uint8)
+
+ B = np.array([[1, 4],
+ [2, 5],
+ [3, 6], ], dtype=np.uint8)
+
+ b_zero_point = np.array([0], dtype=np.uint8)
+
+ output = np.array([[-38, -83],
+ [-44, -98],
+ [-50, -113],
+ [-56, -128], ], dtype=np.int32)
+
+ expect(node, inputs=[A, B, a_zero_point, b_zero_point], outputs=[output],
+ name='test_matmulinteger')
diff --git a/onnx/backend/test/case/node/qlinearconv.py b/onnx/backend/test/case/node/qlinearconv.py
new file mode 100644
index 00000000000..e860e50cfb7
--- /dev/null
+++ b/onnx/backend/test/case/node/qlinearconv.py
@@ -0,0 +1,48 @@
+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 ..base import Base
+from . import expect
+
+
+class QLinearConv(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+ node = onnx.helper.make_node('QLinearConv',
+ inputs=['x', 'x_scale', 'x_zero_point', 'w', 'w_scale', 'w_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+ x = np.array([[255, 174, 162, 25, 203, 168, 58],
+ [15, 59, 237, 95, 129, 0, 64],
+ [56, 242, 153, 221, 168, 12, 166],
+ [232, 178, 186, 195, 237, 162, 237],
+ [188, 39, 124, 77, 80, 102, 43],
+ [127, 230, 21, 83, 41, 40, 134],
+ [255, 154, 92, 141, 42, 148, 247], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+ x_scale = np.array([0.00369204697], dtype=np.float32)
+ x_zero_point = np.array([132], dtype=np.uint8)
+
+ w = np.array([0], dtype=np.uint8).reshape((1, 1, 1, 1))
+
+ w_scale = np.array([0.00172794575], dtype=np.float32)
+ w_zero_point = np.array([255], dtype=np.uint8)
+
+ y_scale = np.array([0.00162681262], dtype=np.float32)
+ y_zero_point = np.array([123], dtype=np.uint8)
+
+ output = np.array([[0, 81, 93, 230, 52, 87, 197],
+ [240, 196, 18, 160, 126, 255, 191],
+ [199, 13, 102, 34, 87, 243, 89],
+ [23, 77, 69, 60, 18, 93, 18],
+ [67, 216, 131, 178, 175, 153, 212],
+ [128, 25, 234, 172, 214, 215, 121],
+ [0, 101, 163, 114, 213, 107, 8], ], dtype=np.uint8).reshape((1, 1, 7, 7))
+
+ expect(node, inputs=[x, x_scale, x_zero_point, w, w_scale, w_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearconv')
diff --git a/onnx/backend/test/case/node/qlinearmatmul.py b/onnx/backend/test/case/node/qlinearmatmul.py
new file mode 100644
index 00000000000..b58418c7da1
--- /dev/null
+++ b/onnx/backend/test/case/node/qlinearmatmul.py
@@ -0,0 +1,74 @@
+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 ..base import Base
+from . import expect
+
+
+class QLinearMatMul(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+ node = onnx.helper.make_node('QLinearMatMul',
+ inputs=['a', 'a_scale', 'a_zero_point', 'b', 'b_scale', 'b_zero_point', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+ #2D
+ a = np.array([[208, 236, 0, 238],
+ [3, 214, 255, 29], ], dtype=np.uint8)
+
+ a_scale = np.array([0.0066], dtype=np.float32)
+ a_zero_point = np.array([113], dtype=np.uint8)
+
+ b = np.array([[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]], dtype=np.uint8)
+
+ b_scale = np.array([0.00705], dtype=np.float32)
+ b_zero_point = np.array([114], dtype=np.uint8)
+
+ y_scale = np.array([0.0107], dtype=np.float32)
+ y_zero_point = np.array([118], dtype=np.uint8)
+
+ output = np.array([[168, 115, 255],
+ [1, 66, 151], ], dtype=np.uint8)
+
+ expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_2D')
+
+ #3D
+ a = np.array([[[208, 236, 0, 238],
+ [3, 214, 255, 29]],
+ [[208, 236, 0, 238],
+ [3, 214, 255, 29]]], dtype=np.uint8)
+
+ a_scale = np.array([0.0066], dtype=np.float32)
+ a_zero_point = np.array([113], dtype=np.uint8)
+
+ b = np.array([[[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]],
+ [[152, 51, 244],
+ [60, 26, 255],
+ [0, 127, 246],
+ [127, 254, 247]]], dtype=np.uint8)
+
+ b_scale = np.array([0.00705], dtype=np.float32)
+ b_zero_point = np.array([114], dtype=np.uint8)
+
+ y_scale = np.array([0.0107], dtype=np.float32)
+ y_zero_point = np.array([118], dtype=np.uint8)
+
+ output = np.array([[[168, 115, 255],
+ [1, 66, 151]],
+ [[168, 115, 255],
+ [1, 66, 151]]], dtype=np.uint8)
+
+ expect(node, inputs=[a, a_scale, a_zero_point, b, b_scale, b_zero_point, y_scale, y_zero_point], outputs=[output],
+ name='test_qlinearmatmul_3D')
diff --git a/onnx/backend/test/case/node/quantizelinear.py b/onnx/backend/test/case/node/quantizelinear.py
new file mode 100644
index 00000000000..8fdfdc0e357
--- /dev/null
+++ b/onnx/backend/test/case/node/quantizelinear.py
@@ -0,0 +1,26 @@
+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 ..base import Base
+from . import expect
+
+
+class QuantizeLinear(Base):
+
+ @staticmethod
+ def export(): # type: () -> None
+ node = onnx.helper.make_node('QuantizeLinear',
+ inputs=['x', 'y_scale', 'y_zero_point'],
+ outputs=['y'],)
+
+ x = np.array([0, 2, 3, 1000, -254, -1000]).astype(np.float32)
+ y_scale = np.array([2], dtype=np.float32)
+ y_zero_point = np.array([128], dtype=np.uint8)
+ y = np.array([128, 129, 130, 255, 1, 0]).astype(np.uint8)
+
+ expect(node, inputs=[x, y_scale, y_zero_point], outputs=[y],
+ name='test_quantizelinear')
diff --git a/onnx/backend/test/data/node/test_basic_convinteger/model.onnx b/onnx/backend/test/data/node/test_basic_convinteger/model.onnx
new file mode 100644
index 00000000000..aa2dc867604
--- /dev/null
+++ b/onnx/backend/test/data/node/test_basic_convinteger/model.onnx
@@ -0,0 +1,27 @@
+backend-test:
+$
+x
+w
+x_zero_pointy"ConvIntegertest_basic_convintegerZ
+x
+
+
+
+
+Z
+w
+
+
+
+
+Z
+x_zero_point
+
+
+b
+y
+
+
+
+
+B
diff --git a/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..33cea026337
--- /dev/null
+++ b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_0.pb
@@ -0,0 +1 @@
+BxJ
diff --git a/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..53980d95daf
--- /dev/null
+++ b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+BwJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..2ecc7658422
--- /dev/null
+++ b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Bx_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..f81e5d710a9
Binary files /dev/null and b/onnx/backend/test/data/node/test_basic_convinteger/test_data_set_0/output_0.pb differ
diff --git a/onnx/backend/test/data/node/test_convinteger_with_padding/model.onnx b/onnx/backend/test/data/node/test_convinteger_with_padding/model.onnx
new file mode 100644
index 00000000000..f5d92064b19
--- /dev/null
+++ b/onnx/backend/test/data/node/test_convinteger_with_padding/model.onnx
@@ -0,0 +1,28 @@
+backend-test:
+7
+x
+w
+x_zero_pointy"ConvInteger*
+pads@@@@test_convinteger_with_paddingZ
+x
+
+
+
+
+Z
+w
+
+
+
+
+Z
+x_zero_point
+
+
+b
+y
+
+
+
+
+B
diff --git a/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..33cea026337
--- /dev/null
+++ b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_0.pb
@@ -0,0 +1 @@
+BxJ
diff --git a/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..53980d95daf
--- /dev/null
+++ b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+BwJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..2ecc7658422
--- /dev/null
+++ b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Bx_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..ecfa319732b
Binary files /dev/null and b/onnx/backend/test/data/node/test_convinteger_with_padding/test_data_set_0/output_0.pb differ
diff --git a/onnx/backend/test/data/node/test_dequantizelinear/model.onnx b/onnx/backend/test/data/node/test_dequantizelinear/model.onnx
new file mode 100644
index 00000000000..2215049f116
--- /dev/null
+++ b/onnx/backend/test/data/node/test_dequantizelinear/model.onnx
@@ -0,0 +1,21 @@
+backend-test:
+/
+x
+x_scale
+x_zero_pointy"DequantizeLineartest_dequantizelinearZ
+x
+
+
+Z
+x_scale
+
+
+Z
+x_zero_point
+
+
+b
+y
+
+
+B
diff --git a/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..0b43ff76d21
Binary files /dev/null and b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..9efa6c0c172
Binary files /dev/null and b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_1.pb differ
diff --git a/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..dcfed4bc8f3
--- /dev/null
+++ b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Bx_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..f248d253c53
Binary files /dev/null and b/onnx/backend/test/data/node/test_dequantizelinear/test_data_set_0/output_0.pb differ
diff --git a/onnx/backend/test/data/node/test_matmulinteger/model.onnx b/onnx/backend/test/data/node/test_matmulinteger/model.onnx
new file mode 100644
index 00000000000..227661bbb82
--- /dev/null
+++ b/onnx/backend/test/data/node/test_matmulinteger/model.onnx
@@ -0,0 +1,26 @@
+backend-test:
+4
+A
+B
+a_zero_point
+b_zero_pointY"
MatMulIntegertest_matmulintegerZ
+A
+
+
+Z
+B
+
+
+Z
+a_zero_point
+
+
+Z
+b_zero_point
+
+
+b
+Y
+
+
+B
diff --git a/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..abf965a2060
Binary files /dev/null and b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..997a12d3427
--- /dev/null
+++ b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+BBJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..7910a57febb
--- /dev/null
+++ b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Ba_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_3.pb b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_3.pb
new file mode 100644
index 00000000000..b163ba9bcbb
Binary files /dev/null and b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/input_3.pb differ
diff --git a/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..ad39e94c6cb
--- /dev/null
+++ b/onnx/backend/test/data/node/test_matmulinteger/test_data_set_0/output_0.pb
@@ -0,0 +1 @@
+BYJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/model.onnx b/onnx/backend/test/data/node/test_qlinearconv/model.onnx
new file mode 100644
index 00000000000..029cab53684
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/model.onnx
@@ -0,0 +1,52 @@
+backend-test:
+[
+x
+x_scale
+x_zero_point
+w
+w_scale
+w_zero_point
+y_scale
+y_zero_pointy"QLinearConvtest_qlinearconvZ
+x
+
+
+
+
+Z
+x_scale
+
+
+Z
+x_zero_point
+
+
+Z
+w
+
+
+
+
+Z
+w_scale
+
+
+Z
+w_zero_point
+
+
+Z
+y_scale
+
+
+Z
+y_zero_point
+
+
+b
+y
+
+
+
+
+B
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..8e5c824a88d
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..f3d5f89061f
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+Bx_scaleJEq;
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..91742d5a205
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Bx_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_3.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_3.pb
new file mode 100644
index 00000000000..8f7a61c8d4f
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_3.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_4.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_4.pb
new file mode 100644
index 00000000000..f4956fc974c
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_4.pb
@@ -0,0 +1 @@
+Bw_scaleJ=|:
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_5.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_5.pb
new file mode 100644
index 00000000000..4af6cdbaa1b
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_5.pb
@@ -0,0 +1 @@
+Bw_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_6.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_6.pb
new file mode 100644
index 00000000000..e1fab2032e4
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_6.pb
@@ -0,0 +1 @@
+By_scaleJ::
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_7.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_7.pb
new file mode 100644
index 00000000000..3912a63a723
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/input_7.pb
@@ -0,0 +1 @@
+By_zero_pointJ{
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..8e5199790de
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearconv/test_data_set_0/output_0.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/model.onnx b/onnx/backend/test/data/node/test_qlinearmatmul_2D/model.onnx
new file mode 100644
index 00000000000..61abcb4abc8
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/model.onnx
@@ -0,0 +1,46 @@
+backend-test:
+]
+a
+a_scale
+a_zero_point
+b
+b_scale
+b_zero_point
+y_scale
+y_zero_pointy"
QLinearMatMultest_qlinearmatmul_2DZ
+a
+
+
+Z
+a_scale
+
+
+Z
+a_zero_point
+
+
+Z
+b
+
+
+Z
+b_scale
+
+
+Z
+b_zero_point
+
+
+Z
+y_scale
+
+
+Z
+y_zero_point
+
+
+b
+y
+
+
+B
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..eb9265d86e9
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..53c894041c8
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+Ba_scaleJD;
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..9cc71b95752
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Ba_zero_pointJq
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_3.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_3.pb
new file mode 100644
index 00000000000..ea04e209a07
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_3.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_4.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_4.pb
new file mode 100644
index 00000000000..e5f59fb92a7
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_4.pb
@@ -0,0 +1 @@
+Bb_scaleJ;
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_5.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_5.pb
new file mode 100644
index 00000000000..db93763b2d4
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_5.pb
@@ -0,0 +1 @@
+Bb_zero_pointJr
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_6.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_6.pb
new file mode 100644
index 00000000000..3128ded3d7b
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_6.pb
@@ -0,0 +1 @@
+By_scaleJO/<
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_7.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_7.pb
new file mode 100644
index 00000000000..521faf834e0
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/input_7.pb
@@ -0,0 +1 @@
+By_zero_pointJv
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..91b23e0abe6
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_2D/test_data_set_0/output_0.pb
@@ -0,0 +1 @@
+ByJsB
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/model.onnx b/onnx/backend/test/data/node/test_qlinearmatmul_3D/model.onnx
new file mode 100644
index 00000000000..7681e9163ce
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/model.onnx
@@ -0,0 +1,49 @@
+backend-test:
+]
+a
+a_scale
+a_zero_point
+b
+b_scale
+b_zero_point
+y_scale
+y_zero_pointy"
QLinearMatMultest_qlinearmatmul_3DZ
+a
+
+
+
+Z
+a_scale
+
+
+Z
+a_zero_point
+
+
+Z
+b
+
+
+
+Z
+b_scale
+
+
+Z
+b_zero_point
+
+
+Z
+y_scale
+
+
+Z
+y_zero_point
+
+
+b
+y
+
+
+
+B
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..6e19bf745cf
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..53c894041c8
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_1.pb
@@ -0,0 +1 @@
+Ba_scaleJD;
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..9cc71b95752
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+Ba_zero_pointJq
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_3.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_3.pb
new file mode 100644
index 00000000000..4ff4f2ea7b6
Binary files /dev/null and b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_3.pb differ
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_4.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_4.pb
new file mode 100644
index 00000000000..e5f59fb92a7
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_4.pb
@@ -0,0 +1 @@
+Bb_scaleJ;
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_5.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_5.pb
new file mode 100644
index 00000000000..db93763b2d4
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_5.pb
@@ -0,0 +1 @@
+Bb_zero_pointJr
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_6.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_6.pb
new file mode 100644
index 00000000000..3128ded3d7b
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_6.pb
@@ -0,0 +1 @@
+By_scaleJO/<
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_7.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_7.pb
new file mode 100644
index 00000000000..521faf834e0
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/input_7.pb
@@ -0,0 +1 @@
+By_zero_pointJv
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..e69395115ec
--- /dev/null
+++ b/onnx/backend/test/data/node/test_qlinearmatmul_3D/test_data_set_0/output_0.pb
@@ -0,0 +1 @@
+ByJsBsB
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_quantizelinear/model.onnx b/onnx/backend/test/data/node/test_quantizelinear/model.onnx
new file mode 100644
index 00000000000..a601e9fcdc9
--- /dev/null
+++ b/onnx/backend/test/data/node/test_quantizelinear/model.onnx
@@ -0,0 +1,21 @@
+backend-test:
+-
+x
+y_scale
+y_zero_pointy"QuantizeLineartest_quantizelinearZ
+x
+
+
+Z
+y_scale
+
+
+Z
+y_zero_point
+
+
+b
+y
+
+
+B
diff --git a/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_0.pb b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_0.pb
new file mode 100644
index 00000000000..c1a28ac2dc1
Binary files /dev/null and b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_0.pb differ
diff --git a/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_1.pb b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_1.pb
new file mode 100644
index 00000000000..aac5df2f0fa
Binary files /dev/null and b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_1.pb differ
diff --git a/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_2.pb b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_2.pb
new file mode 100644
index 00000000000..b1fa5f9d3f4
--- /dev/null
+++ b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/input_2.pb
@@ -0,0 +1 @@
+By_zero_pointJ
\ No newline at end of file
diff --git a/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/output_0.pb b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/output_0.pb
new file mode 100644
index 00000000000..5703f727f49
Binary files /dev/null and b/onnx/backend/test/data/node/test_quantizelinear/test_data_set_0/output_0.pb differ