@@ -268,8 +268,10 @@ function generate_connection_set(sys::AbstractSystem, find = nothing, replace =
268268 connectionsets = ConnectionSet[]
269269 domain_csets = ConnectionSet[]
270270 sys = generate_connection_set! (connectionsets, domain_csets, sys, find, replace)
271+ csets = merge (connectionsets)
272+ domain_csets = merge ([csets; domain_csets], true )
271273
272- sys, (merge (connectionsets), merge ([connectionsets; domain_csets]) )
274+ sys, (csets, domain_csets)
273275end
274276
275277function generate_connection_set! (connectionsets, domain_csets,
@@ -313,6 +315,7 @@ function generate_connection_set!(connectionsets, domain_csets,
313315 T = ConnectionElement
314316 for s in subsys
315317 isconnector (s) || continue
318+ is_domain_connector (s) && continue
316319 for v in states (s)
317320 Flow === get_connection_type (v) || continue
318321 push! (connectionsets, ConnectionSet ([T (LazyNamespace (namespace, s), v, false )]))
@@ -334,18 +337,35 @@ function generate_connection_set!(connectionsets, domain_csets,
334337 @set! sys. eqs = eqs
335338end
336339
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 )
338349 mcsets = ConnectionSet[]
339350 ele2idx = Dict {ConnectionElement, Int} ()
340351 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
342359 idx = nothing
343360 for e in cset. set
344361 idx = get (ele2idx, e, nothing )
345- idx != = nothing && break
362+ if idx != = nothing
363+ merged = true
364+ break
365+ end
346366 end
347367 if idx === nothing
348- push! (mcsets, cset)
368+ push! (mcsets, copy ( cset) )
349369 for e in cset. set
350370 ele2idx[e] = length (mcsets)
351371 end
@@ -364,7 +384,7 @@ function Base.merge(csets::AbstractVector{<:ConnectionSet})
364384 empty! (cacheset)
365385 end
366386 end
367- mcsets
387+ mcsets, merged
368388end
369389
370390function generate_connection_equations_and_stream_connections (csets:: AbstractVector {
@@ -576,7 +596,7 @@ function expand_instream(csets::AbstractVector{<:ConnectionSet}, sys::AbstractSy
576596 s_inners = (s for s in cset if ! s. isouter)
577597 s_outers = (s for s in cset if s. isouter)
578598 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 )
580600 for (k, s) in enumerate (s_outers)
581601 k == q && continue
582602 f = states (s. sys. sys, fv)
0 commit comments