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);
92 Sparsity get_sparsity_in(casadi_int i)
override;
93 Sparsity get_sparsity_out(casadi_int i)
override;
99 double get_default_in(casadi_int ind)
const override;
105 size_t get_n_in()
override;
106 size_t get_n_out()
override;
113 std::string get_name_in(casadi_int i)
override;
114 std::string get_name_out(casadi_int i)
override;
120 void init(
const Dict& opts)
override;
123 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
150 virtual std::string
pert(
const std::string& k,
const std::string& h)
const = 0;
153 virtual double pert(casadi_int k,
double h)
const = 0;
156 virtual double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const = 0;
208 std::string
class_name()
const override {
return "ForwardDiff";}
211 casadi_int
n_pert()
const override {
return 1;};
214 std::string
pert(
const std::string& k,
const std::string& h)
const override {
219 double pert(casadi_int k,
double h)
const override {
224 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
227 std::string
calc_fd()
const override {
return "casadi_forward_diff_old";}
230 casadi_int
has_err()
const override {
return false;}
245 Function get_forward(casadi_int nfwd,
const std::string& name,
246 const std::vector<std::string>& inames,
247 const std::vector<std::string>& onames,
248 const Dict& opts)
const override;
271 std::string
class_name()
const override {
return "BackwardDiff";}
298 std::string
class_name()
const override {
return "CentralDiff";}
301 casadi_int
n_pert()
const override {
return 2;};
304 std::string
pert(
const std::string& k,
const std::string& h)
const override {
305 return "(2*" + k +
"-1)*" + h;
309 double pert(casadi_int k,
double h)
const override {
310 return (2*
static_cast<double>(k)-1)*h;
314 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
317 std::string
calc_fd()
const override {
return "casadi_central_diff_old";}
320 casadi_int
has_err()
const override {
return true;}
323 double calc_stepsize(
double abstol)
const override {
return pow(abstol, 1./3);}
335 Function get_forward(casadi_int nfwd,
const std::string& name,
336 const std::vector<std::string>& inames,
337 const std::vector<std::string>& onames,
338 const Dict& opts)
const override;
361 std::string
class_name()
const override {
return "Smoothing";}
364 casadi_int
n_pert()
const override {
return 4;};
367 std::string pert(
const std::string& k,
const std::string& h)
const override;
370 double pert(casadi_int k,
double h)
const override;
373 double calc_fd(
double** yk,
double* y0,
double* J,
double h)
const override;
376 std::string
calc_fd()
const override {
return "casadi_smoothing_diff_old";}
379 casadi_int
has_err()
const override {
return true;}
382 double calc_stepsize(
double abstol)
const override {
return pow(abstol, 1./3);}
394 Function get_forward(casadi_int nfwd,
const std::string& name,
395 const std::vector<std::string>& inames,
396 const std::vector<std::string>& onames,
397 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(DeserializingStream &s)
static ProtoFunction * deserialize(DeserializingStream &s)
~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
CentralDiff(DeserializingStream &s)
static ProtoFunction * deserialize(DeserializingStream &s)
double pert(casadi_int k, double h) const override
std::string pert(const std::string &k, const std::string &h) const override
double calc_stepsize(double abstol) 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.
Helper class for Serialization.
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 std::string &h) 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.
double pert(casadi_int k, double h) const override
std::string calc_fd() const override
std::string pert(const std::string &k, const std::string &h) 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.
static ProtoFunction * deserialize(DeserializingStream &s)
ForwardDiff(DeserializingStream &s)
Internal class for Function.
Base class for FunctionInternal and LinsolInternal.
Helper class for Serialization.
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.
Smoothing(DeserializingStream &s)
std::string calc_fd() const override
casadi_int has_err() const override
Smoothing(const std::string &name, casadi_int n)
static ProtoFunction * deserialize(DeserializingStream &s)
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.
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.