Skip to content

Commit 11fe6bf

Browse files
committed
Merge pull request #41 from 9prady9/new_fns
New functions added since 3.0 release till date
2 parents 6cbc70f + c52a904 commit 11fe6bf

File tree

12 files changed

+1340
-91
lines changed

12 files changed

+1340
-91
lines changed

src/algorithm/mod.rs

Lines changed: 107 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ extern crate libc;
22

33
use array::Array;
44
use defines::AfError;
5-
use self::libc::{c_int, c_uint};
5+
use self::libc::{c_int, c_uint, c_double};
66

77
type MutAfArray = *mut self::libc::c_longlong;
88
type MutDouble = *mut self::libc::c_double;
@@ -12,18 +12,18 @@ type AfArray = self::libc::c_longlong;
1212
#[allow(dead_code)]
1313
extern {
1414
fn af_sum(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
15-
//fn af_sum_nan(out: MutAfArray, input: AfArray, dim: c_int, nanval: c_double) -> c_int;
15+
fn af_sum_nan(out: MutAfArray, input: AfArray, dim: c_int, nanval: c_double) -> c_int;
1616
fn af_product(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
17-
//fn af_product_nan(out: MutAfArray, input: AfArray, dim: c_int, val: c_double) -> c_int;
17+
fn af_product_nan(out: MutAfArray, input: AfArray, dim: c_int, val: c_double) -> c_int;
1818
fn af_min(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
1919
fn af_max(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
2020
fn af_all_true(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
2121
fn af_any_true(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
2222
fn af_count(out: MutAfArray, input: AfArray, dim: c_int) -> c_int;
2323
fn af_sum_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
24-
//fn af_sum_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
24+
fn af_sum_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
2525
fn af_product_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
26-
//fn af_product_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
26+
fn af_product_nan_all(r: MutDouble, i: MutDouble, input: AfArray, val: c_double) -> c_int;
2727
fn af_min_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
2828
fn af_max_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
2929
fn af_all_true_all(r: MutDouble, i: MutDouble, input: AfArray) -> c_int;
@@ -85,31 +85,64 @@ dim_reduce_func_def!(accum, af_accum);
8585
dim_reduce_func_def!(diff1, af_diff1);
8686
dim_reduce_func_def!(diff2, af_diff2);
8787

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-
//}
88+
/// Reduction operation along specific dimension
89+
///
90+
/// Sum values of the `input` Array along `dim` dimension after replacing any `NAN` values in the
91+
/// Array with `nanval` value.
92+
///
93+
/// # Parameters
94+
///
95+
/// - `input` is the input Array
96+
/// - `dim` is reduction dimension
97+
/// - `nanval` is value with which all the `NAN` values of Array are replaced with
98+
///
99+
/// # Return Values
100+
///
101+
/// Reduced Array
102+
pub fn sum_nan(input: &Array, dim: i32, nanval: f64) -> Result<Array, AfError> {
103+
unsafe {
104+
let mut temp: i64 = 0;
105+
let err_val = af_sum_nan(&mut temp as MutAfArray, input.get() as AfArray,
106+
dim as c_int, nanval as c_double);
107+
match err_val {
108+
0 => Ok(Array::from(temp)),
109+
_ => Err(AfError::from(err_val)),
110+
}
111+
}
112+
}
96113

97-
//pub fn product_nan(input: &Array, dim: i32, nanval: f64) -> Array {
98-
// unsafe {
99-
// let mut temp: i64 = 0;
100-
// af_product_nan(&mut temp as MutAfArray, input.get() as AfArray,
101-
// dim as c_int, nanval as c_double);
102-
// Array {handle: temp}
103-
// }
104-
//}
114+
/// Reduction operation along specific dimension
115+
///
116+
/// Compute product of the values of the `input` Array along `dim` dimension after replacing any `NAN` values in the Array with `nanval` value.
117+
///
118+
/// # Parameters
119+
///
120+
/// - `input` is the input Array
121+
/// - `dim` is reduction dimension
122+
/// - `nanval` is value with which all the `NAN` values of Array are replaced with
123+
///
124+
/// # Return Values
125+
///
126+
/// Reduced Array
127+
pub fn product_nan(input: &Array, dim: i32, nanval: f64) -> Result<Array, AfError> {
128+
unsafe {
129+
let mut temp: i64 = 0;
130+
let err_val = af_product_nan(&mut temp as MutAfArray, input.get() as AfArray,
131+
dim as c_int, nanval as c_double);
132+
match err_val {
133+
0 => Ok(Array::from(temp)),
134+
_ => Err(AfError::from(err_val)),
135+
}
136+
}
137+
}
105138

106139
macro_rules! all_reduce_func_def {
107140
($fn_name: ident, $ffi_name: ident) => (
108141
/// Reduction operation of all values
109142
///
110143
/// # Parameters
111144
///
112-
/// `input` - Input Array
145+
/// - `input` is the input Array
113146
///
114147
/// # Return Values
115148
///
@@ -139,25 +172,59 @@ all_reduce_func_def!(all_true_all, af_all_true_all);
139172
all_reduce_func_def!(any_true_all, af_any_true_all);
140173
all_reduce_func_def!(count_all, af_count_all);
141174

142-
//pub fn sum_nan_all(input: &Array, val: f64) -> (f64, f64) {
143-
// unsafe {
144-
// let mut real: f64 = 0.0;
145-
// let mut imag: f64 = 0.0;
146-
// af_sum_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
147-
// input.get() as AfArray, val as c_double);
148-
// (real, imag)
149-
// }
150-
//}
175+
/// Reduction operation of all values
176+
///
177+
/// Sum all the values of the `input` Array after replacing any `NAN` values with `val`.
178+
///
179+
/// # Parameters
180+
///
181+
/// - `input` is the input Array
182+
/// - `val` is the val that replaces all `NAN` values of the Array before reduction operation is
183+
/// performed.
184+
///
185+
/// # Return Values
186+
///
187+
/// A tuple of reduction result. For non-complex data type Arrays, second value of tuple is
188+
/// zero.
189+
pub fn sum_nan_all(input: &Array, val: f64) -> Result<(f64, f64), AfError> {
190+
unsafe {
191+
let mut real: f64 = 0.0;
192+
let mut imag: f64 = 0.0;
193+
let err_val = af_sum_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
194+
input.get() as AfArray, val as c_double);
195+
match err_val {
196+
0 => Ok((real, imag)),
197+
_ => Err(AfError::from(err_val)),
198+
}
199+
}
200+
}
151201

152-
//pub fn product_nan_all(input: &Array, val: f64) -> (f64, f64) {
153-
// unsafe {
154-
// let mut real: f64 = 0.0;
155-
// let mut imag: f64 = 0.0;
156-
// af_product_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
157-
// input.get() as AfArray, val as c_double);
158-
// (real, imag)
159-
// }
160-
//}
202+
/// Reduction operation of all values
203+
///
204+
/// Compute the product of all the values of the `input` Array after replacing any `NAN` values with `val`.
205+
///
206+
/// # Parameters
207+
///
208+
/// - `input` is the input Array
209+
/// - `val` is the val that replaces all `NAN` values of the Array before reduction operation is
210+
/// performed.
211+
///
212+
/// # Return Values
213+
///
214+
/// A tuple of reduction result. For non-complex data type Arrays, second value of tuple is
215+
/// zero.
216+
pub fn product_nan_all(input: &Array, val: f64) -> Result<(f64, f64), AfError> {
217+
unsafe {
218+
let mut real: f64 = 0.0;
219+
let mut imag: f64 = 0.0;
220+
let err_val = af_product_nan_all(&mut real as MutDouble, &mut imag as MutDouble,
221+
input.get() as AfArray, val as c_double);
222+
match err_val {
223+
0 => Ok((real, imag)),
224+
_ => Err(AfError::from(err_val)),
225+
}
226+
}
227+
}
161228

162229
macro_rules! dim_ireduce_func_def {
163230
($fn_name: ident, $ffi_name: ident) => (

src/arith/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ extern {
7777
fn af_atanh(out: MutAfArray, arr: AfArray) -> c_int;
7878
fn af_pow2(out: MutAfArray, arr: AfArray) -> c_int;
7979
fn af_exp(out: MutAfArray, arr: AfArray) -> c_int;
80+
fn af_sigmoid(out: MutAfArray, arr: AfArray) -> c_int;
8081
fn af_expm1(out: MutAfArray, arr: AfArray) -> c_int;
8182
fn af_erf(out: MutAfArray, arr: AfArray) -> c_int;
8283
fn af_erfc(out: MutAfArray, arr: AfArray) -> c_int;
@@ -150,6 +151,7 @@ unary_func!(acosh, af_acosh);
150151
unary_func!(atanh, af_atanh);
151152
unary_func!(pow2, af_pow2);
152153
unary_func!(exp, af_exp);
154+
unary_func!(sigmoid, af_sigmoid);
153155
unary_func!(expm1, af_expm1);
154156
unary_func!(erf, af_erf);
155157
unary_func!(erfc, af_erfc);
@@ -237,7 +239,7 @@ macro_rules! overloaded_binary_func {
237239
}
238240
}
239241

240-
pub fn $fn_name<T: Convertable, U: Convertable> (arg1: &T, arg2: &U, batch: bool) -> Result<Array, AfError> {
242+
pub fn $fn_name<T, U> (arg1: &T, arg2: &U, batch: bool) -> Result<Array, AfError> where T: Convertable, U: Convertable {
241243
let lhs = arg1.convert();
242244
let rhs = arg2.convert();
243245
match (lhs.is_scalar().unwrap(), rhs.is_scalar().unwrap()) {

src/array.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ extern {
6262
fn af_release_array(arr: AfArray) -> c_int;
6363

6464
fn af_print_array(arr: AfArray) -> c_int;
65+
66+
fn af_cast(out: MutAfArray, arr: AfArray, aftype: uint8_t) -> c_int;
6567
}
6668

6769
/// A multidimensional data container
@@ -218,6 +220,18 @@ impl Array {
218220
is_func!(is_floating, af_is_floating);
219221
is_func!(is_integer, af_is_integer);
220222
is_func!(is_bool, af_is_bool);
223+
224+
/// Cast the Array data type to `target_type`
225+
pub fn cast(&self, target_type: Aftype) -> Result<Array, AfError> {
226+
unsafe {
227+
let mut temp: i64 = 0;
228+
let err_val = af_cast(&mut temp as MutAfArray, self.handle as AfArray, target_type as uint8_t);
229+
match err_val {
230+
0 => Ok(Array::from(temp)),
231+
_ => Err(AfError::from(err_val)),
232+
}
233+
}
234+
}
221235
}
222236

223237
/// Used for creating Array object from native resource id

0 commit comments

Comments
 (0)