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.