Skip to content

Commit d974660

Browse files
committed
implement maximum and minimum
1 parent 66f26c4 commit d974660

File tree

9 files changed

+356
-163
lines changed

9 files changed

+356
-163
lines changed

dpnp/backend/include/dpnp_iface_fptr.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,17 +242,17 @@ enum class DPNPFuncName : size_t
242242
requires extra parameters */
243243
DPNP_FN_MAX, /**< Used in numpy.max() impl */
244244
DPNP_FN_MAX_EXT, /**< Used in numpy.max() impl, requires extra parameters */
245-
DPNP_FN_MAXIMUM, /**< Used in numpy.maximum() impl */
246-
DPNP_FN_MAXIMUM_EXT, /**< Used in numpy.maximum() impl , requires extra
245+
DPNP_FN_MAXIMUM, /**< Used in numpy.fmax() impl */
246+
DPNP_FN_MAXIMUM_EXT, /**< Used in numpy.fmax() impl , requires extra
247247
parameters */
248248
DPNP_FN_MEAN, /**< Used in numpy.mean() impl */
249249
DPNP_FN_MEDIAN, /**< Used in numpy.median() impl */
250250
DPNP_FN_MEDIAN_EXT, /**< Used in numpy.median() impl, requires extra
251251
parameters */
252252
DPNP_FN_MIN, /**< Used in numpy.min() impl */
253253
DPNP_FN_MIN_EXT, /**< Used in numpy.min() impl, requires extra parameters */
254-
DPNP_FN_MINIMUM, /**< Used in numpy.minimum() impl */
255-
DPNP_FN_MINIMUM_EXT, /**< Used in numpy.minimum() impl, requires extra
254+
DPNP_FN_MINIMUM, /**< Used in numpy.fmin() impl */
255+
DPNP_FN_MINIMUM_EXT, /**< Used in numpy.fmax() impl, requires extra
256256
parameters */
257257
DPNP_FN_MODF, /**< Used in numpy.modf() impl */
258258
DPNP_FN_MODF_EXT, /**< Used in numpy.modf() impl, requires extra parameters

dpnp/dpnp_algo/dpnp_algo.pxd

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,10 @@ Mathematical functions
386386
"""
387387
cpdef dpnp_descriptor dpnp_hypot(dpnp_descriptor x1_obj, dpnp_descriptor x2_obj, object dtype=*,
388388
dpnp_descriptor out=*, object where=*)
389-
cpdef dpnp_descriptor dpnp_maximum(dpnp_descriptor x1_obj, dpnp_descriptor x2_obj, object dtype=*,
389+
cpdef dpnp_descriptor dpnp_fmax(dpnp_descriptor x1_obj, dpnp_descriptor x2_obj, object dtype=*,
390390
dpnp_descriptor out=*, object where=*)
391-
cpdef dpnp_descriptor dpnp_minimum(dpnp_descriptor x1_obj, dpnp_descriptor x2_obj, object dtype=*,
391+
cpdef dpnp_descriptor dpnp_fmin(dpnp_descriptor x1_obj, dpnp_descriptor x2_obj, object dtype=*,
392392
dpnp_descriptor out=*, object where=*)
393-
394393
"""
395394
Array manipulation routines
396395
"""

dpnp/dpnp_algo/dpnp_algo_mathematical.pxi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ __all__ += [
4747
"dpnp_fmod",
4848
"dpnp_gradient",
4949
'dpnp_hypot',
50-
"dpnp_maximum",
51-
"dpnp_minimum",
50+
"dpnp_fmax",
51+
"dpnp_fmin",
5252
"dpnp_modf",
5353
"dpnp_nancumprod",
5454
"dpnp_nancumsum",
@@ -281,15 +281,15 @@ cpdef utils.dpnp_descriptor dpnp_hypot(utils.dpnp_descriptor x1_obj,
281281
return call_fptr_2in_1out_strides(DPNP_FN_HYPOT_EXT, x1_obj, x2_obj, dtype, out, where)
282282

283283

284-
cpdef utils.dpnp_descriptor dpnp_maximum(utils.dpnp_descriptor x1_obj,
284+
cpdef utils.dpnp_descriptor dpnp_fmax(utils.dpnp_descriptor x1_obj,
285285
utils.dpnp_descriptor x2_obj,
286286
object dtype=None,
287287
utils.dpnp_descriptor out=None,
288288
object where=True):
289289
return call_fptr_2in_1out_strides(DPNP_FN_MAXIMUM_EXT, x1_obj, x2_obj, dtype, out, where)
290290

291291

292-
cpdef utils.dpnp_descriptor dpnp_minimum(utils.dpnp_descriptor x1_obj,
292+
cpdef utils.dpnp_descriptor dpnp_fmin(utils.dpnp_descriptor x1_obj,
293293
utils.dpnp_descriptor x2_obj,
294294
object dtype=None,
295295
utils.dpnp_descriptor out=None,

dpnp/dpnp_algo/dpnp_elementwise_common.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@
7676
"dpnp_logical_not",
7777
"dpnp_logical_or",
7878
"dpnp_logical_xor",
79+
"dpnp_maximum",
80+
"dpnp_minimum",
7981
"dpnp_multiply",
8082
"dpnp_negative",
8183
"dpnp_positive",
@@ -1813,6 +1815,98 @@ def dpnp_logical_xor(x1, x2, out=None, order="K"):
18131815
return dpnp_array._create_from_usm_ndarray(res_usm)
18141816

18151817

1818+
_maximum_docstring_ = """
1819+
maximum(x1, x2, out=None, order='K')
1820+
1821+
Compares two input arrays `x1` and `x2` and returns
1822+
a new array containing the element-wise maxima.
1823+
1824+
Args:
1825+
x1 (dpnp.ndarray):
1826+
First input array, expected to have numeric data type.
1827+
x2 (dpnp.ndarray):
1828+
Second input array, also expected to have numeric data type.
1829+
out ({None, dpnp.ndarray}, optional):
1830+
Output array to populate.
1831+
Array have the correct shape and the expected data type.
1832+
order ("C","F","A","K", optional):
1833+
Memory layout of the newly output array, if parameter `out` is `None`.
1834+
Default: "K".
1835+
Returns:
1836+
dpnp.ndarray:
1837+
An array containing the element-wise minima. The data type of
1838+
the returned array is determined by the Type Promotion Rules.
1839+
"""
1840+
1841+
1842+
maximum_func = BinaryElementwiseFunc(
1843+
"maximum",
1844+
ti._maximum_result_type,
1845+
ti._maximum,
1846+
_maximum_docstring_,
1847+
)
1848+
1849+
1850+
def dpnp_maximum(x1, x2, out=None, order="K"):
1851+
"""Invokes maximum() from dpctl.tensor implementation for maximum() function."""
1852+
1853+
# dpctl.tensor only works with usm_ndarray or scalar
1854+
x1_usm_or_scalar = dpnp.get_usm_ndarray_or_scalar(x1)
1855+
x2_usm_or_scalar = dpnp.get_usm_ndarray_or_scalar(x2)
1856+
out_usm = None if out is None else dpnp.get_usm_ndarray(out)
1857+
1858+
res_usm = maximum_func(
1859+
x1_usm_or_scalar, x2_usm_or_scalar, out=out_usm, order=order
1860+
)
1861+
return dpnp_array._create_from_usm_ndarray(res_usm)
1862+
1863+
1864+
_minimum_docstring_ = """
1865+
minimum(x1, x2, out=None, order='K')
1866+
1867+
Compares two input arrays `x1` and `x2` and returns
1868+
a new array containing the element-wise minima.
1869+
1870+
Args:
1871+
x1 (dpnp.ndarray):
1872+
First input array, expected to have numeric data type.
1873+
x2 (dpnp.ndarray):
1874+
Second input array, also expected to have numeric data type.
1875+
out ({None, dpnp.ndarray}, optional):
1876+
Output array to populate.
1877+
Array have the correct shape and the expected data type.
1878+
order ("C","F","A","K", optional):
1879+
Memory layout of the newly output array, if parameter `out` is `None`.
1880+
Default: "K".
1881+
Returns:
1882+
dpnp.ndarray:
1883+
An array containing the element-wise maxima. The data type of
1884+
the returned array is determined by the Type Promotion Rules.
1885+
"""
1886+
1887+
1888+
minimum_func = BinaryElementwiseFunc(
1889+
"minimum",
1890+
ti._minimum_result_type,
1891+
ti._minimum,
1892+
_minimum_docstring_,
1893+
)
1894+
1895+
1896+
def dpnp_minimum(x1, x2, out=None, order="K"):
1897+
"""Invokes minimum() from dpctl.tensor implementation for minimum() function."""
1898+
1899+
# dpctl.tensor only works with usm_ndarray or scalar
1900+
x1_usm_or_scalar = dpnp.get_usm_ndarray_or_scalar(x1)
1901+
x2_usm_or_scalar = dpnp.get_usm_ndarray_or_scalar(x2)
1902+
out_usm = None if out is None else dpnp.get_usm_ndarray(out)
1903+
1904+
res_usm = minimum_func(
1905+
x1_usm_or_scalar, x2_usm_or_scalar, out=out_usm, order=order
1906+
)
1907+
return dpnp_array._create_from_usm_ndarray(res_usm)
1908+
1909+
18161910
_multiply_docstring_ = """
18171911
multiply(x1, x2, out=None, order="K")
18181912

0 commit comments

Comments
 (0)