@@ -268,8 +268,10 @@ function generate_connection_set(sys::AbstractSystem, find = nothing, replace =
268
268
connectionsets = ConnectionSet[]
269
269
domain_csets = ConnectionSet[]
270
270
sys = generate_connection_set! (connectionsets, domain_csets, sys, find, replace)
271
+ csets = merge (connectionsets)
272
+ domain_csets = merge ([csets; domain_csets], true )
271
273
272
- sys, (merge (connectionsets), merge ([connectionsets; domain_csets]) )
274
+ sys, (csets, domain_csets)
273
275
end
274
276
275
277
function generate_connection_set! (connectionsets, domain_csets,
@@ -313,6 +315,7 @@ function generate_connection_set!(connectionsets, domain_csets,
313
315
T = ConnectionElement
314
316
for s in subsys
315
317
isconnector (s) || continue
318
+ is_domain_connector (s) && continue
316
319
for v in states (s)
317
320
Flow === get_connection_type (v) || continue
318
321
push! (connectionsets, ConnectionSet ([T (LazyNamespace (namespace, s), v, false )]))
@@ -334,18 +337,35 @@ function generate_connection_set!(connectionsets, domain_csets,
334
337
@set! sys. eqs = eqs
335
338
end
336
339
337
- function Base. merge (csets:: AbstractVector{<:ConnectionSet} )
340
+ function Base. merge (csets:: AbstractVector{<:ConnectionSet} , allouter = false )
341
+ csets, merged = partial_merge (csets, allouter)
342
+ while merged
343
+ csets, merged = partial_merge (csets)
344
+ end
345
+ csets
346
+ end
347
+
348
+ function partial_merge (csets:: AbstractVector{<:ConnectionSet} , allouter = false )
338
349
mcsets = ConnectionSet[]
339
350
ele2idx = Dict {ConnectionElement, Int} ()
340
351
cacheset = Set {ConnectionElement} ()
341
- for cset in csets
352
+ merged = false
353
+ for (j, cset) in enumerate (csets)
354
+ if allouter
355
+ cset = ConnectionSet (map (cset. set) do e
356
+ @set! e. isouter = true
357
+ end )
358
+ end
342
359
idx = nothing
343
360
for e in cset. set
344
361
idx = get (ele2idx, e, nothing )
345
- idx != = nothing && break
362
+ if idx != = nothing
363
+ merged = true
364
+ break
365
+ end
346
366
end
347
367
if idx === nothing
348
- push! (mcsets, cset)
368
+ push! (mcsets, copy ( cset) )
349
369
for e in cset. set
350
370
ele2idx[e] = length (mcsets)
351
371
end
@@ -364,7 +384,7 @@ function Base.merge(csets::AbstractVector{<:ConnectionSet})
364
384
empty! (cacheset)
365
385
end
366
386
end
367
- mcsets
387
+ mcsets, merged
368
388
end
369
389
370
390
function generate_connection_equations_and_stream_connections (csets:: AbstractVector {
@@ -576,7 +596,7 @@ function expand_instream(csets::AbstractVector{<:ConnectionSet}, sys::AbstractSy
576
596
s_inners = (s for s in cset if ! s. isouter)
577
597
s_outers = (s for s in cset if s. isouter)
578
598
for (q, oscq) in enumerate (s_outers)
579
- sq += sum (s -> max (- states (s, fv), 0 ), s_inners)
599
+ sq += sum (s -> max (- states (s, fv), 0 ), s_inners, init = 0 )
580
600
for (k, s) in enumerate (s_outers)
581
601
k == q && continue
582
602
f = states (s. sys. sys, fv)
0 commit comments