#![doc = concat!("argmin-math = \"", env!("CARGO_PKG_VERSION"), "\"")]
#![doc = concat!("argmin-math = { version = \"", env!("CARGO_PKG_VERSION"), "\", features = [\"ndarray_latest\"] }")]
#![warn(missing_docs)]
#![deny(clippy::float_cmp)]
cfg_if::cfg_if! {
if #[cfg(feature = "nalgebra_0_34")] {
extern crate nalgebra_0_34 as nalgebra;
trait Allocator<T, R, C = nalgebra::U1>: nalgebra::allocator::Allocator<R, C>
where
R: nalgebra::Dim,
C: nalgebra::Dim,
{}
impl<T, R, C, U> Allocator<T, R, C> for U
where
U: nalgebra::allocator::Allocator<R, C>,
R: nalgebra::Dim,
C: nalgebra::Dim,
{}
trait SameShapeAllocator<T, R1, C1, R2, C2>: nalgebra::allocator::SameShapeAllocator<R1, C1, R2, C2>
where
R1: nalgebra::Dim,
C1: nalgebra::Dim,
R2: nalgebra::Dim,
C2: nalgebra::Dim,
nalgebra::constraint::ShapeConstraint: nalgebra::constraint::SameNumberOfRows<R1,R2> + nalgebra::constraint::SameNumberOfColumns<C1,C2>,
{}
impl<T, R1, C1, R2, C2, U> SameShapeAllocator<T, R1, C1, R2, C2> for U
where
U: nalgebra::allocator::SameShapeAllocator<R1, C1, R2, C2>,
R1: nalgebra::Dim,
C1: nalgebra::Dim,
R2: nalgebra::Dim,
C2: nalgebra::Dim,
nalgebra::constraint::ShapeConstraint: nalgebra::constraint::SameNumberOfRows<R1,R2> + nalgebra::constraint::SameNumberOfColumns<C1,C2>,
{}
use nalgebra::{
ClosedAddAssign as ClosedAdd,
ClosedSubAssign as ClosedSub,
ClosedDivAssign as ClosedDiv,
ClosedMulAssign as ClosedMul,
};
} else if #[cfg(feature = "nalgebra_0_33")] {
extern crate nalgebra_0_33 as nalgebra;
trait Allocator<T, R, C = nalgebra::U1>: nalgebra::allocator::Allocator<R, C>
where
R: nalgebra::Dim,
C: nalgebra::Dim,
{}
impl<T, R, C, U> Allocator<T, R, C> for U
where
U: nalgebra::allocator::Allocator<R, C>,
R: nalgebra::Dim,
C: nalgebra::Dim,
{}
trait SameShapeAllocator<T, R1, C1, R2, C2>: nalgebra::allocator::SameShapeAllocator<R1, C1, R2, C2>
where
R1: nalgebra::Dim,
C1: nalgebra::Dim,
R2: nalgebra::Dim,
C2: nalgebra::Dim,
nalgebra::constraint::ShapeConstraint: nalgebra::constraint::SameNumberOfRows<R1,R2> + nalgebra::constraint::SameNumberOfColumns<C1,C2>,
{}
impl<T, R1, C1, R2, C2, U> SameShapeAllocator<T, R1, C1, R2, C2> for U
where
U: nalgebra::allocator::SameShapeAllocator<R1, C1, R2, C2>,
R1: nalgebra::Dim,
C1: nalgebra::Dim,
R2: nalgebra::Dim,
C2: nalgebra::Dim,
nalgebra::constraint::ShapeConstraint: nalgebra::constraint::SameNumberOfRows<R1,R2> + nalgebra::constraint::SameNumberOfColumns<C1,C2>,
{}
use nalgebra::{
ClosedAddAssign as ClosedAdd,
ClosedSubAssign as ClosedSub,
ClosedDivAssign as ClosedDiv,
ClosedMulAssign as ClosedMul,
};
} else if #[cfg(feature = "nalgebra_0_32")] {
extern crate nalgebra_0_32 as nalgebra;
use nalgebra::allocator::{Allocator, SameShapeAllocator};
use nalgebra::{ClosedAdd, ClosedSub, ClosedDiv, ClosedMul};
} else if #[cfg(feature = "nalgebra_0_31")] {
extern crate nalgebra_0_31 as nalgebra;
use nalgebra::allocator::{Allocator, SameShapeAllocator};
use nalgebra::{ClosedAdd, ClosedSub, ClosedDiv, ClosedMul};
} else if #[cfg(feature = "nalgebra_0_30")] {
extern crate nalgebra_0_30 as nalgebra;
use nalgebra::allocator::{Allocator, SameShapeAllocator};
use nalgebra::{ClosedAdd, ClosedSub, ClosedDiv, ClosedMul};
} else if #[cfg(feature = "nalgebra_0_29")] {
extern crate nalgebra_0_29 as nalgebra;
use nalgebra::allocator::{Allocator, SameShapeAllocator};
use nalgebra::{ClosedAdd, ClosedSub, ClosedDiv, ClosedMul};
}
}
cfg_if::cfg_if! {
if #[cfg(feature = "ndarray_0_16")] {
extern crate ndarray_0_16 as ndarray;
} else if #[cfg(feature = "ndarray_0_15")] {
extern crate ndarray_0_15 as ndarray;
} else if #[cfg(feature = "ndarray_0_14")] {
extern crate ndarray_0_14 as ndarray;
} else if #[cfg(feature = "ndarray_0_13")] {
extern crate ndarray_0_13 as ndarray;
}
}
cfg_if::cfg_if! {
if #[cfg(feature = "ndarray-linalg_0_17")] {
extern crate ndarray_linalg_0_17 as ndarray_linalg;
} else if #[cfg(feature = "ndarray-linalg_0_16")] {
extern crate ndarray_linalg_0_16 as ndarray_linalg;
}
}
cfg_if::cfg_if! {
if #[cfg(feature = "num-complex_0_2")] {
extern crate num_complex_0_2 as num_complex;
} else if #[cfg(feature = "num-complex_0_3")] {
extern crate num_complex_0_3 as num_complex;
} else if #[cfg(feature = "num-complex_0_4")] {
extern crate num_complex_0_4 as num_complex;
}
}
cfg_if::cfg_if! {
if #[cfg(feature = "faer_v0_20")] {
extern crate faer_0_20 as faer;
} else if #[cfg(feature = "faer_v0_21")] {
extern crate faer_0_21 as faer;
} else if #[cfg(feature = "faer_v0_22")] {
extern crate faer_0_22 as faer;
} else if #[cfg(feature = "faer_v0_23")] {
extern crate faer_0_23 as faer;
}
}
#[cfg(feature = "primitives")]
mod primitives;
#[cfg(feature = "primitives")]
#[allow(unused_imports)]
pub use crate::primitives::*;
#[cfg(feature = "ndarray_all")]
mod ndarray_m;
#[cfg(feature = "ndarray_all")]
#[allow(unused_imports)]
pub use crate::ndarray_m::*;
#[cfg(feature = "nalgebra_all")]
mod nalgebra_m;
#[cfg(feature = "nalgebra_all")]
#[allow(unused_imports)]
pub use crate::nalgebra_m::*;
#[cfg(feature = "vec")]
mod vec;
#[cfg(feature = "vec")]
#[allow(unused_imports)]
pub use crate::vec::*;
cfg_if! {
if #[cfg(feature = "faer_v0_20")] {
mod faer_m_0_20;
use faer_m_0_20 as faer_m;
} else if #[cfg(feature = "faer_v0_21")] {
extern crate faer_traits_0_21 as faer_traits;
mod faer_m_0_21;
use faer_m_0_21 as faer_m;
} else if #[cfg(feature = "faer_v0_22")] {
extern crate faer_traits_0_22 as faer_traits;
mod faer_m_0_21;
use faer_m_0_21 as faer_m;
} else if #[cfg(feature = "faer_v0_23")] {
extern crate faer_traits_0_23 as faer_traits;
mod faer_m_0_21;
use faer_m_0_21 as faer_m;
}
}
#[cfg(feature = "faer_all")]
#[allow(unused_imports)]
pub use crate::faer_m::*;
#[cfg(test)]
#[cfg(feature = "faer_all")]
mod faer_tests;
pub use anyhow::Error;
use cfg_if::cfg_if;
#[cfg(feature = "rand")]
pub use rand::Rng;
pub trait ArgminDot<T, U> {
fn dot(&self, other: &T) -> U;
}
pub trait ArgminWeightedDot<T, U, V> {
fn weighted_dot(&self, w: &V, vec: &T) -> U;
}
pub trait ArgminZero {
fn zero() -> Self;
}
pub trait ArgminConj {
#[must_use]
fn conj(&self) -> Self;
}
pub trait ArgminZeroLike {
#[must_use]
fn zero_like(&self) -> Self;
}
pub trait ArgminEye {
fn eye(n: usize) -> Self;
#[must_use]
fn eye_like(&self) -> Self;
}
pub trait ArgminAdd<T, U> {
fn add(&self, other: &T) -> U;
}
pub trait ArgminSub<T, U> {
fn sub(&self, other: &T) -> U;
}
pub trait ArgminMul<T, U> {
fn mul(&self, other: &T) -> U;
}
pub trait ArgminDiv<T, U> {
fn div(&self, other: &T) -> U;
}
pub trait ArgminScaledAdd<T, U, V> {
fn scaled_add(&self, factor: &U, vec: &T) -> V;
}
pub trait ArgminScaledSub<T, U, V> {
fn scaled_sub(&self, factor: &U, vec: &T) -> V;
}
pub trait ArgminL1Norm<U> {
fn l1_norm(&self) -> U;
}
pub trait ArgminL2Norm<U> {
fn l2_norm(&self) -> U;
}
pub trait ArgminTranspose<U> {
fn t(self) -> U;
}
pub trait ArgminInv<T> {
fn inv(&self) -> Result<T, Error>;
}
#[cfg(feature = "rand")]
pub trait ArgminRandom {
fn rand_from_range<R: Rng>(min: &Self, max: &Self, rng: &mut R) -> Self;
}
pub trait ArgminMinMax {
fn min(x: &Self, y: &Self) -> Self;
fn max(x: &Self, y: &Self) -> Self;
}
pub trait ArgminSignum {
fn signum(self) -> Self;
}