Skip to content

Add support of comparison operations #1278

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 5 additions & 0 deletions dpnp/backend/include/dpnp_gen_2arg_2type_tbl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@

#endif

MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_equal_c, input1_elem == input2_elem)
MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_greater_c, input1_elem > input2_elem)
MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_greater_equal_c, input1_elem >= input2_elem)
MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_less_c, input1_elem < input2_elem)
MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_less_equal_c, input1_elem <= input2_elem)
MACRO_2ARG_2TYPES_LOGIC_OP(dpnp_not_equal_c, input1_elem != input2_elem)

#undef MACRO_2ARG_2TYPES_LOGIC_OP
5 changes: 5 additions & 0 deletions dpnp/backend/include/dpnp_iface_fptr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ enum class DPNPFuncName : size_t
DPNP_FN_EIG_EXT, /**< Used in numpy.linalg.eig() impl, requires extra parameters */
DPNP_FN_EIGVALS, /**< Used in numpy.linalg.eigvals() impl */
DPNP_FN_EIGVALS_EXT, /**< Used in numpy.linalg.eigvals() impl, requires extra parameters */
DPNP_FN_EQUAL_EXT, /**< Used in numpy.equal() impl, requires extra parameters */
DPNP_FN_ERF, /**< Used in scipy.special.erf impl */
DPNP_FN_ERF_EXT, /**< Used in scipy.special.erf impl, requires extra parameters */
DPNP_FN_EYE, /**< Used in numpy.eye() impl */
Expand Down Expand Up @@ -179,6 +180,8 @@ enum class DPNPFuncName : size_t
DPNP_FN_FMOD_EXT, /**< Used in numpy.fmod() impl, requires extra parameters */
DPNP_FN_FULL, /**< Used in numpy.full() impl */
DPNP_FN_FULL_LIKE, /**< Used in numpy.full_like() impl */
DPNP_FN_GREATER_EXT, /**< Used in numpy.greater() impl, requires extra parameters */
DPNP_FN_GREATER_EQUAL_EXT, /**< Used in numpy.greater_equal() impl, requires extra parameters */
DPNP_FN_HYPOT, /**< Used in numpy.hypot() impl */
DPNP_FN_HYPOT_EXT, /**< Used in numpy.hypot() impl, requires extra parameters */
DPNP_FN_IDENTITY, /**< Used in numpy.identity() impl */
Expand All @@ -193,6 +196,7 @@ enum class DPNPFuncName : size_t
DPNP_FN_KRON_EXT, /**< Used in numpy.kron() impl, requires extra parameters */
DPNP_FN_LEFT_SHIFT, /**< Used in numpy.left_shift() impl */
DPNP_FN_LEFT_SHIFT_EXT, /**< Used in numpy.left_shift() impl, requires extra parameters */
DPNP_FN_LESS_EXT, /**< Used in numpy.less() impl, requires extra parameters */
DPNP_FN_LESS_EQUAL_EXT, /**< Used in numpy.less_equal() impl, requires extra parameters */
DPNP_FN_LOG, /**< Used in numpy.log() impl */
DPNP_FN_LOG_EXT, /**< Used in numpy.log() impl, requires extra parameters */
Expand Down Expand Up @@ -228,6 +232,7 @@ enum class DPNPFuncName : size_t
DPNP_FN_NEGATIVE_EXT, /**< Used in numpy.negative() impl, requires extra parameters */
DPNP_FN_NONZERO, /**< Used in numpy.nonzero() impl */
DPNP_FN_NONZERO_EXT, /**< Used in numpy.nonzero() impl, requires extra parameters */
DPNP_FN_NOT_EQUAL_EXT, /**< Used in numpy.not_equal() impl, requires extra parameters */
DPNP_FN_ONES, /**< Used in numpy.ones() impl */
DPNP_FN_ONES_LIKE, /**< Used in numpy.ones_like() impl */
DPNP_FN_PARTITION, /**< Used in numpy.partition() impl */
Expand Down
10 changes: 10 additions & 0 deletions dpnp/backend/kernels/dpnp_krnl_logic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,8 +536,18 @@ DPCTLSyclEventRef (*dpnp_any_ext_c)(DPCTLSyclQueueRef,
template <DPNPFuncType FT1, DPNPFuncType ... FTs>
static void func_map_logic_2arg_2type_core(func_map_t& fmap)
{
((fmap[DPNPFuncName::DPNP_FN_EQUAL_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_equal_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
((fmap[DPNPFuncName::DPNP_FN_GREATER_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_greater_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
((fmap[DPNPFuncName::DPNP_FN_GREATER_EQUAL_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_greater_equal_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
((fmap[DPNPFuncName::DPNP_FN_LESS_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_less_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
((fmap[DPNPFuncName::DPNP_FN_LESS_EQUAL_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_less_equal_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
((fmap[DPNPFuncName::DPNP_FN_NOT_EQUAL_EXT][FT1][FTs] =
{eft_BLN, (void*)dpnp_not_equal_c_ext<func_type_map_t::find_type<FT1>, func_type_map_t::find_type<FTs>>}), ...);
}

template <DPNPFuncType ... FTs>
Expand Down
5 changes: 5 additions & 0 deletions dpnp/dpnp_algo/dpnp_algo.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
DPNP_FN_EIG_EXT
DPNP_FN_EIGVALS
DPNP_FN_EIGVALS_EXT
DPNP_FN_EQUAL_EXT
DPNP_FN_ERF
DPNP_FN_ERF_EXT
DPNP_FN_EYE
Expand Down Expand Up @@ -155,6 +156,8 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
DPNP_FN_FMOD_EXT
DPNP_FN_FULL
DPNP_FN_FULL_LIKE
DPNP_FN_GREATER_EXT
DPNP_FN_GREATER_EQUAL_EXT
DPNP_FN_HYPOT
DPNP_FN_HYPOT_EXT
DPNP_FN_IDENTITY
Expand All @@ -169,6 +172,7 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
DPNP_FN_KRON_EXT
DPNP_FN_LEFT_SHIFT
DPNP_FN_LEFT_SHIFT_EXT
DPNP_FN_LESS_EXT
DPNP_FN_LESS_EQUAL_EXT
DPNP_FN_LOG
DPNP_FN_LOG_EXT
Expand Down Expand Up @@ -204,6 +208,7 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
DPNP_FN_NEGATIVE_EXT
DPNP_FN_NONZERO
DPNP_FN_NONZERO_EXT
DPNP_FN_NOT_EQUAL_EXT
DPNP_FN_ONES
DPNP_FN_ONES_LIKE
DPNP_FN_PARTITION
Expand Down
90 changes: 30 additions & 60 deletions dpnp/dpnp_algo/dpnp_algo_logic.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -166,46 +166,28 @@ cpdef utils.dpnp_descriptor dpnp_any(utils.dpnp_descriptor array1):
return result


cpdef utils.dpnp_descriptor dpnp_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
result_sycl_device, result_usm_type, result_sycl_queue = utils.get_common_usm_allocation(input1, input2)
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
dpnp.bool,
None,
device=result_sycl_device,
usm_type=result_usm_type,
sycl_queue=result_sycl_queue)
for i in range(result.size):
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] == input2.get_pyobj()[i])
cpdef utils.dpnp_descriptor dpnp_equal(utils.dpnp_descriptor x1_obj,
utils.dpnp_descriptor x2_obj,
object dtype=None,
utils.dpnp_descriptor out=None,
object where=True):
return call_fptr_2in_1out_strides(DPNP_FN_EQUAL_EXT, x1_obj, x2_obj, dtype, out, where, func_name="equal")

return result

cpdef utils.dpnp_descriptor dpnp_greater(utils.dpnp_descriptor x1_obj,
utils.dpnp_descriptor x2_obj,
object dtype=None,
utils.dpnp_descriptor out=None,
object where=True):
return call_fptr_2in_1out_strides(DPNP_FN_GREATER_EXT, x1_obj, x2_obj, dtype, out, where, func_name="greater")

cpdef utils.dpnp_descriptor dpnp_greater(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
result_sycl_device, result_usm_type, result_sycl_queue = utils.get_common_usm_allocation(input1, input2)
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
dpnp.bool,
None,
device=result_sycl_device,
usm_type=result_usm_type,
sycl_queue=result_sycl_queue)
for i in range(result.size):
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] > input2.get_pyobj()[i])

return result


cpdef utils.dpnp_descriptor dpnp_greater_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
result_sycl_device, result_usm_type, result_sycl_queue = utils.get_common_usm_allocation(input1, input2)
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
dpnp.bool,
None,
device=result_sycl_device,
usm_type=result_usm_type,
sycl_queue=result_sycl_queue)
for i in range(result.size):
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] >= input2.get_pyobj()[i])

return result
cpdef utils.dpnp_descriptor dpnp_greater_equal(utils.dpnp_descriptor x1_obj,
utils.dpnp_descriptor x2_obj,
object dtype=None,
utils.dpnp_descriptor out=None,
object where=True):
return call_fptr_2in_1out_strides(DPNP_FN_GREATER_EQUAL_EXT, x1_obj, x2_obj, dtype, out, where, func_name="greater_equal")


cpdef utils.dpnp_descriptor dpnp_isclose(utils.dpnp_descriptor input1,
Expand Down Expand Up @@ -272,18 +254,12 @@ cpdef utils.dpnp_descriptor dpnp_isnan(utils.dpnp_descriptor input1):
return result


cpdef utils.dpnp_descriptor dpnp_less(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
result_sycl_device, result_usm_type, result_sycl_queue = utils.get_common_usm_allocation(input1, input2)
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
dpnp.bool,
None,
device=result_sycl_device,
usm_type=result_usm_type,
sycl_queue=result_sycl_queue)
for i in range(result.size):
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] < input2.get_pyobj()[i])

return result
cpdef utils.dpnp_descriptor dpnp_less(utils.dpnp_descriptor x1_obj,
utils.dpnp_descriptor x2_obj,
object dtype=None,
utils.dpnp_descriptor out=None,
object where=True):
return call_fptr_2in_1out_strides(DPNP_FN_LESS_EXT, x1_obj, x2_obj, dtype, out, where, func_name="less")


cpdef utils.dpnp_descriptor dpnp_less_equal(utils.dpnp_descriptor x1_obj,
Expand Down Expand Up @@ -355,15 +331,9 @@ cpdef utils.dpnp_descriptor dpnp_logical_xor(utils.dpnp_descriptor input1, utils
return result


cpdef utils.dpnp_descriptor dpnp_not_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
result_sycl_device, result_usm_type, result_sycl_queue = utils.get_common_usm_allocation(input1, input2)
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
dpnp.bool,
None,
device=result_sycl_device,
usm_type=result_usm_type,
sycl_queue=result_sycl_queue)
for i in range(result.size):
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] != input2.get_pyobj()[i])

return result
cpdef utils.dpnp_descriptor dpnp_not_equal(utils.dpnp_descriptor x1_obj,
utils.dpnp_descriptor x2_obj,
object dtype=None,
utils.dpnp_descriptor out=None,
object where=True):
return call_fptr_2in_1out_strides(DPNP_FN_NOT_EQUAL_EXT, x1_obj, x2_obj, dtype, out, where, func_name="not_equal")
Loading