Skip to content

Commit 4f0a604

Browse files
committed
WIP
1 parent 0fba040 commit 4f0a604

File tree

5 files changed

+46
-74
lines changed

5 files changed

+46
-74
lines changed

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,15 @@ numpy_to_quad_resolve_descriptors(PyObject *NPY_UNUSED(self), PyArray_DTypeMeta
272272
PyArray_Descr *given_descrs[2], PyArray_Descr *loop_descrs[2],
273273
npy_intp *view_offset)
274274
{
275-
275+
// todo: here it is converting this to SLEEF, losing data and getting 0
276276
if (given_descrs[1] == NULL) {
277+
printf("called\n");
277278
loop_descrs[1] = (PyArray_Descr *)new_quaddtype_instance(BACKEND_SLEEF);
278279
if (loop_descrs[1] == nullptr) {
279280
return (NPY_CASTING)-1;
280281
}
281282
}
282283
else {
283-
284284
Py_INCREF(given_descrs[1]);
285285
loop_descrs[1] = given_descrs[1];
286286
}

quaddtype/numpy_quaddtype/src/dtype.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ new_quaddtype_instance(QuadBackendType backend)
6363
return NULL;
6464
}
6565
new->base.elsize = (target_backend == BACKEND_SLEEF) ? sizeof(Sleef_quad) : sizeof(long double);
66-
new->base.alignment = (target_backend == BACKEND_SLEEF) ? _Alignof(Sleef_quad) : _Alignof(long double);
66+
new->base.alignment =
67+
(target_backend == BACKEND_SLEEF) ? _Alignof(Sleef_quad) : _Alignof(long double);
6768
new->backend = target_backend;
6869
return new;
6970
}

quaddtype/numpy_quaddtype/src/ops.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ quad_atan(Sleef_quad *op, Sleef_quad *out)
152152
return 0;
153153
}
154154

155-
156155
// Unary long double operations
157156
typedef int (*unary_op_longdouble_def)(long double *, long double *);
158157

