26 #ifndef CASADI_MATRIX_DECL_HPP
27 #define CASADI_MATRIX_DECL_HPP
29 #include "matrix_fwd.hpp"
30 #include "exception.hpp"
31 #include "casadi_limits.hpp"
32 #include "runtime/casadi_runtime.hpp"
33 #include "generic_matrix.hpp"
34 #include "generic_expression.hpp"
35 #include "printable.hpp"
40 #include <initializer_list>
41 #ifdef CASADI_WITH_THREAD
42 #ifdef CASADI_WITH_THREAD_MINGW
43 #include <mingw.mutex.h>
63 template <
typename Scalar>
inline std::string matrixName()
64 {
return std::string(
"Matrix<") +
typeid(Scalar).name() + std::string(
">");}
65 template<>
inline std::string matrixName<double>() {
return "DM"; }
66 template<>
inline std::string matrixName<casadi_int>() {
return "IM"; }
94 template<
typename Scalar>
97 public SWIG_IF_ELSE(GenericExpressionCommon, GenericExpression<Matrix<Scalar> >),
99 public SWIG_IF_ELSE(PrintableCommon, Printable<Matrix<Scalar> >) {
119 Matrix(casadi_int nrow, casadi_int ncol);
125 explicit Matrix(
const std::pair<casadi_int, casadi_int>& rc);
130 std::vector<Scalar>* operator->();
135 const std::vector<Scalar>* operator->()
const;
153 #if !(defined(SWIG) && defined(SWIGMATLAB))
155 explicit Matrix(
const std::vector< std::vector<double> >& m);
162 nonzeros_(std::vector<Scalar>(x.size())) {
163 auto x_it = x.begin();
164 for (
auto&& d : nonzeros_) d =
static_cast<Scalar
>(*x_it++);
174 Matrix(
const Matrix<A>& x) : sparsity_(x.sparsity()), nonzeros_(std::vector<Scalar>(x.nnz())) {
175 auto x_it = x->begin();
176 for (
auto&& d : nonzeros_) d =
static_cast<Scalar
>(*x_it++);
181 Matrix(
const std::vector<Scalar>& x);
184 Matrix(std::initializer_list<Scalar> x) :
Matrix<Scalar>(std::vector<Scalar>(x)) {}
187 const Scalar scalar()
const;
190 typedef Scalar ScalarType;
193 typedef GenericMatrix<Matrix<Scalar> > B;
226 bool has_nz(casadi_int rr, casadi_int cc)
const;
229 bool __nonzero__()
const;
233 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
const Slice& rr)
const;
234 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
const Matrix<casadi_int>& rr)
const;
235 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
const Sparsity& sp)
const;
240 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
241 const Slice& rr,
const Slice& cc)
const;
242 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
243 const Slice& rr,
const Matrix<casadi_int>& cc)
const;
244 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
245 const Matrix<casadi_int>& rr,
const Slice& cc)
const;
246 void get(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
247 const Matrix<casadi_int>& rr,
const Matrix<casadi_int>& cc)
const;
252 void set(
const Matrix<Scalar>& m,
bool ind1,
const Slice& rr);
253 void set(
const Matrix<Scalar>& m,
bool ind1,
const Matrix<casadi_int>& rr);
254 void set(
const Matrix<Scalar>& m,
bool ind1,
const Sparsity& sp);
259 void set(
const Matrix<Scalar>& m,
bool ind1,
const Slice& rr,
const Slice& cc);
260 void set(
const Matrix<Scalar>& m,
bool ind1,
const Slice& rr,
const Matrix<casadi_int>& cc);
261 void set(
const Matrix<Scalar>& m,
bool ind1,
const Matrix<casadi_int>& rr,
const Slice& cc);
262 void set(
const Matrix<Scalar>& m,
bool ind1,
const Matrix<casadi_int>& rr,
263 const Matrix<casadi_int>& cc);
268 void get_nz(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
const Slice& k)
const;
269 void get_nz(Matrix<Scalar>& SWIG_OUTPUT(m),
bool ind1,
const Matrix<casadi_int>& k)
const;
274 void set_nz(
const Matrix<Scalar>& m,
bool ind1,
const Slice& k);
275 void set_nz(
const Matrix<Scalar>& m,
bool ind1,
const Matrix<casadi_int>& k);
294 static std::vector< Matrix<Scalar> > call(
const Function& f,
296 static std::vector< Scalar > call(
const Function& f,
const std::vector< Scalar > &x);
323 static std::vector<Matrix<Scalar> >
327 static void substitute_inplace(
const std::vector<
Matrix<Scalar> >& v,
333 const std::string& lsolver,
const Dict& opts);
338 const std::string& lsolver,
const Dict& opts);
341 const std::string& lsolver,
const Dict& opts);
345 const std::vector<std::string>& args);
351 const std::string& v_prefix,
352 const std::string& v_suffix);
363 bool short_circuit=
false);
367 bool short_circuit=
false);
377 static std::vector<Matrix<Scalar> > symvar(
const Matrix<Scalar> &x);
392 const Sparsity& sp,
bool intersect=
false);
398 const std::vector<casadi_int>& dim_a,
const std::vector<casadi_int>& dim_b,
399 const std::vector<casadi_int>& dim_c,
400 const std::vector<casadi_int>& a,
const std::vector<casadi_int>& b,
401 const std::vector<casadi_int>& c);
404 const std::vector<casadi_int>& dim_a,
const std::vector<casadi_int>& dim_b,
405 const std::vector<casadi_int>& dim_c,
406 const std::vector<casadi_int>& a,
const std::vector<casadi_int>& b,
407 const std::vector<casadi_int>& c);
410 static std::vector< Matrix<Scalar> > cse(
const std::vector<
Matrix<Scalar> >& e);
417 static std::vector<Matrix<Scalar> >
419 const std::vector<casadi_int>& offset);
421 static std::vector< Matrix<Scalar> >
423 const std::vector<casadi_int>& offset);
424 static std::vector< Matrix<Scalar> >
426 const std::vector<casadi_int>& offset1,
427 const std::vector<casadi_int>& offset2);
468 static std::vector<std::vector<Matrix<Scalar> > >
473 static std::vector<std::vector<Matrix<Scalar> > >
479 casadi_int order=1,
bool tr=
false);
487 const std::vector<casadi_int>& order_contributions);
494 std::vector<casadi_int>& pc,
bool amd=
true);
497 const std::vector<casadi_int>& prinv,
498 const std::vector<casadi_int>& pc,
bool tr=
false);
501 std::vector<casadi_int>& p,
bool amd=
true);
521 #if !defined(SWIG) || defined(DOXYGEN)
566 std::vector<casadi_int>& pc,
bool amd=
true) {
576 const std::vector<casadi_int>& prinv,
577 const std::vector<casadi_int>& pc,
bool tr=
false) {
599 std::vector<casadi_int>& p,
bool amd=
true) {
608 const std::vector<casadi_int>& p) {
753 casadi_int order=5) {
836 const std::vector<casadi_int>& order_contributions) {
903 static std::string type_name();
906 void print_split(std::vector<std::string>& SWIG_OUTPUT(nz),
907 std::vector<std::string>& SWIG_OUTPUT(inter))
const;
910 void disp(std::ostream& stream,
bool more=
false)
const;
916 void print_scalar(std::ostream &stream)
const;
919 void print_vector(std::ostream &stream,
bool truncate=
true)
const;
922 void print_dense(std::ostream &stream,
bool truncate=
true)
const;
925 void print_sparse(std::ostream &stream,
bool truncate=
true)
const;
929 static void print_default(std::ostream &stream,
const Sparsity& sp,
const Scalar* nonzeros,
933 static void print_scalar(std::ostream &stream,
const Scalar& e);
936 static void print_vector(std::ostream &stream,
const Sparsity& sp,
const Scalar* nonzeros,
940 static void print_sparse(std::ostream &stream,
const Sparsity& sp,
const Scalar* nonzeros,
944 static void print_split(casadi_int nnz,
const Scalar* nonzeros, std::vector<std::string>& nz,
945 std::vector<std::string>& inter);
948 static void print_dense(std::ostream &stream,
const Sparsity& sp,
const Scalar* nonzeros,
953 void resize(casadi_int nrow, casadi_int ncol);
955 void reserve(casadi_int nnz, casadi_int ncol);
962 void erase(
const std::vector<casadi_int>& rr,
const std::vector<casadi_int>& cc,
970 void erase(
const std::vector<casadi_int>& rr,
bool ind1=
false);
977 void remove(
const std::vector<casadi_int>& rr,
const std::vector<casadi_int>& cc);
985 void enlarge(casadi_int nrow, casadi_int ncol,
986 const std::vector<casadi_int>& rr,
const std::vector<casadi_int>& cc,
992 std::vector<Scalar>& nonzeros();
993 const std::vector<Scalar>& nonzeros()
const;
999 const Scalar* ptr()
const;
1000 friend inline Scalar* get_ptr(
Matrix<Scalar>& v) {
return v.ptr(); }
1001 friend inline const Scalar* get_ptr(
const Matrix<Scalar>& v) {
return v.ptr(); }
1005 const Sparsity& sparsity()
const;
1026 const std::vector<casadi_int>& col,
1029 const std::vector<casadi_int>& col,
1032 const std::vector<casadi_int>& col,
1034 const std::pair<casadi_int, casadi_int>& rc);
1127 bool has_duplicates()
const;
1132 void reset_input()
const;
1219 template<
typename A>
1220 std::vector<A> get_nonzeros()
const;
1226 explicit operator double()
const;
1231 explicit operator casadi_int()
const;
1237 template<
typename A>
1238 explicit operator std::vector<A>()
const;
1263 static void set_precision(casadi_int precision);
1264 static void set_width(casadi_int width);
1265 static void set_scientific(
bool scientific);
1269 static void rng(casadi_int seed);
1280 const std::pair<casadi_int, casadi_int>& rc);
1306 void serialize(std::ostream &stream)
const;
1347 void to_file(
const std::string& filename,
const std::string& format=
"")
const;
1349 static void to_file(
const std::string& filename,
const Sparsity& sp,
1350 const Scalar* nonzeros,
const std::string& format=
"");
1361 Matrix(
const Sparsity& sp,
const std::vector<Scalar>& d,
bool dummy);
1367 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
1368 static std::mutex& get_mutex_temp();
1376 std::vector<Scalar> nonzeros_;
1379 static casadi_int stream_precision_;
1380 static casadi_int stream_width_;
1381 static bool stream_scientific_;
1384 static std::default_random_engine rng_;
1390 template<
typename Scalar>
1391 template<
typename A>
1393 std::vector<A> ret(nnz());
1394 auto r = ret.begin();
1395 for (
auto&& e : nonzeros()) *r++ =
static_cast<A
>(e);
1400 template<
typename Scalar>
1401 template<
typename A>
1404 casadi_int size1 = this->size1(), size2 = this->size2();
1405 const casadi_int *colind = this->colind(), *row = this->row();
1407 auto it = nonzeros().begin();
1408 std::vector<A> ret(numel(), 0);
1409 for (casadi_int cc=0; cc<size2; ++cc) {
1410 for (casadi_int el=colind[cc]; el<colind[cc+1]; ++el) {
1411 ret[row[el] + cc*size1] =
static_cast<A
>(*it++);
Helper class for Serialization.
Sparse matrix class. SX and DM are specializations.
Matrix(const Matrix< A > &x)
Create a matrix from another matrix with a different entry type.
static Matrix< Scalar > nan(const std::pair< casadi_int, casadi_int > &rc)
create a matrix with all nan
bool has_zeros() const
Check if the matrix has any zero entries which are not structural zeros.
static Matrix< Scalar > deserialize(const std::string &s)
Build Sparsity from serialization.
bool is_one() const
check if the matrix is 1 (note that false negative answers are possible)
void remove(const std::vector< casadi_int > &rr, const std::vector< casadi_int > &cc)
Remove columns and rows.
bool is_regular() const
Checks if expression does not contain NaN or Inf.
Matrix(double val)
This constructor enables implicit type conversion from a numeric type.
Matrix< Scalar > T() const
Transpose the matrix.
static void set_max_depth(casadi_int eq_depth=1)
Set or reset the depth to which equalities are being checked for simplifications.
Function which_function() const
Get function - only valid when is_call() is true.
static Matrix< Scalar > rand(const Sparsity &sp)
Create a matrix with uniformly distributed random numbers.
void resize(casadi_int nrow, casadi_int ncol)
Sparsity get_sparsity() const
Get an owning reference to the sparsity pattern.
static Matrix< Scalar > deserialize(std::istream &stream)
Build Sparsity from serialization.
casadi_int element_hash() const
Returns a number that is unique for a given symbolic scalar.
casadi_int which_output() const
Get the index of evaluation output - only valid when is_output() is true.
void erase(const std::vector< casadi_int > &rr, bool ind1=false)
Erase a submatrix (leaving structural zeros in its place)
void export_code(const std::string &lang, std::ostream &stream=casadi::uout(), const Dict &options=Dict()) const
Export matrix in specific language.
void serialize(SerializingStream &s) const
Serialize an object.
bool is_commutative() const
Check whether a binary SX is commutative.
bool is_symbolic() const
Check if symbolic (Dense)
Matrix(const Sparsity &sp)
Create a sparse matrix from a sparsity pattern.
static std::vector< Matrix< Scalar > > get_free(const Function &f)
Get free.
Matrix(casadi_int nrow, casadi_int ncol)
Create a sparse matrix with all structural zeros.
static casadi_int get_max_depth()
Get the depth to which equalities are being checked for simplifications.
bool is_call() const
Check if function call.
Matrix< Scalar > operator+() const
bool is_smooth() const
Check if smooth.
static Matrix< Scalar > nan(const Sparsity &sp)
create a matrix with all nan
static Matrix< Scalar > triplet(const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, const Matrix< Scalar > &d, casadi_int nrow, casadi_int ncol)
Construct a sparse matrix from triplet form.
bool is_minus_one() const
check if the matrix is -1 (note that false negative answers are possible)
void to_file(const std::string &filename, const std::string &format="") const
static Matrix< Scalar > triplet(const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, const Matrix< Scalar > &d)
Construct a sparse matrix from triplet form.
void disp(std::ostream &stream, bool more=false) const
Print a representation of the object.
static Matrix< Scalar > rand(casadi_int nrow=1, casadi_int ncol=1)
Create a matrix with uniformly distributed random numbers.
bool is_eye() const
check if the matrix is an identity matrix (note that false negative answers
bool is_op(casadi_int op) const
Is it a certain operation.
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 Matrix< Scalar > inf(casadi_int nrow=1, casadi_int ncol=1)
create a matrix with all inf
bool is_output() const
Check if evaluation output.
std::vector< Scalar > get_elements() const
Get all elements.
static Matrix< Scalar > triplet(const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, const Matrix< Scalar > &d, const std::pair< casadi_int, casadi_int > &rc)
Construct a sparse matrix from triplet form.
Matrix(const std::vector< std::vector< double > > &m)
Dense matrix constructor with data given as vector of vectors.
static std::vector< Matrix< Scalar > > get_input(const Function &f)
Get function input.
Matrix< Scalar > dep(casadi_int ch=0) const
Get expressions of the children of the expression.
bool is_zero() const
check if the matrix is 0 (note that false negative answers are possible)
static Matrix< Scalar > inf(const Sparsity &sp)
create a matrix with all inf
static Matrix< double > from_file(const std::string &filename, const std::string &format_hint="")
std::string serialize() const
Serialize.
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.
static Matrix< Scalar > deserialize(DeserializingStream &s)
bool is_constant() const
Check if the matrix is constant (note that false negative answers are possible)
Matrix(const std::vector< A > &x)
Create an expression from a vector.
bool has_output() const
Check if a multiple output node.
void reserve(casadi_int nnz)
casadi_int op() const
Get operation type.
void reserve(casadi_int nnz, casadi_int ncol)
static Matrix< Scalar > eye(casadi_int n)
create an n-by-n identity matrix
bool is_valid_input() const
Check if matrix can be used to define function inputs.
Matrix(const Sparsity &sp, const Matrix< Scalar > &d)
Construct matrix with a given sparsity and nonzeros.
static Matrix< Scalar > rand(const std::pair< casadi_int, casadi_int > &rc)
Create a matrix with uniformly distributed random numbers.
Matrix< Scalar > get_output(casadi_int oind) const
Get an output.
bool is_integer() const
Check if the matrix is integer-valued.
Matrix< Scalar > operator-() const
casadi_int n_dep() const
Get the number of dependencies of a binary SXElem.
static Matrix< Scalar > nan(casadi_int nrow=1, casadi_int ncol=1)
create a matrix with all nan
static Matrix< Scalar > inf(const std::pair< casadi_int, casadi_int > &rc)
create a matrix with all inf
std::string get_str(bool more=false) const
Get string representation.
Matrix< Scalar > printme(const Matrix< Scalar > &y) const
bool is_leaf() const
Check if SX is a leaf of the SX graph.
std::string name() const
Get name (only if symbolic scalar)
std::vector< Scalar > get_nonzeros() const
Get all nonzeros.
Helper class for Serialization.
CASADI_EXPORT std::ostream & uout()
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.