|
1 | 1 | from .library import * |
2 | 2 | from .array import * |
3 | 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 | 4 |
|
9 | | -def min(A, dim=0): |
| 5 | +def parallel_dim(a, dim, c_func): |
10 | 6 | 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)) |
12 | 8 | return out |
13 | 9 |
|
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 |
18 | 17 |
|
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) |
23 | 47 |
|
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): |
25 | 97 | out = array() |
26 | | - clib.af_all_true(pointer(out.arr), A.arr, c_int(dim)) |
| 98 | + clib.af_where(pointer(out.arr), a.arr) |
27 | 99 | return out |
28 | 100 |
|
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): |
30 | 108 | 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)) |
32 | 110 | return out |
33 | 111 |
|
34 | | -def sort(A, dim=0): |
| 112 | +def sort_index(a, dim=0, is_is_ascending=True): |
35 | 113 | 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 |
38 | 124 |
|
39 | | -def diff1(A, dim=0): |
| 125 | +def set_unique(a, is_sorted=False): |
40 | 126 | 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)) |
42 | 128 | return out |
43 | 129 |
|
44 | | -def diff2(A, dim=0): |
| 130 | +def set_union(a, b, is_unique=False): |
45 | 131 | 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)) |
47 | 133 | return out |
48 | 134 |
|
49 | | -def where(A): |
| 135 | +def set_intersect(a, b, is_unique=False): |
50 | 136 | 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)) |
52 | 138 | return out |
0 commit comments