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.