Skip to content

Commit 6fa3f93

Browse files
committed
Merge pull request #12 from arrayfire/algorithm
Added rust API for functions in af/algorithm.h
2 parents a59e890 + c0ddaaa commit 6fa3f93

File tree

3 files changed

+383
-26
lines changed

3 files changed

+383
-26
lines changed

src/algorithm/mod.rs

Lines changed: 373 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,373 @@
1+
extern crate libc;
2+
3+
use super::Array as Array;
4+
use libc::{c_int, c_uint, c_double};
5+
6+
type MutAfArray = *mut ::libc::c_longlong;
7+
type MutDouble = *mut ::libc::c_double;
8+
type MutUint = *mut ::libc::c_uint;
9+
type AfArray = ::libc::c_longlong;
10+
11+
#[allow(dead_code)]
12+
extern {
13+
fn af_sum(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
14+
15+
//fn af_sum_nan(out: MutAfArray, input: AfArray, dim: c_int, nanval: c_double) -> c_int;
16+
17+
fn af_product(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
18+
19+
//fn af_product_nan(out: MutAfArray, input: AfArray, dim: c_int, val: c_double) -> c_int;
20+
21+
fn af_min(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
22+
23+
fn af_max(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
24+
25+
fn af_all_true(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
26+
27+
fn af_any_true(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
28+
29+
fn af_count(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
30+
31+
fn af_sum_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
32+
33+
//fn af_sum_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
34+
35+
fn af_product_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
36+
37+
//fn af_product_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
38+
39+
fn af_min_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
40+
41+
fn af_max_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
42+
43+
fn af_all_true_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
44+
45+
fn af_any_true_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
46+
47+
fn af_count_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
48+
49+
fn af_imin(out: MutAfArray, idx: MutAfArray, input: AfArray, dim: c_int) -> c_int;
50+
51+
fn af_imax(out: MutAfArray, idx: MutAfArray, input: AfArray, dim: c_int) -> c_int;
52+
53+
fn af_imin_all(r: MutDouble, i: MutDouble, idx: MutUint, input: AfArray) -> c_int;
54+
55+
fn af_imax_all(r: MutDouble, i: MutDouble, idx: MutUint, input: AfArray) -> c_int;
56+
57+
fn af_accum(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
58+
59+
fn af_where(out: MutAfArray, input: AfArray) -> c_int;
60+
61+
fn af_diff1(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
62+
63+
fn af_diff2(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
64+
65+
fn af_sort(out: MutAfArray, input: AfArray, dim: c_uint, ascend: c_int) -> c_int;
66+
67+
fn af_sort_index(o: MutAfArray, i: MutAfArray, inp: AfArray, d: c_uint, a: c_int) -> c_int;
68+
69+
fn af_sort_by_key(out_keys: MutAfArray, out_vals: MutAfArray,
70+
in_keys: AfArray, in_vals: AfArray, dim: c_uint, ascend: c_int) -> c_int;
71+
72+
fn af_set_unique(out: MutAfArray, input: AfArray, is_sorted: c_int) -> c_int;
73+
74+
fn af_set_union(out: MutAfArray, first: AfArray, second: AfArray, is_unq: c_int) -> c_int;
75+
76+
fn af_set_intersect(out: MutAfArray, one: AfArray, two: AfArray, is_unq: c_int) -> c_int;
77+
}
78+
79+
#[allow(unused_mut)]
80+
pub fn sum(input: &Array, dim: i32) -> Array {
81+
unsafe {
82+
let mut temp: i64 = 0;
83+
af_sum(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
84+
Array {handle: temp}
85+
}
86+
}
87+
88+
//pub fn sum_nan(input: &Array, dim: i32, nanval: f64) -> Array {
89+
// unsafe {
90+
// let mut temp: i64 = 0;
91+
// af_sum_nan(&mut temp as MutAfArray, input.get() as AfArray,
92+
// dim as c_int, nanval as c_double);
93+
// Array {handle: temp}
94+
// }
95+
//}
96+
97+
pub fn product(input: &Array, dim: i32) -> Array {
98+
unsafe {
99+
let mut temp: i64 = 0;
100+
af_product(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
101+
Array {handle: temp}
102+
}
103+
}
104+
105+
//pub fn product_nan(input: &Array, dim: i32, nanval: f64) -> Array {
106+
// unsafe {
107+
// let mut temp: i64 = 0;
108+
// af_product_nan(&mut temp as MutAfArray, input.get() as AfArray,
109+
// dim as c_int, nanval as c_double);
110+
// Array {handle: temp}
111+
// }
112+
//}
113+
114+
pub fn min(input: &Array, dim: i32) -> Array {
115+
unsafe {
116+
let mut temp: i64 = 0;
117+
af_min(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
118+
Array {handle: temp}
119+
}
120+
}
121+
122+
pub fn max(input: &Array, dim: i32) -> Array {
123+
unsafe {
124+
let mut temp: i64 = 0;
125+
af_max(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
126+
Array {handle: temp}
127+
}
128+
}
129+
130+
pub fn all_true(input: &Array, dim: i32) -> Array {
131+
unsafe {
132+
let mut temp: i64 = 0;
133+
af_all_true(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
134+
Array {handle: temp}
135+
}
136+
}
137+
138+
pub fn any_true(input: &Array, dim: i32) -> Array {
139+
unsafe {
140+
let mut temp: i64 = 0;
141+
af_any_true(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
142+
Array {handle: temp}
143+
}
144+
}
145+
146+
pub fn count(input: &Array, dim: i32) -> Array {
147+
unsafe {
148+
let mut temp: i64 = 0;
149+
af_count(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
150+
Array {handle: temp}
151+
}
152+
}
153+
154+
pub fn sum_all(input: &Array) -> (f64, f64) {
155+
unsafe {
156+
let mut real: f64 = 0.0;
157+
let mut imag: f64 = 0.0;
158+
af_sum_all(&mut real as MutDouble, &mut imag as MutDouble,
159+
input.get() as AfArray);
160+
(real, imag)
161+
}
162+
}
163+
164+
//pub fn sum_nan_all(input: &Array, val: f64) -> (f64, f64) {
165+
// unsafe {
166+
// let mut real: f64 = 0.0;
167+
// let mut imag: f64 = 0.0;
168+
// af_sum_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
169+
// input.get() as AfArray, val as c_double);
170+
// (real, imag)
171+
// }
172+
//}
173+
174+
pub fn product_all(input: &Array) -> (f64, f64) {
175+
unsafe {
176+
let mut real: f64 = 0.0;
177+
let mut imag: f64 = 0.0;
178+
af_product_all(&mut real as MutDouble, &mut imag as MutDouble,
179+
input.get() as AfArray);
180+
(real, imag)
181+
}
182+
}
183+
184+
//pub fn product_nan_all(input: &Array, val: f64) -> (f64, f64) {
185+
// unsafe {
186+
// let mut real: f64 = 0.0;
187+
// let mut imag: f64 = 0.0;
188+
// af_product_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
189+
// input.get() as AfArray, val as c_double);
190+
// (real, imag)
191+
// }
192+
//}
193+
194+
pub fn min_all(input: &Array) -> (f64, f64) {
195+
unsafe {
196+
let mut real: f64 = 0.0;
197+
let mut imag: f64 = 0.0;
198+
af_min_all(&mut real as MutDouble, &mut imag as MutDouble,
199+
input.get() as AfArray);
200+
(real, imag)
201+
}
202+
}
203+
204+
pub fn max_all(input: &Array) -> (f64, f64) {
205+
unsafe {
206+
let mut real: f64 = 0.0;
207+
let mut imag: f64 = 0.0;
208+
af_max_all(&mut real as MutDouble, &mut imag as MutDouble,
209+
input.get() as AfArray);
210+
(real, imag)
211+
}
212+
}
213+
214+
pub fn all_true_all(input: &Array) -> (f64, f64) {
215+
unsafe {
216+
let mut real: f64 = 0.0;
217+
let mut imag: f64 = 0.0;
218+
af_all_true_all(&mut real as MutDouble, &mut imag as MutDouble,
219+
input.get() as AfArray);
220+
(real, imag)
221+
}
222+
}
223+
224+
pub fn any_true_all(input: &Array) -> (f64, f64) {
225+
unsafe {
226+
let mut real: f64 = 0.0;
227+
let mut imag: f64 = 0.0;
228+
af_any_true_all(&mut real as MutDouble, &mut imag as MutDouble,
229+
input.get() as AfArray);
230+
(real, imag)
231+
}
232+
}
233+
234+
pub fn count_all(input: &Array) -> (f64, f64) {
235+
unsafe {
236+
let mut real: f64 = 0.0;
237+
let mut imag: f64 = 0.0;
238+
af_count_all(&mut real as MutDouble, &mut imag as MutDouble,
239+
input.get() as AfArray);
240+
(real, imag)
241+
}
242+
}
243+
244+
pub fn imin(input: &Array, dim: i32) -> (Array, Array) {
245+
unsafe {
246+
let mut temp: i64 = 0;
247+
let mut idx: i64 = 0;
248+
af_imin(&mut temp as MutAfArray, &mut idx as MutAfArray,
249+
input.get() as AfArray, dim as c_int);
250+
(Array{handle: temp}, Array{handle: idx})
251+
}
252+
}
253+
254+
pub fn imax(input: &Array, dim: i32) -> (Array, Array) {
255+
unsafe {
256+
let mut temp: i64 = 0;
257+
let mut idx: i64 = 0;
258+
af_imax(&mut temp as MutAfArray, &mut idx as MutAfArray,
259+
input.get() as AfArray, dim as c_int);
260+
(Array{handle: temp}, Array{handle: idx})
261+
}
262+
}
263+
264+
pub fn imin_all(input: &Array) -> (f64, f64, u32) {
265+
unsafe {
266+
let mut real: f64 = 0.0;
267+
let mut imag: f64 = 0.0;
268+
let mut temp: u32 = 0;
269+
af_imin_all(&mut real as MutDouble, &mut imag as MutDouble,
270+
&mut temp as MutUint, input.get() as AfArray);
271+
(real, imag, temp)
272+
}
273+
}
274+
275+
pub fn imax_all(input: &Array) -> (f64, f64, u32) {
276+
unsafe {
277+
let mut real: f64 = 0.0;
278+
let mut imag: f64 = 0.0;
279+
let mut temp: u32 = 0;
280+
af_imax_all(&mut real as MutDouble, &mut imag as MutDouble,
281+
&mut temp as MutUint, input.get() as AfArray);
282+
(real, imag, temp)
283+
}
284+
}
285+
286+
pub fn accum(input: &Array, dim: i32) -> Array {
287+
unsafe {
288+
let mut temp: i64 = 0;
289+
af_accum(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
290+
Array {handle: temp}
291+
}
292+
}
293+
294+
pub fn locate(input: &Array) -> Array {
295+
unsafe {
296+
let mut temp: i64 = 0;
297+
af_where(&mut temp as MutAfArray, input.get() as AfArray);
298+
Array {handle: temp}
299+
}
300+
}
301+
302+
pub fn diff1(input: &Array, dim: i32) -> Array {
303+
unsafe {
304+
let mut temp: i64 = 0;
305+
af_diff1(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
306+
Array {handle: temp}
307+
}
308+
}
309+
310+
pub fn diff2(input: &Array, dim: i32) -> Array {
311+
unsafe {
312+
let mut temp: i64 = 0;
313+
af_diff2(&mut temp as MutAfArray, input.get() as AfArray, dim as c_int);
314+
Array {handle: temp}
315+
}
316+
}
317+
318+
pub fn sort(input: &Array, dim: u32, ascending: bool) -> Array {
319+
unsafe {
320+
let mut temp: i64 = 0;
321+
af_sort(&mut temp as MutAfArray, input.get() as AfArray,
322+
dim as c_uint, ascending as c_int);
323+
Array{handle: temp}
324+
}
325+
}
326+
327+
pub fn sort_index(input: &Array, dim: u32, ascending: bool) -> (Array, Array) {
328+
unsafe {
329+
let mut temp: i64 = 0;
330+
let mut idx: i64 = 0;
331+
af_sort_index(&mut temp as MutAfArray, &mut idx as MutAfArray,
332+
input.get() as AfArray,
333+
dim as c_uint, ascending as c_int);
334+
(Array {handle: temp}, Array {handle: idx})
335+
}
336+
}
337+
338+
pub fn sort_by_key(keys: &Array, vals: &Array, dim: u32, ascending: bool) -> (Array, Array) {
339+
unsafe {
340+
let mut temp: i64 = 0;
341+
let mut temp2: i64 = 0;
342+
af_sort_by_key(&mut temp as MutAfArray, &mut temp2 as MutAfArray,
343+
keys.get() as AfArray, vals.get() as AfArray,
344+
dim as c_uint, ascending as c_int);
345+
(Array {handle: temp}, Array {handle: temp2})
346+
}
347+
}
348+
349+
pub fn set_unique(input: &Array, is_sorted: bool) -> Array {
350+
unsafe {
351+
let mut temp: i64 = 0;
352+
af_set_unique(&mut temp as MutAfArray, input.get() as AfArray, is_sorted as c_int);
353+
Array{handle: temp}
354+
}
355+
}
356+
357+
pub fn set_union(first: &Array, second: &Array, is_unique: bool) -> Array {
358+
unsafe {
359+
let mut temp: i64 = 0;
360+
af_set_union(&mut temp as MutAfArray, first.get() as AfArray,
361+
second.get() as AfArray, is_unique as c_int);
362+
Array{handle: temp}
363+
}
364+
}
365+
366+
pub fn set_intersect(first: &Array, second: &Array, is_unique: bool) -> Array {
367+
unsafe {
368+
let mut temp: i64 = 0;
369+
af_set_intersect(&mut temp as MutAfArray, first.get() as AfArray,
370+
second.get() as AfArray, is_unique as c_int);
371+
Array{handle: temp}
372+
}
373+
}

0 commit comments

Comments
 (0)