use numrs2::array_ops::advanced_indexing;
use numrs2::bitwise_ops;
use numrs2::complex_ops;
use numrs2::prelude::*;
use scirs2_core::Complex;
#[test]
fn test_bitwise_and_advanced_indexing_integration() {
let a = Array::from_vec(vec![0b1111, 0b1010, 0b1100, 0b0011, 0b1001, 0b0110]);
let b = Array::from_vec(vec![0b1100, 0b0110, 0b1010, 0b1111, 0b0101, 0b1001]);
let bitwise_result = bitwise_ops::bitwise_and(&a, &b).unwrap();
let condition = bitwise_result.map(|x| x > 5);
let extracted = advanced_indexing::extract(&bitwise_result, &condition).unwrap();
assert_eq!(extracted.to_vec(), vec![12, 8]);
}
#[test]
fn test_complex_ops_and_advanced_indexing_integration() {
let real_part = Array::from_vec(vec![3.0, 4.0, 5.0, 0.0, -3.0, -4.0]);
let imag_part = Array::from_vec(vec![4.0, 3.0, 0.0, 5.0, 4.0, -3.0]);
let real_vec = real_part.to_vec();
let imag_vec = imag_part.to_vec();
let complex_vec: Vec<Complex<f64>> = real_vec
.into_iter()
.zip(imag_vec)
.map(|(r, i)| Complex::new(r, i))
.collect();
let complex_array = Array::from_vec(complex_vec);
let magnitudes = complex_ops::absolute(&complex_array);
let condition = magnitudes.map(|x| x >= 5.0);
let large_magnitude_complex = advanced_indexing::extract(&complex_array, &condition).unwrap();
assert_eq!(large_magnitude_complex.len(), 6);
let extracted_mags = complex_ops::absolute(&large_magnitude_complex);
for &mag in extracted_mags.to_vec().iter() {
assert!(mag >= 5.0);
}
}
#[test]
fn test_complex_bitwise_advanced_indexing_chain() {
let int_data = Array::from_vec(vec![15, 31, 7, 63, 127, 255]);
let shift_amounts = Array::from_vec(vec![1, 2, 1, 3, 2, 1]);
let shifted = bitwise_ops::left_shift(&int_data, &shift_amounts).unwrap();
let complex_shifted = shifted.map(|x| Complex::new(x as f64, 0.0));
let complex_vec = complex_shifted.to_vec();
let orig_vec = int_data.to_vec();
let complex_with_imag_vec: Vec<Complex<f64>> = complex_vec
.into_iter()
.zip(orig_vec)
.map(|(c, orig)| Complex::new(c.re, orig as f64))
.collect();
let complex_with_imag = Array::from_vec(complex_with_imag_vec);
let condition = complex_with_imag.map(|c| c.re > 100.0);
let large_real_complex = advanced_indexing::extract(&complex_with_imag, &condition).unwrap();
assert!(!large_real_complex.is_empty());
for complex_num in large_real_complex.to_vec() {
assert!(complex_num.re > 100.0);
}
}
#[test]
fn test_apply_along_axis_with_bitwise_ops() {
let data = Array::from_vec(vec![
0b1111, 0b1010, 0b1100, 0b0011, 0b1001, 0b0110, 0b1101, 0b0101, 0b1011,
])
.reshape(&[3, 3]);
let result = advanced_indexing::apply_along_axis(
|column| {
let mut acc = column.to_vec()[0];
for &val in column.to_vec().iter().skip(1) {
acc ^= val;
}
acc
},
&data,
0,
)
.unwrap();
assert_eq!(result.shape(), &[3]);
assert_eq!(result.to_vec(), vec![1, 6, 1]);
}
#[test]
fn test_compress_with_complex_condition() {
let complex_data = Array::from_vec(vec![
Complex::new(1.0, 2.0),
Complex::new(3.0, 4.0),
Complex::new(0.0, 1.0),
Complex::new(2.0, 0.0),
Complex::new(-1.0, -1.0),
Complex::new(5.0, 0.0),
])
.reshape(&[2, 3]);
let magnitudes = complex_ops::absolute(&complex_data);
let mag_vec = magnitudes.to_vec();
let condition_1d = Array::from_vec(vec![
mag_vec[0] > 2.0 || mag_vec[3] > 2.0, mag_vec[1] > 2.0 || mag_vec[4] > 2.0, mag_vec[2] > 2.0 || mag_vec[5] > 2.0, ]);
let compressed = advanced_indexing::compress(&complex_data, &condition_1d, Some(1)).unwrap();
assert_eq!(compressed.shape(), &[2, 3]);
let result_mags = complex_ops::absolute(&compressed);
let mag_vec = result_mags.to_vec();
assert!(mag_vec.iter().any(|&mag| mag > 2.0));
}
#[test]
fn test_putmask_with_bitwise_result() {
let mut data = Array::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8]);
let a = Array::from_vec(vec![
0b0101, 0b1010, 0b1111, 0b0000, 0b1100, 0b0011, 0b1001, 0b0110,
]);
let b = Array::from_vec(vec![
0b1010, 0b0101, 0b1111, 0b1111, 0b1100, 0b1100, 0b1001, 0b1001,
]);
let bitwise_result = bitwise_ops::bitwise_and(&a, &b).unwrap();
let mask = bitwise_result.map(|x| x > 0);
let values = Array::from_vec(vec![99, 88, 77, 66, 55, 44, 33, 22]);
let _ = advanced_indexing::putmask(&mut data, &mask, &values);
let mask_vec = mask.to_vec();
let values_vec = values.to_vec();
let result_vec = data.to_vec();
let mut value_idx = 0;
for i in 0..mask_vec.len() {
if mask_vec[i] {
assert_eq!(result_vec[i], values_vec[value_idx % values_vec.len()]);
value_idx += 1;
} else {
assert_eq!(result_vec[i], i + 1); }
}
}
#[test]
fn test_take_along_axis_with_complex_sorting() {
let complex_data = Array::from_vec(vec![
Complex::new(3.0, 4.0), Complex::new(1.0, 0.0), Complex::new(0.0, 2.0), Complex::new(2.0, 1.0), ])
.reshape(&[2, 2]);
let magnitudes = complex_ops::absolute(&complex_data);
let _indices = Array::from_vec(vec![1, 0, 1, 0]).reshape(&[2, 2]);
assert_eq!(magnitudes.shape(), &[2, 2]);
let mag_vec = magnitudes.to_vec();
assert!((mag_vec[0] - 5.0f64).abs() < 1e-10); assert!((mag_vec[1] - 1.0f64).abs() < 1e-10); }
#[test]
fn test_performance_integration_large_arrays() {
let size = 10000;
let data: Vec<i32> = (0..size).map(|i| i % 256).collect();
let large_array = Array::from_vec(data);
let shifted = bitwise_ops::left_shift_scalar(&large_array, 2);
let mask_data: Vec<i32> = (0..size)
.map(|i| if i % 2 == 0 { 0xFF } else { 0x00 })
.collect();
let mask_array = Array::from_vec(mask_data);
let masked = bitwise_ops::bitwise_and(&shifted, &mask_array).unwrap();
let complex_large = masked.map(|x| Complex::new(x as f64, (x % 100) as f64));
let magnitudes = complex_ops::absolute(&complex_large);
let condition = magnitudes.map(|mag| mag > 50.0);
let extracted = advanced_indexing::extract(&complex_large, &condition).unwrap();
assert!(!extracted.is_empty());
assert!(extracted.len() < size as usize);
let extracted_mags = complex_ops::absolute(&extracted);
for &mag in extracted_mags.to_vec().iter() {
assert!(mag > 50.0);
}
}