@@ -441,35 +441,100 @@ function expand_instream2(csets::AbstractVector{<:ConnectionSet}, sys::AbstractS
441
441
sub[ex] = sv
442
442
elseif n_inners == 2 && n_outers == 0
443
443
other = idx_in_set == 1 ? 2 : 1
444
- sub[ex] = states ( renamespace ( unnamespace ( namespace, cset[other]. sys . namespace), cset[other] . sys . sys) , sv)
444
+ sub[ex] = get_current_var ( namespace, cset[other], sv)
445
445
elseif n_inners == 1 && n_outers == 1
446
446
if ! cset[idx_in_set]. isouter
447
447
other = idx_in_set == 1 ? 2 : 1
448
- outerstream = states ( renamespace ( unnamespace ( namespace, cset[other]. sys . namespace), cset[other] . sys . sys) , sv)
448
+ outerstream = get_current_var ( namespace, cset[other], sv)
449
449
sub[ex] = instream (outerstream)
450
450
end
451
451
else
452
452
if ! cset[idx_in_set]. isouter
453
- fv = flowvar (first (connectors) )
453
+ fv = flowvar (first (cset) . sys . sys )
454
454
# mj.c.m_flow
455
- innerfvs = [unwrap ( states ( s, fv) ) for (j, s) in enumerate (cset) if j != idx_in_set && ! s. isouter]
456
- innersvs = [unwrap ( states ( s, sv) ) for (j, s) in enumerate (cset) if j != idx_in_set && ! s. isouter]
455
+ innerfvs = [get_current_var (namespace, s, fv) for (j, s) in enumerate (cset) if j != idx_in_set && ! s. isouter]
456
+ innersvs = [get_current_var (namespace, s, sv) for (j, s) in enumerate (cset) if j != idx_in_set && ! s. isouter]
457
457
# ck.m_flow
458
- outerfvs = [unwrap ( states ( s, fv) ) for s in cset if s. isouter]
459
- outersvs = [unwrap ( states ( s, sv) ) for s in cset if s. isouter]
458
+ outerfvs = [get_current_var (namespace, s, fv) for s in cset if s. isouter]
459
+ outersvs = [get_current_var (namespace, s, sv) for s in cset if s. isouter]
460
460
461
- sub[ex_n] = term (instream_rt, Val (length (innerfvs)), Val (length (outerfvs)), innerfvs... , innersvs... , outerfvs... , outersvs... )
461
+ sub[ex] = term (instream_rt, Val (length (innerfvs)), Val (length (outerfvs)), innerfvs... , innersvs... , outerfvs... , outersvs... )
462
+ end
463
+ end
464
+ end
465
+
466
+ # additional equations
467
+ additional_eqs = Equation[]
468
+ csets = filter (cset-> any (e-> e. sys. namespace === namespace, cset. set), csets)
469
+ @show csets
470
+ for cset′ in csets
471
+ cset = cset′. set
472
+ connectors = Vector {Any} (undef, length (cset))
473
+ n_inners = n_outers = 0
474
+ for (i, e) in enumerate (cset)
475
+ connectors[i] = e. sys. sys
476
+ if e. isouter
477
+ n_outers += 1
478
+ else
479
+ n_inners += 1
480
+ end
481
+ end
482
+ iszero (n_outers) && continue
483
+ connector_representative = first (cset). sys. sys
484
+ fv = flowvar (connector_representative)
485
+ sv = first (cset). v
486
+ vtype = get_connection_type (sv)
487
+ vtype === Stream || continue
488
+ if n_inners == 1 && n_outers == 1
489
+ push! (additional_eqs, @show states (cset[1 ]. sys. sys, sv) ~ states (cset[2 ]. sys. sys, sv))
490
+ elseif n_inners == 0 && n_outers == 2
491
+ # we don't expand `instream` in this case.
492
+ v1 = states (cset[1 ]. sys. sys, sv)
493
+ v2 = states (cset[2 ]. sys. sys, sv)
494
+ push! (additional_eqs, v1 ~ instream (v2))
495
+ push! (additional_eqs, v2 ~ instream (v1))
496
+ else
497
+ sq = 0
498
+ s_inners = (s for s in cset if ! s. isouter)
499
+ s_outers = (s for s in cset if s. isouter)
500
+ for (q, oscq) in enumerate (s_outers)
501
+ sq += sum (s-> max (- states (s, fv), 0 ), s_inners)
502
+ for (k, s) in enumerate (s_outers); k == q && continue
503
+ f = states (s. sys. sys, fv)
504
+ sq += max (f, 0 )
505
+ end
506
+
507
+ num = 0
508
+ den = 0
509
+ for s in s_inners
510
+ f = states (s. sys. sys, fv)
511
+ tmp = positivemax (- f, sq; tol= tol)
512
+ den += tmp
513
+ num += tmp * states (s. sys. sys, sv)
514
+ end
515
+ for (k, s) in enumerate (s_outers); k == q && continue
516
+ f = states (s. sys. sys, fv)
517
+ tmp = positivemax (f, sq; tol= tol)
518
+ den += tmp
519
+ num += tmp * instream (states (s. sys. sys, sv))
520
+ end
521
+ push! (additional_eqs, states (oscq. sys. sys, sv) ~ num / den)
462
522
end
463
523
end
464
524
end
525
+ @show additional_eqs
465
526
466
527
display (instream_exprs)
467
528
display (sub)
468
529
@set! sys. systems = []
469
- @set! sys. eqs = [get_eqs (sys); eqs; substitute (instream_eqs, sub)]
530
+ @set! sys. eqs = [get_eqs (sys); eqs; substitute (instream_eqs, sub); additional_eqs ]
470
531
sys
471
532
end
472
533
534
+ function get_current_var (namespace, cele, sv)
535
+ states (renamespace (unnamespace (namespace, cele. sys. namespace), cele. sys. sys), sv)
536
+ end
537
+
473
538
function get_cset_sv (namespace, ex, csets)
474
539
ns_sv = only (arguments (ex))
475
540
full_name_sv = renamespace (namespace, ns_sv)
0 commit comments