1. [NOTE: Perfect match]: The number of inputs and attributes are exactly the same as the OpSchema. The types of inputs and attributes are exactly the same as the OpSchema. ```python inputs = (Tensor[2, 3], Tensor[2, 3]) attributes = {"alpha": 1.0} @torch_op("aten::op") def aten_op(self: TReal, other: TReal, alpha: float = 1) -> TReal: ... ``` Result: Perfect match. 2. [NOTE: Optional input]: The dispatcher recognizes optional inputs. However, the input can't be ignored. None must be provided. ```python inputs = (Tensor([2, 3]), None) attributes = {} aten_op(X: TTensor, Y: Optional[INT64]): ... ``` Result: Perfect match. Real example: `aten::convolution`. 3. [NOTE: Different attributes]: If an attribute is provided with value, it's a must to match the attribute in function signature. ```python inputs = (Tensor([2, 3]),) attributes = {"a":1, "b":2} aten_op(X: TTensor, a: int): ... ``` Result: No match. Real example: `aten::div` vs `aten::div.Tensor_mode`. 4. [NOTE: Default attributes]: Default attribute will fill in the value into inputs/attributes. ```python inputs = (Tensor([2, 3]),) attributes = {} aten_op(X: TTensor, a: int = 3): ... ``` Result: Perfect match. Real example: `aten::clone` 5. [NOTE: Ignore attribute with None value]: The attributes with None value will be ignored in matching. ```python inputs = (Tensor([2, 3]),) attributes = {"a": None} aten_op(X: TTensor): ... ``` Result: Perfect match. ```python inputs = (Tensor([2, 3]),) attributes = {"a": None} aten_op(X: TTensor, a: int = 3): ... ``` Result: Nearest match eligible. Real example: `aten::div` vs `aten::div.Tensor_mode`. Attributes: onnxfunction: The OnnxFunction. param_schema: The parameter schema defined in the OnnxFunction. op_schema: The ONNX OpSchema. type_constraints: The type constraints defined in the OpSchema. attributes: The attributes defined in the OpSchema. _matching_score: The matching score of the OnnxSchemaChecker . Ú