[yt-svn] commit/yt: 4 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Wed May 14 05:23:24 PDT 2014


4 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/7ed46605e88f/
Changeset:   7ed46605e88f
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-05-12 14:48:38
Summary:     Adding first ragged array extension.
Affected #:  3 files

diff -r 80b6a3399f45da6e13828a947813cbe0e057f63d -r 7ed46605e88f9fefc3f195054c22bb43b5654a8e yt/utilities/lib/ragged_arrays.pyx
--- /dev/null
+++ b/yt/utilities/lib/ragged_arrays.pyx
@@ -0,0 +1,95 @@
+"""
+Some simple operations for operating on ragged arrays
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2014, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+import numpy as np
+cimport numpy as np
+cimport cython
+
+cdef fused numpy_dt:
+    np.float32_t
+    np.float64_t
+    np.int32_t
+    np.int64_t
+
+cdef numpy_dt r_min(numpy_dt a, numpy_dt b):
+    if a < b: return a
+    return b
+
+cdef numpy_dt r_max(numpy_dt a, numpy_dt b):
+    if a > b: return a
+    return b
+
+cdef numpy_dt r_add(numpy_dt a, numpy_dt b):
+    return a + b
+
+cdef numpy_dt r_subtract(numpy_dt a, numpy_dt b):
+    return a - b
+
+cdef numpy_dt r_multiply(numpy_dt a, numpy_dt b):
+    return a * b
+
+ at cython.cdivision(True)
+cdef numpy_dt r_divide(numpy_dt a, numpy_dt b):
+    return a / b
+
+def index_unop(np.ndarray[numpy_dt, ndim=1] values,
+              np.ndarray[np.int64_t, ndim=1] indices,
+              np.ndarray[np.int64_t, ndim=1] sizes,
+              operation):
+    cdef numpy_dt mi, ma
+    if numpy_dt == np.float32_t:
+        dt = "float32"
+        mi = np.finfo(dt).min
+        ma = np.finfo(dt).max
+    elif numpy_dt == np.float64_t:
+        dt = "float64"
+        mi = np.finfo(dt).min
+        ma = np.finfo(dt).max
+    elif numpy_dt == np.int32_t:
+        dt = "int32"
+        mi = np.iinfo(dt).min
+        ma = np.iinfo(dt).max
+    elif numpy_dt == np.int64_t:
+        dt = "int64"
+        mi = np.iinfo(dt).min
+        ma = np.iinfo(dt).max
+    cdef np.ndarray[numpy_dt] out_values = np.zeros(sizes.size, dtype=dt)
+    cdef numpy_dt (*func)(numpy_dt a, numpy_dt b)
+    # Now we figure out our function.  At present, we only allow addition and
+    # multiplication, because they are commutative and easy to bootstrap.
+    cdef numpy_dt ival, val
+    if operation == "sum":
+        ival = 0
+        func = r_add
+    elif operation == "prod":
+        ival = 1
+        func = r_multiply
+    elif operation == "max":
+        ival = mi
+        func = r_max
+    elif operation == "min":
+        ival = ma
+        func = r_min
+    cdef np.int64_t i, j, ind_ind, ind_arr
+    ind_ind = 0
+    for i in range(sizes.size):
+        # Each entry in sizes is the size of the array
+        val = ival
+        for j in range(sizes[i]):
+            ind_arr = indices[ind_ind]
+            val = func(val, values[ind_arr])
+            ind_ind += 1
+        out_values[i] = val
+    return out_values

diff -r 80b6a3399f45da6e13828a947813cbe0e057f63d -r 7ed46605e88f9fefc3f195054c22bb43b5654a8e yt/utilities/lib/setup.py
--- a/yt/utilities/lib/setup.py
+++ b/yt/utilities/lib/setup.py
@@ -139,6 +139,8 @@
           )
     config.add_extension("write_array",
                          ["yt/utilities/lib/write_array.pyx"])
+    config.add_extension("ragged_arrays",
+                         ["yt/utilities/lib/ragged_arrays.pyx"])
     config.add_extension("GridTree", 
     ["yt/utilities/lib/GridTree.pyx"],
         libraries=["m"], depends=["yt/utilities/lib/fp_utils.pxd"])

diff -r 80b6a3399f45da6e13828a947813cbe0e057f63d -r 7ed46605e88f9fefc3f195054c22bb43b5654a8e yt/utilities/lib/tests/test_ragged_arrays.py
--- /dev/null
+++ b/yt/utilities/lib/tests/test_ragged_arrays.py
@@ -0,0 +1,36 @@
+from yt.testing import *
+import numpy as np
+from yt.utilities.lib.ragged_arrays import index_unop
+
+operations = ((np.sum, "sum"),
+              (np.prod, "prod"),
+              (np.max, "max"),
+              (np.min, "min"))
+dtypes = ((-1e8, 1e8, "float32"),
+          (-1e8, 1e8, "float64"),
+          (-10000, 10000, "int32"),
+          (-100000000, 100000000, "int64"))
+
+def test_index_unop():
+    np.random.seed(0x4d3d3d3)
+    indices = np.arange(1000)
+    np.random.shuffle(indices)
+    sizes = np.array([
+        200, 50, 50, 100, 32, 32, 32, 32, 32, 64, 376], dtype="int64")
+    for mi, ma, dtype in dtypes:
+        for op, operation in operations:
+            # Create a random set of values
+            values = np.random.random(1000)
+            if operation != "prod":
+                values = values * ma + (ma - mi)
+            if operation == "prod" and dtype.startswith("int"):
+                values = values.astype(dtype)
+                values[values != 0] = 1
+                values[values == 0] = -1
+            values = values.astype(dtype)
+            out_values = index_unop(values, indices, sizes, operation)
+            i = 0
+            for j, v in enumerate(sizes):
+                arr = values[indices[i:i+v]]
+                yield assert_almost_equal, op(arr), out_values[j]
+                i += v


https://bitbucket.org/yt_analysis/yt/commits/4c3505c7c582/
Changeset:   4c3505c7c582
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-05-12 15:15:09
Summary:     Add a catch in case an unimplemented op is supplied.
Affected #:  1 file

diff -r 7ed46605e88f9fefc3f195054c22bb43b5654a8e -r 4c3505c7c582b47d670a1cb4e5165e82adf11c28 yt/utilities/lib/ragged_arrays.pyx
--- a/yt/utilities/lib/ragged_arrays.pyx
+++ b/yt/utilities/lib/ragged_arrays.pyx
@@ -82,6 +82,8 @@
     elif operation == "min":
         ival = ma
         func = r_min
+    else:
+        raise NotImplementedError
     cdef np.int64_t i, j, ind_ind, ind_arr
     ind_ind = 0
     for i in range(sizes.size):


https://bitbucket.org/yt_analysis/yt/commits/6d232a04fdc6/
Changeset:   6d232a04fdc6
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-05-12 17:05:26
Summary:     Change to exactly equal.
Affected #:  1 file

diff -r 4c3505c7c582b47d670a1cb4e5165e82adf11c28 -r 6d232a04fdc6e1255cc1156e47bba1f940f3846d yt/utilities/lib/tests/test_ragged_arrays.py
--- a/yt/utilities/lib/tests/test_ragged_arrays.py
+++ b/yt/utilities/lib/tests/test_ragged_arrays.py
@@ -32,5 +32,5 @@
             i = 0
             for j, v in enumerate(sizes):
                 arr = values[indices[i:i+v]]
-                yield assert_almost_equal, op(arr), out_values[j]
+                yield assert_equal, op(arr), out_values[j]
                 i += v


https://bitbucket.org/yt_analysis/yt/commits/036f745796c1/
Changeset:   036f745796c1
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-05-14 14:23:19
Summary:     Merged in MatthewTurk/yt/yt-3.0 (pull request #898)

Adding first ragged array extension.
Affected #:  3 files

diff -r 4d1488b8fa476b1e6f5cb90c16312fce75abe34e -r 036f745796c12e66b4636835800f2b029bbe7b4b yt/utilities/lib/ragged_arrays.pyx
--- /dev/null
+++ b/yt/utilities/lib/ragged_arrays.pyx
@@ -0,0 +1,97 @@
+"""
+Some simple operations for operating on ragged arrays
+
+
+
+"""
+
+#-----------------------------------------------------------------------------
+# Copyright (c) 2014, yt Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file COPYING.txt, distributed with this software.
+#-----------------------------------------------------------------------------
+
+import numpy as np
+cimport numpy as np
+cimport cython
+
+cdef fused numpy_dt:
+    np.float32_t
+    np.float64_t
+    np.int32_t
+    np.int64_t
+
+cdef numpy_dt r_min(numpy_dt a, numpy_dt b):
+    if a < b: return a
+    return b
+
+cdef numpy_dt r_max(numpy_dt a, numpy_dt b):
+    if a > b: return a
+    return b
+
+cdef numpy_dt r_add(numpy_dt a, numpy_dt b):
+    return a + b
+
+cdef numpy_dt r_subtract(numpy_dt a, numpy_dt b):
+    return a - b
+
+cdef numpy_dt r_multiply(numpy_dt a, numpy_dt b):
+    return a * b
+
+ at cython.cdivision(True)
+cdef numpy_dt r_divide(numpy_dt a, numpy_dt b):
+    return a / b
+
+def index_unop(np.ndarray[numpy_dt, ndim=1] values,
+              np.ndarray[np.int64_t, ndim=1] indices,
+              np.ndarray[np.int64_t, ndim=1] sizes,
+              operation):
+    cdef numpy_dt mi, ma
+    if numpy_dt == np.float32_t:
+        dt = "float32"
+        mi = np.finfo(dt).min
+        ma = np.finfo(dt).max
+    elif numpy_dt == np.float64_t:
+        dt = "float64"
+        mi = np.finfo(dt).min
+        ma = np.finfo(dt).max
+    elif numpy_dt == np.int32_t:
+        dt = "int32"
+        mi = np.iinfo(dt).min
+        ma = np.iinfo(dt).max
+    elif numpy_dt == np.int64_t:
+        dt = "int64"
+        mi = np.iinfo(dt).min
+        ma = np.iinfo(dt).max
+    cdef np.ndarray[numpy_dt] out_values = np.zeros(sizes.size, dtype=dt)
+    cdef numpy_dt (*func)(numpy_dt a, numpy_dt b)
+    # Now we figure out our function.  At present, we only allow addition and
+    # multiplication, because they are commutative and easy to bootstrap.
+    cdef numpy_dt ival, val
+    if operation == "sum":
+        ival = 0
+        func = r_add
+    elif operation == "prod":
+        ival = 1
+        func = r_multiply
+    elif operation == "max":
+        ival = mi
+        func = r_max
+    elif operation == "min":
+        ival = ma
+        func = r_min
+    else:
+        raise NotImplementedError
+    cdef np.int64_t i, j, ind_ind, ind_arr
+    ind_ind = 0
+    for i in range(sizes.size):
+        # Each entry in sizes is the size of the array
+        val = ival
+        for j in range(sizes[i]):
+            ind_arr = indices[ind_ind]
+            val = func(val, values[ind_arr])
+            ind_ind += 1
+        out_values[i] = val
+    return out_values

diff -r 4d1488b8fa476b1e6f5cb90c16312fce75abe34e -r 036f745796c12e66b4636835800f2b029bbe7b4b yt/utilities/lib/setup.py
--- a/yt/utilities/lib/setup.py
+++ b/yt/utilities/lib/setup.py
@@ -139,6 +139,8 @@
           )
     config.add_extension("write_array",
                          ["yt/utilities/lib/write_array.pyx"])
+    config.add_extension("ragged_arrays",
+                         ["yt/utilities/lib/ragged_arrays.pyx"])
     config.add_extension("GridTree", 
     ["yt/utilities/lib/GridTree.pyx"],
         libraries=["m"], depends=["yt/utilities/lib/fp_utils.pxd"])

diff -r 4d1488b8fa476b1e6f5cb90c16312fce75abe34e -r 036f745796c12e66b4636835800f2b029bbe7b4b yt/utilities/lib/tests/test_ragged_arrays.py
--- /dev/null
+++ b/yt/utilities/lib/tests/test_ragged_arrays.py
@@ -0,0 +1,36 @@
+from yt.testing import *
+import numpy as np
+from yt.utilities.lib.ragged_arrays import index_unop
+
+operations = ((np.sum, "sum"),
+              (np.prod, "prod"),
+              (np.max, "max"),
+              (np.min, "min"))
+dtypes = ((-1e8, 1e8, "float32"),
+          (-1e8, 1e8, "float64"),
+          (-10000, 10000, "int32"),
+          (-100000000, 100000000, "int64"))
+
+def test_index_unop():
+    np.random.seed(0x4d3d3d3)
+    indices = np.arange(1000)
+    np.random.shuffle(indices)
+    sizes = np.array([
+        200, 50, 50, 100, 32, 32, 32, 32, 32, 64, 376], dtype="int64")
+    for mi, ma, dtype in dtypes:
+        for op, operation in operations:
+            # Create a random set of values
+            values = np.random.random(1000)
+            if operation != "prod":
+                values = values * ma + (ma - mi)
+            if operation == "prod" and dtype.startswith("int"):
+                values = values.astype(dtype)
+                values[values != 0] = 1
+                values[values == 0] = -1
+            values = values.astype(dtype)
+            out_values = index_unop(values, indices, sizes, operation)
+            i = 0
+            for j, v in enumerate(sizes):
+                arr = values[indices[i:i+v]]
+                yield assert_equal, op(arr), out_values[j]
+                i += v

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list