26 #ifndef CASADI_FMU_FUNCTION_HPP
27 #define CASADI_FMU_FUNCTION_HPP
29 #include "function_internal.hpp"
31 #include "finite_differences.hpp"
38 class DaeBuilderInternal;
43 struct CASADI_EXPORT FmuMemory :
public FunctionMemory {
45 const FmuFunction&
self;
55 double *aseed, *asens, *pert_asens;
61 std::vector<FmuMemory*> slaves;
63 std::vector<double> ibuf_, obuf_;
65 std::vector<double> isens_, osens_;
67 std::vector<bool> imarked_, omarked_;
69 std::vector<size_t> wrt_;
71 std::vector<size_t> id_in_, id_out_;
73 std::vector<bool> in_bounds_;
75 std::vector<bool> flip_;
77 std::vector<unsigned int> vr_in_, vr_out_;
79 std::vector<double> v_in_, v_out_, d_in_, d_out_, fd_out_, v_pert_;
81 size_t n_get_all, n_get_directional, n_get_adjoint;
82 double t_get_all, t_get_directional, t_get_adjoint;
84 explicit FmuMemory(
const FmuFunction&
self) : self(self), instance(nullptr) {}
88 enum class Parallelization {SERIAL, OPENMP, THREAD,
NUMEL};
91 CASADI_EXPORT std::string to_string(Parallelization v);
94 enum class InputType {REG, FWD, ADJ, OUT, ADJ_OUT};
97 struct CASADI_EXPORT InputStruct {
103 static InputStruct parse(
const std::string& n,
const Fmu* fmu,
104 std::vector<std::string>* name_in =
nullptr,
105 std::vector<std::string>* name_out =
nullptr);
109 enum class OutputType {REG, FWD, ADJ, JAC, JAC_TRANS, JAC_ADJ_OUT, JAC_REG_ADJ, HESS};
112 struct CASADI_EXPORT OutputStruct {
120 size_t rbegin, rend, cbegin, cend;
122 static OutputStruct parse(
const std::string& n,
const Fmu* fmu,
123 std::vector<std::string>* name_in =
nullptr,
124 std::vector<std::string>* name_out =
nullptr);
126 OutputStruct() : ind(-1), wrt(-1), rbegin(-1), rend(-1), cbegin(-1), cend(-1) {}
130 CASADI_EXPORT
bool has_prefix(
const std::string& s);
133 CASADI_EXPORT std::string pop_prefix(
const std::string& s, std::string* rem =
nullptr);
135 class CASADI_EXPORT FmuFunction :
public FunctionInternal {
141 std::vector<InputStruct> in_;
144 std::vector<OutputStruct> out_;
147 std::vector<size_t> jac_in_, jac_out_;
150 std::vector<double> jac_nom_in_;
153 std::vector<Sparsity> sp_trans_;
154 std::vector<casadi_int> sp_trans_map_;
157 bool has_jac_, has_fwd_, has_adj_, has_hess_;
160 bool uses_directional_derivatives_, uses_adjoint_derivatives_;
163 casadi_int nfwd_, nadj_;
166 bool validate_forward_, validate_hessian_;
169 double step_, abstol_, reltol_;
170 bool print_progress_, new_jacobian_, new_forward_, new_hessian_, fd_flip_,
171 make_symmetric_, hessian_coloring_, asymmetric_hessian_coloring_,
172 enable_forward_jacobian_, enable_adjoint_jacobian_, enable_adjoint_hessian_;
173 std::string validate_ad_file_;
179 Parallelization parallelization_;
187 FmuFunction(
const std::string& name,
const Fmu& fmu,
188 const std::vector<std::string>& name_in,
189 const std::vector<std::string>& name_out);
194 ~FmuFunction()
override;
199 std::string class_name()
const override {
return "FmuFunction";}
205 static const Options options_;
206 const Options& get_options()
const override {
return options_;}
210 void init(
const Dict& opts)
override;
213 static void identify_io(
214 std::vector<std::string>* scheme_in,
215 std::vector<std::string>* scheme_out,
216 const std::vector<std::string>& name_in,
217 const std::vector<std::string>& name_out);
220 Sparsity jac_sp_, hess_sp_, adj_sp_;
223 Sparsity jac_colors_, adj_colors_, hess_colors_, hess_uni_colors_;
226 std::vector<casadi_int> which_hess_color_;
229 std::vector<casadi_int> nonlin_;
235 casadi_int max_jac_tasks_, max_hess_tasks_, max_adj_tasks_, max_n_tasks_;
241 size_t get_n_in()
override {
return in_.size();}
242 size_t get_n_out()
override {
return out_.size();}
249 Sparsity get_sparsity_in(casadi_int i)
override;
250 Sparsity get_sparsity_out(casadi_int i)
override;
257 std::vector<double> get_nominal_in(casadi_int i)
const override;
258 std::vector<double> get_nominal_out(casadi_int i)
const override;
262 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
265 int eval_all(FmuMemory* m, casadi_int n_task,
266 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
269 int eval_task(FmuMemory* m, casadi_int task, casadi_int n_task,
270 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
273 void finalize_hessian(FmuMemory* m,
double *hess_nz, casadi_int* iw)
const;
279 bool has_jac_sparsity(casadi_int oind, casadi_int iind)
const override;
280 Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind,
bool symmetric)
const override;
284 bool all_regular()
const;
287 bool all_vectors()
const;
290 Function factory(
const std::string& name,
291 const std::vector<std::string>& s_in,
292 const std::vector<std::string>& s_out,
294 const Dict& opts)
const override;
300 bool has_jacobian()
const override;
301 Function get_jacobian(
const std::string& name,
302 const std::vector<std::string>& inames,
303 const std::vector<std::string>& onames,
304 const Dict& opts)
const override;
311 bool has_forward(casadi_int nfwd)
const override;
312 Function get_forward(casadi_int nfwd,
const std::string& name,
313 const std::vector<std::string>& inames,
314 const std::vector<std::string>& onames,
315 const Dict& opts)
const override;
322 bool has_reverse(casadi_int nadj)
const override;
323 Function get_reverse(casadi_int nadj,
const std::string& name,
324 const std::vector<std::string>& inames,
325 const std::vector<std::string>& onames,
326 const Dict& opts)
const override;
334 void check_mem_count(casadi_int n)
const override;
339 void* alloc_mem()
const override;
344 int init_mem(
void* mem)
const override;
349 void free_mem(
void *mem)
const override;
352 Dict get_stats(
void* mem)
const override;
357 void serialize_body(SerializingStream &s)
const override;
362 static ProtoFunction* deserialize(DeserializingStream& s) {
return new FmuFunction(s); }
367 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
373 explicit FmuFunction(DeserializingStream& s);
std::map< std::string, std::vector< std::string > > AuxOut
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.