QLinearMatMul#

QLinearMatMul - 10#

Version

  • name: QLinearMatMul (GitHub)

  • domain: main

  • since_version: 10

  • function:

  • support_level: SupportType.COMMON

  • shape inference: True

This version of the operator has been available since version 10.

Summary

Inputs

  • a (heterogeneous) - T1:

  • a_scale (heterogeneous) - tensor(float):

  • a_zero_point (heterogeneous) - T1:

  • b (heterogeneous) - T2:

  • b_scale (heterogeneous) - tensor(float):

  • b_zero_point (heterogeneous) - T2:

  • y_scale (heterogeneous) - tensor(float):

  • y_zero_point (heterogeneous) - T3:

Outputs

  • y (heterogeneous) - T3:

Type Constraints

  • T1 in ( tensor(int8), tensor(uint8) ): Constrain input a and its zero point data type to 8-bit integer tensor.

  • T2 in ( tensor(int8), tensor(uint8) ): Constrain input b and its zero point data type to 8-bit integer tensor.

  • T3 in ( tensor(int8), tensor(uint8) ): Constrain output y and its zero point data type to 8-bit integer tensor.

Examples

default

import numpy as np
import onnx

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",
)