1
1
import numpy as np
2
2
import openvino .opset14 as ov_opset
3
3
from openvino import Type
4
+ from openvino .runtime import opset13 as ov
4
5
5
6
from keras .src .backend import config
6
7
from keras .src .backend .common import dtypes
15
16
from keras .src .backend .openvino .core import convert_to_tensor
16
17
from keras .src .backend .openvino .core import get_ov_output
17
18
from keras .src .backend .openvino .core import ov_to_keras_type
18
- import numpy as np
19
- from openvino .runtime import opset13 as ov
20
-
21
19
22
20
23
21
def diagonal (x , offset = 0 , axis1 = 0 , axis2 = 1 ):
24
- """OpenVINO backend decomposition for keras.ops.diagonal."""
25
22
x_node = ov .constant (x ) # -> ov.Node
26
23
offset_const = ov_opset .constant (int (offset ), dtype = "i64" )
27
24
@@ -30,15 +27,18 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
30
27
rank = ov_opset .shape_of (shape ) # scalar i64 (len of shape)
31
28
rank_val = ov_opset .squeeze (rank ) # [] -> scalar
32
29
axis1_node = ov_opset .floor_mod (
33
- ov_opset .add (ov_opset .constant (int (axis1 ), dtype = "i64" ), rank_val ), rank_val
30
+ ov_opset .add (ov_opset .constant (int (axis1 ), dtype = "i64" ), rank_val ),
31
+ rank_val ,
34
32
)
35
33
axis2_node = ov_opset .floor_mod (
36
- ov_opset .add (ov_opset .constant (int (axis2 ), dtype = "i64" ), rank_val ), rank_val
34
+ ov_opset .add (ov_opset .constant (int (axis2 ), dtype = "i64" ), rank_val ),
35
+ rank_val ,
37
36
)
38
37
39
-
40
38
arange = ov_opset .range (
41
- ov_opset .constant (0 , dtype = "i64" ), rank_val , ov_opset .constant (1 , dtype = "i64" )
39
+ ov_opset .constant (0 , dtype = "i64" ),
40
+ rank_val ,
41
+ ov_opset .constant (1 , dtype = "i64" ),
42
42
)
43
43
mask1 = ov_opset .equal (arange , axis1_node )
44
44
mask2 = ov_opset .equal (arange , axis2_node )
@@ -47,7 +47,12 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
47
47
ov_opset .non_zero (not12 ), [1 ]
48
48
) # gather positions != axis1, axis2
49
49
perm = ov_opset .concat (
50
- [others , ov_opset .reshape (axis1_node , [1 ]), ov_opset .reshape (axis2_node , [1 ])], 0
50
+ [
51
+ others ,
52
+ ov_opset .reshape (axis1_node , [1 ]),
53
+ ov_opset .reshape (axis2_node , [1 ]),
54
+ ],
55
+ 0 ,
51
56
)
52
57
53
58
x_perm = ov_opset .transpose (x_node , perm )
@@ -101,7 +106,12 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
101
106
end_mask = [0 ],
102
107
)
103
108
target_shape = ov_opset .concat (
104
- [batch_shape , ov_opset .reshape (L , [1 ]), ov_opset .constant ([2 ], dtype = "i64" )], 0
109
+ [
110
+ batch_shape ,
111
+ ov_opset .reshape (L , [1 ]),
112
+ ov_opset .constant ([2 ], dtype = "i64" ),
113
+ ],
114
+ 0 ,
105
115
)
106
116
bcast_idx = ov_opset .broadcast (diag_idx , target_shape )
107
117
@@ -111,7 +121,6 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
111
121
return OpenVINOKerasTensor (gathered )
112
122
113
123
114
-
115
124
def add (x1 , x2 ):
116
125
element_type = None
117
126
if isinstance (x1 , OpenVINOKerasTensor ):
@@ -772,7 +781,6 @@ def diag(x, k=0):
772
781
raise NotImplementedError ("`diag` is not supported with openvino backend" )
773
782
774
783
775
-
776
784
def diff (a , n = 1 , axis = - 1 ):
777
785
if n == 0 :
778
786
return OpenVINOKerasTensor (get_ov_output (a ))
0 commit comments