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);
72 explicit FiniteDiff(DeserializingStream& s);
73 void serialize_body(SerializingStream& s)
const override;
78 ~FiniteDiff()
override;
84 static const Options options_;
85 const Options& get_options()
const override {
return options_;}
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;
128 bool uses_output()
const override {
return true;}
133 bool has_codegen()
const override {
return true;}
138 void codegen_declarations(CodeGenerator& g)
const override;
143 void codegen_body(CodeGenerator& g)
const override;
147 virtual casadi_int n_pert()
const = 0;
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;
159 virtual std::string calc_fd()
const = 0;
162 virtual casadi_int has_err()
const = 0;
165 virtual double calc_stepsize(
double abstol)
const = 0;
177 casadi_int n_z_, n_y_;
183 double h_min_, h_max_;
193 class CASADI_EXPORT ForwardDiff :
public FiniteDiff {
196 ForwardDiff(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
197 explicit ForwardDiff(DeserializingStream& s) : FiniteDiff(s) {}
198 static ProtoFunction* deserialize(DeserializingStream& s) {
return new ForwardDiff(s); }
203 ~ForwardDiff()
override {}
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;}
233 double calc_stepsize(
double abstol)
const override {
return sqrt(abstol);}
238 double get_abstol()
const override {
return h_;}
244 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
256 class CASADI_EXPORT BackwardDiff :
public ForwardDiff {
259 BackwardDiff(
const std::string& name, casadi_int n) : ForwardDiff(name, n) {}
260 explicit BackwardDiff(DeserializingStream& s) : ForwardDiff(s) {}
261 static ProtoFunction* deserialize(DeserializingStream& s) {
return new BackwardDiff(s); }
266 ~BackwardDiff()
override {}
271 std::string class_name()
const override {
return "BackwardDiff";}
274 double calc_stepsize(
double abstol)
const override {
275 return -ForwardDiff::calc_stepsize(abstol);
283 class CASADI_EXPORT CentralDiff :
public FiniteDiff {
286 CentralDiff(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
287 explicit CentralDiff(DeserializingStream& s) : FiniteDiff(s) {}
288 static ProtoFunction* deserialize(DeserializingStream& s) {
return new CentralDiff(s); }
293 ~CentralDiff()
override {}
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);}
328 double get_abstol()
const override {
return h_*h_;}
334 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
346 class CASADI_EXPORT Smoothing :
public FiniteDiff {
349 Smoothing(
const std::string& name, casadi_int n) : FiniteDiff(name, n) {}
350 explicit Smoothing(DeserializingStream& s) : FiniteDiff(s) {}
351 static ProtoFunction* deserialize(DeserializingStream& s) {
return new Smoothing(s); }
356 ~Smoothing()
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);}
387 double get_abstol()
const override {
return h_*h_;}
393 bool has_forward(casadi_int nfwd)
const override {
return true;}
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;
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.