use crate::DType;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ExtremumMode {
Wrap,
#[default]
Clip,
}
#[derive(Debug, Clone)]
pub struct ExtremaResult<R: Runtime<DType = DType>> {
pub indices: Vec<usize>,
pub values: Tensor<R>,
}
pub trait ExtremaAlgorithms<R: Runtime<DType = DType>> {
fn argrelmin(
&self,
x: &Tensor<R>,
order: usize,
mode: ExtremumMode,
) -> Result<ExtremaResult<R>>;
fn argrelmax(
&self,
x: &Tensor<R>,
order: usize,
mode: ExtremumMode,
) -> Result<ExtremaResult<R>>;
fn argrelextrema(
&self,
x: &Tensor<R>,
order: usize,
mode: ExtremumMode,
) -> Result<(ExtremaResult<R>, ExtremaResult<R>)> {
let minima = self.argrelmin(x, order, mode)?;
let maxima = self.argrelmax(x, order, mode)?;
Ok((minima, maxima))
}
}