31 [[nodiscard]]
virtual std::unique_ptr<rbf_base> clone()
const = 0;
33 [[nodiscard]]
virtual int cpd_order()
const = 0;
35 [[nodiscard]]
double evaluate(
const vector3d& diff)
const {
37 return evaluate_isotropic(a_diff);
40 [[nodiscard]] vector3d evaluate_gradient(
const vector3d& diff)
const {
42 return evaluate_gradient_isotropic(a_diff);
45 [[nodiscard]] matrix3d evaluate_hessian(
const vector3d& diff)
const {
47 return aniso_.transpose() * evaluate_hessian_isotropic(a_diff) * aniso_;
50 [[nodiscard]]
virtual double evaluate_isotropic(
const vector3d& diff)
const = 0;
52 [[nodiscard]]
virtual vector3d evaluate_gradient_isotropic(
const vector3d& diff)
const = 0;
54 [[nodiscard]]
virtual matrix3d evaluate_hessian_isotropic(
const vector3d& diff)
const = 0;
56 [[nodiscard]]
virtual int num_parameters()
const = 0;
58 [[nodiscard]]
virtual const std::vector<double>& parameter_lower_bounds()
const = 0;
60 [[nodiscard]]
virtual const std::vector<double>& parameter_upper_bounds()
const = 0;
62 [[nodiscard]]
const std::vector<double>& parameters()
const {
return params_;}
65 if(aniso.determinant() <= 0.0) {
66 throw std::invalid_argument(
"aniso must have a position determinant");
72 void set_parameters(
const std::vector<double>& params) {
73 if(
static_cast<int>(params.size()) != num_parameters()) {
74 throw std::invalid_argument(
"params.size() must have " + std::to_string(num_parameters()) +
" elements.");
79 rbf_base() : aniso_(geometry::linear_transformation3d::Identity()) {}
84 std::vector<double> params_;