Skip to content

Commit 925bd85

Browse files
committed
Fix typos
1 parent a916c15 commit 925bd85

File tree

5 files changed

+34
-22
lines changed

5 files changed

+34
-22
lines changed

src/structural_transformation/StructuralTransformations.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ using ModelingToolkit: ODESystem, AbstractSystem,var_from_nested_derivative, Dif
1414
states, equations, vars, Symbolic, diff2term, value,
1515
operation, arguments, Sym, Term, simplify, solve_for,
1616
isdiffeq, isdifferential, isinput,
17+
empty_substitutions, get_substitutions,
1718
get_structure, get_iv, independent_variables,
1819
get_structure, defaults, InvalidSystemException,
1920
ExtraEquationsSystemException,

src/structural_transformation/symbolics_tearing.jl

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,11 @@
1-
"""
2-
uneven_invmap(n::Int, list)
3-
4-
returns an uneven inv map with length `n`.
5-
"""
6-
function uneven_invmap(n::Int, list)
7-
rename = zero(Int, n)
8-
for (i, v) in enumerate(list)
9-
rename[v] = i
10-
end
11-
return rename
12-
end
13-
141
# N.B. assumes `slist` and `dlist` are unique
152
function substitution_graph(graph, slist, dlist, var_eq_matching)
163
ns = length(slist)
174
nd = length(dlist)
185
ns == nd || error("internal error")
196
newgraph = BipartiteGraph(ns, nd)
20-
erename = uneven_invmap(nsrc(graph), slist)
21-
vrename = uneven_invmap(ndst(graph), dlist)
7+
erename = uneven_invmap(nsrcs(graph), slist)
8+
vrename = uneven_invmap(ndsts(graph), dlist)
229
for e in 𝑠vertices(graph)
2310
ie = erename[e]
2411
ie == 0 && continue
@@ -29,8 +16,9 @@ function substitution_graph(graph, slist, dlist, var_eq_matching)
2916
end
3017
end
3118

32-
newmatching = zero(slist)
19+
newmatching = Matching(ns)
3320
for (v, e) in enumerate(var_eq_matching)
21+
e === unassigned && continue
3422
iv = vrename[v]
3523
ie = erename[e]
3624
iv == 0 && continue
@@ -47,8 +35,9 @@ function tearing_sub(expr, dict, s)
4735
end
4836

4937
function tearing_substitution(sys::AbstractSystem; simplify=false)
50-
(has_substitutions(sys) && !isnothing(get_substitutions(sys))) || return sys
38+
empty_substitutions(sys) && return sys
5139
subs = get_substitutions(sys)
40+
solved = Dict(eq.lhs => eq.rhs for eq in subs)
5241
neweqs = map(equations(sys)) do eq
5342
if isdiffeq(eq)
5443
return eq.lhs ~ tearing_sub(eq.rhs, solved, simplify)
@@ -66,6 +55,7 @@ function tearing_substitution(sys::AbstractSystem; simplify=false)
6655
eq
6756
end
6857
@set! sys.eqs = neweqs
58+
@set! sys.substitutions = nothing
6959
end
7060

7161
function solve_equation(eq, var, simplify)
@@ -97,13 +87,12 @@ function tearing_reassemble(sys, var_eq_matching; simplify=false)
9787

9888
# Solve solvable equations
9989
for (iv, ieq) in enumerate(var_eq_matching)
100-
#is_solvable(ieq, iv) || continue
101-
is_solvable(ieq, iv) || error("unreachable reached")
90+
is_solvable(ieq, iv) || continue
10291
push!(solved_equations, ieq); push!(solved_variables, iv)
10392
end
104-
subgraph, submatching = substitution_graph(graph, slist, dlist, var_eq_matching)
105-
toporder = topological_sort_by_dfs(DiCMOBiGraph{true}(subgraph, submatching))
106-
substitutions = [solve_equation(eqs[solved_equations[i]], fullvars[solved_variables[i]], simplify) for i in toporder]
93+
subgraph, submatching = substitution_graph(graph, solved_equations, solved_variables, var_eq_matching)
94+
toporder = topological_sort_by_dfs(DiCMOBiGraph{true}(subgraph, complete(submatching)))
95+
substitutions = Equation[solve_equation(eqs[solved_equations[i]], fullvars[solved_variables[i]], simplify) for i in toporder]
10796

10897
# Rewrite remaining equations in terms of solved variables
10998

@@ -126,6 +115,7 @@ function tearing_reassemble(sys, var_eq_matching; simplify=false)
126115
@set! sys.structure = s
127116
@set! sys.eqs = neweqs
128117
@set! sys.states = [s.fullvars[idx] for idx in 1:length(s.fullvars) if !isdervar(s, idx)]
118+
@set! sys.observed = [observed(sys); substitutions]
129119
@set! sys.substitutions = substitutions
130120
return sys
131121
end

src/structural_transformation/utils.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,19 @@ function reordered_matrix(sys, torn_matching)
221221
sparse(I, J, true)
222222
end
223223

224+
"""
225+
uneven_invmap(n::Int, list)
226+
227+
returns an uneven inv map with length `n`.
228+
"""
229+
function uneven_invmap(n::Int, list)
230+
rename = zeros(Int, n)
231+
for (i, v) in enumerate(list)
232+
rename[v] = i
233+
end
234+
return rename
235+
end
236+
224237
###
225238
### Nonlinear equation(s) solving
226239
###

src/utils.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,3 +426,9 @@ function find_duplicates(xs, ::Val{Ret}=Val(false)) where Ret
426426
end
427427

428428
isarray(x) = x isa AbstractArray || x isa Symbolics.Arr
429+
430+
function empty_substitutions(sys)
431+
has_substitutions(sys) || return true
432+
subs = get_substitutions(sys)
433+
isnothing(subs) || isempty(subs)
434+
end

test/components.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using Test
22
using ModelingToolkit, OrdinaryDiffEq
33
using ModelingToolkit.BipartiteGraphs
4+
using ModelingToolkit.StructuralTransformations: tearing_substitution
45

56
function check_contract(sys)
7+
sys = tearing_substitution(sys)
68
s = structure(sys)
79
@unpack fullvars, graph = s
810
eqs = equations(sys)

0 commit comments

Comments
 (0)