[Numpy-svn] r6024 - trunk/numpy/core/src
numpy-svn at scipy.org
numpy-svn at scipy.org
Thu Nov 13 23:25:34 EST 2008
Author: charris
Date: 2008-11-13 22:25:29 -0600 (Thu, 13 Nov 2008)
New Revision: 6024
Modified:
trunk/numpy/core/src/ufuncobject.c
Log:
Use loop macros in generic loops. This is a bit fragile at the
moment because the macros a defined in the umathmodule.c.src
file. This will be fixed...
Modified: trunk/numpy/core/src/ufuncobject.c
===================================================================
--- trunk/numpy/core/src/ufuncobject.c 2008-11-14 04:25:19 UTC (rev 6023)
+++ trunk/numpy/core/src/ufuncobject.c 2008-11-14 04:25:29 UTC (rev 6024)
@@ -33,11 +33,11 @@
*****************************************************************************/
-typedef double doubleUnaryFunc(double x);
typedef float floatUnaryFunc(float x);
+typedef double doubleUnaryFunc(double x);
typedef longdouble longdoubleUnaryFunc(longdouble x);
-typedef double doubleBinaryFunc(double x, double y);
typedef float floatBinaryFunc(float x, float y);
+typedef double doubleBinaryFunc(double x, double y);
typedef longdouble longdoubleBinaryFunc(longdouble x, longdouble y);
@@ -45,175 +45,96 @@
static void
PyUFunc_f_f(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
floatUnaryFunc *f = (floatUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- float *in1 = (float *)ip1;
- float *out = (float *)op;
-
- *out = f(*in1);
+ UNARY_LOOP {
+ const float in1 = *(float *)ip1;
+ *(float *)op1 = f(in1);
}
}
/*UFUNC_API*/
static void
-PyUFunc_ff_f(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_f_f_As_d_d(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- floatBinaryFunc *f = (floatBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- float *in1 = (float *)ip1;
- float *in2 = (float *)ip2;
- float *out = (float *)op;
-
- *out = f(*in1, *in2);
+ doubleUnaryFunc *f = (doubleUnaryFunc *)func;
+ UNARY_LOOP {
+ const float in1 = *(float *)ip1;
+ *(float *)op1 = (float)f((double)in1);
}
}
/*UFUNC_API*/
static void
-PyUFunc_d_d(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_ff_f(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- doubleUnaryFunc *f = (doubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- double *in1 = (double *)ip1;
- double *out = (double *)op;
-
- *out = f(*in1);
+ floatBinaryFunc *f = (floatBinaryFunc *)func;
+ BINARY_LOOP {
+ float in1 = *(float *)ip1;
+ float in2 = *(float *)ip2;
+ *(float *)op1 = f(in1, in2);
}
}
/*UFUNC_API*/
static void
-PyUFunc_dd_d(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_ff_f_As_dd_d(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
doubleBinaryFunc *f = (doubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- double *in1 = (double *)ip1;
- double *in2 = (double *)ip2;
- double *out = (double *)op;
-
- *out = f(*in1, *in2);
+ BINARY_LOOP {
+ float in1 = *(float *)ip1;
+ float in2 = *(float *)ip2;
+ *(float *)op1 = (double)f((double)in1, (double)in2);
}
}
/*UFUNC_API*/
static void
-PyUFunc_g_g(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_d_d(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- longdoubleUnaryFunc *f = (longdoubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- longdouble *in1 = (longdouble *)ip1;
- longdouble *out = (longdouble *)op;
-
- *out = f(*in1);
+ doubleUnaryFunc *f = (floatUnaryFunc *)func;
+ UNARY_LOOP {
+ double in1 = *(double *)ip1;
+ *(double *)op1 = f(in1);
}
}
/*UFUNC_API*/
static void
-PyUFunc_gg_g(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_dd_d(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- longdoubleBinaryFunc *f = (longdoubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- longdouble *in1 = (longdouble *)ip1;
- longdouble *in2 = (longdouble *)ip2;
- longdouble *out = (longdouble *)op;
-
- *out = f(*in1, *in2);
+ doubleBinaryFunc *f = (doubleBinaryFunc *)func;
+ BINARY_LOOP {
+ double in1 = *(double *)ip1;
+ double in2 = *(double *)ip2;
+ *(double *)op1 = f(in1, in2);
}
}
/*UFUNC_API*/
static void
-PyUFunc_f_f_As_d_d(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_g_g(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- doubleUnaryFunc *f = (doubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- float *in1 = (float *)ip1;
- float *out = (float *)op;
-
- *out = (float)f((double)*in1);
+ longdoubleUnaryFunc *f = (longdoubleUnaryFunc *)func;
+ UNARY_LOOP {
+ longdouble in1 = *(longdouble *)ip1;
+ *(longdouble *)op1 = f(in1);
}
}
/*UFUNC_API*/
static void
-PyUFunc_ff_f_As_dd_d(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_gg_g(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- doubleBinaryFunc *f = (doubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- float *in1 = (float *)ip1;
- float *in2 = (float *)ip2;
- float *out = (float *)op;
-
- *out = (float)f((double)*in1, (double)*in2);
+ longdoubleBinaryFunc *f = (longdoubleBinaryFunc *)func;
+ BINARY_LOOP {
+ longdouble in1 = *(longdouble *)ip1;
+ longdouble in2 = *(longdouble *)ip2;
+ *(longdouble *)op1 = f(in1, in2);
}
}
+
/******************************************************************************
* Generic Complex Floating Type Loops
*****************************************************************************/
@@ -231,219 +152,106 @@
static void
PyUFunc_F_F(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
cfloatUnaryFunc *f = (cfloatUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- float *in1 = (float *)ip1;
- float *out = (float *)op;
- cfloat x, r;
-
- x.real = in1[0];
- x.imag = in1[1];
- f(&x, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ UNARY_LOOP {
+ cfloat in1 = *(cfloat *)ip1;
+ cfloat *out = (cfloat *)op1;
+ f(&in1, out);
}
}
/*UFUNC_API*/
static void
-PyUFunc_FF_F(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_F_F_As_D_D(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- cfloatBinaryFunc *f = (cfloatBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- float *in1 = (float *)ip1;
- float *in2 = (float *)ip2;
- float *out = (float *)op;
- cfloat x,y,r;
-
- x.real = in1[0];
- x.imag = in1[1];
- y.real = in2[0];
- y.imag = in2[1];
- f(&x, &y, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ cdoubleUnaryFunc *f = (cdoubleUnaryFunc *)func;
+ UNARY_LOOP {
+ const float *in1 = (float *)ip1;
+ cdouble tmp = {(double)(in1[0]),(double)in1[1]};
+ cdouble out;
+ f(&tmp, &out);
+ ((float *)op1)[0] = (float)out.real;
+ ((float *)op1)[1] = (float)out.imag;
}
}
/*UFUNC_API*/
static void
-PyUFunc_D_D(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_FF_F(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- cdoubleUnaryFunc *f = (cdoubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- double *in1 = (double *)ip1;
- double *out = (double *)op;
- cdouble x, r;
-
- x.real = in1[0];
- x.imag = in1[1];
- f(&x, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ cfloatBinaryFunc *f = (cfloatBinaryFunc *)func;
+ BINARY_LOOP {
+ cfloat in1 = *(cfloat *)ip1;
+ cfloat in2 = *(cfloat *)ip2;
+ cfloat *out = (cfloat *)op1;
+ f(&in1, &in2, out);
}
}
/*UFUNC_API*/
static void
-PyUFunc_DD_D(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_FF_F_As_DD_D(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
cdoubleBinaryFunc *f = (cdoubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- double *in1 = (double *)ip1;
- double *in2 = (double *)ip2;
- double *out = (double *)op;
- cdouble x,y,r;
-
- x.real = in1[0];
- x.imag = in1[1];
- y.real = in2[0];
- y.imag = in2[1];
- f(&x, &y, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ BINARY_LOOP {
+ const float *in1 = (float *)ip1;
+ const float *in2 = (float *)ip2;
+ cdouble tmp1 = {(double)(in1[0]),(double)in1[1]};
+ cdouble tmp2 = {(double)(in2[0]),(double)in2[1]};
+ cdouble out;
+ f(&tmp1, &tmp2, &out);
+ ((float *)op1)[0] = (float)out.real;
+ ((float *)op1)[1] = (float)out.imag;
}
}
/*UFUNC_API*/
static void
-PyUFunc_G_G(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_D_D(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- clongdoubleUnaryFunc *f = (clongdoubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- longdouble *in1 = (longdouble *)ip1;
- longdouble *out = (longdouble *)op;
- clongdouble x, r;
-
- x.real = in1[0];
- x.imag = in1[1];
- f(&x, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ cdoubleUnaryFunc *f = (cdoubleUnaryFunc *)func;
+ UNARY_LOOP {
+ cdouble in1 = *(cdouble *)ip1;
+ cdouble *out = (cdouble *)op1;
+ f(&in1, out);
}
}
/*UFUNC_API*/
static void
-PyUFunc_GG_G(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_DD_D(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- clongdoubleBinaryFunc *f = (clongdoubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- longdouble *in1 = (longdouble *)ip1;
- longdouble *in2 = (longdouble *)ip2;
- longdouble *out = (longdouble *)op;
- clongdouble x,y,r;
-
- x.real = in1[0];
- x.imag = in1[1];
- y.real = in2[0];
- y.imag = in2[1];
- f(&x, &y, &r);
- out[0] = r.real;
- out[1] = r.imag;
+ cdoubleBinaryFunc *f = (cdoubleBinaryFunc *)func;
+ BINARY_LOOP {
+ cdouble in1 = *(cdouble *)ip1;
+ cdouble in2 = *(cdouble *)ip2;
+ cdouble *out = (cdouble *)op1;
+ f(&in1, &in2, out);
}
}
/*UFUNC_API*/
static void
-PyUFunc_F_F_As_D_D(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_G_G(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
- cdoubleUnaryFunc *f = (cdoubleUnaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
- float *in1 = (float *)ip1;
- float *out = (float *)op;
- cdouble x, r;
-
- x.real = in1[0];
- x.imag = in1[1];
- f(&x, &r);
- out[0] = (float)r.real;
- out[1] = (float)r.imag;
+ clongdoubleUnaryFunc *f = (clongdoubleUnaryFunc *)func;
+ UNARY_LOOP {
+ clongdouble in1 = *(clongdouble *)ip1;
+ clongdouble *out = (clongdouble *)op1;
+ f(&in1, out);
}
}
/*UFUNC_API*/
static void
-PyUFunc_FF_F_As_DD_D(char **args, intp *dimensions, intp *steps, void *func)
+PyUFunc_GG_G(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- cdoubleBinaryFunc *f = (cdoubleBinaryFunc *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
- float *in1 = (float *)ip1;
- float *in2 = (float *)ip2;
- float *out = (float *)op;
- cdouble x,y,r;
-
- x.real = in1[0];
- x.imag = in1[1];
- y.real = in2[0];
- y.imag = in2[1];
- f(&x, &y, &r);
- out[0] = (float)r.real;
- out[1] = (float)r.imag;
+ clongdoubleBinaryFunc *f = (clongdoubleBinaryFunc *)func;
+ BINARY_LOOP {
+ clongdouble in1 = *(clongdouble *)ip1;
+ clongdouble in2 = *(clongdouble *)ip2;
+ clongdouble *out = (clongdouble *)op1;
+ f(&in1, &in2, out);
}
}
@@ -456,17 +264,10 @@
static void
PyUFunc_O_O(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
unaryfunc f = (unaryfunc)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
+ UNARY_LOOP {
PyObject *in1 = *(PyObject **)ip1;
- PyObject **out = (PyObject **)op;
+ PyObject **out = (PyObject **)op1;
PyObject *ret;
if (in1 == NULL) {
@@ -485,17 +286,10 @@
static void
PyUFunc_O_O_method(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp os = steps[1];
- char *ip1 = args[0];
- char *op = args[1];
char *meth = (char *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, op += os) {
+ UNARY_LOOP {
PyObject *in1 = *(PyObject **)ip1;
- PyObject **out = (PyObject **)op;
+ PyObject **out = (PyObject **)op1;
PyObject *ret = PyObject_CallMethod(in1, meth, NULL);
if (ret == NULL) {
@@ -510,19 +304,10 @@
static void
PyUFunc_OO_O(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
+ BINARY_LOOP {
PyObject *in1 = *(PyObject **)ip1;
PyObject *in2 = *(PyObject **)ip2;
- PyObject **out = (PyObject **)op;
+ PyObject **out = (PyObject **)op1;
PyObject *ret;
if ((in1 == NULL) || (in2 == NULL)) {
@@ -546,20 +331,11 @@
static void
PyUFunc_OO_O_method(char **args, intp *dimensions, intp *steps, void *func)
{
- intp n = dimensions[0];
- intp is1 = steps[0];
- intp is2 = steps[1];
- intp os = steps[2];
- char *ip1 = args[0];
- char *ip2 = args[1];
- char *op = args[2];
char *meth = (char *)func;
- intp i;
-
- for(i = 0; i < n; i++, ip1 += is1, ip2 += is2, op += os) {
+ BINARY_LOOP {
PyObject *in1 = *(PyObject **)ip1;
PyObject *in2 = *(PyObject **)ip2;
- PyObject **out = (PyObject **)op;
+ PyObject **out = (PyObject **)op1;
PyObject *ret = PyObject_CallMethod(in1, meth, "(O)", in2);
if (ret == NULL) {
More information about the Numpy-svn
mailing list