#![allow(deprecated)]
#![allow(clippy::result_large_err)]
use numrs2::error::Result;
use numrs2::prelude::*;
fn main() -> Result<()> {
println!("NumRS2 Unique Function Example");
println!("==============================");
println!("\nPart 1: Basic Usage with 1D Arrays");
println!("--------------------------------");
let a = Array::from_vec(vec![1, 2, 3, 2, 1, 4]).reshape(&[6]);
println!("Original array: {:?}", a);
let result = unique(&a, None, None, None, None)?;
println!("Unique values: {:?}", result.values);
println!("\nPart 2: Getting Additional Information");
println!("------------------------------------");
let result = unique(&a, None, Some(true), None, None)?;
let (values, indices) = result.values_indices()?;
println!("Unique values: {:?}", values);
println!("Indices of first occurrences: {:?}", indices);
let result = unique(&a, None, None, None, Some(true))?;
let (values, counts) = result.values_counts()?;
println!("Unique values: {:?}", values);
println!("Counts of each value: {:?}", counts);
let result = unique(&a, None, None, Some(true), None)?;
let (values, inverse) = result.values_inverse()?;
println!("Unique values: {:?}", values);
println!("Inverse indices: {:?}", inverse);
let values_vec = values.to_vec();
let inverse_vec = inverse.to_vec();
let mut reconstructed = Vec::with_capacity(a.size());
for &idx in &inverse_vec {
reconstructed.push(values_vec[idx]);
}
println!("Reconstructed array: {:?}", reconstructed);
println!("Original array: {:?}", a.to_vec());
println!(
"Reconstruction matches original: {}",
reconstructed == a.to_vec()
);
println!("\nPart 3: Working with Multiple Return Values");
println!("----------------------------------------");
let result = unique(&a, None, Some(true), Some(true), Some(true))?;
let (values, indices, inverse, counts) = result.values_indices_inverse_counts()?;
println!("Unique values: {:?}", values);
println!("Indices of first occurrences: {:?}", indices);
println!("Inverse indices: {:?}", inverse);
println!("Counts of each value: {:?}", counts);
println!("\nPart 4: Using Axis Parameter with 2D Arrays");
println!("----------------------------------------");
let b = Array::from_vec(vec![1, 2, 3, 1, 2, 3, 7, 8, 9]).reshape(&[3, 3]);
println!("Original 2D array:");
println!("[1, 2, 3]");
println!("[1, 2, 3]");
println!("[7, 8, 9]");
let result = unique(&b, Some(0), None, None, None)?;
println!("\nUnique rows (axis=0):");
println!("Shape: {:?}", result.values.shape());
println!("Values: {:?}", result.values);
let result = unique(&b, Some(0), None, None, Some(true))?;
let (_values, counts) = result.values_counts()?;
println!("Counts of each unique row: {:?}", counts);
let bt = b.transpose(); let result = unique(&bt, Some(0), None, None, None)?;
println!("\nUnique columns (axis=0 of transposed array):");
println!("Shape: {:?}", result.values.shape());
println!("Values: {:?}", result.values);
println!("\nPart 5: Edge Cases");
println!("----------------");
let empty = Array::<i32>::from_vec(vec![]).reshape(&[0]);
let result = unique(&empty, None, None, None, None)?;
println!("Unique values of empty array: {:?}", result.values.to_vec());
let single = Array::from_vec(vec![5]);
let result = unique(&single, None, None, None, None)?;
println!("Unique values of single-element array: {:?}", result.values);
let all_same = Array::from_vec(vec![7, 7, 7, 7]);
let result = unique(&all_same, None, None, None, None)?;
println!(
"Unique values of array with all identical elements: {:?}",
result.values
);
println!("\nExample complete. NumRS2 unique function successfully demonstrated!");
Ok(())
}