@@ -169,7 +169,7 @@ function bareiss_update_virtual_colswap_mtk!(zero!, M::SparseMatrixCLIL, k, swap
169169 # case for MTK (where most pivots are `1` or `-1`).
170170 pivot_equal = pivot_equal_optimization && abs (pivot) == abs (last_pivot)
171171
172- for ei in (k + 1 ): size (M, 1 )
172+ @inbounds for ei in (k + 1 ): size (M, 1 )
173173 # eliminate `v`
174174 coeff = 0
175175 ivars = eadj[ei]
@@ -193,18 +193,112 @@ function bareiss_update_virtual_colswap_mtk!(zero!, M::SparseMatrixCLIL, k, swap
193193 tmp_coeffs = similar (old_cadj[ei], 0 )
194194 # TODO : We know both ivars and kvars are sorted, we could just write
195195 # a quick iterator here that does this without allocation/faster.
196- vars = sort (union (ivars, kvars))
197-
198- for v in vars
199- v == vpivot && continue
200- ck = getcoeff (kvars, kcoeffs, v)
201- ci = getcoeff (ivars, icoeffs, v)
202- p1 = Base. Checked. checked_mul (pivot, ci)
203- p2 = Base. Checked. checked_mul (coeff, ck)
204- ci = exactdiv (Base. Checked. checked_sub (p1, p2), last_pivot)
205- if ! iszero (ci)
206- push! (tmp_incidence, v)
207- push! (tmp_coeffs, ci)
196+ numkvars = length (kvars)
197+ numivars = length (ivars)
198+ kvind = ivind = 0
199+ if _debug_mode
200+ # in debug mode, we at least check to confirm we're iterating over
201+ # `v`s in the correct order
202+ vars = sort (union (ivars, kvars))
203+ vi = 0
204+ end
205+ if numivars > 0 && numkvars > 0
206+ kvv = kvars[kvind += 1 ]
207+ ivv = ivars[ivind += 1 ]
208+ dobreak = false
209+ while true
210+ if kvv == ivv
211+ v = kvv
212+ ck = kcoeffs[kvind]
213+ ci = icoeffs[ivind]
214+ kvind += 1
215+ ivind += 1
216+ if kvind > numkvars
217+ dobreak = true
218+ else
219+ kvv = kvars[kvind]
220+ end
221+ if ivind > numivars
222+ dobreak = true
223+ else
224+ ivv = ivars[ivind]
225+ end
226+ elseif kvv < ivv
227+ v = kvv
228+ ck = kcoeffs[kvind]
229+ ci = zero (eltype (icoeffs))
230+ kvind += 1
231+ if kvind > numkvars
232+ dobreak = true
233+ else
234+ kvv = kvars[kvind]
235+ end
236+ else # kvv > ivv
237+ v = ivv
238+ ck = zero (eltype (kcoeffs))
239+ ci = icoeffs[ivind]
240+ ivind += 1
241+ if ivind > numivars
242+ dobreak = true
243+ else
244+ ivv = ivars[ivind]
245+ end
246+ end
247+ if _debug_mode
248+ @assert v == vars[vi += 1 ]
249+ end
250+ if v != vpivot
251+ p1 = Base. Checked. checked_mul (pivot, ci)
252+ p2 = Base. Checked. checked_mul (coeff, ck)
253+ ci = exactdiv (Base. Checked. checked_sub (p1, p2), last_pivot)
254+ if ! iszero (ci)
255+ push! (tmp_incidence, v)
256+ push! (tmp_coeffs, ci)
257+ end
258+ end
259+ dobreak && break
260+ end
261+ elseif numivars == 0
262+ ivind = 1
263+ kvv = kvars[kvind += 1 ]
264+ else # numkvars == 0
265+ kvind = 1
266+ ivv = ivars[ivind += 1 ]
267+ end
268+ if kvind <= numkvars
269+ v = kvv
270+ while true
271+ if _debug_mode
272+ @assert v == vars[vi += 1 ]
273+ end
274+ if v != vpivot
275+ ck = kcoeffs[kvind]
276+ p2 = Base. Checked. checked_mul (coeff, ck)
277+ ci = exactdiv (Base. Checked. checked_sub (0 , p2), last_pivot)
278+ if ! iszero (ci)
279+ push! (tmp_incidence, v)
280+ push! (tmp_coeffs, ci)
281+ end
282+ end
283+ (kvind == numkvars) && break
284+ v = kvars[kvind += 1 ]
285+ end
286+ elseif ivind <= numivars
287+ v = ivv
288+ while true
289+ if _debug_mode
290+ @assert v == vars[vi += 1 ]
291+ end
292+ if v != vpivot
293+ p1 = Base. Checked. checked_mul (pivot, icoeffs[ivind])
294+ ci = exactdiv (p1, last_pivot)
295+ if ! iszero (ci)
296+ push! (tmp_incidence, v)
297+ push! (tmp_coeffs, ci)
298+ end
299+ end
300+ (ivind == numivars) && break
301+ v = ivars[ivind += 1 ]
208302 end
209303 end
210304 eadj[ei] = tmp_incidence
0 commit comments