@@ -79,37 +79,55 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
7979
8080 @unpack graph, solvable_graph = structure
8181 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 )
8585 full_var_eq_matching = copy (var_eq_matching)
8686 var_sccs = find_var_sccs (graph, var_eq_matching)
87- vargraph = DiCMOBiGraph {true} (graph)
87+ vargraph = DiCMOBiGraph {true} (graph, 0 , Matching (matching_len) )
8888 ict = IncrementalCycleTracker (vargraph; dir = :in )
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
115117end
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