Macaulay2 Engine
Loading...
Searching...
No Matches

◆ prune_unit()

void MutableComplex::prune_unit ( const iterator & i,
const size_t flags )

Definition at line 118 of file mutablecomplex.cpp.

119{
120 const size_t n = i.index();
121 const std::pair<size_t, size_t> u = *i;
122 const bool trace = flags & FLAG_TRACE_MORPHISMS;
123 /* There is some redundancy here, can set some stuff to zero.
124 TODO: Maybe check to see which is more efficient?
125 Compare with using rawReduceByPivot
126 */
127 // Move to last row
128 mDifferential[n]->interchange_rows(u.first, mBetti[n] - 1);
129 if (0 < n) mDifferential[n - 1]->interchange_columns(u.first, mBetti[n] - 1);
130 if (trace) mMorphisms[n]->interchange_columns(u.first, mBetti[n] - 1);
131 // Move to last column
132 mDifferential[n]->interchange_columns(u.second, mBetti[n + 1] - 1);
133 if (n < mDifferential.size() - 1)
134 mDifferential[n + 1]->interchange_rows(u.second, mBetti[n + 1] - 1);
135 if (trace)
136 mMorphisms[n + 1]->interchange_columns(u.second, mBetti[n + 1] - 1);
137 // Get the pivot
138 ring_elem p, q, f;
139 mDifferential[n]->get_entry(mBetti[n] - 1, mBetti[n + 1] - 1, p);
140 p = mRing->invert(p);
141 q = mRing->negate(p);
142 // Clear the column
143 for (size_t r = 0; r < mBetti[n] - 1; ++r)
144 {
145 mDifferential[n]->get_entry(r, mBetti[n + 1] - 1, f);
146 mDifferential[n]->row_op(r, mRing->mult(f, q), mBetti[n] - 1);
147 if (0 < n)
148 mDifferential[n - 1]->column_op(mBetti[n] - 1, mRing->mult(f, p), r);
149 if (trace) mMorphisms[n]->column_op(mBetti[n] - 1, mRing->mult(f, p), r);
150 }
151 // Clear the row
152 for (size_t c = 0; c < mBetti[n + 1] - 1; ++c)
153 {
154 mDifferential[n]->get_entry(mBetti[n] - 1, c, f);
155 mDifferential[n]->column_op(c, mRing->mult(f, q), mBetti[n + 1] - 1);
156 if (n < mDifferential.size() - 1)
157 mDifferential[n + 1]->row_op(mBetti[n + 1] - 1, mRing->mult(f, p), c);
158 if (trace)
159 mMorphisms[n + 1]->column_op(c, mRing->mult(f, q), mBetti[n + 1] - 1);
160 }
161 --mBetti[n];
162 --mBetti[n + 1];
163}
std::vector< size_t > mBetti
const size_t flags
const Ring * mRing
int p
#define FLAG_TRACE_MORPHISMS

References FLAG_TRACE_MORPHISMS, flags, MutableComplex::iterator::index(), mBetti, mRing, and p.

Referenced by prune_matrix().