[python-arrayfire] 16/250: Adding error checking to all clib function calls

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Mon Mar 28 22:59:26 UTC 2016


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch debian/master
in repository python-arrayfire.

commit f728d7a9c4c4834553c722dc3ce109ec3288cc58
Author: Pavan Yalamanchili <pavan at arrayfire.com>
Date:   Mon Jun 22 08:38:35 2015 -0400

    Adding error checking to all clib function calls
---
 arrayfire/algorithm.py | 29 +++++++++++++++--------------
 arrayfire/array.py     | 21 ++++++++++++---------
 arrayfire/data.py      | 38 +++++++++++++++++++-------------------
 arrayfire/util.py      | 12 ++++++++----
 4 files changed, 54 insertions(+), 46 deletions(-)

diff --git a/arrayfire/algorithm.py b/arrayfire/algorithm.py
index 0b1aaa1..3da47f8 100644
--- a/arrayfire/algorithm.py
+++ b/arrayfire/algorithm.py
@@ -4,13 +4,13 @@ from .array import *
 
 def parallel_dim(a, dim, c_func):
     out = array()
-    c_func(pointer(out.arr), a.arr, c_int(dim))
+    safe_call(c_func(pointer(out.arr), a.arr, c_int(dim)))
     return out
 
 def reduce_all(a, c_func):
     real = c_double(0)
     imag = c_double(0)
-    c_func(pointer(real), pointer(imag), a.arr)
+    safe_call(c_func(pointer(real), pointer(imag), a.arr))
     real = real.value
     imag = imag.value
     return real if imag == 0 else real + imag * 1j
@@ -61,13 +61,13 @@ def imin(a, dim=None):
     if dim is not None:
         out = array()
         idx = array()
-        clib.af_imin(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim))
+        safe_call(clib.af_imin(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim)))
         return out,idx
     else:
         real = c_double(0)
         imag = c_double(0)
         idx  = c_uint(0)
-        clib.af_imin_all(pointer(real), pointer(imag), pointer(idx), a.arr)
+        safe_call(clib.af_imin_all(pointer(real), pointer(imag), pointer(idx), a.arr))
         real = real.value
         imag = imag.value
         val = real if imag == 0 else real + imag * 1j
@@ -77,13 +77,13 @@ def imax(a, dim=None):
     if dim is not None:
         out = array()
         idx = array()
-        clib.af_imax(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim))
+        safe_call(clib.af_imax(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim)))
         return out,idx
     else:
         real = c_double(0)
         imag = c_double(0)
         idx  = c_uint(0)
-        clib.af_imax_all(pointer(real), pointer(imag), pointer(idx), a.arr)
+        safe_call(clib.af_imax_all(pointer(real), pointer(imag), pointer(idx), a.arr))
         real = real.value
         imag = imag.value
         val = real if imag == 0 else real + imag * 1j
@@ -95,7 +95,7 @@ def accum(a, dim=0):
 
 def where(a):
     out = array()
-    clib.af_where(pointer(out.arr), a.arr)
+    safe_call(clib.af_where(pointer(out.arr), a.arr))
     return out
 
 def diff1(a, dim=0):
@@ -106,33 +106,34 @@ def diff2(a, dim=0):
 
 def sort(a, dim=0, is_ascending=True):
     out = array()
-    clib.af_sort(pointer(out.arr), a.arr, c_uint(dim), c_bool(is_ascending))
+    safe_call(clib.af_sort(pointer(out.arr), a.arr, c_uint(dim), c_bool(is_ascending)))
     return out
 
 def sort_index(a, dim=0, is_ascending=True):
     out = array()
     idx = array()
-    clib.af_sort_index(pointer(out.arr), pointer(idx.arr), a.arr, c_uint(dim), c_bool(is_ascending))
+    safe_call(clib.af_sort_index(pointer(out.arr), pointer(idx.arr), a.arr, \
+                                 c_uint(dim), c_bool(is_ascending)))
     return out,idx
 
 def sort_by_key(iv, ik, dim=0, is_ascending=True):
     ov = array()
     ok = array()
