@@ -218,12 +218,12 @@ mutable struct TearingState{T <: AbstractSystem} <: AbstractTearingState{T}
218
218
end
219
219
220
220
TransformationState (sys:: AbstractSystem ) = TearingState (sys)
221
- function system_subset (ts:: TearingState , ieqs:: Vector{Int} )
221
+ function system_subset (ts:: TearingState , ieqs:: Vector{Int} , ivars :: Vector{Int} )
222
222
eqs = equations (ts)
223
223
@set! ts. original_eqs = ts. original_eqs[ieqs]
224
224
@set! ts. sys. eqs = eqs[ieqs]
225
225
@set! ts. original_eqs = ts. original_eqs[ieqs]
226
- @set! ts. structure = system_subset (ts. structure, ieqs)
226
+ @set! ts. structure = system_subset (ts. structure, ieqs, ivars )
227
227
if all (eq -> eq. rhs isa StateMachineOperator, get_eqs (ts. sys))
228
228
names = Symbol[]
229
229
for eq in get_eqs (ts. sys)
@@ -240,22 +240,33 @@ function system_subset(ts::TearingState, ieqs::Vector{Int})
240
240
else
241
241
@set! ts. statemachines = eltype (ts. statemachines)[]
242
242
end
243
+ @set! ts. fullvars = ts. fullvars[ivars]
243
244
ts
244
245
end
245
246
246
- function system_subset (structure:: SystemStructure , ieqs:: Vector{Int} )
247
- @unpack graph, eq_to_diff = structure
247
+ function system_subset (structure:: SystemStructure , ieqs:: Vector{Int} , ivars :: Vector{Int} )
248
+ @unpack graph = structure
248
249
fadj = Vector{Int}[]
249
250
eq_to_diff = DiffGraph (length (ieqs))
251
+ var_to_diff = DiffGraph (length (ivars))
252
+
250
253
ne = 0
254
+ old_to_new_var = zeros (Int, ndsts (graph))
255
+ for (i, iv) in enumerate (ivars)
256
+ old_to_new_var[iv] = i
257
+ structure. var_to_diff[iv] === nothing && continue
258
+ var_to_diff[i] = old_to_new_var[structure. var_to_diff[iv]]
259
+ end
251
260
for (j, eq_i) in enumerate (ieqs)
252
- ivars = copy (graph. fadjlist[eq_i])
253
- ne += length (ivars)
254
- push! (fadj, ivars)
261
+ var_adj = [old_to_new_var[i] for i in graph. fadjlist[eq_i]]
262
+ @assert all (! iszero, var_adj)
263
+ ne += length (var_adj)
264
+ push! (fadj, var_adj)
255
265
eq_to_diff[j] = structure. eq_to_diff[eq_i]
256
266
end
257
- @set! structure. graph = complete (BipartiteGraph (ne, fadj, ndsts (graph )))
267
+ @set! structure. graph = complete (BipartiteGraph (ne, fadj, length (ivars )))
258
268
@set! structure. eq_to_diff = eq_to_diff
269
+ @set! structure. var_to_diff = complete (var_to_diff)
259
270
structure
260
271
end
261
272
@@ -440,7 +451,8 @@ function TearingState(sys; quick_cancel = false, check = true, sort_eqs = true)
440
451
isdelay (v, iv) && continue
441
452
442
453
if ! symbolic_contains (v, dvs)
443
- isvalid = iscall (v) && (operation (v) isa Shift || is_transparent_operator (operation (v)))
454
+ isvalid = iscall (v) &&
455
+ (operation (v) isa Shift || is_transparent_operator (operation (v)))
444
456
v′ = v
445
457
while ! isvalid && iscall (v′) && operation (v′) isa Union{Differential, Shift}
446
458
v′ = arguments (v′)[1 ]
0 commit comments