26 #ifndef CASADI_FINITE_DIFFERENCES_HPP
27 #define CASADI_FINITE_DIFFERENCES_HPP
29 #include "function_internal.hpp"
54 return casadi_forward_diff(yk, J, h, n_y);
56 return casadi_central_diff(yk, J, h, n_y);
58 return casadi_smoothing_diff(yk, J, h, n_y,
eps);
60 casadi_error(
"FD mode " +
to_string(v) +
" not implemented");
71 FiniteDiff(
const std::string& name, casadi_int n);
90 Sparsity get_sparsity_in(casadi_int i)
override;
91 Sparsity get_sparsity_out(casadi_int i)
override;
97 double get_default_in(casadi_int ind)
const override;
103 size_t get_n_in()
override;
104 size_t get_n_out()
override;
111 std::string get_name_in(casadi_int i)
override;
112 std::string get_name_out(casadi_int i)
override;
118 void init(
const Dict& opts)
override;
121 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
148 virtual std::string
pert(
const std::string& k)
const = 0;
151 virtual double pert(casadi_int k,
double h)
const = 0;
154 virtual double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const = 0;
204 std::string
class_name()
const override {
return "ForwardDiff";}
207 casadi_int
n_pert()
const override {
return 1;};
210 std::string
pert(
const std::string& k)
const override {
215 double pert(casadi_int k,
double h)
const override {
220 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
223 std::string
calc_fd()
const override {
return "casadi_forward_diff_old";}
226 casadi_int
has_err()
const override {
return false;}
241 Function get_forward(casadi_int nfwd,
const std::string& name,
242 const std::vector<std::string>& inames,
243 const std::vector<std::string>& onames,
244 const Dict& opts)
const override;
265 std::string
class_name()
const override {
return "BackwardDiff";}
290 std::string
class_name()
const override {
return "CentralDiff";}
293 casadi_int
n_pert()
const override {
return 2;};
296 std::string
pert(
const std::string& k)
const override {
297 return "(2*" + k +
"-1)*" +
str(h_);
301 double pert(casadi_int k,
double h)
const override {
302 return (2*
static_cast<double>(k)-1)*h;
306 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
309 std::string
calc_fd()
const override {
return "casadi_central_diff_old";}
312 casadi_int
has_err()
const override {
return true;}
315 double calc_stepsize(
double abstol)
const override {
return pow(abstol, 1./3);}
327 Function get_forward(casadi_int nfwd,
const std::string& name,
328 const std::vector<std::string>& inames,
329 const std::vector<std::string>& onames,
330 const Dict& opts)
const override;
351 std::string
class_name()
const override {
return "Smoothing";}
354 casadi_int
n_pert()
const override {
return 4;};
357 std::string pert(
const std::string& k)
const override;
360 double pert(casadi_int k,
double h)
const override;
363 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
366 std::string
calc_fd()
const override {
return "casadi_smoothing_diff_old";}
369 casadi_int
has_err()
const override {
return true;}
372 double calc_stepsize(
double abstol)
const override {
return pow(abstol, 1./3);}
384 Function get_forward(casadi_int nfwd,
const std::string& name,
385 const std::vector<std::string>& inames,
386 const std::vector<std::string>& onames,
387 const Dict& opts)
const override;
BackwardDiff(const std::string &name, casadi_int n)
double calc_stepsize(double abstol) const override
std::string class_name() const override
Get type name.
~BackwardDiff() override
Destructor.
CentralDiff(const std::string &name, casadi_int n)
double get_abstol() const override
Get absolute tolerance.
casadi_int has_err() const override
~CentralDiff() override
Destructor.
std::string calc_fd() const override
double pert(casadi_int k, double h) const override
double calc_stepsize(double abstol) const override
std::string pert(const std::string &k) const override
std::string class_name() const override
Get type name.
bool has_forward(casadi_int nfwd) const override
Second order derivatives.
casadi_int n_pert() const override
Helper class for C code generation.
virtual casadi_int n_pert() const =0
virtual double calc_stepsize(double abstol) const =0
const Options & get_options() const override
Options.
bool uses_output() const override
Is the scheme using the (nondifferentiated) output?
bool has_codegen() const override
Is codegen supported?
virtual std::string pert(const std::string &k) const =0
virtual casadi_int has_err() const =0
virtual double pert(casadi_int k, double h) const =0
virtual std::string calc_fd() const =0
static const Options options_
Options.
casadi_finite_diff_mem< double > m_
virtual double calc_fd(double **yk, double *y0, double *J, double h) const =0
bool has_forward(casadi_int nfwd) const override
Second order derivatives.
double calc_stepsize(double abstol) const override
std::string class_name() const override
Get type name.
std::string pert(const std::string &k) const override
double pert(casadi_int k, double h) const override
std::string calc_fd() const override
casadi_int n_pert() const override
double get_abstol() const override
Get absolute tolerance.
casadi_int has_err() const override
ForwardDiff(const std::string &name, casadi_int n)
~ForwardDiff() override
Destructor.
Internal class for Function.
double get_abstol() const override
Get absolute tolerance.
~Smoothing() override
Destructor.
std::string class_name() const override
Get type name.
bool has_forward(casadi_int nfwd) const override
Second order derivatives.
std::string calc_fd() const override
casadi_int has_err() const override
Smoothing(const std::string &name, casadi_int n)
double calc_stepsize(double abstol) const override
casadi_int n_pert() const override
const double eps
Machine epsilon.
casadi_int n_fd_points(FdMode v)
Length of FD stencil, including unperturbed input.
casadi_int fd_offset(FdMode v)
Offset for FD stencil, i.e. index of unperturbed input.
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::string to_string(TypeFmi2 v)
CASADI_EXPORT void finite_diff(FdMode v, const T1 **yk, T1 *J, T1 h, casadi_int n_y, T1 smoothing)
Calculate FD estimate.
Options metadata for a class.