getnonzeros_param.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 "getnonzeros_param.hpp"
27 #include "casadi_misc.hpp"
28 #include "serializing_stream.hpp"
29 
30 namespace casadi {
31 
32  MX GetNonzerosParam::create(const MX& x, const MX& nz) {
33  // No elements at all
34  if (nz.nnz()==0) return MX::zeros(nz.sparsity());
35  return MX::create(new GetNonzerosParamVector(x, nz));
36  }
37 
38  MX GetNonzerosParam::create(const MX& x, const MX& inner, const Slice& outer) {
39  casadi_assert(inner.is_vector() && inner.is_dense(), "inner must be dense vector");
41  Sparsity::dense(inner.numel(), outer.size()), x, inner, outer));
42  }
43 
44  MX GetNonzerosParam::create(const MX& x, const Slice& inner, const MX& outer) {
45  casadi_assert(outer.is_vector() && outer.is_dense(), "outer must be dense vector");
47  Sparsity::dense(inner.size(), outer.numel()), x, inner, outer));
48  }
49 
50  MX GetNonzerosParam::create(const MX& x, const MX& inner, const MX& outer) {
51  casadi_assert(outer.is_vector() && outer.is_dense(), "outer must be dense vector");
52  casadi_assert(inner.is_vector() && inner.is_dense(), "inner must be dense vector");
54  Sparsity::dense(inner.numel(), outer.numel()), x, inner, outer));
55  }
56 
57  GetNonzerosParam::GetNonzerosParam(const Sparsity& sp, const MX& y, const MX& nz) {
58  set_sparsity(sp);
59  set_dep(y, nz);
60  }
61 
63  const MX& nz, const MX& nz_extra) {
64  set_sparsity(sp);
65  set_dep(y, nz, nz_extra);
66  }
67 
69  eval(const double** arg, double** res, casadi_int* iw, double* w) const {
70  const double* idata = arg[0];
71  const double* nz = arg[1];
72  double* odata = res[0];
73  // Dimensions
74  casadi_int nnz = dep(1).nnz();
75  casadi_int max_ind = dep(0).nnz();
76  // Get elements
77  for (casadi_int i=0; i<nnz; ++i) {
78  // Get index
79  casadi_int index = static_cast<casadi_int>(*nz++);
80  // Make assignment if in bounds, else NaN
81  *odata++ = index>=0 && index<max_ind ? idata[index] : nan;
82  }
83  return 0;
84  }
85 
87  return dep(1).nnz();
88  }
89 
90  int GetNonzerosParamSlice::eval(const double** arg, double** res,
91  casadi_int* iw, double* w) const {
92  const double* idata = arg[0];
93  const double* nz = arg[1];
94  double* odata = res[0];
95 
96  // Dimensions
97  casadi_int nnz = dep(1).nnz();
98  casadi_int max_ind = dep(0).nnz();
99 
100  casadi_int* inner = iw; iw += nnz;
101  for (casadi_int i=0; i<nnz; ++i) {
102  // Get index
103  inner[i] = static_cast<casadi_int>(*nz++);
104  }
105  // Get elements
106  for (casadi_int i=outer_.start;i<outer_.stop;i+= outer_.step) {
107  // Get index
108  for (casadi_int* inner_it=inner; inner_it!=inner+nnz; ++inner_it) {
109  casadi_int index = i+*inner_it;
110  // Make assignment if in bounds, else NaN
111  *odata++ = index>=0 && index<max_ind ? idata[index] : nan;
112  }
113  }
114  return 0;
115  }
116 
118  eval(const double** arg, double** res, casadi_int* iw, double* w) const {
119  const double* idata = arg[0];
120  const double* nz = arg[1];
121  double* odata = res[0];
122  // Dimensions
123  casadi_int nnz = dep(1).nnz();
124  casadi_int max_ind = dep(0).nnz();
125  // Get elements
126  for (casadi_int i=0; i<nnz; ++i) {
127  // Get index
128  casadi_int ind = static_cast<casadi_int>(*nz++);
129  for (casadi_int j=inner_.start;j<inner_.stop;j+= inner_.step) {
130  casadi_int index = ind+j;
131  // Make assignment if in bounds, else NaN
132  *odata++ = index>=0 && index<max_ind ? idata[index] : nan;
133  }
134  }
135  return 0;
136  }
137 
139  return dep(1).nnz();
140  }
141 
142  int GetNonzerosParamParam::eval(const double** arg, double** res,
143  casadi_int* iw, double* w) const {
144  const double* idata = arg[0];
145  const double* nz = arg[1];
146  const double* nz2 = arg[2];
147  double* odata = res[0];
148 
149 
150  // Dimensions
151  casadi_int nnz = dep(1).nnz();
152  casadi_int nnz2 = dep(2).nnz();
153  casadi_int max_ind = dep(0).nnz();
154 
155  casadi_int* inner = iw; iw += nnz;
156  for (casadi_int i=0; i<nnz; ++i) {
157  // Get index
158  inner[i] = static_cast<casadi_int>(*nz++);
159  }
160  for (casadi_int i=0; i<nnz2; ++i) {
161  // Get index
162  casadi_int ind = static_cast<casadi_int>(*nz2++);
163  // Get index
164  for (casadi_int* inner_it=inner; inner_it!=inner+nnz; ++inner_it) {
165  casadi_int index = ind+*inner_it;
166  // Make assignment if in bounds, else NaN
167  *odata++ = index>=0 && index<max_ind ? idata[index] : nan;
168  }
169  }
170  return 0;
171  }
172 
174  sp_forward(const bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w) const {
175  // Parametric index -> any input disturbance propagates to any output
176  bvec_t a = bvec_or(arg[0], dep(0).nnz());
177  bvec_t *r = res[0];
178  std::fill(r, r+nnz(), a);
179  return 0;
180  }
181 
183  sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w) const {
184  bvec_t *a = arg[0];
185  bvec_t r = bvec_or(res[0], nnz());
186  std::fill(res[0], res[0]+nnz(), bvec_t(0));
187 
188  for (casadi_int i=0;i<dep(0).nnz();++i) {
189  *a++ |= r;
190  }
191  return 0;
192  }
193 
194  std::string GetNonzerosParamVector::disp(const std::vector<std::string>& arg) const {
195  std::stringstream ss;
196  ss << arg.at(0) << "[" << arg.at(1) << "]";
197  return ss.str();
198  }
199 
200  std::string GetNonzerosParamSlice::disp(const std::vector<std::string>& arg) const {
201  std::stringstream ss;
202  ss << arg.at(0) << "[(" << arg.at(1) << ";" << outer_ << ")]";
203  return ss.str();
204  }
205 
206  std::string GetNonzerosSliceParam::disp(const std::vector<std::string>& arg) const {
207  std::stringstream ss;
208  ss << arg.at(0) << "[(" << inner_ << ";" << arg.at(1) << ")]";
209  return ss.str();
210  }
211 
212  std::string GetNonzerosParamParam::disp(const std::vector<std::string>& arg) const {
213  std::stringstream ss;
214  ss << arg.at(0) << "[(" << arg.at(1) << ";" << arg.at(2) << ")]";
215  return ss.str();
216  }
217 
218  void GetNonzerosParamVector::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const {
219  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1]);
220  }
221 
222  void GetNonzerosParamSlice::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const {
223  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1], outer_);
224  }
225 
226  void GetNonzerosSliceParam::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const {
227  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(inner_, arg[1]);
228  }
229 
230  void GetNonzerosParamParam::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res) const {
231  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1], arg[2]);
232  }
233 
234  void GetNonzerosParamVector::ad_forward(const std::vector<std::vector<MX> >& fseed,
235  std::vector<std::vector<MX> >& fsens) const {
236  const MX& nz = dep(1);
237  // Nondifferentiated function and forward sensitivities
238  for (casadi_int d=0; d<fsens.size(); ++d) {
239  // Get references to arguments and results
240  MX arg = project(fseed[d][0], dep(0).sparsity());
241  fsens[d][0] = arg->get_nz_ref(nz);
242  }
243  }
244 
245  void GetNonzerosParamVector::ad_reverse(const std::vector<std::vector<MX> >& aseed,
246  std::vector<std::vector<MX> >& asens) const {
247  const MX& nz = dep(1);
248  // Nondifferentiated function and forward sensitivities
249  for (casadi_int d=0; d<asens.size(); ++d) {
250  // Get references to arguments and results
251  MX arg = project(aseed[d][0], sparsity());
252  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), nz);
253  }
254  }
255 
256  void GetNonzerosParamSlice::ad_forward(const std::vector<std::vector<MX> >& fseed,
257  std::vector<std::vector<MX> >& fsens) const {
258  const MX& inner = dep(1);
259  // Nondifferentiated function and forward sensitivities
260  for (casadi_int d=0; d<fsens.size(); ++d) {
261  // Get references to arguments and results
262  MX arg = project(fseed[d][0], dep(0).sparsity());
263  fsens[d][0] = arg->get_nz_ref(inner, outer_);
264  }
265  }
266 
267  void GetNonzerosParamSlice::ad_reverse(const std::vector<std::vector<MX> >& aseed,
268  std::vector<std::vector<MX> >& asens) const {
269  const MX& inner = dep(1);
270  // Nondifferentiated function and forward sensitivities
271  for (casadi_int d=0; d<asens.size(); ++d) {
272  // Get references to arguments and results
273  MX arg = project(aseed[d][0], sparsity());
274  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner, outer_);
275  }
276  }
277 
278 
279  void GetNonzerosSliceParam::ad_forward(const std::vector<std::vector<MX> >& fseed,
280  std::vector<std::vector<MX> >& fsens) const {
281  const MX& outer = dep(1);
282  // Nondifferentiated function and forward sensitivities
283  for (casadi_int d=0; d<fsens.size(); ++d) {
284  // Get references to arguments and results
285  MX arg = project(fseed[d][0], dep(0).sparsity());
286  fsens[d][0] = arg->get_nz_ref(inner_, outer);
287  }
288  }
289 
290  void GetNonzerosSliceParam::ad_reverse(const std::vector<std::vector<MX> >& aseed,
291  std::vector<std::vector<MX> >& asens) const {
292  const MX& outer = dep(1);
293  // Nondifferentiated function and forward sensitivities
294  for (casadi_int d=0; d<asens.size(); ++d) {
295  // Get references to arguments and results
296  MX arg = project(aseed[d][0], sparsity());
297  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner_, outer);
298  }
299 
300  }
301 
302  void GetNonzerosParamParam::ad_forward(const std::vector<std::vector<MX> >& fseed,
303  std::vector<std::vector<MX> >& fsens) const {
304  const MX& inner = dep(1);
305  const MX& outer = dep(2);
306  // Nondifferentiated function and forward sensitivities
307  for (casadi_int d=0; d<fsens.size(); ++d) {
308  // Get references to arguments and results
309  MX arg = project(fseed[d][0], dep(0).sparsity());
310  fsens[d][0] = arg->get_nz_ref(inner, outer);
311  }
312  }
313 
314  void GetNonzerosParamParam::ad_reverse(const std::vector<std::vector<MX> >& aseed,
315  std::vector<std::vector<MX> >& asens) const {
316  const MX& inner = dep(1);
317  const MX& outer = dep(2);
318  // Nondifferentiated function and forward sensitivities
319  for (casadi_int d=0; d<asens.size(); ++d) {
320  // Get references to arguments and results
321  MX arg = project(aseed[d][0], sparsity());
322  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner, outer);
323  }
324  }
325 
327  const std::vector<casadi_int>& arg,
328  const std::vector<casadi_int>& res,
329  const std::vector<bool>& arg_is_ref,
330  std::vector<bool>& res_is_ref) const {
331  g.local("i", "casadi_int");
332  g.local("rr", "casadi_real", "*");
333  g.local("cr", "const casadi_real", "*");
334  g << "for (rr=" << g.work(res[0], nnz(), false) << ", cr="
335  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1])
336  << "; rr!=" << g.work(res[0], nnz(), false) << "+" << nnz()
337  << "; ++rr) { i=(int) *cr++; "
338  << "*rr = i>=0 && i<" << dep(0).nnz() << " ? "
339  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
340  }
341 
343  const std::vector<casadi_int>& arg,
344  const std::vector<casadi_int>& res,
345  const std::vector<bool>& arg_is_ref,
346  std::vector<bool>& res_is_ref) const {
347  g.local("cii", "const casadi_int", "*");
348  g.local("i", "casadi_int");
349  g << "for (i=0;i<" << dep(1).nnz() << ";++i) iw[i] = (int) "
350  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "[i];\n";
351 
352  g.local("rr", "casadi_real", "*");
353  g.local("k", "casadi_int");
354  g << "for (rr=" << g.work(res[0], nnz(), false) << ", "
355  << "k=" << outer_.start << ";k<" << outer_.stop << ";k+=" << outer_.step << ") ";
356  g << "for (cii=iw; cii!=iw" << "+" << dep(1).nnz() << "; ++cii) { i=k+*cii; "
357  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
358  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
359  }
360 
362  const std::vector<casadi_int>& arg,
363  const std::vector<casadi_int>& res,
364  const std::vector<bool>& arg_is_ref,
365  std::vector<bool>& res_is_ref) const {
366  g.local("i", "casadi_int");
367  g.local("j", "casadi_int");
368  g.local("rr", "casadi_real", "*");
369  g.local("k", "casadi_int");
370  g.local("cr", "const casadi_real", "*");
371  g << "for (cr=" << g.work(arg[1], dep(1).nnz(), arg_is_ref[1])
372  << ", rr=" << g.work(res[0], nnz(), false)
373  << "; cr!=" << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "+" << dep(1).nnz()
374  << "; ++cr) ";
375  g << "for (j=(int) *cr, "
376  << "k=" << inner_.start << ";k<" << inner_.stop << ";k+=" << inner_.step << ") ";
377  g << "{ i=k+j; "
378  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
379  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
380 
381  }
382 
384  const std::vector<casadi_int>& arg,
385  const std::vector<casadi_int>& res,
386  const std::vector<bool>& arg_is_ref,
387  std::vector<bool>& res_is_ref) const {
388  g.local("cii", "const casadi_int", "*");
389  g.local("i", "casadi_int");
390  g << "for (i=0;i<" << dep(1).nnz() << ";++i) iw[i] = (int) "
391  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "[i];\n";
392 
393  g.local("j", "casadi_int");
394  g.local("cr", "const casadi_real", "*");
395  g.local("rr", "casadi_real", "*");
396  g << "for (cr=" << g.work(arg[2], dep(2).nnz(), arg_is_ref[2])
397  << ", rr=" << g.work(res[0], nnz(), false)
398  << "; cr!=" << g.work(arg[2], dep(2).nnz(), arg_is_ref[2]) << "+" << dep(2).nnz()
399  << "; ++cr) ";
400  g << "for (j=(int) *cr, cii=iw; cii!=iw" << "+" << dep(1).nnz()
401  << "; ++cii) ";
402  g << "{ i=j+*cii;"
403  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
404  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
405  }
406 
409  }
410 
413  s.pack("GetNonzerosParam::type", 'a');
414  }
415 
417 
418  }
419 
422  s.pack("GetNonzerosParamSlice::outer", outer_);
423  }
424 
427  s.pack("GetNonzerosParam::type", 'b');
428  }
429 
431  s.unpack("GetNonzerosParamSlice::outer", outer_);
432  }
433 
436  s.pack("GetNonzerosSliceParam::inner", inner_);
437  }
438 
441  s.pack("GetNonzerosParam::type", 'c');
442  }
443 
445  s.unpack("GetNonzerosSliceParam::inner", inner_);
446  }
447 
450  s.pack("GetNonzerosParam::type", 'd');
451  }
452 
454  }
455 
457  char t;
458  s.unpack("GetNonzerosParam::type", t);
459  switch (t) {
460  case 'a': return new GetNonzerosParamVector(s);
461  case 'b': return new GetNonzerosParamSlice(s);
462  case 'c': return new GetNonzerosSliceParam(s);
463  case 'd': return new GetNonzerosParamParam(s);
464  default: casadi_assert_dev(false);
465  }
466  }
467 
468 } // namespace casadi
Helper class for C code generation.
std::string work(casadi_int n, casadi_int sz, bool is_ref) const
std::string constant(const std::vector< casadi_int > &v)
Represent an array constant; adding it when new.
void local(const std::string &name, const std::string &type, const std::string &ref="")
Declare a local variable.
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
casadi_int numel() const
Get the number of elements.
bool is_dense() const
Check if the matrix expression is dense.
bool is_vector() const
Check if the matrix is a row or column vector.
casadi_int nnz() const
Get the number of (structural) non-zero elements.
static MX zeros(casadi_int nrow=1, casadi_int ncol=1)
Create a dense matrix or a matrix with specified sparsity with all entries zero.
void ad_forward(const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens) const override
Calculate forward mode directional derivatives.
GetNonzerosParamParam(const Sparsity &sp, const MX &x, const MX &inner, const MX &outer)
Constructor.
void serialize_type(SerializingStream &s) const override
Serialize type information.
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res) const override
Evaluate symbolically (MX)
void generate(CodeGenerator &g, const std::vector< casadi_int > &arg, const std::vector< casadi_int > &res, const std::vector< bool > &arg_is_ref, std::vector< bool > &res_is_ref) const override
Generate code for the operation.
int eval(const double **arg, double **res, casadi_int *iw, double *w) const override
Evaluate the function numerically.
size_t sz_iw() const override
Get required length of iw field.
std::string disp(const std::vector< std::string > &arg) const override
Print expression.
void ad_reverse(const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens) const override
Calculate reverse mode directional derivatives.
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res) const override
Evaluate symbolically (MX)
void ad_reverse(const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens) const override
Calculate reverse mode directional derivatives.
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
void serialize_type(SerializingStream &s) const override
Serialize type information.
std::string disp(const std::vector< std::string > &arg) const override
Print expression.
void generate(CodeGenerator &g, const std::vector< casadi_int > &arg, const std::vector< casadi_int > &res, const std::vector< bool > &arg_is_ref, std::vector< bool > &res_is_ref) const override
Generate code for the operation.
GetNonzerosParamSlice(const Sparsity &sp, const MX &x, const MX &inner, const Slice &outer)
Constructor.
void ad_forward(const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens) const override
Calculate forward mode directional derivatives.
int eval(const double **arg, double **res, casadi_int *iw, double *w) const override
Evaluate the function numerically.
size_t sz_iw() const override
Get required length of iw field.
void generate(CodeGenerator &g, const std::vector< casadi_int > &arg, const std::vector< casadi_int > &res, const std::vector< bool > &arg_is_ref, std::vector< bool > &res_is_ref) const override
Generate code for the operation.
void serialize_type(SerializingStream &s) const override
Serialize type information.
void ad_reverse(const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens) const override
Calculate reverse mode directional derivatives.
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res) const override
Evaluate symbolically (MX)
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
GetNonzerosParamVector(const MX &x, const MX &nz)
Constructor.
std::string disp(const std::vector< std::string > &arg) const override
Print expression.
int eval(const double **arg, double **res, casadi_int *iw, double *w) const override
Evaluate the function numerically.
void ad_forward(const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens) const override
Calculate forward mode directional derivatives.
Get nonzeros of a matrix, parametrically.
static MX create(const MX &x, const MX &nz)
int sp_forward(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const override
Propagate sparsity forward.
static MXNode * deserialize(DeserializingStream &s)
Deserialize without type information.
int sp_reverse(bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const override
Propagate sparsity backwards.
GetNonzerosParam(const Sparsity &sp, const MX &y, const MX &nz)
Constructor.
void serialize_type(SerializingStream &s) const override
Serialize type information.
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res) const override
Evaluate symbolically (MX)
std::string disp(const std::vector< std::string > &arg) const override
Print expression.
void generate(CodeGenerator &g, const std::vector< casadi_int > &arg, const std::vector< casadi_int > &res, const std::vector< bool > &arg_is_ref, std::vector< bool > &res_is_ref) const override
Generate code for the operation.
int eval(const double **arg, double **res, casadi_int *iw, double *w) const override
Evaluate the function numerically.
void ad_reverse(const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens) const override
Calculate reverse mode directional derivatives.
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.
void ad_forward(const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens) const override
Calculate forward mode directional derivatives.
GetNonzerosSliceParam(const Sparsity &sp, const MX &x, const Slice &inner, const MX &outer)
Constructor.
Node class for MX objects.
Definition: mx_node.hpp:51
virtual void serialize_type(SerializingStream &s) const
Serialize type information.
Definition: mx_node.cpp:528
virtual casadi_int ind() const
Definition: mx_node.cpp:210
const Sparsity & sparsity() const
Get the sparsity.
Definition: mx_node.hpp:372
casadi_int nnz(casadi_int i=0) const
Definition: mx_node.hpp:389
const MX & dep(casadi_int ind=0) const
dependencies - functions that have to be evaluated before this one
Definition: mx_node.hpp:354
virtual MX get_nz_ref(const MX &nz) const
Get the nonzeros of matrix, parametrically.
Definition: mx_node.cpp:664
virtual void serialize_body(SerializingStream &s) const
Serialize an object without type information.
Definition: mx_node.cpp:523
void set_sparsity(const Sparsity &sparsity)
Set the sparsity.
Definition: mx_node.cpp:222
virtual MX get_nzadd(const MX &y, const std::vector< casadi_int > &nz) const
Add the nonzeros of a matrix to another matrix.
Definition: mx_node.cpp:700
void set_dep(const MX &dep)
Set unary dependency.
Definition: mx_node.cpp:226
MX - Matrix expression.
Definition: mx.hpp:92
static MX create(MXNode *node)
Create from node.
Definition: mx.cpp:67
const Sparsity & sparsity() const
Get the sparsity pattern.
Definition: mx.cpp:592
Helper class for Serialization.
void pack(const Sparsity &e)
Serializes an object to the output stream.
Class representing a Slice.
Definition: slice.hpp:48
size_t size() const
Get number of elements.
Definition: slice.cpp:104
casadi_int step
Definition: slice.hpp:54
casadi_int stop
stop value: use std::numeric_limits<casadi_int>::max() to indicate unboundedness
Definition: slice.hpp:53
casadi_int start
start value: negative values will get added to length
Definition: slice.hpp:51
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
The casadi namespace.
Definition: archiver.cpp:28
unsigned long long bvec_t
const double nan
Not a number.
Definition: calculus.hpp:53
bvec_t bvec_or(const bvec_t *arg, casadi_int n)
Bit-wise or operation on bvec_t array.