@@ -811,6 +811,14 @@ function observed_dependency_graph(eqs::Vector{Equation})
811811    return  DiCMOBiGraph {false} (graph, matching)
812812end 
813813
814+ abstract type  ObservedGraphCacheKey end 
815+ 
816+ struct  ObservedGraphCache
817+     graph:: DiCMOBiGraph {false , Int, BipartiteGraph{Int, Nothing},
818+         Matching{Unassigned, Vector{Union{Unassigned, Int}}}}
819+     obsvar_to_idx:: Dict{Any, Int} 
820+ end 
821+ 
814822""" 
815823    $(TYPEDSIGNATURES)  
816824
@@ -831,8 +839,19 @@ Keyword arguments:
831839""" 
832840function  observed_equations_used_by (sys:: AbstractSystem , exprs;
833841        involved_vars =  vars (exprs; op =  Union{Shift, Differential, Initial}), obs =  observed (sys), available_vars =  [])
834-     obsvars =  getproperty .(obs, :lhs )
835-     graph =  observed_dependency_graph (obs)
842+     if  iscomplete (sys) &&  obs ==  observed (sys)
843+         cache =  getmetadata (sys, MutableCacheKey, nothing )
844+         obs_graph_cache =  get! (cache, ObservedGraphCacheKey) do 
845+             obsvar_to_idx =  Dict {Any, Int} ([eq. lhs =>  i for  (i, eq) in  enumerate (obs)])
846+             graph =  observed_dependency_graph (obs)
847+             return  ObservedGraphCache (graph, obsvar_to_idx)
848+         end 
849+         @unpack  obsvar_to_idx, graph =  obs_graph_cache
850+     else 
851+         obsvar_to_idx =  Dict ([eq. lhs =>  i for  (i, eq) in  obs])
852+         graph =  observed_dependency_graph (obs)
853+     end 
854+ 
836855    if  ! (available_vars isa  Set)
837856        available_vars =  Set (available_vars)
838857    end 
@@ -841,7 +860,8 @@ function observed_equations_used_by(sys::AbstractSystem, exprs;
841860    for  sym in  involved_vars
842861        sym in  available_vars &&  continue 
843862        arrsym =  iscall (sym) &&  operation (sym) ===  getindex ?  arguments (sym)[1 ] :  nothing 
844-         idx =  findfirst (v ->  isequal (v, sym) ||  isequal (v, arrsym), obsvars)
863+         idx =  @something (get (obsvar_to_idx, sym, nothing ), get (obsvar_to_idx, sym, nothing ),
864+             Some (nothing ))
845865        idx ===  nothing  &&  continue 
846866        idx in  obsidxs &&  continue 
847867        parents =  dfs_parents (graph, idx)
0 commit comments