Skip to content

Commit 2f5f27f

Browse files
refactor: move full_equations to ModelingToolkit, don't error on singular systems
1 parent 292ff83 commit 2f5f27f

File tree

2 files changed

+51
-42
lines changed

2 files changed

+51
-42
lines changed

src/structural_transformation/symbolics_tearing.jl

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -99,48 +99,6 @@ function eq_derivative!(ts::TearingState, ieq::Int; kwargs...)
9999
return eq_diff
100100
end
101101

102-
function tearing_sub(expr, dict, s)
103-
expr = Symbolics.fixpoint_sub(expr, dict; operator = ModelingToolkit.Initial)
104-
s ? simplify(expr) : expr
105-
end
106-
107-
function tearing_substitute_expr(sys::AbstractSystem, expr; simplify = false)
108-
empty_substitutions(sys) && return expr
109-
substitutions = get_substitutions(sys)
110-
return tearing_sub(expr, substitutions, simplify)
111-
end
112-
113-
"""
114-
$(TYPEDSIGNATURES)
115-
116-
Like `equations(sys)`, but includes substitutions done by the tearing process.
117-
These equations matches generated numerical code.
118-
119-
See also [`equations`](@ref) and [`ModelingToolkit.get_eqs`](@ref).
120-
"""
121-
function full_equations(sys::AbstractSystem; simplify = false)
122-
isempty(observed(sys)) && return equations(sys)
123-
subs = Dict([eq.lhs => eq.rhs for eq in observed(sys)])
124-
neweqs = map(equations(sys)) do eq
125-
if iscall(eq.lhs) && operation(eq.lhs) isa Union{Shift, Differential}
126-
return tearing_sub(eq.lhs, subs, simplify) ~ tearing_sub(eq.rhs, subs,
127-
simplify)
128-
else
129-
if !(eq.lhs isa Number && eq.lhs == 0)
130-
eq = 0 ~ eq.rhs - eq.lhs
131-
end
132-
rhs = tearing_sub(eq.rhs, subs, simplify)
133-
if rhs isa Symbolic
134-
return 0 ~ rhs
135-
else # a number
136-
error("tearing failed because the system is singular")
137-
end
138-
end
139-
eq
140-
end
141-
return neweqs
142-
end
143-
144102
function tearing_substitution(sys::AbstractSystem; kwargs...)
145103
neweqs = full_equations(sys::AbstractSystem; kwargs...)
146104
@set! sys.eqs = neweqs

src/systems/abstractsystem.jl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,6 +1679,57 @@ function equations_toplevel(sys::AbstractSystem)
16791679
return get_eqs(sys)
16801680
end
16811681

1682+
"""
1683+
$(TYPEDSIGNATURES)
1684+
1685+
Recursively substitute `dict` into `expr`. Use `Symbolics.simplify` on the expression
1686+
if `simplify == true`.
1687+
"""
1688+
function substitute_and_simplify(expr, dict::AbstractDict, simplify::Bool)
1689+
expr = Symbolics.fixpoint_sub(expr, dict; operator = ModelingToolkit.Initial)
1690+
simplify ? Symbolics.simplify(expr) : expr
1691+
end
1692+
1693+
"""
1694+
$(TYPEDSIGNATURES)
1695+
1696+
Recursively substitute the observed equations of `sys` into `expr`. If `simplify`, call
1697+
`Symbolics.simplify` on the resultant expression.
1698+
"""
1699+
function substitute_observed(sys::AbstractSystem, expr; simplify = false)
1700+
empty_substitutions(sys) && return expr
1701+
substitutions = get_substitutions(sys)
1702+
return substitute_and_simplify(expr, substitutions, simplify)
1703+
end
1704+
1705+
"""
1706+
$(TYPEDSIGNATURES)
1707+
1708+
Like `equations(sys)`, but also substitutes the observed equations eliminated from the
1709+
equations during `mtkcompile`. These equations matches generated numerical code.
1710+
1711+
See also [`equations`](@ref) and [`ModelingToolkit.get_eqs`](@ref).
1712+
"""
1713+
function full_equations(sys::AbstractSystem; simplify = false)
1714+
empty_substitutions(sys) && return equations(sys)
1715+
subs = get_substitutions(sys)
1716+
neweqs = map(equations(sys)) do eq
1717+
if iscall(eq.lhs) && operation(eq.lhs) isa Union{Shift, Differential}
1718+
return substitute_and_simplify(eq.lhs, subs, simplify) ~ substitute_and_simplify(
1719+
eq.rhs, subs,
1720+
simplify)
1721+
else
1722+
if !_iszero(eq.lhs)
1723+
eq = 0 ~ eq.rhs - eq.lhs
1724+
end
1725+
rhs = substitute_and_simplify(eq.rhs, subs, simplify)
1726+
return 0 ~ rhs
1727+
end
1728+
eq
1729+
end
1730+
return neweqs
1731+
end
1732+
16821733
"""
16831734
$(TYPEDSIGNATURES)
16841735

0 commit comments

Comments
 (0)