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,
86 Variable(casadi_int index,
const std::string& name,
87 const std::vector<casadi_int>& dimension,
const MX& expr);
166 void get_attribute(
Attribute a,
double* val)
const;
167 void get_attribute(
Attribute a, std::vector<double>* val)
const;
168 void get_attribute(
Attribute a, std::string* val)
const;
173 void set_attribute(
Attribute a,
double val);
174 void set_attribute(
Attribute a,
const std::vector<double>& val);
175 void set_attribute(
Attribute a,
const std::string& val);
185 bool has_start()
const;
193 std::vector<Category> categories()
const;
200 return !(type==
Type::STRING ? stringvalue.empty() : std::isnan(value.front()));
207 bool needs_der()
const;
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;
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;
370 const MX& var(
const std::string& name)
const;
373 MX get_der(
size_t ind)
const {
return variable(ind).get_der(*
this);}
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;
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;
420 size_t n_mem()
const;
423 std::vector<double> start_all()
const;
435 return variable(indices(cat).at(ind));
452 const MX& var(
size_t ind)
const;
458 std::vector<MX> var(
const std::vector<size_t>& ind)
const;
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);
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_;
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);
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);
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());
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;
771 std::vector<size_t>
v, vdef;
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);
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)
bool clear_cache_
Should the cache be cleared?
std::string instantiation_token_
std::vector< std::pair< size_t, std::vector< size_t > > > when_
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)
casadi_int orig_time_index_
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< size_t > der_
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_
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)
Category input_category(Category cat)
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< Category > input_categories()
std::vector< casadi_int > find(const std::vector< T > &v)
find nonzeros
bool is_output_category(Category cat)
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::vector< Category > output_categories()
Initial
Initial: FMI 2.0 specification, section 2.2.7 or FMI 3.0 specification, section 2....
std::string to_string(TypeFmi2 v)
Category dependent_definition(Category cat)
bool all(const std::vector< bool > &v)
Check if all arguments are true.
bool remove(const std::string &path)
bool is_acyclic(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)