Skip to content

Commit dfd9cdb

Browse files
committed
add an alias_elimination function
1 parent 89f7628 commit dfd9cdb

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/ModelingToolkit.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ include("systems/pde/pdesystem.jl")
113113
include("systems/reaction/reactionsystem.jl")
114114
include("systems/dependency_graphs.jl")
115115

116+
include("systems/reduction.jl")
117+
116118
include("latexify_recipes.jl")
117119
include("build_function.jl")
118120

src/systems/reduction.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export alias_elimination
2+
3+
function substitute_aliases(diffeqs, outputs)
4+
lhss(diffeqs) .~ substitute.(rhss(diffeqs), (Dict(lhss(outputs) .=> rhss(outputs)),))
5+
end
6+
7+
function alias_elimination(sys::ODESystem)
8+
eqs = equations(sys)
9+
10+
new_stateops = map(eqs) do eq
11+
if eq.lhs isa Operation && eq.lhs.op isa Differential
12+
get_variables(eq.lhs)
13+
else
14+
[]
15+
end
16+
end |> Iterators.flatten |> collect |> unique
17+
newstates = convert.(Variable, new_stateops)
18+
19+
alg_idxs = findall(x->x.lhs isa Constant && iszero(x.lhs), eqs)
20+
21+
eliminate = setdiff(states(sys), newstates)
22+
outputs = solve_for(eqs[alg_idxs], map(x->x(sys.iv()), eliminate))
23+
24+
diffeqs = eqs[setdiff(1:length(eqs), alg_idxs)]
25+
26+
diffeqs′ = substitute_aliases(diffeqs, outputs)
27+
28+
ODESystem(diffeqs′, sys.iv(), new_stateops, parameters(sys), observed=outputs)
29+
end
30+

0 commit comments

Comments
 (0)