Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:41:19 +08:00

628 lines
21 KiB
Python

# Copyright (c) ONNX Project Contributors
# SPDX-License-Identifier: Apache-2.0
"""Every class imported in this module defines an implementation of
an operator of the main domain. Any class name uses `_` to specify a
version defined in a specific opset. The class name without `_`
defines the current implementation. If an operator has no class
with `_`, it means the implementation is valid for every opset.
The operator may have been updated to support more types but that
did not change the implementation.
"""
from __future__ import annotations
__all__ = [
"load_op",
"Abs",
"Acos",
"Acosh",
"Add",
"AffineGrid",
"And",
"ArgMax_1",
"ArgMax_12",
"ArgMin_1",
"ArgMin_12",
"Asin",
"Asinh",
"Atan",
"Atanh",
"Attention",
"AttributeHasValue",
"AveragePool_1",
"AveragePool_7",
"AveragePool_11",
"AveragePool_19",
"BatchNormalization_6",
"BatchNormalization_9",
"BatchNormalization_14",
"Bernoulli",
"BitCast",
"BitShift",
"BitwiseAnd",
"BitwiseNot",
"BitwiseOr",
"BitwiseXor",
"BlackmanWindow",
"Cast_1",
"Cast_19",
"Cast_24",
"CastLike_15",
"CastLike_19",
"CausalConvWithState",
"Ceil",
"Celu",
"CenterCropPad",
"Clip_6",
"Clip_11",
"Col2Im",
"Compress",
"Concat",
"ConcatFromSequence",
"Constant_1",
"Constant_9",
"Constant_11",
"Constant_12",
"ConstantOfShape",
"Conv",
"ConvInteger",
"ConvTranspose",
"Cos",
"Cosh",
"CumProd",
"CumSum",
"DeformConv",
"DepthToSpace",
"DequantizeLinear_19",
"DequantizeLinear_21",
"DequantizeLinear_23",
"DequantizeLinear_25",
"Det",
"DFT_17",
"DFT_20",
"Div",
"Dropout_7",
"Dropout_12",
"DynamicQuantizeLinear",
"Einsum",
"Elu",
"Equal",
"Erf",
"Exp",
"Expand",
"EyeLike",
"Flatten",
"Floor",
"Gather",
"GatherElements",
"GatherND",
"Gemm_6",
"Gemm_7",
"GlobalAveragePool",
"GlobalMaxPool",
"Greater",
"GreaterOrEqual",
"GridSample",
"GRU",
"HammingWindow",
"HannWindow",
"HardSigmoid",
"Hardmax",
"Identity",
"If",
"ImageDecoder",
"InstanceNormalization",
"IsInf",
"IsNaN",
"LayerNormalization",
"LeakyRelu",
"Less",
"LessOrEqual",
"LinearAttention",
"Log",
"LogSoftmax",
"Loop",
"LpNormalization",
"LpPool",
"LRN",
"LSTM",
"MatMul",
"MatMulInteger",
"Max",
"MaxPool",
"MaxUnpool",
"Mean",
"MelWeightMatrix",
"Min",
"Mod",
"Mul",
"Neg",
"NegativeLogLikelihoodLoss",
"NonMaxSuppression",
"NonZero",
"Not",
"OneHot",
"Optional",
"OptionalGetElement",
"OptionalHasElement",
"Or",
"Pad_1",
"Pad_2",
"Pad_11",
"Pad_18",
"Pow",
"PRelu",
"QLinearConv",
"QLinearMatMul",
"QuantizeLinear_10",
"QuantizeLinear_19",
"QuantizeLinear_21",
"QuantizeLinear_23",
"QuantizeLinear_25",
"RandomNormal",
"RandomNormalLike",
"RandomUniform",
"RandomUniformLike",
"Range",
"Reciprocal",
"ReduceL1_1",
"ReduceL1_18",
"ReduceL2_1",
"ReduceL2_18",
"ReduceLogSum_1",
"ReduceLogSum_18",
"ReduceLogSumExp_1",
"ReduceLogSumExp_18",
"ReduceMax_1",
"ReduceMax_18",
"ReduceMean_1",
"ReduceMean_18",
"ReduceMin_1",
"ReduceMin_18",
"ReduceProd_1",
"ReduceProd_18",
"ReduceSum_1",
"ReduceSum_13",
"ReduceSumSquare_1",
"ReduceSumSquare_18",
"RegexFullMatch",
"Relu",
"Reshape_5",
"Reshape_14",
"Resize",
"ReverseSequence",
"RMSNormalization",
"RNN_7",
"RNN_14",
"RoiAlign",
"RotaryEmbedding",
"Round",
"Scan",
"ScatterElements",
"ScatterND",
"Selu",
"SequenceAt",
"SequenceConstruct",
"SequenceEmpty",
"SequenceErase",
"SequenceInsert",
"SequenceLength",
"SequenceMap",
"Shape_1",
"Shape_15",
"Shrink",
"Sigmoid",
"Sign",
"Sin",
"Sinh",
"Size",
"Slice_1",
"Slice_10",
"Softmax",
"SoftmaxCrossEntropyLoss",
"Softplus",
"Softsign",
"Swish",
"SpaceToDepth",
"Split_2",
"Split_11",
"Split_13",
"Split_18",
"SplitToSequence",
"Sqrt",
"Squeeze_1",
"Squeeze_11",
"Squeeze_13",
"STFT",
"StringConcat",
"StringNormalizer",
"StringSplit",
"Sub",
"Sum",
"Tan",
"Tanh",
"TensorScatter",
"TfIdfVectorizer",
"ThresholdedRelu",
"Tile",
"TopK_1",
"TopK_10",
"TopK_11",
"Transpose",
"Trilu",
"Unique",
"Unsqueeze_1",
"Unsqueeze_11",
"Unsqueeze_13",
"Upsample",
"Where",
"Xor",
]
import textwrap
from typing import Any
from onnx import FunctionProto, NodeProto, TypeProto
from onnx.defs import get_schema, onnx_opset_version
from onnx.onnx_cpp2py_export.defs import SchemaError
from onnx.reference.op_run import (
OpFunction,
OpRun,
RuntimeContextError,
RuntimeImplementationError,
)
from onnx.reference.ops._helpers import build_registered_operators_any_domain
from onnx.reference.ops.op_abs import Abs
from onnx.reference.ops.op_acos import Acos
from onnx.reference.ops.op_acosh import Acosh
from onnx.reference.ops.op_add import Add
from onnx.reference.ops.op_affine_grid import AffineGrid
from onnx.reference.ops.op_and import And
from onnx.reference.ops.op_argmax import ArgMax_1, ArgMax_12
from onnx.reference.ops.op_argmin import ArgMin_1, ArgMin_12
from onnx.reference.ops.op_asin import Asin
from onnx.reference.ops.op_asinh import Asinh
from onnx.reference.ops.op_atan import Atan
from onnx.reference.ops.op_atanh import Atanh
from onnx.reference.ops.op_attention import Attention
from onnx.reference.ops.op_attribute_has_value import AttributeHasValue
from onnx.reference.ops.op_average_pool import (
AveragePool_1,
AveragePool_7,
AveragePool_11,
AveragePool_19,
)
from onnx.reference.ops.op_batch_normalization import (
BatchNormalization_6,
BatchNormalization_9,
BatchNormalization_14,
)
from onnx.reference.ops.op_bernoulli import Bernoulli
from onnx.reference.ops.op_bitcast import BitCast
from onnx.reference.ops.op_bitshift import BitShift
from onnx.reference.ops.op_bitwise_and import BitwiseAnd
from onnx.reference.ops.op_bitwise_not import BitwiseNot
from onnx.reference.ops.op_bitwise_or import BitwiseOr
from onnx.reference.ops.op_bitwise_xor import BitwiseXor
from onnx.reference.ops.op_blackman_window import BlackmanWindow
from onnx.reference.ops.op_cast import Cast_1, Cast_19, Cast_24
from onnx.reference.ops.op_cast_like import CastLike_15, CastLike_19
from onnx.reference.ops.op_causal_conv_with_state import CausalConvWithState
from onnx.reference.ops.op_ceil import Ceil
from onnx.reference.ops.op_celu import Celu
from onnx.reference.ops.op_center_crop_pad import CenterCropPad
from onnx.reference.ops.op_clip import Clip_6, Clip_11
from onnx.reference.ops.op_col2im import Col2Im
from onnx.reference.ops.op_compress import Compress
from onnx.reference.ops.op_concat import Concat
from onnx.reference.ops.op_concat_from_sequence import ConcatFromSequence
from onnx.reference.ops.op_constant import (
Constant_1,
Constant_9,
Constant_11,
Constant_12,
)
from onnx.reference.ops.op_constant_of_shape import ConstantOfShape
from onnx.reference.ops.op_conv import Conv
from onnx.reference.ops.op_conv_integer import ConvInteger
from onnx.reference.ops.op_conv_transpose import ConvTranspose
from onnx.reference.ops.op_cos import Cos
from onnx.reference.ops.op_cosh import Cosh
from onnx.reference.ops.op_cum_prod import CumProd
from onnx.reference.ops.op_cum_sum import CumSum
from onnx.reference.ops.op_deform_conv import DeformConv
from onnx.reference.ops.op_depth_to_space import DepthToSpace
from onnx.reference.ops.op_dequantize_linear import (
DequantizeLinear_19,
DequantizeLinear_21,
DequantizeLinear_23,
DequantizeLinear_25,
)
from onnx.reference.ops.op_det import Det
from onnx.reference.ops.op_dft import DFT_17, DFT_20
from onnx.reference.ops.op_div import Div
from onnx.reference.ops.op_dropout import Dropout_7, Dropout_12
from onnx.reference.ops.op_dynamic_quantize_linear import DynamicQuantizeLinear
from onnx.reference.ops.op_einsum import Einsum
from onnx.reference.ops.op_elu import Elu
from onnx.reference.ops.op_equal import Equal
from onnx.reference.ops.op_erf import Erf
from onnx.reference.ops.op_exp import Exp
from onnx.reference.ops.op_expand import Expand
from onnx.reference.ops.op_eyelike import EyeLike
from onnx.reference.ops.op_flatten import Flatten
from onnx.reference.ops.op_floor import Floor
from onnx.reference.ops.op_gather import Gather
from onnx.reference.ops.op_gather_elements import GatherElements
from onnx.reference.ops.op_gathernd import GatherND
from onnx.reference.ops.op_gemm import Gemm_6, Gemm_7
from onnx.reference.ops.op_global_average_pool import GlobalAveragePool
from onnx.reference.ops.op_global_max_pool import GlobalMaxPool
from onnx.reference.ops.op_greater import Greater
from onnx.reference.ops.op_greater_or_equal import GreaterOrEqual
from onnx.reference.ops.op_grid_sample import GridSample
from onnx.reference.ops.op_gru import GRU
from onnx.reference.ops.op_hamming_window import HammingWindow
from onnx.reference.ops.op_hann_window import HannWindow
from onnx.reference.ops.op_hard_sigmoid import HardSigmoid
from onnx.reference.ops.op_hardmax import Hardmax
from onnx.reference.ops.op_identity import Identity
from onnx.reference.ops.op_if import If
from onnx.reference.ops.op_image_decoder import ImageDecoder
from onnx.reference.ops.op_instance_normalization import InstanceNormalization
from onnx.reference.ops.op_isinf import IsInf
from onnx.reference.ops.op_isnan import IsNaN
from onnx.reference.ops.op_layer_normalization import LayerNormalization
from onnx.reference.ops.op_leaky_relu import LeakyRelu
from onnx.reference.ops.op_less import Less
from onnx.reference.ops.op_less_or_equal import LessOrEqual
from onnx.reference.ops.op_linear_attention import LinearAttention
from onnx.reference.ops.op_log import Log
from onnx.reference.ops.op_log_softmax import LogSoftmax
from onnx.reference.ops.op_loop import Loop
from onnx.reference.ops.op_lp_normalization import LpNormalization
from onnx.reference.ops.op_lp_pool import LpPool
from onnx.reference.ops.op_lrn import LRN
from onnx.reference.ops.op_lstm import LSTM
from onnx.reference.ops.op_matmul import MatMul
from onnx.reference.ops.op_matmul_integer import MatMulInteger
from onnx.reference.ops.op_max import Max
from onnx.reference.ops.op_max_pool import MaxPool
from onnx.reference.ops.op_max_unpool import MaxUnpool
from onnx.reference.ops.op_mean import Mean
from onnx.reference.ops.op_mel_weight_matrix import MelWeightMatrix
from onnx.reference.ops.op_min import Min
from onnx.reference.ops.op_mod import Mod
from onnx.reference.ops.op_mul import Mul
from onnx.reference.ops.op_neg import Neg
from onnx.reference.ops.op_negative_log_likelihood_loss import NegativeLogLikelihoodLoss
from onnx.reference.ops.op_non_max_suppression import NonMaxSuppression
from onnx.reference.ops.op_non_zero import NonZero
from onnx.reference.ops.op_not import Not
from onnx.reference.ops.op_one_hot import OneHot
from onnx.reference.ops.op_optional import Optional
from onnx.reference.ops.op_optional_get_element import OptionalGetElement
from onnx.reference.ops.op_optional_has_element import OptionalHasElement
from onnx.reference.ops.op_or import Or
from onnx.reference.ops.op_pad import Pad_1, Pad_2, Pad_11, Pad_18
from onnx.reference.ops.op_pow import Pow
from onnx.reference.ops.op_prelu import PRelu
from onnx.reference.ops.op_qlinear_conv import QLinearConv
from onnx.reference.ops.op_qlinear_matmul import QLinearMatMul
from onnx.reference.ops.op_quantize_linear import (
QuantizeLinear_10,
QuantizeLinear_19,
QuantizeLinear_21,
QuantizeLinear_23,
QuantizeLinear_25,
)
from onnx.reference.ops.op_random_normal import RandomNormal
from onnx.reference.ops.op_random_normal_like import RandomNormalLike
from onnx.reference.ops.op_random_uniform import RandomUniform
from onnx.reference.ops.op_random_uniform_like import RandomUniformLike
from onnx.reference.ops.op_range import Range
from onnx.reference.ops.op_reciprocal import Reciprocal
from onnx.reference.ops.op_reduce_l1 import ReduceL1_1, ReduceL1_18
from onnx.reference.ops.op_reduce_l2 import ReduceL2_1, ReduceL2_18
from onnx.reference.ops.op_reduce_log_sum import ReduceLogSum_1, ReduceLogSum_18
from onnx.reference.ops.op_reduce_log_sum_exp import (
ReduceLogSumExp_1,
ReduceLogSumExp_18,
)
from onnx.reference.ops.op_reduce_max import ReduceMax_1, ReduceMax_18
from onnx.reference.ops.op_reduce_mean import ReduceMean_1, ReduceMean_18
from onnx.reference.ops.op_reduce_min import ReduceMin_1, ReduceMin_18
from onnx.reference.ops.op_reduce_prod import ReduceProd_1, ReduceProd_18
from onnx.reference.ops.op_reduce_sum import ReduceSum_1, ReduceSum_13
from onnx.reference.ops.op_reduce_sum_square import (
ReduceSumSquare_1,
ReduceSumSquare_18,
)
from onnx.reference.ops.op_regex_full_match import RegexFullMatch
from onnx.reference.ops.op_relu import Relu
from onnx.reference.ops.op_reshape import Reshape_5, Reshape_14
from onnx.reference.ops.op_resize import Resize
from onnx.reference.ops.op_reverse_sequence import ReverseSequence
from onnx.reference.ops.op_rms_normalization import RMSNormalization
from onnx.reference.ops.op_rnn import RNN_7, RNN_14
from onnx.reference.ops.op_roi_align import RoiAlign
from onnx.reference.ops.op_rotary_embedding import RotaryEmbedding
from onnx.reference.ops.op_round import Round
from onnx.reference.ops.op_scan import Scan
from onnx.reference.ops.op_scatter_elements import ScatterElements
from onnx.reference.ops.op_scatternd import ScatterND
from onnx.reference.ops.op_selu import Selu
from onnx.reference.ops.op_sequence_at import SequenceAt
from onnx.reference.ops.op_sequence_construct import SequenceConstruct
from onnx.reference.ops.op_sequence_empty import SequenceEmpty
from onnx.reference.ops.op_sequence_erase import SequenceErase
from onnx.reference.ops.op_sequence_insert import SequenceInsert
from onnx.reference.ops.op_sequence_length import SequenceLength
from onnx.reference.ops.op_sequence_map import SequenceMap
from onnx.reference.ops.op_shape import Shape_1, Shape_15
from onnx.reference.ops.op_shrink import Shrink
from onnx.reference.ops.op_sigmoid import Sigmoid
from onnx.reference.ops.op_sign import Sign
from onnx.reference.ops.op_sin import Sin
from onnx.reference.ops.op_sinh import Sinh
from onnx.reference.ops.op_size import Size
from onnx.reference.ops.op_slice import Slice_1, Slice_10
from onnx.reference.ops.op_softmax import Softmax
from onnx.reference.ops.op_softmax_cross_entropy_loss import SoftmaxCrossEntropyLoss
from onnx.reference.ops.op_softplus import Softplus
from onnx.reference.ops.op_softsign import Softsign
from onnx.reference.ops.op_space_to_depth import SpaceToDepth
from onnx.reference.ops.op_split import Split_2, Split_11, Split_13, Split_18
from onnx.reference.ops.op_split_to_sequence import SplitToSequence
from onnx.reference.ops.op_sqrt import Sqrt
from onnx.reference.ops.op_squeeze import Squeeze_1, Squeeze_11, Squeeze_13
from onnx.reference.ops.op_stft import STFT
from onnx.reference.ops.op_string_concat import StringConcat
from onnx.reference.ops.op_string_normalizer import StringNormalizer
from onnx.reference.ops.op_string_split import StringSplit
from onnx.reference.ops.op_sub import Sub
from onnx.reference.ops.op_sum import Sum
from onnx.reference.ops.op_swish import Swish
from onnx.reference.ops.op_tan import Tan
from onnx.reference.ops.op_tanh import Tanh
from onnx.reference.ops.op_tensor_scatter import TensorScatter
from onnx.reference.ops.op_tfidf_vectorizer import TfIdfVectorizer
from onnx.reference.ops.op_thresholded_relu import ThresholdedRelu
from onnx.reference.ops.op_tile import Tile
from onnx.reference.ops.op_topk import TopK_1, TopK_10, TopK_11
from onnx.reference.ops.op_transpose import Transpose
from onnx.reference.ops.op_trilu import Trilu
from onnx.reference.ops.op_unique import Unique
from onnx.reference.ops.op_unsqueeze import Unsqueeze_1, Unsqueeze_11, Unsqueeze_13
from onnx.reference.ops.op_upsample import Upsample
from onnx.reference.ops.op_where import Where
from onnx.reference.ops.op_xor import Xor
def _build_registered_operators() -> dict[str, dict[int | None, type[OpRun]]]:
return build_registered_operators_any_domain(globals().copy())
def load_op(
domain: str,
op_type: str,
version: None | int = None,
custom: Any = None,
node: None | NodeProto = None,
input_types: None | list[TypeProto] = None,
expand: bool = False,
evaluator_cls: type | None = None,
) -> Any:
"""Loads the implemented for a specified operator.
Args:
domain: domain
op_type: operator type
version: requested version
custom: custom implementation (like a function)
node: used if no implementation was found and the operator
defines a function which is context dependent
input_types: used if no implementation was found and the
operator defines a function which is context dependent
expand: use the function implemented in the schema instead of
its reference implementation
evaluator_cls: evaluator to use
Returns:
class
"""
global _registered_operators # noqa: PLW0603
schema = None
if _registered_operators is None:
_registered_operators = _build_registered_operators() # type: ignore[assignment]
assert _registered_operators is not None
if custom is not None:
return lambda *args: OpFunction(*args, impl=custom)
if version is None:
version = onnx_opset_version()
if domain != "":
raise ValueError(f"Domain must be '' not {domain!r}.")
if op_type in _registered_operators and not expand:
found = True
else:
# maybe the operator can be replaced by a function
try:
schema = get_schema(op_type, version, domain)
except SchemaError:
raise NotImplementedError(
f"No registered schema for operator {op_type!r} "
f"and domain {domain!r}. Did you recompile the sources after updating the repository?"
) from None
if schema.has_function:
body = schema.function_body
assert evaluator_cls is not None, (
f"evaluator_cls must be specified to implement operator {op_type!r} from domain {domain!r}"
)
sess = evaluator_cls(body)
return lambda *args, sess=sess: OpFunction(*args, impl=sess)
if schema.has_context_dependent_function:
if node is None or input_types is None:
raise RuntimeContextError(
f"No registered implementation for operator {op_type!r} "
f"and domain {domain!r}, the operator has a context dependent function. "
f"but argument node or input_types is not defined (input_types={input_types})."
)
body = schema.get_context_dependent_function(
node.SerializeToString(), [it.SerializeToString() for it in input_types]
)
proto = FunctionProto()
proto.ParseFromString(body)
assert evaluator_cls is not None, (
f"evaluator_cls must be specified to evaluate function {proto.name!r}"
)
sess = evaluator_cls(proto)
return lambda *args, sess=sess: OpFunction(*args, impl=sess)
found = False
if not found:
available = "\n".join(textwrap.wrap(", ".join(sorted(_registered_operators))))
has_function = schema.has_function if schema else None
has_context_dependent_function = (
schema.has_context_dependent_function if schema else None
)
raise RuntimeImplementationError(
f"No registered implementation for operator {op_type!r} "
f"and domain {domain!r}, schema.has_function is {has_function}, "
f"schema.has_context_dependent_function is {has_context_dependent_function}. "
f"You may either add one or skip the test in "
f"'test_backend_reference.py'. Available implementations:\n{available}"
)
impl = _registered_operators[op_type]
if None not in impl:
raise RuntimeError(
f"No default implementation for operator {op_type!r} "
f"and domain {domain!r}, found "
f"{', '.join(map(str, impl))}."
)
if version is None or len(impl) == 1:
cl = impl[None]
else:
best = -1
for v in impl:
if v is None:
continue
if best < v <= version:
best = v
if best == -1:
raise RuntimeError(
f"No implementation for operator {op_type!r} "
f"domain {domain!r} and version {version!r}, found "
f"{', '.join(map(str, impl))}."
)
cl = impl[best]
if cl is None:
available = "\n".join(textwrap.wrap(", ".join(sorted(_registered_operators))))
raise ValueError(
f"Not registered implementation for operator {op_type!r}, "
f"domain {domain!r}, and {version!r} in\n{available}"
)
return cl
_registered_operators: dict[str, dict[int | None, OpRun]] | None = None