OptionalHasElement#
OptionalHasElement - 18#
Version
domain: main
since_version: 18
function: False
support_level: SupportType.COMMON
shape inference: True
This version of the operator has been available since version 18.
Summary
Returns true if (1) the input is an optional-type and contains an element, or, (2) the input is a tensor or sequence type. If the input is not provided or is an empty optional-type, this op returns false.
Inputs
Between 0 and 1 inputs.
input (optional, heterogeneous) - O: The optional input.
Outputs
output (heterogeneous) - B: A scalar boolean tensor. If true, it indicates that optional-type input contains an element. Otherwise, it is empty.
Type Constraints
O in ( optional(seq(tensor(bool))), optional(seq(tensor(complex128))), optional(seq(tensor(complex64))), optional(seq(tensor(double))), optional(seq(tensor(float))), optional(seq(tensor(float16))), optional(seq(tensor(int16))), optional(seq(tensor(int32))), optional(seq(tensor(int64))), optional(seq(tensor(int8))), optional(seq(tensor(string))), optional(seq(tensor(uint16))), optional(seq(tensor(uint32))), optional(seq(tensor(uint64))), optional(seq(tensor(uint8))), optional(tensor(bool)), optional(tensor(complex128)), optional(tensor(complex64)), optional(tensor(double)), optional(tensor(float)), optional(tensor(float16)), optional(tensor(int16)), optional(tensor(int32)), optional(tensor(int64)), optional(tensor(int8)), optional(tensor(string)), optional(tensor(uint16)), optional(tensor(uint32)), optional(tensor(uint64)), optional(tensor(uint8)), seq(tensor(bool)), seq(tensor(complex128)), seq(tensor(complex64)), seq(tensor(double)), seq(tensor(float)), seq(tensor(float16)), seq(tensor(int16)), seq(tensor(int32)), seq(tensor(int64)), seq(tensor(int8)), seq(tensor(string)), seq(tensor(uint16)), seq(tensor(uint32)), seq(tensor(uint64)), seq(tensor(uint8)), tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) ): Constrain input type to optional tensor and optional sequence types.
B in ( tensor(bool) ): Constrain output to a boolean tensor.
Examples
default
optional = np.array([1, 2, 3, 4]).astype(np.float32)
tensor_type_proto = onnx.helper.make_tensor_type_proto(
elem_type=onnx.TensorProto.FLOAT,
shape=[
4,
],
)
optional_type_proto = onnx.helper.make_optional_type_proto(tensor_type_proto)
# OptionalHasElement takes a tensor or optional as input
for input_type_protos in [tensor_type_proto, optional_type_proto]:
node = onnx.helper.make_node(
"OptionalHasElement", inputs=["optional_input"], outputs=["output"]
)
output = optional_has_element_reference_implementation(optional)
test_name = "test_optional_has_element_" + (
"optional_input"
if input_type_protos == optional_type_proto
else "tensor_input"
)
expect(
node,
inputs=[optional],
outputs=[output],
input_type_protos=[optional_type_proto],
name=test_name,
)
_empty
optional = None
tensor_type_proto = onnx.helper.make_tensor_type_proto(
elem_type=onnx.TensorProto.INT32, shape=[]
)
optional_type_proto = onnx.helper.make_optional_type_proto(tensor_type_proto)
# OptionalHasElement takes a tensor or optional as input
for input_type_proto in [tensor_type_proto, optional_type_proto]:
input_name_options = {
"empty": "optional_input",
"empty_no_input_name": "",
"empty_no_input": None,
}
for test_name_surfix, input_name in input_name_options.items():
if input_type_proto == tensor_type_proto and input_name:
# the input tensor cannot be empty if input name is provided.
continue
node = onnx.helper.make_node(
"OptionalHasElement",
inputs=[] if input_name is None else [input_name],
outputs=["output"],
)
output = optional_has_element_reference_implementation(optional)
test_name = (
"test_optional_has_element_"
+ test_name_surfix
+ (
"_optional_input"
if input_type_proto == optional_type_proto
else "_tensor_input"
)
)
expect(
node,
inputs=[optional] if input_name else [],
outputs=[output],
input_type_protos=[input_type_proto] if input_name else [],
name=test_name,
)
Differences
0 | Returns true if (1) the input is an optional-type and contains an element, | ||
0 | 1 | Returns true if the optional-type input contains an element. If it is an empty optional-type, this op returns false. |
|
2 | If the input is not provided or is an empty optional-type, this op returns false. | ||
1 | 3 |
|
|
2 | 4 | **Inputs** | **Inputs** |
3 | 5 |
|
|
6 | Between 0 and 1 inputs. | ||
7 |
| ||
4 | 8 | * **input** (heterogeneous) - **O**: |
|
5 | 9 | The optional input. | The optional input. |
6 | 10 |
|
|
7 | 11 | **Outputs** | **Outputs** |
8 | 12 |
|
|
9 | 13 | * **output** (heterogeneous) - **B**: | * **output** (heterogeneous) - **B**: |
10 | 14 | A scalar boolean tensor. If true, it indicates that optional-type | A scalar boolean tensor. If true, it indicates that optional-type |
11 | 15 | input contains an element. Otherwise, it is empty. | input contains an element. Otherwise, it is empty. |
12 | 16 |
|
|
13 | 17 | **Type Constraints** | **Type Constraints** |
14 | 18 |
|
|
15 | 19 | * **O** in ( | * **O** in ( |
16 | 20 | optional(seq(tensor(bool))), | optional(seq(tensor(bool))), |
17 | 21 | optional(seq(tensor(complex128))), | optional(seq(tensor(complex128))), |
18 | 22 | optional(seq(tensor(complex64))), | optional(seq(tensor(complex64))), |
19 | 23 | optional(seq(tensor(double))), | optional(seq(tensor(double))), |
20 | 24 | optional(seq(tensor(float))), | optional(seq(tensor(float))), |
21 | 25 | optional(seq(tensor(float16))), | optional(seq(tensor(float16))), |
22 | 26 | optional(seq(tensor(int16))), | optional(seq(tensor(int16))), |
23 | 27 | optional(seq(tensor(int32))), | optional(seq(tensor(int32))), |
24 | 28 | optional(seq(tensor(int64))), | optional(seq(tensor(int64))), |
25 | 29 | optional(seq(tensor(int8))), | optional(seq(tensor(int8))), |
26 | 30 | optional(seq(tensor(string))), | optional(seq(tensor(string))), |
27 | 31 | optional(seq(tensor(uint16))), | optional(seq(tensor(uint16))), |
28 | 32 | optional(seq(tensor(uint32))), | optional(seq(tensor(uint32))), |
29 | 33 | optional(seq(tensor(uint64))), | optional(seq(tensor(uint64))), |
30 | 34 | optional(seq(tensor(uint8))), | optional(seq(tensor(uint8))), |
31 | 35 | optional(tensor(bool)), | optional(tensor(bool)), |
32 | 36 | optional(tensor(complex128)), | optional(tensor(complex128)), |
33 | 37 | optional(tensor(complex64)), | optional(tensor(complex64)), |
34 | 38 | optional(tensor(double)), | optional(tensor(double)), |
35 | 39 | optional(tensor(float)), | optional(tensor(float)), |
36 | 40 | optional(tensor(float16)), | optional(tensor(float16)), |
37 | 41 | optional(tensor(int16)), | optional(tensor(int16)), |
38 | 42 | optional(tensor(int32)), | optional(tensor(int32)), |
39 | 43 | optional(tensor(int64)), | optional(tensor(int64)), |
40 | 44 | optional(tensor(int8)), | optional(tensor(int8)), |
41 | 45 | optional(tensor(string)), | optional(tensor(string)), |
42 | 46 | optional(tensor(uint16)), | optional(tensor(uint16)), |
43 | 47 | optional(tensor(uint32)), | optional(tensor(uint32)), |
44 | 48 | optional(tensor(uint64)), | optional(tensor(uint64)), |
45 | 49 | optional(tensor(uint8)) |
|
50 | seq(tensor(bool)), | ||
51 | seq(tensor(complex128)), | ||
52 | seq(tensor(complex64)), | ||
53 | seq(tensor(double)), | ||
54 | seq(tensor(float)), | ||
55 | seq(tensor(float16)), | ||
56 | seq(tensor(int16)), | ||
57 | seq(tensor(int32)), | ||
58 | seq(tensor(int64)), | ||
59 | seq(tensor(int8)), | ||
60 | seq(tensor(string)), | ||
61 | seq(tensor(uint16)), | ||
62 | seq(tensor(uint32)), | ||
63 | seq(tensor(uint64)), | ||
64 | seq(tensor(uint8)), | ||
65 | tensor(bool), | ||
66 | tensor(complex128), | ||
67 | tensor(complex64), | ||
68 | tensor(double), | ||
69 | tensor(float), | ||
70 | tensor(float16), | ||
71 | tensor(int16), | ||
72 | tensor(int32), | ||
73 | tensor(int64), | ||
74 | tensor(int8), | ||
75 | tensor(string), | ||
76 | tensor(uint16), | ||
77 | tensor(uint32), | ||
78 | tensor(uint64), | ||
79 | tensor(uint8) | ||
46 | 80 | ): | ): |
47 | 81 | Constrain input type to optional tensor and optional sequence types. | Constrain input type to optional tensor and optional sequence types. |
48 | 82 | * **B** in ( | * **B** in ( |
49 | 83 | tensor(bool) | tensor(bool) |
50 | 84 | ): | ): |
51 | 85 | Constrain output to a boolean tensor. | Constrain output to a boolean tensor. |
OptionalHasElement - 15#
Version
domain: main
since_version: 15
function: False
support_level: SupportType.COMMON
shape inference: True
This version of the operator has been available since version 15.
Summary
Returns true if the optional-type input contains an element. If it is an empty optional-type, this op returns false.
Inputs
input (heterogeneous) - O: The optional input.
Outputs
output (heterogeneous) - B: A scalar boolean tensor. If true, it indicates that optional-type input contains an element. Otherwise, it is empty.
Type Constraints
O in ( optional(seq(tensor(bool))), optional(seq(tensor(complex128))), optional(seq(tensor(complex64))), optional(seq(tensor(double))), optional(seq(tensor(float))), optional(seq(tensor(float16))), optional(seq(tensor(int16))), optional(seq(tensor(int32))), optional(seq(tensor(int64))), optional(seq(tensor(int8))), optional(seq(tensor(string))), optional(seq(tensor(uint16))), optional(seq(tensor(uint32))), optional(seq(tensor(uint64))), optional(seq(tensor(uint8))), optional(tensor(bool)), optional(tensor(complex128)), optional(tensor(complex64)), optional(tensor(double)), optional(tensor(float)), optional(tensor(float16)), optional(tensor(int16)), optional(tensor(int32)), optional(tensor(int64)), optional(tensor(int8)), optional(tensor(string)), optional(tensor(uint16)), optional(tensor(uint32)), optional(tensor(uint64)), optional(tensor(uint8)) ): Constrain input type to optional tensor and optional sequence types.
B in ( tensor(bool) ): Constrain output to a boolean tensor.