quaddtype/numpy_quaddtype/src/scalar.c

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ QuadPrecision_from_object(PyObject *value, QuadBackendType backend)
7676
self->value.longdouble_value = (long double)val;
7777
}
7878
}
79-
else
80-
{
79+
else {
8180
PyObject *type_str = PyObject_Str((PyObject *)Py_TYPE(value));
8281
if (type_str != NULL) {
8382
const char *type_cstr = PyUnicode_AsUTF8(type_str);
@@ -132,23 +131,25 @@ QuadPrecision_new(PyTypeObject *cls, PyObject *args, PyObject *kwargs)
132131
static PyObject *
133132
QuadPrecision_str_dragon4(QuadPrecisionObject *self)
134133
{
135-
Dragon4_Options opt = {
136-
.scientific = 0,
137-
.digit_mode = DigitMode_Unique,
138-
.cutoff_mode = CutoffMode_TotalLength,
139-
.precision = SLEEF_QUAD_DIG,
140-
.sign = 1,
141-
.trim_mode = TrimMode_LeaveOneZero,
142-
.digits_left = 1,
143-
.digits_right = SLEEF_QUAD_DIG
144-
};
134+
Dragon4_Options opt = {.scientific = 0,
135+
.digit_mode = DigitMode_Unique,
136+
.cutoff_mode = CutoffMode_TotalLength,
137+
.precision = SLEEF_QUAD_DIG,
138+
.sign = 1,
139+
.trim_mode = TrimMode_LeaveOneZero,
140+
.digits_left = 1,
141+
.digits_right = SLEEF_QUAD_DIG};
145142

146143
if (self->backend == BACKEND_SLEEF) {
147-
return Dragon4_Positional_QuadDType(&self->value.sleef_value, opt.digit_mode, opt.cutoff_mode, opt.precision, opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left, opt.digits_right);
144+
return Dragon4_Positional_QuadDType(
145+
&self->value.sleef_value, opt.digit_mode, opt.cutoff_mode, opt.precision,
146+
opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left, opt.digits_right);
148147
}
149148
else {
150149
Sleef_quad sleef_val = Sleef_cast_from_doubleq1(self->value.longdouble_value);
151-
return Dragon4_Positional_QuadDType(&sleef_val, opt.digit_mode, opt.cutoff_mode, opt.precision, opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left, opt.digits_right);
150+
return Dragon4_Positional_QuadDType(&sleef_val, opt.digit_mode, opt.cutoff_mode,
151+
opt.precision, opt.min_digits, opt.sign, opt.trim_mode,
152+
opt.digits_left, opt.digits_right);
152153
}
153154
}
154155

@@ -181,24 +182,26 @@ QuadPrecision_repr(QuadPrecisionObject *self)
181182
static PyObject *
182183
QuadPrecision_repr_dragon4(QuadPrecisionObject *self)
183184
{
184-
Dragon4_Options opt = {
185-
.scientific = 1,
186-
.digit_mode = DigitMode_Unique,
187-
.cutoff_mode = CutoffMode_TotalLength,
188-
.precision = SLEEF_QUAD_DIG,
189-
.sign = 1,
190-
.trim_mode = TrimMode_LeaveOneZero,
191-
.digits_left = 1,
192-
.exp_digits = 3
193-
};
185+
Dragon4_Options opt = {.scientific = 1,
186+
.digit_mode = DigitMode_Unique,
187+
.cutoff_mode = CutoffMode_TotalLength,
188+
.precision = SLEEF_QUAD_DIG,
189+
.sign = 1,
190+
.trim_mode = TrimMode_LeaveOneZero,
191+
.digits_left = 1,
192+
.exp_digits = 3};
194193

195194
PyObject *str;
196195
if (self->backend == BACKEND_SLEEF) {
197-
str = Dragon4_Scientific_QuadDType(&self->value.sleef_value, opt.digit_mode, opt.precision, opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left, opt.exp_digits);
196+
str = Dragon4_Scientific_QuadDType(&self->value.sleef_value, opt.digit_mode, opt.precision,
197+
opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left,
198+
opt.exp_digits);
198199
}
199200
else {
200201
Sleef_quad sleef_val = Sleef_cast_from_doubleq1(self->value.longdouble_value);
201-
str = Dragon4_Scientific_QuadDType(&sleef_val, opt.digit_mode, opt.precision, opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left, opt.exp_digits);
202+
str = Dragon4_Scientific_QuadDType(&sleef_val, opt.digit_mode, opt.precision,
203+
opt.min_digits, opt.sign, opt.trim_mode, opt.digits_left,
204+
opt.exp_digits);
202205
}
203206

204207
if (str == NULL) {

quaddtype/numpy_quaddtype/src/umath.cpp

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,12 @@ static int
397397
quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
398398
PyArray_DTypeMeta *signature[], PyArray_DTypeMeta *new_op_dtypes[])
399399
{
400+
printf("called comparison promoter\n");
400401
int nin = ufunc->nin;
401402
int nargs = ufunc->nargs;
402403
PyArray_DTypeMeta *common = NULL;
403404
bool has_quad = false;
404-
405+
printf("dtyp1: %s dtype2: %s\n", get_dtype_name(op_dtypes[0]), get_dtype_name(op_dtypes[1]));
405406
// Handle the special case for reductions
406407
if (op_dtypes[0] == NULL) {
407408
assert(nin == 2 && ufunc->nout == 1); /* must be reduction */
@@ -415,6 +416,7 @@ quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
415416
// Check if any input or signature is QuadPrecision
416417
for (int i = 0; i < nin; i++) {
417418
if (op_dtypes[i] == &QuadPrecDType) {
419+
printf("Quaddtype found at index: %d\n", i);
418420
has_quad = true;
419421
}
420422
}
@@ -431,7 +433,6 @@ quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
431433
}
432434
else if (common != signature[i]) {
433435
Py_CLEAR(common); // Not homogeneous, unset common
434-
435436
break;
436437
}
437438
}
@@ -459,6 +460,7 @@ quad_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
459460
else {
460461
// Otherwise, use the common dtype
461462
Py_INCREF(common);
463+
printf("setting output to %s dtype\n", get_dtype_name(common));
462464
new_op_dtypes[i] = common;
463465
}
464466
}
@@ -560,42 +562,9 @@ init_quad_binary_ops(PyObject *numpy)
560562

561563
template <cmp_quad_def sleef_comp, cmp_londouble_def ld_comp>
562564
int
563-
quad_generic_comp_strided_loop_aligned(PyArrayMethod_Context *context, char *const data[],
564-
npy_intp const dimensions[], npy_intp const strides[],
565-
NpyAuxData *auxdata)
566-
{
567-
npy_intp N = dimensions[0];
568-
char *in1_ptr = data[0], *in2_ptr = data[1];
569-
char *out_ptr = data[2];
570-
npy_intp in1_stride = strides[0];
571-
npy_intp in2_stride = strides[1];
572-
npy_intp out_stride = strides[2];
573-
574-
QuadPrecDTypeObject *descr = (QuadPrecDTypeObject *)context->descriptors[0];
575-
QuadBackendType backend = descr->backend;
576-
577-
while (N--) {
578-
if (backend == BACKEND_SLEEF) {
579-
*((npy_bool *)out_ptr) =
580-
sleef_comp((const Sleef_quad *)in1_ptr, (const Sleef_quad *)in2_ptr);
581-
}
582-
else {
583-
*((npy_bool *)out_ptr) =
584-
ld_comp((const long double *)in1_ptr, (const long double *)in2_ptr);
585-
}
586-
587-
in1_ptr += in1_stride;
588-
in2_ptr += in2_stride;
589-
out_ptr += out_stride;
590-
}
591-
return 0;
592-
}
593-
594-
template <cmp_quad_def sleef_comp, cmp_londouble_def ld_comp>
595-
int
596-
quad_generic_comp_strided_loop_unaligned(PyArrayMethod_Context *context, char *const data[],
597-
npy_intp const dimensions[], npy_intp const strides[],
598-
NpyAuxData *auxdata)
565+
quad_generic_comp_strided_loop(PyArrayMethod_Context *context, char *const data[],
566+
npy_intp const dimensions[], npy_intp const strides[],
567+
NpyAuxData *auxdata)
599568
{
600569
npy_intp N = dimensions[0];
601570
char *in1_ptr = data[0], *in2_ptr = data[1];
@@ -617,6 +586,7 @@ quad_generic_comp_strided_loop_unaligned(PyArrayMethod_Context *context, char *c
617586
*((npy_bool *)out_ptr) = sleef_comp(&in1.sleef_value, &in2.sleef_value);
618587
}
619588
else {
589+
printf("%Lf % Lf\n", in1.longdouble_value, in2.longdouble_value);
620590
*((npy_bool *)out_ptr) = ld_comp(&in1.longdouble_value, &in2.longdouble_value);
621591
}
622592

@@ -632,7 +602,6 @@ comparison_ufunc_promoter(PyUFuncObject *ufunc, PyArray_DTypeMeta *op_dtypes[],
632602
PyArray_DTypeMeta *signature[], PyArray_DTypeMeta *new_op_dtypes[])
633603
{
634604
PyArray_DTypeMeta *new_signature[NPY_MAXARGS];
635-
636605
memcpy(new_signature, signature, 3 * sizeof(PyArray_DTypeMeta *));
637606
new_signature[2] = NULL;
638607
int res = quad_ufunc_promoter(ufunc, op_dtypes, new_signature, new_op_dtypes);
@@ -654,11 +623,11 @@ create_quad_comparison_ufunc(PyObject *numpy, const char *ufunc_name)
654623

655624
PyArray_DTypeMeta *dtypes[3] = {&QuadPrecDType, &QuadPrecDType, &PyArray_BoolDType};
656625

657-
PyType_Slot slots[] = {{NPY_METH_strided_loop,
658-
(void *)&quad_generic_comp_strided_loop_aligned<sleef_comp, ld_comp>},
659-
{NPY_METH_unaligned_strided_loop,
660-
(void *)&quad_generic_comp_strided_loop_unaligned<sleef_comp, ld_comp>},
661-
{0, NULL}};
626+
PyType_Slot slots[] = {
627+
{NPY_METH_strided_loop, (void *)&quad_generic_comp_strided_loop<sleef_comp, ld_comp>},
628+
{NPY_METH_unaligned_strided_loop,
629+
(void *)&quad_generic_comp_strided_loop<sleef_comp, ld_comp>},
630+
{0, NULL}};
662631

663632
PyArrayMethod_Spec Spec = {
664633
.name = "quad_comp",

0 commit comments

Comments
 (0)