use crate::DType;
use crate::interpolate::error::InterpolateResult;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum InterpolationOrder {
Nearest,
#[default]
Linear,
}
pub trait GeometricTransformAlgorithms<R: Runtime<DType = DType>> {
fn map_coordinates(
&self,
input: &Tensor<R>,
coordinates: &Tensor<R>,
order: InterpolationOrder,
cval: f64,
) -> InterpolateResult<Tensor<R>>;
fn affine_transform(
&self,
input: &Tensor<R>,
matrix: &Tensor<R>,
offset: &Tensor<R>,
output_shape: Option<&[usize]>,
order: InterpolationOrder,
cval: f64,
) -> InterpolateResult<Tensor<R>>;
fn zoom(
&self,
input: &Tensor<R>,
zoom: &[f64],
order: InterpolationOrder,
) -> InterpolateResult<Tensor<R>>;
fn rotate(
&self,
input: &Tensor<R>,
angle: f64,
axes: (usize, usize),
reshape: bool,
order: InterpolationOrder,
cval: f64,
) -> InterpolateResult<Tensor<R>>;
fn shift(
&self,
input: &Tensor<R>,
shift: &[f64],
order: InterpolationOrder,
cval: f64,
) -> InterpolateResult<Tensor<R>>;
}