Skip to content

Commit 9883450

Browse files
committed
Porting a few basic functions to python
1 parent b17825a commit 9883450

File tree

7 files changed

+276
-0
lines changed

7 files changed

+276
-0
lines changed

arrayfire/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from .library import *
2+
from .data import *
3+
from .util import *
4+
from .algorithm import *
5+
6+
def info():
7+
clib.af_info()

arrayfire/algorithm.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from .library import *
2+
from .array import *
3+
4+
def sum(A, dim=0):
5+
out = array()
6+
clib.af_sum(pointer(out.arr), A.arr, c_int(dim))
7+
return out
8+
9+
def min(A, dim=0):
10+
out = array()
11+
clib.af_min(pointer(out.arr), A.arr, c_int(dim))
12+
return out
13+
14+
def max(A, dim=0):
15+
out = array()
16+
clib.af_max(pointer(out.arr), A.arr, c_int(dim))
17+
return out
18+
19+
def any_true(A, dim=0):
20+
out = array()
21+
clib.af_any_true(pointer(out.arr), A.arr, c_int(dim))
22+
return out
23+
24+
def all_true(A, dim=0):
25+
out = array()
26+
clib.af_all_true(pointer(out.arr), A.arr, c_int(dim))
27+
return out
28+
29+
def accum(A, dim=0):
30+
out = array()
31+
clib.af_accum(pointer(out.arr), A.arr, c_int(dim))
32+
return out
33+
34+
def sort(A, dim=0):
35+
out = array()
36+
clib.af_sort(pointer(out.arr), A.arr, c_int(dim))
37+
return out
38+
39+
def diff1(A, dim=0):
40+
out = array()
41+
clib.af_diff1(pointer(out.arr), A.arr, c_int(dim))
42+
return out
43+
44+
def diff2(A, dim=0):
45+
out = array()
46+
clib.af_diff2(pointer(out.arr), A.arr, c_int(dim))
47+
return out
48+
49+
def where(A):
50+
out = array()
51+
clib.af_where(pointer(out.arr), A.arr)
52+
return out

arrayfire/array.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from .library import *
2+
3+
class array(object):
4+
5+
def __init__(self):
6+
self.arr = c_longlong(0)
7+
8+
def __del__(self):
9+
if (self.arr.value != 0):
10+
clib.af_release_array(self.arr)

arrayfire/data.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from .library import *
2+
from .array import *
3+
from .util import *
4+
5+
def randu(d0, d1=None, d2=None, d3=None, dtype=f32):
6+
7+
if not isinstance(dtype, c_int):
8+
raise TypeError("Invalid dtype")
9+
10+
out = array()
11+
dims = dim4(d0, d1, d2, d3)
12+
13+
clib.af_randu(pointer(out.arr), 4, pointer(dims), dtype)
14+
return out
15+
16+
def randn(d0, d1=None, d2=None, d3=None, dtype=f32):
17+
18+
if not isinstance(dtype, c_int):
19+
raise TypeError("Invalid dtype")
20+
21+
out = array()
22+
dims = dim4(d0, d1, d2, d3)
23+
24+
clib.af_randn(pointer(out.arr), 4, pointer(dims), dtype)
25+
return out
26+
27+
def identity(d0, d1=None, d2=None, d3=None, dtype=f32):
28+
29+
if not isinstance(dtype, c_int):
30+
raise TypeError("Invalid dtype")
31+
32+
out = array()
33+
dims = dim4(d0, d1, d2, d3)
34+
35+
clib.af_identity(pointer(out.arr), 4, pointer(dims), dtype)
36+
return out
37+
38+
def constant(val, d0, d1=None, d2=None, d3=None, dtype=f32):
39+
40+
if not isinstance(dtype, c_int):
41+
raise TypeError("Invalid dtype")
42+
43+
out = array()
44+
dims = dim4(d0, d1, d2, d3)
45+
c_val = c_double(val)
46+
clib.af_constant(pointer(out.arr), c_val, 4, pointer(dims), dtype)
47+
return out

