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,17 @@ 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
-
39
-
40
37
arange = ov_opset .range (
41
- ov_opset .constant (0 , dtype = "i64" ), rank_val , ov_opset .constant (1 , dtype = "i64" )
38
+ ov_opset .constant (0 , dtype = "i64" ),
39
+ rank_val ,
40
+ ov_opset .constant (1 , dtype = "i64" ),
42
41
)
43
42
mask1 = ov_opset .equal (arange , axis1_node )
44
43
mask2 = ov_opset .equal (arange , axis2_node )
@@ -47,9 +46,14 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
47
46
ov_opset .non_zero (not12 ), [1 ]
48
47
) # gather positions != axis1, axis2
49
48
perm = ov_opset .concat (
50
- [others , ov_opset .reshape (axis1_node , [1 ]), ov_opset .reshape (axis2_node , [1 ])], 0
49
+ [
50
+ others ,
51
+ ov_opset .reshape (axis1_node , [1 ]),
52
+ ov_opset .reshape (axis2_node , [1 ]),
53
+ ],
54
+ 0 ,
51
55
)
52
-
56
+
53
57
x_perm = ov_opset .transpose (x_node , perm )
54
58
permuted_shape = ov_opset .shape_of (x_perm )
55
59
d1 = ov_opset .gather (
@@ -101,7 +105,12 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
101
105
end_mask = [0 ],
102
106
)
103
107
target_shape = ov_opset .concat (
104
- [batch_shape , ov_opset .reshape (L , [1 ]), ov_opset .constant ([2 ], dtype = "i64" )], 0
108
+ [
109
+ batch_shape ,
110
+ ov_opset .reshape (L , [1 ]),
111
+ ov_opset .constant ([2 ], dtype = "i64" ),
112
+ ],
113
+ 0 ,
105
114
)
106
115
bcast_idx = ov_opset .broadcast (diag_idx , target_shape )
107
116
@@ -110,8 +119,6 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
110
119
111
120
return OpenVINOKerasTensor (gathered )
112
121
113
-
114
-
115
122
def add (x1 , x2 ):
116
123
element_type = None
117
124
if isinstance (x1 , OpenVINOKerasTensor ):
@@ -771,8 +778,6 @@ def deg2rad(x):
771
778
def diag (x , k = 0 ):
772
779
raise NotImplementedError ("`diag` is not supported with openvino backend" )
773
780
774
-
775
-
776
781
def diff (a , n = 1 , axis = - 1 ):
777
782
if n == 0 :
778
783
return OpenVINOKerasTensor (get_ov_output (a ))
0 commit comments