@@ -759,6 +759,7 @@ function generate_connection_equations_and_stream_connections(
759
759
var = variable_from_vertex (sys, cvert):: BasicSymbolic
760
760
vtype = cvert. type
761
761
if vtype <: Union{InputVar, OutputVar}
762
+ length (cset) > 1 || continue
762
763
inner_output = nothing
763
764
outer_input = nothing
764
765
for cvert in cset
@@ -780,11 +781,11 @@ function generate_connection_equations_and_stream_connections(
780
781
inner_output = cvert
781
782
end
782
783
end
783
- root, rest = Iterators . peel (cset )
784
- root_var = variable_from_vertex (sys, root )
785
- for cvert in rest
786
- var = variable_from_vertex (sys, cvert)
787
- push! (eqs, root_var ~ var )
784
+ root_vert = something (inner_output, outer_input )
785
+ root_var = variable_from_vertex (sys, root_vert )
786
+ for cvert in cset
787
+ isequal (cvert, root_vert) && continue
788
+ push! (eqs, variable_from_vertex (sys, cvert) ~ root_var )
788
789
end
789
790
elseif vtype === Stream
790
791
push! (stream_connections, cset)
@@ -807,10 +808,37 @@ function generate_connection_equations_and_stream_connections(
807
808
push! (eqs, 0 ~ rhs)
808
809
end
809
810
else # Equality
810
- base = variable_from_vertex (sys, cset[1 ])
811
- for i in 2 : length (cset)
812
- v = variable_from_vertex (sys, cset[i])
813
- push! (eqs, base ~ v)
811
+ vars = map (Base. Fix1 (variable_from_vertex, sys), cset)
812
+ outer_input = inner_output = nothing
813
+ all_io = true
814
+ # attempt to interpret the equality as a causal connectionset if
815
+ # possible
816
+ for (cvert, vert) in zip (cset, vars)
817
+ is_i = isinput (vert)
818
+ is_o = isoutput (vert)
819
+ all_io &= is_i || is_o
820
+ all_io || break
821
+ if cvert. isouter && is_i && outer_input === nothing
822
+ outer_input = cvert
823
+ elseif ! cvert. isouter && is_o && inner_output === nothing
824
+ inner_output = cvert
825
+ end
826
+ end
827
+ # this doesn't necessarily mean this is a well-structured causal connection,
828
+ # but it is sufficient and we're generating equalities anyway.
829
+ if all_io && xor (outer_input != = nothing , inner_output != = nothing )
830
+ root_vert = something (inner_output, outer_input)
831
+ root_var = variable_from_vertex (sys, root_vert)
832
+ for (cvert, var) in zip (cset, vars)
833
+ isequal (cvert, root_vert) && continue
834
+ push! (eqs, var ~ root_var)
835
+ end
836
+ else
837
+ base = variable_from_vertex (sys, cset[1 ])
838
+ for i in 2 : length (cset)
839
+ v = vars[i]
840
+ push! (eqs, base ~ v)
841
+ end
814
842
end
815
843
end
816
844
end
0 commit comments