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;
57 double *aseed, *asens, *pert_asens;
63 std::vector<FmuMemory*> slaves;
65 std::vector<double> ibuf_, obuf_;
67 std::vector<double> isens_, osens_;
69 std::vector<bool> imarked_, omarked_;
71 std::vector<size_t> wrt_;
73 std::vector<size_t> id_in_, id_out_;
75 std::vector<bool> in_bounds_;
77 std::vector<bool> flip_;
79 std::vector<unsigned int> vr_in_, vr_out_;
81 std::vector<double> v_in_, v_out_, d_in_, d_out_, fd_out_, v_pert_;
83 explicit FmuMemory(
const FmuFunction&
self) : self(self), instance(nullptr) {}
87 enum class Parallelization {SERIAL, OPENMP, THREAD,
NUMEL};
90 CASADI_EXPORT std::string to_string(Parallelization v);
93 enum class InputType {REG, FWD, ADJ, OUT, ADJ_OUT};
96 struct CASADI_EXPORT InputStruct {
102 static InputStruct parse(
const std::string& n,
const Fmu* fmu,
103 std::vector<std::string>* name_in = 0,
104 std::vector<std::string>* name_out = 0);
108 enum class OutputType {REG, FWD, ADJ, JAC, JAC_TRANS, JAC_ADJ_OUT, JAC_REG_ADJ, HESS};
111 struct CASADI_EXPORT OutputStruct {
119 size_t rbegin, rend, cbegin, cend;
121 static OutputStruct parse(
const std::string& n,
const Fmu* fmu,
122 std::vector<std::string>* name_in = 0,
123 std::vector<std::string>* name_out = 0);
125 OutputStruct() : ind(-1), wrt(-1), rbegin(-1), rend(-1), cbegin(-1), cend(-1) {}
129 CASADI_EXPORT
bool has_prefix(
const std::string& s);
132 CASADI_EXPORT std::string pop_prefix(
const std::string& s, std::string* rem = 0);
134 class CASADI_EXPORT FmuFunction :
public FunctionInternal {
140 std::vector<InputStruct> in_;
143 std::vector<OutputStruct> out_;
146 std::vector<size_t> jac_in_, jac_out_;
149 std::vector<double> jac_nom_in_;
152 std::vector<Sparsity> sp_trans_;
153 std::vector<casadi_int> sp_trans_map_;
156 bool has_jac_, has_fwd_, has_adj_, has_hess_;
159 bool uses_directional_derivatives_, uses_adjoint_derivatives_;
162 casadi_int nfwd_, nadj_;
165 bool validate_forward_, validate_hessian_;
168 bool make_symmetric_;
169 double step_, abstol_, reltol_;
170 bool print_progress_, new_jacobian_, new_forward_, new_hessian_, hessian_coloring_;
171 std::string validate_ad_file_;
177 Parallelization parallelization_;
185 FmuFunction(
const std::string& name,
const Fmu& fmu,
186 const std::vector<std::string>& name_in,
187 const std::vector<std::string>& name_out);
192 ~FmuFunction()
override;
197 std::string class_name()
const override {
return "FmuFunction";}
203 static const Options options_;
204 const Options& get_options()
const override {
return options_;}
208 void init(
const Dict& opts)
override;
211 static void identify_io(
212 std::vector<std::string>* scheme_in,
213 std::vector<std::string>* scheme_out,
214 const std::vector<std::string>& name_in,
215 const std::vector<std::string>& name_out);
218 Sparsity jac_sp_, hess_sp_;
221 Sparsity jac_colors_, hess_colors_;
224 std::vector<casadi_int> nonlin_;
230 casadi_int max_jac_tasks_, max_hess_tasks_, max_n_tasks_;
236 size_t get_n_in()
override {
return in_.size();}
237 size_t get_n_out()
override {
return out_.size();}
244 Sparsity get_sparsity_in(casadi_int i)
override;
245 Sparsity get_sparsity_out(casadi_int i)
override;
252 std::vector<double> get_nominal_in(casadi_int i)
const override;
253 std::vector<double> get_nominal_out(casadi_int i)
const override;
257 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
260 int eval_all(FmuMemory* m, casadi_int n_task,
261 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
264 int eval_task(FmuMemory* m, casadi_int task, casadi_int n_task,
265 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
268 void remove_nans(
double *hess_nz, casadi_int* iw)
const;
271 void check_hessian(FmuMemory* m,
const double *hess_nz, casadi_int* iw)
const;
274 void make_symmetric(
double *hess_nz, casadi_int* iw)
const;
280 bool has_jac_sparsity(casadi_int oind, casadi_int iind)
const override;
281 Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind,
bool symmetric)
const override;
285 bool all_regular()
const;
288 bool all_vectors()
const;
291 Function factory(
const std::string& name,
292 const std::vector<std::string>& s_in,
293 const std::vector<std::string>& s_out,
295 const Dict& opts)
const override;
301 bool has_jacobian()
const override;
302 Function get_jacobian(
const std::string& name,
303 const std::vector<std::string>& inames,
304 const std::vector<std::string>& onames,
305 const Dict& opts)
const override;
312 bool has_forward(casadi_int nfwd)
const override;
313 Function get_forward(casadi_int nfwd,
const std::string& name,
314 const std::vector<std::string>& inames,
315 const std::vector<std::string>& onames,
316 const Dict& opts)
const override;
323 bool has_reverse(casadi_int nadj)
const override;
324 Function get_reverse(casadi_int nadj,
const std::string& name,
325 const std::vector<std::string>& inames,
326 const std::vector<std::string>& onames,
327 const Dict& opts)
const override;
335 void check_mem_count(casadi_int n)
const override;
340 void* alloc_mem()
const override;
345 int init_mem(
void* mem)
const override;
350 void free_mem(
void *mem)
const override;
353 Dict get_stats(
void* mem)
const override;
358 void serialize_body(SerializingStream &s)
const override;
363 static ProtoFunction* deserialize(DeserializingStream& s) {
return new FmuFunction(s); }
368 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
374 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.