@@ -283,13 +283,32 @@ end
283
283
284
284
function Base. merge (csets:: AbstractVector{<:ConnectionSet} )
285
285
mcsets = ConnectionSet[]
286
- # FIXME : this is O(m n^3)
286
+ ele2idx = Dict {ConnectionElement,Int} ()
287
+ cacheset = Set {ConnectionElement} ()
287
288
for cset in csets
288
- idx = findfirst (mcset-> any (s-> any (z-> z == s, cset. set), mcset. set), mcsets)
289
+ idx = nothing
290
+ for e in cset. set
291
+ idx = get (ele2idx, e, nothing )
292
+ idx != = nothing && break
293
+ end
289
294
if idx === nothing
290
295
push! (mcsets, cset)
296
+ for e in cset. set
297
+ ele2idx[e] = length (mcsets)
298
+ end
291
299
else
292
- union! (mcsets[idx]. set, cset. set)
300
+ for e in mcsets[idx]. set
301
+ push! (cacheset, e)
302
+ end
303
+ for e in cset. set
304
+ push! (cacheset, e)
305
+ end
306
+ empty! (mcsets[idx]. set)
307
+ for e in cacheset
308
+ ele2idx[e] = idx
309
+ push! (mcsets[idx]. set, e)
310
+ end
311
+ empty! (cacheset)
293
312
end
294
313
end
295
314
mcsets
@@ -330,8 +349,8 @@ function expand_connections(sys::AbstractSystem; debug=false, tol=1e-10)
330
349
sys, csets = generate_connection_set (sys)
331
350
ceqs, instream_csets = generate_connection_equations_and_stream_connections (csets)
332
351
additional_eqs = Equation[]
333
- _sys = expand_instream2 (instream_csets, sys; debug= debug, tol= tol)
334
- sys = flatten (sys)
352
+ _sys = expand_instream (instream_csets, sys; debug= debug, tol= tol)
353
+ sys = flatten (sys, true )
335
354
@set! sys. eqs = [equations (_sys); ceqs; additional_eqs]
336
355
end
337
356
@@ -348,12 +367,10 @@ function unnamespace(root, namespace)
348
367
end
349
368
end
350
369
351
- function expand_instream2 (csets:: AbstractVector{<:ConnectionSet} , sys:: AbstractSystem , namespace= nothing , prevnamespace= nothing ; debug= false , tol= 1e-8 )
370
+ function expand_instream (csets:: AbstractVector{<:ConnectionSet} , sys:: AbstractSystem , namespace= nothing , prevnamespace= nothing ; debug= false , tol= 1e-8 )
352
371
subsys = get_systems (sys)
353
- # no connectors if there are no subsystems
354
- # isempty(subsys) && return sys
355
372
# post order traversal
356
- @set! sys. systems = map (s-> expand_instream2 (csets, s, renamespace (namespace, nameof (s)), namespace; debug, tol), subsys)
373
+ @set! sys. systems = map (s-> expand_instream (csets, s, renamespace (namespace, nameof (s)), namespace; debug, tol), subsys)
357
374
subsys = get_systems (sys)
358
375
359
376
if debug
@@ -365,8 +382,8 @@ function expand_instream2(csets::AbstractVector{<:ConnectionSet}, sys::AbstractS
365
382
instream_eqs = Equation[]
366
383
instream_exprs = Set ()
367
384
for s in subsys
368
- seqs = map (Base . Fix2 (namespace_equation, s), get_eqs (s) )
369
- for eq in seqs
385
+ for eq in get_eqs (s)
386
+ eq = namespace_equation (eq, s)
370
387
if collect_instream! (instream_exprs, eq)
371
388
push! (instream_eqs, eq)
372
389
else
0 commit comments