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());
116 std::vector<SXElem> get_output(
const std::vector<casadi_int>& oind)
const override {
117 std::vector<SXElem> ret;
118 ret.reserve(oind.size());
119 for (casadi_int i : oind) {
121 if (!cache_.incache(i, output)) {
122 output.own(
new OutputSX(SXNode::shared_from_this(), i));
124 cache_.tocache_if_missing(i, output,
false);
126 ret.push_back(SXElem::create(output.get()));
135 const SXElem& dep(casadi_int i)
const override {
return dep_[i];}
136 SXElem& dep(casadi_int i)
override {
return dep_[i];}
141 casadi_int op()
const override {
return OP_CALL; }
146 bool is_call()
const override {
return true; }
151 bool has_output()
const override {
return true; }
156 Function which_function()
const override {
return f_; }
161 std::string print(
const std::string& arg1,
const std::string& arg2)
const override {
170 std::vector<SXElem> dep_;
172 void serialize_node(SerializingStream& s)
const override {
173 s.pack(
"CallSX::f", f_);
174 s.pack(
"CallSX::dep", dep_);
177 static SXNode* deserialize(DeserializingStream& s) {
178 std::vector<SXElem> dep;
180 s.unpack(
"CallSX::f", f);
181 s.unpack(
"CallSX::dep", dep);
182 return new CallSX(f, dep);