@@ -157,11 +157,12 @@ function partial_state_selection_graph!(structure::SystemStructure, var_eq_match
157
157
var_eq_matching
158
158
end
159
159
160
- function dummy_derivative_graph! (state:: TransformationState , jac = nothing ; kwargs... )
160
+ function dummy_derivative_graph! (state:: TransformationState , jac = nothing , ag = nothing ;
161
+ kwargs... )
161
162
state. structure. solvable_graph === nothing && find_solvables! (state; kwargs... )
162
- var_eq_matching = complete (pantelides! (state))
163
+ var_eq_matching = complete (pantelides! (state, ag === nothing ? nothing : first (ag) ))
163
164
complete! (state. structure)
164
- dummy_derivative_graph! (state. structure, var_eq_matching, jac)
165
+ dummy_derivative_graph! (state. structure, var_eq_matching, jac, ag )
165
166
end
166
167
167
168
function compute_diff_level (diff_to_x)
@@ -181,8 +182,10 @@ function compute_diff_level(diff_to_x)
181
182
return xlevel, maxlevel
182
183
end
183
184
184
- function dummy_derivative_graph! (structure:: SystemStructure , var_eq_matching, jac)
185
+ function dummy_derivative_graph! (structure:: SystemStructure , var_eq_matching, jac,
186
+ (ag, diff_va))
185
187
@unpack eq_to_diff, var_to_diff, graph = structure
188
+ display (structure)
186
189
diff_to_eq = invview (eq_to_diff)
187
190
diff_to_var = invview (var_to_diff)
188
191
invgraph = invview (graph)
@@ -194,6 +197,7 @@ function dummy_derivative_graph!(structure::SystemStructure, var_eq_matching, ja
194
197
dummy_derivatives = Int[]
195
198
col_order = Int[]
196
199
nvars = ndsts (graph)
200
+ @info " " var_eq_matching
197
201
for vars in var_sccs
198
202
eqs = [var_eq_matching[var] for var in vars if var_eq_matching[var] != = unassigned]
199
203
isempty (eqs) && continue
@@ -245,6 +249,16 @@ function dummy_derivative_graph!(structure::SystemStructure, var_eq_matching, ja
245
249
vars = [diff_to_var[var] for var in vars if diff_to_var[var] != = nothing ]
246
250
end
247
251
end
252
+ n_dummys = length (dummy_derivatives)
253
+ needed = count (x -> x isa Int, diff_to_eq) - n_dummys
254
+ n = 0
255
+ for v in diff_va
256
+ c, a = ag[v]
257
+ n += 1
258
+ push! (dummy_derivatives, iszero (c) ? v : a)
259
+ needed == n && break
260
+ continue
261
+ end
248
262
249
263
dummy_derivatives_set = BitSet (dummy_derivatives)
250
264
# We can eliminate variables that are not a selected state (differential
@@ -254,6 +268,9 @@ function dummy_derivative_graph!(structure::SystemStructure, var_eq_matching, ja
254
268
dummy_derivatives_set = dummy_derivatives_set
255
269
256
270
v -> begin
271
+ if ag != = nothing
272
+ haskey (ag, v) && return false
273
+ end
257
274
dv = var_to_diff[v]
258
275
dv === nothing || dv in dummy_derivatives_set
259
276
end
@@ -269,7 +286,8 @@ function dummy_derivative_graph!(structure::SystemStructure, var_eq_matching, ja
269
286
Union{Unassigned, SelectedState};
270
287
varfilter = can_eliminate)
271
288
for v in eachindex (var_eq_matching)
272
- can_eliminate (v) && continue
289
+ dv = var_to_diff[v]
290
+ (dv === nothing || dv in dummy_derivatives_set) && continue
273
291
var_eq_matching[v] = SelectedState ()
274
292
end
275
293
0 commit comments