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,
82 friend class DaeBuilderInternal;
86 Variable(casadi_int index,
const std::string& name,
87 const std::vector<casadi_int>& dimension,
const MX& expr);
200 return !(type==
Type::STRING ? stringvalue.empty() : std::isnan(value.front()));
210 MX get_der(DaeBuilderInternal&
self,
bool may_allocate =
true);
218 class CASADI_EXPORT DaeBuilderInternal :
public SharedObjectInternal {
220 friend class FmuInternal;
221 friend class FmuFunction;
227 explicit DaeBuilderInternal(
const std::string& name,
const std::string& path,
const Dict& opts);
230 ~DaeBuilderInternal()
override;
233 std::string class_name()
const override {
return "DaeBuilderInternal";}
236 void sanity_check()
const;
250 void lift(
bool lift_shared,
bool lift_calls);
253 void sort_z(
const std::vector<std::string>& z_order);
256 std::vector<size_t>& indices(
Category cat);
259 const std::vector<size_t>& indices(
Category cat)
const;
262 size_t size(
Category cat)
const {
return indices(cat).size();}
265 void reorder(
Category cat,
const std::vector<size_t>& v);
268 void reorder(
const std::string& n, std::vector<size_t>& ind,
269 const std::vector<size_t>& v)
const;
272 void prune(
bool prune_p,
bool prune_u);
275 void tearing_variables(std::vector<std::string>* res, std::vector<std::string>* iv,
276 std::vector<std::string>* iv_on_hold)
const;
286 void load_fmi_description(
const std::string& filename);
289 static std::string iso_8601_time();
292 static std::string generate_guid();
295 Dict export_fmu(
const Dict& opts)
const;
298 Dict compile_fmu(
const Dict& files,
const Dict& opts)
const;
301 std::string pack_fmu(
const Dict& files,
const Dict& opts)
const;
304 std::string generate_wrapper(
const std::string& guid,
const CodeGenerator& gen)
const;
307 std::string generate_build_description(
const std::vector<std::string>& cfiles)
const;
310 std::string generate_model_description(
const std::string& guid)
const;
313 XmlNode generate_model_variables()
const;
316 XmlNode generate_model_structure(
bool dae =
false)
const;
319 void update_dependencies()
const;
323 static std::string generate(
const std::vector<size_t>& v);
324 static std::string generate(
const std::vector<double>& v);
328 std::vector<MX> inputs(
Category ind)
const;
331 std::vector<MX> outputs(
Category ind)
const;
334 std::vector<MX> inputs(
const std::vector<Category>& ind)
const;
337 std::vector<MX> outputs(
const std::vector<Category>& ind)
const;
340 void add_lc(
const std::string& name,
const std::vector<std::string>& f_out);
343 Function create(
const std::string& fname,
344 const std::vector<std::string>& name_in,
345 const std::vector<std::string>& name_out,
346 const Dict& opts,
bool sx,
bool lifted_calls)
const;
349 Function fmu_fun(
const std::string& fname,
350 const std::vector<std::string>& name_in,
351 const std::vector<std::string>& name_out,
352 const Dict& opts)
const;
355 Function dependent_fun(
const std::string& fname,
356 const std::vector<std::string>& s_in,
357 const std::vector<std::string>& s_out)
const;
360 Function transition(
const std::string& fname, casadi_int index,
361 bool dummy_index_input =
false)
const;
364 Function transition(
const std::string& fname)
const;
367 Function gather_eq()
const;
370 const MX& var(
const std::string& name)
const;
373 MX get_der(
size_t ind)
const {
return variable(ind).get_der(*
this);}
376 MX get_der(
size_t ind,
bool may_allocate =
true) {
377 return variable(ind).get_der(*
this, may_allocate);
381 MX der(
const MX& var)
const;
384 MX der(
const MX& var,
bool may_allocate =
true);
387 std::string unique_name(
const std::string& prefix,
bool allow_no_prefix =
false)
const;
390 std::string type_name()
const {
return "DaeBuilderInternal";}
393 void disp(std::ostream& stream,
bool more)
const override;
396 std::string get_str(
bool more=
false)
const {
397 std::stringstream ss;
403 Variable& new_variable(
const std::string& name,
404 const std::vector<casadi_int>& dimension = {1},
405 const MX& expr = MX());
408 bool has(
const std::string& name)
const;
411 std::vector<std::string> all()
const;
414 std::vector<std::string> all(
Category cat)
const;
417 size_t n_variables()
const {
return variables_.size();}
420 size_t n_mem()
const;
423 std::vector<double> start_all()
const;
427 Variable& variable(
size_t ind) {
return *variables_.at(ind);}
428 const Variable& variable(
size_t ind)
const {
return *variables_.at(ind);}
433 Variable& variable(
Category cat,
size_t ind) {
return variable(indices(cat).at(ind));}
434 const Variable& variable(
Category cat,
size_t ind)
const {
435 return variable(indices(cat).at(ind));
441 Variable& variable(
const std::string& name) {
return variable(find(name));}
442 const Variable& variable(
const std::string& name)
const {
return variable(find(name));}
447 Variable& variable(
const MX& v) {
return variable(find(v));}
448 const Variable& variable(
const MX& v)
const {
return variable(find(v));}
452 const MX& var(
size_t ind)
const;
455 const MX& var(
Category cat,
size_t ind)
const {
return var(indices(cat).at(ind));}
458 std::vector<MX> var(
const std::vector<size_t>& ind)
const;
461 std::vector<MX> var(
Category cat)
const {
return var(indices(cat));}
464 size_t find(
const std::string& name)
const;
467 size_t find(
const MX& v)
const;
470 std::vector<size_t> find(
const std::vector<std::string>& name)
const;
473 std::vector<size_t> find(
const std::vector<MX>& v)
const;
478 const std::string& name(
size_t ind)
const;
483 std::vector<std::string> name(
const std::vector<size_t>& ind)
const;
486 const Function& oracle(
bool sx =
false,
bool elim_w =
false,
bool lifted_calls =
false)
const;
489 Sparsity jac_sparsity(
const std::vector<size_t>& oind,
const std::vector<size_t>& iind)
const;
492 Sparsity hess_sparsity(
const std::vector<size_t>& oind,
const std::vector<size_t>& iind)
const;
498 static std::string qualified_name(
const XmlNode& nn,
Attribute* att =
nullptr);
504 bool enable_ls_dae_, enable_ls_serialization_;
507 std::string fmi_version_;
508 std::string model_name_;
509 std::string instantiation_token_;
510 std::string description_;
512 std::string copyright_;
513 std::string license_;
514 std::string generation_tool_;
515 std::string generation_date_and_time_;
516 std::string variable_naming_convention_;
520 double start_time_, stop_time_, tolerance_, step_size_;
523 std::string model_identifier_;
524 bool provides_directional_derivatives_;
525 bool provides_adjoint_derivatives_;
526 bool can_be_instantiated_only_once_per_process_;
527 std::vector<std::string> source_files_;
539 casadi_int orig_time_index_;
545 casadi_int fmi_major_;
548 std::vector<Variable*> variables_;
551 std::vector<size_t> der_, initial_unknowns_;
554 std::unordered_map<std::string, size_t> varind_;
557 std::unordered_map<unsigned int, size_t> vrmap_;
560 std::vector<std::vector<size_t>> indices_;
563 std::vector<size_t> init_;
566 std::vector<std::pair<size_t, std::vector<size_t>>> when_;
569 casadi_int convert_index(casadi_int index)
const;
577 const MX& time()
const;
582 std::vector<MX> cdef()
const;
587 std::vector<MX> init_lhs()
const;
592 std::vector<MX> init_rhs()
const;
606 const MX& expr,
const Dict& opts);
609 Variable& add(
const std::string& name,
Causality causality,
const Dict& opts);
612 Variable& add(
const std::string& name,
const Dict& opts) {
618 void categorize(
size_t ind,
Category cat);
621 void insert(std::vector<size_t>& v,
size_t ind)
const;
624 void remove(std::vector<size_t>& v,
size_t ind)
const;
630 void set_causality(
size_t ind,
Causality causality);
636 void set_variability(
size_t ind,
Variability variability);
639 Category category(
size_t ind)
const;
642 void set_category(
size_t ind,
Category cat);
645 void eq(
const MX& lhs,
const MX& rhs,
const Dict& opts);
648 void when(
const MX& cond,
const std::vector<std::string>& eqs,
const Dict& opts);
651 Variable& assign(
const std::string& name,
const MX& val);
654 Variable& reinit(
const std::string& name,
const MX& val);
657 void set_init(
const std::string& name,
const MX& init_rhs);
665 std::vector<Function> fun_;
670 mutable Function oracle_[2][2][2];
673 mutable bool clear_cache_;
676 MX read_expr(
const XmlNode& node);
679 MX read_identifier(
const XmlNode& node);
682 Variable& read_variable(
const XmlNode& node,
Attribute* att =
nullptr);
685 void import_default_experiment(
const XmlNode& n);
688 std::vector<casadi_int> read_dependencies(
const XmlNode& n);
691 std::vector<DependenciesKind> read_dependencies_kind(
const XmlNode& n,
size_t ndep);
694 void import_model_exchange(
const XmlNode& n);
699 void import_model_variables(
const XmlNode& modvars);
702 void import_model_structure(
const XmlNode& n);
705 XmlNode import_ls_dae(
const std::string& lsdae);
708 void import_binding_equations(
const XmlNode& eqs);
711 void import_dynamic_equations(
const XmlNode& eqs);
714 void import_initial_equations(
const XmlNode& eqs);
717 void clear_cache()
const;
720 Function add_fun(
const std::string& name,
721 const std::vector<std::string>& arg,
722 const std::vector<std::string>& res,
const Dict& opts=
Dict());
725 Function add_fun(
const Function& f);
728 bool has_fun(
const std::string& name)
const;
731 Function fun(
const std::string& name)
const;
738 double attribute(
Attribute a,
const std::string& name)
const;
739 std::vector<double> attribute(
Attribute a,
const std::vector<std::string>& name)
const;
744 void set_attribute(
Attribute a,
const std::string& name,
double val);
745 void set_attribute(
Attribute a,
const std::vector<std::string>& name,
746 const std::vector<double>& val);
751 std::string string_attribute(
Attribute a,
const std::string& name)
const;
752 std::vector<std::string> string_attribute(
Attribute a,
753 const std::vector<std::string>& name)
const;
758 void set_string_attribute(
Attribute a,
const std::string& name,
const std::string& val);
759 void set_string_attribute(
Attribute a,
const std::vector<std::string>& name,
760 const std::vector<std::string>& val);
764 casadi_int size(
Attribute a,
const std::vector<std::string>& name)
const;
769 Function f, adj1_f, J, H;
771 std::vector<size_t> v, vdef;
777 std::vector<MX> jac_res;
779 std::vector<MX> adj1_arg;
781 std::vector<MX> adj1_res;
783 std::vector<MX> hess_res;
791 const MX& jac(casadi_int oind, casadi_int iind)
const;
793 const MX& hess(casadi_int iind1, casadi_int iind2)
const;
797 MX jac_vdef_v_from_calls(std::map<MXNode*, CallIO>& call_nodes,
798 const std::vector<casadi_int>& h_offsets)
const;
801 MX hess_v_v_from_calls(std::map<MXNode*, CallIO>& call_nodes,
802 const std::vector<casadi_int>& h_offsets)
const;
805 static void sort_dependent(std::vector<MX>& v, std::vector<MX>& vdef);
816 CASADI_EXPORT std::string to_string(
TypeFmi2 v);
817 CASADI_EXPORT std::string to_string(
Type v);
818 CASADI_EXPORT std::string to_string(
Causality v);
819 CASADI_EXPORT std::string to_string(
Variability v);
820 CASADI_EXPORT std::string to_string(
Initial v);
821 CASADI_EXPORT std::string to_string(
Attribute v);
823 CASADI_EXPORT std::string to_string(
Category v);
828 CASADI_EXPORT std::string description(
Category v);
832 CASADI_EXPORT
bool is_input_category(
Category cat);
835 CASADI_EXPORT
bool is_output_category(
Category cat);
838 CASADI_EXPORT
bool is_acyclic(
Category cat);
844 CASADI_EXPORT std::vector<Category> input_categories();
847 CASADI_EXPORT std::vector<Category> 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.
bool permitted(Category cat) const
std::vector< Category > categories() const
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)