From a0e7b18d08d83fd17637fa7176bd995b034ad16f Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 18 Jun 2026 16:52:40 +0530 Subject: [PATCH 1/3] refactor: update `solvable_graph` in `eliminate_perfect_aliases!` --- src/systems/alias_elimination.jl | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/systems/alias_elimination.jl b/src/systems/alias_elimination.jl index b1ee9fe5fb..8f53f65399 100644 --- a/src/systems/alias_elimination.jl +++ b/src/systems/alias_elimination.jl @@ -147,7 +147,6 @@ function find_perfect_aliases!( (; sys, fullvars, structure) = state (; graph, solvable_graph, var_to_diff, state_priorities) = structure - @assert solvable_graph === nothing diff_to_var = invview(var_to_diff) aliases = Dict{Int, Int}() subs = Dict{SymbolicT, SymbolicT}() @@ -236,6 +235,7 @@ function find_perfect_aliases!( append!(eqs_to_substitute, đť‘‘neighbors(graph, v)) BipartiteGraphs.set_neighbors!(BipartiteGraphs.invview(graph), v, ()) + solvable_graph === nothing || BipartiteGraphs.set_neighbors!(BipartiteGraphs.invview(solvable_graph), v, ()) dv = var_to_diff[v] while dv isa Int @@ -244,6 +244,7 @@ function find_perfect_aliases!( append!(eqs_to_substitute, đť‘‘neighbors(graph, dv)) BipartiteGraphs.set_neighbors!(BipartiteGraphs.invview(graph), dv, ()) + solvable_graph === nothing || BipartiteGraphs.set_neighbors!(BipartiteGraphs.invview(solvable_graph), dv, ()) dv = var_to_diff[dv] end @@ -275,6 +276,10 @@ function find_perfect_aliases!( push!(eqs_to_substitute, e) Graphs.rem_edge!(graph, e, v) Graphs.add_edge!(graph, e, target) + if solvable_graph !== nothing && Graphs.has_edge(solvable_graph, BipartiteEdge(e, v)) + Graphs.rem_edge!(solvable_graph, e, v) + Graphs.add_edge!(solvable_graph, e, target) + end end dv = var_to_diff[v] @@ -292,6 +297,10 @@ function find_perfect_aliases!( push!(eqs_to_substitute, e) Graphs.rem_edge!(graph, e, dv) Graphs.add_edge!(graph, e, dtarget) + if solvable_graph !== nothing && Graphs.has_edge(solvable_graph, BipartiteEdge(e, dv)) + Graphs.rem_edge!(solvable_graph, e, dv) + Graphs.add_edge!(solvable_graph, e, dtarget) + end end dv = var_to_diff[dv] @@ -320,6 +329,9 @@ function find_perfect_aliases!( else v_pin = pop!(irrs) # irreducible var to pin to 0 BipartiteGraphs.set_neighbors!(graph, ieq, [v_pin]) + if solvable_graph !== nothing + BipartiteGraphs.set_neighbors!(solvable_graph, ieq, [v_pin]) + end eqs[ieq] = fullvars[v_pin] ~ zero_sym original_eqs[ieq] = fullvars[v_pin] ~ zero_sym end @@ -360,6 +372,10 @@ function find_perfect_aliases!( đť‘ neighbors(graph, e) ) BipartiteGraphs.set_neighbors!(graph, e, new_row) + if solvable_graph !== nothing + filter!(v -> Graphs.has_edge(solvable_graph, BipartiteEdge(e, v)), new_row) + BipartiteGraphs.set_neighbors!(solvable_graph, e, new_row) + end end # After substitution, alias equations that connected a sticky non-target From 8d3b7b7d1afe2d9edff0230873693173487a7212 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 18 Jun 2026 16:53:11 +0530 Subject: [PATCH 2/3] refactor: return elimination information from `eliminate_perfect_aliases!` --- src/systems/alias_elimination.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systems/alias_elimination.jl b/src/systems/alias_elimination.jl index 8f53f65399..b2e5887f98 100644 --- a/src/systems/alias_elimination.jl +++ b/src/systems/alias_elimination.jl @@ -37,7 +37,7 @@ function eliminate_perfect_aliases!(state::TearingState) old_to_new_eq, old_to_new_var = StateSelection.rm_eqs_vars!( state, eqs_to_rm, vars_to_rm; eqs_sorted_and_uniqued = true ) - return nothing + return old_to_new_eq, old_to_new_var, aliases end """ From 3fdc8d74a5ef739b92ee5d1bff64721b8c03673a Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 18 Jun 2026 16:53:44 +0530 Subject: [PATCH 3/3] refactor: rerun `eliminate_perfect_aliases!` after `alias_elimination!` --- src/systems/systemstructure.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/systems/systemstructure.jl b/src/systems/systemstructure.jl index ef8a4a8e77..7f8fe4b2a7 100644 --- a/src/systems/systemstructure.jl +++ b/src/systems/systemstructure.jl @@ -213,6 +213,9 @@ function _mtkcompile!( eliminate_perfect_aliases!(state) StateSelection.trivial_tearing!(state) sys, mm = ModelingToolkit.alias_elimination!(state; fully_determined, kwargs...) + old_to_new_eq, old_to_new_var, aliases = eliminate_perfect_aliases!(state) + sys = state.sys + mm = StateSelection.get_new_mm(aliases, old_to_new_eq, old_to_new_var, mm) if check_consistency fully_determined = StateSelection.check_consistency( state, orig_inputs; nothrow = fully_determined === nothing