26 #ifndef CASADI_RUNTIME_INTEGRATOR_HPP
27 #define CASADI_RUNTIME_INTEGRATOR_HPP
29 #include "integrator_impl.hpp"
35 struct CASADI_EXPORT RuntimeIntegratorMemory :
public IntegratorMemory {
39 std::vector<double> tape;
49 class CASADI_EXPORT RuntimeIntegrator :
public Integrator {
53 RuntimeIntegrator(
const std::string& name,
const Function& dae,
double t0,
54 const std::vector<double>& tout);
57 ~RuntimeIntegrator()
override;
63 static const Options options_;
64 const Options& get_options()
const override {
return options_;}
68 void init(
const Dict& opts)
override;
73 void set_work(
void* mem,
const double**& arg,
double**& res,
74 casadi_int*& iw,
double*& w)
const override;
79 int init_mem(
void* mem)
const override;
82 void reset(IntegratorMemory* mem,
bool first_call)
const override;
85 int advance_noevent(IntegratorMemory* mem)
const override;
88 bool has_reverse(casadi_int nadj)
const override {
return true;}
91 void resetB(IntegratorMemory* mem)
const override;
94 void impulseB(IntegratorMemory* mem,
95 const double* adj_x,
const double* adj_z,
const double* adj_q)
const override;
99 Sparsity get_sparsity_in(casadi_int i)
override;
100 Sparsity get_sparsity_out(casadi_int i)
override;
104 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
105 void* mem)
const override;
109 int sp_forward(
const bvec_t** arg, bvec_t** res,
110 casadi_int* iw, bvec_t* w,
void* mem)
const override;
111 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
112 void* mem)
const override;
116 void retreat(IntegratorMemory* mem,
const double* u,
117 double* adj_x,
double* adj_p,
double* adj_u)
const override;
120 Dict get_stats(
void* mem)
const override;
123 void print_stats(IntegratorMemory* mem)
const override;
129 bool has_codegen()
const override;
130 void codegen_declarations(CodeGenerator& g)
const override;
131 void codegen_body(CodeGenerator& g)
const override;
137 void serialize_body(SerializingStream &s)
const override;
144 explicit RuntimeIntegrator(DeserializingStream& s);
147 virtual bool needs_jacobian()
const = 0;
150 virtual int kernel(RuntimeIntegratorMemory* m)
const = 0;
153 virtual void codegen_method(CodeGenerator& g)
const = 0;
156 const RuntimeIntegrator* root()
const;
162 Function jump_function()
const;
165 void set_nominal_prob();
168 casadi_int ngroup()
const {
return group_start_.size() - 1;}
171 void alloc_ivp_work();
174 void run(RuntimeIntegratorMemory* m)
const;
177 casadi_int tape_capacity()
const;
181 std::vector<double> a_, alpha_, m_, m_dense_, m_err_;
182 casadi_int n_dense_, order_err_;
185 std::vector<casadi_int> group_start_;
188 casadi_int nx_err_, nz_err_, nq_err_;
191 double step_size_, abstol_, reltol_, step0_, max_step_size_, min_step_size_;
192 casadi_int max_num_steps_, max_tape_steps_;
196 std::vector<Sparsity> sp_jac_;
207 enum Src {SRC_T, SRC_Y, SRC_P, SRC_U, SRC_RES, SRC_W, SRC_JAC, SRC_JAC_FWD, SRC_JAC_ADJ,
208 SRC_JAC_ADJ_FWD, SRC_VJP_X, SRC_VJP_Z, SRC_VJP_P, SRC_VJP_U, SRC_EV_ONE, SRC_EV_W, SRC_YDOT,
221 casadi_int n_in, n_out;
222 std::vector<Slot> arg, res;
226 std::vector<std::vector<TaskCall>> task_calls(
const std::string& suffix)
const;
230 const std::vector<std::vector<TaskCall>>& calls)
const;
234 static std::string slot_expr(
const std::string& d,
const Slot& e);
237 int task(RuntimeIntegratorMemory* m)
const;
240 void codegen_task(CodeGenerator& g,
const std::string& d,
241 const std::vector<std::vector<TaskCall>>& calls,
bool in_event =
false)
const;
244 void codegen_loop(CodeGenerator& g)
const;
247 void codegen_ivp_prob(CodeGenerator& g,
const std::string& p, casadi_int tape_size)
const;
250 std::vector<std::vector<TaskCall>> calls_, calls_nom_;
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.