use crate::ArgminL1Norm;
use ndarray::Array1;
use num_complex::Complex;
macro_rules! make_l1norm {
($t:ty) => {
impl ArgminL1Norm<$t> for Array1<$t> {
#[inline]
fn l1_norm(&self) -> $t {
self.iter().map(|a| a.abs()).sum()
}
}
};
}
macro_rules! make_l1norm_complex {
($i: ty, $t:ty) => {
impl ArgminL1Norm<$t> for Array1<$i> {
#[inline]
fn l1_norm(&self) -> $t {
self.iter().map(|a| a.l1_norm()).sum::<$t>().into()
}
}
};
}
macro_rules! make_l1norm_unsigned {
($t:ty) => {
impl ArgminL1Norm<$t> for Array1<$t> {
#[inline]
fn l1_norm(&self) -> $t {
self.iter().sum()
}
}
};
}
make_l1norm_unsigned!(u8);
make_l1norm_unsigned!(u16);
make_l1norm_unsigned!(u32);
make_l1norm_unsigned!(u64);
make_l1norm!(i8);
make_l1norm!(i16);
make_l1norm!(i32);
make_l1norm!(i64);
make_l1norm!(f32);
make_l1norm!(f64);
make_l1norm_complex!(Complex<i8>, i8);
make_l1norm_complex!(Complex<i16>, i16);
make_l1norm_complex!(Complex<i32>, i32);
make_l1norm_complex!(Complex<i64>, i64);
make_l1norm_complex!(Complex<u8>, u8);
make_l1norm_complex!(Complex<u16>, u16);
make_l1norm_complex!(Complex<u32>, u32);
make_l1norm_complex!(Complex<u64>, u64);
make_l1norm_complex!(Complex<f32>, f32);
make_l1norm_complex!(Complex<f64>, f64);
#[cfg(test)]
use crate as argmin_math;
include!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/ndarray-tests-src/l1norm.rs"
));