#[cfg(any(feature = "float", feature = "half"))]
use num_traits::float::FloatCore;
use num_traits::AsPrimitive;
use num_traits::{Bounded, One};
use crate::{SIMDArgMinMax, ScalarArgMinMax};
#[cfg(test)]
const LONG_ARR_LEN: usize = 8193;
#[cfg(test)]
const NB_RUNS: usize = 10_000;
#[cfg(test)]
const RANDOM_RUN_ARR_LEN: usize = 32 * 4 + 1;
#[cfg(test)]
pub(crate) fn test_return_same_result_argminmax<
DType,
SCALAR,
SIMD,
SV,
SM,
const LANE_SIZE: usize,
>(
get_data: fn(usize) -> Vec<DType>,
_scalar: SCALAR, _simd: SIMD, ) where
DType: Copy + PartialOrd + AsPrimitive<usize>,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let data: &[DType] = &get_data(LONG_ARR_LEN);
assert_eq!(data.len() % 64, 1);
let (argmin_index, argmax_index) = SCALAR::argminmax(data);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(data) };
let argmin_index_single = SCALAR::argmin(data);
let argmin_simd_index_single = unsafe { SIMD::argmin(data) };
let argmax_index_single = SCALAR::argmax(data);
let argmax_simd_index_single = unsafe { SIMD::argmax(data) };
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
for _ in 0..NB_RUNS {
let data: &[DType] = &get_data(RANDOM_RUN_ARR_LEN);
let (argmin_index, argmax_index) = SCALAR::argminmax(data);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(data) };
let argmin_index_single = SCALAR::argmin(data);
let argmin_simd_index_single = unsafe { SIMD::argmin(data) };
let argmax_index_single = SCALAR::argmax(data);
let argmax_simd_index_single = unsafe { SIMD::argmax(data) };
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
}
}
#[cfg(test)]
pub(crate) fn test_first_index_identical_values_argminmax<
DType,
SCALAR,
SIMD,
SV,
SM,
const LANE_SIZE: usize,
>(
_scalar: SCALAR, _simd: SIMD, ) where
DType: Copy + PartialOrd + AsPrimitive<usize> + One + Bounded,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let mut data: [DType; 64] = [DType::one(); 64];
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
data[5] = DType::min_value();
data[13] = DType::min_value();
data[41] = DType::min_value();
data[7] = DType::max_value();
data[17] = DType::max_value();
data[31] = DType::max_value();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 5);
assert_eq!(argmin_index_single, 5);
assert_eq!(argmax_index, 7);
assert_eq!(argmax_index_single, 7);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 5);
assert_eq!(argmin_simd_index_single, 5);
assert_eq!(argmax_simd_index, 7);
assert_eq!(argmax_simd_index_single, 7);
}
#[cfg(test)]
pub(crate) fn test_no_overflow_argminmax<DType, SCALAR, SIMD, SV, SM, const LANE_SIZE: usize>(
get_data: fn(usize) -> Vec<DType>,
_scalar: SCALAR, _simd: SIMD, arr_len: Option<usize>,
) where
DType: Copy + PartialOrd + AsPrimitive<usize>,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let shift_size = {
#[cfg(target_arch = "arm")] {
std::cmp::min(std::mem::size_of::<DType>() * 8 + 1, 31)
}
#[cfg(not(target_arch = "arm"))]
{
std::mem::size_of::<DType>() * 8 + 1 }
};
let arr_len = arr_len.unwrap_or(1 << shift_size);
let data: &[DType] = &get_data(arr_len);
let (argmin_index, argmax_index) = SCALAR::argminmax(data);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(data) };
let argmin_index_single = SCALAR::argmin(data);
let argmin_simd_index_single = unsafe { SIMD::argmin(data) };
let argmax_index_single = SCALAR::argmax(data);
let argmax_simd_index_single = unsafe { SIMD::argmax(data) };
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
}
#[cfg(any(feature = "float", feature = "half"))]
#[cfg(test)]
const FLOAT_ARR_LEN: usize = 1024 + 3;
#[cfg(any(feature = "float", feature = "half"))]
#[cfg(test)]
pub(crate) fn test_return_infs_argminmax<DType, SCALAR, SIMD, SV, SM, const LANE_SIZE: usize>(
get_data: fn(usize) -> Vec<DType>,
_scalar: SCALAR, _simd: SIMD, ) where
DType: FloatCore + AsPrimitive<usize>,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
for i in 0..data.len() {
data[i] = DType::infinity();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
for i in 0..data.len() {
data[i] = DType::neg_infinity();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[100] = DType::infinity();
data[200] = DType::neg_infinity();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 200);
assert_eq!(argmin_index_single, 200);
assert_eq!(argmax_index, 100);
assert_eq!(argmax_index_single, 100);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 200);
assert_eq!(argmin_simd_index_single, 200);
assert_eq!(argmax_simd_index, 100);
assert_eq!(argmax_simd_index_single, 100);
}
#[cfg(any(feature = "float", feature = "half"))]
#[cfg(test)]
pub(crate) fn test_ignore_nans_argminmax<DType, SCALAR, SIMD, SV, SM, const LANE_SIZE: usize>(
get_data: fn(usize) -> Vec<DType>,
_scalar: SCALAR, _simd: SIMD, ) where
DType: FloatCore + AsPrimitive<usize>,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[0] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert!(argmin_index != 0);
assert!(argmin_index_single != 0);
assert!(argmax_index != 0);
assert!(argmax_index_single != 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert!(argmin_simd_index != 0);
assert!(argmin_simd_index_single != 0);
assert!(argmax_simd_index != 0);
assert!(argmax_simd_index_single != 0);
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[0] = DType::nan();
for i in 1..data.len() {
data[i] = DType::from(1.0).unwrap();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 1);
assert_eq!(argmin_index_single, 1);
assert_eq!(argmax_index, 1);
assert_eq!(argmax_index_single, 1);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 1);
assert_eq!(argmin_simd_index_single, 1);
assert_eq!(argmax_simd_index, 1);
assert_eq!(argmax_simd_index_single, 1);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[0] = DType::nan();
for i in 1..data.len() {
data[i] = DType::from(i as f64).unwrap();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 1);
assert_eq!(argmin_index_single, 1);
assert_eq!(argmax_index, FLOAT_ARR_LEN - 1);
assert_eq!(argmax_index_single, FLOAT_ARR_LEN - 1);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 1);
assert_eq!(argmin_simd_index_single, 1);
assert_eq!(argmax_simd_index, FLOAT_ARR_LEN - 1);
assert_eq!(argmax_simd_index_single, FLOAT_ARR_LEN - 1);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[0] = DType::nan();
for i in 1..data.len() {
data[i] = DType::from((FLOAT_ARR_LEN - i) as f64).unwrap();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, FLOAT_ARR_LEN - 1);
assert_eq!(argmin_index_single, FLOAT_ARR_LEN - 1);
assert_eq!(argmax_index, 1);
assert_eq!(argmax_index_single, 1);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, FLOAT_ARR_LEN - 1);
assert_eq!(argmin_simd_index_single, FLOAT_ARR_LEN - 1);
assert_eq!(argmax_simd_index, 1);
assert_eq!(argmax_simd_index_single, 1);
for i in 0..100 {
data[i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert!(argmin_index > 99);
assert!(argmin_index_single > 99);
assert!(argmax_index > 99);
assert!(argmax_index_single > 99);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert!(argmin_simd_index > 99);
assert!(argmin_simd_index_single > 99);
assert!(argmax_simd_index > 99);
assert!(argmax_simd_index_single > 99);
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[FLOAT_ARR_LEN - 1] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert!(argmin_index != 1026);
assert!(argmin_index_single != 1026);
assert!(argmax_index != 1026);
assert!(argmax_index_single != 1026);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert!(argmin_simd_index != 1026);
assert!(argmin_simd_index_single != 1026);
assert!(argmax_simd_index != 1026);
assert!(argmax_simd_index_single != 1026);
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
for i in 0..100 {
data[FLOAT_ARR_LEN - 1 - i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert!(argmin_index < FLOAT_ARR_LEN - 100);
assert!(argmin_index_single < FLOAT_ARR_LEN - 100);
assert!(argmax_index < FLOAT_ARR_LEN - 100);
assert!(argmax_index_single < FLOAT_ARR_LEN - 100);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert!(argmin_simd_index < FLOAT_ARR_LEN - 100);
assert!(argmin_simd_index_single < FLOAT_ARR_LEN - 100);
assert!(argmax_simd_index < FLOAT_ARR_LEN - 100);
assert!(argmax_simd_index_single < FLOAT_ARR_LEN - 100);
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[123] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert!(argmin_index != 123);
assert!(argmin_index_single != 123);
assert!(argmax_index != 123);
assert!(argmax_index_single != 123);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert!(argmin_simd_index != 123);
assert!(argmin_simd_index_single != 123);
assert!(argmax_simd_index != 123);
assert!(argmax_simd_index_single != 123);
assert_eq!(argmin_index, argmin_simd_index);
assert_eq!(argmin_index, argmin_index_single);
assert_eq!(argmin_index, argmin_simd_index_single);
assert_eq!(argmax_index, argmax_simd_index);
assert_eq!(argmax_index, argmax_index_single);
assert_eq!(argmax_index, argmax_simd_index_single);
for i in 0..data.len() {
data[i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
}
#[cfg(any(feature = "float", feature = "half"))]
#[cfg(test)]
pub(crate) fn test_return_nans_argminmax<DType, SCALAR, SIMD, SV, SM, const LANE_SIZE: usize>(
get_data: fn(usize) -> Vec<DType>,
_scalar: SCALAR, _simd: SIMD, ) where
DType: FloatCore + AsPrimitive<usize>,
SV: Copy, SM: Copy, SCALAR: ScalarArgMinMax<DType>,
SIMD: SIMDArgMinMax<DType, SV, SM, LANE_SIZE, SCALAR>,
{
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[0] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
for i in 0..100 {
data[i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[FLOAT_ARR_LEN - 1] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 1026);
assert_eq!(argmin_index_single, 1026);
assert_eq!(argmax_index, 1026);
assert_eq!(argmax_index_single, 1026);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 1026);
assert_eq!(argmin_simd_index_single, 1026);
assert_eq!(argmax_simd_index, 1026);
assert_eq!(argmax_simd_index_single, 1026);
for i in 0..100 {
data[FLOAT_ARR_LEN - 1 - i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, FLOAT_ARR_LEN - 100);
assert_eq!(argmin_index_single, FLOAT_ARR_LEN - 100);
assert_eq!(argmax_index, FLOAT_ARR_LEN - 100);
assert_eq!(argmax_index_single, FLOAT_ARR_LEN - 100);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, FLOAT_ARR_LEN - 100);
assert_eq!(argmin_simd_index_single, FLOAT_ARR_LEN - 100);
assert_eq!(argmax_simd_index, FLOAT_ARR_LEN - 100);
assert_eq!(argmax_simd_index_single, FLOAT_ARR_LEN - 100);
let mut data: Vec<DType> = get_data(FLOAT_ARR_LEN);
data[123] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 123);
assert_eq!(argmin_index_single, 123);
assert_eq!(argmax_index, 123);
assert_eq!(argmax_index_single, 123);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 123);
assert_eq!(argmin_simd_index_single, 123);
assert_eq!(argmax_simd_index, 123);
assert_eq!(argmax_simd_index_single, 123);
for i in 0..100 {
data[FLOAT_ARR_LEN - 1 - i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 123);
assert_eq!(argmin_index_single, 123);
assert_eq!(argmax_index, 123);
assert_eq!(argmax_index_single, 123);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 123);
assert_eq!(argmin_simd_index_single, 123);
assert_eq!(argmax_simd_index, 123);
assert_eq!(argmax_simd_index_single, 123);
for i in 0..data.len() {
data[i] = DType::nan();
}
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 0);
assert_eq!(argmin_index_single, 0);
assert_eq!(argmax_index, 0);
assert_eq!(argmax_index_single, 0);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 0);
assert_eq!(argmin_simd_index_single, 0);
assert_eq!(argmax_simd_index, 0);
assert_eq!(argmax_simd_index_single, 0);
let mut data: Vec<DType> = get_data(128);
data[17] = DType::nan();
let (argmin_index, argmax_index) = SCALAR::argminmax(&data);
let argmin_index_single = SCALAR::argmin(&data);
let argmax_index_single = SCALAR::argmax(&data);
assert_eq!(argmin_index, 17);
assert_eq!(argmin_index_single, 17);
assert_eq!(argmax_index, 17);
assert_eq!(argmax_index_single, 17);
let (argmin_simd_index, argmax_simd_index) = unsafe { SIMD::argminmax(&data) };
let argmin_simd_index_single = unsafe { SIMD::argmin(&data) };
let argmax_simd_index_single = unsafe { SIMD::argmax(&data) };
assert_eq!(argmin_simd_index, 17);
assert_eq!(argmin_simd_index_single, 17);
assert_eq!(argmax_simd_index, 17);
assert_eq!(argmax_simd_index_single, 17);
}