@@ -805,7 +805,23 @@ has_equations(::AbstractSystem) = true
805805
806806Invalidate cached jacobians, etc.
807807"""
808- invalidate_cache! (sys:: AbstractSystem ) = sys
808+ function invalidate_cache! (sys:: AbstractSystem )
809+ has_metadata (sys) || return sys
810+ empty! (getmetadata (sys, MutableCacheKey, nothing ))
811+ return sys
812+ end
813+
814+ # `::MetadataT` but that is defined later
815+ function refreshed_metadata (meta:: Base.ImmutableDict )
816+ newmeta = MetadataT ()
817+ for (k, v) in meta
818+ if k === MutableCacheKey
819+ v = MutableCacheT ()
820+ end
821+ newmeta = Base. ImmutableDict (newmeta, k => v)
822+ end
823+ return newmeta
824+ end
809825
810826function Setfield. get (obj:: AbstractSystem , :: Setfield.PropertyLens{field} ) where {field}
811827 getfield (obj, field)
815831 args = map (fieldnames (obj)) do fn
816832 if fn in fieldnames (patch)
817833 :(patch.$ fn)
834+ elseif fn == :metadata
835+ :($ refreshed_metadata (getfield (obj, $ (Meta. quot (fn)))))
818836 else
819837 :(getfield (obj, $ (Meta. quot (fn))))
820838 end
@@ -2507,7 +2525,15 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem;
25072525 cevs = union (get_continuous_events (basesys), get_continuous_events (sys))
25082526 devs = union (get_discrete_events (basesys), get_discrete_events (sys))
25092527 defs = merge (get_defaults (basesys), get_defaults (sys)) # prefer `sys`
2510- meta = merge (get_metadata (basesys), get_metadata (sys))
2528+ meta = MetadataT ()
2529+ for kvp in get_metadata (basesys)
2530+ kvp[1 ] == MutableCacheKey && continue
2531+ meta = Base. ImmutableDict (meta, kvp)
2532+ end
2533+ for kvp in get_metadata (sys)
2534+ kvp[1 ] == MutableCacheKey && continue
2535+ meta = Base. ImmutableDict (meta, kvp)
2536+ end
25112537 syss = union (get_systems (basesys), get_systems (sys))
25122538 args = length (ivs) == 0 ? (eqs, sts, ps) : (eqs, ivs[1 ], sts, ps)
25132539 kwargs = (observed = obs, continuous_events = cevs,
@@ -2705,7 +2731,9 @@ function process_parameter_equations(sys::AbstractSystem)
27052731 is_sized_array_symbolic (sym) &&
27062732 all (Base. Fix1 (is_parameter, sys), collect (sym))
27072733 end
2708- if ! isparameter (eq. lhs)
2734+ # Everything in `varsbuf` is a parameter, so this is a cheap `is_parameter`
2735+ # check.
2736+ if ! (eq. lhs in varsbuf)
27092737 throw (ArgumentError ("""
27102738 LHS of parameter dependency equation must be a single parameter. Found \
27112739 $(eq. lhs) .
0 commit comments