|
| 1 | +import numpy as np |
1 | 2 | import openvino.opset15 as ov_opset |
2 | 3 | from openvino import Type |
3 | 4 |
|
4 | 5 | from keras.src.backend import config |
5 | 6 | from keras.src.backend import standardize_dtype |
6 | 7 | from keras.src.backend.common import dtypes |
| 8 | +from keras.src.backend.openvino.core import OPENVINO_DTYPES |
7 | 9 | from keras.src.backend.openvino.core import OpenVINOKerasTensor |
8 | 10 | from keras.src.backend.openvino.core import cast |
| 11 | +from keras.src.backend.openvino.core import convert_to_numpy |
9 | 12 | from keras.src.backend.openvino.core import convert_to_tensor |
10 | 13 | from keras.src.backend.openvino.core import get_ov_output |
11 | 14 |
|
@@ -42,24 +45,38 @@ def eig(a): |
42 | 45 |
|
43 | 46 |
|
44 | 47 | def eigh(a): |
45 | | - import numpy as np |
46 | | - from keras.src.backend.openvino.core import convert_to_numpy |
47 | 48 | a = convert_to_tensor(a) |
| 49 | + a_ov = get_ov_output(a) |
| 50 | + |
| 51 | + |
| 52 | + a_ov_type = a_ov.get_element_type() |
| 53 | + if not a_ov_type.is_real(): |
| 54 | + |
| 55 | + a_ov = ov_opset.convert(a_ov, Type.f32).output(0) |
| 56 | + out_ov_type = Type.f32 |
| 57 | + else: |
| 58 | + out_ov_type = a_ov_type |
| 59 | + |
| 60 | + |
| 61 | + a_evaluated = OpenVINOKerasTensor(a_ov) |
48 | 62 | try: |
49 | | - a_np = convert_to_numpy(a) |
| 63 | + a_np = convert_to_numpy(a_evaluated) |
50 | 64 | except Exception as e: |
51 | 65 | raise ValueError( |
52 | 66 | "eigh is only supported for static eager tensors " |
53 | 67 | "in the openvino backend. Received a dynamic or symbolic tensor." |
54 | 68 | ) from e |
55 | | - |
56 | | - w, v = np.linalg.eigh(a_np) |
| 69 | + |
| 70 | + |
| 71 | + w_np, v_np = np.linalg.eigh(a_np) |
| 72 | + |
| 73 | + w_const = ov_opset.constant(w_np, out_ov_type).output(0) |
| 74 | + v_const = ov_opset.constant(v_np, out_ov_type).output(0) |
57 | 75 | return ( |
58 | | - ov_opset.constant(w).output(0), |
59 | | - ov_opset.constant(v).output(0), |
| 76 | + OpenVINOKerasTensor(w_const), |
| 77 | + OpenVINOKerasTensor(v_const), |
60 | 78 | ) |
61 | 79 |
|
62 | | - |
63 | 80 | def inv(a): |
64 | 81 | a = convert_to_tensor(a) |
65 | 82 | a_ov = get_ov_output(a) |
|
0 commit comments