1 #ifndef SYMENGINE_MATRIX_H
2 #define SYMENGINE_MATRIX_H
11 SYMENGINE_DENSE_MATRIX,
21 virtual MatrixTypeID get_type_code()
const = 0;
23 bool is_square()
const
25 return ncols() == nrows();
32 virtual unsigned nrows()
const = 0;
33 virtual unsigned ncols()
const = 0;
36 virtual tribool is_real(
const Assumptions *assumptions =
nullptr)
const = 0;
39 virtual RCP<const Basic> get(
unsigned i,
unsigned j)
const = 0;
40 virtual void set(
unsigned i,
unsigned j,
const RCP<const Basic> &e) = 0;
44 virtual std::string __str__()
const;
46 virtual unsigned rank()
const = 0;
47 virtual RCP<const Basic> det()
const = 0;
48 virtual void inv(
MatrixBase &result)
const = 0;
51 virtual void add_matrix(
const MatrixBase &other,
55 virtual void mul_matrix(
const MatrixBase &other,
59 virtual void elementwise_mul_matrix(
const MatrixBase &other,
63 virtual void add_scalar(
const RCP<const Basic> &k,
67 virtual void mul_scalar(
const RCP<const Basic> &k,
74 virtual void transpose(
MatrixBase &result)
const = 0;
77 virtual void conjugate_transpose(
MatrixBase &result)
const = 0;
80 virtual void submatrix(
MatrixBase &result,
unsigned row_start,
81 unsigned col_start,
unsigned row_end,
82 unsigned col_end,
unsigned row_step = 1,
83 unsigned col_step = 1)
const = 0;
100 virtual void cholesky(
MatrixBase &L)
const = 0;
106 typedef std::vector<std::pair<int, int>> permutelist;
118 DenseMatrix(
unsigned row,
unsigned col,
const vec_basic &l);
122 const static MatrixTypeID type_code_id = SYMENGINE_DENSE_MATRIX;
123 virtual MatrixTypeID get_type_code()
const override
125 return SYMENGINE_DENSE_MATRIX;
128 void resize(
unsigned i,
unsigned j);
134 RCP<const Basic> get(
unsigned i,
unsigned j)
const override;
135 void set(
unsigned i,
unsigned j,
const RCP<const Basic> &e)
override;
136 virtual vec_basic as_vec_basic()
const;
138 unsigned nrows()
const override
142 unsigned ncols()
const override
148 std::string dumps()
const;
153 virtual bool is_lower()
const;
154 virtual bool is_upper()
const;
155 virtual tribool is_zero()
const;
156 virtual tribool is_diagonal()
const;
157 tribool is_real(
const Assumptions *assumptions =
nullptr)
const override;
158 virtual tribool is_symmetric()
const;
159 virtual tribool is_hermitian()
const;
160 virtual tribool is_weakly_diagonally_dominant()
const;
161 virtual tribool is_strictly_diagonally_dominant()
const;
162 virtual tribool is_positive_definite()
const;
163 virtual tribool is_negative_definite()
const;
165 RCP<const Basic> trace()
const;
166 unsigned rank()
const override;
167 RCP<const Basic> det()
const override;
177 void elementwise_mul_matrix(
const MatrixBase &other,
181 void add_scalar(
const RCP<const Basic> &k,
185 void mul_scalar(
const RCP<const Basic> &k,
192 void transpose(
MatrixBase &result)
const override;
195 void conjugate_transpose(
MatrixBase &result)
const override;
198 void submatrix(
MatrixBase &result,
unsigned row_start,
unsigned col_start,
199 unsigned row_end,
unsigned col_end,
unsigned row_step = 1,
200 unsigned col_step = 1)
const override;
224 SYMENGINE_EXPORT
friend void jacobian(
const DenseMatrix &A,
228 SYMENGINE_EXPORT
friend void sjacobian(
const DenseMatrix &A,
234 SYMENGINE_EXPORT
friend void diff(
const DenseMatrix &A,
235 const RCP<const Symbol> &x,
238 SYMENGINE_EXPORT
friend void sdiff(
const DenseMatrix &A,
239 const RCP<const Basic> &x,
243 SYMENGINE_EXPORT
friend void
245 SYMENGINE_EXPORT
friend void add_dense_scalar(
const DenseMatrix &A,
246 const RCP<const Basic> &k,
248 SYMENGINE_EXPORT
friend void
250 SYMENGINE_EXPORT
friend void
253 SYMENGINE_EXPORT
friend void mul_dense_scalar(
const DenseMatrix &A,
254 const RCP<const Basic> &k,
256 SYMENGINE_EXPORT
friend void conjugate_dense(
const DenseMatrix &A,
258 SYMENGINE_EXPORT
friend void transpose_dense(
const DenseMatrix &A,
260 SYMENGINE_EXPORT
friend void conjugate_transpose_dense(
const DenseMatrix &A,
262 SYMENGINE_EXPORT
friend void
264 unsigned col_start,
unsigned row_end,
unsigned col_end,
265 unsigned row_step,
unsigned col_step);
268 void row_insert(
const DenseMatrix &B,
unsigned pos);
269 void col_insert(
const DenseMatrix &B,
unsigned pos);
270 void row_del(
unsigned k);
271 void col_del(
unsigned k);
274 SYMENGINE_EXPORT
friend void row_exchange_dense(
DenseMatrix &A,
unsigned i,
276 SYMENGINE_EXPORT
friend void
277 row_mul_scalar_dense(
DenseMatrix &A,
unsigned i, RCP<const Basic> &c);
278 SYMENGINE_EXPORT
friend void row_add_row_dense(
DenseMatrix &A,
unsigned i,
280 RCP<const Basic> &c);
281 SYMENGINE_EXPORT
friend void permuteFwd(
DenseMatrix &A, permutelist &pl);
284 SYMENGINE_EXPORT
friend void column_exchange_dense(
DenseMatrix &A,
285 unsigned i,
unsigned j);
288 SYMENGINE_EXPORT
friend void
290 permutelist &pivotlist);
291 SYMENGINE_EXPORT
friend void
293 SYMENGINE_EXPORT
friend void pivoted_fraction_free_gaussian_elimination(
295 SYMENGINE_EXPORT
friend void
297 permutelist &pivotlist);
298 SYMENGINE_EXPORT
friend void
299 fraction_free_gauss_jordan_elimination(
const DenseMatrix &A,
301 SYMENGINE_EXPORT
friend void pivoted_fraction_free_gauss_jordan_elimination(
303 friend unsigned pivot(
DenseMatrix &B,
unsigned r,
unsigned c);
305 SYMENGINE_EXPORT
friend void reduced_row_echelon_form(
const DenseMatrix &A,
307 vec_uint &pivot_cols,
308 bool normalize_last);
311 SYMENGINE_EXPORT
friend void
313 SYMENGINE_EXPORT
friend void back_substitution(
const DenseMatrix &U,
316 SYMENGINE_EXPORT
friend void forward_substitution(
const DenseMatrix &A,
319 SYMENGINE_EXPORT
friend void fraction_free_gaussian_elimination_solve(
321 SYMENGINE_EXPORT
friend void
326 SYMENGINE_EXPORT
friend void fraction_free_LU(
const DenseMatrix &A,
330 SYMENGINE_EXPORT
friend void pivoted_LU(
const DenseMatrix &A,
332 SYMENGINE_EXPORT
friend void pivoted_LU(
const DenseMatrix &A,
335 SYMENGINE_EXPORT
friend void fraction_free_LDU(
const DenseMatrix &A,
346 SYMENGINE_EXPORT
friend bool is_symmetric_dense(
const DenseMatrix &A);
349 SYMENGINE_EXPORT
friend RCP<const Basic> det_bareis(
const DenseMatrix &A);
350 SYMENGINE_EXPORT
friend void berkowitz(
const DenseMatrix &A,
351 std::vector<DenseMatrix> &polys);
354 SYMENGINE_EXPORT
friend void inverse_fraction_free_LU(
const DenseMatrix &A,
356 SYMENGINE_EXPORT
friend void inverse_LU(
const DenseMatrix &A,
358 SYMENGINE_EXPORT
friend void inverse_pivoted_LU(
const DenseMatrix &A,
360 SYMENGINE_EXPORT
friend void inverse_gauss_jordan(
const DenseMatrix &A,
366 SYMENGINE_EXPORT
friend void cross(
const DenseMatrix &A,
370 SYMENGINE_EXPORT
friend void eye(
DenseMatrix &A,
int k);
371 SYMENGINE_EXPORT
friend void diag(
DenseMatrix &A, vec_basic &v,
int k);
373 SYMENGINE_EXPORT
friend void zeros(
DenseMatrix &A);
384 tribool shortcut_to_posdef()
const;
385 tribool is_positive_definite_GE();
394 CSRMatrix(
unsigned row,
unsigned col,
const std::vector<unsigned> &p,
395 const std::vector<unsigned> &j,
const vec_basic &x);
396 CSRMatrix(
unsigned row,
unsigned col, std::vector<unsigned> &&p,
397 std::vector<unsigned> &&j, vec_basic &&x);
400 const static MatrixTypeID type_code_id = SYMENGINE_CSR_MATRIX;
401 virtual MatrixTypeID get_type_code()
const override
403 return SYMENGINE_CSR_MATRIX;
405 std::tuple<std::vector<unsigned>, std::vector<unsigned>, vec_basic>
408 bool is_canonical()
const;
413 RCP<const Basic> get(
unsigned i,
unsigned j)
const override;
414 void set(
unsigned i,
unsigned j,
const RCP<const Basic> &e)
override;
416 unsigned nrows()
const override
420 unsigned ncols()
const override
425 tribool is_real(
const Assumptions *assumptions =
nullptr)
const override;
426 unsigned rank()
const override;
427 RCP<const Basic> det()
const override;
437 void elementwise_mul_matrix(
const MatrixBase &other,
441 void add_scalar(
const RCP<const Basic> &k,
445 void mul_scalar(
const RCP<const Basic> &k,
452 void transpose(
MatrixBase &result)
const override;
456 void conjugate_transpose(
MatrixBase &result)
const override;
459 void submatrix(
MatrixBase &result,
unsigned row_start,
unsigned col_start,
460 unsigned row_end,
unsigned col_end,
unsigned row_step = 1,
461 unsigned col_step = 1)
const override;
484 static void csr_sum_duplicates(std::vector<unsigned> &p_,
485 std::vector<unsigned> &j_, vec_basic &x_,
488 static void csr_sort_indices(std::vector<unsigned> &p_,
489 std::vector<unsigned> &j_, vec_basic &x_,
492 static bool csr_has_sorted_indices(
const std::vector<unsigned> &p_,
493 const std::vector<unsigned> &j_,
496 static bool csr_has_duplicates(
const std::vector<unsigned> &p_,
497 const std::vector<unsigned> &j_,
500 static bool csr_has_canonical_format(
const std::vector<unsigned> &p_,
501 const std::vector<unsigned> &j_,
504 static CSRMatrix from_coo(
unsigned row,
unsigned col,
505 const std::vector<unsigned> &i,
506 const std::vector<unsigned> &j,
508 static CSRMatrix jacobian(
const vec_basic &exprs,
const vec_sym &x,
509 bool diff_cache =
true);
511 bool diff_cache =
true);
513 SYMENGINE_EXPORT
friend void
515 SYMENGINE_EXPORT
friend void
517 SYMENGINE_EXPORT
friend void csr_diagonal(
const CSRMatrix &A,
519 SYMENGINE_EXPORT
friend void csr_scale_rows(
CSRMatrix &A,
521 SYMENGINE_EXPORT
friend void csr_scale_columns(
CSRMatrix &A,
524 SYMENGINE_EXPORT
friend void csr_binop_csr_canonical(
526 RCP<const Basic> (&bin_op)(
const RCP<const Basic> &,
527 const RCP<const Basic> &));
530 std::vector<unsigned> p_;
531 std::vector<unsigned> j_;
541 bool diff_cache =
true);
545 bool diff_cache =
true);
550 bool diff_cache =
true);
554 bool diff_cache =
true);
559 unsigned col_start,
unsigned row_end,
unsigned col_end,
560 unsigned row_step = 1,
unsigned col_step = 1);
563 SYMENGINE_EXPORT
void row_exchange_dense(
DenseMatrix &A,
unsigned i,
565 SYMENGINE_EXPORT
void row_mul_scalar_dense(
DenseMatrix &A,
unsigned i,
566 RCP<const Basic> &c);
569 void row_add_row_dense(
DenseMatrix &A,
unsigned i,
unsigned j,
570 RCP<const Basic> &c);
573 SYMENGINE_EXPORT
void column_exchange_dense(
DenseMatrix &A,
unsigned i,
589 SYMENGINE_EXPORT
void inverse_fraction_free_LU(
const DenseMatrix &A,
592 SYMENGINE_EXPORT
void inverse_gauss_jordan(
const DenseMatrix &A,
601 void fraction_free_gauss_jordan_solve(
const DenseMatrix &A,
616 SYMENGINE_EXPORT RCP<const Basic> det_berkowitz(
const DenseMatrix &A);
624 SYMENGINE_EXPORT RCP<const Set> eigen_values(
const DenseMatrix &A);
627 SYMENGINE_EXPORT
void eye(
DenseMatrix &A,
int k = 0);
630 SYMENGINE_EXPORT
void diag(
DenseMatrix &A, vec_basic &v,
int k = 0);
641 vec_uint &pivot_cols,
642 bool normalize_last =
false);
649 return T::type_code_id == b.get_type_code();
663 return not lhs.eq(rhs);
669 inline std::ostream &
operator<<(std::ostream &out,
672 return out << A.__str__();
The base class for SymEngine.
Main namespace for SymEngine package.
RCP< const Basic > conjugate(const RCP< const Basic > &arg)
Canonicalize Conjugate.
bool is_a(const Basic &b)
Templatised version to check is_a type.
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
std::ostream & operator<<(std::ostream &out, const SymEngine::Basic &p)
<< Operator