Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

First attempt at BF for 2165 and added better tests for scalarmath pow function #349

Merged
merged 3 commits into from

4 participants

@ericfode

This closes #621 but brings up what may be a new nastier bug.

It seems that the type conversions that you can build into ufuncs (for example in the codegen file for the npymath files) only work when you call the ufunc from python, and not when you call the generated function from c.

@travisbot

This pull request passes (merged a77a7cd into 143fb18).

@charris charris commented on the diff
numpy/core/src/scalarmathmodule.c.src
@@ -494,16 +494,25 @@ half_ctype_remainder(npy_half a, npy_half b, npy_half *out) {
/**end repeat**/
/**begin repeat
- * #name = half, float, double, longdouble#
@charris Owner
charris added a note

Why remove the half? It is a 16 bit float.

Because it needed to be done by hand, because currently halfs are converted to floats and then worked with.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/src/scalarmathmodule.c.src
((8 lines not shown))
*/
static npy_@name@ (*_basic_@name@_pow)(@type@ a, @type@ b);
+//called when ** is used (not performing properly)
@charris Owner
charris added a note

C++ comments aren't portable, use C style /.../

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/src/scalarmathmodule.c.src
((12 lines not shown))
static void
@name@_ctype_power(@type@ a, @type@ b, @type@ *out) {
- *out = _basic_@name@_pow(a, b);
+ *out = _basic_@name@_pow(a, b);
@charris Owner
charris added a note

Indentation is four spaces (not tabs, not two)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/src/scalarmathmodule.c.src
((16 lines not shown))
}
/**end repeat**/
+static void
+half_ctype_power(npy_half a,npy_half b, npy_half *out)
@charris Owner
charris added a note

OK, I see what you did.

@charris Owner
charris added a note

space after ',' in function argument list.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/tests/test_scalarmath.py
@@ -58,7 +58,18 @@ def test_large_types(self):
assert_(b == 6765201, msg)
else:
assert_almost_equal(b, 6765201, err_msg=msg)
-
+ def test_mixed_types(self):
+ typelist = [np.int8,np.int16,np.float16,np.float32,np.float64,np.int8,np.int16,np.int32,np.int64]
@charris Owner
charris added a note

80 character limit on line length.

@charris Owner
charris added a note

You can also use the letter typecodes in np.typecodes. For instance

In [3]: for dt in typecodes['Float']: print dt
e
f
d
g
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/src/scalarmathmodule.c.src
((8 lines not shown))
*/
static npy_@name@ (*_basic_@name@_pow)(@type@ a, @type@ b);
+//called when ** is used (not performing properly)
static void
@name@_ctype_power(@type@ a, @type@ b, @type@ *out) {
@charris Owner
charris added a note

No yours, but '{' should be on next line.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@charris
Owner

Just made a quick scan for style.

The commit message needs expansion. The first line should be something like

BUG: ticket 2028, <short explanation>

<longer explanation> maybe a summary of the bug and what was done to fix it.
numpy/core/tests/test_scalarmath.py
@@ -58,7 +58,18 @@ def test_large_types(self):
assert_(b == 6765201, msg)
else:
assert_almost_equal(b, 6765201, err_msg=msg)
-
+ def test_mixed_types(self):
+ typelist = [np.int8,np.int16,np.float16,np.float32,np.float64,np.int8,np.int16,np.int32,np.int64]
+ for t1 in typelist:
+ for t2 in typelist:
+ a = t1(3)
+ b = t2(2)
+ o = a**b
+ msg = "error with %r and %r: got %r, expected %r" % (t1,t2,o,9)
@charris Owner
charris added a note

space between elements of the tuple.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/tests/test_scalarmath.py
@@ -58,7 +58,18 @@ def test_large_types(self):
assert_(b == 6765201, msg)
else:
assert_almost_equal(b, 6765201, err_msg=msg)
-
+ def test_mixed_types(self):
+ typelist = [np.int8,np.int16,np.float16,np.float32,np.float64,np.int8,np.int16,np.int32,np.int64]
+ for t1 in typelist:
+ for t2 in typelist:
+ a = t1(3)
+ b = t2(2)
+ o = a**b
+ msg = "error with %r and %r: got %r, expected %r" % (t1,t2,o,9)
+ if np.issubdtype(np.dtype(o),np.integer):
@charris Owner
charris added a note

And spaces between function arguments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
numpy/core/tests/test_scalarmath.py
@@ -58,7 +58,18 @@ def test_large_types(self):
assert_(b == 6765201, msg)
else:
assert_almost_equal(b, 6765201, err_msg=msg)
-
+ def test_mixed_types(self):
+ typelist = [np.int8,np.int16,np.float16,np.float32,np.float64,np.int8,np.int16,np.int32,np.int64]
+ for t1 in typelist:
+ for t2 in typelist:
+ a = t1(3)
+ b = t2(2)
+ o = a**b
@charris Owner
charris added a note

'o'(utput?) is an unusual choice of variable name. Maybe something like tgt (target)?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@travisbot

This pull request passes (merged 6123625 into 143fb18).

@charris
Owner

Should be reanimated.

@ericfode

What needs to be done to get this merged?

numpy/core/src/scalarmathmodule.c.src
@@ -970,7 +979,7 @@ static PyObject *
int retstatus;
int first;
@type@ out = {@zero@, @zero@};
-
+
@charris Owner
charris added a note

Trailing whitespace?

@ericfode
ericfode added a note
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@ericfode ericfode Update scalarmathmodule.c.src
Got rid of some white space in scalarmathmodule.c.src
8b42156
@charris
Owner

I can't figure out what issue this closes, the ones referenced don't look right.

@ericfode
@charris
Owner

OK, looks like it is #621 now.

@charris charris merged commit 134bcb0 into numpy:master
@charris
Owner

@certik Looks like this could be backported to 1.7.x. Eric, do you want to do that?

@ericfode
@certik
Owner

For reference, the backported PR is: #3187.

@ericfode ericfode referenced this pull request
Merged

Float16pow #3187

@certik
Owner

I went over this PR and it looks good to me. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Jul 12, 2012
  1. @ericfode
Commits on Jul 13, 2012
  1. @ericfode

    fixed some style problems

    ericfode authored
Commits on Apr 2, 2013
  1. @ericfode

    Update scalarmathmodule.c.src

    ericfode authored
    Got rid of some white space in scalarmathmodule.c.src
This page is out of date. Refresh to see the latest.
View
17 numpy/core/src/scalarmathmodule.c.src
@@ -494,16 +494,25 @@ half_ctype_remainder(npy_half a, npy_half b, npy_half *out) {
/**end repeat**/
/**begin repeat
- * #name = half, float, double, longdouble#
@charris Owner
charris added a note

Why remove the half? It is a 16 bit float.

Because it needed to be done by hand, because currently halfs are converted to floats and then worked with.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
- * #type = npy_half, npy_float, npy_double, npy_longdouble#
+ * #name = float, double, longdouble#
+ * #type = npy_float, npy_double, npy_longdouble#
*/
static npy_@name@ (*_basic_@name@_pow)(@type@ a, @type@ b);
static void
-@name@_ctype_power(@type@ a, @type@ b, @type@ *out) {
+@name@_ctype_power(@type@ a, @type@ b, @type@ *out)
+{
*out = _basic_@name@_pow(a, b);
}
/**end repeat**/
+static void
+half_ctype_power(npy_half a, npy_half b, npy_half *out)
+{
+ const npy_float af = npy_half_to_float(a);
+ const npy_float bf = npy_half_to_float(b);
+ const npy_float outf = _basic_float_pow(af,bf);
+ *out = npy_float_to_half(outf);
+}
/**begin repeat
* #name = byte, ubyte, short, ushort, int, uint,
@@ -1130,7 +1139,6 @@ static PyObject *
int first;
@type@ out = @zero@;
-
switch(_@name@_convert2_to_ctypes(a, &arg1, b, &arg2)) {
case 0:
break;
@@ -1724,7 +1732,6 @@ get_functions(void)
i += 3;
j++;
}
- _basic_half_pow = funcdata[j - 1];
_basic_float_pow = funcdata[j];
_basic_double_pow = funcdata[j + 1];
_basic_longdouble_pow = funcdata[j + 2];
View
18 numpy/core/tests/test_scalarmath.py
@@ -44,7 +44,7 @@ def test_type_create(self, level=1):
class TestPower(TestCase):
def test_small_types(self):
- for t in [np.int8, np.int16]:
+ for t in [np.int8, np.int16, np.float16]:
a = t(3)
b = a ** 4
assert_(b == 81, "error with %r: got %r" % (t,b))
@@ -58,7 +58,21 @@ def test_large_types(self):
assert_(b == 6765201, msg)
else:
assert_almost_equal(b, 6765201, err_msg=msg)
-
+ def test_mixed_types(self):
+ typelist = [np.int8,np.int16,np.float16,
+ np.float32,np.float64,np.int8,
+ np.int16,np.int32,np.int64]
+ for t1 in typelist:
+ for t2 in typelist:
+ a = t1(3)
+ b = t2(2)
+ result = a**b
+ msg = ("error with %r and %r:"
+ "got %r, expected %r") % (t1, t2, result, 9)
+ if np.issubdtype(np.dtype(result), np.integer):
+ assert_(result == 9, msg)
+ else:
+ assert_almost_equal(result, 9, err_msg=msg)
class TestComplexDivision(TestCase):
def test_zero_division(self):
Something went wrong with that request. Please try again.