#![allow(deprecated)]
use numrs2::prelude::*;
fn main() {
println!("NumRS Array Comparison Operations Example");
println!("========================================\n");
let a = Array::from_vec(vec![1.0, 2.0, 3.0, 4.0]);
let b = Array::from_vec(vec![1.0000001, 2.0000002, 3.0000003, 5.0]);
let c = Array::from_vec(vec![1.01, 2.02, 3.03, 4.04]);
println!("1. Testing array approximate equality with allclose:");
println!("A = {:?}", a.to_vec());
println!("B = {:?}", b.to_vec());
println!("C = {:?}", c.to_vec());
println!(
"allclose(A, B) with default tolerances (rtol=1e-7, atol=0): {}",
allclose(&a, &b)
);
println!(
"allclose(A, C) with default tolerances: {}",
allclose(&a, &c)
);
println!("\n2. Testing with custom tolerances:");
println!(
"allclose(A, C) with rtol=0.01, atol=0: {}",
allclose_with_tol(&a, &c, 0.01, 0.0)
);
println!("\n3. Testing element-wise approximate equality with isclose_array:");
let result = isclose_array(&a, &c, 0.01, 0.0).unwrap();
println!("isclose_array(A, C) with rtol=0.01, atol=0:");
println!("{:?}", result.to_vec());
println!("\n4. Testing exact equality with array_equal:");
let exact_a = Array::from_vec(vec![1, 2, 3, 4]);
let exact_b = Array::from_vec(vec![1, 2, 3, 4]);
let exact_c = Array::from_vec(vec![1, 2, 3, 5]);
println!(
"array_equal for identical arrays: {}",
array_equal(&exact_a, &exact_b, None)
);
println!(
"array_equal for different arrays: {}",
array_equal(&exact_a, &exact_c, None)
);
println!("\n5. Comparison operations:");
println!("A = {:?}", a.to_vec());
println!("B = {:?}", b.to_vec());
let result = greater(&a, &b).unwrap();
println!("greater(A, B): {:?}", result.to_vec());
let result = less(&a, &b).unwrap();
println!("less(A, B): {:?}", result.to_vec());
let result = equal(&a, &b).unwrap();
println!("equal(A, B): {:?}", result.to_vec());
let result = not_equal(&a, &b).unwrap();
println!("not_equal(A, B): {:?}", result.to_vec());
println!("\n6. Broadcasting with comparisons:");
let row = Array::from_vec(vec![1.0, 2.0, 3.0]).reshape(&[1, 3]);
let col = Array::from_vec(vec![1.0, 2.0, 3.0]).reshape(&[3, 1]);
println!("row = {:?} with shape {:?}", row.to_vec(), row.shape());
println!("col = {:?} with shape {:?}", col.to_vec(), col.shape());
let result = greater_equal(&col, &row).unwrap();
println!("greater_equal(col, row) (with broadcasting):");
println!("Shape: {:?}", result.shape());
println!("Values: {:?}", result.to_vec());
println!("\n7. all and any functions:");
let all_true = Array::from_vec(vec![true, true, true]);
let some_true = Array::from_vec(vec![false, true, false]);
let none_true = Array::from_vec(vec![false, false, false]);
println!("all([true, true, true]): {}", all(&all_true));
println!("all([false, true, false]): {}", all(&some_true));
println!("any([false, true, false]): {}", any(&some_true));
println!("any([false, false, false]): {}", any(&none_true));
println!("\n8. Using comparison results for filtering:");
let data = Array::from_vec(vec![1.0, 5.0, 3.0, 8.0, 2.0, 7.0]);
let threshold = Array::from_vec(vec![4.0]);
println!("data = {:?}", data.to_vec());
println!("Creating mask where data > 4.0");
let mask = greater(&data, &threshold).unwrap();
println!("mask = {:?}", mask.to_vec());
println!("Indices where data > 4.0:");
for (i, &is_greater) in mask.to_vec().iter().enumerate() {
if is_greater {
println!(" Index {}: {}", i, data.get(&[i]).unwrap());
}
}
}