@@ -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