From b172b0343b0d83a4d2548b4b138096714e47aed7 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 2 Jul 2026 17:07:44 +0530 Subject: [PATCH 1/2] fix: limit length of equation sort keys This doesn't scale well with multibody models and `full_equations` initialization. --- lib/ModelingToolkitTearing/src/tearingstate.jl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/ModelingToolkitTearing/src/tearingstate.jl b/lib/ModelingToolkitTearing/src/tearingstate.jl index 8f33c39..e923dc7 100644 --- a/lib/ModelingToolkitTearing/src/tearingstate.jl +++ b/lib/ModelingToolkitTearing/src/tearingstate.jl @@ -504,6 +504,7 @@ function __get_expression_sort_key!( for t in arg_k push!(result, (t[1], t[2] * v, t[3])) end + length(result) > 100 && break end else if coeff isa Real @@ -522,6 +523,7 @@ function __get_expression_sort_key!( for t in arg_k push!(result, (t[1], t[2] ^ v * cf, t[3] + v)) end + length(result) > 100 && break end end return result @@ -538,15 +540,20 @@ function __get_expression_sort_key!( v = convert(Float64, val) return map(k -> (k[1], k[2] ^ v, k[3] + v), base_key) else + length(base_key) > 100 && return base_key + return vcat(base_key, get_expression_sort_key!(cache, args[2], var2idx, canonical_ranks)) + end + _ => begin + length(base_key) > 100 && return base_key return vcat(base_key, get_expression_sort_key!(cache, args[2], var2idx, canonical_ranks)) end - _ => return vcat(base_key, get_expression_sort_key!(cache, args[2], var2idx, canonical_ranks)) end return base_key end result = eltype(EquationSortKeyT)[] for arg in args append!(result, get_expression_sort_key!(cache, arg, var2idx, canonical_ranks)) + length(result) > 100 && break end return result end From 308b3f29f51da3e40f578343dccd347f8a35516c Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Thu, 2 Jul 2026 18:26:41 +0530 Subject: [PATCH 2/2] fix: sort mm row in `eq_derivative!` if not sorted --- lib/ModelingToolkitTearing/src/stateselection_interface.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ModelingToolkitTearing/src/stateselection_interface.jl b/lib/ModelingToolkitTearing/src/stateselection_interface.jl index 4bce2c1..bef95eb 100644 --- a/lib/ModelingToolkitTearing/src/stateselection_interface.jl +++ b/lib/ModelingToolkitTearing/src/stateselection_interface.jl @@ -27,6 +27,11 @@ function eq_derivative_mm!(ts::TearingState, ieq::Int, eq_diff::Int, idx::Int) map!(Base.Fix1(getindex, s.var_to_diff), rcol, rcol) # Add to `mm` @assert eq_diff > last(mm.nzrows) + if !issorted(rcol) + perm = sortperm(rcol) + rcol = rcol[perm] + rval = rval[perm] + end push!(mm.nzrows, eq_diff) push!(mm.row_cols, rcol) push!(mm.row_vals, rval)