58 return std::sqrt(1.0 + (epsilon * r) * (epsilon * r));
60 return std::exp(-(epsilon * r) * (epsilon * r));
75 for (
int d = 0; d < dims; ++d) {
76 double diff = p1[d] - p2[d];
79 return std::sqrt(sum);
125 double m_reconstruction_error = 0.0;
126 bool m_valid =
false;
151 double epsilon = 1.0,
153 if (points.rows() == 0 || points.cols() == 0) {
156 if (points.rows() != values.size()) {
158 "ScatteredInterpolator: points rows must equal values size. Got " +
159 std::to_string(points.rows()) +
" points, " + std::to_string(values.size()) +
162 if (grid_resolution < 2) {
166 m_dims =
static_cast<int>(points.cols());
167 m_original_points = points;
168 m_original_values = values;
171 std::vector<NumericVector> grid(m_dims);
172 for (
int d = 0; d < m_dims; ++d) {
173 double min_val = points.col(d).minCoeff();
174 double max_val = points.col(d).maxCoeff();
176 double padding = 0.01 * (max_val - min_val);
182 grid[d] = NumericVector::LinSpaced(grid_resolution, min_val, max_val);
185 build_interpolator(points, values, grid, kernel, epsilon, method);
199 const std::vector<NumericVector> &grid_points,
202 if (points.rows() == 0 || points.cols() == 0) {
205 if (points.rows() != values.size()) {
206 throw InterpolationError(
"ScatteredInterpolator: points rows must equal values size");
208 if (
static_cast<int>(grid_points.size()) != points.cols()) {
210 "ScatteredInterpolator: grid_points dimensions must match points columns");
213 m_dims =
static_cast<int>(points.cols());
214 m_original_points = points;
215 m_original_values = values;
217 build_interpolator(points, values, grid_points, kernel, epsilon, method);
230 if (x.size() != y.size()) {
238 m_original_points.resize(x.size(), 1);
239 m_original_points.col(0) = x;
240 m_original_values = y;
243 double min_val = x.minCoeff();
244 double max_val = x.maxCoeff();
245 double padding = 0.01 * (max_val - min_val);
249 std::vector<NumericVector> grid(1);
250 grid[0] = NumericVector::LinSpaced(grid_resolution, min_val - padding, max_val + padding);
269 return m_gridded(query);
278 template <JanusScalar Scalar> Scalar
operator()(
const Scalar &query)
const {
285 return m_gridded(query);
296 int dims()
const {
return m_dims; }
302 bool valid()
const {
return m_valid; }
323 const std::vector<NumericVector> &grid,
RBFKernel kernel,
325 int n_points =
static_cast<int>(points.rows());
326 int n_dims =
static_cast<int>(points.cols());
336 for (
int i = 0; i < n_points; ++i) {
337 for (
int j = 0; j < n_points; ++j) {
355 for (
int d = 0; d < n_dims; ++d) {
356 grid_size *=
static_cast<int>(grid[d].size());
363 std::vector<int> dims_sizes(n_dims);
364 for (
int d = 0; d < n_dims; ++d) {
365 dims_sizes[d] =
static_cast<int>(grid[d].size());
368 for (
int flat_idx = 0; flat_idx < grid_size; ++flat_idx) {
370 std::vector<int> multi_idx(n_dims);
371 int remaining = flat_idx;
372 for (
int d = 0; d < n_dims; ++d) {
373 multi_idx[d] = remaining % dims_sizes[d];
374 remaining /= dims_sizes[d];
378 std::vector<double> grid_pt(n_dims);
379 for (
int d = 0; d < n_dims; ++d) {
380 grid_pt[d] = grid[d](multi_idx[d]);
385 for (
int i = 0; i < n_points; ++i) {
389 grid_values(flat_idx) = val;
395 m_gridded = Interpolator(grid, grid_values, method);
401 compute_reconstruction_error();
407 void compute_reconstruction_error() {
411 double sum_sq_error = 0.0;
412 int n =
static_cast<int>(m_original_values.size());
414 for (
int i = 0; i < n; ++i) {
416 double predicted = m_gridded(query);
417 double error = predicted - m_original_values(i);
418 sum_sq_error += error * error;
421 m_reconstruction_error = std::sqrt(sum_sq_error / n);
N-dimensional interpolation (linear, Hermite, B-spline, nearest).
C++20 concepts constraining valid Janus scalar types.
Custom exception hierarchy for Janus framework.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
Linear algebra operations (solve, inverse, determinant, eigendecomposition, norms).
Interpolation-specific errors.
Definition JanusError.hpp:51
Definition Interpolate.hpp:489
Scalar operator()(const Scalar &query) const
Evaluate at scalar (1D only).
Definition ScatteredInterpolator.hpp:278
ScatteredInterpolator()=default
Default constructor (invalid state).
int dims() const
Get number of input dimensions.
Definition ScatteredInterpolator.hpp:296
bool valid() const
Check if interpolator is valid (initialized).
Definition ScatteredInterpolator.hpp:302
const Interpolator & gridded() const
Get underlying gridded interpolator (for inspection).
Definition ScatteredInterpolator.hpp:308
ScatteredInterpolator(const NumericVector &x, const NumericVector &y, int grid_resolution=50, RBFKernel kernel=RBFKernel::ThinPlateSpline)
1D convenience constructor
Definition ScatteredInterpolator.hpp:228
Scalar operator()(const JanusVector< Scalar > &query) const
Evaluate at N-D point.
Definition ScatteredInterpolator.hpp:265
ScatteredInterpolator(const NumericMatrix &points, const NumericVector &values, const std::vector< NumericVector > &grid_points, RBFKernel kernel=RBFKernel::ThinPlateSpline, double epsilon=1.0, InterpolationMethod method=InterpolationMethod::Linear)
Construct with explicit per-dimension grid specification.
Definition ScatteredInterpolator.hpp:198
ScatteredInterpolator(const NumericMatrix &points, const NumericVector &values, int grid_resolution=20, RBFKernel kernel=RBFKernel::ThinPlateSpline, double epsilon=1.0, InterpolationMethod method=InterpolationMethod::Linear)
Construct from scattered N-D points with uniform grid resolution.
Definition ScatteredInterpolator.hpp:149
double reconstruction_error() const
Get RMS reconstruction error at original scattered points.
Definition ScatteredInterpolator.hpp:316
constexpr double rbf_zero_threshold
Threshold below which thin-plate spline uses linear fallback to avoid log(0).
Definition ScatteredInterpolator.hpp:42
double euclidean_distance(const double *p1, const double *p2, int dims)
Compute Euclidean distance between two points.
Definition ScatteredInterpolator.hpp:73
constexpr double rbf_regularization
Regularization term for RBF interpolation matrix to prevent singularity.
Definition ScatteredInterpolator.hpp:40
double rbf_phi(double r, RBFKernel kernel, double epsilon=1.0)
Evaluate RBF kernel φ(r) for a given distance.
Definition ScatteredInterpolator.hpp:52
Definition Diagnostics.hpp:19
InterpolationMethod
Supported interpolation methods.
Definition Interpolate.hpp:29
@ Linear
Piecewise linear (C0 continuous) - fast, simple.
Definition Interpolate.hpp:30
JanusMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition JanusTypes.hpp:66
RBFKernel
Radial basis function kernel types for scattered interpolation.
Definition ScatteredInterpolator.hpp:25
@ Multiquadric
sqrt(1 + (ε*r)²) - adjustable shape parameter
Definition ScatteredInterpolator.hpp:27
@ Linear
r - simple, produces piecewise linear surface
Definition ScatteredInterpolator.hpp:29
@ ThinPlateSpline
r² log(r) - smooth, good default, no shape parameter
Definition ScatteredInterpolator.hpp:26
@ Cubic
r³ - smooth, commonly used
Definition ScatteredInterpolator.hpp:30
@ Gaussian
exp(-(ε*r)²) - localized influence
Definition ScatteredInterpolator.hpp:28
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
auto diff(const Eigen::MatrixBase< Derived > &v)
Computes adjacent differences of a vector Returns a vector of size N-1 where out[i] = v[i+1] - v[i].
Definition Calculus.hpp:27
auto solve(const Eigen::MatrixBase< DerivedA > &A, const Eigen::MatrixBase< DerivedB > &b)
Solves linear system Ax = b using the default backend policy.
Definition Linalg.hpp:408
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > JanusVector
Dynamic-size column vector for both numeric and symbolic backends.
Definition JanusTypes.hpp:49