Skip to content

Commit 2eefd00

Browse files
Merge pull request #4782 from SciML/as/fix-perfect-aliases
fix: fix `eliminate_perfect_aliases!` when higher order `dtarget` doesn't exist
2 parents c1a3291 + ba494d9 commit 2eefd00

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

src/systems/alias_elimination.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,12 @@ function find_perfect_aliases!(
361361
end
362362

363363
dv = var_to_diff[v]
364+
# `prev_dtarget` must always be one level of differentiation below `dtarget`.
365+
prev_dtarget = target
364366
dtarget = var_to_diff[target]
365367
while dv isa Int
366368
if dtarget === nothing
367-
dtarget = StateSelection.var_derivative!(state, target)
369+
dtarget = StateSelection.var_derivative!(state, prev_dtarget)
368370
end
369371
push!(vars_to_rm, dv)
370372

@@ -382,6 +384,7 @@ function find_perfect_aliases!(
382384
end
383385

384386
dv = var_to_diff[dv]
387+
prev_dtarget = dtarget
385388
dtarget = var_to_diff[dtarget]
386389
end
387390
end

test/reduction.jl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,3 +823,38 @@ end
823823
@test_throws ModelingToolkit.IncompleteInitializationError ODEProblem(sys, [], (0.0, 5.0))
824824
end
825825
end
826+
827+
@testset "Issue#4776: `eliminate_perfect_aliases!` correctly handles missing higher order derivatives" begin
828+
# The issue is that in an alias group, if `var_to_diff[var_to_diff[v]]` exists but
829+
# `var_to_diff[var_to_diff[target]]` doesn't, it used to differentiate `target`.
830+
# This is fixed by making sure `prev_dtarget` is always one level of differentiation below
831+
# `dtarget`, and we differentiate `prev_dtarget`.
832+
@variables begin
833+
v001(t)
834+
v004(t)
835+
v005(t)
836+
v006(t), [state_priority = -1]
837+
v023(t), [state_priority = -1]
838+
v027(t), [guess = 0.0]
839+
v031(t), [state_priority = -1]
840+
v035(t)
841+
v050(t), [state_priority = -1]
842+
end
843+
844+
eqs = [
845+
v004 ~ 0.0,
846+
v005 ~ 0.0,
847+
v006 ~ 0,
848+
v001 ~ D(D(v006)),
849+
v035 ~ D(v031),
850+
v027 ~ D(v035),
851+
v006 ~ v050,
852+
0 ~ v004,
853+
0 ~ v005,
854+
v050 ~ v023,
855+
v023 ~ v031,
856+
]
857+
@mtkcompile sys = System(eqs, t)
858+
# Everything is identically zero
859+
@test isempty(equations(sys))
860+
end

0 commit comments

Comments
 (0)