@@ -1178,6 +1178,43 @@ function (pred::CheckInvalidAndTrackNamespaced)(x::SymbolicT)
11781178 return false
11791179end
11801180
1181+ struct NamespaceMap
1182+ value:: Dict{SymbolicT, SymbolicT}
1183+ end
1184+
1185+ function should_invalidate_mutable_cache_entry (:: Type{NamespaceMap} , patch:: NamedTuple )
1186+ return haskey (patch, :name ) || haskey (patch, :observed ) || haskey (patch, :unknowns ) ||
1187+ haskey (patch, :ps ) || haskey (patch, :systems )
1188+ end
1189+
1190+ function _build_namespace_map (sys)
1191+ ns_map = Dict {SymbolicT, SymbolicT} (renamespace (sys, eq. lhs) => eq. lhs for eq in observed (sys))
1192+ for sym in unknowns (sys)
1193+ ns_map[renamespace (sys, sym)] = sym
1194+ if iscall (sym) && operation (sym) === getindex
1195+ ns_map[renamespace (sys, arguments (sym)[1 ])] = arguments (sym)[1 ]
1196+ end
1197+ end
1198+ for sym in parameters (sys; initial_parameters = true )
1199+ ns_map[renamespace (sys, sym)] = sym
1200+ if iscall (sym) && operation (sym) === getindex
1201+ ns_map[renamespace (sys, arguments (sym)[1 ])] = arguments (sym)[1 ]
1202+ end
1203+ end
1204+ return ns_map
1205+ end
1206+
1207+ function get_namespace_map (sys)
1208+ if sys isa System && iscomplete (sys)
1209+ cached = check_mutable_cache (sys, NamespaceMap, NamespaceMap, nothing )
1210+ cached isa NamespaceMap && return cached. value
1211+ m = _build_namespace_map (sys)
1212+ store_to_mutable_cache! (sys, NamespaceMap, NamespaceMap (m))
1213+ return m
1214+ end
1215+ return _build_namespace_map (sys)
1216+ end
1217+
11811218"""
11821219 build_explicit_observed_function(sys, ts; kwargs...) -> Function(s)
11831220
@@ -1283,19 +1320,7 @@ Base.@nospecializeinfer function build_explicit_observed_function(
12831320 end
12841321
12851322 namespace_subs = Dict {SymbolicT, SymbolicT} ()
1286- ns_map = Dict {SymbolicT, SymbolicT} (renamespace (sys, eq. lhs) => eq. lhs for eq in observed (sys))
1287- for sym in unknowns (sys)
1288- ns_map[renamespace (sys, sym)] = sym
1289- if iscall (sym) && operation (sym) === getindex
1290- ns_map[renamespace (sys, arguments (sym)[1 ])] = arguments (sym)[1 ]
1291- end
1292- end
1293- for sym in parameters (sys; initial_parameters = true )
1294- ns_map[renamespace (sys, sym)] = sym
1295- if iscall (sym) && operation (sym) === getindex
1296- ns_map[renamespace (sys, arguments (sym)[1 ])] = arguments (sym)[1 ]
1297- end
1298- end
1323+ ns_map = get_namespace_map (sys)
12991324 allsyms = as_atomic_array_set (unknowns (sys))
13001325 foreach (Base. Fix1 (push_as_atomic_array!, allsyms), observables (sys))
13011326 foreach (Base. Fix1 (push_as_atomic_array!, allsyms), parameters (sys; initial_parameters = true ))
0 commit comments