-    clib.af_sort_by_key(pointer(ov.arr), pointer(ok.arr), \
-                        iv.arr, ik.arr, c_uint(dim), c_bool(is_ascending))
+    safe_call(clib.af_sort_by_key(pointer(ov.arr), pointer(ok.arr), \
+                                  iv.arr, ik.arr, c_uint(dim), c_bool(is_ascending)))
     return ov,ok
 
 def set_unique(a, is_sorted=False):
     out = array()
-    clib.af_set_unique(pointer(out.arr), a.arr, c_bool(is_sorted))
+    safe_call(clib.af_set_unique(pointer(out.arr), a.arr, c_bool(is_sorted)))
     return out
 
 def set_union(a, b, is_unique=False):
     out = array()
-    clib.af_set_union(pointer(out.arr), a.arr, b.arr, c_bool(is_unique))
+    safe_call(clib.af_set_union(pointer(out.arr), a.arr, b.arr, c_bool(is_unique)))
     return out
 
 def set_intersect(a, b, is_unique=False):
     out = array()
-    clib.af_set_intersect(pointer(out.arr), a.arr, b.arr, c_bool(is_unique))
+    safe_call(clib.af_set_intersect(pointer(out.arr), a.arr, b.arr, c_bool(is_unique)))
     return out
diff --git a/arrayfire/array.py b/arrayfire/array.py
index 9f1e156..13c2c57 100644
--- a/arrayfire/array.py
+++ b/arrayfire/array.py
@@ -6,7 +6,7 @@ from .data import *
 def create_array(buf, numdims, idims, dtype):
     out_arr = c_longlong(0)
     c_dims = dim4(idims[0], idims[1], idims[2], idims[3])
-    clib.af_create_array(pointer(out_arr), c_longlong(buf), numdims, pointer(c_dims), dtype)
+    safe_call(clib.af_create_array(pointer(out_arr), c_longlong(buf), numdims, pointer(c_dims), dtype))
     return out_arr
 
 def constant_array(val, d0, d1=None, d2=None, d3=None, dtype=f32):
@@ -23,16 +23,16 @@ def constant_array(val, d0, d1=None, d2=None, d3=None, dtype=f32):
         if (dtype != c32 and dtype != c64):
             dtype = c32
 
-        clib.af_constant_complex(pointer(out), c_real, c_imag, 4, pointer(dims), dtype)
+        safe_call(clib.af_constant_complex(pointer(out), c_real, c_imag, 4, pointer(dims), dtype))
     elif dtype == s64:
         c_val = c_longlong(val.real)
-        clib.af_constant_long(pointer(out), c_val, 4, pointer(dims))
+        safe_call(clib.af_constant_long(pointer(out), c_val, 4, pointer(dims)))
     elif dtype == u64:
         c_val = c_ulonglong(val.real)
-        clib.af_constant_ulong(pointer(out), c_val, 4, pointer(dims))
+        safe_call(clib.af_constant_ulong(pointer(out), c_val, 4, pointer(dims)))
     else:
         c_val = c_double(val)
-        clib.af_constant(pointer(out), c_val, 4, pointer(dims), dtype)
+        safe_call(clib.af_constant(pointer(out), c_val, 4, pointer(dims), dtype))
 
     return out
 
@@ -49,7 +49,7 @@ def binary_func(lhs, rhs, c_func):
     elif not isinstance(rhs, array):
         TypeError("Invalid parameter to binary function")
 
-    c_func(pointer(out.arr), lhs.arr, other.arr, False)
+    safe_call(c_func(pointer(out.arr), lhs.arr, other.arr, False))
 
     return out
 
@@ -129,7 +129,7 @@ class array(object):
 
     def numdims(self):
         nd = c_uint(0)
-        clib.af_get_numdims(pointer(nd), self.arr)
+        safe_call(clib.af_get_numdims(pointer(nd), self.arr))
         return nd.value
 
     def dims(self):
@@ -137,13 +137,13 @@ class array(object):
         d1 = c_longlong(0)
         d2 = c_longlong(0)
         d3 = c_longlong(0)
