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};
88 Variable(casadi_int index,
const std::string& name,
89 const std::vector<casadi_int>& dimension,
const MX& expr);
168 void get_attribute(
Attribute a,
double* val)
const;
169 void get_attribute(
Attribute a, std::vector<double>* val)
const;
170 void get_attribute(
Attribute a, std::string* val)
const;
175 void set_attribute(
Attribute a,
double val);
176 void set_attribute(
Attribute a,
const std::vector<double>& val);
177 void set_attribute(
Attribute a,
const std::string& val);
187 bool has_start()
const;
191 return !(type==
Type::STRING ? stringvalue.empty() : std::isnan(value.front()));
198 bool needs_der()
const;
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;
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;
355 const MX& var(
const std::string& name)
const;
358 MX get_der(
size_t ind)
const {
return variable(ind).get_der(*
this);}
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;
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;
405 size_t n_mem()
const;
408 std::vector<double> start_all()
const;
420 return variable(indices(cat).at(ind));
437 const MX& var(
size_t ind)
const;
443 std::vector<MX> var(
const std::vector<size_t>& ind)
const;
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;
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_;
547 std::vector<std::pair<size_t, std::vector<size_t>>>
when_;
555 const MX& time()
const;
560 std::vector<MX> cdef()
const;
570 std::vector<MX> init_lhs()
const;
575 std::vector<MX> init_rhs()
const;
589 const MX& expr,
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);
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());
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;
749 std::vector<size_t>
v, vdef;
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);
Helper class for C code generation.
size_t n_variables() const
Length of variables array.
bool provides_directional_derivatives_
std::string generation_date_and_time_
const MX & var(Category cat, size_t ind) const
Get variable expression by category and index.
Variable & variable(const std::string &name)
std::vector< size_t > derivatives_
bool clear_cache_
Should the cache be cleared?
std::string instantiation_token_
std::vector< std::pair< size_t, std::vector< size_t > > > when_
std::vector< MX > quad() const
Quadrature right hand sides.
std::string class_name() const override
Readable name of the internal class.
MX get_der(size_t ind) const
Get a derivative expression by variable index (const, never create)
const Variable & variable(const MX &v) const
std::string get_str(bool more=false) const
Get string representation.
std::string generation_tool_
std::vector< Function > fun_
Functions.
const Variable & variable(size_t ind) const
std::unordered_map< std::string, size_t > varind_
Find of variable by name.
Variable & variable(const MX &v)
const Variable & variable(const std::string &name) const
std::string model_identifier_
std::vector< std::vector< size_t > > indices_
Ordered variables.
std::unordered_map< unsigned int, size_t > vrmap_
Find of variable by value reference.
Function::AuxOut lc_
Linear combinations of output expressions.
Variable & variable(size_t ind)
std::string type_name() const
Readable name of the class.
Variable & variable(Category cat, size_t ind)
std::vector< Variable * > variables_
All variables.
bool can_be_instantiated_only_once_per_process_
std::vector< MX > var(Category cat) const
Get variable expressions by category.
std::string name_
Name of instance.
bool provides_adjoint_derivatives_
const Variable & variable(Category cat, size_t ind) const
std::vector< std::string > source_files_
MX get_der(size_t ind, bool may_allocate=true)
Get a derivative expression by variable index (non-const, may create)
Variable & add(const std::string &name, const Dict &opts)
Add a new variable, default variability and causality.
std::vector< size_t > init_
size_t size(Category cat) const
Number of indices with a particular category.
std::string variable_naming_convention_
casadi_int number_of_event_indicators_
A symbolic representation of a differential-algebraic equations model.
std::map< std::string, std::vector< std::string > > AuxOut
RAII class for reading from a zip file.
Variability
Variability: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
std::string description(Category v)
bool is_input_category(Category cat)
Type from_fmi2(TypeFmi2 v)
void sort(const std::vector< T > &values, std::vector< T > &sorted_values, std::vector< casadi_int > &indices, bool invert_indices=false)
Sort the data in a vector.
std::vector< OutputCategory > output_categories()
std::vector< Category > input_categories()
std::vector< casadi_int > find(const std::vector< T > &v)
find nonzeros
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....
std::string to_string(TypeFmi2 v)
bool all(const std::vector< bool > &v)
Check if all arguments are true.
Category input_category(OutputCategory cat)
bool remove(const std::string &path)
bool is_acyclic(Category cat)
OutputCategory dependent_definition(Category cat)
Causality
Causality: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
Type
Variable type (FMI 3)
std::vector< casadi_int > path(const std::vector< casadi_int > &map, casadi_int i_start)
std::string filename(const std::string &path)
TypeFmi2
Variable type (FMI 2)
Helper class, represents inputs and outputs for a function call node.
std::vector< MX > adj1_arg
std::vector< MX > hess_res
std::vector< MX > jac_res
std::vector< MX > adj1_res
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.
std::vector< double > value
Numerical value (also for booleans, integers, enums)
std::vector< double > start
casadi_int index
Location in variable vector.
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
MX v
Variable expression (always a vector)
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)