Skip to content

Commit 41cc6ea

Browse files
authored
Merge pull request #1554 from SciML/myb/optimize
Optimization
2 parents d7b1e38 + 523a5c1 commit 41cc6ea

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/structural_transformation/bareiss.jl

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,40 @@ else
114114
end
115115
end
116116

117+
function bareiss_update!(zero!, M::StridedMatrix, k, swapto, pivot, prev_pivot::Base.BitInteger)
118+
flag = zero(prev_pivot)
119+
prev_pivot = Base.MultiplicativeInverses.SignedMultiplicativeInverse(prev_pivot)
120+
@inbounds for i in k+1:size(M, 2)
121+
Mki = M[k,i]
122+
@simd ivdep for j in k+1:size(M, 1)
123+
M[j,i], r = divrem(M[j,i]*pivot - M[j,k]*Mki, prev_pivot)
124+
flag = flag | r
125+
end
126+
end
127+
iszero(flag) || error("Overflow occurred")
128+
zero!(M, k+1:size(M, 1), k)
129+
end
130+
117131
function bareiss_update!(zero!, M::StridedMatrix, k, swapto, pivot, prev_pivot)
118-
for i in k+1:size(M, 2), j in k+1:size(M, 1)
132+
@inbounds for i in k+1:size(M, 2), j in k+1:size(M, 1)
119133
M[j,i] = exactdiv(M[j,i]*pivot - M[j,k]*M[k,i], prev_pivot)
120134
end
121135
zero!(M, k+1:size(M, 1), k)
122136
end
123137

124138
@views function bareiss_update!(zero!, M::AbstractMatrix, k, swapto, pivot, prev_pivot)
139+
if prev_pivot isa Base.BitInteger
140+
prev_pivot = Base.MultiplicativeInverses.SignedMultiplicativeInverse(prev_pivot)
141+
end
125142
V = M[k+1:end, k+1:end]
126143
V .= exactdiv.(V .* pivot .- M[k+1:end, k] * M[k, k+1:end]', prev_pivot)
127144
zero!(M, k+1:size(M, 1), k)
128145
end
129146

130147
function bareiss_update_virtual_colswap!(zero!, M::AbstractMatrix, k, swapto, pivot, prev_pivot)
148+
if prev_pivot isa Base.BitInteger
149+
prev_pivot = Base.MultiplicativeInverses.SignedMultiplicativeInverse(prev_pivot)
150+
end
131151
V = @view M[k+1:end, :]
132152
V .= @views exactdiv.(V .* pivot .- M[k+1:end, swapto[2]] * M[k, :]', prev_pivot)
133153
zero!(M, k+1:size(M, 1), swapto[2])

src/systems/alias_elimination.jl

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -324,13 +324,7 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
324324
return ag, mm
325325
end
326326

327-
iszeroterm(v_types, v) = v_types[v] == 0
328-
isirreducible(v_types, v) = v_types[v] == KEEP
329-
isalias(v_types, v) = v_types[v] > 0 && !isirreducible(v_types, v)
330-
alias(v_types, v) = v_types[v]
331-
negalias(v_types, v) = -v_types[v]
332-
333-
function exactdiv(a::Integer, b::Integer)
327+
function exactdiv(a::Integer, b)
334328
d, r = divrem(a, b)
335329
@assert r == 0
336330
return d

0 commit comments

Comments
 (0)