dae_builder.cpp
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 #include "dae_builder_internal.hpp"
27 
28 #include <cctype>
29 #include <ctime>
30 #include <map>
31 #include <set>
32 #include <sstream>
33 #include <string>
34 #include <algorithm>
35 
36 #include "casadi_misc.hpp"
37 #include "exception.hpp"
38 #include "code_generator.hpp"
39 #include "calculus.hpp"
40 #include "xml_file.hpp"
41 #include "external.hpp"
42 #include "integrator.hpp"
43 
44 namespace casadi {
45 
46 // Throw informative error message
47 #define THROW_ERROR(FNAME, WHAT) \
48 throw CasadiException("Error in DaeBuilder::" FNAME " for '" + this->name() \
49  + "' at " + CASADI_WHERE + ":\n" + std::string(WHAT));
50 
52 }
53 
54 DaeBuilder::DaeBuilder(const std::string& name, const std::string& path, const Dict& opts) {
55  own(new DaeBuilderInternal(name, path, opts));
56  if (!path.empty()) load_fmi_description((*this)->resource_.path() + "/modelDescription.xml");
57 }
58 
59 const std::string& DaeBuilder::name() const {
60  return (*this)->name_;
61 }
62 
63 const MX& DaeBuilder::time() const {
64  try {
65  return (*this)->time();
66  } catch (std::exception& e) {
67  THROW_ERROR("time", e.what());
68  static const MX t;
69  return t; // never reached
70  }
71 }
72 
73 std::vector<std::string> DaeBuilder::y() const {
74  try {
75  return (*this)->name((*this)->outputs_);
76  } catch (std::exception& e) {
77  THROW_ERROR("y", e.what());
78  return {}; // never reached
79  }
80 }
81 
82 std::vector<MX> DaeBuilder::ode() const {
83  try {
84  return (*this)->output(OutputCategory::ODE);
85  } catch (std::exception& e) {
86  THROW_ERROR("ode", e.what());
87  return {}; // never reached
88  }
89 }
90 
91 std::vector<MX> DaeBuilder::alg() const {
92  try {
93  return (*this)->output(OutputCategory::ALG);
94  } catch (std::exception& e) {
95  THROW_ERROR("alg", e.what());
96  return {}; // never reached
97  }
98 }
99 
100 std::vector<MX> DaeBuilder::quad() const {
101  try {
102  return (*this)->output(OutputCategory::QUAD);
103  } catch (std::exception& e) {
104  THROW_ERROR("quad", e.what());
105  return {}; // never reached
106  }
107 }
108 
109 std::vector<MX> DaeBuilder::zero() const {
110  try {
111  return (*this)->output(OutputCategory::ZERO);
112  } catch (std::exception& e) {
113  THROW_ERROR("zero", e.what());
114  }
115 }
116 
117 std::vector<MX> DaeBuilder::ydef() const {
118  try {
119  return (*this)->output(OutputCategory::Y);
120  } catch (std::exception& e) {
121  THROW_ERROR("ydef", e.what());
122  return {}; // never reached
123  }
124 }
125 
126 std::vector<MX> DaeBuilder::cdef() const {
127  try {
128  return (*this)->cdef();
129  } catch (std::exception& e) {
130  THROW_ERROR("cdef", e.what());
131  return {}; // never reached
132  }
133 }
134 
135 std::vector<MX> DaeBuilder::ddef() const {
136  try {
137  return (*this)->output(OutputCategory::DDEF);
138  } catch (std::exception& e) {
139  THROW_ERROR("ddef", e.what());
140  return {}; // never reached
141  }
142 }
143 
144 std::vector<MX> DaeBuilder::wdef() const {
145  try {
146  return (*this)->output(OutputCategory::WDEF);
147  } catch (std::exception& e) {
148  THROW_ERROR("wdef", e.what());
149  return {}; // never reached
150  }
151 }
152 
153 std::vector<MX> DaeBuilder::init_lhs() const {
154  return (*this)->init_lhs();
155 }
156 
157 std::vector<MX> DaeBuilder::init_rhs() const {
158  return (*this)->init_rhs();
159 }
160 
161 std::vector<std::string> DaeBuilder::outputs() const {
162  try {
163  return (*this)->name((*this)->outputs_);
164  } catch (std::exception& e) {
165  THROW_ERROR("outputs", e.what());
166  return {}; // never reached
167  }
168 }
169 
170 std::vector<std::string> DaeBuilder::derivatives() const {
171  try {
172  return (*this)->name((*this)->derivatives_);
173  } catch (std::exception& e) {
174  THROW_ERROR("derivatives", e.what());
175  return {}; // never reached
176  }
177 }
178 
179 std::vector<std::string> DaeBuilder::initial_unknowns() const {
180  try {
181  return (*this)->name((*this)->initial_unknowns_);
182  } catch (std::exception& e) {
183  THROW_ERROR("initial_unknowns", e.what());
184  return {}; // never reached
185  }
186 }
187 
188 bool DaeBuilder::has_t() const {
189  try {
190  return (*this)->has_t();
191  } catch (std::exception& e) {
192  THROW_ERROR("has_t", e.what());
193  return false; // never reached
194  }
195 }
196 
197 casadi_int DaeBuilder::nx() const {
198  return (*this)->size(Category::X);
199 }
200 
201 casadi_int DaeBuilder::nz() const {
202  return (*this)->size(Category::Z);
203 }
204 
205 casadi_int DaeBuilder::nq() const {
206  return (*this)->size(Category::Q);
207 }
208 
209 casadi_int DaeBuilder::nzero() const {
210  return (*this)->event_indicators_.size();
211 }
212 
213 casadi_int DaeBuilder::ny() const {
214  return (*this)->outputs_.size();
215 }
216 
217 casadi_int DaeBuilder::nu() const {
218  return (*this)->size(Category::U);
219 }
220 
221 casadi_int DaeBuilder::np() const {
222  return (*this)->size(Category::P);
223 }
224 
225 casadi_int DaeBuilder::nc() const {
226  return (*this)->size(Category::C);
227 }
228 
229 casadi_int DaeBuilder::nd() const {
230  return (*this)->size(Category::D);
231 }
232 
233 casadi_int DaeBuilder::nw() const {
234  return (*this)->size(Category::W);
235 }
236 
237 void DaeBuilder::load_fmi_description(const std::string& filename) {
238  try {
239  (*this)->load_fmi_description(filename);
240  } catch (std::exception& e) {
241  THROW_ERROR("load_fmi_description", e.what());
242  }
243 }
244 
246  try {
247  casadi_assert(!(*this)->symbolic_, "Functionality only applies to imported standard FMUs");
248  return (*this)->provides_directional_derivatives_;
249  } catch (std::exception& e) {
250  THROW_ERROR("provides_directional_derivatives", e.what());
251  return false;
252  }
253 }
254 
255 std::vector<std::string> DaeBuilder::export_fmu(const Dict& opts) {
256  try {
257  return (*this)->export_fmu(opts);
258  } catch (std::exception& e) {
259  THROW_ERROR("export_fmu", e.what());
260  }
261 }
262 
263 void DaeBuilder::prune(bool prune_p, bool prune_u) {
264  try {
265  (*this)->prune(prune_p, prune_u);
266  } catch (std::exception& e) {
267  THROW_ERROR("prune", e.what());
268  }
269 }
270 
272  try {
273  (*this)->tear();
274  } catch (std::exception& e) {
275  THROW_ERROR("tear", e.what());
276  }
277 }
278 
279 bool DaeBuilder::has(const std::string& name) const {
280  try {
281  return (*this)->has(name);
282  } catch (std::exception& e) {
283  THROW_ERROR("has", e.what());
284  return false; // never reached
285  }
286 }
287 
288 std::vector<std::string> DaeBuilder::all() const {
289  try {
290  return (*this)->all();
291  } catch (std::exception& e) {
292  THROW_ERROR("all", e.what());
293  return {}; // never reached
294  }
295 }
296 
297 std::vector<std::string> DaeBuilder::all(const std::string& cat) const {
298  try {
299  return (*this)->all(to_enum<Category>(cat));
300  } catch (std::exception& e) {
301  THROW_ERROR("all", e.what());
302  return {}; // never reached
303  }
304 }
305 
306 #ifdef WITH_DEPRECATED_FEATURES
307 Variable& DaeBuilder::new_variable(const std::string& name, casadi_int numel) {
308  try {
309  return (*this)->new_variable(name, {numel});
310  } catch (std::exception& e) {
311  THROW_ERROR("new_variable", e.what());
312  }
313 }
314 
315 Variable& DaeBuilder::variable(const std::string& name) {
316  try {
317  return (*this)->variable(name);
318  } catch (std::exception& e) {
319  THROW_ERROR("variable", e.what());
320  }
321 }
322 
323 const Variable& DaeBuilder::variable(const std::string& name) const {
324  try {
325  return (*this)->variable(name);
326  } catch (std::exception& e) {
327  THROW_ERROR("variable", e.what());
328  }
329 }
330 
332  try {
333  return (*this)->variable(ind);
334  } catch (std::exception& e) {
335  THROW_ERROR("variable", e.what());
336  }
337 }
338 
339 const Variable& DaeBuilder::variable(size_t ind) const {
340  try {
341  return (*this)->variable(ind);
342  } catch (std::exception& e) {
343  THROW_ERROR("variable", e.what());
344  }
345 }
346 
347 size_t DaeBuilder::find(const std::string& name) const {
348  try {
349  return (*this)->find(name);
350  } catch (std::exception& e) {
351  THROW_ERROR("find", e.what());
352  return -1; // never reached
353  }
354 }
355 
356 std::vector<size_t> DaeBuilder::find(const std::vector<std::string>& name) const {
357  try {
358  return (*this)->find(name);
359  } catch (std::exception& e) {
360  THROW_ERROR("find", e.what());
361  return {}; // never reached
362  }
363 }
364 
365 const std::string& DaeBuilder::name(size_t ind) const {
366  try {
367  return (*this)->name(ind);
368  } catch (std::exception& e) {
369  THROW_ERROR("name", e.what());
370  static std::string dummy;
371  return dummy; // never reached
372  }
373 }
374 
375 std::vector<std::string> DaeBuilder::name(const std::vector<size_t>& ind) const {
376  try {
377  return (*this)->name(ind);
378  } catch (std::exception& e) {
379  THROW_ERROR("name", e.what());
380  return {}; // never reached
381  }
382 }
383 const MX& DaeBuilder::var(size_t ind) const {
384  try {
385  return (*this)->var(ind);
386  } catch (std::exception& e) {
387  THROW_ERROR("var", e.what());
388  static MX dummy;
389  return dummy; // never reached
390  }
391 }
392 
393 std::vector<MX> DaeBuilder::var(const std::vector<size_t>& ind) const {
394  try {
395  return (*this)->var(ind);
396  } catch (std::exception& e) {
397  THROW_ERROR("var", e.what());
398  return {}; // never reached
399  }
400 }
401 
402 MX DaeBuilder::add_variable(const std::string& name, casadi_int n) {
403  return add_variable(name, Sparsity::dense(n));
404 }
405 
406 MX DaeBuilder::add_variable(const std::string& name, const Sparsity& sp) {
407  Variable& v = new_variable(name);
408  v.v = MX::sym(name, sp);
409  return v.v;
410 }
411 
412 void DaeBuilder::add_variable(const MX& new_v) {
413  Variable& v = new_variable(new_v.name());
414  v.v = new_v;
415 }
416 
417 size_t DaeBuilder::add_variable_new(const std::string& name, casadi_int n) {
419 }
420 
421 size_t DaeBuilder::add_variable_new(const std::string& name, const Sparsity& sp) {
422  Variable& v = new_variable(name);
423  v.v = MX::sym(name, sp);
424  return v.index;
425 }
426 
427 size_t DaeBuilder::add_variable_new(const MX& new_v) {
428  Variable& v = new_variable(new_v.name());
429  v.v = new_v;
430  return v.index;
431 }
432 
433 void DaeBuilder::register_t(const std::string& name) {
434  // Save to class
435  casadi_assert(!has_t(), "'t' already defined");
436  (*this)->indices(Category::T).push_back(find(name));
437 }
438 
439 void DaeBuilder::register_p(const std::string& name) {
440  (*this)->indices(Category::P).push_back(find(name));
441 }
442 
443 void DaeBuilder::register_u(const std::string& name) {
444  (*this)->indices(Category::U).push_back(find(name));
445 }
446 
447 void DaeBuilder::register_x(const std::string& name) {
448  (*this)->indices(Category::X).push_back(find(name));
449 }
450 
451 void DaeBuilder::register_z(const std::string& name) {
452  (*this)->indices(Category::Z).push_back(find(name));
453 }
454 
455 void DaeBuilder::register_q(const std::string& name) {
456  (*this)->indices(Category::Q).push_back(find(name));
457 }
458 
459 void DaeBuilder::register_c(const std::string& name) {
460  (*this)->indices(Category::C).push_back(find(name));
461 }
462 
463 void DaeBuilder::register_d(const std::string& name) {
464  (*this)->indices(Category::D).push_back(find(name));
465 }
466 
467 void DaeBuilder::register_w(const std::string& name) {
468  (*this)->indices(Category::W).push_back(find(name));
469 }
470 
471 void DaeBuilder::register_y(const std::string& name) {
472  (*this)->outputs_.push_back(find(name));
473 }
474 
475 void DaeBuilder::register_e(const std::string& name) {
476  (*this)->event_indicators_.push_back(find(name));
477 }
478 
480  try {
481  return eliminate("d");
482  } catch (std::exception& e) {
483  THROW_ERROR("eliminate_d", e.what());
484  }
485 }
486 
488  try {
489  return eliminate("w");
490  } catch (std::exception& e) {
491  THROW_ERROR("eliminate_w", e.what());
492  }
493 }
494 
496  try {
497  return eliminate("q");
498  } catch (std::exception& e) {
499  THROW_ERROR("eliminate_quad", e.what());
500  }
501 }
502 
504  try {
505  return sort("d");
506  } catch (std::exception& e) {
507  THROW_ERROR("sort_d", e.what());
508  }
509 }
510 
512  try {
513  return sort("w");
514  } catch (std::exception& e) {
515  THROW_ERROR("sort_w", e.what());
516  }
517 }
518 
519 void DaeBuilder::sort_z(const std::vector<std::string>& z_order) {
520  try {
521  return reorder("z", z_order);
522  } catch (std::exception& e) {
523  THROW_ERROR("sort_z", e.what());
524  }
525 }
526 
527 void DaeBuilder::clear_all(const std::string& v) {
528  try {
529  (*this)->clear_cache_ = true; // Clear cache after this
530  (*this)->indices(to_enum<Category>(v)).clear();
531  } catch (std::exception& e) {
532  THROW_ERROR("clear_all", e.what());
533  }
534 }
535 
536 void DaeBuilder::set_all(const std::string& v, const std::vector<std::string>& name) {
537  try {
538  (*this)->clear_cache_ = true; // Clear cache after this
539  const std::vector<size_t>& new_ind = (*this)->find(name);
540  if (v == "y") {
541  (*this)->outputs_ = new_ind;
542  } else {
543  (*this)->indices(to_enum<Category>(v)) = new_ind;
544  }
545  } catch (std::exception& e) {
546  THROW_ERROR("set_all", e.what());
547  }
548 }
549 
550 #endif // WITH_DEPRECATED_FEATURES
551 
552 void DaeBuilder::reorder(const std::string& cat, const std::vector<std::string>& v) {
553  try {
554  auto vind = (*this)->find(v);
555  if (cat == "y") {
556  // Reorder outputs
557  (*this)->reorder("y", (*this)->outputs_, vind);
558  } else {
559  // Reorder inputs
560  (*this)->reorder(to_enum<Category>(cat), vind);
561  }
562  } catch (std::exception& e) {
563  THROW_ERROR("reorder", e.what());
564  }
565 }
566 
567 MX DaeBuilder::add(const std::string& name, const std::string& causality,
568  const std::string& variability, const Dict& opts) {
569  try {
570  return (*this)->add(name, to_enum<Causality>(causality),
571  to_enum<Variability>(variability), opts).v;
572  } catch (std::exception& e) {
573  THROW_ERROR("add", e.what());
574  return MX();
575  }
576 }
577 
578 MX DaeBuilder::add(const std::string& name, const std::string& causality, const Dict& opts) {
579  try {
580  return (*this)->add(name, to_enum<Causality>(causality), opts).v;
581  } catch (std::exception& e) {
582  THROW_ERROR("add", e.what());
583  return MX();
584  }
585 }
586 
587 MX DaeBuilder::add(const std::string& name, const Dict& opts) {
588  try {
589  return (*this)->add(name, opts).v;
590  } catch (std::exception& e) {
591  THROW_ERROR("add", e.what());
592  return MX();
593  }
594 }
595 
596 void DaeBuilder::add(const std::string& name, const std::string& causality,
597  const std::string& variability, const MX& expr, const Dict& opts) {
598  try {
599  // Ensure pure symbolic expression
600  casadi_assert(expr.is_symbolic(), "Expression must be symbolic");
601  // Make sure name matches expression
602  casadi_assert(name == expr.name(), "Name must match expression");
603  // Add variable
604  (*this)->add(name, to_enum<Causality>(causality), to_enum<Variability>(variability),
605  expr, opts);
606  } catch (std::exception& e) {
607  THROW_ERROR("add", e.what());
608  }
609 }
610 
611 #ifdef WITH_DEPRECATED_FEATURES
612 MX DaeBuilder::add_t(const std::string& name) {
613  return add(name, "independent");
614 }
615 
616 MX DaeBuilder::add_p(const std::string& name) {
617  casadi_assert(!name.empty(), "Variable name is required");
618  return add(name, "parameter", "tunable");
619 }
620 
621 MX DaeBuilder::add_u(const std::string& name) {
622  casadi_assert(!name.empty(), "Variable name is required");
623  return add(name, "input");
624 }
625 
626 MX DaeBuilder::add_x(const std::string& name) {
627  casadi_assert(!name.empty(), "Variable name is required");
628  return add(name);
629 }
630 
631 MX DaeBuilder::add_z(const std::string& name) {
632  casadi_assert(!name.empty(), "Variable name is required");
633  return add(name);
634 }
635 
636 MX DaeBuilder::add_q(const std::string& name) {
637  casadi_assert(!name.empty(), "Variable name is required");
638  return add(name);
639 }
640 
641 MX DaeBuilder::add_c(const std::string& name, const MX& new_cdef) {
642  MX v = add(name, "local", "constant");
643  set_beq(name, new_cdef);
644  return v;
645 }
646 
647 MX DaeBuilder::add_d(const std::string& name, const MX& new_ddef) {
648  MX v = add(name, "calculatedParameter", "fixed");
649  set_beq(name, new_ddef);
650  return v;
651 }
652 
653 MX DaeBuilder::add_w(const std::string& name, const MX& new_wdef) {
654  MX v = add(name);
655  eq(v, new_wdef);
656  return v;
657 }
658 
659 MX DaeBuilder::add_y(const std::string& name, const MX& new_ydef) {
660  MX v = add(name, "output");
661  eq(v, new_ydef);
662  return v;
663 }
664 
665 void DaeBuilder::set_beq(const std::string& name, const MX& val) {
666  try {
667  eq(var(name), val);
668  } catch (std::exception& e) {
669  THROW_ERROR("set_beq", e.what());
670  }
671 }
672 
673 #endif // WITH_DEPRECATED_FEATURES
674 
675 void DaeBuilder::eq(const MX& lhs, const MX& rhs, const Dict& opts) {
676  try {
677  (*this)->eq(lhs, rhs, opts);
678  } catch (std::exception& e) {
679  THROW_ERROR("eq", e.what());
680  }
681 }
682 
683 void DaeBuilder::when(const MX& cond, const std::vector<std::string>& eqs, const Dict& opts) {
684  try {
685  (*this)->when(cond, eqs, opts);
686  } catch (std::exception& e) {
687  THROW_ERROR("when", e.what());
688  }
689 }
690 
691 std::string DaeBuilder::assign(const std::string& name, const MX& val) {
692  try {
693  return (*this)->assign(name, val).name;
694  } catch (std::exception& e) {
695  THROW_ERROR("assign", e.what());
696  return std::string(); // never reached
697  }
698 }
699 
700 std::string DaeBuilder::reinit(const std::string& name, const MX& val) {
701  try {
702  return (*this)->reinit(name, val).name;
703  } catch (std::exception& e) {
704  THROW_ERROR("reinit", e.what());
705  return std::string(); // never reached
706  }
707 }
708 
709 void DaeBuilder::set_init(const std::string& name, const MX& init_rhs) {
710  try {
711  (*this)->set_init(name, init_rhs);
712  } catch (std::exception& e) {
713  THROW_ERROR("set_init", e.what());
714  }
715 }
716 
718  try {
719  (*this)->sanity_check();
720  } catch (std::exception& e) {
721  THROW_ERROR("sanity_check", e.what());
722  }
723 }
724 
725 MX DaeBuilder::var(const std::string& name) const {
726  try {
727  return (*this)->variable(name).v;
728  } catch (std::exception& e) {
729  THROW_ERROR("var", e.what());
730  return MX(); // never reached
731  }
732 }
733 
734 std::string DaeBuilder::der(const std::string& name) const {
735  try {
736  // Get variable index
737  size_t ind = (*this)->find(name);
738  // Differentiate
739  ind = (*this)->variable(ind).der;
740  casadi_assert(ind != size_t(-1), "No derivative expression for " + name);
741  // Return name
742  return (*this)->variable(ind).name;
743  } catch (std::exception& e) {
744  THROW_ERROR("der", e.what());
745  return std::string(); // never reached
746  }
747 }
748 
749 std::string DaeBuilder::pre(const std::string& name) const {
750  try {
751  // Not implemented
752  static bool warned = false;
753  if (!warned) {
754  casadi_warning("DaeBuilder::pre has not been implemented: Returning identity mapping");
755  warned = true;
756  }
757  return name;
758  } catch (std::exception& e) {
759  THROW_ERROR("pre", e.what());
760  return std::string(); // never reached
761  }
762 }
763 
764 MX DaeBuilder::pre(const MX& v) const {
765  try {
766  // Not implemented
767  static bool warned = false;
768  if (!warned) {
769  casadi_warning("DaeBuilder::pre has not been implemented: Returning identity mapping");
770  warned = true;
771  }
772  return v;
773  } catch (std::exception& e) {
774  THROW_ERROR("pre", e.what());
775  return MX(); // never reached
776  }
777 }
778 
779 std::vector<std::string> DaeBuilder::der(const std::vector<std::string>& name) const {
780  try {
781  std::vector<std::string> r(name.size());
782  for (size_t i = 0; i < r.size(); ++i) r[i] = der(name[i]);
783  return r;
784  } catch (std::exception& e) {
785  THROW_ERROR("der", e.what());
786  return {}; // never reached
787  }
788 }
789 
790 std::vector<std::string> DaeBuilder::pre(const std::vector<std::string>& name) const {
791  try {
792  std::vector<std::string> r(name.size());
793  for (size_t i = 0; i < r.size(); ++i) r[i] = pre(name[i]);
794  return r;
795  } catch (std::exception& e) {
796  THROW_ERROR("pre", e.what());
797  return {}; // never reached
798  }
799 }
800 
801 bool DaeBuilder::has_beq(const std::string& name) const {
802  try {
803  return !(*this)->variable(name).has_beq();
804  } catch (std::exception& e) {
805  THROW_ERROR("has_beq", e.what());
806  return false; // never reached
807  }
808 }
809 
810 MX DaeBuilder::beq(const std::string& name) const {
811  try {
812  const Variable& v = (*this)->variable(name);
813  return (*this)->variable(v.bind).v;
814  } catch (std::exception& e) {
815  THROW_ERROR("beq", e.what());
816  return MX(); // never reached
817  }
818 }
819 
820 void DaeBuilder::eliminate(const std::string& cat) {
821  try {
822  return (*this)->eliminate(to_enum<Category>(cat));
823  } catch (std::exception& e) {
824  THROW_ERROR("eliminate", e.what());
825  }
826 }
827 
828 void DaeBuilder::sort(const std::string& cat) {
829  try {
830  return (*this)->sort(to_enum<Category>(cat));
831  } catch (std::exception& e) {
832  THROW_ERROR("sort", e.what());
833  }
834 }
835 
836 void DaeBuilder::lift(bool lift_shared, bool lift_calls) {
837  try {
838  (*this)->lift(lift_shared, lift_calls);
839  } catch (std::exception& e) {
840  THROW_ERROR("lift", e.what());
841  }
842 }
843 
844 casadi_int DaeBuilder::value_reference(const std::string& name) const {
845  return (*this)->variable(name).value_reference;
846 }
847 
848 void DaeBuilder::set_value_reference(const std::string& name, casadi_int val) {
849  (*this)->variable(name).value_reference = val;
850 }
851 
852 std::string DaeBuilder::description(const std::string& name) const {
853  return (*this)->variable(name).description;
854 }
855 
856 void DaeBuilder::set_description(const std::string& name, const std::string& val) {
857  (*this)->variable(name).description = val;
858 }
859 
860 std::string DaeBuilder::type(const std::string& name, casadi_int fmi_version) const {
861  // Check version
862  casadi_assert(fmi_version == 2 || fmi_version == 3, "Only FMI version 2 or 3 supported");
863  // Handle FMI 2
864  if (fmi_version == 2) {
865  return to_string(to_fmi2((*this)->variable(name).type));
866  }
867  // Assume FMI 3
868  return to_string((*this)->variable(name).type);
869 }
870 
871 void DaeBuilder::set_type(const std::string& name, const std::string& val) {
872  // Fallback to FMI 2, if necessary
873  if (has_enum<TypeFmi2>(val) && !has_enum<Type>(val)) {
874  (*this)->variable(name).type = from_fmi2(to_enum<TypeFmi2>(val));
875  }
876  // Assume FMI 3
877  (*this)->variable(name).type = to_enum<Type>(val);
878 }
879 
880 std::string DaeBuilder::causality(const std::string& name) const {
881  try {
882  return to_string((*this)->causality((*this)->find(name)));
883  } catch (std::exception& e) {
884  THROW_ERROR("causality", e.what());
885  return std::string(); // never reached
886  }
887 }
888 
889 void DaeBuilder::set_causality(const std::string& name, const std::string& val) {
890  try {
891  (*this)->set_causality((*this)->find(name), to_enum<Causality>(val));
892  } catch (std::exception& e) {
893  THROW_ERROR("set_causality", e.what());
894  }
895 }
896 
897 std::string DaeBuilder::variability(const std::string& name) const {
898  try {
899  return to_string((*this)->variability((*this)->find(name)));
900  } catch (std::exception& e) {
901  THROW_ERROR("variability", e.what());
902  return std::string(); // never reached
903  }
904 }
905 
906 void DaeBuilder::set_variability(const std::string& name, const std::string& val) {
907  try {
908  (*this)->set_variability((*this)->find(name), to_enum<Variability>(val));
909  } catch (std::exception& e) {
910  THROW_ERROR("set_variability", e.what());
911  }
912 }
913 
914 std::string DaeBuilder::category(const std::string& name) const {
915  try {
916  return to_string((*this)->category((*this)->find(name)));
917  } catch (std::exception& e) {
918  THROW_ERROR("category", e.what());
919  return std::string(); // never reached
920  }
921 }
922 
923 void DaeBuilder::set_category(const std::string& name, const std::string& val) {
924  try {
925  (*this)->set_category((*this)->find(name), to_enum<Category>(val));
926  } catch (std::exception& e) {
927  THROW_ERROR("set_category", e.what());
928  }
929 }
930 
931 std::string DaeBuilder::initial(const std::string& name) const {
932  return to_string((*this)->variable(name).initial);
933 }
934 
935 void DaeBuilder::set_initial(const std::string& name, const std::string& val) {
936  (*this)->variable(name).initial = to_enum<Initial>(val);
937 }
938 
939 std::string DaeBuilder::unit(const std::string& name) const {
940  return (*this)->variable(name).unit;
941 }
942 
943 void DaeBuilder::set_unit(const std::string& name, const std::string& val) {
944  (*this)->variable(name).unit = val;
945 }
946 
947 std::string DaeBuilder::display_unit(const std::string& name) const {
948  return (*this)->variable(name).display_unit;
949 }
950 
951 void DaeBuilder::set_display_unit(const std::string& name, const std::string& val) {
952  (*this)->variable(name).display_unit = val;
953 }
954 
955 casadi_int DaeBuilder::numel(const std::string& name) const {
956  return (*this)->variable(name).numel;
957 }
958 
959 std::vector<casadi_int> DaeBuilder::dimension(const std::string& name) const {
960  return (*this)->variable(name).dimension;
961 }
962 
963 double DaeBuilder::start_time() const {
964  try {
965  return (*this)->start_time_;
966  } catch (std::exception& e) {
967  THROW_ERROR("start_time", e.what());
968  return nan;
969  }
970 }
971 
972 void DaeBuilder::set_start_time(double val) {
973  try {
974  (*this)->start_time_ = val;
975  } catch (std::exception& e) {
976  THROW_ERROR("set_start_time", e.what());
977  }
978 }
979 
980 double DaeBuilder::stop_time() const {
981  try {
982  return (*this)->stop_time_;
983  } catch (std::exception& e) {
984  THROW_ERROR("stop_time", e.what());
985  return nan;
986  }
987 }
988 
989 void DaeBuilder::set_stop_time(double val) {
990  try {
991  (*this)->stop_time_ = val;
992  } catch (std::exception& e) {
993  THROW_ERROR("set_stop_time", e.what());
994  }
995 }
996 
997 double DaeBuilder::tolerance() const {
998  try {
999  return (*this)->tolerance_;
1000  } catch (std::exception& e) {
1001  THROW_ERROR("tolerance", e.what());
1002  return nan;
1003  }
1004 }
1005 
1006 void DaeBuilder::set_tolerance(double val) {
1007  try {
1008  (*this)->tolerance_ = val;
1009  } catch (std::exception& e) {
1010  THROW_ERROR("set_tolerance", e.what());
1011  }
1012 }
1013 
1014 double DaeBuilder::step_size() const {
1015  try {
1016  return (*this)->step_size_;
1017  } catch (std::exception& e) {
1018  THROW_ERROR("step_size", e.what());
1019  return nan;
1020  }
1021 }
1022 
1023 void DaeBuilder::set_step_size(double val) {
1024  try {
1025  (*this)->step_size_ = val;
1026  } catch (std::exception& e) {
1027  THROW_ERROR("set_step_size", e.what());
1028  }
1029 }
1030 
1031 void DaeBuilder::add_lc(const std::string& name,
1032  const std::vector<std::string>& f_out) {
1033  try {
1034  (*this)->add_lc(name, f_out);
1035  } catch (std::exception& e) {
1036  THROW_ERROR("add_lc", e.what());
1037  }
1038 }
1039 
1040 Function DaeBuilder::create(const std::string& fname,
1041  const std::vector<std::string>& name_in,
1042  const std::vector<std::string>& name_out, bool sx, bool lifted_calls) const {
1043  try {
1044  return (*this)->create(fname, name_in, name_out, Dict(), sx, lifted_calls);
1045  } catch (std::exception& e) {
1046  THROW_ERROR("create", e.what());
1047  return Function(); // never reached
1048  }
1049 }
1050 
1051 Function DaeBuilder::create(const std::string& fname,
1052  const std::vector<std::string>& name_in,
1053  const std::vector<std::string>& name_out, const Dict& opts) const {
1054  try {
1055  return (*this)->create(fname, name_in, name_out, opts, false, false);
1056  } catch (std::exception& e) {
1057  THROW_ERROR("create", e.what());
1058  return Function(); // never reached
1059  }
1060 }
1061 
1062 Function DaeBuilder::create(const std::string& name, const Dict& opts) const {
1063  try {
1064  return (*this)->create(name, dyn_in(), dyn_out(), opts, false, false);
1065  } catch (std::exception& e) {
1066  THROW_ERROR("create", e.what());
1067  return Function(); // never reached
1068  }
1069 }
1070 
1072  try {
1073  return (*this)->add_fun(f);
1074  } catch (std::exception& e) {
1075  THROW_ERROR("add_fun", e.what());
1076  return Function(); // never reached
1077  }
1078 }
1079 
1080 Function DaeBuilder::add_fun(const std::string& name, const std::vector<std::string>& arg,
1081  const std::vector<std::string>& res, const Dict& opts) {
1082  try {
1083  return (*this)->add_fun(name, arg, res, opts);
1084  } catch (std::exception& e) {
1085  THROW_ERROR("add_fun", e.what());
1086  return Function(); // never reached
1087  }
1088 }
1089 
1090 Function DaeBuilder::add_fun(const std::string& name, const Importer& compiler, const Dict& opts) {
1091  casadi_assert(!has_fun(name), "Function '" + name + "' already exists");
1092  return add_fun(external(name, compiler, opts));
1093 }
1094 
1095 bool DaeBuilder::has_fun(const std::string& name) const {
1096  try {
1097  return (*this)->has_fun(name);
1098  } catch (std::exception& e) {
1099  THROW_ERROR("has_fun", e.what());
1100  return false; // never reached
1101  }
1102 }
1103 
1104 Function DaeBuilder::fun(const std::string& name) const {
1105  try {
1106  return (*this)->fun(name);
1107  } catch (std::exception& e) {
1108  THROW_ERROR("fun", e.what());
1109  return Function(); // never reached
1110  }
1111 }
1112 
1113 void DaeBuilder::gather_fun(casadi_int max_depth) {
1114  try {
1115  // Get a function corresponding to all equations (no inputs)
1116  Function all_eq = (*this)->gather_eq();
1117  // Gather all functions
1118  std::vector<Function> allfun = all_eq.find_functions(max_depth);
1119  // Add to list of functions
1120  for (const Function& f : allfun) {
1121  if (has_fun(f.name())) {
1122  // Skip functions with duplicate names
1123  casadi_warning("Duplicate function: '" + f.name() + "', ignored");
1124  } else {
1125  // Add to list of functions
1126  add_fun(f);
1127  }
1128  }
1129  } catch (std::exception& e) {
1130  THROW_ERROR("gather_fun", e.what());
1131  }
1132 }
1133 
1134 std::vector<Function> DaeBuilder::fun() const {
1135  return (*this)->fun_;
1136 }
1137 
1138 Function DaeBuilder::oracle(bool sx, bool elim_w, bool lifted_calls) const {
1139  try {
1140  return (*this)->oracle(sx, elim_w, lifted_calls);
1141  } catch (std::exception& e) {
1142  THROW_ERROR("oracle", e.what());
1143  return Function(); // never reached
1144  }
1145 }
1146 
1147 Function DaeBuilder::dependent_fun(const std::string& fname,
1148  const std::vector<std::string>& s_in,
1149  const std::vector<std::string>& s_out) const {
1150  try {
1151  return (*this)->dependent_fun(fname, s_in, s_out);
1152  } catch (std::exception& e) {
1153  THROW_ERROR("dependent_fun", e.what());
1154  return Function(); // never reached
1155  }
1156 }
1157 
1158 Function DaeBuilder::transition(const std::string& fname, casadi_int index) const {
1159  try {
1160  return (*this)->transition(fname, index);
1161  } catch (std::exception& e) {
1162  THROW_ERROR("transition", e.what());
1163  return Function(); // never reached
1164  }
1165 }
1166 
1167 Function DaeBuilder::transition(const std::string& fname) const {
1168  try {
1169  return (*this)->transition(fname);
1170  } catch (std::exception& e) {
1171  THROW_ERROR("transition", e.what());
1172  return Function(); // never reached
1173  }
1174 }
1175 
1177  return dynamic_cast<const DaeBuilderInternal*>(ptr) != nullptr;
1178 }
1179 
1181  return static_cast<DaeBuilderInternal*>(SharedObject::operator->());
1182 }
1183 
1185  return static_cast<const DaeBuilderInternal*>(SharedObject::operator->());
1186 }
1187 
1188 MX DaeBuilder::der(const MX& v) const {
1189  try {
1190  return (*this)->der(v);
1191  } catch (std::exception& e) {
1192  THROW_ERROR("der", e.what());
1193  return MX(); // never reached
1194  }
1195 }
1196 
1197 MX DaeBuilder::der(const MX& v) {
1198  try {
1199  return (*this)->der(v);
1200  } catch (std::exception& e) {
1201  THROW_ERROR("der", e.what());
1202  return MX(); // never reached
1203  }
1204 }
1205 
1206 double DaeBuilder::attribute(const std::string& a, const std::string& name) const {
1207  try {
1208  return (*this)->attribute(to_enum<Attribute>(a), name);
1209  } catch (std::exception& e) {
1210  THROW_ERROR("attribute", e.what());
1211  return 0; // never reached
1212  }
1213 }
1214 
1215 std::vector<double> DaeBuilder::attribute(const std::string& a,
1216  const std::vector<std::string>& name) const {
1217  try {
1218  return (*this)->attribute(to_enum<Attribute>(a), name);
1219  } catch (std::exception& e) {
1220  THROW_ERROR("attribute", e.what());
1221  return {}; // never reached
1222  }
1223 }
1224 
1225 void DaeBuilder::set_attribute(const std::string& a, const std::string& name, double val) {
1226  try {
1227  (*this)->set_attribute(to_enum<Attribute>(a), name, val);
1228  } catch (std::exception& e) {
1229  THROW_ERROR("set_attribute", e.what());
1230  }
1231 }
1232 
1233 void DaeBuilder::set_attribute(const std::string& a, const std::vector<std::string>& name,
1234  const std::vector<double>& val) {
1235  try {
1236  (*this)->set_attribute(to_enum<Attribute>(a), name, val);
1237  } catch (std::exception& e) {
1238  THROW_ERROR("set_attribute", e.what());
1239  }
1240 }
1241 
1242 double DaeBuilder::min(const std::string& name) const {
1243  try {
1244  return (*this)->variable(name).min;
1245  } catch (std::exception& e) {
1246  THROW_ERROR("min", e.what());
1247  return 0; // never reached
1248  }
1249 }
1250 
1251 std::vector<double> DaeBuilder::min(const std::vector<std::string>& name) const {
1252  try {
1253  return (*this)->attribute(Attribute::MIN, name);
1254  } catch (std::exception& e) {
1255  THROW_ERROR("min", e.what());
1256  return {}; // never reached
1257  }
1258 }
1259 
1260 void DaeBuilder::set_min(const std::string& name, double val) {
1261  try {
1262  (*this)->variable(name).min = val;
1263  } catch (std::exception& e) {
1264  THROW_ERROR("set_min", e.what());
1265  }
1266 }
1267 
1268 void DaeBuilder::set_min(const std::vector<std::string>& name, const std::vector<double>& val) {
1269  try {
1270  (*this)->set_attribute(Attribute::MIN, name, val);
1271  } catch (std::exception& e) {
1272  THROW_ERROR("set_min", e.what());
1273  }
1274 }
1275 
1276 double DaeBuilder::max(const std::string& name) const {
1277  try {
1278  return (*this)->variable(name).max;
1279  } catch (std::exception& e) {
1280  THROW_ERROR("max", e.what());
1281  return 0; // never reached
1282  }
1283 }
1284 
1285 std::vector<double> DaeBuilder::max(const std::vector<std::string>& name) const {
1286  try {
1287  return (*this)->attribute(Attribute::MAX, name);
1288  } catch (std::exception& e) {
1289  THROW_ERROR("max", e.what());
1290  return {}; // never reached
1291  }
1292 }
1293 
1294 void DaeBuilder::set_max(const std::string& name, double val) {
1295  try {
1296  (*this)->variable(name).max = val;
1297  } catch (std::exception& e) {
1298  THROW_ERROR("set_max", e.what());
1299  }
1300 }
1301 
1302 void DaeBuilder::set_max(const std::vector<std::string>& name, const std::vector<double>& val) {
1303  try {
1304  (*this)->set_attribute(Attribute::MAX, name, val);
1305  } catch (std::exception& e) {
1306  THROW_ERROR("set_max", e.what());
1307  }
1308 }
1309 
1310 double DaeBuilder::nominal(const std::string& name) const {
1311  try {
1312  return (*this)->variable(name).nominal;
1313  } catch (std::exception& e) {
1314  THROW_ERROR("nominal", e.what());
1315  return 0; // never reached
1316  }
1317 }
1318 
1319 std::vector<double> DaeBuilder::nominal(const std::vector<std::string>& name) const {
1320  try {
1321  return (*this)->attribute(Attribute::NOMINAL, name);
1322  } catch (std::exception& e) {
1323  THROW_ERROR("nominal", e.what());
1324  return {}; // never reached
1325  }
1326 }
1327 
1328 void DaeBuilder::set_nominal(const std::string& name, double val) {
1329  try {
1330  (*this)->variable(name).nominal = val;
1331  } catch (std::exception& e) {
1332  THROW_ERROR("set_nominal", e.what());
1333  }
1334 }
1335 
1336 void DaeBuilder::set_nominal(const std::vector<std::string>& name, const std::vector<double>& val) {
1337  try {
1338  (*this)->set_attribute(Attribute::NOMINAL, name, val);
1339  } catch (std::exception& e) {
1340  THROW_ERROR("set_mininal", e.what());
1341  }
1342 }
1343 
1344 std::vector<double> DaeBuilder::start(const std::string& name) const {
1345  try {
1346  return (*this)->attribute(Attribute::START, std::vector<std::string>{name});
1347  } catch (std::exception& e) {
1348  THROW_ERROR("start", e.what());
1349  return {}; // never reached
1350  }
1351 }
1352 
1353 std::vector<double> DaeBuilder::start(const std::vector<std::string>& name) const {
1354  try {
1355  return (*this)->attribute(Attribute::START, name);
1356  } catch (std::exception& e) {
1357  THROW_ERROR("start", e.what());
1358  return {}; // never reached
1359  }
1360 }
1361 
1362 void DaeBuilder::set_start(const std::string& name, double val) {
1363  try {
1364  (*this)->set_attribute(Attribute::START, name, val);
1365  } catch (std::exception& e) {
1366  THROW_ERROR("set_start", e.what());
1367  }
1368 }
1369 
1370 void DaeBuilder::set_start(const std::string& name, const std::vector<double>& val) {
1371  try {
1372  (*this)->set_attribute(Attribute::START, std::vector<std::string>{name}, val);
1373  } catch (std::exception& e) {
1374  THROW_ERROR("set_start", e.what());
1375  }
1376 }
1377 
1378 void DaeBuilder::set_start(const std::vector<std::string>& name, const std::vector<double>& val) {
1379  try {
1380  (*this)->set_attribute(Attribute::START, name, val);
1381  } catch (std::exception& e) {
1382  THROW_ERROR("set_start", e.what());
1383  }
1384 }
1385 
1387  try {
1388  (*this)->reset();
1389  } catch (std::exception& e) {
1390  THROW_ERROR("reset", e.what());
1391  }
1392 }
1393 
1394 void DaeBuilder::set(const std::string& name, double val) {
1395  try {
1396  (*this)->set_attribute(Attribute::VALUE, name, val);
1397  } catch (std::exception& e) {
1398  THROW_ERROR("set", e.what());
1399  }
1400 }
1401 
1402 void DaeBuilder::set(const std::string& name, const std::string& val) {
1403  try {
1404  (*this)->set_string_attribute(Attribute::STRINGVALUE, name, val);
1405  } catch (std::exception& e) {
1406  THROW_ERROR("set", e.what());
1407  }
1408 }
1409 
1410 void DaeBuilder::set(const std::vector<std::string>& name, const std::vector<double>& val) {
1411  try {
1412  (*this)->set_attribute(Attribute::VALUE, name, val);
1413  } catch (std::exception& e) {
1414  THROW_ERROR("set", e.what());
1415  }
1416 }
1417 
1418 void DaeBuilder::set(const std::vector<std::string>& name,
1419  const std::vector<std::string>& val) {
1420  try {
1421  (*this)->set_string_attribute(Attribute::STRINGVALUE, name, val);
1422  } catch (std::exception& e) {
1423  THROW_ERROR("set", e.what());
1424  }
1425 }
1426 
1427 GenericType DaeBuilder::get(const std::string& name) const {
1428  return get(std::vector<std::string>{name}).front();
1429 }
1430 
1431 std::vector<GenericType> DaeBuilder::get(const std::vector<std::string>& name) const {
1432  try {
1433  // Create a temporary FmuFunction instance
1434  Function f = create(this->name() + "_get", {}, {}, Dict{{"aux", name}});
1435  // Get the stats
1436  Dict stats = f.stats().at("aux");
1437  // Return in the same order as inputs
1438  std::vector<GenericType> ret;
1439  ret.reserve(name.size());
1440  for (const std::string& n : name) ret.push_back(stats.at(n));
1441  return ret;
1442  } catch (std::exception& e) {
1443  THROW_ERROR("get", e.what());
1444  return {};
1445  }
1446 }
1447 
1448 Sparsity DaeBuilder::jac_sparsity(const std::vector<std::string>& onames,
1449  const std::vector<std::string>& inames) const {
1450  try {
1451  return (*this)->jac_sparsity((*this)->find(onames), (*this)->find(inames));
1452  } catch (std::exception& e) {
1453  THROW_ERROR("jac_sparsity", e.what());
1454  return Sparsity(); // never reached
1455  }
1456 }
1457 
1458 } // namespace casadi
double start_time() const
Get the start time.
void when(const MX &cond, const std::vector< std::string > &eqs, const Dict &opts=Dict())
Add when equations.
bool has_fun(const std::string &name) const
Does a particular function already exist?
void register_w(const std::string &name)
std::vector< Function > fun() const
Get all functions.
void set_stop_time(double val)
Set the stop time.
casadi_int nu() const
Free controls.
double nominal(const std::string &name) const
Get the nominal value, single variable.
void set_beq(const std::string &name, const MX &val)
[DEPRECATED] Replaced by eq
void sort_z(const std::vector< std::string > &z_order)
[DEPRECATED] Use reorder("z", new_order)
void sanity_check() const
Check if dimensions match.
Function add_fun(const std::string &name, const std::vector< std::string > &arg, const std::vector< std::string > &res, const Dict &opts=Dict())
Add a function from loaded expressions.
bool has(const std::string &name) const
Check if a particular variable exists.
const std::string & name() const
Name of instance.
Definition: dae_builder.cpp:59
MX add_variable(const std::string &name, casadi_int n=1)
[DEPRECATED] Use add
std::string variability(const std::string &name) const
Get the variability.
Variable & variable(const std::string &name)
void set_value_reference(const std::string &name, casadi_int val)
casadi_int nx() const
Differential states.
void set_start(const std::string &name, double val)
Set the start attribute, single variable.
void sort_d()
[DEPRECATED] Use sort("d")
static bool test_cast(const SharedObjectInternal *ptr)
Check if a particular cast is allowed.
double tolerance() const
Get the tolerance.
std::string initial(const std::string &name) const
std::vector< casadi_int > dimension(const std::string &name) const
Get the dimensions of a variable.
Function dependent_fun(const std::string &fname, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out) const
Construct a function for evaluating dependent parameters.
double max(const std::string &name) const
Get the upper bound, single variable.
std::string unit(const std::string &name) const
void clear_all(const std::string &v)
[DEPRECATED] Use set_variability, set_causality or set_category to change variable category
std::vector< std::string > all() const
Get a list of all variables.
void set_max(const std::string &name, double val)
Set the upper bound, single variable.
std::vector< MX > quad() const
Quadrature equations.
Function oracle(bool sx=false, bool elim_w=false, bool lifted_calls=false) const
Get the (cached) oracle, SX or MX.
const MX & t() const
[DEPRECATED] Renamed "time"
MX add_t(const std::string &name="t")
[DEPRECATED] Replaced by add
std::string category(const std::string &name) const
Get the variable category.
void register_e(const std::string &name)
MX add_p(const std::string &name=std::string())
[DEPRECATED] Replaced by add
casadi_int nd() const
Dependent parameters.
void set_attribute(const std::string &a, const std::string &name, double val)
Set an attribute, single variable.
std::vector< MX > init_lhs() const
Initial conditions, left-hand-side.
void reorder(const std::string &cat, const std::vector< std::string > &v)
Reorder variables in a category.
double step_size() const
Get the step size.
MX add_c(const std::string &name, const MX &new_cdef)
[DEPRECATED] Replaced by add and eq
void gather_fun(casadi_int max_depth=-1)
Collect embedded functions from the expression graph.
const MX & time() const
Expression for independent variable (usually time)
Definition: dae_builder.cpp:63
std::string causality(const std::string &name) const
Get the causality.
casadi_int nc() const
Named constants.
bool provides_directional_derivatives() const
Does the FMU provide support for analytic derivatives.
void set_tolerance(double val)
Set the tolerance.
void register_c(const std::string &name)
void eliminate_w()
[DEPRECATED] Use eliminate("w")
void set_min(const std::string &name, double val)
Set the lower bound, single variable.
std::string assign(const std::string &name, const MX &val)
Assignment inside a when-equation or if-else equation.
void tear()
Identify iteration variables and residual equations using naming convention.
Function transition() const
Construct an event transition function, default naming.
std::vector< double > start(const std::string &name) const
Get the start attribute, single variable.
void eliminate_quad()
[DEPRECATED] Use eliminate("q")
void set_type(const std::string &name, const std::string &val)
double attribute(const std::string &a, const std::string &name) const
Get an attribute, single variable.
void set_unit(const std::string &name, const std::string &val)
std::vector< std::string > derivatives() const
Model structure: derivatives.
std::vector< std::string > e() const
[DEPRECATED] Use all("zero") *‍/
void sort(const std::string &cat)
Sort dependent parameters.
double stop_time() const
Get the stop time.
Function create() const
Create a function with standard integrator DAE signature, default naming.
double min(const std::string &name) const
Get the lower bound, single variable.
void set_display_unit(const std::string &name, const std::string &val)
std::string reinit(const std::string &name, const MX &val)
Reinitialize a state inside when-equations.
void register_z(const std::string &name)
void set_init(const std::string &name, const MX &init_rhs)
Specify the initial equation for a variable.
void add_lc(const std::string &name, const std::vector< std::string > &f_out)
Add a named linear combination of output expressions.
void eq(const MX &lhs, const MX &rhs, const Dict &opts=Dict())
Add a simple equation.
MX add_u(const std::string &name=std::string())
[DEPRECATED] Replaced by add
void set_category(const std::string &name, const std::string &val)
Set the variable category, if permitted.
casadi_int nz() const
Algebraic variables.
std::vector< MX > zero() const
Zero-crossing functions.
bool has_beq(const std::string &name) const
Does a variable have a binding equation?
std::string display_unit(const std::string &name) const
void register_u(const std::string &name)
void set_nominal(const std::string &name, double val)
Set the nominal value, single variable.
std::vector< std::string > der(const std::vector< std::string > &name) const
Get the time derivative of model variables.
void set_causality(const std::string &name, const std::string &val)
Set the causality, if permitted.
void prune(bool prune_p=true, bool prune_u=true)
Prune unused controls.
casadi_int nq() const
Quadrature states.
std::vector< MX > ydef() const
Definitions of output variables.
std::vector< std::string > pre(const std::vector< std::string > &name) const
Get the pre-variables of model variables.
std::vector< MX > alg() const
Algebraic equations.
Definition: dae_builder.cpp:91
MX add_q(const std::string &name=std::string())
[DEPRECATED] Replaced by add
MX add_y(const std::string &name, const MX &new_ydef)
[DEPRECATED] Replaced by add and eq
std::vector< MX > init_rhs() const
Initial conditions, right-hand-side.
void set_variability(const std::string &name, const std::string &val)
Set the variability, if permitted.
MX add(const std::string &name, const std::string &causality, const std::string &variability, const Dict &opts=Dict())
Add a new model variable.
bool has_t() const
Is there a time variable?
void set_start_time(double val)
Set the start time.
DaeBuilder()
Default constructor.
Definition: dae_builder.cpp:51
void set(const std::string &name, double val)
void eliminate(const std::string &cat)
Eliminate all dependent parameters.
casadi_int value_reference(const std::string &name) const
MX add_z(const std::string &name=std::string())
[DEPRECATED] Replaced by add
std::vector< std::string > export_fmu(const Dict &opts=Dict())
Export instance into an FMU.
Sparsity jac_sparsity(const std::vector< std::string > &onames, const std::vector< std::string > &inames) const
Get Jacobian sparsity.
casadi_int np() const
Parameters.
void lift(bool lift_shared=true, bool lift_calls=true)
Lift problem formulation by extracting shared subexpressions.
std::vector< MX > ode() const
Ordinary differential equations (ODE)
Definition: dae_builder.cpp:82
void sort_w()
[DEPRECATED] Use sort("w")
MX var(const std::string &name) const
void register_y(const std::string &name)
MX add_x(const std::string &name=std::string())
[DEPRECATED] Replaced by add
void register_q(const std::string &name)
size_t add_variable_new(const std::string &name, casadi_int n=1)
[DEPRECATED] Use add
casadi_int ny() const
Output variables.
const DaeBuilderInternal * operator->() const
Access a member function or object.
std::vector< MX > cdef() const
Definitions of named constants.
void set_all(const std::string &v, const std::vector< std::string > &name)
[DEPRECATED] Use set_variability, set_causality, set_category and/or reorder
void register_t(const std::string &name)
void load_fmi_description(const std::string &filename)
Import problem description from FMI or XML.
void register_x(const std::string &name)
casadi_int numel(const std::string &name) const
Get the number of elements of a variable.
void register_p(const std::string &name)
casadi_int nw() const
Dependent variables.
MX add_w(const std::string &name, const MX &new_wdef)
[DEPRECATED] Replaced by add and eq
void set_step_size(double val)
Set the step size.
std::vector< MX > ddef() const
Definitions of dependent parameters.
std::vector< std::string > outputs() const
Model structure: outputs.
std::vector< std::string > initial_unknowns() const
Model structure: initial unknowns.
void register_d(const std::string &name)
Variable & new_variable(const std::string &name, casadi_int numel=1)
[DEPRECATED] Use add
casadi_int nzero() const
Zero-crossing functions.
std::string description(const std::string &name) const
void set_initial(const std::string &name, const std::string &val)
size_t find(const std::string &name) const
void eliminate_d()
[DEPRECATED] Use eliminate("d")
MX beq(const std::string &name) const
Get the binding equation for a variable.
std::vector< std::string > y() const
Outputs *‍/.
Definition: dae_builder.cpp:73
std::string type(const std::string &name, casadi_int fmi_version=3) const
MX add_d(const std::string &name, const MX &new_ddef)
[DEPRECATED] Replaced by add and eq
std::vector< MX > wdef() const
Dependent variables and corresponding definitions.
void set_description(const std::string &name, const std::string &val)
virtual const Function & oracle() const
Get oracle.
Function object.
Definition: function.hpp:60
std::vector< Function > find_functions(casadi_int max_depth=-1) const
Get all functions embedded in the expression graphs.
Definition: function.cpp:1870
Dict stats(int mem=0) const
Get all statistics obtained at the end of the last evaluate call.
Definition: function.cpp:928
static MX sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.
SharedObjectInternal * get() const
Get a const pointer to the node.
SharedObjectInternal * operator->() const
Access a member function or object.
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
bool is_symbolic() const
Check if symbolic.
Definition: mx.cpp:766
General sparsity class.
Definition: sparsity.hpp:106
static Sparsity dense(casadi_int nrow, casadi_int ncol=1)
Create a dense rectangular sparsity pattern *.
Definition: sparsity.cpp:1012
std::vector< std::string > dyn_out()
Get output scheme of a DAE function.
Definition: integrator.cpp:236
std::vector< std::string > dyn_in()
Get input scheme of a DAE function.
Definition: integrator.cpp:232
The casadi namespace.
Definition: archiver.cpp:28
Type from_fmi2(TypeFmi2 v)
TypeFmi2 to_fmi2(Type v)
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::string to_string(TypeFmi2 v)
const double nan
Not a number.
Definition: calculus.hpp:53
std::vector< casadi_int > path(const std::vector< casadi_int > &map, casadi_int i_start)
Function external(const std::string &name, const Importer &li, const Dict &opts)
Load a just-in-time compiled external function.
Definition: external.cpp:42
std::string filename(const std::string &path)
Definition: ghc.cpp:55
Holds expressions and meta-data corresponding to a physical quantity evolving in time.
casadi_int index
Location in variable vector.
MX v
Variable expression (always a vector)