Skip to content

Commit 2905e79

Browse files
authored
Merge pull request #1900 from SciML/myb/morealias
Add one missing case in the complete alias generation
2 parents 00590bf + d8e0ac9 commit 2905e79

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/systems/alias_elimination.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,17 +708,27 @@ function alias_eliminate_graph!(graph, var_to_diff, mm_orig::SparseMatrixCLIL)
708708
prev_r = -1
709709
for _ in 1:10_000 # just to make sure that we don't stuck in an infinite loop
710710
reach₌ = Pair{Int, Int}[]
711+
# `r` is aliased to its equality aliases
711712
r === nothing || for n in neighbors(eqg, r)
712713
(n == r || is_diff_edge(r, n)) && continue
713714
c = get_weight(eqg, r, n)
714715
push!(reach₌, c => n)
715716
end
717+
# `r` is aliased to its previous differentiation level's aliases'
718+
# derivative
716719
if (n = length(diff_aliases)) >= 1
717720
as = diff_aliases[n]
718721
for (c, a) in as
719722
(da = var_to_diff[a]) === nothing && continue
720723
da === r && continue
721724
push!(reach₌, c => da)
725+
# `r` is aliased to its previous differentiation level's
726+
# aliases' derivative's equality aliases
727+
r === nothing || for n in neighbors(eqg, da)
728+
(n == da || n == prev_r || is_diff_edge(prev_r, n)) && continue
729+
c′ = get_weight(eqg, da, n)
730+
push!(reach₌, c * c′ => n)
731+
end
722732
end
723733
end
724734
if r === nothing

test/reduction.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,25 @@ ss = alias_elimination(sys)
302302
@test length(equations(ss)) == length(states(ss)) == 1
303303
ss = structural_simplify(sys)
304304
@test length(equations(ss)) == length(states(ss)) == 2
305+
306+
@variables t
307+
vars = @variables x(t) y(t) k(t) z(t) zₜ(t) ddx(t)
308+
D = Differential(t)
309+
eqs = [D(D(x)) ~ ddx
310+
ddx ~ y
311+
D(x) ~ z
312+
D(z) ~ zₜ
313+
D(zₜ) ~ sin(t)
314+
D(x) ~ D(k)
315+
D(D(D(x))) ~ sin(t)]
316+
@named sys = ODESystem(eqs, t, vars, [])
317+
state = TearingState(sys);
318+
ag, mm, complete_ag, complete_mm = ModelingToolkit.alias_eliminate_graph!(state)
319+
fullvars = state.fullvars
320+
aliases = []
321+
for (v, (c, a)) in complete_ag
322+
push!(aliases, fullvars[v] => c == 0 ? 0 : c * fullvars[a])
323+
end
324+
ref_aliases = [D(k) => D(x); z => D(x); D(z) => D(D(x)); zₜ => D(D(x)); ddx => D(D(x));
325+
y => D(D(x)); D(zₜ) => D(D(D(x)))]
326+
@test Set(aliases) == Set(ref_aliases)

0 commit comments

Comments
 (0)