5cbd3f29e3
Fuzz / Run fuzz harnesses (${{ github.event_name == 'schedule' && 'nightly' || 'smoke' }}) (push) Has been cancelled
Create Releases / call-mac (push) Has been cancelled
Create Releases / call-linux (push) Has been cancelled
Create Releases / call-sdist (push) Has been cancelled
Create Releases / call-win (push) Has been cancelled
Create Releases / call-pyodide (push) Has been cancelled
Windows_No_Exception_CI / build (x64, 3.10) (push) Has been cancelled
Check URLs / build (push) Has been cancelled
Create Releases / Attest CI build artifacts (push) Has been cancelled
Create Releases / Check for Publish release build to pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Check for Publish release build to test.pypi (rc-candidates) (push) Has been cancelled
Create Releases / Publish release build to test.pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish release build to pypi (push) Has been cancelled
Create Releases / test source distribution (push) Has been cancelled
clang-tidy / clang-tidy (push) Has been cancelled
Lint / Validate SBOM (push) Has been cancelled
Lint / Enforce style (push) Has been cancelled
CI / Test windows-2022, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=1, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=1, onnx_ml=1, autogen=1 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=0, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
Pixi CI / Install and lint (ubuntu-24.04-arm) (push) Has been cancelled
Pixi CI / Install and lint (windows-2022) (push) Has been cancelled
Pixi CI / Xcode generator build (push) Has been cancelled
Pixi CI / Install and test (macos-latest, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, default) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, default) (push) Has been cancelled
Pixi CI / Install and test (macos-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, oldies) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Copilot Setup Steps / copilot-setup-steps (push) Has been cancelled
Generate and publish ONNX docs / build (push) Has been cancelled
Generate and publish ONNX docs / deploy (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
# Copyright (c) ONNX Project Contributors
|
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
import pytest
|
|
from shape_inference_test import TestShapeInferenceHelper
|
|
|
|
import onnx
|
|
import onnx.helper
|
|
import onnx.parser
|
|
import onnx.shape_inference
|
|
from onnx import AttributeProto, TypeProto
|
|
|
|
if TYPE_CHECKING:
|
|
from collections.abc import Sequence
|
|
|
|
float_type_ = onnx.helper.make_tensor_type_proto(1, None)
|
|
uint8_type_ = onnx.helper.make_tensor_type_proto(2, None)
|
|
int8_type_ = onnx.helper.make_tensor_type_proto(3, None)
|
|
int32_type_ = onnx.helper.make_tensor_type_proto(6, None)
|
|
float16_type_ = onnx.helper.make_tensor_type_proto(10, None)
|
|
no_type_ = TypeProto()
|
|
|
|
|
|
class TestFunctionInference(TestShapeInferenceHelper):
|
|
def _check(
|
|
self,
|
|
function_text: str,
|
|
input_types: Sequence[TypeProto],
|
|
attributes: Sequence[AttributeProto],
|
|
expected_output_types: Sequence[TypeProto],
|
|
):
|
|
function = onnx.parser.parse_function(function_text)
|
|
result = onnx.shape_inference.infer_function_output_types(
|
|
function, input_types, attributes
|
|
)
|
|
assert len(expected_output_types) == len(result)
|
|
for expected, actual in zip(expected_output_types, result, strict=True):
|
|
self._compare_value_infos(expected, actual)
|
|
|
|
def _check_fails(
|
|
self,
|
|
function_text: str,
|
|
input_types: Sequence[TypeProto],
|
|
attributes: Sequence[AttributeProto],
|
|
):
|
|
function = onnx.parser.parse_function(function_text)
|
|
|
|
def invoke_inference():
|
|
onnx.shape_inference.infer_function_output_types(
|
|
function, input_types, attributes
|
|
)
|
|
|
|
with pytest.raises(onnx.shape_inference.InferenceError):
|
|
invoke_inference()
|
|
|
|
def test_fi_basic(self):
|
|
code = """
|
|
<opset_import: [ "" : 18 ], domain: "local">
|
|
f (y, z) => (w) {
|
|
x = Add(y, z)
|
|
w = Mul(x, y)
|
|
}
|
|
"""
|
|
self._check(code, [float_type_, float_type_], [], [float_type_])
|
|
self._check(code, [int32_type_, int32_type_], [], [int32_type_])
|
|
self._check_fails(code, [float_type_, int32_type_], [])
|
|
|
|
def test_fi_attribute(self):
|
|
code = """
|
|
<opset_import: [ "" : 18 ], domain: "local">
|
|
CastTo <dtype> (x) => (y) {
|
|
y = Cast <to : int = @dtype> (x)
|
|
}
|
|
"""
|
|
dtype_6 = onnx.helper.make_attribute("dtype", 6)
|
|
self._check(code, [float_type_], [dtype_6], [int32_type_])
|
|
|
|
dtype_10 = onnx.helper.make_attribute("dtype", 10)
|
|
self._check(code, [float_type_], [dtype_10], [float16_type_])
|
|
|
|
def test_fi_optional_input(self):
|
|
code = """
|
|
<opset_import: [ "" : 18 ], domain: "local">
|
|
DoReduce (x, axes) => (y) {
|
|
y = ReduceMax (x, axes)
|
|
}
|
|
"""
|
|
# We can omit the type for a missing trailing optional parameter
|
|
self._check(code, [float_type_], [], [float_type_])
|
|
# Or, we can pass in a default-value of TypeProto() for a missing optional parameter
|
|
self._check(code, [float_type_, no_type_], [], [float_type_])
|
|
|
|
code = """
|
|
<opset_import: [ "" : 18 ], domain: "local">
|
|
Quantize (x, scale, zero_point) => (y) {
|
|
y = QuantizeLinear (x, scale, zero_point)
|
|
}
|
|
"""
|
|
# If the optional third parameter is specified, it determines the output type.
|
|
self._check(code, [float_type_, float_type_, int8_type_], [], [int8_type_])
|
|
self._check(code, [float_type_, float_type_, uint8_type_], [], [uint8_type_])
|
|
# If the optional third parameter is omitted, the output type is uint8 (default).
|
|
self._check(code, [float_type_, float_type_, no_type_], [], [uint8_type_])
|
|
|
|
code = """
|
|
<opset_import: [ "" : 18 ], domain: "local">
|
|
DoClip (x, min, max) => (y) {
|
|
y = Clip (x, min, max)
|
|
}
|
|
"""
|
|
# A test-case with a non-trailing missing optional parameter
|
|
self._check(code, [float_type_, no_type_, float_type_], [], [float_type_])
|
|
|
|
# A failing test-case with a non-trailing missing optional parameter
|
|
self._check_fails(code, [float_type_, no_type_, int8_type_], [])
|