26 #ifndef CASADI_DAE_BUILDER_INTERNAL_HPP
27 #define CASADI_DAE_BUILDER_INTERNAL_HPP
29 #include <unordered_map>
31 #include "dae_builder.hpp"
32 #include "shared_object.hpp"
33 #include "casadi_enum.hpp"
34 #include "resource.hpp"
45 enum class Type {
FLOAT32,
FLOAT64,
INT8,
UINT8,
INT16,
UINT16,
INT32,
UINT32,
INT64,
UINT64,
63 enum class Category {
T,
C,
P,
D,
W,
U,
X,
Z,
Q,
CALCULATED,
NUMEL};
84 friend class DaeBuilderInternal;
88 Variable(casadi_int index,
const std::string& name,
89 const std::vector<casadi_int>& dimension,
const MX& expr);
191 return !(type==
Type::STRING ? stringvalue.empty() : std::isnan(value.front()));
201 MX get_der(DaeBuilderInternal&
self,
bool may_allocate =
true);
209 class CASADI_EXPORT DaeBuilderInternal :
public SharedObjectInternal {
211 friend class FmuInternal;
212 friend class FmuFunction;
218 explicit DaeBuilderInternal(
const std::string& name,
const std::string& path,
const Dict& opts);
221 ~DaeBuilderInternal()
override;
224 std::string class_name()
const override {
return "DaeBuilderInternal";}
227 void sanity_check()
const;
241 void lift(
bool lift_shared,
bool lift_calls);
244 void sort_z(
const std::vector<std::string>& z_order);
247 std::vector<size_t>& indices(
Category cat);
250 const std::vector<size_t>& indices(
Category cat)
const;
253 size_t size(
Category cat)
const {
return indices(cat).size();}
256 void reorder(
Category cat,
const std::vector<size_t>& v);
259 void reorder(
const std::string& n, std::vector<size_t>& ind,
260 const std::vector<size_t>& v)
const;
263 void prune(
bool prune_p,
bool prune_u);
266 void tearing_variables(std::vector<std::string>* res, std::vector<std::string>* iv,
267 std::vector<std::string>* iv_on_hold)
const;
277 void load_fmi_description(
const std::string& filename);
280 static std::string iso_8601_time();
283 static std::string generate_guid();
286 std::vector<std::string> export_fmu(
const Dict& opts)
const;
289 std::string generate_wrapper(
const std::string& guid,
const CodeGenerator& gen)
const;
292 std::string generate_build_description(
const std::vector<std::string>& cfiles)
const;
295 std::string generate_model_description(
const std::string& guid)
const;
298 XmlNode generate_model_variables()
const;
301 XmlNode generate_model_structure()
const;
304 void update_dependencies()
const;
308 static std::string generate(
const std::vector<size_t>& v);
309 static std::string generate(
const std::vector<double>& v);
313 std::vector<MX> input(
Category ind)
const;
319 std::vector<MX> input(
const std::vector<Category>& ind)
const;
322 std::vector<MX> output(
const std::vector<OutputCategory>& ind)
const;
325 void add_lc(
const std::string& name,
const std::vector<std::string>& f_out);
328 Function create(
const std::string& fname,
329 const std::vector<std::string>& name_in,
330 const std::vector<std::string>& name_out,
331 const Dict& opts,
bool sx,
bool lifted_calls)
const;
334 Function fmu_fun(
const std::string& fname,
335 const std::vector<std::string>& name_in,
336 const std::vector<std::string>& name_out,
337 const Dict& opts)
const;
340 Function dependent_fun(
const std::string& fname,
341 const std::vector<std::string>& s_in,
342 const std::vector<std::string>& s_out)
const;
345 Function transition(
const std::string& fname, casadi_int index,
346 bool dummy_index_input =
false)
const;
349 Function transition(
const std::string& fname)
const;
352 Function gather_eq()
const;
355 const MX& var(
const std::string& name)
const;
358 MX get_der(
size_t ind)
const {
return variable(ind).get_der(*
this);}
361 MX get_der(
size_t ind,
bool may_allocate =
true) {
362 return variable(ind).get_der(*
this, may_allocate);
366 MX der(
const MX& var)
const;
369 MX der(
const MX& var,
bool may_allocate =
true);
372 std::string unique_name(
const std::string& prefix,
bool allow_no_prefix =
true)
const;
375 std::string type_name()
const {
return "DaeBuilderInternal";}
378 void disp(std::ostream& stream,
bool more)
const override;
381 std::string get_str(
bool more=
false)
const {
382 std::stringstream ss;
388 Variable& new_variable(
const std::string& name,
389 const std::vector<casadi_int>& dimension = {1},
390 const MX& expr = MX());
393 bool has(
const std::string& name)
const;
396 std::vector<std::string> all()
const;
399 std::vector<std::string> all(
Category cat)
const;
402 size_t n_variables()
const {
return variables_.size();}
405 size_t n_mem()
const;
408 std::vector<double> start_all()
const;
412 Variable& variable(
size_t ind) {
return *variables_.at(ind);}
413 const Variable& variable(
size_t ind)
const {
return *variables_.at(ind);}
418 Variable& variable(
Category cat,
size_t ind) {
return variable(indices(cat).at(ind));}
419 const Variable& variable(
Category cat,
size_t ind)
const {
420 return variable(indices(cat).at(ind));
426 Variable& variable(
const std::string& name) {
return variable(find(name));}
427 const Variable& variable(
const std::string& name)
const {
return variable(find(name));}
432 Variable& variable(
const MX& v) {
return variable(find(v));}
433 const Variable& variable(
const MX& v)
const {
return variable(find(v));}
437 const MX& var(
size_t ind)
const;
440 const MX& var(
Category cat,
size_t ind)
const {
return var(indices(cat).at(ind));}
443 std::vector<MX> var(
const std::vector<size_t>& ind)
const;
446 std::vector<MX> var(
Category cat)
const {
return var(indices(cat));}
449 size_t find(
const std::string& name)
const;
452 size_t find(
const MX& v)
const;
455 std::vector<size_t> find(
const std::vector<std::string>& name)
const;
458 std::vector<size_t> find(
const std::vector<MX>& v)
const;
463 const std::string& name(
size_t ind)
const;
468 std::vector<std::string> name(
const std::vector<size_t>& ind)
const;
471 const Function& oracle(
bool sx =
false,
bool elim_w =
false,
bool lifted_calls =
false)
const;
474 Sparsity jac_sparsity(
const std::vector<size_t>& oind,
const std::vector<size_t>& iind)
const;
477 Sparsity hess_sparsity(
const std::vector<size_t>& oind,
const std::vector<size_t>& iind)
const;
483 static std::string qualified_name(
const XmlNode& nn,
Attribute* att = 0);
491 std::string fmi_version_;
492 std::string model_name_;
493 std::string instantiation_token_;
494 std::string description_;
496 std::string copyright_;
497 std::string license_;
498 std::string generation_tool_;
499 std::string generation_date_and_time_;
500 std::string variable_naming_convention_;
501 casadi_int number_of_event_indicators_;
504 double start_time_, stop_time_, tolerance_, step_size_;
507 std::string model_identifier_;
508 bool provides_directional_derivatives_;
509 bool provides_adjoint_derivatives_;
510 bool can_be_instantiated_only_once_per_process_;
511 std::vector<std::string> source_files_;
526 casadi_int fmi_major_;
529 std::vector<Variable*> variables_;
532 std::vector<size_t> outputs_, derivatives_, initial_unknowns_, event_indicators_, residuals_;
535 std::unordered_map<std::string, size_t> varind_;
538 std::unordered_map<unsigned int, size_t> vrmap_;
541 std::vector<std::vector<size_t>> indices_;
544 std::vector<size_t> init_;
547 std::vector<std::pair<size_t, std::vector<size_t>>> when_;
555 const MX& time()
const;
560 std::vector<MX> cdef()
const;
565 std::vector<MX> quad()
const;
570 std::vector<MX> init_lhs()
const;
575 std::vector<MX> init_rhs()
const;
589 const MX& expr,
const Dict& opts);
592 Variable& add(
const std::string& name,
Causality causality,
const Dict& opts);
595 Variable& add(
const std::string& name,
const Dict& opts) {
601 void categorize(
size_t ind,
Category cat);
604 void insert(std::vector<size_t>& v,
size_t ind)
const;
607 void remove(std::vector<size_t>& v,
size_t ind)
const;
613 void set_causality(
size_t ind,
Causality causality);
619 void set_variability(
size_t ind,
Variability variability);
622 Category category(
size_t ind)
const;
625 void set_category(
size_t ind,
Category cat);
628 void eq(
const MX& lhs,
const MX& rhs,
const Dict& opts);
631 void when(
const MX& cond,
const std::vector<std::string>& eqs,
const Dict& opts);
634 Variable& assign(
const std::string& name,
const MX& val);
637 Variable& reinit(
const std::string& name,
const MX& val);
640 void set_init(
const std::string& name,
const MX& init_rhs);
648 std::vector<Function> fun_;
653 mutable Function oracle_[2][2][2];
656 mutable bool clear_cache_;
659 MX read_expr(
const XmlNode& node);
662 MX read_identifier(
const XmlNode& node);
665 Variable& read_variable(
const XmlNode& node,
Attribute* att = 0);
668 void import_default_experiment(
const XmlNode& n);
671 std::vector<casadi_int> read_dependencies(
const XmlNode& n);
674 std::vector<DependenciesKind> read_dependencies_kind(
const XmlNode& n,
size_t ndep);
677 void import_model_exchange(
const XmlNode& n);
680 void import_model_variables(
const XmlNode& modvars);
683 void import_model_structure(
const XmlNode& n);
686 void import_binding_equations(
const XmlNode& eqs);
689 void import_dynamic_equations(
const XmlNode& eqs);
692 void import_initial_equations(
const XmlNode& eqs);
695 void clear_cache()
const;
698 Function add_fun(
const std::string& name,
699 const std::vector<std::string>& arg,
700 const std::vector<std::string>& res,
const Dict& opts=
Dict());
703 Function add_fun(
const Function& f);
706 bool has_fun(
const std::string& name)
const;
709 Function fun(
const std::string& name)
const;
716 double attribute(
Attribute a,
const std::string& name)
const;
717 std::vector<double> attribute(
Attribute a,
const std::vector<std::string>& name)
const;
722 void set_attribute(
Attribute a,
const std::string& name,
double val);
723 void set_attribute(
Attribute a,
const std::vector<std::string>& name,
724 const std::vector<double>& val);
729 std::string string_attribute(
Attribute a,
const std::string& name)
const;
730 std::vector<std::string> string_attribute(
Attribute a,
731 const std::vector<std::string>& name)
const;
736 void set_string_attribute(
Attribute a,
const std::string& name,
const std::string& val);
737 void set_string_attribute(
Attribute a,
const std::vector<std::string>& name,
738 const std::vector<std::string>& val);
742 casadi_int size(
Attribute a,
const std::vector<std::string>& name)
const;
747 Function f, adj1_f, J, H;
749 std::vector<size_t> v, vdef;
755 std::vector<MX> jac_res;
757 std::vector<MX> adj1_arg;
759 std::vector<MX> adj1_res;
761 std::vector<MX> hess_res;
769 const MX& jac(casadi_int oind, casadi_int iind)
const;
771 const MX& hess(casadi_int iind1, casadi_int iind2)
const;
775 MX jac_vdef_v_from_calls(std::map<MXNode*, CallIO>& call_nodes,
776 const std::vector<casadi_int>& h_offsets)
const;
779 MX hess_v_v_from_calls(std::map<MXNode*, CallIO>& call_nodes,
780 const std::vector<casadi_int>& h_offsets)
const;
783 static void sort_dependent(std::vector<MX>& v, std::vector<MX>& vdef);
794 CASADI_EXPORT std::string to_string(
TypeFmi2 v);
795 CASADI_EXPORT std::string to_string(
Type v);
796 CASADI_EXPORT std::string to_string(
Causality v);
797 CASADI_EXPORT std::string to_string(
Variability v);
798 CASADI_EXPORT std::string to_string(
Initial v);
799 CASADI_EXPORT std::string to_string(
Attribute v);
801 CASADI_EXPORT std::string to_string(
Category v);
807 CASADI_EXPORT std::string description(
Category v);
811 CASADI_EXPORT
bool is_input_category(
Category cat);
814 CASADI_EXPORT
bool is_acyclic(
Category cat);
820 CASADI_EXPORT std::vector<Category> input_categories();
823 CASADI_EXPORT std::vector<OutputCategory> output_categories();
A symbolic representation of a differential-algebraic equations model.
std::map< std::string, std::vector< std::string > > AuxOut
Variability
Variability: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
Initial
Initial: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
Causality
Causality: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
Type
Variable type (FMI 3)
TypeFmi2
Variable type (FMI 2)
Holds expressions and meta-data corresponding to a physical quantity evolving in time.
Category category
CasADi's classification of the variable.
bool dependency
Do other expressions depend on this variable.
void set_attribute(Attribute a, const std::vector< double > &val)
void set_attribute(Attribute a, double val)
std::vector< double > value
Numerical value (also for booleans, integers, enums)
MX get_der(DaeBuilderInternal &self, bool may_allocate=true)
void set_attribute(Attribute a, const std::string &val)
casadi_int size(Attribute a) const
Total number of elements for a particular attribute.
void get_attribute(Attribute a, std::string *val) const
void get_attribute(Attribute a, double *val) const
std::vector< double > start
casadi_int index
Location in variable vector.
MX get_der(const DaeBuilderInternal &self) const
std::string stringvalue
String value (if string-valued)
casadi_int numel
Number of elements - product of all dimensions.
std::string name
Name of the variable.
unsigned int value_reference
void get_attribute(Attribute a, std::vector< double > *val) const
MX v
Variable expression (always a vector)
XmlNode export_xml(const DaeBuilderInternal &self) const
std::vector< casadi_int > dependencies
Dependencies.
std::vector< DependenciesKind > dependenciesKind
Dependencies.
std::vector< casadi_int > dimension
Dimensions.
MX ieq
Initial equation (to be removed and moved to a separate dependent variable)