@@ -175,6 +175,9 @@ init_quad_unary_ops(PyObject *numpy)
175
175
if (create_quad_unary_ufunc<quad_negative, ld_negative>(numpy, " negative" ) < 0 ) {
176
176
return -1 ;
177
177
}
178
+ if (create_quad_unary_ufunc<quad_positive, ld_positive>(numpy, " positive" ) < 0 ) {
179
+ return -1 ;
180
+ }
178
181
if (create_quad_unary_ufunc<quad_absolute, ld_absolute>(numpy, " absolute" ) < 0 ) {
179
182
return -1 ;
180
183
}
@@ -224,44 +227,62 @@ quad_binary_op_resolve_descriptors(PyObject *self, PyArray_DTypeMeta *const dtyp
224
227
PyArray_Descr *const given_descrs[],
225
228
PyArray_Descr *loop_descrs[], npy_intp *NPY_UNUSED (view_offset))
226
229
{
227
- printf (" Descriptor Resolver is calledn\n " );
228
- Py_INCREF (given_descrs[0 ]);
229
- loop_descrs[0 ] = given_descrs[0 ];
230
- Py_INCREF (given_descrs[1 ]);
231
- loop_descrs[1 ] = given_descrs[1 ];
230
+ printf (" Descriptor Resolver is called\n " );
232
231
233
232
QuadPrecDTypeObject *descr_in1 = (QuadPrecDTypeObject *)given_descrs[0 ];
234
233
QuadPrecDTypeObject *descr_in2 = (QuadPrecDTypeObject *)given_descrs[1 ];
234
+ QuadBackendType target_backend;
235
+
235
236
const char *s1 = (descr_in1->backend == BACKEND_SLEEF) ? " SLEEF" : " LONGDOUBLE" ;
236
237
const char *s2 = (descr_in2->backend == BACKEND_SLEEF) ? " SLEEF" : " LONGDOUBLE" ;
237
- printf (" 1: %s\n " , s1);
238
- printf (" 2: %s\n " , s2);
238
+ printf (" 1: %s %d %s \n " , s1, descr_in1-> backend , Py_TYPE (given_descrs[ 0 ])-> tp_name );
239
+ printf (" 2: %s %d %s \n " , s2, descr_in2-> backend , Py_TYPE (given_descrs[ 1 ])-> tp_name );
239
240
241
+ // Determine target backend and if casting is needed
242
+ NPY_CASTING casting = NPY_NO_CASTING;
240
243
if (descr_in1->backend != descr_in2->backend ) {
241
- PyErr_SetString (PyExc_TypeError,
242
- " Cannot operate on QuadPrecision objects with different backends" );
243
- return (NPY_CASTING)-1 ;
244
+ target_backend = BACKEND_LONGDOUBLE;
245
+ casting = NPY_SAFE_CASTING;
246
+ printf (" Different backends detected. Casting to LONGDOUBLE.\n " );
247
+ } else {
248
+ target_backend = descr_in1->backend ;
249
+ printf (" Unified backend: %s\n " , (target_backend == BACKEND_SLEEF) ? " SLEEF" : " LONGDOUBLE" );
250
+ }
251
+
252
+ // Set up input descriptors, casting if necessary
253
+ for (int i = 0 ; i < 2 ; i++) {
254
+ if (((QuadPrecDTypeObject *)given_descrs[i])->backend != target_backend) {
255
+ loop_descrs[i] = (PyArray_Descr *)new_quaddtype_instance (target_backend);
256
+ if (!loop_descrs[i]) {
257
+ return (NPY_CASTING)-1 ;
258
+ }
259
+ } else {
260
+ Py_INCREF (given_descrs[i]);
261
+ loop_descrs[i] = given_descrs[i];
262
+ }
244
263
}
245
264
265
+ // Set up output descriptor
246
266
if (given_descrs[2 ] == NULL ) {
247
- loop_descrs[2 ] = (PyArray_Descr *)new_quaddtype_instance (descr_in1-> backend );
267
+ loop_descrs[2 ] = (PyArray_Descr *)new_quaddtype_instance (target_backend );
248
268
if (!loop_descrs[2 ]) {
249
269
return (NPY_CASTING)-1 ;
250
270
}
251
- }
252
- else {
253
- Py_INCREF (given_descrs[ 2 ]);
254
- loop_descrs[2 ] = given_descrs[ 2 ] ;
255
- }
256
-
257
- QuadPrecDTypeObject *descr_out = (QuadPrecDTypeObject *)loop_descrs[ 2 ];
258
- if (descr_out-> backend != descr_in1-> backend ) {
259
- PyErr_SetString (PyExc_TypeError,
260
- " Output QuadPrecision object must have the same backend as inputs " ) ;
261
- return (NPY_CASTING)- 1 ;
271
+ } else {
272
+ QuadPrecDTypeObject *descr_out = (QuadPrecDTypeObject *)given_descrs[ 2 ];
273
+ if (descr_out-> backend != target_backend) {
274
+ loop_descrs[2 ] = (PyArray_Descr *) new_quaddtype_instance (target_backend) ;
275
+ if (!loop_descrs[ 2 ]) {
276
+ return (NPY_CASTING)- 1 ;
277
+ }
278
+ } else {
279
+ Py_INCREF (given_descrs[ 2 ]);
280
+ loop_descrs[ 2 ] = given_descrs[ 2 ] ;
281
+ }
262
282
}
263
283
264
- return NPY_NO_CASTING;
284
+ printf (" Casting result: %d\n " , casting);
285
+ return casting;
265
286
}
266
287
267
288
template <binary_op_quad_def sleef_op, binary_op_longdouble_def longdouble_op>
@@ -270,6 +291,7 @@ quad_generic_binop_strided_loop(PyArrayMethod_Context *context, char *const data
270
291
npy_intp const dimensions[], npy_intp const strides[],
271
292
NpyAuxData *auxdata)
272
293
{
294
+ printf (" Umath: Generic Strided loop is calledn\n " );
273
295
npy_intp N = dimensions[0 ];
274
296
char *in1_ptr = data[0 ], *in2_ptr = data[1 ];
275
297
char *out_ptr = data[2 ];
@@ -328,22 +350,10 @@ quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
328
350
329
351
// Check if any input or signature is QuadPrecision
330
352
for (int i = 0 ; i < nin; i++) {
353
+ printf (" iterating on dtype : %s\n " , get_dtype_name (op_dtypes[i]));
331
354
if (op_dtypes[i] == &QuadPrecDType) {
332
355
has_quad = true ;
333
- QuadPrecDTypeObject *descr =
334
- (QuadPrecDTypeObject *)PyArray_GetDefaultDescr (op_dtypes[i]);
335
-
336
- const char *s = (descr->backend == BACKEND_SLEEF) ? " SLEEF" : " LONGDOUBLE" ;
337
- printf (" QuadPrecision detected in input %d or signature with backend: %s\n " , i, s);
338
- if (backend == BACKEND_INVALID)
339
- backend = descr->backend ;
340
- else if (backend != BACKEND_INVALID && backend != descr->backend ) {
341
- PyErr_SetString (PyExc_TypeError,
342
- " Cannot mix QuadPrecDType arrays with different backends" );
343
- return -1 ;
344
- }
345
- Py_DECREF (descr);
346
- break ;
356
+ printf (" QuadPrecision detected in input %d\n " , i);
347
357
}
348
358
}
349
359
0 commit comments