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;
34 virtual bool eq(
const MatrixBase &other)
const;
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;
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,
71 virtual void conjugate(
MatrixBase &result)
const = 0;
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;
122 const static MatrixTypeID type_code_id = SYMENGINE_DENSE_MATRIX;
123 virtual MatrixTypeID get_type_code()
const
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;
138 unsigned nrows()
const override
142 unsigned ncols()
const override
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,
189 void conjugate(
MatrixBase &result)
const override;
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;
231 friend void diff(
const DenseMatrix &A,
const RCP<const Symbol> &x,
234 friend void sdiff(
const DenseMatrix &A,
const RCP<const Basic> &x,
244 friend void elementwise_mul_dense_dense(
const DenseMatrix &A,
253 unsigned row_start,
unsigned col_start,
254 unsigned row_end,
unsigned col_end,
255 unsigned row_step,
unsigned col_step);
258 void row_insert(
const DenseMatrix &B,
unsigned pos);
259 void col_insert(
const DenseMatrix &B,
unsigned pos);
260 void row_del(
unsigned k);
261 void col_del(
unsigned k);
264 friend void row_exchange_dense(
DenseMatrix &A,
unsigned i,
unsigned j);
265 friend void row_mul_scalar_dense(
DenseMatrix &A,
unsigned i,
266 RCP<const Basic> &c);
267 friend void row_add_row_dense(
DenseMatrix &A,
unsigned i,
unsigned j,
268 RCP<const Basic> &c);
272 friend void column_exchange_dense(
DenseMatrix &A,
unsigned i,
unsigned j);
275 friend void pivoted_gaussian_elimination(
const DenseMatrix &A,
278 friend void fraction_free_gaussian_elimination(
const DenseMatrix &A,
280 friend void pivoted_fraction_free_gaussian_elimination(
282 friend void pivoted_gauss_jordan_elimination(
const DenseMatrix &A,
285 friend void fraction_free_gauss_jordan_elimination(
const DenseMatrix &A,
287 friend void pivoted_fraction_free_gauss_jordan_elimination(
289 friend unsigned pivot(
DenseMatrix &B,
unsigned r,
unsigned c);
293 bool normalize_last);
302 friend void fraction_free_gaussian_elimination_solve(
const DenseMatrix &A,
305 friend void fraction_free_gauss_jordan_solve(
const DenseMatrix &A,
323 friend bool is_symmetric_dense(
const DenseMatrix &A);
326 friend RCP<const Basic> det_bareis(
const DenseMatrix &A);
356 tribool shortcut_to_posdef()
const;
357 tribool is_positive_definite_GE();
372 const static MatrixTypeID type_code_id = SYMENGINE_CSR_MATRIX;
373 virtual MatrixTypeID get_type_code()
const
375 return SYMENGINE_CSR_MATRIX;
380 bool is_canonical()
const;
382 bool eq(
const MatrixBase &other)
const override;
385 RCP<const Basic> get(
unsigned i,
unsigned j)
const override;
386 void set(
unsigned i,
unsigned j,
const RCP<const Basic> &e)
override;
388 unsigned nrows()
const override
392 unsigned ncols()
const override
397 tribool is_real(
const Assumptions *assumptions =
nullptr)
const override;
398 unsigned rank()
const override;
399 RCP<const Basic> det()
const override;
409 void elementwise_mul_matrix(
const MatrixBase &other,
413 void add_scalar(
const RCP<const Basic> &k,
417 void mul_scalar(
const RCP<const Basic> &k,
421 void conjugate(
MatrixBase &result)
const override;
424 void transpose(
MatrixBase &result)
const override;
428 void conjugate_transpose(
MatrixBase &result)
const override;
431 void submatrix(
MatrixBase &result,
unsigned row_start,
unsigned col_start,
432 unsigned row_end,
unsigned col_end,
unsigned row_step = 1,
433 unsigned col_step = 1)
const override;
476 static CSRMatrix from_coo(
unsigned row,
unsigned col,
481 bool diff_cache =
true);
483 bool diff_cache =
true);
493 friend void csr_binop_csr_canonical(
495 RCP<const Basic> (&bin_op)(
const RCP<const Basic> &,
496 const RCP<const Basic> &));
509 bool diff_cache =
true);
512 bool diff_cache =
true);
516 bool diff_cache =
true);
519 bool diff_cache =
true);
523 unsigned col_start,
unsigned row_end,
unsigned col_end,
524 unsigned row_step = 1,
unsigned col_step = 1);
527 void row_exchange_dense(
DenseMatrix &A,
unsigned i,
unsigned j);
528 void row_mul_scalar_dense(
DenseMatrix &A,
unsigned i, RCP<const Basic> &c);
529 void row_add_row_dense(
DenseMatrix &A,
unsigned i,
unsigned j,
530 RCP<const Basic> &c);
533 void column_exchange_dense(
DenseMatrix &A,
unsigned i,
unsigned j);
554 void fraction_free_gauss_jordan_solve(
const DenseMatrix &A,
565 RCP<const Basic> det_berkowitz(
const DenseMatrix &A);
590 bool normalize_last =
false);
597 return T::type_code_id == b.get_type_code();
611 return not lhs.eq(rhs);
620 return out << A.__str__();
The base class for SymEngine.
static DenseMatrix loads(const std::string &)
Creates an instance of a serialized string.
std::string dumps() const
Returns a string of the instance serialized.
Main namespace for SymEngine package.
bool is_a(const Basic &b)
Templatised version to check is_a type.
std::ostream & operator<<(std::ostream &out, const SymEngine::Basic &p)
<< Operator
RCP< const Basic > conjugate(const RCP< const Basic > &arg)
Canonicalize Conjugate.