Program Listing for File splinefunctions.h
↰ Return to documentation for file (include/amici/splinefunctions.h
)
#ifndef AMICI_SPLINEFUNCTIONS_H
#define AMICI_SPLINEFUNCTIONS_H
#include "amici/defines.h"
#include <vector>
#include <gsl/gsl-lite.hpp>
namespace amici {
class Model;
class AbstractSpline {
public:
AbstractSpline() = default;
AbstractSpline(
std::vector<realtype> nodes, std::vector<realtype> node_values,
bool equidistant_spacing, bool logarithmic_parametrization
);
virtual ~AbstractSpline() = default;
virtual void compute_coefficients() = 0;
virtual void compute_coefficients_sensi(
int nplist, int spline_offset, gsl::span<realtype> dvaluesdp,
gsl::span<realtype> dslopesdp
) = 0;
realtype get_value(realtype const t) const;
virtual realtype get_value_scaled(realtype const t) const = 0;
realtype get_node_value(int const i) const;
realtype get_node_value_scaled(int const i) const;
realtype get_sensitivity(realtype const t, int const ip) const;
realtype
get_sensitivity(realtype const t, int const ip, realtype const value) const;
virtual realtype
get_sensitivity_scaled(realtype const t, int const ip) const
= 0;
virtual void compute_final_value() = 0;
virtual void compute_final_sensitivity(
int nplist, int spline_offset, gsl::span<realtype> dspline_valuesdp,
gsl::span<realtype> dspline_slopesdp
) = 0;
realtype get_final_value() const;
realtype get_final_value_scaled() const;
realtype get_final_sensitivity(int const ip) const;
realtype get_final_sensitivity_scaled(int const ip) const;
bool get_equidistant_spacing() const;
bool get_logarithmic_parametrization() const;
int n_nodes() const { return static_cast<int>(nodes_.size()); }
protected:
std::vector<realtype> nodes_;
std::vector<realtype> node_values_;
std::vector<realtype> coefficients;
std::vector<realtype> coefficients_extrapolate;
std::vector<realtype> coefficients_sensi;
std::vector<realtype> coefficients_extrapolate_sensi;
void set_final_value_scaled(realtype finalValue);
void set_final_sensitivity_scaled(std::vector<realtype> finalSensitivity);
private:
realtype final_value_scaled_;
std::vector<realtype> final_sensitivity_scaled_;
bool equidistant_spacing_ = false;
bool logarithmic_parametrization_ = false;
}; // class SplineFunction
class HermiteSpline : public AbstractSpline {
public:
HermiteSpline() = default;
HermiteSpline(
std::vector<realtype> nodes, std::vector<realtype> node_values,
std::vector<realtype> node_values_derivative,
SplineBoundaryCondition firstNodeBC, SplineBoundaryCondition lastNodeBC,
SplineExtrapolation firstNodeExtrapol,
SplineExtrapolation lastNodeExtrapol, bool node_derivative_by_FD,
bool equidistant_spacing, bool logarithmic_parametrization
);
void compute_coefficients() override;
void compute_coefficients_sensi(
int nplist, int spline_offset, gsl::span<realtype> dvaluesdp,
gsl::span<realtype> dslopesdp
) override;
void compute_final_value() override;
void compute_final_sensitivity(
int nplist, int spline_offset, gsl::span<realtype> dspline_valuesdp,
gsl::span<realtype> dspline_slopesdp
) override;
realtype get_value_scaled(realtype const t) const override;
realtype get_node_derivative(int const i) const;
realtype get_node_derivative_scaled(int const i) const;
realtype
get_sensitivity_scaled(realtype const t, int const ip) const override;
bool get_node_derivative_by_fd() const { return node_derivative_by_FD_; }
private:
void compute_slope_sensitivities_by_fd(
int nplist, int spline_offset, int ip, gsl::span<realtype> dvaluesdp,
gsl::span<realtype> dslopesdp
);
void get_coeffs_sensi_lowlevel(
int ip, int i_node, int nplist, int n_spline_coefficients,
int spline_offset, realtype len, gsl::span<realtype> dnodesdp,
gsl::span<realtype> dslopesdp, gsl::span<realtype> coeffs
) const;
void handle_inner_derivatives();
void handle_boundary_conditions();
void compute_coefficients_extrapolation();
void compute_coefficients_extrapolation_sensi(
int nplist, int spline_offset, gsl::span<realtype> dspline_valuesdp,
gsl::span<realtype> dspline_slopesdp
);
std::vector<realtype> node_values_derivative_;
SplineBoundaryCondition first_node_bc_ = SplineBoundaryCondition::given;
SplineBoundaryCondition last_node_bc_ = SplineBoundaryCondition::given;
SplineExtrapolation first_node_ep_ = SplineExtrapolation::linear;
SplineExtrapolation last_node_ep_ = SplineExtrapolation::linear;
bool node_derivative_by_FD_ = false;
}; // class HermiteSpline
} // namespace amici
#endif /* AMICI_SPLINEFUNCTIONS_H */