26 #include "fmu_impl.hpp"
27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
29 #include "filesystem_impl.hpp"
30 #include "archiver_impl.hpp"
31 #include "importer.hpp"
44 #define THROW_ERROR(FNAME, WHAT) \
45 throw CasadiException("Error in Fmu::" FNAME " for '" + this->name() + "' "\
46 "[" + this->class_name() + "] at " + CASADI_WHERE + ":\n"\
54 const std::vector<std::string>& scheme_in,
55 const std::vector<std::string>& scheme_out,
56 const std::map<std::string, std::vector<size_t>>& scheme,
57 const std::vector<std::string>& aux) {
61 own(
new Fmu2(
name, scheme_in, scheme_out, scheme, aux));
64 casadi_error(
"CasADi was not compiled with WITH_FMI2=ON.");
69 own(
new Fmu3(
name, scheme_in, scheme_out, scheme, aux));
72 casadi_error(
"CasADi was not compiled with WITH_FMI3=ON.");
76 casadi_error(
"Unsupported FMU API: " +
to_string(api));
82 }
catch(std::exception& e) {
83 THROW_ERROR(
"init", e.what());
96 return (*this)->alloc_mem(f);
100 (*this)->free_mem(mem);
109 static std::string
null =
"null";
112 return (*this)->name_;
118 static std::string
null =
"null";
121 return (*this)->instance_name_;
127 return (*this)->n_in();
128 }
catch(std::exception& e) {
129 THROW_ERROR(
"n_in", e.what());
135 return (*this)->n_out();
136 }
catch(std::exception& e) {
137 THROW_ERROR(
"n_out", e.what());
143 return (*this)->index_in(n);
144 }
catch(std::exception& e) {
145 THROW_ERROR(
"index_in", e.what());
151 return (*this)->index_out(n);
152 }
catch(std::exception& e) {
153 THROW_ERROR(
"index_out", e.what());
157 const std::vector<size_t>&
Fmu::ired(
size_t ind)
const {
159 return (*this)->ired_.at(ind);
160 }
catch(std::exception& e) {
161 THROW_ERROR(
"ired", e.what());
165 const std::vector<size_t>&
Fmu::ored(
size_t ind)
const {
167 return (*this)->ored_.at(ind);
168 }
catch(std::exception& e) {
169 THROW_ERROR(
"ored", e.what());
175 return (*this)->nominal_in_.at(ind);
176 }
catch(std::exception& e) {
177 THROW_ERROR(
"nominal_in", e.what());
183 return (*this)->nominal_out_.at(ind);
184 }
catch(std::exception& e) {
185 THROW_ERROR(
"nominal_out", e.what());
191 return (*this)->min_in_.at(ind);
192 }
catch(std::exception& e) {
193 THROW_ERROR(
"min_in", e.what());
199 return (*this)->max_in_.at(ind);
200 }
catch(std::exception& e) {
201 THROW_ERROR(
"max_in", e.what());
207 return (*this)->all_nominal_in(ind);
208 }
catch(std::exception& e) {
209 THROW_ERROR(
"all_nominal_in", e.what());
215 return (*this)->all_nominal_out(ind);
216 }
catch(std::exception& e) {
217 THROW_ERROR(
"all_nominal_out", e.what());
223 return (*this)->desc_in(m,
id, more);
224 }
catch(std::exception& e) {
225 THROW_ERROR(
"desc_in", e.what());
231 return (*this)->provides_directional_derivatives_;
232 }
catch(std::exception& e) {
233 THROW_ERROR(
"provides_directional_derivatives", e.what());
239 return (*this)->provides_adjoint_derivatives_;
240 }
catch(std::exception& e) {
241 THROW_ERROR(
"provides_adjoint_derivatives", e.what());
247 return (*this)->can_be_instantiated_only_once_per_process_;
248 }
catch(std::exception& e) {
249 THROW_ERROR(
"can_be_instantiated_only_once_per_process", e.what());
254 const std::vector<size_t>& isub)
const {
256 return (*this)->jac_sparsity(osub, isub);
257 }
catch(std::exception& e) {
258 THROW_ERROR(
"jac_sparsity", e.what());
264 return (*this)->hess_sparsity(r, c);
265 }
catch(std::exception& e) {
266 THROW_ERROR(
"hess_sparsity", e.what());
272 return (*this)->init_mem(m);
273 }
catch(std::exception& e) {
274 THROW_ERROR(
"init_mem", e.what());
281 (*this)->free_instance(instance);
282 }
catch(std::exception& e) {
283 THROW_ERROR(
"free_instance", e.what());
289 (*this)->set(m, ind, value);
290 }
catch(std::exception& e) {
291 THROW_ERROR(
"set", e.what());
297 (*this)->request(m, ind);
298 }
catch(std::exception& e) {
299 THROW_ERROR(
"request", e.what());
305 return (*this)->eval(m);
306 }
catch(std::exception& e) {
307 THROW_ERROR(
"eval", e.what());
313 (*this)->
get(m,
id, value);
314 }
catch(std::exception& e) {
315 THROW_ERROR(
"get", e.what());
321 (*this)->set_fwd(m, nseed,
id, v);
322 }
catch(std::exception& e) {
323 THROW_ERROR(
"set_fwd", e.what());
329 (*this)->set_fwd(m, ind, v);
330 }
catch(std::exception& e) {
331 THROW_ERROR(
"set_fwd", e.what());
336 const casadi_int* wrt_id)
const {
338 (*this)->request_fwd(m, nsens,
id, wrt_id);
339 }
catch(std::exception& e) {
340 THROW_ERROR(
"request_fwd", e.what());
346 (*this)->request_fwd(m, ind);
347 }
catch(std::exception& e) {
348 THROW_ERROR(
"request_fwd", e.what());
354 return (*this)->eval_fwd(m, independent_seeds);
355 }
catch(std::exception& e) {
356 THROW_ERROR(
"eval_fwd", e.what());
362 (*this)->get_fwd(m, nsens,
id, v);
363 }
catch(std::exception& e) {
364 THROW_ERROR(
"get_fwd", e.what());
370 (*this)->get_fwd(m, ind, v);
371 }
catch(std::exception& e) {
372 THROW_ERROR(
"get_fwd", e.what());
378 (*this)->set_adj(m, nseed,
id, v);
379 }
catch(std::exception& e) {
380 THROW_ERROR(
"set_adj", e.what());
386 (*this)->set_adj(m, ind, v);
387 }
catch(std::exception& e) {
388 THROW_ERROR(
"set_adj", e.what());
393 const casadi_int* wrt_id)
const {
395 (*this)->request_adj(m, nsens,
id, wrt_id);
396 }
catch(std::exception& e) {
397 THROW_ERROR(
"request_adj", e.what());
403 (*this)->request_adj(m, ind);
404 }
catch(std::exception& e) {
405 THROW_ERROR(
"request_adj", e.what());
411 return (*this)->eval_adj(m);
412 }
catch(std::exception& e) {
413 THROW_ERROR(
"eval_adj", e.what());
419 (*this)->get_adj(m, nsens,
id, v);
420 }
catch(std::exception& e) {
421 THROW_ERROR(
"get_adj", e.what());
427 (*this)->get_adj(m, ind, v);
428 }
catch(std::exception& e) {
429 THROW_ERROR(
"get_adj", e.what());
434 const std::vector<std::string>& name_in,
const InputStruct* in)
const {
436 (*this)->get_stats(m, stats, name_in, in);
437 }
catch(std::exception& e) {
438 THROW_ERROR(
"get_stats", e.what());
443 const std::vector<std::string>& scheme_in,
444 const std::vector<std::string>& scheme_out,
445 const std::map<std::string, std::vector<size_t>>& scheme,
446 const std::vector<std::string>& aux)
447 : name_(name), scheme_in_(scheme_in), scheme_out_(scheme_out), scheme_(scheme), aux_(aux) {
470 std::vector<bool> lookup(dae->
n_variables(),
false);
472 casadi_assert(
scheme_.find(n) !=
scheme_.end(),
"Unsupported input: '" + n +
"'");
473 for (
size_t i :
scheme_.at(n)) {
474 casadi_assert(!lookup.at(i),
"Duplicate variable: " + dae->
variable(i).
name);
480 iind_.reserve(numel);
482 for (
size_t k = 0; k < lookup.size(); ++k) {
492 std::fill(lookup.begin(), lookup.end(),
false);
494 casadi_assert(
scheme_.find(n) !=
scheme_.end(),
"Unsupported output: '" + n +
"'");
495 for (
size_t i :
scheme_.at(n)) {
496 casadi_assert(!lookup.at(i),
"Duplicate variable: " + dae->
variable(i).
name);
502 oind_.reserve(numel);
504 for (
size_t k = 0; k < lookup.size(); ++k) {
514 for (
size_t i = 0; i <
ired_.size(); ++i) {
516 ired_[i].resize(s.size());
517 for (
size_t k = 0; k < s.size(); ++k) {
523 for (
size_t i = 0; i <
ored_.size(); ++i) {
525 ored_[i].resize(s.size());
526 for (
size_t k = 0; k < s.size(); ++k) {
540 for (
size_t i :
iind_) {
548 if (i != 0) casadi_error(
"Independent variable must be the first model variable");
559 for (
size_t i :
oind_) {
587 const unsigned int* vr_in,
size_t n_in,
const double* seed,
size_t n_seed,
588 double* sensitivity,
size_t n_sensitivity)
const {
589 casadi_error(
"Adjoint derivatives not supported for " +
class_name());
601 std::replace(instance_name_no_dot.begin(), instance_name_no_dot.end(),
'.',
'_');
613 casadi_error(
"FmuInternal::set_values failed");
617 casadi_error(
"FmuInternal::enter_initialization_mode failed");
623 size_t n_vr =
vr_in_.size();
638 if (
get_real(c, vr, n_vr, value, n_value)) {
639 casadi_error(
"FmuInternal::get_in failed");
645 casadi_error(
"FmuInternal::get_aux failed");
667 for (
size_t i = 0; i <
scheme_in_.size(); ++i) {
671 casadi_error(
"No such input: " + n);
681 casadi_error(
"No such output: " + n);
686 const std::vector<size_t>& isub)
const {
688 std::vector<casadi_int> osub1(osub.begin(), osub.end());
689 std::vector<casadi_int> isub1(isub.begin(), isub.end());
691 std::vector<casadi_int> mapping;
697 const std::vector<size_t>& c)
const {
699 std::vector<casadi_int> r1(r.begin(), r.end());
700 std::vector<casadi_int> c1(c.begin(), c.end());
702 std::vector<casadi_int> mapping;
708 auto&& ind =
ired_.at(i);
709 std::vector<double> n;
710 n.reserve(ind.size());
711 for (
size_t k : ind) n.push_back(
nominal_in_.at(k));
716 auto&& ind =
ored_.at(i);
717 std::vector<double> n;
718 n.reserve(ind.size());
727 #elif defined(__APPLE__)
739 std::string compiler_plugin =
"shell";
740 std::vector<std::string> include_dirs;
741 for (
auto&& op : opts) {
742 if (op.first ==
"compiler") {
743 compiler_plugin = op.second.to_string();
744 }
else if (op.first ==
"compiler_options") {
745 compiler_opts = op.second;
746 }
else if (op.first ==
"include_dirs") {
747 include_dirs = op.second.to_string_vector();
749 casadi_error(
"No such option: " + op.first);
753 std::vector<std::string> csources;
754 for (
auto&& kv : files) {
755 const std::string& local = kv.first;
756 if (local.size() > 2 && local.substr(local.size() - 2) ==
".c") csources.push_back(local);
762 std::string amalg = name +
"_all.c";
765 for (
const std::string& c : csources) *f <<
"#include \"" << c <<
"\"\n";
770 Dict cop = compiler_opts;
771 if (!include_dirs.empty()) cop[
"include_dirs"] = include_dirs;
772 Importer compiler(amalg, compiler_plugin, cop);
787 "pack_fmu requires libzip. Compile CasADi with WITH_LIBZIP=ON.");
790 std::vector<std::pair<std::string, std::string>> entries;
791 for (
auto&& kv : files) {
792 std::string arc = kv.second.to_string();
793 if (arc.substr(0, 2) ==
"./") arc = arc.substr(2);
794 entries.push_back({kv.first, arc});
796 std::string out =
path;
797 if (out.size() < 4 || out.substr(out.size() - 4) !=
".fmu") out +=
".fmu";
799 "Packing FMU '" + out +
"' failed.");
809 std::stringstream ss;
829 if (
eval_fd(m, independent_seeds))
return 1;
838 if (m->
id_in_.size() == 0)
return 0;
842 std::fill(m->
d_in_.begin(), m->
d_in_.end(), 0);
850 casadi_warning(
"FMU adjoint derivative failed");
855 auto it = m->
d_in_.begin();
856 for (
size_t id : m->
id_in_) {
865 size_t n_known = m->
id_in_.size();
866 size_t n_unknown = m->
id_out_.size();
868 if (n_unknown == 0)
return 0;
876 casadi_warning(
"FMU evaluation failed");
885 casadi_warning(
"FMU directional derivative failed");
889 auto it = m->
d_out_.begin();
899 size_t n_known = m->
id_in_.size();
900 size_t n_unknown = m->
id_out_.size();
902 if (n_unknown == 0)
return 0;
910 casadi_warning(
"Evaluating FMU failed");
920 m->
fd_out_.resize(n_points * n_unknown);
926 m->
flip_.resize(n_known);
927 size_t first_flip = -1;
928 for (
size_t i = 0; i < n_known; ++i) {
943 if (first_flip ==
size_t(-1)) first_flip = i;
947 if (first_flip !=
size_t(-1) && !independent_seeds) {
949 for (
size_t i = 0; i < n_known; ++i) {
955 "Cannot perturb both " +
vn_in_[
id] +
" and " +
vn_in_[first_flip]);
962 const double* yk_all[5] = {
nullptr};
965 for (casadi_int k = 0; k < n_points; ++k) {
967 double* yk = &m->
fd_out_[n_unknown * k];
968 casadi_assert_dev(k < 5);
976 double pert = (k - offset) * m->
self.
step_;
978 for (
size_t i = 0; i < n_known; ++i) {
991 if (
get_all(m, yk, n_unknown))
return 1;
993 if (independent_seeds) {
994 for (
size_t i = 0; i < n_unknown; ++i) {
998 size_t wrt_id = m->
wrt_.at(
id);
1001 for (wrt_i = 0; wrt_i < n_known; ++wrt_i) {
1002 if (m->
id_in_[wrt_i] == wrt_id)
break;
1024 if (!independent_seeds) {
1026 for (
size_t ind = 0; ind < m->
id_out_.size(); ++ind) {
1033 for (
size_t ind = 0; ind < m->
id_out_.size(); ++ind) {
1037 size_t wrt = m->
wrt_[id];
1040 for (wrt_i = 0; wrt_i < n_known; ++wrt_i) {
1041 if (m->
id_in_[wrt_i] == wrt)
break;
1046 double d_fd = m->
d_out_[ind] * n;
1048 if (m->
flip_[wrt_i]) d_fd = -d_fd;
1052 double d_ad = m->
osens_[id];
1057 bool d_is_nan = d_ad != d_ad;
1059 double d_max = std::fmax(std::fabs(d_fd), std::fabs(d_ad));
1062 && std::fabs(d_ad - d_fd) > d_max * m->
self.
reltol_)) {
1064 double off = m->
fd_out_.at(ind + offset * n_unknown);
1066 std::stringstream ss;
1069 ss << (d_is_nan ?
"NaN" :
"Inconsistent") <<
" derivatives of " <<
vn_out_[
id]
1070 <<
" w.r.t. " <<
desc_in(m, wrt) <<
", got " << d_ad
1073 ss <<
"\nValues for step size " << h <<
": " << (n * off) <<
" + [";
1074 for (casadi_int k = 0; k < n_points; ++k) {
1075 if (k > 0) ss <<
", ";
1076 ss << (n * (m->
fd_out_.at(ind + k * n_unknown) - off));
1080 casadi_warning(ss.str());
1085 ss <<
vn_in_[wrt] <<
" ";
1087 ss << m->
ibuf_[wrt] <<
" ";
1104 for (casadi_int k = 0; k < n_points; ++k) {
1105 if (k > 0) ss <<
",";
1106 ss << (n * (m->
fd_out_.at(ind + k * n_unknown) - off));
1108 ss <<
"]" << std::endl;
1111 std::ios_base::app);
1112 std::ostream& valfile = *valfile_ptr;
1113 valfile << ss.str();
1126 for (casadi_int i = 0; i < nsens; ++i) {
1127 *v++ = m->
osens_.at(*
id++);
1135 for (
size_t id :
ored_[ind]) {
1136 casadi_int id2 = id;
1142 const casadi_int*
id,
const double* v)
const {
1143 for (casadi_int i = 0; i < nseed; ++i) {
1157 for (
size_t id :
ored_[ind]) {
1158 casadi_int id2 = id;
1164 const casadi_int* wrt_id)
const {
1165 for (casadi_int i = 0; i < nsens; ++i) {
1167 m->
wrt_.at(*
id) = wrt_id ? *wrt_id++ : -1;
1174 casadi_int wrt_id = -1;
1175 for (
size_t id :
ired_[ind]) {
1176 casadi_int id2 = id;
1182 for (casadi_int i = 0; i < nsens; ++i) {
1183 *v++ = m->
isens_.at(*
id++);
1191 for (
size_t id :
ired_[ind]) {
1192 casadi_int id2 = id;
1200 const size_t max_update_iter = 10;
1201 for (
size_t update_iter = 0; update_iter < max_update_iter; ++update_iter) {
1203 casadi_warning(
"update_discrete_states");
1210 casadi_warning(
"Discrete state update not implemented");
1216 casadi_warning(
"Terminate simulation not implemented");
1222 casadi_warning(
"Nominals of continuous states not implemented");
1228 casadi_warning(
"Values of continuous states not implemented");
1234 casadi_warning(
"Next event time not implemented");
1243 casadi_warning(
"Discrete state update failed");
1249 casadi_assert(m->
instance ==
nullptr,
"Already instantiated");
1254 casadi_warning(
"FmuInternal::set_values failed");
1272 size_t max_io = std::max(
iind_.size(),
oind_.size());
1274 m->
isens_.resize(max_io);
1277 m->
osens_.resize(max_io);
1286 m->
wrt_.resize(max_io);
1294 for (
size_t id :
ired_[ind]) {
1295 if (*value != m->
ibuf_.at(
id)) {
1296 m->
ibuf_.at(
id) = *value;
1303 for (
size_t id :
ired_[ind]) {
1304 if (0 != m->
ibuf_.at(
id)) {
1305 m->
ibuf_.at(
id) = 0;
1313 for (
size_t id :
ored_[ind]) {
1317 m->
wrt_.at(
id) = -1;
1323 if (n_values == 0)
return 0;
1326 size_t n_vr = m->
vr_in_.size();
1337 if (n_vr == 0)
return 0;
1342 casadi_warning(
"Setting FMU variables failed");
1351 if (n_values == 0)
return 0;
1354 casadi_warning(
"Evaluation failed");
1369 auto it = m->
v_out_.begin();
1370 for (
size_t id : m->
id_out_) {
1371 m->
obuf_[id] = *it++;
1379 for (
size_t id :
ored_[ind]) {
1380 *value++ = m->
obuf_.at(
id);
1385 const casadi_int*
id,
const double* v)
const {
1386 for (casadi_int i = 0; i < nseed; ++i) {
1400 for (
size_t id :
ired_[ind]) {
1401 casadi_int id2 = id;
1407 const casadi_int* wrt_id)
const {
1408 for (casadi_int i = 0; i < nsens; ++i) {
1410 m->
wrt_.at(*
id) = *wrt_id++;
1417 casadi_int wrt_id = -1;
1418 for (
size_t id :
ored_[ind]) {
1419 casadi_int id2 = id;
1429 for (
size_t id = 0;
id < m->
imarked_.size(); ++id) {
1441 for (
size_t id = 0;
id < m->
omarked_.size(); ++id) {
1455 size_t n_unknown = m->
id_out_.size();
1458 for (
size_t id : m->
id_in_) {
1463 m->
v_out_.resize(n_unknown);
1464 m->
d_out_.resize(n_unknown);
1471 size_t n_known = m->
id_in_.size();
1474 for (
size_t id : m->
id_out_) {
1479 m->
v_in_.resize(n_known);
1480 m->
d_in_.resize(n_known);
1484 (*this)->serialize(s);
1543 s.
pack(
"FmuInternal::can_be_instantiated_only_once_per_process",
1546 s.
pack(
"FmuInternal::nx",
nx_);
1587 s.
unpack(
"FmuInternal::can_be_instantiated_only_once_per_process",
1601 casadi_error(
"CasADi was not compiled with WITH_FMI2=ON.");
1607 casadi_error(
"CasADi was not compiled with WITH_FMI2=ON.");
1610 casadi_error(
"Cannot deserialize type '" +
class_name +
"'");
Sparsity jac_sparsity(const std::vector< size_t > &oind, const std::vector< size_t > &iind) const
Get Jacobian sparsity.
size_t n_variables() const
Length of variables array.
bool provides_directional_derivatives_
std::string instantiation_token_
std::string generation_tool_
std::string model_identifier_
Variable & variable(size_t ind)
bool can_be_instantiated_only_once_per_process_
bool provides_adjoint_derivatives_
size_t size(Category cat) const
Number of indices with a particular category.
Sparsity hess_sparsity(const std::vector< size_t > &oind, const std::vector< size_t > &iind) const
Get what is known of the Hessian sparsity.
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
void version(const std::string &name, int v)
static std::string absolute(const std::string &path)
static void copy_file(const std::string &src, const std::string &dest)
static std::unique_ptr< std::ostream > ofstream_ptr(const std::string &path, std::ios_base::openmode mode=std::ios_base::out)
static bool remove(const std::string &path)
Interface to a binary FMU, adhering to FMI version 2.0.
static Fmu2 * deserialize(DeserializingStream &s)
Interface to a binary FMU, adhering to FMI version 2.0.
static Fmu3 * deserialize(DeserializingStream &s)
static std::string dll_infix()
std::string validate_ad_file_
bool uses_directional_derivatives_
bool warning_fired_values_of_continuous_states_changed_
std::vector< std::string > scheme_out_
std::string instantiation_token_
std::vector< double > max_in_
bool warning_fired_next_event_time_defined_
std::string name_
Instance name.
virtual int get_directional_derivative(void *instance, const unsigned int *vr_out, size_t n_out, const unsigned int *vr_in, size_t n_in, const double *seed, size_t n_seed, double *sensitivity, size_t n_sensitivity) const =0
bool provides_adjoint_derivatives_
virtual int set_time(void *instance, double t) const =0
bool warning_fired_nominals_of_continuous_states_changed_
std::vector< double > all_nominal_in(size_t i) const
Retreive nominal values.
std::vector< unsigned int > vr_out_
std::string desc_in(FmuMemory *m, size_t id, bool more=true) const
virtual void free_instance(void *c) const =0
std::vector< std::string > vn_out_
void set(FmuMemory *m, size_t ind, const double *value) const
std::vector< size_t > iind_
void serialize(SerializingStream &s) const
void disp(std::ostream &stream, bool more) const override
Print.
FmuInternal(const std::string &name, const std::vector< std::string > &scheme_in, const std::vector< std::string > &scheme_out, const std::map< std::string, std::vector< size_t >> &scheme, const std::vector< std::string > &aux)
std::vector< std::vector< size_t > > ired_
std::vector< std::string > aux_
std::vector< std::vector< size_t > > ored_
std::map< std::string, std::vector< size_t > > scheme_
unsigned int independent_vr_
int discrete_states_iter(void *instance) const
virtual void serialize_body(SerializingStream &s) const
virtual int get_aux(void *instance)=0
bool warning_fired_terminate_simulation_
bool warning_fired_discrete_states_need_update_
void get_adj(FmuMemory *m, casadi_int nsens, const casadi_int *id, double *v) const
void gather_fwd(FmuMemory *m) const
std::vector< double > nominal_out_
void request(FmuMemory *m, size_t ind) const
int get_all(FmuMemory *m, double *values, size_t n_values) const
void gather_io(FmuMemory *m) const
int eval_fd(FmuMemory *m, bool independent_seeds) const
std::vector< std::string > vn_in_
std::vector< size_t > oind_
virtual void load_functions()=0
~FmuInternal() override
Destructor.
virtual int update_discrete_states(void *instance, EventMemory *eventmem) const =0
static FmuInternal * deserialize(DeserializingStream &s)
void set_fwd(FmuMemory *m, casadi_int nseed, const casadi_int *id, const double *v) const
virtual void serialize_type(SerializingStream &s) const
void request_adj(FmuMemory *m, casadi_int nsens, const casadi_int *id, const casadi_int *wrt_id) const
std::vector< unsigned int > vr_in_
virtual void * instantiate() const =0
virtual int exit_initialization_mode(void *instance) const =0
virtual int get_adjoint_derivative(void *instance, const unsigned int *vr_out, size_t n_out, const unsigned int *vr_in, size_t n_in, const double *seed, size_t n_seed, double *sensitivity, size_t n_sensitivity) const
virtual int set_values(void *instance) const =0
std::vector< double > min_out_
bool can_be_instantiated_only_once_per_process_
int set_all(FmuMemory *m, const double *values, size_t n_values) const
int eval_ad(FmuMemory *m) const
std::vector< double > nominal_in_
std::vector< double > max_out_
static std::string pack_fmu(const Dict &files, const std::string &path)
size_t index_out(const std::string &n) const
bool do_evaluation_dance_
std::string resource_loc_
std::vector< double > min_in_
static std::string dll_suffix()
void set_adj(FmuMemory *m, casadi_int nseed, const casadi_int *id, const double *v) const
std::vector< double > value_in_
void get(FmuMemory *m, size_t id, double *value) const
virtual int set_real(void *instance, const unsigned int *vr, size_t n_vr, const double *values, size_t n_values) const =0
casadi_int number_of_event_indicators_
std::vector< double > all_nominal_out(size_t i) const
Retreive nominal values.
int eval_fwd(FmuMemory *m, bool independent_seeds) const
virtual void init(const DaeBuilderInternal *dae)
void get_fwd(FmuMemory *m, casadi_int nsens, const casadi_int *id, double *v) const
void gather_adj(FmuMemory *m) const
virtual int init_mem(FmuMemory *m) const
Initalize memory block.
virtual int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values, FmuMemory *m=nullptr) const =0
virtual int enter_continuous_time_mode(void *instance) const =0
size_t index_in(const std::string &n) const
void request_fwd(FmuMemory *m, casadi_int nsens, const casadi_int *id, const casadi_int *wrt_id) const
virtual int enter_initialization_mode(void *instance) const =0
Sparsity hess_sparsity(const std::vector< size_t > &r, const std::vector< size_t > &c) const
std::vector< size_t > oind_map_
Sparsity jac_sparsity(const std::vector< size_t > &osub, const std::vector< size_t > &isub) const
std::vector< std::string > scheme_in_
std::string instance_name_
bool provides_directional_derivatives_
static Dict compile_fmu(const std::string &name, const Dict &files, const Dict &opts)
virtual std::string system_infix() const =0
int eval_adj(FmuMemory *m) const
int eval(FmuMemory *m) const
std::vector< size_t > iind_map_
void set(FmuMemory *m, size_t ind, const double *value) const
void get_fwd(FmuMemory *m, casadi_int nsens, const casadi_int *id, double *v) const
const std::vector< size_t > & ored(size_t ind) const
static Fmu deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
size_t index_out(const std::string &n) const
int eval_adj(FmuMemory *m) const
Fmu()
Default constructor.
double nominal_out(size_t ind) const
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const
Get stats.
Sparsity hess_sparsity(const std::vector< size_t > &r, const std::vector< size_t > &c) const
bool can_be_instantiated_only_once_per_process() const
Does the FMU declare restrictions on instantiation?
std::vector< double > all_nominal_out(size_t ind) const
bool provides_adjoint_derivatives() const
Does the FMU provide support for adjoint directional derivatives.
Sparsity jac_sparsity(const std::vector< size_t > &osub, const std::vector< size_t > &isub) const
int eval_fwd(FmuMemory *m, bool independent_seeds) const
double nominal_in(size_t ind) const
size_t index_in(const std::string &n) const
FmuMemory * alloc_mem(const FmuFunction &f) const
Create memory block.
void get_adj(FmuMemory *m, casadi_int nsens, const casadi_int *id, double *v) const
double max_in(size_t ind) const
const std::string & name() const
Name of the instance.
void set_fwd(FmuMemory *m, casadi_int nseed, const casadi_int *id, const double *v) const
static Fmu create(FmuInternal *node)
Create from node.
size_t n_out() const
Get the number of scheme outputs.
const std::string & instance_name() const
Name of the FMU.
std::vector< double > all_nominal_in(size_t ind) const
double min_in(size_t ind) const
void free_mem(void *mem) const
Free memory block.
FmuInternal * get() const
FmuInternal * operator->()
void set_adj(FmuMemory *m, casadi_int nseed, const casadi_int *id, const double *v) const
int init_mem(FmuMemory *m) const
Initalize memory block.
bool provides_directional_derivatives() const
Does the FMU provide support for forward directional derivatives.
int eval(FmuMemory *m) const
const std::vector< size_t > & ired(size_t ind) const
void request_adj(FmuMemory *m, casadi_int nsens, const casadi_int *id, const casadi_int *wrt_id) const
size_t n_in() const
Get the number of scheme inputs.
void free_instance(void *instance) const
void request(FmuMemory *m, size_t ind) const
void request_fwd(FmuMemory *m, casadi_int nsens, const casadi_int *id, const casadi_int *wrt_id) const
std::string desc_in(FmuMemory *m, size_t id, bool more=true) const
void serialize(SerializingStream &s) const
Serialize an object.
SharedObjectInternal * get() const
Get a const pointer to the node.
bool is_null() const
Is a null pointer?
void own(SharedObjectInternal *node)
SharedObjectInternal * operator->() const
Access a member function or object.
std::string library() const
Get library name.
static bool has_plugin(const std::string &pname, bool verbose=false)
Check if a plugin is available or can be loaded.
static Plugin & getPlugin(const std::string &pname)
Load and get the creator function.
const std::string & path() const
Get path for a consumer.
Helper class for Serialization.
void version(const std::string &name, int v)
void pack(const Sparsity &e)
Serializes an object to the output stream.
virtual std::string class_name() const =0
Readable name of the internal class.
Sparsity sub(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, std::vector< casadi_int > &mapping, bool ind1=false) const
Get a submatrix.
const double eps
Machine epsilon.
casadi_int n_fd_points(FdMode v)
Length of FD stencil, including unperturbed input.
casadi_int fd_offset(FdMode v)
Offset for FD stencil, i.e. index of unperturbed input.
double sign(double x)
Sign function, note that sign(nan) == nan.
void casadi_copy(const T1 *x, casadi_int n, T1 *y)
COPY: y <-x.
std::string str(const T &v)
String representation, any type.
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.
T * get_ptr(std::vector< T > &v)
Get a pointer to the data contained in the vector.
CASADI_EXPORT void finite_diff(FdMode v, const T1 **yk, T1 *J, T1 h, casadi_int n_y, T1 smoothing)
Calculate FD estimate.
std::vector< casadi_int > path(const std::vector< casadi_int > &map, casadi_int i_start)
bool discrete_states_need_update
bool terminate_simulation
bool next_event_time_defined
bool nominals_of_continuous_states_changed
bool values_of_continuous_states_changed
std::vector< double > d_in_
std::vector< size_t > id_in_
std::vector< double > obuf_
std::vector< double > isens_
std::vector< bool > in_bounds_
std::vector< double > osens_
std::vector< size_t > wrt_
std::vector< double > d_out_
std::vector< unsigned int > vr_in_
std::vector< double > v_out_
std::vector< bool > flip_
std::vector< double > v_pert_
std::vector< size_t > id_out_
std::vector< double > fd_out_
std::vector< bool > omarked_
std::vector< double > v_in_
std::vector< double > ibuf_
std::vector< bool > imarked_
std::vector< unsigned int > vr_out_
Holds expressions and meta-data corresponding to a physical quantity evolving in time.
std::string name
Name of the variable.
unsigned int value_reference