use numrs2::array::Array;
use numrs2::axis_ops::*;
use numrs2::indexing::*;
#[test]
fn test_boolean_indexing() {
let a = Array::<f64>::from_vec(vec![1.0, 2.0, 3.0, 4.0, 5.0]);
let mask = vec![true, false, true, false, true];
let _bool_array = Array::<bool>::from_vec(mask.clone());
let mut filtered = Array::<f64>::zeros(&[5]);
let values = Array::<f64>::from_vec(vec![1.0, 3.0, 5.0]);
let mut value_idx = 0;
for (i, &m) in mask.iter().enumerate() {
if m {
filtered
.set(&[i], values.get(&[value_idx]).unwrap())
.unwrap();
value_idx += 1;
}
}
assert_eq!(filtered.to_vec(), vec![1.0, 0.0, 3.0, 0.0, 5.0]);
let mut a_2d = Array::<f64>::zeros(&[3, 3]);
a_2d.set(&[0, 0], 1.0).unwrap();
a_2d.set(&[0, 1], 2.0).unwrap();
a_2d.set(&[0, 2], 3.0).unwrap();
a_2d.set(&[1, 0], 4.0).unwrap();
a_2d.set(&[1, 1], 5.0).unwrap();
a_2d.set(&[1, 2], 6.0).unwrap();
a_2d.set(&[2, 0], 7.0).unwrap();
a_2d.set(&[2, 1], 8.0).unwrap();
a_2d.set(&[2, 2], 9.0).unwrap();
let _row_indices = [0]; let _col_indices = [0];
let row_result = a_2d.index(&[IndexSpec::Index(0), IndexSpec::All]).unwrap();
let row_vec = row_result.to_vec();
assert_eq!(row_vec.len(), 3);
let mut a_copy = a.clone();
a_copy
.set_mask(
&Array::<bool>::from_vec(vec![true, false, true, false, true]),
&Array::<f64>::from_vec(vec![10.0, 30.0, 50.0]),
)
.unwrap();
assert_eq!(a_copy.to_vec(), vec![10.0, 2.0, 30.0, 4.0, 50.0]);
}
#[test]
fn test_axis_operations() {
let mut array = Array::<f64>::zeros(&[2, 3]);
array.set(&[0, 0], 1.0).unwrap();
array.set(&[0, 1], 2.0).unwrap();
array.set(&[0, 2], 3.0).unwrap();
array.set(&[1, 0], 4.0).unwrap();
array.set(&[1, 1], 5.0).unwrap();
array.set(&[1, 2], 6.0).unwrap();
let sum_axis0 = array.sum_axis(0).unwrap();
assert_eq!(sum_axis0.shape(), vec![3]);
assert_eq!(sum_axis0.to_vec(), vec![5.0, 7.0, 9.0]);
let sum_axis1 = array.sum_axis(1).unwrap();
assert_eq!(sum_axis1.shape(), vec![2]);
assert_eq!(sum_axis1.to_vec(), vec![6.0, 15.0]);
let mean_axis0 = array.mean_axis(Some(0)).unwrap();
assert_eq!(mean_axis0.shape(), vec![3]);
assert_eq!(mean_axis0.to_vec(), vec![2.5, 3.5, 4.5]);
let mean_axis1 = array.mean_axis(Some(1)).unwrap();
assert_eq!(mean_axis1.shape(), vec![2]);
assert_eq!(mean_axis1.to_vec(), vec![2.0, 5.0]);
let min_axis0 = array.min_axis(Some(0)).unwrap();
assert_eq!(min_axis0.shape(), vec![3]);
let min_axis0_vec = min_axis0.to_vec();
assert_eq!(min_axis0_vec, vec![1.0, 2.0, 3.0]);
let min_axis1 = array.min_axis(Some(1)).unwrap();
assert_eq!(min_axis1.shape(), vec![2]);
assert_eq!(min_axis1.to_vec(), vec![1.0, 4.0]);
let max_axis1 = array.max_axis(Some(1)).unwrap();
assert_eq!(max_axis1.shape(), vec![2]);
assert_eq!(max_axis1.to_vec(), vec![3.0, 6.0]);
let cumsum_axis1 = array.cumsum_axis(1).unwrap();
assert_eq!(cumsum_axis1.shape(), vec![2, 3]);
let var_axis0 = array.var_axis(Some(0)).unwrap();
assert_eq!(var_axis0.shape(), vec![3]);
}
#[test]
fn test_block() {
use numrs2::array_ops::block;
let a = Array::from_vec(vec![1, 2]);
let b = Array::from_vec(vec![3, 4]);
let c = Array::from_vec(vec![5, 6]);
let d = Array::from_vec(vec![7, 8]);
let blocks = vec![vec![&a, &b], vec![&c, &d]];
let result = block(&blocks).unwrap();
let shape = result.shape();
let values = result.to_vec();
println!("Shape: {:?}", shape);
println!("Values: {:?}", values);
assert_eq!(values.len(), 8);
for i in 1..=8 {
assert!(values.contains(&i));
}
}
#[test]
fn test_block_2d_arrays() {
use numrs2::array_ops::block;
let a = Array::from_vec(vec![1, 2, 3, 4]).reshape(&[2, 2]);
let b = Array::from_vec(vec![5, 6, 7, 8]).reshape(&[2, 2]);
let c = Array::from_vec(vec![9, 10, 11, 12]).reshape(&[2, 2]);
let d = Array::from_vec(vec![13, 14, 15, 16]).reshape(&[2, 2]);
let blocks = vec![vec![&a, &b], vec![&c, &d]];
let result = block(&blocks).unwrap();
assert_eq!(result.shape(), vec![4, 4]);
}
#[test]
fn test_block_mixed_dimensions() {
use numrs2::array_ops::block;
let a = Array::from_vec(vec![1, 2]).reshape(&[1, 2]);
let b = Array::from_vec(vec![3, 4]).reshape(&[1, 2]);
let c = Array::from_vec(vec![5, 6]).reshape(&[1, 2]);
let d = Array::from_vec(vec![7, 8]).reshape(&[1, 2]);
let blocks = vec![vec![&a, &b], vec![&c, &d]];
let result = block(&blocks).unwrap();
assert_eq!(result.shape(), vec![2, 4]);
}
#[test]
fn test_block_single_array() {
use numrs2::array_ops::block;
let a = Array::from_vec(vec![1, 2, 3, 4]).reshape(&[2, 2]);
let blocks = vec![vec![&a]];
let result = block(&blocks).unwrap();
assert_eq!(result.shape(), vec![2, 2]);
assert_eq!(result.to_vec(), vec![1, 2, 3, 4]);
}
#[test]
fn test_block_empty() {
use numrs2::array_ops::block;
let empty_blocks: Vec<Vec<&Array<i32>>> = vec![];
let result = block(&empty_blocks);
assert!(result.is_err());
}
#[test]
fn test_block_empty_row() {
use numrs2::array_ops::block;
let a = Array::from_vec(vec![1, 2]);
let blocks = vec![vec![&a], vec![]];
let result = block(&blocks);
assert!(result.is_err());
}