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) 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