Skip to content

Commit d7597ad

Browse files
committed
Better over-determined tearing
1 parent c62cff0 commit d7597ad

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

src/structural_transformation/bipartite_tearing/modia_tearing.jl

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,27 +89,45 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
8989

9090
ieqs = Int[]
9191
filtered_vars = BitSet()
92+
seen_eqs = falses(nsrcs(graph))
9293
for vars in var_sccs
9394
for var in vars
9495
if varfilter(var)
9596
push!(filtered_vars, var)
9697
if var_eq_matching[var] !== unassigned
97-
push!(ieqs, var_eq_matching[var])
98+
ieq = var_eq_matching[var]
99+
seen_eqs[ieq] = true
100+
push!(ieqs, ieq)
98101
end
99102
end
100103
var_eq_matching[var] = unassigned
101104
end
102-
tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs,
103-
filtered_vars,
104-
isder)
105-
106-
# clear cache
107-
vargraph.ne = 0
108-
for var in vars
109-
vargraph.matching[var] = unassigned
110-
end
111-
empty!(ieqs)
112-
empty!(filtered_vars)
105+
tear_block!(vargraph, vars,
106+
var_eq_matching, ict, solvable_graph,
107+
ieqs, filtered_vars, isder)
108+
end
109+
free_eqs = findall(!, seen_eqs)
110+
if !isempty(free_eqs)
111+
free_vars = findall(x -> !(x isa Int), var_eq_matching)
112+
tear_block!(vargraph, (),
113+
var_eq_matching, ict, solvable_graph,
114+
free_eqs, BitSet(free_vars), isder)
113115
end
114116
return var_eq_matching, full_var_eq_matching, var_sccs
115117
end
118+
119+
function tear_block!(vargraph, vars,
120+
var_eq_matching, ict, solvable_graph, ieqs,
121+
filtered_vars, isder)
122+
tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs,
123+
filtered_vars,
124+
isder)
125+
126+
# clear cache
127+
vargraph.ne = 0
128+
for var in vars
129+
vargraph.matching[var] = unassigned
130+
end
131+
empty!(ieqs)
132+
empty!(filtered_vars)
133+
end

0 commit comments

Comments
 (0)