Skip to content

Commit 95e6284

Browse files
committed
Ported all functions from algorithm.h
- Changed behavior of reductions to be more pythonish
1 parent 1b23381 commit 95e6284

File tree

2 files changed

+119
-35
lines changed

2 files changed

+119
-35
lines changed

arrayfire/algorithm.py

Lines changed: 113 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,138 @@
11
from .library import *
22
from .array import *
33

4-
def sum(A, dim=0):
5-
out = array()
6-
clib.af_sum(pointer(out.arr), A.arr, c_int(dim))
7-
return out
84

9-
def min(A, dim=0):
5+
def parallel_dim(a, dim, c_func):
106
out = array()
11-
clib.af_min(pointer(out.arr), A.arr, c_int(dim))
7+
c_func(pointer(out.arr), a.arr, c_int(dim))
128
return out
139

14-
def max(A, dim=0):
15-
out = array()
16-
clib.af_max(pointer(out.arr), A.arr, c_int(dim))
17-
return out
10+
def reduce_all(a, c_func):
11+
real = c_double(0)
12+
imag = c_double(0)
13+
c_func(pointer(real), pointer(imag), a.arr)
14+
real = real.value
15+
imag = imag.value
16+
return real if imag == 0 else real + imag * 1j
1817

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
18+
def sum(a, dim=None):
19+
if dim is not None:
20+
return parallel_dim(a, dim, clib.af_sum)
21+
else:
22+
return reduce_all(a, clib.af_sum_all)
23+
24+
def product(a, dim=None):
25+
if dim is not None:
26+
return parallel_dim(a, dim, clib.af_product)
27+
else:
28+
return reduce_all(a, clib.af_product_all)
29+
30+
def min(a, dim=None):
31+
if dim is not None:
32+
return parallel_dim(a, dim, clib.af_min)
33+
else:
34+
return reduce_all(a, clib.af_min_all)
35+
36+
def max(a, dim=None):
37+
if dim is not None:
38+
return parallel_dim(a, dim, clib.af_max)
39+
else:
40+
return reduce_all(a, clib.af_max_all)
41+
42+
def all_true(a, dim=None):
43+
if dim is not None:
44+
return parallel_dim(a, dim, clib.af_all_true)
45+
else:
46+
return reduce_all(a, clib.af_all_true_all)
2347

24-
def all_true(A, dim=0):
48+
def any_true(a, dim=None):
49+
if dim is not None:
50+
return parallel_dim(a, dim, clib.af_any_true)
51+
else:
52+
return reduce_all(a, clib.af_any_true_all)
53+
54+
def count(a, dim=None):
55+
if dim is not None:
56+
return parallel_dim(a, dim, clib.af_count)
57+
else:
58+
return reduce_all(a, clib.af_count_all)
59+
60+
def imin(a, dim=None):
61+
if dim is not None:
62+
out = array()
63+
idx = array()
64+
clib.af_imin(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim))
65+
return out,idx
66+
else:
67+
real = c_double(0)
68+
imag = c_double(0)
69+
idx = c_uint(0)
70+
clib.af_imin_all(pointer(real), pointer(imag), pointer(idx), a.arr)
71+
real = real.value
72+
imag = imag.value
73+
val = real if imag == 0 else real + imag * 1j
74+
return val,idx.value
75+
76+
def imax(a, dim=None):
77+
if dim is not None:
78+
out = array()
79+
idx = array()
80+
clib.af_imax(pointer(out.arr), pointer(idx.arr), a.arr, c_int(dim))
81+
return out,idx
82+
else:
83+
real = c_double(0)
84+
imag = c_double(0)
85+
idx = c_uint(0)
86+
clib.af_imax_all(pointer(real), pointer(imag), pointer(idx), a.arr)
87+
real = real.value
88+
imag = imag.value
89+
val = real if imag == 0 else real + imag * 1j
90+
return val,idx.value
91+
92+
93+
def accum(a, dim=0):
94+
return parallel_dim(a, dim, clib.af_accum)
95+
96+
def where(a):
2597
out = array()
26-
clib.af_all_true(pointer(out.arr), A.arr, c_int(dim))
98+
clib.af_where(pointer(out.arr), a.arr)
2799
return out
28100

29-
def accum(A, dim=0):
101+
def diff1(a, dim=0):
102+
return parallel_dim(a, dim, clib.af_diff1)
103+
104+
def diff2(a, dim=0):
105+
return parallel_dim(a, dim, clib.af_diff2)
106+
107+
def sort(a, dim=0, is_ascending=True):
30108
out = array()
31-
clib.af_accum(pointer(out.arr), A.arr, c_int(dim))
109+
clib.af_sort(pointer(out.arr), a.arr, c_uint(dim), c_bool(is_ascending))
32110
return out
33111

34-
def sort(A, dim=0):
112+
def sort_index(a, dim=0, is_is_ascending=True):
35113
out = array()
36-
clib.af_sort(pointer(out.arr), A.arr, c_int(dim))
37-
return out
114+
idx = array()
115+
clib.af_sort_index(pointer(out.arr), pointer(idx.arr), a.arr, c_uint(dim), c_bool(is_ascending))
116+
return out,idx
117+
118+
def sort_by_key(iv, ik, dim=0, is_is_ascending=True):
119+
ov = array()
120+
ok = array()
121+
clib.af_sort_by_key(pointer(ov.arr), pointer(ok.arr), \
122+
iv.arr, ik.arr, c_uint(dim), c_bool(is_ascending))
123+
return ov,ok
38124

39-
def diff1(A, dim=0):
125+
def set_unique(a, is_sorted=False):
40126
out = array()
41-
clib.af_diff1(pointer(out.arr), A.arr, c_int(dim))
127+
clib.af_set_unique(pointer(out.arr), a.arr, c_bool(is_sorted))
42128
return out
43129

44-
def diff2(A, dim=0):
130+
def set_union(a, b, is_unique=False):
45131
out = array()
46-
clib.af_diff2(pointer(out.arr), A.arr, c_int(dim))
132+
clib.af_set_union(pointer(out.arr), a.arr, b.arr, c_bool(is_sorted))
47133
return out
48134

49-
def where(A):
135+
def set_intersect(a, b, is_unique=False):
50136
out = array()
51-
clib.af_where(pointer(out.arr), A.arr)
137+
clib.af_set_intersect(pointer(out.arr), a.arr, b.arr, c_bool(is_sorted))
52138
return out

examples/helloworld.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
#!/usr/bin/python
22
import arrayfire as af
33

4+
# Display backend information
45
af.info()
56

6-
print('\nGenerate a random matrix a:')
7+
# Generate a uniform random array with a size of 5 elements
78
a = af.randu(5, 1)
8-
af.print_array(a)
99

10-
print('\nMin value of a')
11-
a_min = af.min(a)
12-
af.print_array(a_min)
10+
# Print a and its minimum value
11+
af.print_array(a)
1312

14-
print('\nMax value of a')
15-
a_max = af.max(a)
16-
af.print_array(a_max)
13+
# Print min and max values of a
14+
print("Minimum, Maximum: ", af.min(a), af.max(a))

0 commit comments

Comments
 (0)