@@ -175,6 +175,9 @@ init_quad_unary_ops(PyObject *numpy)
175175 if (create_quad_unary_ufunc<quad_negative, ld_negative>(numpy, " negative" ) < 0 ) {
176176 return -1 ;
177177 }
178+ if (create_quad_unary_ufunc<quad_positive, ld_positive>(numpy, " positive" ) < 0 ) {
179+ return -1 ;
180+ }
178181 if (create_quad_unary_ufunc<quad_absolute, ld_absolute>(numpy, " absolute" ) < 0 ) {
179182 return -1 ;
180183 }
@@ -224,44 +227,62 @@ quad_binary_op_resolve_descriptors(PyObject *self, PyArray_DTypeMeta *const dtyp
224227 PyArray_Descr *const given_descrs[],
225228 PyArray_Descr *loop_descrs[], npy_intp *NPY_UNUSED (view_offset))
226229{
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 " );
232231
233232 QuadPrecDTypeObject *descr_in1 = (QuadPrecDTypeObject *)given_descrs[0 ];
234233 QuadPrecDTypeObject *descr_in2 = (QuadPrecDTypeObject *)given_descrs[1 ];
234+ QuadBackendType target_backend;
235+
235236 const char *s1 = (descr_in1->backend == BACKEND_SLEEF) ? " SLEEF" : " LONGDOUBLE" ;
236237 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 );
239240
241+ // Determine target backend and if casting is needed
242+ NPY_CASTING casting = NPY_NO_CASTING;
240243 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+ }
244263 }
245264
265+ // Set up output descriptor
246266 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 );
248268 if (!loop_descrs[2 ]) {
249269 return (NPY_CASTING)-1 ;
250270 }
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+ }
262282 }
263283
264- return NPY_NO_CASTING;
284+ printf (" Casting result: %d\n " , casting);
285+ return casting;
265286}
266287
267288template <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
270291 npy_intp const dimensions[], npy_intp const strides[],
271292 NpyAuxData *auxdata)
272293{
294+ printf (" Umath: Generic Strided loop is calledn\n " );
273295 npy_intp N = dimensions[0 ];
274296 char *in1_ptr = data[0 ], *in2_ptr = data[1 ];
275297 char *out_ptr = data[2 ];
@@ -328,22 +350,10 @@ quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
328350
329351 // Check if any input or signature is QuadPrecision
330352 for (int i = 0 ; i < nin; i++) {
353+ printf (" iterating on dtype : %s\n " , get_dtype_name (op_dtypes[i]));
331354 if (op_dtypes[i] == &QuadPrecDType) {
332355 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);
347357 }
348358 }
349359
0 commit comments