Skip to content

Commit 19716cd

Browse files
committed
Finish reordering
1 parent 456e5e2 commit 19716cd

File tree

2 files changed

+29
-23
lines changed

2 files changed

+29
-23
lines changed

src/structural_transformation/symbolics_tearing.jl

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
213213
possible_x_t[rhs] = i, lhs
214214
end
215215

216-
removed_eqs = Int[]
217-
removed_vars = Int[]
216+
#removed_eqs = Int[]
217+
#removed_vars = Int[]
218218
removed_obs = Int[]
219219
diff_to_var = invview(var_to_diff)
220220
for var in 1:length(fullvars)
@@ -423,6 +423,12 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
423423
empty!(subs)
424424
end
425425

426+
# Will reorder equations and states to be:
427+
# [diffeqs; ...]
428+
# [diffvars; ...]
429+
# such that the mass matrix is:
430+
# [I 0
431+
# 0 0].
426432
diffeq_idxs = Int[]
427433
algeeq_idxs = Int[]
428434
diff_eqs = Equation[]
@@ -431,7 +437,6 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
431437
subeqs = Equation[]
432438
solved_equations = Int[]
433439
solved_variables = Int[]
434-
idx = 0
435440
# Solve solvable equations
436441
neqs = nsrcs(graph)
437442
for (ieq, iv) in enumerate(invview(var_eq_matching))
@@ -456,8 +461,9 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
456461
# 0 ~ a * var + b
457462
# var ~ -b/a
458463
if ModelingToolkit._iszero(a)
459-
push!(removed_eqs, ieq)
460-
push!(removed_vars, iv)
464+
@warn "Tearing: $eq is a singular equation!"
465+
#push!(removed_eqs, ieq)
466+
#push!(removed_vars, iv)
461467
else
462468
rhs = -b / a
463469
neweq = var ~ simplify ? Symbolics.simplify(rhs) : rhs
@@ -479,17 +485,20 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
479485
end
480486
# TODO: BLT sorting
481487
neweqs = [diff_eqs; alge_eqs]
482-
eqsperm = [diffeq_idxs; algeeq_idxs]
488+
inveqsperm = [diffeq_idxs; algeeq_idxs]
489+
eqsperm = zeros(Int, nsrcs(graph))
490+
for (i, v) in enumerate(inveqsperm)
491+
eqsperm[v] = i
492+
end
483493
diff_vars_set = BitSet(diff_vars)
484494
if length(diff_vars_set) != length(diff_vars)
485495
error("Tearing internal error: lowering DAE into semi-implicit ODE failed!")
486496
end
487-
invvarsperm = [diff_vars; setdiff(setdiff(1:ndsts(graph), diff_vars_set), BitSet(solved_variables))]
497+
invvarsperm = [diff_vars; setdiff!(setdiff(1:ndsts(graph), diff_vars_set), BitSet(solved_variables))]
488498
varsperm = zeros(Int, ndsts(graph))
489499
for (i, v) in enumerate(invvarsperm)
490500
varsperm[v] = i
491501
end
492-
@show varsperm
493502

494503
if isempty(solved_equations)
495504
deps = Vector{Int}[]
@@ -507,23 +516,31 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
507516

508517
# Contract the vertices in the structure graph to make the structure match
509518
# the new reality of the system we've just created.
510-
graph = contract_variables(graph, var_eq_matching, varsperm, solved_variables, eqsperm)
519+
graph = contract_variables(graph, var_eq_matching, varsperm, eqsperm, length(solved_variables))
511520

512521
# Update system
513522
new_var_to_diff = complete(DiffGraph(length(invvarsperm)))
514-
idx = 0
515523
for (v, d) in enumerate(var_to_diff)
516524
v′ = varsperm[v]
517525
(v′ > 0 && d !== nothing) || continue
518526
d′ = varsperm[d]
519527
new_var_to_diff[v′] = d′ > 0 ? d′ : nothing
520528
end
529+
new_eq_to_diff = complete(DiffGraph(length(inveqsperm)))
530+
for (v, d) in enumerate(eq_to_diff)
531+
v′ = eqsperm[v]
532+
(v′ > 0 && d !== nothing) || continue
533+
d′ = eqsperm[d]
534+
new_eq_to_diff[v′] = d′ > 0 ? d′ : nothing
535+
end
536+
521537
var_to_diff = new_var_to_diff
538+
eq_to_diff = new_eq_to_diff
522539
diff_to_var = invview(var_to_diff)
523540

524541
@set! state.structure.graph = graph
525-
# Note that `eq_to_diff` is not updated
526542
@set! state.structure.var_to_diff = var_to_diff
543+
@set! state.structure.eq_to_diff = eq_to_diff
527544
@set! state.fullvars = fullvars = fullvars[invvarsperm]
528545

529546
sys = state.sys

src/structural_transformation/tearing.jl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,7 @@ function masked_cumsum!(A::Vector)
2222
end
2323

2424
function contract_variables(graph::BipartiteGraph, var_eq_matching::Matching,
25-
var_rename, eliminated_variables, eqsperm = nothing)
26-
eq_rename = ones(Int64, nsrcs(graph))
27-
for v in eliminated_variables
28-
eq_rename[var_eq_matching[v]] = 0
29-
var_rename[v] = 0
30-
end
31-
masked_cumsum!(eq_rename)
32-
25+
var_rename, eq_rename, nelim)
3326
dig = DiCMOBiGraph{true}(graph, var_eq_matching)
3427

3528
# Update bipartite graph
@@ -38,14 +31,10 @@ function contract_variables(graph::BipartiteGraph, var_eq_matching::Matching,
3831
for v′ in neighborhood(dig, v, Inf; dir = :in) if var_rename[v′] != 0]
3932
end
4033

41-
nelim = length(eliminated_variables)
4234
newgraph = BipartiteGraph(nsrcs(graph) - nelim, ndsts(graph) - nelim)
4335
for e in 𝑠vertices(graph)
4436
ne = eq_rename[e]
4537
ne == 0 && continue
46-
if eqsperm !== nothing
47-
ne = eq_rename[eqsperm[ne]]
48-
end
4938
for v in 𝑠neighbors(graph, e)
5039
newvar = var_rename[v]
5140
if newvar != 0

0 commit comments

Comments
 (0)