From 0eec6a00f244248b888f1982fe6dde730a462091 Mon Sep 17 00:00:00 2001 From: Yingbo Ma Date: Tue, 18 Oct 2022 21:47:09 -0400 Subject: [PATCH 1/2] Only allocate one matching vector in tearing Before: ```julia julia> @time sysRed, = structural_simplify(sysEx, (inputs=(), outputs=())); 10.891029 seconds (31.88 M allocations: 7.849 GiB, 18.15% gc time) ``` After: ``` julia> @time sysRed, = structural_simplify(sysEx, (inputs=(), outputs=())); 7.814676 seconds (31.85 M allocations: 4.889 GiB, 13.28% gc time) ``` --- .../bipartite_tearing/modia_tearing.jl | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/structural_transformation/bipartite_tearing/modia_tearing.jl b/src/structural_transformation/bipartite_tearing/modia_tearing.jl index 366d4439af..7a39eba1cf 100644 --- a/src/structural_transformation/bipartite_tearing/modia_tearing.jl +++ b/src/structural_transformation/bipartite_tearing/modia_tearing.jl @@ -48,9 +48,9 @@ function tearEquations!(ict::IncrementalCycleTracker, Gsolvable, es::Vector{Int} return ict end -function tear_graph_block_modia!(var_eq_matching, graph, solvable_graph, eqs, vars, +function tear_graph_block_modia!(var_eq_matching, vargraph, solvable_graph, eqs, vars, isder::F) where {F} - ict = IncrementalCycleTracker(DiCMOBiGraph{true}(graph); dir = :in) + ict = IncrementalCycleTracker(vargraph; dir = :in) tearEquations!(ict, solvable_graph.fadjlist, eqs, vars, isder) for var in vars var_eq_matching[var] = ict.graph.matching[var] @@ -76,6 +76,7 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing, @unpack graph, solvable_graph = structure var_eq_matching = complete(maximal_matching(graph, eqfilter, varfilter, U)) var_sccs::Vector{Union{Vector{Int}, Int}} = find_var_sccs(graph, var_eq_matching) + vargraph = DiCMOBiGraph{true}(graph) ieqs = Int[] filtered_vars = BitSet() @@ -89,8 +90,15 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing, end var_eq_matching[var] = unassigned end - tear_graph_block_modia!(var_eq_matching, graph, solvable_graph, ieqs, filtered_vars, + tear_graph_block_modia!(var_eq_matching, vargraph, solvable_graph, ieqs, + filtered_vars, isder) + + # clear cache + vargraph.ne = 0 + for var in vars + vargraph.matching[var] = unassigned + end empty!(ieqs) empty!(filtered_vars) end From c0ba097e22adfb2b35db5dcb30a307dac3de869b Mon Sep 17 00:00:00 2001 From: Yingbo Ma Date: Tue, 18 Oct 2022 21:57:47 -0400 Subject: [PATCH 2/2] Only allocate IncrementalCycleTracker once in tearing ```julia julia> @time sysRed, = structural_simplify(sysEx, (inputs=(), outputs=())); 5.951818 seconds (31.59 M allocations: 2.248 GiB, 10.44% gc time) ``` --- .../bipartite_tearing/modia_tearing.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/structural_transformation/bipartite_tearing/modia_tearing.jl b/src/structural_transformation/bipartite_tearing/modia_tearing.jl index 7a39eba1cf..021816a6e1 100644 --- a/src/structural_transformation/bipartite_tearing/modia_tearing.jl +++ b/src/structural_transformation/bipartite_tearing/modia_tearing.jl @@ -48,9 +48,8 @@ function tearEquations!(ict::IncrementalCycleTracker, Gsolvable, es::Vector{Int} return ict end -function tear_graph_block_modia!(var_eq_matching, vargraph, solvable_graph, eqs, vars, +function tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, eqs, vars, isder::F) where {F} - ict = IncrementalCycleTracker(vargraph; dir = :in) tearEquations!(ict, solvable_graph.fadjlist, eqs, vars, isder) for var in vars var_eq_matching[var] = ict.graph.matching[var] @@ -77,6 +76,7 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing, var_eq_matching = complete(maximal_matching(graph, eqfilter, varfilter, U)) var_sccs::Vector{Union{Vector{Int}, Int}} = find_var_sccs(graph, var_eq_matching) vargraph = DiCMOBiGraph{true}(graph) + ict = IncrementalCycleTracker(vargraph; dir = :in) ieqs = Int[] filtered_vars = BitSet() @@ -90,7 +90,7 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing, end var_eq_matching[var] = unassigned end - tear_graph_block_modia!(var_eq_matching, vargraph, solvable_graph, ieqs, + tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs, filtered_vars, isder)