Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion keras/src/backend/openvino/excluded_concrete_tests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ NumpyOneInputOpsCorrectnessTest::test_logaddexp
NumpyOneInputOpsCorrectnessTest::test_max
NumpyOneInputOpsCorrectnessTest::test_mean
NumpyOneInputOpsCorrectnessTest::test_median
NumpyOneInputOpsCorrectnessTest::test_meshgrid
NumpyOneInputOpsCorrectnessTest::test_pad_float16_constant_2
NumpyOneInputOpsCorrectnessTest::test_pad_float32_constant_2
NumpyOneInputOpsCorrectnessTest::test_pad_float64_constant_2
Expand Down
49 changes: 46 additions & 3 deletions keras/src/backend/openvino/numpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -1097,9 +1097,52 @@ def median(x, axis=None, keepdims=False):


def meshgrid(*x, indexing="xy"):
raise NotImplementedError(
"`meshgrid` is not supported with openvino backend"
)
if len(x) < 2:
raise ValueError("meshgrid requires at least 2 input arrays")
if indexing not in ("xy", "ij"):
raise ValueError("indexing must be either 'xy' or 'ij'")

tensors = [get_ov_output(xi) for xi in x]
n = len(tensors)

shapes = [ov_opset.shape_of(t, Type.i64).output(0) for t in tensors] # each is [Ni]
one = ov_opset.constant([1], Type.i64).output(0)

if indexing == "xy" and n >= 2:
out_shape = ov_opset.concat([shapes[1], shapes[0]] + shapes[2:], axis=0).output(0)
else:
out_shape = ov_opset.concat(shapes, axis=0).output(0)

outputs = []
for i, t in enumerate(tensors):
parts = []
for axis in range(n):
if indexing == "xy" and n >= 2:
if i == 0:
if axis == 0:
parts.append(one)
elif axis == 1:
parts.append(shapes[0])
else:
parts.append(one if axis != i else shapes[i])
elif i == 1:
if axis == 0:
parts.append(shapes[1])
elif axis == 1:
parts.append(one)
else:
parts.append(one if axis != i else shapes[i])
else:
parts.append(shapes[i] if axis == i else one)
else:
parts.append(shapes[i] if axis == i else one)

reshape_shape = ov_opset.concat(parts, axis=0).output(0)
reshaped = ov_opset.reshape(t, reshape_shape, False).output(0)
broadcasted = ov_opset.broadcast(reshaped, out_shape).output(0)
outputs.append(OpenVINOKerasTensor(broadcasted))

return outputs


def min(x, axis=None, keepdims=False, initial=None):
Expand Down
Loading