Skip to content

Commit 039b86c

Browse files
committed
Stream connector rewrite
1 parent 9e7fa14 commit 039b86c

File tree

1 file changed

+74
-9
lines changed

1 file changed

+74
-9
lines changed

src/systems/connectors.jl

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -441,35 +441,100 @@ function expand_instream2(csets::AbstractVector{<:ConnectionSet}, sys::AbstractS
441441
sub[ex] = sv
442442
elseif n_inners == 2 && n_outers == 0
443443
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)
445445
elseif n_inners == 1 && n_outers == 1
446446
if !cset[idx_in_set].isouter
447447
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)
449449
sub[ex] = instream(outerstream)
450450
end
451451
else
452452
if !cset[idx_in_set].isouter
453-
fv = flowvar(first(connectors))
453+
fv = flowvar(first(cset).sys.sys)
454454
# 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]
457457
# 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]
460460

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)
462522
end
463523
end
464524
end
525+
@show additional_eqs
465526

466527
display(instream_exprs)
467528
display(sub)
468529
@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]
470531
sys
471532
end
472533

534+
function get_current_var(namespace, cele, sv)
535+
states(renamespace(unnamespace(namespace, cele.sys.namespace), cele.sys.sys), sv)
536+
end
537+
473538
function get_cset_sv(namespace, ex, csets)
474539
ns_sv = only(arguments(ex))
475540
full_name_sv = renamespace(namespace, ns_sv)

0 commit comments

Comments
 (0)