dae_builder.hpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 
26 #ifndef CASADI_DAE_BUILDER_HPP
27 #define CASADI_DAE_BUILDER_HPP
28 
29 #include "function.hpp"
30 
31 namespace casadi {
32 
33 // Forward declarations
34 class DaeBuilderInternal;
35 
68 class CASADI_EXPORT DaeBuilder
69  : public SharedObject,
70  public SWIG_IF_ELSE(PrintableCommon, Printable<DaeBuilder>) {
71  public:
72 
74  std::string type_name() const {return "DaeBuilder";}
75 
77  DaeBuilder();
78 
80  explicit DaeBuilder(const std::string& name, const std::string& path = "",
81  const Dict& opts = Dict());
82 
86  const std::string& name() const;
87 
90 
93  const MX& time() const;
94 
98  std::vector<std::string> t_new() const {return all("t");}
99 
103  std::vector<std::string> x() const {return all("x");}
104 
106  std::vector<std::string> y() const;
107 
111  std::vector<MX> ode() const;
112 
116  std::vector<std::string> z() const {return all("z");}
117 
121  std::vector<MX> alg() const;
122 
126  std::vector<std::string> q() const {return all("q");}
127 
131  std::vector<MX> quad() const;
132 
136  std::vector<MX> zero() const;
137 
141  std::vector<MX> ydef() const;
142 
146  void set_y(const std::vector<std::string>& name);
147 
151  std::vector<std::string> rate() const;
152 
156  void set_rate(const std::vector<std::string>& name);
157 
161  std::vector<std::string> u() const {return all("u");}
162 
166  std::vector<std::string> p() const {return all("p");}
167 
171  std::vector<std::string> c() const {return all("c");}
172 
176  std::vector<MX> cdef() const;
177 
181  std::vector<std::string> d() const {return all("d");}
182 
188  std::vector<MX> ddef() const;
189 
193  std::vector<std::string> w() const {return all("w");}
194 
200  std::vector<MX> wdef() const;
201 
205  std::vector<MX> init_lhs() const;
206 
210  std::vector<MX> init_rhs() const;
211 
215  std::vector<std::string> outputs() const;
216 
220  std::vector<std::string> derivatives() const;
221 
225  std::vector<std::string> initial_unknowns() const;
226 
229 
233  bool has_t() const;
234 
238  bool has_rate() const;
239 
243  casadi_int nx() const;
244 
248  casadi_int nz() const;
249 
253  casadi_int nq() const;
254 
258  casadi_int nzero() const;
259 
263  casadi_int ny() const;
264 
268  casadi_int nu() const;
269 
273  casadi_int np() const;
274 
278  casadi_int nc() const;
279 
283  casadi_int nd() const;
284 
288  casadi_int nw() const;
290 
295 
297  MX add(const std::string& name,
298  const std::string& causality,
299  const std::string& variability,
300  const Dict& opts=Dict());
301 
303  MX add(const std::string& name,
304  const std::string& causality,
305  const Dict& opts=Dict());
306 
308  MX add(const std::string& name,
309  const Dict& opts=Dict());
310 
312  void add(const std::string& name,
313  const std::string& causality,
314  const std::string& variability,
315  const MX& expr,
316  const Dict& opts=Dict());
317 
318 #ifdef WITH_DEPRECATED_FEATURES
320  const MX& t() const { return time();}
321 
323  MX add_t(const std::string& name="t");
324 
326  MX add_p(const std::string& name=std::string());
327 
329  MX add_u(const std::string& name=std::string());
330 
332  MX add_x(const std::string& name=std::string());
333 
335  MX add_z(const std::string& name=std::string());
336 
338  MX add_q(const std::string& name=std::string());
339 
341  MX add_c(const std::string& name, const MX& new_cdef);
342 
344  MX add_d(const std::string& name, const MX& new_ddef);
345 
347  MX add_w(const std::string& name, const MX& new_wdef);
348 
350  MX add_y(const std::string& name, const MX& new_ydef);
351 
353  void set_beq(const std::string& name, const MX& val);
354 
355  #endif // WITH_DEPRECATED_FEATURES
356 
358  void eq(const MX& lhs, const MX& rhs, const Dict& opts=Dict());
359 
361  void when(const MX& cond, const std::vector<std::string>& eqs, const Dict& opts=Dict());
362 
364  std::string assign(const std::string& name, const MX& val);
365 
367  std::string reinit(const std::string& name, const MX& val);
368 
370  void set_init(const std::string& name, const MX& init_rhs);
371 
372 #ifdef WITH_DEPRECATED_FEATURES
374  void set_ode(const std::string& name, const MX& ode_rhs) {
375  eq(var(name), ode_rhs);
376  }
377 
379  void set_alg(const std::string& name, const MX& alg_rhs) {
380  (void)name;
381  eq(0, alg_rhs);
382  }
383 
385  void add_init(const MX& lhs, const MX& rhs) {
386  set_init(lhs.name(), rhs);
387  }
388 
390  casadi_int ne() const {return nzero();}
391 
393  std::vector<std::string> e() const {return all("zero");}
394 
395  #endif // WITH_DEPRECATED_FEATURES
396 
398  void sanity_check() const;
400 
402  void reorder(const std::string& cat, const std::vector<std::string>& v);
403 
404 #ifdef WITH_DEPRECATED_FEATURES
406  void clear_all(const std::string& v);
407 
409  void set_all(const std::string& v, const std::vector<std::string>& name);
410 
413  void register_t(const std::string& name);
414  void register_p(const std::string& name);
415  void register_u(const std::string& name);
416  void register_x(const std::string& name);
417  void register_z(const std::string& name);
418  void register_q(const std::string& name);
419  void register_c(const std::string& name);
420  void register_d(const std::string& name);
421  void register_w(const std::string& name);
422  void register_y(const std::string& name);
423  void register_e(const std::string& name);
425 
427  void eliminate_d();
428 
430  void eliminate_w();
431 
433  void eliminate_quad();
434 
436  void sort_d();
437 
439  void sort_w();
440 
442  void sort_z(const std::vector<std::string>& z_order);
443 
444  #endif // WITH_DEPRECATED_FEATURES
445 
450 
451 
453  void eliminate(const std::string& cat);
454 
456  void sort(const std::string& cat);
457 
459  void lift(bool lift_shared = true, bool lift_calls = true);
460 
462  void prune(bool prune_p = true, bool prune_u = true);
463 
465  void tear();
467 
472 
474  Function add_fun(const std::string& name,
475  const std::vector<std::string>& arg,
476  const std::vector<std::string>& res, const Dict& opts=Dict());
477 
479  Function add_fun(const Function& f);
480 
482  Function add_fun(const std::string& name, const Importer& compiler,
483  const Dict& opts=Dict());
484 
486  bool has_fun(const std::string& name) const;
487 
489  Function fun(const std::string& name) const;
490 
492  std::vector<Function> fun() const;
493 
495  void gather_fun(casadi_int max_depth = -1);
497 
502  void parse_fmi(const std::string& filename) {load_fmi_description(filename); }
503 
505  bool provides_directional_derivatives() const;
506 
508  bool provides_directional_derivative() const {return provides_directional_derivatives();}
509 
511  void load_fmi_description(const std::string& filename);
512 
514  std::vector<std::string> export_fmu(const Dict& opts=Dict());
515 
517  void add_lc(const std::string& name, const std::vector<std::string>& f_out);
518 
520  Function create(const std::string& fname,
521  const std::vector<std::string>& name_in,
522  const std::vector<std::string>& name_out, bool sx, bool lifted_calls = false) const;
523 
532  Function create(const std::string& name,
533  const std::vector<std::string>& name_in,
534  const std::vector<std::string>& name_out,
535  const Dict& opts=Dict()) const;
537 
544  Function create(const std::string& fname, const Dict& opts=Dict()) const;
545 
549  Function create() const {return create(name() + "_dae");}
550 
552  Function dependent_fun(const std::string& fname,
553  const std::vector<std::string>& s_in,
554  const std::vector<std::string>& s_out) const;
555 
557  Function transition(const std::string& fname, casadi_int index) const;
558 
560  Function transition(const std::string& fname) const;
561 
563  Function transition() const {return transition(name() + "_transition");}
564 
567  MX var(const std::string& name) const;
568  MX operator()(const std::string& name) const {return var(name);}
570 
572  std::vector<std::string> der(const std::vector<std::string>& name) const;
573 
576  MX der(const MX& v) const;
577  MX der(const MX& v);
579 
581  std::vector<std::string> pre(const std::vector<std::string>& name) const;
582 
584  MX pre(const MX& v) const;
585 
587  bool has_beq(const std::string& name) const;
588 
590  MX beq(const std::string& name) const;
591 
594  casadi_int value_reference(const std::string& name) const;
595  void set_value_reference(const std::string& name, casadi_int val);
597 
600  std::string description(const std::string& name) const;
601  void set_description(const std::string& name, const std::string& val);
603 
606  std::string type(const std::string& name, casadi_int fmi_version = 3) const;
607  void set_type(const std::string& name, const std::string& val);
609 
611  std::string causality(const std::string& name) const;
612 
626  void set_causality(const std::string& name, const std::string& val);
627 
629  std::string variability(const std::string& name) const;
630 
641  void set_variability(const std::string& name, const std::string& val);
642 
644  std::string category(const std::string& name) const;
645 
656  void set_category(const std::string& name, const std::string& val);
657 
660  std::string initial(const std::string& name) const;
661  void set_initial(const std::string& name, const std::string& val);
663 
666  std::string unit(const std::string& name) const;
667  void set_unit(const std::string& name, const std::string& val);
669 
672  std::string display_unit(const std::string& name) const;
673  void set_display_unit(const std::string& name, const std::string& val);
675 
677  casadi_int numel(const std::string& name) const;
678 
680  std::vector<casadi_int> dimension(const std::string& name) const;
681 
683  double start_time() const;
684 
686  void set_start_time(double val);
687 
689  double stop_time() const;
690 
692  void set_stop_time(double val);
693 
695  double tolerance() const;
696 
698  void set_tolerance(double val);
699 
701  double step_size() const;
702 
704  void set_step_size(double val);
705 
706  // The following routines are not needed in MATLAB and would cause ambiguity
707  // Note that a multirow strings can be interpreted as a vector of strings
708 #if !(defined(SWIG) && defined(SWIGMATLAB))
710  std::string der(const std::string& name) const;
711 
713  std::string pre(const std::string& name) const;
714 
716  double attribute(const std::string& a, const std::string& name) const;
717 
719  void set_attribute(const std::string& a, const std::string& name, double val);
720 
722  double min(const std::string& name) const;
723 
725  void set_min(const std::string& name, double val);
726 
728  double max(const std::string& name) const;
729 
731  void set_max(const std::string& name, double val);
732 
734  double nominal(const std::string& name) const;
735 
737  void set_nominal(const std::string& name, double val);
738 
740  std::vector<double> start(const std::string& name) const;
741 
743  void set_start(const std::string& name, double val);
744 
746  void set_start(const std::string& name, const std::vector<double>& val);
747 
748  // Clear all set values
749  void reset();
750 
751  // Set the current value, single value
752  void set(const std::string& name, double val);
753 
754  // Set the current value, single value (string)
755  void set(const std::string& name, const std::string& val);
756 
758  GenericType get(const std::string& name) const;
759 
760 #endif // !SWIGMATLAB
761 
763  std::vector<double> attribute(const std::string& a, const std::vector<std::string>& name) const;
764 
766  void set_attribute(const std::string& a, const std::vector<std::string>& name,
767  const std::vector<double>& val);
768 
770  std::vector<double> min(const std::vector<std::string>& name) const;
771 
773  void set_min(const std::vector<std::string>& name, const std::vector<double>& val);
774 
776  std::vector<double> max(const std::vector<std::string>& name) const;
777 
779  void set_max(const std::vector<std::string>& name, const std::vector<double>& val);
780 
782  std::vector<double> nominal(const std::vector<std::string>& name) const;
783 
785  void set_nominal(const std::vector<std::string>& name, const std::vector<double>& val);
786 
788  std::vector<double> start(const std::vector<std::string>& name) const;
789 
791  void set_start(const std::vector<std::string>& name, const std::vector<double>& val);
792 
794  void set(const std::vector<std::string>& name, const std::vector<double>& val);
795 
797  void set(const std::vector<std::string>& name, const std::vector<std::string>& val);
798 
800  std::vector<GenericType> get(const std::vector<std::string>& name) const;
801 
803  bool has(const std::string& name) const;
804 
806  std::vector<std::string> all() const;
807 
809  std::vector<std::string> all(const std::string& cat) const;
810 
811 #ifdef WITH_DEPRECATED_FEATURES
813  MX add_variable(const std::string& name, casadi_int n=1);
814 
816  MX add_variable(const std::string& name, const Sparsity& sp);
817 
819  void add_variable(const MX& new_v);
820 
822  size_t add_variable_new(const std::string& name, casadi_int n=1);
823 
825  size_t add_variable_new(const std::string& name, const Sparsity& sp);
826 
828  size_t add_variable_new(const MX& new_v);
829 
831  bool has_variable(const std::string& name) const {return has(name);}
832 
834  std::vector<std::string> all_variables() const {return all();}
835 #endif // WITH_DEPRECATED_FEATURES
836 
838  Function oracle(bool sx = false, bool elim_w = false, bool lifted_calls = false) const;
839 
843  Sparsity jac_sparsity(const std::vector<std::string>& onames,
844  const std::vector<std::string>& inames) const;
845 
846 #ifndef SWIG
847 #ifdef WITH_DEPRECATED_FEATURES
849  Variable& new_variable(const std::string& name, casadi_int numel = 1);
850 
853  Variable& variable(const std::string& name);
854  const Variable& variable(const std::string& name) const;
855  Variable& variable(size_t ind);
856  const Variable& variable(size_t ind) const;
857  size_t find(const std::string& name) const;
858  std::vector<size_t> find(const std::vector<std::string>& name) const;
859  const std::string& name(size_t ind) const;
860  std::vector<std::string> name(const std::vector<size_t>& ind) const;
862 
865  const MX& var(size_t ind) const;
866  std::vector<MX> var(const std::vector<size_t>& ind) const;
868 
869 #endif // WITH_DEPRECATED_FEATURES
870 
872  const DaeBuilderInternal* operator->() const;
873 
875  DaeBuilderInternal* operator->();
876 
878  static bool test_cast(const SharedObjectInternal* ptr);
879 
880 #endif // SWIG
881 };
882 
883 } // namespace casadi
884 
885 #endif // CASADI_DAE_BUILDER_HPP
A symbolic representation of a differential-algebraic equations model.
Definition: dae_builder.hpp:70
std::vector< std::string > q() const
Quadrature states.
void set_alg(const std::string &name, const MX &alg_rhs)
[DEPRECATED] Replaced by eq
const MX & t() const
[DEPRECATED] Renamed "time"
void set_ode(const std::string &name, const MX &ode_rhs)
[DEPRECATED] Replaced by eq
std::vector< std::string > c() const
Named constants.
casadi_int ne() const
[DEPRECATED] Replaced by nzero()
void parse_fmi(const std::string &filename)
bool has_variable(const std::string &name) const
[DEPRECATED] Ranamed "has"
Function transition() const
Construct an event transition function, default naming.
std::string type_name() const
Readable name of the class.
Definition: dae_builder.hpp:74
std::vector< std::string > e() const
[DEPRECATED] Use all("zero") *‍/
bool provides_directional_derivative() const
Does the FMU provide support for analytic derivatives (FMI 2 naming)
Function create() const
Create a function with standard integrator DAE signature, default naming.
MX operator()(const std::string &name) const
std::vector< std::string > x() const
Differential states.
std::vector< std::string > z() const
Algebraic variables.
std::vector< std::string > t_new() const
Independent variable (usually time)
Definition: dae_builder.hpp:98
void add_init(const MX &lhs, const MX &rhs)
[DEPRECATED] Replaced by set_init
std::vector< std::string > p() const
Parameters.
std::vector< std::string > d() const
Dependent parameters.
std::vector< std::string > w() const
Dependent variables.
std::vector< std::string > all_variables() const
Get a list of all variables.
std::vector< std::string > u() const
Free controls.
Function object.
Definition: function.hpp:60
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
Importer.
Definition: importer.hpp:86
MX - Matrix expression.
Definition: mx.hpp:92
std::string name() const
Get the name.
Definition: mx.cpp:762
GenericShared implements a reference counting framework similar for efficient and.
General sparsity class.
Definition: sparsity.hpp:106
void add_variable(Equation *e, Variable *v)
The casadi namespace.
Definition: archiver.cpp:28
std::string description(Category 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< casadi_int > find(const std::vector< T > &v)
find nonzeros
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
bool all(const std::vector< bool > &v)
Check if all arguments are true.
Definition: casadi_misc.cpp:77
std::vector< casadi_int > path(const std::vector< casadi_int > &map, casadi_int i_start)
std::string filename(const std::string &path)
Definition: ghc.cpp:55
Holds expressions and meta-data corresponding to a physical quantity evolving in time.