@@ -1368,104 +1368,6 @@ struct IgnoredAnalysisPoint
1368
1368
outputs:: Vector{Union{BasicSymbolic, AbstractSystem}}
1369
1369
end
1370
1370
1371
- const HierarchyVariableT = Vector{Union{BasicSymbolic, Symbol}}
1372
- const HierarchySystemT = Vector{Union{AbstractSystem, Symbol}}
1373
- """
1374
- The type returned from `analysis_point_common_hierarchy`.
1375
- """
1376
- const HierarchyAnalysisPointT = Vector{Union{IgnoredAnalysisPoint, Symbol}}
1377
- """
1378
- The type returned from `as_hierarchy`.
1379
- """
1380
- const HierarchyT = Union{HierarchyVariableT, HierarchySystemT}
1381
-
1382
- """
1383
- $(TYPEDSIGNATURES)
1384
-
1385
- The inverse operation of `as_hierarchy`.
1386
- """
1387
- function from_hierarchy (hierarchy:: HierarchyT )
1388
- namefn = hierarchy[1 ] isa AbstractSystem ? nameof : getname
1389
- foldl (@view hierarchy[2 : end ]; init = hierarchy[1 ]) do sys, name
1390
- rename (sys, Symbol (name, NAMESPACE_SEPARATOR, namefn (sys)))
1391
- end
1392
- end
1393
-
1394
- """
1395
- $(TYPEDSIGNATURES)
1396
-
1397
- Represent an ignored analysis point as a namespaced hierarchy. The hierarchy is built
1398
- using the common hierarchy of all involved systems/variables.
1399
- """
1400
- function analysis_point_common_hierarchy (ap:: IgnoredAnalysisPoint ):: HierarchyAnalysisPointT
1401
- isys = as_hierarchy (ap. input)
1402
- osyss = as_hierarchy .(ap. outputs)
1403
- suffix = Symbol[]
1404
- while isys[end ] == osyss[1 ][end ] && allequal (last .(osyss))
1405
- push! (suffix, isys[end ])
1406
- pop! (isys)
1407
- pop! .(osyss)
1408
- end
1409
- isys = from_hierarchy (isys)
1410
- osyss = from_hierarchy .(osyss)
1411
- newap = IgnoredAnalysisPoint (isys, osyss)
1412
- hierarchy = HierarchyAnalysisPointT ([suffix; newap])
1413
- reverse! (hierarchy)
1414
- return hierarchy
1415
- end
1416
-
1417
- """
1418
- $(TYPEDSIGNATURES)
1419
-
1420
- Represent a namespaced system (or variable) `sys` as a hierarchy. Return a vector, where
1421
- the first element is the unnamespaced system (variable) and subsequent elements are
1422
- `Symbol`s representing the parents of the unnamespaced system (variable) in order from
1423
- inner to outer.
1424
- """
1425
- function as_hierarchy (sys:: Union{AbstractSystem, BasicSymbolic} ):: HierarchyT
1426
- namefn = sys isa AbstractSystem ? nameof : getname
1427
- # get the hierarchy
1428
- hierarchy = namespace_hierarchy (namefn (sys))
1429
- # rename the system with unnamespaced name
1430
- newsys = rename (sys, hierarchy[end ])
1431
- # and remove it from the list
1432
- pop! (hierarchy)
1433
- # reverse it to go from inner to outer
1434
- reverse! (hierarchy)
1435
- # concatenate
1436
- T = sys isa AbstractSystem ? AbstractSystem : BasicSymbolic
1437
- return Union{Symbol, T}[newsys; hierarchy]
1438
- end
1439
-
1440
- """
1441
- $(TYPEDSIGNATURES)
1442
-
1443
- Get the analysis points to ignore for `sys` and its subsystems. The returned value is a
1444
- `Tuple` similar in structure to the `ignored_connections` field.
1445
- """
1446
- function ignored_connections (sys:: AbstractSystem )
1447
- has_ignored_connections (sys) ||
1448
- return (HierarchyAnalysisPointT[], HierarchyAnalysisPointT[])
1449
-
1450
- ics = get_ignored_connections (sys)
1451
- if ics === nothing
1452
- ics = (HierarchyAnalysisPointT[], HierarchyAnalysisPointT[])
1453
- end
1454
- # turn into hierarchies
1455
- ics = (map (analysis_point_common_hierarchy, ics[1 ]),
1456
- map (analysis_point_common_hierarchy, ics[2 ]))
1457
- systems = get_systems (sys)
1458
- # for each subsystem, get its ignored connections, add the name of the subsystem
1459
- # to the hierarchy and concatenate corresponding buffers of the result
1460
- result = mapreduce (Broadcast. BroadcastFunction (vcat), systems; init = ics) do subsys
1461
- sub_ics = ignored_connections (subsys)
1462
- (map (Base. Fix2 (push!, nameof (subsys)), sub_ics[1 ]),
1463
- map (Base. Fix2 (push!, nameof (subsys)), sub_ics[2 ]))
1464
- end
1465
- return (Vector {HierarchyAnalysisPointT} (result[1 ]),
1466
- Vector {HierarchyAnalysisPointT} (result[2 ]))
1467
- end
1468
-
1469
1371
"""
1470
1372
$(TYPEDSIGNATURES)
1471
1373
@@ -1993,35 +1895,20 @@ function n_expanded_connection_equations(sys::AbstractSystem)
1993
1895
# TODO : what about inputs?
1994
1896
isconnector (sys) && return length (get_unknowns (sys))
1995
1897
sys = remove_analysis_points (sys)
1996
- n_variable_connect_eqs = 0
1997
- for eq in equations (sys)
1998
- is_causal_variable_connection (eq. rhs) || continue
1999
- n_variable_connect_eqs += length (get_systems (eq. rhs)) - 1
2000
- end
2001
-
2002
1898
sys, (csets, _) = generate_connection_set (sys)
2003
- ceqs, instream_csets = generate_connection_equations_and_stream_connections (csets)
2004
- n_outer_stream_variables = 0
2005
- for cset in instream_csets
2006
- n_outer_stream_variables += count (x -> x. isouter, cset. set)
2007
- end
2008
-
2009
- # n_toplevel_unused_flows = 0
2010
- # toplevel_flows = Set()
2011
- # for cset in csets
2012
- # e1 = first(cset.set)
2013
- # e1.sys.namespace === nothing || continue
2014
- # for e in cset.set
2015
- # get_connection_type(e.v) === Flow || continue
2016
- # push!(toplevel_flows, e.v)
2017
- # end
2018
- # end
2019
- # for m in get_systems(sys)
2020
- # isconnector(m) || continue
2021
- # n_toplevel_unused_flows += count(x->get_connection_type(x) === Flow && !(x in toplevel_flows), get_unknowns(m))
2022
- # end
2023
-
2024
- nextras = n_outer_stream_variables + length (ceqs) + n_variable_connect_eqs
1899
+
1900
+ n_extras = 0
1901
+ for cset in csets
1902
+ rep = cset[1 ]
1903
+ if rep. type <: Union{InputVar, OutputVar, Equality}
1904
+ n_extras += length (cset) - 1
1905
+ elseif rep. type == Flow
1906
+ n_extras += 1
1907
+ elseif rep. type == Stream
1908
+ n_extras += count (x -> x. isouter, cset)
1909
+ end
1910
+ end
1911
+ return n_extras
2025
1912
end
2026
1913
2027
1914
Base. show (io:: IO , sys:: AbstractSystem ; kws... ) = show (io, MIME " text/plain" (), sys; kws... )
0 commit comments