26 #ifndef CASADI_CALL_SX_HPP
27 #define CASADI_CALL_SX_HPP
29 #include "sx_node.hpp"
30 #include "output_sx.hpp"
31 #include "function.hpp"
36 #include <unordered_map>
37 #define CACHING_MAP std::unordered_map
42 class CASADI_EXPORT CallSX :
public SXNode {
48 CallSX(
const Function& f,
const std::vector<SXElem>& dep) :
51 mutable WeakCache<casadi_int, SharedSXElem> cache_;
57 inline static SXElem create(
const Function& f,
const std::vector<SXElem>& dep) {
58 casadi_assert(f.nnz_in()==dep.size(),
59 "CallSX::create(f,dep): dimension mismatch: " + str(f.nnz_in()) +
" vs " + str(dep.size()));
60 return SXElem::create(
new CallSX(f, dep));
63 inline static int eval_sx(
const Function& f,
const SXElem** arg, SXElem** res) {
65 std::vector<SXElem> dep;
66 for (casadi_int i=0;i<f.n_in();++i) {
67 dep.insert(dep.end(), arg[i], arg[i]+f.nnz_in(i));
70 std::vector<SXElem> ret = SXElem::call(f, dep);
73 casadi_int offset = 0;
74 for (casadi_int i=0;i<f.n_out();++i) {
75 casadi_copy(get_ptr(ret)+offset, f.nnz_out(i), res[i]);
76 offset += f.nnz_out(i);
90 safe_delete(d.assignNoDelete(casadi_limits<SXElem>::nan));
94 std::string class_name()
const override {
return "CallSX";}
96 bool is_op(casadi_int op)
const override {
return OP_CALL==op; }
101 casadi_int n_dep()
const override {
return dep_.size();}
106 SXElem get_output(casadi_int oind)
const override {
109 if (!cache_.incache(oind, ret)) {
110 ret.own(
new OutputSX(SXNode::shared_from_this(), oind));
111 cache_.tocache_if_missing(oind, ret);
113 return SXElem::create(ret.get());
119 const SXElem& dep(casadi_int i)
const override {
return dep_[i];}
120 SXElem& dep(casadi_int i)
override {
return dep_[i];}
125 casadi_int op()
const override {
return OP_CALL; }
130 bool is_call()
const override {
return true; }
135 bool has_output()
const override {
return true; }
140 Function which_function()
const override {
return f_; }
145 std::string print(
const std::string& arg1,
const std::string& arg2)
const override {
154 std::vector<SXElem> dep_;
156 void serialize_node(SerializingStream& s)
const override {
157 s.pack(
"CallSX::f", f_);
158 s.pack(
"CallSX::dep", dep_);
161 static SXNode* deserialize(DeserializingStream& s) {
162 std::vector<SXElem> dep;
164 s.unpack(
"CallSX::f", f);
165 s.unpack(
"CallSX::dep", dep);
166 return new CallSX(f, dep);