From a09cac99abb72985aae773a05fd37b71fe5601b3 Mon Sep 17 00:00:00 2001 From: Aditya Goel Date: Thu, 24 Oct 2024 22:09:09 +0100 Subject: [PATCH 1/2] Fix argmax --- CHANGELOG.rst | 6 ++++ docs/_static/classify_iris.png | Bin 35030 -> 28785 bytes ndonnx/_core/_numericimpl.py | 64 ++++++++++++++++----------------- ndonnx/_funcs.py | 2 +- tests/test_core.py | 46 ++++++++++++++++++++++++ xfails.txt | 2 -- 6 files changed, 83 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8b477ae..1b06ae5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,12 @@ Changelog ========= +0.9.3 (unreleased) +------------------ + +- Reduced the number of unnecessary casts in :func:`ndonnx.argmax` and :func:`ndonnx.argmin`. + + 0.9.2 (2024-10-03) ------------------ diff --git a/docs/_static/classify_iris.png b/docs/_static/classify_iris.png index 6b33f253726cd44e2b5d70f62e90d44275380d5a..ee042156fd2541a7a88a3422ba98eb698bde7844 100644 GIT binary patch literal 28785 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 z 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 diff --git a/ndonnx/_core/_numericimpl.py b/ndonnx/_core/_numericimpl.py index a3c92e7..b8efde7 100644 --- a/ndonnx/_core/_numericimpl.py +++ b/ndonnx/_core/_numericimpl.py @@ -355,43 +355,39 @@ def matrix_transpose(self, x) -> ndx.Array: @validate_core def argmax(self, x, axis=None, keepdims=False): - if axis is None: - reshaped_x = ndx.reshape(x, [-1])._core() - if keepdims: - return from_corearray( - opx.reshape( - opx.arg_max(reshaped_x, axis=0, keepdims=False), - opx.const([1 for x in range(x.ndim)], dtype=dtypes.int64), - ) - ) - else: - return from_corearray( - opx.reshape( - opx.arg_max(reshaped_x, axis=0, keepdims=False), - opx.const([], dtype=dtypes.int64), - ) - ) - return _via_i64_f64(lambda x: opx.arg_max(x, axis=axis, keepdims=keepdims), [x]) + out = via_upcast( + lambda x: opx.arg_max( + x, + axis=axis or 0, + keepdims=int(keepdims), + ), + [ndx.reshape(x, [-1]) if axis is None else x], + cast_return=False, + int_dtype=ndx.int32, + float_dtype=ndx.float64, + ) + + while keepdims and out.ndim < x.ndim: + out = ndx.expand_dims(out, axis=0) + return out @validate_core def argmin(self, x, axis=None, keepdims=False): - if axis is None: - reshaped_x = ndx.reshape(x, [-1])._core() - if keepdims: - return from_corearray( - opx.reshape( - opx.arg_min(reshaped_x, axis=0, keepdims=False), - opx.const([1 for x in range(x.ndim)], dtype=dtypes.int64), - ) - ) - else: - return from_corearray( - opx.reshape( - opx.arg_min(reshaped_x, axis=0, keepdims=False), - opx.const([], dtype=dtypes.int64), - ) - ) - return _via_i64_f64(lambda x: opx.arg_min(x, axis=axis, keepdims=keepdims), [x]) + out = via_upcast( + lambda x: opx.arg_min( + x, + axis=axis or 0, + keepdims=int(keepdims), + ), + [ndx.reshape(x, [-1]) if axis is None else x], + cast_return=False, + int_dtype=ndx.int32, + float_dtype=ndx.float64, + ) + + while keepdims and out.ndim < x.ndim: + out = ndx.expand_dims(out, axis=0) + return out @validate_core def nonzero(self, x) -> tuple[Array, ...]: diff --git a/ndonnx/_funcs.py b/ndonnx/_funcs.py index d15dd16..3021b2d 100644 --- a/ndonnx/_funcs.py +++ b/ndonnx/_funcs.py @@ -670,7 +670,7 @@ def argmax(x, axis=None, keepdims=False): def argmin(x, axis=None, keepdims=False): if ( - out := x.dtype._ops.argmax(x, axis=axis, keepdims=keepdims) + out := x.dtype._ops.argmin(x, axis=axis, keepdims=keepdims) ) is not NotImplemented: return out raise UnsupportedOperationError(f"Unsupported operand type for argmin: '{x.dtype}'") diff --git a/tests/test_core.py b/tests/test_core.py index 5063954..a9bfe0f 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4,6 +4,7 @@ from __future__ import annotations import re +import warnings import numpy as np import pytest @@ -992,3 +993,48 @@ def test_no_unsafe_cumulative_sum_cast(): ): a = ndx.asarray([1, 2, 3], ndx.int32) ndx.cumulative_sum(a, dtype=ndx.uint64) + + +@pytest.mark.parametrize("keepdims", [True, False]) +@pytest.mark.parametrize( + "func, x", + [ + (np.argmax, np.array([1, 2, 3, 4, 5], dtype=np.int32)), + (np.argmax, np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)), + (np.argmax, np.array([1, 2, 3, 4, 5], dtype=np.int8)), + (np.argmax, np.array([1, 2, 3, 4, 5], dtype=np.float32)), + (np.argmax, np.array([1, 2, 3, 4, 5], dtype=np.float64)), + (np.argmin, np.array([1, 2, 3, 4, 5], dtype=np.float32)), + (np.argmin, np.array([[-11, 2, 3], [4, 5, -6]], dtype=np.int32)), + (np.argmin, np.array([1, 2, 3, 4, 5], dtype=np.float64)), + (np.argmin, np.array([1, 2, 3, 4, 5], dtype=np.int16)), + ], +) +def test_argmaxmin(func, x, keepdims): + np_result = func(x, keepdims=keepdims) + ndx_result = getattr(ndx, func.__name__)( + ndx.asarray(x), keepdims=keepdims + ).to_numpy() + assert_array_equal(np_result, ndx_result) + + +# Pending ORT 1.19 conda-forge release before this becomes supported: +# https://github.com/conda-forge/onnxruntime-feedstock/pull/128 +@pytest.mark.parametrize( + "func, x", + [ + (np.argmax, np.array([1, 2, 3, 4, 5], dtype=np.int64)), + (np.argmin, np.array([1, 2, 3, 4, 5], dtype=np.int64)), + ], +) +def test_argmaxmin_unsupported_kernels(func, x): + import onnxruntime as ort + + if ort.__version__.startswith("19"): + warnings.warn( + "Please remove this test and update `argmax` and `argmin` to reflect expanded kernel support.", + Warning, + ) + + with pytest.raises(TypeError): + getattr(ndx, func.__name__)(ndx.asarray(x)) diff --git a/xfails.txt b/xfails.txt index 69431ee..9665406 100644 --- a/xfails.txt +++ b/xfails.txt @@ -90,8 +90,6 @@ array_api_tests/test_operators_and_elementwise_functions.py::test_signbit array_api_tests/test_operators_and_elementwise_functions.py::test_sinh array_api_tests/test_operators_and_elementwise_functions.py::test_sqrt array_api_tests/test_operators_and_elementwise_functions.py::test_tan -array_api_tests/test_searching_functions.py::test_argmax -array_api_tests/test_searching_functions.py::test_argmin array_api_tests/test_searching_functions.py::test_nonzero_zerodim_error array_api_tests/test_searching_functions.py::test_searchsorted array_api_tests/test_searching_functions.py::test_where From 0be5dcd82f5eba70eb92527d8ef466643ea2241e Mon Sep 17 00:00:00 2001 From: Aditya Goel <48102515+adityagoel4512@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:32:13 +0100 Subject: [PATCH 2/2] Update CHANGELOG.rst --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 1b06ae5..86e6393 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,7 +7,7 @@ Changelog ========= -0.9.3 (unreleased) +0.9.3 (2024-10-25) ------------------ - Reduced the number of unnecessary casts in :func:`ndonnx.argmax` and :func:`ndonnx.argmin`.