-        clib.af_get_dims(pointer(d0), pointer(d1), pointer(d2), pointer(d3), self.arr)
+        safe_call(clib.af_get_dims(pointer(d0), pointer(d1), pointer(d2), pointer(d3), self.arr))
         dims = (d0.value,d1.value,d2.value,d3.value)
         return dims[:self.numdims()]
 
     def type(self):
         dty = f32
-        clib.af_get_type(pointer(dty), self.arr)
+        safe_call(clib.af_get_type(pointer(dty), self.arr))
         return dty
 
     def __add__(self, other):
@@ -286,3 +286,6 @@ class array(object):
     # TODO:
     # def __abs__(self):
     #     return self
+
+def print_array(a):
+    safe_call(clib.af_print_array(a.arr))
diff --git a/arrayfire/data.py b/arrayfire/data.py
index b4ad706..a1e91fe 100644
--- a/arrayfire/data.py
+++ b/arrayfire/data.py
@@ -18,7 +18,7 @@ def range(d0, d1=None, d2=None, d3=None, dim=-1, dtype=f32):
     out = array()
     dims = dim4(d0, d1, d2, d3)
 
-    clib.af_range(pointer(out.arr), 4, pointer(dims), dim, dtype)
+    safe_call(clib.af_range(pointer(out.arr), 4, pointer(dims), dim, dtype))
     return out
 
 
@@ -36,7 +36,7 @@ def iota(d0, d1=None, d2=None, d3=None, dim=-1, tile_dims=None, dtype=f32):
 
     tdims = dim4(td[0], td[1], td[2], td[3])
 
-    clib.af_iota(pointer(out.arr), 4, pointer(dims), 4, pointer(tdims), dtype)
+    safe_call(clib.af_iota(pointer(out.arr), 4, pointer(dims), 4, pointer(tdims), dtype))
     return out
 
 def randu(d0, d1=None, d2=None, d3=None, dtype=f32):
@@ -47,7 +47,7 @@ def randu(d0, d1=None, d2=None, d3=None, dtype=f32):
     out = array()
     dims = dim4(d0, d1, d2, d3)
 
-    clib.af_randu(pointer(out.arr), 4, pointer(dims), dtype)
+    safe_call(clib.af_randu(pointer(out.arr), 4, pointer(dims), dtype))
     return out
 
 def randn(d0, d1=None, d2=None, d3=None, dtype=f32):
@@ -58,15 +58,15 @@ def randn(d0, d1=None, d2=None, d3=None, dtype=f32):
     out = array()
     dims = dim4(d0, d1, d2, d3)
 
-    clib.af_randn(pointer(out.arr), 4, pointer(dims), dtype)
+    safe_call(clib.af_randn(pointer(out.arr), 4, pointer(dims), dtype))
     return out
 
 def set_seed(seed=0):
-    clib.af_set_seed(c_ulonglong(seed))
+    safe_call(clib.af_set_seed(c_ulonglong(seed)))
 
 def get_seed():
     seed = c_ulonglong(0)
-    clib.af_get_seed(pointer(seed))
+    safe_call(clib.af_get_seed(pointer(seed)))
     return seed.value
 
 def identity(d0, d1=None, d2=None, d3=None, dtype=f32):
@@ -77,21 +77,21 @@ def identity(d0, d1=None, d2=None, d3=None, dtype=f32):
     out = array()
     dims = dim4(d0, d1, d2, d3)
 
-    clib.af_identity(pointer(out.arr), 4, pointer(dims), dtype)
+    safe_call(clib.af_identity(pointer(out.arr), 4, pointer(dims), dtype))
     return out
 
 def diag(a, num=0, extract=True):
     out = array()
     if extract:
-        clib.af_diag_extract(pointer(out.arr), a.arr, c_int(num))
+        safe_call(clib.af_diag_extract(pointer(out.arr), a.arr, c_int(num)))
     else:
