Skip to content

Commit 5c9bd11

Browse files
committed
Fix merge on connection sets
1 parent ee13234 commit 5c9bd11

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

src/systems/connectors.jl

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
273275
end
274276

275277
function 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
335338
end
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
368388
end
369389

370390
function 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

Comments
 (0)