5#ifndef _mutable_mat_imp_hpp_
6#define _mutable_mat_imp_hpp_
40template <
typename Mat>
46 ERROR(
"1-row matrix expected; or numbers of constants don't match");
53template <
typename Mat>
74 typename T::ElementType a;
78 mat.ring().to_ring_elem(det, a);
124 if (retval)
return solns;
141 if (retval)
return solns;
162 "mutable matrix/ring type for (mutable) matrix multiplication "
163 "required to be the same");
167 if (
mat.numColumns() != B1->numRows())
169 ERROR(
"matrix sizes do not match in matrix multiplication");
186 if (A1 == 0 or B1 == 0)
188 "mutable matrix/ring type for (mutable) matrix multiplication required "
190 if (
mat.numRows() != A1->numRows() or
mat.numColumns() != B1->numColumns())
192 "expected matrix sizes to be compatible with matrix multiplication");
203 if (A1 == 0 or B1 == 0)
205 "mutable matrix/ring type for (mutable) matrix multiplication required "
207 if (
mat.numRows() != A1->numRows() or
mat.numColumns() != B1->numColumns())
209 "expected matrix sizes to be compatible with matrix multiplication");
227 if (L1 == 0 or U1 == 0)
239 if (LU1 ==
nullptr or v1 ==
nullptr)
250 T* x1 =
x->coerce<
T>();
251 if (Lv1 ==
nullptr or x1 ==
nullptr)
258 bool is_symm_or_hermitian)
const
262 "'eigenvalues' is only implemented for dense matrices");
263 if (is_symm_or_hermitian)
282 bool is_symm_or_hermitian)
const
286 "'eigenvalues' is only implemented for dense matrices");
287 if (is_symm_or_hermitian)
293 if (E1 == 0 or evecs1 == 0)
295 "eigenvalue/vector matrix is of the wrong type/ring");
303 if (E1 == 0 or evecs1 == 0)
305 "eigenvalue/vector matrix is of the wrong type/ring");
313 bool assume_full_rank)
const
317 if (B1 == 0 or X1 == 0)
340 bool use_divide_and_conquer)
const
345 if (Sigma2 == 0 || U2 == 0 || Vt2 == 0)
347 int strategy = (use_divide_and_conquer ? 1 : 0);
351template <
typename Mat>
357 "LU decomposition currently not implemented for this ring and matrix "
370 if (
get_ring()->get_precision() == 0)
374 mpfr_init2(nm,
get_ring()->get_precision());
375 mpfr_set_si(nm, 0, MPFR_RNDN);
MutableEngineObject wrapper holding a raw SLEvaluator*.
MutableEngineObject wrapper that owns an SLProgram via unique_ptr.
virtual M2SLEvaluator * createCompiledSLEvaluator(M2_string libName, int nInputs, int nOutputs) const
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).
virtual const RingElement * determinant() const
virtual engine_RawArrayIntPairOrNull LQUPFactorizationInPlace(bool transpose)
LU decomposition routines /////.
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 M2_arrayintOrNull LUincremental(std::vector< size_t > &P, const MutableMatrix *v, int i)
virtual M2SLEvaluator * createSLEvaluator(M2SLProgram *P, M2_arrayint constsPos, M2_arrayint varsPos) const
virtual gmp_RRorNull norm() const
virtual void subtractMultipleTo(const MutableMatrix *A, const MutableMatrix *B)
virtual MutableMatrix * nullSpace() const
virtual size_t n_cols() const
virtual MutableMatrix * solveInvertible(const MutableMatrix *B) const
virtual bool least_squares(const MutableMatrix *b, MutableMatrix *x, bool assume_full_rank) const
virtual void addMultipleTo(const MutableMatrix *A, const MutableMatrix *B)
virtual void clean(gmp_RR epsilon)
virtual MutableMat * transpose() const
virtual MutableMat * mult(const RingElement *f) 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)
virtual const Ring * get_ring() const
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
virtual M2_arrayintOrNull LU(MutableMatrix *L, MutableMatrix *U) const
virtual bool is_dense() const
virtual MutableMatrix * rowReducedEchelonForm() const
virtual size_t n_rows() const =0
virtual const Ring * get_ring() const =0
const MatT * coerce_const() const
static RingElement * make_raw(const Ring *R, ring_elem f)
Front-end-visible "ring element" value: an engine ring_elem paired with the Ring* that gives it meani...
mpfr_srcptr moveTo_gmpRR(mpfr_ptr _z)
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmemstructtype(S)
M2_arrayint M2_arrayintOrNull
engine_RawArrayIntPair engine_RawArrayIntPairOrNull
bool QR(const Mat &A, Mat2 &Q, Mat3 &R, bool return_QR)
bool inverse(const Mat &A, Mat &result_inv)
the inverse of a square matrix
void determinant(const Mat &A, typename Mat::ElementType &result_det)
the determinant of a square matrix
bool eigenvaluesHermitian(const Mat &A, Mat2 &eigenvals)
size_t rowReducedEchelonForm(const Mat &A, Mat &result_rref)
the row reduced echelon form of a matrix over a field, or ZZ.
bool eigenvalues(const Mat &A, Mat2 &eigenvals)
M2_arrayintOrNull LUincremental(std::vector< size_t > &P, Mat &LU, const Mat &v, int i)
bool eigenvectors(const Mat &A, Mat2 &eigenvals, Mat3 &eigenvecs)
void subtractMultipleTo(DMatZZpFFPACK &C, const DMatZZpFFPACK &A, const DMatZZpFFPACK &B)
size_t rank(const Mat &A)
the rank of a matrix
void addMultipleTo(DMatZZpFFPACK &C, const DMatZZpFFPACK::ElementType &a, const DMatZZpFFPACK &A, const DMatZZpFFPACK &B)
M2_arrayintOrNull LU(const Mat &A, Mat &L, Mat &U)
bool SVD(const Mat &A, Mat2 &Sigma, Mat &U, Mat &Vt, int strategy)
size_t nullSpace(const Mat &A, Mat &result_nullspace)
the null space of a matrix
void mult(const DMatZZpFFPACK &A, const DMatZZpFFPACK &B, DMatZZpFFPACK &C)
void clean(gmp_RR epsilon, T &mat)
bool solveLinear(const Mat &A, const Mat &B, Mat &X)
solve AX=B, return true if the system has a solution.
bool leastSquares(const Mat &A, const Mat &B, Mat &X, bool assume_full_rank)
bool solveInvertible(const Mat &A, const Mat &B, Mat &X)
solve AX=B, where A is a square (invertible) matrix.
void increase_norm(gmp_RRmutable nm, const T &mat)
M2_arrayintOrNull rankProfile(const Mat &A, bool row_profile)
Returns either the row or column rank profile of A.
bool eigenvectorsHermitian(const Mat &A, Mat2 &eigenvals, Mat3 &eigenvecs)
void triangularSolve(Mat &Lv, Mat &x, int m, int strategy)