-        clib.af_diag_create(pointer(out.arr), a.arr, c_int(num))
+        safe_call(clib.af_diag_create(pointer(out.arr), a.arr, c_int(num)))
     return out
 
 def join(dim, first, second, third=None, fourth=None):
     out = array()
     if (third is None and fourth is None):
-        clib.af_join(pointer(out.arr), dim, first.arr, second.arr)
+        safe_call(clib.af_join(pointer(out.arr), dim, first.arr, second.arr))
     else:
         c_array_vec = dim4(first, second, 0, 0)
         num = 2
@@ -102,47 +102,47 @@ def join(dim, first, second, third=None, fourth=None):
             c_array_vec[num] = fourth.arr
             num+=1
 
-        clib.af_join_many(pointer(out.arr), dim, num, pointer(c_array_vec))
+        safe_call(clib.af_join_many(pointer(out.arr), dim, num, pointer(c_array_vec)))
 
 
 def tile(a, d0, d1=1, d2=1, d3=1):
     out = array()
-    clib.af_tile(pointer(out.arr), a.arr, d0, d1, d2, d3)
+    safe_call(clib.af_tile(pointer(out.arr), a.arr, d0, d1, d2, d3))
     return out
 
 
 def reorder(a, d0=1, d1=0, d2=2, d3=3):
     out = array()
-    clib.af_reorder(pointer(out.arr), a.arr, d0, d1, d2, d3)
+    safe_call(clib.af_reorder(pointer(out.arr), a.arr, d0, d1, d2, d3))
     return out
 
 def shift(a, d0, d1=0, d2=0, d3=0):
     out = array()
-    clib.af_shift(pointer(out.arr), a.arr, d0, d1, d2, d3)
+    safe_call(clib.af_shift(pointer(out.arr), a.arr, d0, d1, d2, d3))
     return out
 
 def moddims(a, d0, d1=1, d2=1, d3=1):
     out = array()
     dims = dim4(d0, d1, d2, d3)
-    clib.af_moddims(pointer(out.arr), a.arr, 4, pointer(dims))
+    safe_call(clib.af_moddims(pointer(out.arr), a.arr, 4, pointer(dims)))
     return out
 
 def flat(a):
     out = array()
-    clib.af_flat(pointer(out.arr), a.arr)
+    safe_call(clib.af_flat(pointer(out.arr), a.arr))
     return out
 
 def flip(a, dim=0):
     out = array()
-    clib.af_flip(pointer(out.arr), a.arr, c_int(dim))
+    safe_call(clib.af_flip(pointer(out.arr), a.arr, c_int(dim)))
     return out
 
 def lower(a, is_unit_diag=False):
     out = array()
-    clib.af_lower(pointer(out.arr), a.arr, is_unit_diag)
+    safe_call(clib.af_lower(pointer(out.arr), a.arr, is_unit_diag))
     return out
 
 def upper(a, is_unit_diag=False):
     out = array()
-    clib.af_upper(pointer(out.arr), a.arr, is_unit_diag)
+    safe_call(clib.af_upper(pointer(out.arr), a.arr, is_unit_diag))
     return out
diff --git a/arrayfire/util.py b/arrayfire/util.py
index 0f2ed8f..ed961be 100644
--- a/arrayfire/util.py
+++ b/arrayfire/util.py
@@ -1,5 +1,5 @@
+import inspect
 from .library import *
-from .array import *
 
 def dim4(d0=1, d1=1, d2=1, d3=1):
     c_dim4 = c_longlong * 4
@@ -19,8 +19,12 @@ def dim4_tuple(dims):
 
     return tuple(out)
 
-def print_array(a):
-    clib.af_print_array(a.arr)
-
 def is_valid_scalar(a):
     return isinstance(a, float) or isinstance(a, int) or isinstance(a, complex)
+
+def safe_call(af_error):
+    if (af_error != AF_SUCCESS.value):
+        c_err_str = c_char_p(0)
+        c_err_len = c_longlong(0)
+        clib.af_get_last_error(pointer(c_err_str), pointer(c_err_len))
+        raise RuntimeError(c_err_str.value, af_error)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/python-arrayfire.git



More information about the debian-science-commits mailing list