mod _interpolation;
mod _native;
use ndarray::Array1;
pub use crate::variogram::Variogram;
pub use _interpolation::{Kriging, KrigingOptions};
use crate::common::arrays::{ArrayLike, Targets};
use crate::common::exceptions::Result;
#[derive(Clone, Debug, PartialEq)]
pub struct KrigingDiagnostics {
pub radius: f64,
pub max_neighbors: i64,
pub min_neighbors: i64,
pub n_threads: i64,
}
pub fn ordinary_kriging(
x: &(impl ArrayLike + ?Sized),
y: &(impl ArrayLike + ?Sized),
z: &(impl ArrayLike + ?Sized),
targets: &(impl Targets + ?Sized),
options: KrigingOptions,
) -> Result<Array1<f64>> {
Kriging::new(options)?.fit(x, y, z)?.interpolate(targets)
}
pub fn ordinary_kriging_with_diagnostics(
x: &(impl ArrayLike + ?Sized),
y: &(impl ArrayLike + ?Sized),
z: &(impl ArrayLike + ?Sized),
targets: &(impl Targets + ?Sized),
options: KrigingOptions,
) -> Result<(Array1<f64>, KrigingDiagnostics)> {
let max_neighbors = options.max_neighbors;
let min_neighbors = options.min_neighbors;
let mut kriging = Kriging::new(options)?;
kriging.fit(x, y, z)?;
let estimates = kriging.interpolate(targets)?;
Ok((
estimates,
KrigingDiagnostics {
radius: kriging.resolve_radius()?,
max_neighbors,
min_neighbors,
n_threads: kriging.n_threads(),
},
))
}