3#ifndef _mutable_mat_defs_hpp_
4#define _mutable_mat_defs_hpp_
167template <
typename CoeffRing>
170 int nrows =
static_cast<int>(A.
numRows());
174 if (nrows == 0 || ncols == 0)
return result.to_matrix();
176 for (
int r = 0; r < nrows; ++r)
177 for (
int c = 0; c < ncols; ++c)
179 const typename CoeffRing::ElementType & a = A.
entry(r,c);
180 if (not A.
ring().is_zero(a))
183 A.
ring().to_ring_elem(ra, a);
184 result.set_entry(r, c, ra);
188 result.compute_column_degrees();
189 return result.to_matrix();
191template <
typename CoeffRing>
194 int nrows =
static_cast<int>(A.
numRows());
198 if (nrows == 0 || ncols == 0)
return result.to_matrix();
201 for (
int c = 0; c < ncols; c++)
204 for (i.set(c); i.valid(); i.next())
207 int r =
static_cast<int>(i.row());
208 result.set_entry(r, c, a);
211 result.compute_column_degrees();
212 return result.to_matrix();
219 ERROR(
"column out of range");
229 ERROR(
"row out of range");
239template <
typename Mat>
245 typedef typename CoeffRing::elem
elem;
271 :
mRing(R),
mat(*coeffR, nrows, ncols)
287 class iterator :
public MutableMatrix::iterator
289 typename Mat::iterator i;
291 iterator(
const Mat *M0) : i(M0) {}
292 void set(
size_t col0) { i.set(col0); }
293 void next() { i.next(); }
294 bool valid() {
return i.valid(); }
295 size_t row() {
return i.row(); }
296 const elem& value() {
return i.value(); }
297 void copy_ring_elem(ring_elem &
result) { i.copy_elem(
result); }
302 virtual iterator *
begin()
const {
return new iterator(&
mat); }
306 virtual size_t n_cols()
const {
return mat.numColumns(); }
332 return MatOps::lead_row(
mat, col);
343 mat.ring().set_zero(b);
345 size_t ret = MatOps::lead_row(
mat, col, b);
346 if (ret !=
static_cast<size_t>(-1))
mat.ring().to_ring_elem(
result, b);
359 MatOps::getEntry(
mat, r, c, a);
360 bool is_nonzero = not
mat.ring().is_zero(a);
375 MatOps::setEntry(
mat, r, c, b);
390 MatOps::interchange_rows(
mat, i, j);
400 MatOps::interchange_columns(
mat, i, j);
410 MatOps::scale_row(
mat, i, b);
420 MatOps::scale_column(
mat, i, b);
430 MatOps::divide_row(
mat, i, b);
440 MatOps::divide_column(
mat, i, b);
449 if (i == j)
return true;
451 MatOps::row_op(
mat, i, b, j);
461 if (i == j)
return true;
463 MatOps::column_op(
mat, i, b, j);
480 if (c1 == c2)
return true;
485 MatOps::column2by2(
mat, c1, c2, aa1, aa2, bb1, bb2);
501 if (r1 == r2)
return true;
506 MatOps::row2by2(
mat, r1, r2, aa1, aa2, bb1, bb2);
516 mat.ring().set_zero(a);
517 MatOps::dot_product(
mat, c1, c2, a);
524 return MatOps::row_permute(
mat, start_row, perm);
529 return MatOps::column_permute(
mat, start_col, perm);
537 ERROR(
"cannot insert %l columns before column %ln", n_to_add, i);
540 MatOps::insert_columns(
mat, i, n_to_add);
549 ERROR(
"cannot insert %l rows before row %ln", n_to_add, i);
552 MatOps::insert_rows(
mat, i, n_to_add);
562 ERROR(
"column index out of range");
566 MatOps::delete_columns(
mat, i, j);
576 ERROR(
"row index out of range");
579 MatOps::delete_rows(
mat, i, j);
586 for (
size_t r = 0; r < rows->len; r++)
587 if (rows->array[r] < 0 || rows->array[r] >=
n_rows())
590 "row index %d out of bounds 0..%d", rows->array[r],
n_rows() - 1);
593 for (
size_t c = 0; c < cols->len; c++)
594 if (cols->array[c] < 0 || cols->array[c] >=
n_cols())
596 ERROR(
"column index %d out of bounds 0..%d",
602 MatOps::setFromSubmatrix(
getMat(), rows, cols,
result->getMat());
608 for (
size_t c = 0; c < cols->len; c++)
609 if (cols->array[c] < 0 || cols->array[c] >=
n_cols())
611 ERROR(
"column index %d out of bounds 0..%d",
617 MatOps::setFromSubmatrix(
getMat(), cols,
result->getMat());
651 if (B1 == NULL || &B1->
getMat().ring() != &
getMat().ring())
return false;
658 const Mat* B1 = B->coerce_const<Mat>();
661 ERROR(
"expected matrices with the same ring and sparsity");
666 ERROR(
"expected matrices with the same ring");
669 if (B1->numRows() !=
n_rows() || B1->numColumns() !=
n_cols())
671 ERROR(
"expected matrices of the same shape");
690 const Mat* B1 = B->coerce_const<Mat>();
693 ERROR(
"expected matrices with the same ring and sparsity");
698 ERROR(
"expected matrices with the same ring");
701 if (B1->numRows() !=
n_rows() || B1->numColumns() !=
n_cols())
703 ERROR(
"expected matrices of the same shape");
717 ERROR(
"expected same ring");
720 const ElementType& a =
mat.ring().from_ring_elem_const(f->get_value());
746 bool is_symm_or_hermitian)
const;
750 bool is_symm_or_hermitian)
const;
755 bool use_divide_and_conquer)
const;
759 bool assume_full_rank)
const;
767 virtual size_t rank()
const;
ElementType & entry(size_t row, size_t column)
const ACoeffRing & ring() const
size_t numColumns() const
Engine-side free module R^n over a Ring.
aring-style adapter for arbitrary-precision complex numbers, stored as (MPFR, MPFR) pairs.
aring-style adapter for double-precision complex numbers, stored as (double, double) pairs.
aring-style adapter for double-precision real numbers.
aring-style adapter for arbitrary-precision real numbers, backed by MPFR.
aring-style adapter for Z/p using a discrete-log (Zech) representation: every non-zero residue is its...
MutableEngineObject wrapper holding a raw SLEvaluator*.
MutableEngineObject wrapper that owns an SLProgram via unique_ptr.
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
virtual M2SLEvaluator * createCompiledSLEvaluator(M2_string libName, int nInputs, int nOutputs) const
MutableMat(const Ring *R, const CoeffRing *coeffR, size_t nrows, size_t ncols)
virtual bool row2by2(size_t r1, size_t r2, ring_elem a1, ring_elem a2, ring_elem b1, ring_elem b2)
virtual bool eigenvalues(MutableMatrix *eigenvals, bool is_symm_or_hermitian) const
virtual size_t rank() const
Fast linear algebra routines (well, fast for some rings).
EigenTypes< CoeffRing >::HermitianEigenvectorType HermitianEigenvectorType
CoeffRing::ElementType ElementType
virtual bool delete_columns(size_t i, size_t j)
EigenTypes< CoeffRing >::HermitianEigenvalueType HermitianEigenvalueType
virtual bool delete_rows(size_t i, size_t j)
virtual MutableMatrix * promote(const Ring *S) const
virtual const RingElement * determinant() const
EigenTypes< CoeffRing >::EigenvalueType EigenvalueType
virtual engine_RawArrayIntPairOrNull LQUPFactorizationInPlace(bool transpose)
LU decomposition routines /////.
virtual MutableMatrix * eval(const RingMap *F) const
virtual bool scale_column(size_t i, ring_elem r)
virtual bool QR(MutableMatrix *Q, MutableMatrix *R, bool return_QR) const
virtual M2_arrayintOrNull rankProfile(bool row_profile) const
virtual MutableMatrix * solveLinear(const MutableMatrix *B) const
virtual size_t n_rows() const
virtual MutableMat * copy(bool prefer_dense) const
virtual MutableMatrix * negate() const
MatElementaryOps< Mat > MatOps
virtual bool dot_product(size_t c1, size_t c2, ring_elem &result) const
virtual bool divide_row(size_t i, ring_elem r)
virtual bool scale_row(size_t i, ring_elem r)
virtual M2_arrayintOrNull LUincremental(std::vector< size_t > &P, const MutableMatrix *v, int i)
virtual MutableMat * add(const MutableMatrix *B) const
virtual bool insert_rows(size_t i, size_t n_to_add)
virtual bool get_entry(size_t r, size_t c, ring_elem &result) const
virtual M2SLEvaluator * createSLEvaluator(M2SLProgram *P, M2_arrayint constsPos, M2_arrayint varsPos) const
virtual size_t lead_row(size_t col) const
virtual gmp_RRorNull norm() const
virtual void subtractMultipleTo(const MutableMatrix *A, const MutableMatrix *B)
virtual bool column_op(size_t i, ring_elem r, size_t j)
virtual MutableMatrix * nullSpace() const
virtual bool column_permute(size_t start_col, M2_arrayint perm)
virtual MutableMatrix * lift(const Ring *R) const
virtual void reduce_by_pivots()
virtual bool divide_column(size_t i, ring_elem r)
virtual size_t n_cols() const
virtual MutableMatrix * solveInvertible(const MutableMatrix *B) const
virtual bool column2by2(size_t c1, size_t c2, ring_elem a1, ring_elem a2, ring_elem b1, ring_elem b2)
virtual bool is_equal(const MutableMatrix *B) const
virtual bool least_squares(const MutableMatrix *b, MutableMatrix *x, bool assume_full_rank) const
virtual Matrix * to_matrix() const
virtual void addMultipleTo(const MutableMatrix *A, const MutableMatrix *B)
EigenTypes< CoeffRing >::EigenvectorType EigenvectorType
virtual bool is_zero() const
virtual bool set_entry(size_t r, size_t c, const ring_elem a)
virtual bool row_permute(size_t start_row, M2_arrayint perm)
virtual void clean(gmp_RR epsilon)
virtual MutableMat * clone() const
virtual bool row_op(size_t i, ring_elem r, size_t j)
virtual MutableMatrix * submatrix(M2_arrayint rows, M2_arrayint cols) const
virtual MutableMat * transpose() const
virtual MutableMat * mult(const RingElement *f) const
virtual size_t lead_row(size_t col, ring_elem &result) const
virtual bool SVD(MutableMatrix *Sigma, MutableMatrix *U, MutableMatrix *Vt, bool use_divide_and_conquer) const
virtual void triangularSolve(MutableMatrix *x, int m, int strategy)
const Mat & getMat() const
virtual const Ring * get_ring() const
virtual bool insert_columns(size_t i, size_t n_to_add)
MutableMat * makeZeroMatrix(size_t nrows, size_t ncols) const
virtual MutableMatrix * invert() const
virtual bool eigenvectors(MutableMatrix *eigenvals, MutableMatrix *eigenvecs, bool is_symm_or_hermitian) const
const Mat * get_Mat() const
virtual M2_arrayintOrNull LU(MutableMatrix *L, MutableMatrix *U) const
virtual bool interchange_rows(size_t i, size_t j)
CoeffRing::Element Element
virtual MutableMatrix * submatrix(M2_arrayint cols) const
virtual MutableMat * subtract(const MutableMatrix *B) const
virtual bool interchange_columns(size_t i, size_t j)
virtual bool is_dense() const
MutableMat(const Ring *R, const Mat &m)
virtual MutableMatrix * rowReducedEchelonForm() const
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
virtual FreeModule * make_FreeModule() const
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
Engine-side ring homomorphism: stores, for each source-ring variable, the target-ring element it maps...
size_t numColumns() const
DMat<ACoeffRing> — dense-matrix template plus the umbrella that wires in every per-ring specialisatio...
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_arrayintOrNull
engine_RawArrayIntPair engine_RawArrayIntPairOrNull
Templated matrix arithmetic for DMat<R> / SMat<R> plus the MatrixWindow / SubMatrix view types.
MatElementaryOps<MT> — row / column primitives templated over dense or sparse matrix storage.
Templated DMat<R> linear algebra: LU, rank, determinant, solve, inverse, nullSpace.
MutableMatrix — abstract base of every mutable matrix the engine hands across the boundary.
MatrixConstructor — the mutable builder that produces an immutable Matrix.
bool error_column_bound(size_t c, size_t ncols)
bool isDense(const MT &mat)
bool error_row_bound(size_t r, size_t nrows)
Matrix * toMatrix(const Ring *R, const DMat< CoeffRing > &A)
void scalarMultInPlace(DMat< RT > &A, const typename RT::ElementType &f)
void negateInPlace(DMat< RT > &A)
void set(DMat< RT > &A, MatrixWindow wA, const DMat< RT > &B, MatrixWindow wB)
bool isEqual(const DMat< RT > &A, const DMat< RT > &B)
bool isZero(const DMat< RT > &A)
void subtractInPlace(DMat< RT > &A, const DMat< RT > &B)
void addInPlace(DMat< RT > &A, const DMat< RT > &B)
void transpose(const DMat< RT > &A, DMat< RT > &result)
TermIterator< Nterm > begin(Nterm *ptr)
SMat<ACoeffRing> — column-oriented sparse matrix template, dual of DMat<R>.
M2::ARingCC HermitianEigenvectorType
M2::ARingCC EigenvectorType
M2::ARingCC EigenvalueType
M2::ARingRR HermitianEigenvalueType
M2::ARingCCC EigenvectorType
M2::ARingCCC HermitianEigenvectorType
M2::ARingRRR HermitianEigenvalueType
M2::ARingCCC EigenvalueType
M2::ARingCC EigenvectorType
M2::ARingRR HermitianEigenvalueType
M2::ARingCC EigenvalueType
M2::ARingRR HermitianEigenvectorType
M2::ARingRRR HermitianEigenvectorType
M2::ARingCCC EigenvectorType
M2::ARingCCC EigenvalueType
M2::ARingRRR HermitianEigenvalueType
RT HermitianEigenvalueType
RT HermitianEigenvectorType