@@ -79,37 +79,55 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
79
79
80
80
@unpack graph, solvable_graph = structure
81
81
var_eq_matching = maximal_matching (graph, eqfilter, varfilter, U)
82
- var_eq_matching = complete ( var_eq_matching,
83
- max ( length ( var_eq_matching),
84
- maximum (x -> x isa Int ? x : 0 , var_eq_matching, init = 0 )) )
82
+ matching_len = max ( length ( var_eq_matching) ,
83
+ maximum (x -> x isa Int ? x : 0 , var_eq_matching, init = 0 ))
84
+ var_eq_matching = complete ( var_eq_matching, matching_len )
85
85
full_var_eq_matching = copy (var_eq_matching)
86
86
var_sccs = find_var_sccs (graph, var_eq_matching)
87
- vargraph = DiCMOBiGraph {true} (graph)
87
+ vargraph = DiCMOBiGraph {true} (graph, 0 , Matching (matching_len) )
88
88
ict = IncrementalCycleTracker (vargraph; dir = :in )
89
89
90
90
ieqs = Int[]
91
91
filtered_vars = BitSet ()
92
+ seen_eqs = falses (nsrcs (graph))
92
93
for vars in var_sccs
93
94
for var in vars
94
95
if varfilter (var)
95
96
push! (filtered_vars, var)
96
97
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)
98
101
end
99
102
end
100
103
var_eq_matching[var] = unassigned
101
104
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)
113
115
end
114
116
return var_eq_matching, full_var_eq_matching, var_sccs
115
117
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