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> seed_, sens_;
69 std::vector<bool> changed_;
71 std::vector<bool> requested_;
73 std::vector<size_t> wrt_;
75 std::vector<size_t> id_in_, id_out_;
77 std::vector<bool> in_bounds_;
79 std::vector<bool> flip_;
81 std::vector<unsigned int> vr_in_, vr_out_;
83 std::vector<double> v_in_, v_out_, d_in_, d_out_, fd_out_, v_pert_;
85 explicit FmuMemory(
const FmuFunction&
self) : self(self), instance(nullptr) {}
89 enum class Parallelization {SERIAL, OPENMP, THREAD,
NUMEL};
92 CASADI_EXPORT std::string to_string(Parallelization v);
95 enum class InputType {REG, FWD, ADJ, OUT, ADJ_OUT};
98 struct CASADI_EXPORT InputStruct {
104 static InputStruct parse(
const std::string& n,
const Fmu* fmu,
105 std::vector<std::string>* name_in = 0,
106 std::vector<std::string>* name_out = 0);
110 enum class OutputType {REG, FWD, ADJ, JAC, JAC_TRANS, JAC_ADJ_OUT, JAC_REG_ADJ, HESS};
113 struct CASADI_EXPORT OutputStruct {
121 size_t rbegin, rend, cbegin, cend;
123 static OutputStruct parse(
const std::string& n,
const Fmu* fmu,
124 std::vector<std::string>* name_in = 0,
125 std::vector<std::string>* name_out = 0);
127 OutputStruct() : ind(-1), wrt(-1), rbegin(-1), rend(-1), cbegin(-1), cend(-1) {}
131 CASADI_EXPORT
bool has_prefix(
const std::string& s);
134 CASADI_EXPORT std::string pop_prefix(
const std::string& s, std::string* rem = 0);
136 class CASADI_EXPORT FmuFunction :
public FunctionInternal {
142 std::vector<InputStruct> in_;
145 std::vector<OutputStruct> out_;
148 std::vector<size_t> jac_in_, jac_out_;
151 std::vector<double> jac_nom_in_;
154 std::vector<Sparsity> sp_trans_;
155 std::vector<casadi_int> sp_trans_map_;
158 bool has_jac_, has_fwd_, has_adj_, has_hess_;
161 bool enable_ad_, validate_ad_, make_symmetric_, check_hessian_;
162 double step_, abstol_, reltol_;
163 bool print_progress_, new_jacobian_, new_forward_, new_hessian_, hessian_coloring_;
164 std::string validate_ad_file_;
170 Parallelization parallelization_;
178 FmuFunction(
const std::string& name,
const Fmu& fmu,
179 const std::vector<std::string>& name_in,
180 const std::vector<std::string>& name_out);
185 ~FmuFunction()
override;
190 std::string class_name()
const override {
return "FmuFunction";}
196 static const Options options_;
197 const Options& get_options()
const override {
return options_;}
201 void init(
const Dict& opts)
override;
204 static void identify_io(
205 std::vector<std::string>* scheme_in,
206 std::vector<std::string>* scheme_out,
207 const std::vector<std::string>& name_in,
208 const std::vector<std::string>& name_out);
211 Sparsity jac_sp_, hess_sp_;
214 Sparsity jac_colors_, hess_colors_;
217 std::vector<casadi_int> nonlin_;
223 casadi_int max_jac_tasks_, max_hess_tasks_, max_n_tasks_;
229 size_t get_n_in()
override {
return in_.size();}
230 size_t get_n_out()
override {
return out_.size();}
237 Sparsity get_sparsity_in(casadi_int i)
override;
238 Sparsity get_sparsity_out(casadi_int i)
override;
245 std::vector<double> get_nominal_in(casadi_int i)
const override;
246 std::vector<double> get_nominal_out(casadi_int i)
const override;
250 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
253 int eval_all(FmuMemory* m, casadi_int n_task,
254 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
257 int eval_task(FmuMemory* m, casadi_int task, casadi_int n_task,
258 bool need_nondiff,
bool need_jac,
bool need_fwd,
bool need_adj,
bool need_hess)
const;
261 void remove_nans(
double *hess_nz, casadi_int* iw)
const;
264 void check_hessian(FmuMemory* m,
const double *hess_nz, casadi_int* iw)
const;
267 void make_symmetric(
double *hess_nz, casadi_int* iw)
const;
273 bool has_jac_sparsity(casadi_int oind, casadi_int iind)
const override;
274 Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind,
bool symmetric)
const override;
278 bool all_regular()
const;
281 bool all_vectors()
const;
284 Function factory(
const std::string& name,
285 const std::vector<std::string>& s_in,
286 const std::vector<std::string>& s_out,
288 const Dict& opts)
const override;
294 bool has_jacobian()
const override;
295 Function get_jacobian(
const std::string& name,
296 const std::vector<std::string>& inames,
297 const std::vector<std::string>& onames,
298 const Dict& opts)
const override;
305 bool has_forward(casadi_int nfwd)
const override;
306 Function get_forward(casadi_int nfwd,
const std::string& name,
307 const std::vector<std::string>& inames,
308 const std::vector<std::string>& onames,
309 const Dict& opts)
const override;
316 bool has_reverse(casadi_int nadj)
const override;
317 Function get_reverse(casadi_int nadj,
const std::string& name,
318 const std::vector<std::string>& inames,
319 const std::vector<std::string>& onames,
320 const Dict& opts)
const override;
326 void* alloc_mem()
const override;
331 int init_mem(
void* mem)
const override;
336 void free_mem(
void *mem)
const override;
339 Dict get_stats(
void* mem)
const override;
344 void serialize_body(SerializingStream &s)
const override;
349 static ProtoFunction* deserialize(DeserializingStream& s) {
return new FmuFunction(s); }
354 void change_option(
const std::string& option_name,
const GenericType& option_value)
override;
360 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.