41template <
typename ACoeffRing>
52 typedef typename CoeffRing::Element
Element;
64 const sparsevec *
column(
size_t c)
const
105 void initialize(
size_t nrows,
size_t ncols, sparsevec **cols);
118 v =
M->columns_[
col];
124 size_t row() {
return v->row; }
131 iterator
begin()
const {
return iterator(
this); }
244 bool vec_equals(
const sparsevec *v,
const sparsevec *w)
const;
263 const elem &b2)
const;
280template <
typename CoeffRing>
286template <
typename CoeffRing>
293template <
typename CoeffRing>
304template <
typename CoeffRing>
322template <
typename CoeffRing>
325 for (; v != NULL && w != NULL; v = v->
next, w = w->
next)
330template <
typename CoeffRing>
338 else if (
p->row == r)
346template <
typename CoeffRing>
352 bool iszero =
ring().is_zero(a);
355 for (
p = &head;
p->next != 0;
p =
p->next)
356 if (
p->next->row <= r)
break;
358 if (
p->next == 0 ||
p->next->row < r)
367 else if (
p->next->row == r)
377 ring().set(
p->next->coeff, a);
382template <
typename CoeffRing>
401 for (
p = &head;
p->next != 0;
p =
p->next)
402 if (
p->next->row <= i)
break;
404 for (;
p->next != 0;
p =
p->next)
405 if (
p->next->row <= j)
break;
436template <
typename CoeffRing>
444 if (
p->next->row < r)
446 else if (
p->next->row == r)
448 ring().mult(
p->next->coeff, a,
p->next->coeff);
460template <
typename CoeffRing>
473 ring().mult(
p->next->coeff, a,
p->next->coeff);
479 if (
p->next == 0)
break;
485template <
typename CoeffRing>
489 ring().negate(
p->coeff,
p->coeff);
492template <
typename CoeffRing>
500 if (
p->next->row < r)
502 else if (
p->next->row == r)
504 ring().divide(
p->next->coeff,
p->next->coeff, a);
516template <
typename CoeffRing>
529 ring().divide(
p->next->coeff,
p->next->coeff, a);
535 if (
p->next == 0)
break;
541template <
typename CoeffRing>
567 else if (v->row > w->row)
613template <
typename CoeffRing>
622 for (
p = v;
p != 0;
p =
p->next)
628 if (vec2 == 0)
return;
629 typename CoeffRing::Element c(
ring());
639 for (
p = &head;
p->next != 0;
p =
p->next)
640 if (
p->next->row <= r1)
break;
641 if (
p->next == 0 ||
p->next->row < r1)
652 ring().add(
p->next->coeff,
p->next->coeff, c);
663template <
typename CoeffRing>
670 const elem &b2)
const
688 if (!r1_nonzero && !r2_nonzero)
694 ring().mult(c1, a1, e1);
695 ring().mult(c3, b1, e1);
699 ring().mult(c2, a2, e2);
700 ring().mult(c4, b2, e2);
703 ring().add(c1, c1, c2);
704 ring().add(c3, c3, c4);
709template <
typename CoeffRing>
720template <
typename CoeffRing>
730 if (v == 0 || w == 0)
break;
745template <
typename CoeffRing>
748 if (f == 0 || f->
next == 0)
return;
771template <
typename CoeffRing>
777 for (
size_t i = 0; i < perm->len; i++) perminv[perm->array[i]] = i;
779 size_t end_row = start_row + perm->len;
782 if (w->row >= start_row && w->row < end_row)
783 w->row = start_row + perminv[w->row - start_row];
788template <
typename CoeffRing>
791 size_t n_to_add)
const
793 for (
sparsevec *w = v; w != 0 && w->
row >= i; w = w->next) w->row += n_to_add;
796template <
typename CoeffRing>
799 size_t n_to_delete = j - i + 1;
814 w->
row -= n_to_delete;
822template <
typename CoeffRing>
829template <
typename CoeffRing>
836template <
typename CoeffRing>
844 for (
size_t i = 0; i < ncols; i++)
columns_[i] = 0;
852template <
typename CoeffRing>
861template <
typename CoeffRing>
864 return new SMat(*
this);
867template <
typename CoeffRing>
873 if (v == 0)
return -1;
877template <
typename CoeffRing>
885 if (v == 0)
return -1;
894template <
typename CoeffRing>
902template <
typename CoeffRing>
908template <
typename CoeffRing>
915template <
typename CoeffRing>
924template <
typename CoeffRing>
931template <
typename CoeffRing>
934template <
typename CoeffRing>
941template <
typename CoeffRing>
944template <
typename CoeffRing>
951template <
typename CoeffRing>
958template <
typename CoeffRing>
969 for (
size_t c = 0; c <
ncols_; c++)
973template <
typename CoeffRing>
1003template <
typename CoeffRing>
1009template <
typename CoeffRing>
1013 size_t nrows_to_permute = perm->len;
1015 for (
size_t i = 0; i < nrows_to_permute; i++) done[i] =
true;
1016 for (
size_t i = 0; i < nrows_to_permute; i++)
1018 size_t j = perm->array[i];
1021 ERROR(
"expected permutation");
1031template <
typename CoeffRing>
1034 size_t ncols_to_permute = perm->len;
1037 for (
size_t i = 0; i < ncols_to_permute; i++) done[i] =
true;
1038 for (
size_t i = 0; i < ncols_to_permute; i++)
1040 size_t j = perm->array[i];
1043 ERROR(
"expected permutation");
1049 for (
size_t i = 0; i < ncols_to_permute; i++)
1050 tmpvecs[i] =
columns_[start_col + perm->array[i]];
1051 for (
size_t i = 0; i < ncols_to_permute; i++)
1052 columns_[start_col + i] = tmpvecs[i];
1058template <
typename CoeffRing>
1064 size_t orig_ncols =
ncols_;
1067 for (
size_t c = 0; c < i; c++)
columns_[c] = tmp[c];
1068 for (
size_t c = i; c < orig_ncols; c++)
columns_[c + n_to_add] = tmp[c];
1073template <
typename CoeffRing>
1081template <
typename CoeffRing>
1088 size_t ndeleted = j - i + 1;
1089 size_t orig_ncols =
ncols_;
1092 for (
size_t c = 0; c < i; c++)
columns_[c] = tmp[c];
1093 for (
size_t c = j + 1; c < orig_ncols; c++)
columns_[c - ndeleted] = tmp[c];
1098template <
typename CoeffRing>
1106template <
typename CoeffRing>
1109 for (
size_t c = 0; c <
ncols_; c++)
1110 if (
columns_[c] != 0)
return false;
1114template <
typename CoeffRing>
1129template <
typename CoeffRing>
1136 typename CoeffRing::Element f(*
coeffR);
1137 for (
size_t r = 0; r < rows->len; r++)
1138 for (
size_t c = 0; c < cols->len; c++)
1141 A.
get_entry(rows->array[r], cols->array[c], f);
1146template <
typename CoeffRing>
1151 typename CoeffRing::Element f(*
coeffR);
1152 for (
size_t r = 0; r <
nrows_; r++)
1153 for (
size_t c = 0; c < cols->len; c++)
1161template <
typename CoeffRing>
1176template <
typename CoeffRing>
1193template <
typename CoeffRing>
1199 ring().negate(
p->coeff,
p->coeff);
1202template <
typename CoeffRing>
Legacy Z_mod — a Ring-derived Z/p with log / exp tables.
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
iterator(const SMat< CoeffRing > *M0)
void copy_elem(ring_elem &result)
const SMat< CoeffRing > * M
void set_entry(size_t r, size_t c, const elem a)
void interchange_rows(size_t i, size_t j)
void vec_insert_rows(sparsevec *&v, size_t i, size_t n_to_add) const
void insert_columns(size_t i, size_t n_to_add)
const CoeffRing & ring() const
CoeffRing::Element Element
void delete_columns(size_t i, size_t j)
void vec_remove(sparsevec *&v) const
sparsevec * vec_new() const
bool row_permute(size_t start_row, M2_arrayint perm)
void vec_set_entry(sparsevec *&v, size_t r, const elem &result) const
void vec_scale_row(sparsevec *&v, size_t r, const elem &a) const
void vec_permute(sparsevec *&v, size_t start_row, M2_arrayint perm) const
void vec_sort(sparsevec *&v) const
void divide_row(size_t i, elem r)
void interchange_columns(size_t i, size_t j)
void vec_column_op(sparsevec *&v, const elem &a, sparsevec *w) const
SMat< CoeffRing > * copy() const
void vec_row_op2(sparsevec *&v, size_t r1, size_t r2, const elem &a1, const elem &a2, const elem &b1, const elem &b2) const
size_t lead_row(size_t col) const
void vec_divide_row(sparsevec *&v, size_t r, const elem &a) const
void vec_divide(sparsevec *&v, const elem &a) const
void column2by2(size_t c1, size_t c2, elem a1, elem a2, elem b1, elem b2)
void vec_scale(sparsevec *&v, const elem &a) const
void addInPlace(const SMat &B)
void scalarMultInPlace(const elem &f)
void vec_row_op(sparsevec *&v, size_t r1, const elem &a, size_t r2) const
void delete_rows(size_t i, size_t j)
void vec_remove_node(sparsevec *&v) const
void scale_column(size_t i, elem r)
void vec_dot_product(sparsevec *v, sparsevec *w, elem &result) const
void vec_delete_rows(sparsevec *&v, size_t i, size_t j) const
bool is_equal(const SMat &B) const
void row_op(size_t i, elem r, size_t j)
void row2by2(size_t r1, size_t r2, elem a1, elem a2, elem b1, elem b2)
void scale_row(size_t i, elem r)
void vec_negate(sparsevec *&v) const
SMat(const SMat< ACoeffRing > &M, size_t nrows, size_t ncols)
bool get_entry(size_t r, size_t c, elem &result) const
sparsevec * column(size_t c)
void column_op(size_t i, elem r, size_t j)
void divide_column(size_t i, elem r)
void vec_interchange_rows(sparsevec *&v, size_t r1, size_t r2) const
size_t lead_row(size_t col, elem &result) const
void setFromSubmatrix(const SMat &A, M2_arrayint cols)
bool column_permute(size_t start_col, M2_arrayint perm)
void vec_add_to(sparsevec *&v, sparsevec *&w) const
SMat(const SMat< ACoeffRing > &M)
void subtractInPlace(const SMat &B)
const sparsevec * column(size_t c) const
size_t numColumns() const
CoeffRing::elem ElementType
bool vec_get_entry(const sparsevec *v, size_t r, elem &result) const
SMat(const CoeffRing &coeffR0, size_t nrows, size_t ncols)
void setFromSubmatrix(const SMat &A, M2_arrayint rows, M2_arrayint cols)
sparsevec * vec_copy(const sparsevec *v) const
bool vec_equals(const sparsevec *v, const sparsevec *w) const
void insert_rows(size_t i, size_t n_to_add)
void initialize(size_t nrows, size_t ncols, sparsevec **cols)
void dot_product(size_t i, size_t j, elem &result) const
VALGRIND_MAKE_MEM_DEFINED & result(result)
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
#define newarray_atomic(T, len)