Skip to content

Commit 9a44828

Browse files
authored
Merge pull request #1889 from SciML/myb/tearing_opt
Make tearing only allocate O(N) memory and fix `count_nonzeros` perf problem
2 parents e15c650 + 9d1e3cb commit 9a44828

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

src/structural_transformation/bipartite_tearing/modia_tearing.jl

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ function tearEquations!(ict::IncrementalCycleTracker, Gsolvable, es::Vector{Int}
4848
return ict
4949
end
5050

51-
function tear_graph_block_modia!(var_eq_matching, graph, solvable_graph, eqs, vars,
51+
function tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, eqs, vars,
5252
isder::F) where {F}
53-
ict = IncrementalCycleTracker(DiCMOBiGraph{true}(graph); dir = :in)
5453
tearEquations!(ict, solvable_graph.fadjlist, eqs, vars, isder)
5554
for var in vars
5655
var_eq_matching[var] = ict.graph.matching[var]
@@ -76,6 +75,8 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
7675
@unpack graph, solvable_graph = structure
7776
var_eq_matching = complete(maximal_matching(graph, eqfilter, varfilter, U))
7877
var_sccs::Vector{Union{Vector{Int}, Int}} = find_var_sccs(graph, var_eq_matching)
78+
vargraph = DiCMOBiGraph{true}(graph)
79+
ict = IncrementalCycleTracker(vargraph; dir = :in)
7980

8081
ieqs = Int[]
8182
filtered_vars = BitSet()
@@ -89,8 +90,15 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
8990
end
9091
var_eq_matching[var] = unassigned
9192
end
92-
tear_graph_block_modia!(var_eq_matching, graph, solvable_graph, ieqs, filtered_vars,
93+
tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs,
94+
filtered_vars,
9395
isder)
96+
97+
# clear cache
98+
vargraph.ne = 0
99+
for var in vars
100+
vargraph.matching[var] = unassigned
101+
end
94102
empty!(ieqs)
95103
empty!(filtered_vars)
96104
end

src/systems/alias_elimination.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ count_nonzeros(a::AbstractArray) = count(!iszero, a)
468468

469469
# N.B.: Ordinarily sparse vectors allow zero stored elements.
470470
# Here we have a guarantee that they won't, so we can make this identification
471-
count_nonzeros(a::SparseVector) = nnz(a)
471+
count_nonzeros(a::CLILVector) = nnz(a)
472472

473473
# Linear variables are highest order differentiated variables that only appear
474474
# in linear equations with only linear variables. Also, if a variable's any

src/systems/sparsematrixclil.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ function Base.view(a::SparseMatrixCLIL, i::Integer, ::Colon)
5353
end
5454
SparseArrays.nonzeroinds(a::CLILVector) = SparseArrays.nonzeroinds(a.vec)
5555
SparseArrays.nonzeros(a::CLILVector) = SparseArrays.nonzeros(a.vec)
56+
SparseArrays.nnz(a::CLILVector) = nnz(a.vec)
5657

5758
function Base.setindex!(S::SparseMatrixCLIL, v::CLILVector, i::Integer, c::Colon)
5859
if v.vec.n != S.ncols

0 commit comments

Comments
 (0)