arrayfire/library.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import platform
2+
from ctypes import *
3+
4+
def load_backend(name):
5+
platform_name = platform.system()
6+
7+
libname = 'libaf' + name
8+
if platform_name == 'Linux':
9+
libname += '.so'
10+
elif platform_name == 'Darwin':
11+
libname += '.dylib'
12+
else:
13+
raise OSError(platform_name + ' not supported')
14+
15+
cdll.LoadLibrary(libname)
16+
clib = CDLL(libname)
17+
print("Using %s backend" % name)
18+
return clib
19+
20+
try:
21+
clib = load_backend('cuda')
22+
except:
23+
try:
24+
clib = load_backend('opencl')
25+
except:
26+
clib = load_backend('cpu')
27+
28+
29+
AF_SUCCESS = c_int(0)
30+
31+
#100-199 Errors in environment
32+
AF_ERR_NO_MEM = c_int(101)
33+
AF_ERR_DRIVER = c_int(102)
34+
AF_ERR_RUNTIME = c_int(103)
35+
36+
# 200-299 Errors in input parameters
37+
AF_ERR_INVALID_ARRAY = c_int(201)
38+
AF_ERR_ARG = c_int(202)
39+
AF_ERR_SIZE = c_int(203)
40+
AF_ERR_TYPE = c_int(204)
41+
AF_ERR_DIFF_TYPE = c_int(205)
42+
AF_ERR_BATCH = c_int(207)
43+
44+
# 300-399 Errors for missing software features
45+
AF_ERR_NOT_SUPPORTED = c_int(301)
46+
AF_ERR_NOT_CONFIGURED = c_int(302)
47+
48+
# 400-499 Errors for missing hardware features
49+
AF_ERR_NO_DBL = c_int(401)
50+
AF_ERR_NO_GFX = c_int(402)
51+
52+
# 900-999 Errors from upstream libraries and runtimes
53+
AF_ERR_INTERNAL = c_int(998)
54+
AF_ERR_UNKNOWN = c_int(999)
55+
56+
f32 = c_int(0)
57+
c32 = c_int(1)
58+
f64 = c_int(2)
59+
c64 = c_int(3)
60+
b8 = c_int(4)
61+
s32 = c_int(5)
62+
u32 = c_int(6)
63+
u8 = c_int(7)
64+
s64 = c_int(8)
65+
u64 = c_int(9)
66+
67+
afDevice = c_int(0)
68+
afHost = c_int(1)
69+
70+
AF_INTERP_NEAREST = c_int(0)
71+
AF_INTERP_LINEAR = c_int(1)
72+
AF_INTERP_BILINEAR = c_int(2)
73+
AF_INTERP_CUBIC = c_int(3)
74+
75+
AF_PAD_ZERO = c_int(0)
76+
AF_PAD_SYM = c_int(1)
77+
78+
AF_CONNECTIVITY_4 = c_int(4)
79+
AF_CONNECTIVITY_8 = c_int(8)
80+
81+
AF_CONV_DEFAULT = c_int(0)
82+
AF_CONV_EXPAND = c_int(1)
83+
84+
AF_CONV_AUTO = c_int(0)
85+
AF_CONV_SPATIAL = c_int(1)
86+
AF_CONV_FREQ = c_int(2)
87+
88+
AF_SAD = c_int(0)
89+
AF_ZSAD = c_int(1)
90+
AF_LSAD = c_int(2)
91+
AF_SSD = c_int(3)
92+
AF_ZSSD = c_int(4)
93+
AF_LSSD = c_int(5)
94+
AF_NCC = c_int(6)
95+
AF_ZNCC = c_int(7)
96+
AF_SHD = c_int(8)
97+
98+
AF_GRAY = c_int(0)
99+
AF_RGB = c_int(1)
100+
AF_HSV = c_int(2)
101+
102+
AF_MAT_NONE = c_int(0)
103+
AF_MAT_TRANS = c_int(1)
104+
AF_MAT_CTRANS = c_int(2)
105+
AF_MAT_UPPER = c_int(32)
106+
AF_MAT_LOWER = c_int(64)
107+
AF_MAT_DIAG_UNIT = c_int(128)
108+
AF_MAT_SYM = c_int(512)
109+
AF_MAT_POSDEF = c_int(1024)
110+
AF_MAT_ORTHOG = c_int(2048)
111+
AF_MAT_TRI_DIAG = c_int(4096)
112+
AF_MAT_BLOCK_DIAG = c_int(8192)
113+
114+
AF_NORM_VECTOR_1 = c_int(0)
115+
AF_NORM_VECTOR_INF = c_int(1)
116+
AF_NORM_VECTOR_2 = c_int(2)
117+
AF_NORM_VECTOR_P = c_int(3)
118+
AF_NORM_MATRIX_1 = c_int(4)
119+
AF_NORM_MATRIX_INF = c_int(5)
120+
AF_NORM_MATRIX_2 = c_int(6)
121+
AF_NORM_MATRIX_L_PQ = c_int(7)
122+
AF_NORM_EUCLID = AF_NORM_VECTOR_2
123+
124+
AF_COLORMAP_DEFAULT = c_int(0)
125+
AF_COLORMAP_SPECTRUM = c_int(1)
126+
AF_COLORMAP_COLORS = c_int(2)
127+
AF_COLORMAP_RED = c_int(3)
128+
AF_COLORMAP_MOOD = c_int(4)
129+
AF_COLORMAP_HEAT = c_int(5)
130+
AF_COLORMAP_BLUE = c_int(6)

arrayfire/util.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from .library import *
2+
from .array import *
3+
4+
def dim4(d0=1, d1=1, d2=1, d3=1):
5+
c_dim4 = c_longlong * 4
6+
out = c_dim4(1, 1, 1, 1)
7+
8+
for i, dim in enumerate((d0, d1, d2, d3)):
9+
if (dim is not None): out[i] = dim
10+
11+
return out
12+
13+
def print_array(a):
14+
clib.af_print_array(a.arr)

examples/helloworld.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/python
2+
import arrayfire as af
3+
4+
af.info()
5+
6+
print('\nGenerate a random matrix a:')
7+
a = af.randu(5, 1)
8+
af.print_array(a)
9+
10+
print('\nMin value of a')
11+
a_min = af.min(a)
12+
af.print_array(a_min)
13+
14+
print('\nMax value of a')
15+
a_max = af.max(a)
16+
af.print_array(a_max)

0 commit comments

Comments
 (0)