28 #include "shared_object.hpp"
29 #include "matrix_fwd.hpp"
32 #include "generic_matrix.hpp"
33 #include "generic_expression.hpp"
34 #include "generic_type.hpp"
35 #include "printable.hpp"
44 class SerializingStream;
45 class DeserializingStream;
48 struct ConvexifyData {
49 std::vector<casadi_int> scc_offset, scc_mapping;
80 class CASADI_EXPORT
MX :
81 public SWIG_IF_ELSE(GenericExpressionCommon, GenericExpression<MX>),
82 public SWIG_IF_ELSE(PrintableCommon, Printable<MX>),
99 MX(casadi_int nrow, casadi_int ncol);
105 explicit MX(
const std::pair<casadi_int, casadi_int>& rc);
134 MX(
const std::vector<double> &x);
159 static std::vector<MX> createMultipleOutput(
MXNode* node);
169 typedef MX ScalarType;
196 void erase(
const std::vector<casadi_int>& rr,
const std::vector<casadi_int>& cc,
204 void erase(
const std::vector<casadi_int>& rr,
bool ind1=
false);
211 void enlarge(casadi_int nrow, casadi_int ncol,
212 const std::vector<casadi_int>& rr,
const std::vector<casadi_int>& cc,
228 const MXNode* operator->()
const;
257 explicit operator double()
const;
341 bool has_duplicates()
const;
346 void reset_input()
const;
384 casadi_int
op()
const;
401 casadi_int get_temp()
const;
404 void set_temp(casadi_int t)
const;
420 static MX inf(casadi_int nrow=1, casadi_int ncol=1);
421 static MX inf(
const std::pair<casadi_int, casadi_int>& rc);
429 static MX nan(casadi_int nrow=1, casadi_int ncol=1);
430 static MX nan(
const std::pair<casadi_int, casadi_int>& rc);
445 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const Slice& rr)
const;
448 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& rr)
const;
449 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const casadi_int rr)
const {
458 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const Slice& rr, casadi_int cc)
const {
462 void get(
MX& SWIG_OUTPUT(m),
bool ind1, casadi_int rr,
const Slice& cc)
const {
467 void get(
MX& SWIG_OUTPUT(m),
bool ind1, casadi_int rr,
468 casadi_int cc)
const {
471 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& rr,
const Slice& cc)
const;
472 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const Slice& rr,
const MX& cc)
const;
473 void get(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& rr,
const MX& cc)
const;
495 void get_nz(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& kk)
const;
496 void get_nz(
MX& SWIG_OUTPUT(m),
bool ind1, casadi_int kk)
const {
499 void get_nz(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& inner,
const Slice& outer)
const;
500 void get_nz(
MX& SWIG_OUTPUT(m),
bool ind1,
const Slice& inner,
const MX& outer)
const;
501 void get_nz(
MX& SWIG_OUTPUT(m),
bool ind1,
const MX& inner,
const MX& outer)
const;
528 const std::vector<casadi_int>& dim_a,
const std::vector<casadi_int>& dim_b,
529 const std::vector<casadi_int>& dim_c,
530 const std::vector<casadi_int>& a,
const std::vector<casadi_int>& b,
531 const std::vector<casadi_int>& c);
534 const std::vector<casadi_int>& dim_a,
const std::vector<casadi_int>& dim_b,
535 const std::vector<casadi_int>& dim_c,
536 const std::vector<casadi_int>& a,
const std::vector<casadi_int>& b,
537 const std::vector<casadi_int>& c);
544 static bool is_equal(
const MX& x,
const MX& y, casadi_int depth=0);
545 static MX mmin(
const MX &x);
546 static MX mmax(
const MX &x);
551 static MX horzcat(
const std::vector<MX>& x);
552 static MX diagcat(
const std::vector<MX>& x);
553 static MX vertcat(
const std::vector<MX>& x);
554 static std::vector<MX> horzsplit(
const MX& x,
const std::vector<casadi_int>& offset);
555 static std::vector<MX> diagsplit(
const MX& x,
const std::vector<casadi_int>& offset1,
556 const std::vector<casadi_int>& offset2);
557 static std::vector<MX> vertsplit(
const MX& x,
const std::vector<casadi_int>& offset);
558 static MX blockcat(
const std::vector< std::vector<MX > > &v);
559 static MX mtimes(
const MX& x,
const MX& y);
560 static MX mac(
const MX& x,
const MX& y,
const MX& z);
561 static MX reshape(
const MX& x, casadi_int nrow, casadi_int ncol);
563 static MX sparsity_cast(
const MX& x,
const Sparsity& sp);
564 static MX kron(
const MX& x,
const MX& b);
565 static MX repmat(
const MX& x, casadi_int n, casadi_int m=1);
570 static MX jacobian(
const MX& f,
const MX& x,
const Dict& opts =
Dict());
571 static MX hessian(
const MX& f,
const MX& x,
const Dict& opts =
Dict());
572 static MX hessian(
const MX& f,
const MX& x,
MX& g,
const Dict& opts =
Dict());
573 static std::vector<std::vector<MX> >
574 forward(
const std::vector<MX> &ex,
575 const std::vector<MX> &arg,
576 const std::vector<std::vector<MX> > &v,
578 static std::vector<std::vector<MX> >
579 reverse(
const std::vector<MX> &ex,
580 const std::vector<MX> &arg,
581 const std::vector<std::vector<MX> > &v,
583 static std::vector<bool> which_depends(
const MX &expr,
const MX &var,
584 casadi_int order=1,
bool tr=
false);
585 static Sparsity jacobian_sparsity(
const MX& f,
const MX& x);
586 static MX substitute(
const MX& ex,
const MX& v,
const MX& vdef);
587 static std::vector<MX> substitute(
const std::vector<MX> &ex,
588 const std::vector<MX> &v,
589 const std::vector<MX> &vdef);
590 static void substitute_inplace(
const std::vector<MX>& v,
591 std::vector<MX>& vdef,
592 std::vector<MX>& ex,
bool reverse);
593 static MX solve(
const MX& a,
const MX& b);
594 static MX solve(
const MX& a,
const MX& b,
const std::string& lsolver,
596 static MX inv_minor(
const MX& A);
597 static MX inv_node(
const MX& A);
598 static MX inv(
const MX& A,
const std::string& lsolver=
"qr",
const Dict& dict =
Dict());
599 static MX pinv(
const MX& A,
const std::string& lsolver=
"qr",
601 static MX expm_const(
const MX& A,
const MX& t);
602 static MX expm(
const MX& A);
603 static casadi_int n_nodes(
const MX& x);
604 static std::string print_operator(
const MX& x,
const std::vector<std::string>& args);
605 static void extract(std::vector<MX>& ex, std::vector<MX>& v,
606 std::vector<MX>& vdef,
const Dict& opts =
Dict());
607 static void shared(std::vector<MX>& ex, std::vector<MX>& v,
608 std::vector<MX>& vdef,
const std::string& v_prefix,
const std::string& v_suffix);
609 static MX if_else(
const MX& cond,
const MX& if_true,
610 const MX& if_false,
bool short_circuit=
false);
611 static MX conditional(
const MX& ind,
const std::vector<MX> &x,
const MX& x_default,
612 bool short_circuit=
false);
613 static bool depends_on(
const MX& x,
const MX& arg);
614 static MX simplify(
const MX& x);
615 static MX dot(
const MX& x,
const MX& y);
616 static MX mrdivide(
const MX& a,
const MX& b);
617 static MX mldivide(
const MX& a,
const MX& b);
618 static MX norm_2(
const MX& x);
619 static MX norm_fro(
const MX& x);
620 static MX norm_1(
const MX& x);
621 static MX norm_inf(
const MX& x);
622 static MX unite(
const MX& A,
const MX& B);
623 static MX trace(
const MX& x);
624 static MX diag(
const MX& x);
625 static MX sum2(
const MX& x);
626 static MX sum1(
const MX& x);
627 static MX polyval(
const MX& p,
const MX& x);
628 static MX det(
const MX& x);
629 static std::vector<MX> symvar(
const MX& x);
630 static MX nullspace(
const MX& A);
631 static MX repsum(
const MX& x, casadi_int n, casadi_int m=1);
632 static MX densify(
const MX& x,
const MX& val=0);
633 static MX _bilin(
const MX& A,
const MX& x,
const MX& y);
634 static MX _rank1(
const MX& A,
const MX& alpha,
const MX& x,
const MX& y);
635 static MX project(
const MX& x,
const Sparsity& sp,
bool intersect=
false);
636 static MX cumsum(
const MX &x, casadi_int axis=-1);
637 static MX _logsumexp(
const MX& x);
638 static std::vector<MX> cse(
const std::vector<MX>& e);
643 static MX find(
const MX& x);
644 static MX low(
const MX& v,
const MX& p,
const Dict& options =
Dict());
645 static MX graph_substitute(
const MX& x,
const std::vector<MX> &v,
646 const std::vector<MX> &vdef);
647 static std::vector<MX> graph_substitute(
const std::vector<MX> &ex,
648 const std::vector<MX> &expr,
649 const std::vector<MX> &exprs);
650 static MX matrix_expand(
const MX& e,
const std::vector<MX> &boundary,
651 const Dict& options);
652 static std::vector<MX> matrix_expand(
const std::vector<MX>& e,
653 const std::vector<MX>& boundary,
654 const Dict& options);
655 static MX lift(
const MX& x,
const MX& x_guess);
656 static DM evalf(
const MX& m);
657 static MX bspline(
const MX& x,
659 const std::vector< std::vector<double> >& knots,
660 const std::vector<casadi_int>& degree,
663 static MX bspline(
const MX& x,
const MX& coeffs,
664 const std::vector< std::vector<double> >& knots,
665 const std::vector<casadi_int>& degree,
668 static MX convexify(
const MX& H,
const Dict& opts =
Dict());
669 static MX stop_diff(
const MX& expr, casadi_int order);
670 static MX stop_diff(
const MX& expr,
const MX& var, casadi_int order);
671 static std::vector<MX> difference(
const std::vector<MX>& a,
const std::vector<MX>& b);
678 const std::vector< std::vector<double> >& knots,
679 const std::vector<casadi_int>& degree,
694 #if !defined(SWIG) || defined(DOXYGEN)
723 const std::vector<MX> &vdef) {
733 inline friend std::vector<MX>
735 const std::vector<MX> &v,
736 const std::vector<MX> &vdef) {
758 inline friend std::vector<MX>
760 const std::vector<MX> &boundary = std::vector<MX>(),
768 const std::vector< std::vector<double> >& knots,
769 const std::vector<casadi_int>& degree,
772 return MX::bspline(x, coeffs, knots, degree, m, opts);
776 const std::vector< std::vector<double> >& knots,
777 const std::vector<casadi_int>& degree,
780 return MX::bspline(x, coeffs, knots, degree, m, opts);
784 const std::vector< std::vector<double> >& knots,
785 const std::vector<casadi_int>& degree,
854 inline friend std::vector<MX>
difference(
const std::vector<MX>& a,
const std::vector<MX>& b) {
907 typedef std::map<std::string, MX>
MXDict;
912 void eval_mx(
const std::vector<MX>& arg, std::vector<MX>& SWIG_OUTPUT(res))
const;
919 void ad_forward(
const std::vector<std::vector<MX> >& fseed,
920 std::vector<std::vector<MX> >& fsens)
const;
921 void ad_reverse(
const std::vector<std::vector<MX> >& aseed,
922 std::vector<std::vector<MX> >& asens)
const;
926 MX(
const Sparsity& sp,
double val,
bool dummy);
929 static MX _sym(
const std::string& name,
const Sparsity& sp);
934 MX(
MXNode* node,
bool dummy1,
bool dummy2,
bool dummy3,
bool dummy4);
937 static casadi_int eq_depth_;
948 typedef std::map<std::string, MX>
MXDict;
Helper class for Serialization.
Node class for MX objects.
void get_nz(MX &m, bool ind1, casadi_int kk) const
void erase(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, bool ind1=false)
Erase a submatrix (leaving structural zeros in its place)
static std::vector< MX > get_free(const Function &f)
Get free variables.
bool is_multiplication() const
Check if multiplication.
bool is_minus_one() const
check if zero (note that false negative answers are possible)
bool is_valid_input() const
Check if matrix can be used to define function inputs.
static bool test_cast(const SharedObjectInternal *ptr)
Check if a particular cast is allowed.
bool is_eye() const
check if identity
void get_nz(MX &m, bool ind1, const Slice &inner, const MX &outer) const
static casadi_int get_max_depth()
Get the depth to which equalities are being checked for simplifications.
static MX nan(const Sparsity &sp)
create a matrix with all nan
std::vector< MX > split_primitives(const MX &x) const
Split up an expression along symbolic primitives.
bool is_output() const
Check if evaluation output.
casadi_int n_out() const
Number of outputs.
void get(MX &m, bool ind1, const Sparsity &sp) const
void erase(const std::vector< casadi_int > &rr, bool ind1=false)
Erase a submatrix (leaving structural zeros in its place)
static MX deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
static MX eye(casadi_int n)
Identity matrix.
casadi_int n_dep() const
Get the number of dependencies of a binary SXElem.
void get(MX &m, bool ind1, const MX &rr, const MX &cc) const
casadi_int n_primitives() const
Get the number of primitives for MXFunction inputs/outputs.
void set(const MX &m, bool ind1, const Matrix< casadi_int > &rr)
bool __nonzero__() const
Returns the truth value of an MX expression.
void get(MX &m, bool ind1, const MX &rr) const
static MX inf(casadi_int nrow=1, casadi_int ncol=1)
create a matrix with all inf
bool is_call() const
Check if evaluation.
std::string name() const
Get the name.
bool has_output() const
Check if a multiple output node.
void get(MX &m, bool ind1, const MX &rr, const Slice &cc) const
MX(const Sparsity &sp, const std::string &fname)
Construct matrix with a given sparsity and a file with nonzeros.
void set(const MX &m, bool ind1, const Slice &rr, const Slice &cc)
bool is_constant() const
Check if constant.
Sparsity get_sparsity() const
Get an owning reference to the sparsity pattern.
static MX nan(const std::pair< casadi_int, casadi_int > &rc)
create a matrix with all nan
bool is_commutative() const
Check if commutative operation.
MX(const Sparsity &sp, const MX &val)
Construct matrix with a given sparsity and nonzeros.
static MX einstein(const MX &A, const MX &B, const MX &C, const std::vector< casadi_int > &dim_a, const std::vector< casadi_int > &dim_b, const std::vector< casadi_int > &dim_c, const std::vector< casadi_int > &a, const std::vector< casadi_int > &b, const std::vector< casadi_int > &c)
Computes an einstein dense tensor contraction.
void set_nz(const MX &m, bool ind1, casadi_int kk)
void set_nz(const MX &m, bool ind1, const MX &kk)
void get(MX &m, bool ind1, const casadi_int rr) const
void set(const MX &m, bool ind1, const Sparsity &sp)
void get_nz(MX &m, bool ind1, const MX &inner, const MX &outer) const
void get_nz(MX &m, bool ind1, const MX &kk) const
static void set_max_depth(casadi_int eq_depth=1)
Set or reset the depth to which equalities are being checked for simplifications.
DM join_primitives(const std::vector< DM > &v) const
Join an expression along symbolic primitives.
MX T() const
Transpose the matrix.
void get(MX &m, bool ind1, const Slice &rr, const Matrix< casadi_int > &cc) const
void get(MX &m, bool ind1, const Slice &rr, const MX &cc) const
void get(MX &m, bool ind1, casadi_int rr, casadi_int cc) const
MX(casadi_int nrow, casadi_int ncol)
Create a sparse matrix with all structural zeros.
void get(MX &m, bool ind1, const Slice &rr, casadi_int cc) const
Function which_function() const
Get function - only valid when is_call() is true.
void get(MX &m, bool ind1, const Slice &rr, const Slice &cc) const
void get_nz(MX &m, bool ind1, const MX &inner, const Slice &outer) const
static MX inf(const std::pair< casadi_int, casadi_int > &rc)
create a matrix with all inf
void get(MX &m, bool ind1, const Matrix< casadi_int > &rr, const Slice &cc) const
MX(double x)
Create scalar constant (also implicit type conversion)
MX(const Sparsity &sp)
Create a sparse matrix from a sparsity pattern.
static std::string type_name()
Get type name.
bool is_op(casadi_int op) const
Is it a certain operation.
void get(MX &m, bool ind1, const Matrix< casadi_int > &rr) const
bool is_norm() const
Check if norm.
void set_nz(const MX &m, bool ind1, const Slice &kk)
static MX binary(casadi_int op, const MX &x, const MX &y)
Create nodes by their ID.
bool is_regular() const
Checks if expression does not contain NaN or Inf.
casadi_int which_output() const
Get the index of evaluation output - only valid when is_output() is true.
void serialize(SerializingStream &s) const
Serialize an object.
static MX nan(casadi_int nrow=1, casadi_int ncol=1)
create a matrix with all nan
void set(const MX &m, bool ind1, const Slice &rr, const Matrix< casadi_int > &cc)
void eval_mx(const std::vector< MX > &arg, std::vector< MX > &res) const
Evaluate the MX node with new symbolic dependencies.
SX join_primitives(const std::vector< SX > &v) const
Join an expression along symbolic primitives.
MX attachAssert(const MX &y, const std::string &fail_message="") const
returns itself, but with an assertion attached
std::map< std::string, MX > MXDict
Readability typedef.
void set(const MX &m, bool ind1, const Slice &rr)
std::vector< MX > primitives() const
Get primitives.
bool is_one() const
check if zero (note that false negative answers are possible)
void get_nz(MX &m, bool ind1, const Matrix< casadi_int > &kk) const
std::vector< DM > split_primitives(const DM &x) const
Split up an expression along symbolic primitives.
void get(MX &m, bool ind1, const Slice &rr) const
void set(const MX &m, bool ind1, const Matrix< casadi_int > &rr, const Matrix< casadi_int > &cc)
MX join_primitives(const std::vector< MX > &v) const
Join an expression along symbolic primitives.
void get(MX &m, bool ind1, const Matrix< casadi_int > &rr, const Matrix< casadi_int > &cc) const
MX(const Matrix< double > &x)
Create sparse matrix constant (also implicit type conversion)
MX dep(casadi_int ch=0) const
Get the nth dependency as MX.
void set(const MX &m, bool ind1, const Matrix< casadi_int > &rr, const Slice &cc)
MX monitor(const std::string &comment) const
Monitor an expression.
Matrix< casadi_int > mapping() const
Get an IM representation of a GetNonzeros or SetNonzeros node.
static MX interpn_linear(const std::vector< MX > &x, const MX &v, const std::vector< MX > &xq, const Dict &opts=Dict())
Low-level access to inlined linear interpolation.
bool is_binary() const
Is binary operation.
void set_nz(const MX &m, bool ind1, const Matrix< casadi_int > &kk)
void get(MX &m, bool ind1, casadi_int rr, const Slice &cc) const
std::vector< SX > split_primitives(const SX &x) const
Split up an expression along symbolic primitives.
bool is_unary() const
Is unary operation.
static MX einstein(const MX &A, const MX &B, const std::vector< casadi_int > &dim_a, const std::vector< casadi_int > &dim_b, const std::vector< casadi_int > &dim_c, const std::vector< casadi_int > &a, const std::vector< casadi_int > &b, const std::vector< casadi_int > &c)
Computes an einstein dense tensor contraction.
bool is_zero() const
check if zero (note that false negative answers are possible)
bool is_transpose() const
Is the expression a transpose?
void get_nz(MX &m, bool ind1, const Slice &kk) const
static MX unary(casadi_int op, const MX &x)
Create nodes by their ID.
bool is_symbolic() const
Check if symbolic.
void enlarge(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc, bool ind1=false)
Enlarge matrix.
MX printme(const MX &b) const
static std::vector< MX > get_input(const Function &f)
Get function inputs.
MX get_output(casadi_int oind) const
Get an output.
casadi_int op() const
Get operation type.
static DM bspline_dual(const std::vector< double > &x, const std::vector< std::vector< double > > &knots, const std::vector< casadi_int > °ree, const Dict &opts=Dict())
static MX inf(const Sparsity &sp)
create a matrix with all inf
Sparse matrix class. SX and DM are specializations.
Helper class for Serialization.
SharedObject implements a reference counting framework similar for efficient and.
Class representing a Slice.
std::map< std::string, MX > MXDict
std::vector< MX > MXVector
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::vector< MXVector > MXVectorVector
std::initializer_list< MX > MXIList