Skip to content

Commit 39120b2

Browse files
authored
add descriptor to some logical functions (#795)
1 parent cda7fcc commit 39120b2

File tree

6 files changed

+118
-100
lines changed

6 files changed

+118
-100
lines changed

dpnp/dpnp_algo/dpnp_algo.pxd

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -256,17 +256,17 @@ cpdef dpnp_descriptor dpnp_right_shift(object x1_obj, object x2_obj, object dtyp
256256
"""
257257
Logic functions
258258
"""
259-
cpdef dparray dpnp_equal(object array1, object input2)
260-
cpdef dparray dpnp_greater(object input1, object input2)
261-
cpdef dparray dpnp_greater_equal(object input1, object input2)
259+
cpdef dpnp_descriptor dpnp_equal(dpnp_descriptor array1, dpnp_descriptor input2)
260+
cpdef dpnp_descriptor dpnp_greater(dpnp_descriptor input1, dpnp_descriptor input2)
261+
cpdef dpnp_descriptor dpnp_greater_equal(dpnp_descriptor input1, dpnp_descriptor input2)
262262
cpdef dparray dpnp_isclose(object input1, object input2, double rtol=*, double atol=*, cpp_bool equal_nan=*)
263-
cpdef dparray dpnp_less(object input1, object input2)
264-
cpdef dparray dpnp_less_equal(object input1, object input2)
263+
cpdef dpnp_descriptor dpnp_less(dpnp_descriptor input1, dpnp_descriptor input2)
264+
cpdef dpnp_descriptor dpnp_less_equal(dpnp_descriptor input1, dpnp_descriptor input2)
265265
cpdef dparray dpnp_logical_and(object input1, object input2)
266266
cpdef dparray dpnp_logical_not(object input1)
267267
cpdef dparray dpnp_logical_or(object input1, object input2)
268268
cpdef dparray dpnp_logical_xor(object input1, object input2)
269-
cpdef dparray dpnp_not_equal(object input1, object input2)
269+
cpdef dpnp_descriptor dpnp_not_equal(dpnp_descriptor input1, dpnp_descriptor input2)
270270

271271

272272
"""
@@ -279,8 +279,8 @@ cpdef dparray dpnp_matmul(dpnp_descriptor in_array1, dpnp_descriptor in_array2,
279279
"""
280280
Array creation routines
281281
"""
282-
cpdef dparray dpnp_arange(start, stop, step, dtype)
283-
cpdef dparray dpnp_array(obj, dtype=*)
282+
cpdef dpnp_descriptor dpnp_arange(start, stop, step, dtype)
283+
cpdef dparray dpnp_array(object obj, object dtype=*)
284284
cpdef dparray dpnp_init_val(shape, dtype, value)
285285

286286

dpnp/dpnp_algo/dpnp_algo.pyx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ and the rest of the library
3535
from libc.time cimport time, time_t
3636
import dpnp
3737
import dpnp.config as config
38+
import dpnp.dpnp_utils as utils_py
3839
import numpy
3940

4041
cimport cpython
@@ -74,16 +75,17 @@ ctypedef void(*fptr_dpnp_flatten_t)(const void * , void * , const size_t)
7475
ctypedef void(*fptr_dpnp_initval_t)(void * , void * , size_t)
7576

7677

77-
cpdef dparray dpnp_arange(start, stop, step, dtype):
78+
cpdef utils.dpnp_descriptor dpnp_arange(start, stop, step, dtype):
7879
obj_len = int(numpy.ceil((stop - start) / step))
7980
if obj_len < 0:
8081
raise ValueError(f"DPNP dpnp_arange(): Negative array size (start={start},stop={stop},step={step})")
8182

83+
cdef tuple obj_shape = utils._object_to_tuple(obj_len)
84+
8285
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(dtype)
8386
cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_ARANGE, param1_type, param1_type)
8487

85-
result_type = dpnp_DPNPFuncType_to_dtype(< size_t > kernel_data.return_type)
86-
cdef dparray result = dparray(obj_len, dtype=result_type)
88+
cdef utils.dpnp_descriptor result = utils.create_output_descriptor(obj_shape, kernel_data.return_type, None)
8789

8890
# for i in range(result.size):
8991
# result[i] = start + i
@@ -94,7 +96,7 @@ cpdef dparray dpnp_arange(start, stop, step, dtype):
9496
return result
9597

9698

97-
cpdef dparray dpnp_array(obj, dtype=None):
99+
cpdef dparray dpnp_array(object obj, object dtype=None):
98100
cdef dparray result
99101
cdef elem_dtype
100102
cdef dparray_shape_type obj_shape

dpnp/dpnp_algo/dpnp_algo_logic.pyx

Lines changed: 41 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ __all__ += [
5555
]
5656

5757

58-
ctypedef void(*custom_logic_1in_1out_func_ptr_t)(void * , void * , const size_t)
59-
ctypedef void(*custom_allclose_1in_1out_func_ptr_t)(void * , void * , void *, const size_t, double, double)
58+
ctypedef void(*custom_logic_1in_1out_func_ptr_t)(void *, void * , const size_t)
59+
ctypedef void(*custom_allclose_1in_1out_func_ptr_t)(void * , void * , void * , const size_t, double, double)
6060

6161

62-
cpdef dparray dpnp_all(dpnp_descriptor array1):
62+
cpdef dparray dpnp_all(utils.dpnp_descriptor array1):
6363
cdef dparray result = dparray((1,), dtype=numpy.bool)
6464

6565
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(array1.dtype)
@@ -73,7 +73,7 @@ cpdef dparray dpnp_all(dpnp_descriptor array1):
7373
return result
7474

7575

76-
cpdef dparray dpnp_allclose(dpnp_descriptor array1, dpnp_descriptor array2, double rtol_val, double atol_val):
76+
cpdef dparray dpnp_allclose(utils.dpnp_descriptor array1, utils.dpnp_descriptor array2, double rtol_val, double atol_val):
7777
cdef dparray result = dparray((1,), dtype=numpy.bool)
7878

7979
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(array1.dtype)
@@ -88,7 +88,7 @@ cpdef dparray dpnp_allclose(dpnp_descriptor array1, dpnp_descriptor array2, doub
8888
return result
8989

9090

91-
cpdef dparray dpnp_any(dpnp_descriptor array1):
91+
cpdef dparray dpnp_any(utils.dpnp_descriptor array1):
9292
cdef dparray result = dparray((1,), dtype=numpy.bool)
9393

9494
cdef DPNPFuncType param1_type = dpnp_dtype_to_DPNPFuncType(array1.dtype)
@@ -102,45 +102,32 @@ cpdef dparray dpnp_any(dpnp_descriptor array1):
102102
return result
103103

104104

105-
cpdef dparray dpnp_equal(object array1, object input2):
106-
cdef dparray result = dparray(array1.shape, dtype=numpy.bool)
107-
108-
if isinstance(input2, int):
109-
for i in range(result.size):
110-
result[i] = numpy.bool(array1[i] == input2)
111-
else:
112-
for i in range(result.size):
113-
result[i] = numpy.bool(array1[i] == input2[i])
105+
cpdef utils.dpnp_descriptor dpnp_equal(utils.dpnp_descriptor array1, utils.dpnp_descriptor input2):
106+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(array1.shape,
107+
dpnp.bool,
108+
None)
109+
for i in range(result.size):
110+
result.get_pyobj()[i] = dpnp.bool(array1.get_pyobj()[i] == input2.get_pyobj()[i])
114111

115112
return result
116113

117114

118-
cpdef dparray dpnp_greater(object input1, object input2):
119-
input2_is_scalar = dpnp.isscalar(input2)
120-
121-
cdef dparray result = dparray(input1.shape, dtype=numpy.bool)
122-
123-
if input2_is_scalar:
124-
for i in range(result.size):
125-
result[i] = dpnp.bool(input1[i] > input2)
126-
else:
127-
for i in range(result.size):
128-
result[i] = dpnp.bool(input1[i] > input2[i])
115+
cpdef utils.dpnp_descriptor dpnp_greater(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
116+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
117+
dpnp.bool,
118+
None)
119+
for i in range(result.size):
120+
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] > input2.get_pyobj()[i])
129121

130122
return result
131123

132124

133-
cpdef dparray dpnp_greater_equal(object input1, object input2):
134-
input2_is_scalar = dpnp.isscalar(input2)
135-
136-
cdef dparray result = dparray(input1.shape, dtype=numpy.bool)
137-
138-
if input2_is_scalar:
139-
for i in range(result.size):
140-
result[i] = dpnp.bool(input1[i] >= input2)
141-
else:
142-
for i in range(result.size):
143-
result[i] = dpnp.bool(input1[i] >= input2[i])
125+
cpdef utils.dpnp_descriptor dpnp_greater_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
126+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
127+
dpnp.bool,
128+
None)
129+
for i in range(result.size):
130+
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] >= input2.get_pyobj()[i])
144131

145132
return result
146133

@@ -185,32 +172,22 @@ cpdef dparray dpnp_isnan(object input1):
185172
return result
186173

187174

188-
cpdef dparray dpnp_less(object input1, object input2):
189-
input2_is_scalar = dpnp.isscalar(input2)
190-
191-
cdef dparray result = dparray(input1.shape, dtype=numpy.bool)
192-
193-
if input2_is_scalar:
194-
for i in range(result.size):
195-
result[i] = dpnp.bool(input1[i] < input2)
196-
else:
197-
for i in range(result.size):
198-
result[i] = dpnp.bool(input1[i] < input2[i])
175+
cpdef utils.dpnp_descriptor dpnp_less(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
176+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
177+
dpnp.bool,
178+
None)
179+
for i in range(result.size):
180+
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] < input2.get_pyobj()[i])
199181

200182
return result
201183

202184

203-
cpdef dparray dpnp_less_equal(object input1, object input2):
204-
input2_is_scalar = dpnp.isscalar(input2)
205-
206-
cdef dparray result = dparray(input1.shape, dtype=numpy.bool)
207-
208-
if input2_is_scalar:
209-
for i in range(result.size):
210-
result[i] = dpnp.bool(input1[i] <= input2)
211-
else:
212-
for i in range(result.size):
213-
result[i] = dpnp.bool(input1[i] <= input2[i])
185+
cpdef utils.dpnp_descriptor dpnp_less_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
186+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
187+
dpnp.bool,
188+
None)
189+
for i in range(result.size):
190+
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] <= input2.get_pyobj()[i])
214191

215192
return result
216193

@@ -251,16 +228,11 @@ cpdef dparray dpnp_logical_xor(object input1, object input2):
251228
return result
252229

253230

254-
cpdef dparray dpnp_not_equal(object input1, object input2):
255-
input2_is_scalar = dpnp.isscalar(input2)
256-
257-
cdef dparray result = dparray(input1.shape, dtype=numpy.bool)
258-
259-
if input2_is_scalar:
260-
for i in range(result.size):
261-
result[i] = dpnp.bool(input1[i] != input2)
262-
else:
263-
for i in range(result.size):
264-
result[i] = dpnp.bool(input1[i] != input2[i])
231+
cpdef utils.dpnp_descriptor dpnp_not_equal(utils.dpnp_descriptor input1, utils.dpnp_descriptor input2):
232+
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(input1.shape,
233+
dpnp.bool,
234+
None)
235+
for i in range(result.size):
236+
result.get_pyobj()[i] = dpnp.bool(input1.get_pyobj()[i] != input2.get_pyobj()[i])
265237

266238
return result

dpnp/dpnp_iface_arraycreation.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def arange(start, stop=None, step=1, dtype=None):
145145
if step is None:
146146
step = 1
147147

148-
return dpnp_arange(start, stop, step, dtype)
148+
return dpnp_arange(start, stop, step, dtype).get_pyobj()
149149

150150
return call_origin(numpy.arange, start, stop=stop, step=step, dtype=dtype)
151151

@@ -193,7 +193,10 @@ def array(obj, dtype=None, copy=True, order='C', subok=False, ndmin=0):
193193
194194
"""
195195

196+
# print("=======================")
197+
# print(f"x1={obj}")
196198
if (use_origin_backend(obj)):
199+
# print("=========numpy.array==============")
197200
return numpy.array(obj, dtype=dtype, copy=copy, order=order, subok=subok, ndmin=ndmin)
198201

199202
# if not isinstance(obj, collections.abc.Sequence):
@@ -214,9 +217,29 @@ def array(obj, dtype=None, copy=True, order='C', subok=False, ndmin=0):
214217
if ndmin != 0:
215218
checker_throw_value_error("array", "ndmin", ndmin, 0)
216219

220+
# print("=========dpnp_array==============")
217221
return dpnp_array(obj, dtype)
218222

219223

224+
# def array(x1, dtype=None, copy=True, order='C', subok=False, ndmin=0):
225+
# print("=======================")
226+
# print(f"x1={x1}")
227+
# x1_desc = dpnp.get_dpnp_descriptor(x1)
228+
# if x1_desc:
229+
# if subok is not False:
230+
# pass
231+
# elif copy is not True:
232+
# pass
233+
# elif order != 'C':
234+
# pass
235+
# elif ndmin != 0:
236+
# pass
237+
# else:
238+
# return dpnp_array(x1, dtype)
239+
240+
# return call_origin(numpy.array, x1, dtype, copy=copy, order=order, subok=subok, ndmin=ndmin)
241+
242+
220243
def asanyarray(a, dtype=None, order='C'):
221244
"""
222245
Convert the input to an ndarray, but pass ndarray subclasses through.

dpnp/dpnp_iface_logic.py

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -246,15 +246,15 @@ def equal(x1, x2):
246246

247247
x1_desc = dpnp.get_dpnp_descriptor(x1)
248248
x2_desc = dpnp.get_dpnp_descriptor(x2)
249-
if 0 and x1_desc and x2_desc:
249+
if x1_desc and x2_desc:
250250
if x1_desc.size != x2_desc.size:
251251
pass
252252
elif x1_desc.dtype != x2_desc.dtype:
253253
pass
254254
elif x1_desc.shape != x2_desc.shape:
255255
pass
256256
else:
257-
return dpnp_equal(x1_desc, x2_desc)
257+
return dpnp_equal(x1_desc, x2_desc).get_pyobj()
258258

259259
return call_origin(numpy.equal, x1, x2)
260260

@@ -292,8 +292,13 @@ def greater(x1, x2):
292292

293293
x1_desc = dpnp.get_dpnp_descriptor(x1)
294294
x2_desc = dpnp.get_dpnp_descriptor(x2)
295-
if 0 and x1_desc and x2_desc:
296-
return dpnp_greater(x1_desc, x2_desc)
295+
if x1_desc and x2_desc:
296+
if x1_desc.size < 2:
297+
pass
298+
elif x2_desc.size < 2:
299+
pass
300+
else:
301+
return dpnp_greater(x1_desc, x2_desc).get_pyobj()
297302

298303
return call_origin(numpy.greater, x1, x2)
299304

@@ -331,8 +336,13 @@ def greater_equal(x1, x2):
331336

332337
x1_desc = dpnp.get_dpnp_descriptor(x1)
333338
x2_desc = dpnp.get_dpnp_descriptor(x2)
334-
if 0 and x1_desc and x2_desc:
335-
return dpnp_greater_equal(x1_desc, x2_desc)
339+
if x1_desc and x2_desc:
340+
if x1_desc.size < 2:
341+
pass
342+
elif x2_desc.size < 2:
343+
pass
344+
else:
345+
return dpnp_greater_equal(x1_desc, x2_desc).get_pyobj()
336346

337347
return call_origin(numpy.greater_equal, x1, x2)
338348

@@ -547,9 +557,15 @@ def less(x1, x2):
547557

548558
x1_desc = dpnp.get_dpnp_descriptor(x1)
549559
x2_desc = dpnp.get_dpnp_descriptor(x2)
550-
if 0 and x1_desc and x2_desc:
551-
return dpnp_less(x1_desc, x2_desc)
560+
if x1_desc and x2_desc:
561+
if x1_desc.size < 2:
562+
pass
563+
elif x2_desc.size < 2:
564+
pass
565+
else:
566+
return dpnp_less(x1_desc, x2_desc).get_pyobj()
552567

568+
print("=========call_origin(numpy.less==========")
553569
return call_origin(numpy.less, x1, x2)
554570

555571

@@ -586,8 +602,13 @@ def less_equal(x1, x2):
586602

587603
x1_desc = dpnp.get_dpnp_descriptor(x1)
588604
x2_desc = dpnp.get_dpnp_descriptor(x2)
589-
if 0 and x1_desc and x2_desc:
590-
return dpnp_less_equal(x1_desc, x2_desc)
605+
if x1_desc and x2_desc:
606+
if x1_desc.size < 2:
607+
pass
608+
elif x2_desc.size < 2:
609+
pass
610+
else:
611+
return dpnp_less_equal(x1_desc, x2_desc).get_pyobj()
591612

592613
return call_origin(numpy.less_equal, x1, x2)
593614

@@ -795,14 +816,14 @@ def not_equal(x1, x2):
795816

796817
x1_desc = dpnp.get_dpnp_descriptor(x1)
797818
x2_desc = dpnp.get_dpnp_descriptor(x2)
798-
is_x1_scalar = dpnp.isscalar(x1)
799-
is_x2_scalar = dpnp.isscalar(x2)
800-
if 0 and (x1_desc and x2_desc and (x1_desc or is_x1_scalar)) and (x2_desc or is_x2_scalar) and not(is_x1_scalar and is_x2_scalar):
801-
if is_x1_scalar:
802-
result = dpnp_not_equal(x2_desc, x1_desc)
819+
if x1_desc and x2_desc:
820+
if x1_desc.size < 2:
821+
pass
822+
elif x2_desc.size < 2:
823+
pass
803824
else:
804-
result = dpnp_not_equal(x1_desc, x2_desc)
825+
result = dpnp_not_equal(x1_desc, x2_desc).get_pyobj()
805826

806-
return result
827+
return result
807828

808829
return call_origin(numpy.not_equal, x1, x2)

0 commit comments

Comments
 (0)