diff --git a/.gitignore b/.gitignore index afd700b49952..33ff550eab92 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ examples/**/*.jpg .python-version .coverage *coverage.xml -.ruff_cache \ No newline at end of file +.ruff_cache +venv/ \ No newline at end of file diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index 7371a2b9a5b8..1166d7bee7dc 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -31,7 +31,6 @@ NumpyDtypeTest::test_isinf NumpyDtypeTest::test_isnan NumpyDtypeTest::test_linspace NumpyDtypeTest::test_logaddexp -NumpyDtypeTest::test_logspace NumpyDtypeTest::test_matmul_ NumpyDtypeTest::test_max NumpyDtypeTest::test_mean @@ -145,7 +144,6 @@ NumpyTwoInputOpsCorrectnessTest::test_divide_no_nan NumpyTwoInputOpsCorrectnessTest::test_einsum NumpyTwoInputOpsCorrectnessTest::test_inner NumpyTwoInputOpsCorrectnessTest::test_linspace -NumpyTwoInputOpsCorrectnessTest::test_logspace NumpyTwoInputOpsCorrectnessTest::test_outer NumpyTwoInputOpsCorrectnessTest::test_quantile NumpyTwoInputOpsCorrectnessTest::test_take_along_axis diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index bbd23c633953..1b178974d9b1 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1029,9 +1029,61 @@ def logical_or(x1, x2): def logspace(start, stop, num=50, endpoint=True, base=10, dtype=None, axis=0): - raise NotImplementedError( - "`logspace` is not supported with openvino backend" - ) + if dtype is not None: + ov_type = OPENVINO_DTYPES[standardize_dtype(dtype)] + else: + ov_type = OPENVINO_DTYPES[config.floatx()] + + start_t = ov_opset.convert(get_ov_output(start), ov_type).output(0) + stop_t = ov_opset.convert(get_ov_output(stop), ov_type).output(0) + num_t = ov_opset.convert(get_ov_output(num), ov_type).output(0) + base_t = ov_opset.convert(get_ov_output(base), ov_type).output(0) + + if isinstance(num, (int, float)): + num_value = int(num) + else: + num_value = 50 + + if endpoint: + one = ov_opset.constant(1, ov_type).output(0) + divisor = ov_opset.subtract(num_t, one).output(0) + else: + divisor = num_t + + step_t = ov_opset.divide( + ov_opset.subtract(stop_t, start_t).output(0), divisor + ).output(0) + + indices_t = ov_opset.range( + ov_opset.constant(0, ov_type).output(0), + num_t, + ov_opset.constant(1, ov_type).output(0), + ov_type, + ).output(0) + + static_shape = start_t.get_partial_shape().to_shape() + if len(static_shape) > 0: + reshape_shape = [num_value] + [1] * len(static_shape) + indices_t = ov_opset.reshape( + indices_t, + ov_opset.constant(reshape_shape, dtype=Type.i32).output(0), + special_zero=False, + ).output(0) + + step_t = ov_opset.reshape( + step_t, + ov_opset.constant([1] + list(static_shape), dtype=Type.i32).output( + 0 + ), + special_zero=False, + ).output(0) + + linear_t = ov_opset.add( + start_t, ov_opset.multiply(indices_t, step_t).output(0) + ).output(0) + result_t = ov_opset.power(base_t, linear_t).output(0) + + return OpenVINOKerasTensor(result_t) def maximum(x1, x2): diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000000..83635a5b7b9b --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +env = + KERAS_BACKEND=openvino \ No newline at end of file