Skip to content
11 changes: 11 additions & 0 deletions numba/core/typing/npdatetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,3 +266,14 @@ class DatetimeCmpGt(DatetimeCmpOp):
@infer_global(operator.ge)
class DatetimeCmpGE(DatetimeCmpOp):
key = operator.ge


@infer_global(npdatetime_helpers.datetime_minimum)
@infer_global(npdatetime_helpers.datetime_maximum)
class DatetimeMinMax(AbstractTemplate):
def generic(self, args, kws):
assert not kws
assert len(args) == 2
assert isinstance(args[0], (types.NPDatetime, types.NPTimedelta))
assert isinstance(args[1], (types.NPDatetime, types.NPTimedelta))
Comment thread
benwilliamgraham marked this conversation as resolved.
Resolved
return signature(args[0], *args)
4 changes: 4 additions & 0 deletions numba/np/npdatetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,3 +847,7 @@ def impl(x):
return np.int64(-2)
return np.int64(x)
return impl


lower_builtin(npdatetime_helpers.datetime_minimum, types.VarArg(types.Any))(datetime_minimum_impl)
lower_builtin(npdatetime_helpers.datetime_maximum, types.VarArg(types.Any))(datetime_maximum_impl)
Comment thread
benwilliamgraham marked this conversation as resolved.
Resolved
8 changes: 8 additions & 0 deletions numba/np/npdatetime_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,3 +202,11 @@ def get_best_unit(unit_a, unit_b):
if b > a:
return unit_b
return unit_a


def datetime_minimum(a, b):
pass


def datetime_maximum(a, b):
pass
29 changes: 5 additions & 24 deletions numba/parfors/parfor.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import numba.core.ir
from numba.core import types, typing, utils, errors, ir, analysis, postproc, rewrites, typeinfer, config, ir_utils
from numba import prange, pndindex
from numba.np import npdatetime
from numba.np.npdatetime_helpers import datetime_minimum, datetime_maximum
from numba.np.numpy_support import as_dtype, numpy_version
from numba.core.typing.templates import infer_global, AbstractTemplate
from numba.stencils.stencilparfor import StencilPass
Expand Down Expand Up @@ -124,25 +124,6 @@ class internal_prange(object):
def __new__(cls, *args):
return range(*args)

def _datetime_minimum(a, b):
pass

def _datetime_maximum(a, b):
pass

@infer_global(_datetime_minimum)
@infer_global(_datetime_maximum)
class _DatetimeMinMaxInfer(AbstractTemplate):
def generic(self, args, kws):
assert not kws
assert len(args) == 2
assert isinstance(args[0], (types.NPDatetime, types.NPTimedelta))
assert isinstance(args[1], (types.NPDatetime, types.NPTimedelta))
return signature(args[0], *args)

lower_builtin(_datetime_minimum, types.VarArg(types.Any))(npdatetime.datetime_minimum_impl)

lower_builtin(_datetime_maximum, types.VarArg(types.Any))(npdatetime.datetime_maximum_impl)

def min_parallel_impl(return_type, arg):
# XXX: use prange for 1D arrays since pndindex returns a 1-tuple instead of
Expand All @@ -158,7 +139,7 @@ def min_1(in_arr):
min_checker(len(in_arr))
val = numba.cpython.builtins.get_type_max_value(in_arr.dtype)
for i in numba.parfors.parfor.internal_prange(len(in_arr)):
val = _datetime_minimum(val, in_arr[i])
val = datetime_minimum(val, in_arr[i])
return val
else:
def min_1(in_arr):
Expand Down Expand Up @@ -190,7 +171,7 @@ def max_1(in_arr):
max_checker(len(in_arr))
val = numba.cpython.builtins.get_type_min_value(in_arr.dtype)
for i in numba.parfors.parfor.internal_prange(len(in_arr)):
val = _datetime_maximum(val, in_arr[i])
val = datetime_maximum(val, in_arr[i])
return val
else:
def max_1(in_arr):
Expand Down Expand Up @@ -3654,8 +3635,8 @@ def supported_reduction(x, func_ir):
if callname in [
('max', 'builtins'),
('min', 'builtins'),
('_datetime_minimum', 'numba.parfors.parfor'),
('_datetime_maximum', 'numba.parfors.parfor'),
('datetime_minimum', 'numba.np.npdatetime_helpers'),
('datetime_maximum', 'numba.np.npdatetime_helpers'),
]:
return True
return False
Expand Down