Skip to content

Commit 3eddb07

Browse files
authored
[PyOV] Deprecate comparison for operations (#26761)
### Details: - #26613 caused backward incompatible changes, so decided to deprecate comparison overloads for comparison operations as the usage of them confuse users - suppress deprecation warnings in tests - added bindings for `get_instance_id()` to Node class ### Tickets: - result of discussion [CVS-131039](https://jira.devtools.intel.com/browse/CVS-131039)
1 parent 9cbaf25 commit 3eddb07

File tree

5 files changed

+136
-119
lines changed

5 files changed

+136
-119
lines changed

src/bindings/python/src/openvino/runtime/__init__.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
from openvino.runtime.ie_api import tensor_from_file
6767
from openvino.runtime.ie_api import compile_model
6868

69+
from openvino.utils import deprecated
70+
6971
# Extend Node class to support binary operators
7072
Node.__add__ = opset13.add
7173
Node.__sub__ = opset13.subtract
@@ -77,9 +79,9 @@
7779
Node.__rmul__ = lambda left, right: opset13.multiply(right, left)
7880
Node.__rdiv__ = lambda left, right: opset13.divide(right, left)
7981
Node.__rtruediv__ = lambda left, right: opset13.divide(right, left)
80-
Node.__eq__ = opset13.equal
81-
Node.__ne__ = opset13.not_equal
82-
Node.__lt__ = opset13.less
83-
Node.__le__ = opset13.less_equal
84-
Node.__gt__ = opset13.greater
85-
Node.__ge__ = opset13.greater_equal
82+
Node.__eq__ = deprecated(version="2025.3", message="Use ops.equal instead")(opset13.equal)
83+
Node.__ne__ = deprecated(version="2025.3", message="Use ops.not_equal instead")(opset13.not_equal)
84+
Node.__lt__ = deprecated(version="2025.3", message="Use ops.less instead")(opset13.less)
85+
Node.__le__ = deprecated(version="2025.3", message="Use ops.less_equal instead")(opset13.less_equal)
86+
Node.__gt__ = deprecated(version="2025.3", message="Use ops.greater instead")(opset13.greater)
87+
Node.__ge__ = deprecated(version="2025.3", message="Use ops.greater_equal instead")(opset13.greater_equal)

src/bindings/python/src/pyopenvino/graph/node.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ void regclass_graph_Node(py::module m) {
170170
:type input_tensors: List[openvino.runtime.Tensor]
171171
:rtype: bool
172172
)");
173+
node.def("get_instance_id",
174+
&ov::Node::get_instance_id,
175+
R"(
176+
Returns id of the node.
177+
May be used to compare nodes if they are same instances.
178+
179+
:return: id of the node.
180+
:rtype: int
181+
)");
182+
173183
node.def("get_input_tensor",
174184
&ov::Node::get_input_tensor,
175185
py::arg("index"),

src/bindings/python/tests/test_graph/test_create_op.py

Lines changed: 85 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -397,18 +397,19 @@ def test_lstm_sequence_operator_bidirectional_opset1(dtype, op_name):
397397
parameter_b = ov.parameter(b_shape, name="B", dtype=dtype)
398398

399399
direction = "BIDIRECTIONAL"
400-
node = ov_opset1.lstm_sequence(
401-
parameter_x,
402-
parameter_h_t,
403-
parameter_c_t,
404-
parameter_seq_len,
405-
parameter_w,
406-
parameter_r,
407-
parameter_b,
408-
hidden_size,
409-
direction,
410-
name=op_name,
411-
)
400+
with pytest.warns(DeprecationWarning):
401+
node = ov_opset1.lstm_sequence(
402+
parameter_x,
403+
parameter_h_t,
404+
parameter_c_t,
405+
parameter_seq_len,
406+
parameter_w,
407+
parameter_r,
408+
parameter_b,
409+
hidden_size,
410+
direction,
411+
name=op_name,
412+
)
412413

413414
assert node.get_type_name() == "LSTMSequence"
414415
assert node.get_friendly_name() == op_name
@@ -419,21 +420,22 @@ def test_lstm_sequence_operator_bidirectional_opset1(dtype, op_name):
419420
activation_beta = [3.0, 2.0, 1.0]
420421
clip = 1.22
421422

422-
node_param = ov_opset1.lstm_sequence(
423-
parameter_x,
424-
parameter_h_t,
425-
parameter_c_t,
426-
parameter_seq_len,
427-
parameter_w,
428-
parameter_r,
429-
parameter_b,
430-
hidden_size,
431-
direction,
432-
activations,
433-
activation_alpha,
434-
activation_beta,
435-
clip,
436-
)
423+
with pytest.warns(DeprecationWarning):
424+
node_param = ov_opset1.lstm_sequence(
425+
parameter_x,
426+
parameter_h_t,
427+
parameter_c_t,
428+
parameter_seq_len,
429+
parameter_w,
430+
parameter_r,
431+
parameter_b,
432+
hidden_size,
433+
direction,
434+
activations,
435+
activation_alpha,
436+
activation_beta,
437+
clip,
438+
)
437439

438440
assert node_param.get_type_name() == "LSTMSequence"
439441
assert node_param.get_output_size() == 3
@@ -464,18 +466,18 @@ def test_lstm_sequence_operator_reverse_opset1(dtype):
464466
parameter_b = ov.parameter(b_shape, name="B", dtype=dtype)
465467

466468
direction = "REVERSE"
467-
468-
node_default = ov_opset1.lstm_sequence(
469-
parameter_x,
470-
parameter_h_t,
471-
parameter_c_t,
472-
parameter_seq_len,
473-
parameter_w,
474-
parameter_r,
475-
parameter_b,
476-
hidden_size,
477-
direction,
478-
)
469+
with pytest.warns(DeprecationWarning):
470+
node_default = ov_opset1.lstm_sequence(
471+
parameter_x,
472+
parameter_h_t,
473+
parameter_c_t,
474+
parameter_seq_len,
475+
parameter_w,
476+
parameter_r,
477+
parameter_b,
478+
hidden_size,
479+
direction,
480+
)
479481

480482
assert node_default.get_type_name() == "LSTMSequence"
481483
assert node_default.get_output_size() == 3
@@ -484,22 +486,22 @@ def test_lstm_sequence_operator_reverse_opset1(dtype):
484486
activation_alpha = [1.0, 2.0, 3.0]
485487
activation_beta = [3.0, 2.0, 1.0]
486488
clip = 1.22
487-
488-
node_param = ov_opset1.lstm_sequence(
489-
parameter_x,
490-
parameter_h_t,
491-
parameter_c_t,
492-
parameter_seq_len,
493-
parameter_w,
494-
parameter_r,
495-
parameter_b,
496-
hidden_size,
497-
direction,
498-
activations,
499-
activation_alpha,
500-
activation_beta,
501-
clip,
502-
)
489+
with pytest.warns(DeprecationWarning):
490+
node_param = ov_opset1.lstm_sequence(
491+
parameter_x,
492+
parameter_h_t,
493+
parameter_c_t,
494+
parameter_seq_len,
495+
parameter_w,
496+
parameter_r,
497+
parameter_b,
498+
hidden_size,
499+
direction,
500+
activations,
501+
activation_alpha,
502+
activation_beta,
503+
clip,
504+
)
503505

504506
assert node_param.get_type_name() == "LSTMSequence"
505507
assert node_param.get_output_size() == 3
@@ -530,18 +532,18 @@ def test_lstm_sequence_operator_forward_opset1(dtype):
530532
parameter_b = ov.parameter(b_shape, name="B", dtype=dtype)
531533

532534
direction = "forward"
533-
534-
node_default = ov_opset1.lstm_sequence(
535-
parameter_x,
536-
parameter_h_t,
537-
parameter_c_t,
538-
parameter_seq_len,
539-
parameter_w,
540-
parameter_r,
541-
parameter_b,
542-
hidden_size,
543-
direction,
544-
)
535+
with pytest.warns(DeprecationWarning):
536+
node_default = ov_opset1.lstm_sequence(
537+
parameter_x,
538+
parameter_h_t,
539+
parameter_c_t,
540+
parameter_seq_len,
541+
parameter_w,
542+
parameter_r,
543+
parameter_b,
544+
hidden_size,
545+
direction,
546+
)
545547

546548
assert node_default.get_type_name() == "LSTMSequence"
547549
assert node_default.get_output_size() == 3
@@ -550,22 +552,22 @@ def test_lstm_sequence_operator_forward_opset1(dtype):
550552
activation_alpha = [2.0]
551553
activation_beta = [1.0]
552554
clip = 0.5
553-
554-
node = ov_opset1.lstm_sequence(
555-
parameter_x,
556-
parameter_h_t,
557-
parameter_c_t,
558-
parameter_seq_len,
559-
parameter_w,
560-
parameter_r,
561-
parameter_b,
562-
hidden_size,
563-
direction,
564-
activations,
565-
activation_alpha,
566-
activation_beta,
567-
clip,
568-
)
555+
with pytest.warns(DeprecationWarning):
556+
node = ov_opset1.lstm_sequence(
557+
parameter_x,
558+
parameter_h_t,
559+
parameter_c_t,
560+
parameter_seq_len,
561+
parameter_w,
562+
parameter_r,
563+
parameter_b,
564+
hidden_size,
565+
direction,
566+
activations,
567+
activation_alpha,
568+
activation_beta,
569+
clip,
570+
)
569571

570572
assert node.get_type_name() == "LSTMSequence"
571573
assert node.get_output_size() == 3

src/bindings/python/tests/test_graph/test_ops_binary.py

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import numpy as np
88
import pytest
9+
import warnings
910

1011
from openvino import Type
1112
import openvino.runtime.opset13 as ov
@@ -107,55 +108,57 @@ def test_binary_logical_op_with_scalar(graph_api_helper):
107108

108109

109110
@pytest.mark.parametrize(
110-
("operator", "expected_type"),
111+
("operator", "expected_type", "warning_type"),
111112
[
112-
(operator.add, Type.f32),
113-
(operator.sub, Type.f32),
114-
(operator.mul, Type.f32),
115-
(operator.truediv, Type.f32),
116-
(operator.eq, Type.boolean),
117-
(operator.ne, Type.boolean),
118-
(operator.gt, Type.boolean),
119-
(operator.ge, Type.boolean),
120-
(operator.lt, Type.boolean),
121-
(operator.le, Type.boolean),
113+
(operator.add, Type.f32, warnings.catch_warnings(record=True)),
114+
(operator.sub, Type.f32, warnings.catch_warnings(record=True)),
115+
(operator.mul, Type.f32, warnings.catch_warnings(record=True)),
116+
(operator.truediv, Type.f32, warnings.catch_warnings(record=True)),
117+
(operator.eq, Type.boolean, pytest.warns(DeprecationWarning)),
118+
(operator.ne, Type.boolean, pytest.warns(DeprecationWarning)),
119+
(operator.gt, Type.boolean, pytest.warns(DeprecationWarning)),
120+
(operator.ge, Type.boolean, pytest.warns(DeprecationWarning)),
121+
(operator.lt, Type.boolean, pytest.warns(DeprecationWarning)),
122+
(operator.le, Type.boolean, pytest.warns(DeprecationWarning)),
122123
],
123124
)
124-
def test_binary_operators(operator, expected_type):
125+
def test_binary_operators(operator, expected_type, warning_type):
125126
value_b = np.array([[4, 5], [1, 7]], dtype=np.float32)
126127

127128
shape = [2, 2]
128129
parameter_a = ov.parameter(shape, name="A", dtype=np.float32)
129130

130-
model = operator(parameter_a, value_b)
131+
with warning_type:
132+
model = operator(parameter_a, value_b)
131133

132134
assert model.get_output_size() == 1
133135
assert list(model.get_output_shape(0)) == shape
134136
assert model.get_output_element_type(0) == expected_type
135137

136138

137139
@pytest.mark.parametrize(
138-
("operator", "expected_type"),
140+
("operator", "expected_type", "warning_type"),
139141
[
140-
(operator.add, Type.f32),
141-
(operator.sub, Type.f32),
142-
(operator.mul, Type.f32),
143-
(operator.truediv, Type.f32),
144-
(operator.eq, Type.boolean),
145-
(operator.ne, Type.boolean),
146-
(operator.gt, Type.boolean),
147-
(operator.ge, Type.boolean),
148-
(operator.lt, Type.boolean),
149-
(operator.le, Type.boolean),
142+
(operator.add, Type.f32, warnings.catch_warnings(record=True)),
143+
(operator.sub, Type.f32, warnings.catch_warnings(record=True)),
144+
(operator.mul, Type.f32, warnings.catch_warnings(record=True)),
145+
(operator.truediv, Type.f32, warnings.catch_warnings(record=True)),
146+
(operator.eq, Type.boolean, pytest.warns(DeprecationWarning)),
147+
(operator.ne, Type.boolean, pytest.warns(DeprecationWarning)),
148+
(operator.gt, Type.boolean, pytest.warns(DeprecationWarning)),
149+
(operator.ge, Type.boolean, pytest.warns(DeprecationWarning)),
150+
(operator.lt, Type.boolean, pytest.warns(DeprecationWarning)),
151+
(operator.le, Type.boolean, pytest.warns(DeprecationWarning)),
150152
],
151153
)
152-
def test_binary_operators_with_scalar(operator, expected_type):
154+
def test_binary_operators_with_scalar(operator, expected_type, warning_type):
153155
value_b = np.array([[5, 6], [7, 8]], dtype=np.float32)
154156

155157
shape = [2, 2]
156158
parameter_a = ov.parameter(shape, name="A", dtype=np.float32)
157159

158-
model = operator(parameter_a, value_b)
160+
with warning_type:
161+
model = operator(parameter_a, value_b)
159162

160163
assert model.get_output_size() == 1
161164
assert list(model.get_output_shape(0)) == shape

src/bindings/python/tests/test_runtime/test_model.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def test_add_outputs(output, expectation, raise_msg):
8080
assert len(model.results) == 2
8181
assert "relu_t1" in model.outputs[1].get_tensor().names
8282
assert len(new_outs) == 1
83-
assert new_outs[0].get_node() == model.outputs[1].get_node()
83+
assert new_outs[0].get_node().get_instance_id() == model.outputs[1].get_node().get_instance_id()
8484
assert new_outs[0].get_index() == model.outputs[1].get_index()
8585
if e is not None:
8686
assert raise_msg in str(e.value)
@@ -97,7 +97,7 @@ def test_add_output_port():
9797
new_outs = model.add_outputs(relu1.output(0))
9898
assert len(model.results) == 2
9999
assert len(new_outs) == 1
100-
assert new_outs[0].get_node() == model.outputs[1].get_node()
100+
assert new_outs[0].get_node().get_instance_id() == model.outputs[1].get_node().get_instance_id()
101101
assert new_outs[0].get_index() == model.outputs[1].get_index()
102102

103103

@@ -117,9 +117,9 @@ def test_add_outputs_several_outputs(args):
117117
assert len(model.get_results()) == 3
118118
assert len(model.results) == 3
119119
assert len(new_outs) == 2
120-
assert new_outs[0].get_node() == model.outputs[1].get_node()
120+
assert new_outs[0].get_node().get_instance_id() == model.outputs[1].get_node().get_instance_id()
121121
assert new_outs[0].get_index() == model.outputs[1].get_index()
122-
assert new_outs[1].get_node() == model.outputs[2].get_node()
122+
assert new_outs[1].get_node().get_instance_id() == model.outputs[2].get_node().get_instance_id()
123123
assert new_outs[1].get_index() == model.outputs[2].get_index()
124124

125125

0 commit comments

Comments
 (0)