26 #ifndef CASADI_FINITE_DIFFERENCES_HPP
27 #define CASADI_FINITE_DIFFERENCES_HPP
29 #include "function_internal.hpp"
36 enum class FdMode {FORWARD, BACKWARD, CENTRAL, SMOOTHING,
NUMEL};
39 CASADI_EXPORT std::string to_string(FdMode v);
42 CASADI_EXPORT casadi_int n_fd_points(FdMode v);
45 CASADI_EXPORT casadi_int fd_offset(FdMode v);
49 CASADI_EXPORT
void finite_diff(FdMode v,
const T1** yk, T1* J, T1 h, casadi_int n_y,
53 case FdMode::BACKWARD:
54 return casadi_forward_diff(yk, J, h, n_y);
56 return casadi_central_diff(yk, J, h, n_y);
57 case FdMode::SMOOTHING:
58 return casadi_smoothing_diff(yk, J, h, n_y, eps);
60 casadi_error(
"FD mode " + to_string(v) +
" not implemented");
68 class CASADI_EXPORT FiniteDiff :
public FunctionInternal {
71 FiniteDiff(
const std::string& name, casadi_int n);
76 ~FiniteDiff()
override;
82 static const Options options_;
83 const Options& get_options()
const override {
return options_;}
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;
126 bool uses_output()
const override {
return true;}
131 bool has_codegen()
const override {
return true;}
136 void codegen_declarations(CodeGenerator& g)
const override;
141 void codegen_body(CodeGenerator& g)
const override;
145 virtual casadi_int n_pert()
const = 0;
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;
157 virtual std::string calc_fd()
const = 0;
160 virtual casadi_int has_err()
const = 0;
163 virtual double calc_stepsize(
double abstol)
const = 0;
175 casadi_int n_z_, n_y_;
181 double h_min_, h_max_;
191 class CASADI_EXPORT ForwardDiff :
public FiniteDiff {
194 ForwardDiff(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
199 ~ForwardDiff()
override {}
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;}
229 double calc_stepsize(
double abstol)
const override {
return sqrt(abstol);}
234 double get_abstol()
const override {
return h_;}
240 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
252 class CASADI_EXPORT BackwardDiff :
public ForwardDiff {
255 BackwardDiff(
const std::string& name, casadi_int n) : ForwardDiff(name, n) {}
260 ~BackwardDiff()
override {}
265 std::string class_name()
const override {
return "BackwardDiff";}
268 double calc_stepsize(
double abstol)
const override {
269 return -ForwardDiff::calc_stepsize(abstol);
277 class CASADI_EXPORT CentralDiff :
public FiniteDiff {
280 CentralDiff(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
285 ~CentralDiff()
override {}
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);}
320 double get_abstol()
const override {
return h_*h_;}
326 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
338 class CASADI_EXPORT Smoothing :
public FiniteDiff {
341 Smoothing(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
346 ~Smoothing()
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);}
377 double get_abstol()
const override {
return h_*h_;}
383 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.