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,
219  const std::vector<bool>& unique) const {
220  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1]);
221  }
222 
223  void GetNonzerosParamSlice::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res,
224  const std::vector<bool>& unique) const {
225  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1], outer_);
226  }
227 
228  void GetNonzerosSliceParam::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res,
229  const std::vector<bool>& unique) const {
230  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(inner_, arg[1]);
231  }
232 
233  void GetNonzerosParamParam::eval_mx(const std::vector<MX>& arg, std::vector<MX>& res,
234  const std::vector<bool>& unique) const {
235  res[0] = project(arg[0], dep(0).sparsity())->get_nz_ref(arg[1], arg[2]);
236  }
237 
238  void GetNonzerosParamVector::ad_forward(const std::vector<std::vector<MX> >& fseed,
239  std::vector<std::vector<MX> >& fsens) const {
240  const MX& nz = dep(1);
241  // Nondifferentiated function and forward sensitivities
242  for (casadi_int d=0; d<fsens.size(); ++d) {
243  // Get references to arguments and results
244  MX arg = project(fseed[d][0], dep(0).sparsity());
245  fsens[d][0] = arg->get_nz_ref(nz);
246  }
247  }
248 
249  void GetNonzerosParamVector::ad_reverse(const std::vector<std::vector<MX> >& aseed,
250  std::vector<std::vector<MX> >& asens) const {
251  const MX& nz = dep(1);
252  // Nondifferentiated function and forward sensitivities
253  for (casadi_int d=0; d<asens.size(); ++d) {
254  // Get references to arguments and results
255  MX arg = project(aseed[d][0], sparsity());
256  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), nz);
257  }
258  }
259 
260  void GetNonzerosParamSlice::ad_forward(const std::vector<std::vector<MX> >& fseed,
261  std::vector<std::vector<MX> >& fsens) const {
262  const MX& inner = dep(1);
263  // Nondifferentiated function and forward sensitivities
264  for (casadi_int d=0; d<fsens.size(); ++d) {
265  // Get references to arguments and results
266  MX arg = project(fseed[d][0], dep(0).sparsity());
267  fsens[d][0] = arg->get_nz_ref(inner, outer_);
268  }
269  }
270 
271  void GetNonzerosParamSlice::ad_reverse(const std::vector<std::vector<MX> >& aseed,
272  std::vector<std::vector<MX> >& asens) const {
273  const MX& inner = dep(1);
274  // Nondifferentiated function and forward sensitivities
275  for (casadi_int d=0; d<asens.size(); ++d) {
276  // Get references to arguments and results
277  MX arg = project(aseed[d][0], sparsity());
278  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner, outer_);
279  }
280  }
281 
282 
283  void GetNonzerosSliceParam::ad_forward(const std::vector<std::vector<MX> >& fseed,
284  std::vector<std::vector<MX> >& fsens) const {
285  const MX& outer = dep(1);
286  // Nondifferentiated function and forward sensitivities
287  for (casadi_int d=0; d<fsens.size(); ++d) {
288  // Get references to arguments and results
289  MX arg = project(fseed[d][0], dep(0).sparsity());
290  fsens[d][0] = arg->get_nz_ref(inner_, outer);
291  }
292  }
293 
294  void GetNonzerosSliceParam::ad_reverse(const std::vector<std::vector<MX> >& aseed,
295  std::vector<std::vector<MX> >& asens) const {
296  const MX& outer = dep(1);
297  // Nondifferentiated function and forward sensitivities
298  for (casadi_int d=0; d<asens.size(); ++d) {
299  // Get references to arguments and results
300  MX arg = project(aseed[d][0], sparsity());
301  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner_, outer);
302  }
303 
304  }
305 
306  void GetNonzerosParamParam::ad_forward(const std::vector<std::vector<MX> >& fseed,
307  std::vector<std::vector<MX> >& fsens) const {
308  const MX& inner = dep(1);
309  const MX& outer = dep(2);
310  // Nondifferentiated function and forward sensitivities
311  for (casadi_int d=0; d<fsens.size(); ++d) {
312  // Get references to arguments and results
313  MX arg = project(fseed[d][0], dep(0).sparsity());
314  fsens[d][0] = arg->get_nz_ref(inner, outer);
315  }
316  }
317 
318  void GetNonzerosParamParam::ad_reverse(const std::vector<std::vector<MX> >& aseed,
319  std::vector<std::vector<MX> >& asens) const {
320  const MX& inner = dep(1);
321  const MX& outer = dep(2);
322  // Nondifferentiated function and forward sensitivities
323  for (casadi_int d=0; d<asens.size(); ++d) {
324  // Get references to arguments and results
325  MX arg = project(aseed[d][0], sparsity());
326  asens[d][0] += arg->get_nzadd(DM::zeros(dep(0).sparsity()), inner, outer);
327  }
328  }
329 
331  const std::vector<casadi_int>& arg,
332  const std::vector<casadi_int>& res,
333  const std::vector<bool>& arg_is_ref,
334  std::vector<bool>& res_is_ref) const {
335  g.local("i", "casadi_int");
336  g.local("rr", "casadi_real", "*");
337  g.local("cr", "const casadi_real", "*");
338  g << "for (rr=" << g.work(res[0], nnz(), false) << ", cr="
339  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1])
340  << "; rr!=" << g.work(res[0], nnz(), false) << "+" << nnz()
341  << "; ++rr) { i=(int) *cr++; "
342  << "*rr = i>=0 && i<" << dep(0).nnz() << " ? "
343  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
344  }
345 
347  const std::vector<casadi_int>& arg,
348  const std::vector<casadi_int>& res,
349  const std::vector<bool>& arg_is_ref,
350  std::vector<bool>& res_is_ref) const {
351  g.local("cii", "const casadi_int", "*");
352  g.local("i", "casadi_int");
353  g << "for (i=0;i<" << dep(1).nnz() << ";++i) iw[i] = (int) "
354  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "[i];\n";
355 
356  g.local("rr", "casadi_real", "*");
357  g.local("k", "casadi_int");
358  g << "for (rr=" << g.work(res[0], nnz(), false) << ", "
359  << "k=" << outer_.start << ";k<" << outer_.stop << ";k+=" << outer_.step << ") ";
360  g << "for (cii=iw; cii!=iw" << "+" << dep(1).nnz() << "; ++cii) { i=k+*cii; "
361  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
362  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
363  }
364 
366  const std::vector<casadi_int>& arg,
367  const std::vector<casadi_int>& res,
368  const std::vector<bool>& arg_is_ref,
369  std::vector<bool>& res_is_ref) const {
370  if (inner_.step==1 && arg_is_ref[0] && dep(1).nnz()==1) {
371  if (nnz()==1) {
372  g.local("i", "casadi_int");
373  g << "i = " << inner_.start << " + (int) " << g.workel(arg[1]) << ";\n";
374  g << g.workel(res[0]) << " = i>=0 && i<" << dep(0).nnz() << " ? ";
375  g << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << ";\n";
376  } else {
377  g << g.work(res[0], nnz(), true) << " = " << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]);
378  g << " + " << inner_.start << " + (int)" << g.workel(arg[1]) << ";\n";
379  res_is_ref[0] = true;
380  }
381  } else {
382  g.local("i", "casadi_int");
383  g.local("j", "casadi_int");
384  g.local("rr", "casadi_real", "*");
385  g.local("k", "casadi_int");
386  g.local("cr", "const casadi_real", "*");
387  g << "for (cr=" << g.work(arg[1], dep(1).nnz(), arg_is_ref[1])
388  << ", rr=" << g.work(res[0], nnz(), false)
389  << "; cr!=" << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "+" << dep(1).nnz()
390  << "; ++cr) ";
391  g << "for (j=(int) *cr, "
392  << "k=" << inner_.start << ";k<" << inner_.stop << ";k+=" << inner_.step << ") ";
393  g << "{ i=k+j; "
394  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
395  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
396  }
397  }
398 
400  const std::vector<casadi_int>& arg,
401  const std::vector<casadi_int>& res,
402  const std::vector<bool>& arg_is_ref,
403  std::vector<bool>& res_is_ref) const {
404  g.local("cii", "const casadi_int", "*");
405  g.local("i", "casadi_int");
406  g << "for (i=0;i<" << dep(1).nnz() << ";++i) iw[i] = (int) "
407  << g.work(arg[1], dep(1).nnz(), arg_is_ref[1]) << "[i];\n";
408 
409  g.local("j", "casadi_int");
410  g.local("cr", "const casadi_real", "*");
411  g.local("rr", "casadi_real", "*");
412  g << "for (cr=" << g.work(arg[2], dep(2).nnz(), arg_is_ref[2])
413  << ", rr=" << g.work(res[0], nnz(), false)
414  << "; cr!=" << g.work(arg[2], dep(2).nnz(), arg_is_ref[2]) << "+" << dep(2).nnz()
415  << "; ++cr) ";
416  g << "for (j=(int) *cr, cii=iw; cii!=iw" << "+" << dep(1).nnz()
417  << "; ++cii) ";
418  g << "{ i=j+*cii;"
419  << "*rr++ = i>=0 && i<" << dep(0).nnz() << " ? "
420  << g.work(arg[0], dep(0).nnz(), arg_is_ref[0]) << "[i] : " << g.constant(nan) << "; }\n";
421  }
422 
425  }
426 
429  s.pack("GetNonzerosParam::type", 'a');
430  }
431 
433 
434  }
435 
438  s.pack("GetNonzerosParamSlice::outer", outer_);
439  }
440 
443  s.pack("GetNonzerosParam::type", 'b');
444  }
445 
447  s.unpack("GetNonzerosParamSlice::outer", outer_);
448  }
449 
452  s.pack("GetNonzerosSliceParam::inner", inner_);
453  }
454 
457  s.pack("GetNonzerosParam::type", 'c');
458  }
459 
461  s.unpack("GetNonzerosSliceParam::inner", inner_);
462  }
463 
466  s.pack("GetNonzerosParam::type", 'd');
467  }
468 
470  }
471 
473  char t;
474  s.unpack("GetNonzerosParam::type", t);
475  switch (t) {
476  case 'a': return new GetNonzerosParamVector(s);
477  case 'b': return new GetNonzerosParamSlice(s);
478  case 'c': return new GetNonzerosSliceParam(s);
479  case 'd': return new GetNonzerosParamParam(s);
480  default: casadi_assert_dev(false);
481  }
482  }
483 
484 } // 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.
std::string workel(casadi_int n) const
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 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.
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res, const std::vector< bool > &unique={}) const override
Evaluate symbolically (MX)
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 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 eval_mx(const std::vector< MX > &arg, std::vector< MX > &res, const std::vector< bool > &unique={}) 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.
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 eval_mx(const std::vector< MX > &arg, std::vector< MX > &res, const std::vector< bool > &unique={}) const override
Evaluate symbolically (MX)
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 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.
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 eval_mx(const std::vector< MX > &arg, std::vector< MX > &res, const std::vector< bool > &unique={}) 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 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:535
virtual casadi_int ind() const
Definition: mx_node.cpp:212
const Sparsity & sparsity() const
Get the sparsity.
Definition: mx_node.hpp:410
casadi_int nnz(casadi_int i=0) const
Definition: mx_node.hpp:427
const MX & dep(casadi_int ind=0) const
dependencies - functions that have to be evaluated before this one
Definition: mx_node.hpp:392
virtual MX get_nz_ref(const MX &nz) const
Get the nonzeros of matrix, parametrically.
Definition: mx_node.cpp:667
virtual void serialize_body(SerializingStream &s) const
Serialize an object without type information.
Definition: mx_node.cpp:530
void set_sparsity(const Sparsity &sparsity)
Set the sparsity.
Definition: mx_node.cpp:224
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:703
void set_dep(const MX &dep)
Set unary dependency.
Definition: mx_node.cpp:228
MX - Matrix expression.
Definition: mx.hpp:92
static MX create(MXNode *node)
Create from node.
Definition: mx.cpp:69
const Sparsity & sparsity() const
Get the sparsity pattern.
Definition: mx.cpp:612
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:1028
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.