use crate::DType;
use crate::interpolate::error::InterpolateResult;
use crate::interpolate::traits::bspline::BSplineBoundary;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
#[derive(Debug, Clone)]
pub struct BivariateSpline<R: Runtime<DType = DType>> {
pub knots_x: Tensor<R>,
pub knots_y: Tensor<R>,
pub coefficients: Tensor<R>,
pub degree_x: usize,
pub degree_y: usize,
}
pub trait RectBivariateSplineAlgorithms<R: Runtime<DType = DType>> {
#[allow(clippy::too_many_arguments)]
fn rect_bivariate_spline_fit(
&self,
x: &Tensor<R>,
y: &Tensor<R>,
z: &Tensor<R>,
degree_x: usize,
degree_y: usize,
boundary: &BSplineBoundary,
) -> InterpolateResult<BivariateSpline<R>>;
fn rect_bivariate_spline_evaluate(
&self,
spline: &BivariateSpline<R>,
xi: &Tensor<R>,
yi: &Tensor<R>,
) -> InterpolateResult<Tensor<R>>;
fn rect_bivariate_spline_evaluate_grid(
&self,
spline: &BivariateSpline<R>,
xi: &Tensor<R>,
yi: &Tensor<R>,
) -> InterpolateResult<Tensor<R>>;
fn rect_bivariate_spline_partial_derivative(
&self,
spline: &BivariateSpline<R>,
xi: &Tensor<R>,
yi: &Tensor<R>,
dx: usize,
dy: usize,
) -> InterpolateResult<Tensor<R>>;
fn rect_bivariate_spline_integrate(
&self,
spline: &BivariateSpline<R>,
xa: f64,
xb: f64,
ya: f64,
yb: f64,
) -> InterpolateResult<Tensor<R>>;
}