11from collections .abc import Iterable
22from itertools import chain , product
3- from functools import cached_property , lru_cache
3+ from functools import cached_property
44from typing import Callable
55
66from sympy import S , Expr
77import sympy
88
9+ from devito .ir .support .caching import CacheInstances
910from devito .ir .support .space import Backward , null_ispace
1011from devito .ir .support .utils import AccessMode , extrema
1112from devito .ir .support .vector import LabeledVector , Vector
@@ -626,21 +627,12 @@ def is_imaginary(self):
626627 return S .ImaginaryUnit in self .distance
627628
628629
629- class Dependence (Relation ):
630+ class Dependence (Relation , CacheInstances ):
630631
631632 """
632633 A data dependence between two TimedAccess objects.
633634 """
634635
635- @classmethod
636- @lru_cache (maxsize = 128 )
637- def fetch (cls : type ['Dependence' ],
638- source : TimedAccess , sink : TimedAccess ) -> 'Dependence' :
639- """
640- Obtain a (potentially cached) Dependence for analysis.
641- """
642- return cls (source , sink )
643-
644636 def __repr__ (self ):
645637 return "%s -> %s" % (self .source , self .sink )
646638
@@ -834,14 +826,18 @@ def project(self, function):
834826 return DependenceGroup (i for i in self if i .function is function )
835827
836828
837- class Scope :
829+ class Scope ( CacheInstances ) :
838830
839831 # Describes a rule for dependencies
840832 Rule = Callable [[TimedAccess , TimedAccess ], bool ]
841833
834+ @classmethod
835+ def _preprocess_args (cls , exprs : Expr | Iterable [Expr ],
836+ ** kwargs ) -> tuple [tuple , dict ]:
837+ return (as_tuple (exprs ),), kwargs
838+
842839 def __init__ (self , exprs : tuple [Expr ],
843- rules : Rule | tuple [Rule ] | None = None ) \
844- -> None :
840+ rules : Rule | tuple [Rule ] | None = None ) -> None :
845841 """
846842 A Scope enables data dependence analysis on a totally ordered sequence
847843 of expressions.
@@ -852,24 +848,6 @@ def __init__(self, exprs: tuple[Expr],
852848 self .rules : tuple [Scope .Rule ] = as_tuple (rules ) # type: ignore[assignment]
853849 assert all (callable (i ) for i in self .rules )
854850
855- @classmethod
856- @lru_cache (maxsize = 128 )
857- def _fetch (cls : type ['Scope' ], exprs : tuple [Expr ],
858- rules : Rule | tuple [Rule ] | None = None ) -> 'Scope' :
859- """
860- Obtains a (potentially cached) Scope from a sequence of expressions.
861- Helper function called with hashable arguments.
862- """
863- return cls (exprs , rules = rules )
864-
865- @classmethod
866- def fetch (cls : type ['Scope' ], exprs : Expr | Iterable [Expr ],
867- rules : Rule | tuple [Rule ] | None = None ) -> 'Scope' :
868- """
869- Obtains a (potentially cached) Scope from a sequence of expressions.
870- """
871- return cls ._fetch (as_tuple (exprs ), rules = rules )
872-
873851 @memoized_generator
874852 def writes_gen (self ):
875853 """
@@ -1111,7 +1089,7 @@ def d_flow_gen(self):
11111089 if any (not rule (w , r ) for rule in self .rules ):
11121090 continue
11131091
1114- dependence = Dependence . fetch (w , r )
1092+ dependence = Dependence (w , r )
11151093
11161094 if dependence .is_imaginary :
11171095 continue
@@ -1141,7 +1119,7 @@ def d_anti_gen(self):
11411119 if any (not rule (r , w ) for rule in self .rules ):
11421120 continue
11431121
1144- dependence = Dependence . fetch (r , w )
1122+ dependence = Dependence (r , w )
11451123
11461124 if dependence .is_imaginary :
11471125 continue
@@ -1171,7 +1149,7 @@ def d_output_gen(self):
11711149 if any (not rule (w2 , w1 ) for rule in self .rules ):
11721150 continue
11731151
1174- dependence = Dependence . fetch (w2 , w1 )
1152+ dependence = Dependence (w2 , w1 )
11751153
11761154 if dependence .is_imaginary :
11771155 continue
0 commit comments