9
9
from devito .data import LEFT , RIGHT
10
10
from devito .exceptions import InvalidArgument
11
11
from devito .logger import debug
12
- from devito .tools import Pickable , is_integer , memoized_meth
12
+ from devito .tools import Pickable , is_integer , is_number , memoized_meth
13
13
from devito .types .args import ArgProvider
14
14
from devito .types .basic import Symbol , DataSymbol , Scalar
15
- from devito .types .caching import Cached
16
- from devito .types .constant import Constant
17
15
18
16
19
17
__all__ = ['Dimension' , 'SpaceDimension' , 'TimeDimension' , 'DefaultDimension' ,
@@ -823,10 +821,8 @@ def bound_symbols(self):
823
821
return self .parent .bound_symbols
824
822
825
823
826
- class SubsamplingFactor (Constant , Cached ):
827
-
828
- __hash__ = sympy .Symbol .__hash__
829
- _cache_key = Symbol ._cache_key
824
+ class SubsamplingFactor (Scalar ):
825
+ pass
830
826
831
827
832
828
class ConditionalDimension (DerivedDimension ):
@@ -905,40 +901,52 @@ class ConditionalDimension(DerivedDimension):
905
901
is_NonlinearDerived = True
906
902
is_Conditional = True
907
903
908
- __rkwargs__ = DerivedDimension .__rkwargs__ + ('factor' , 'condition' , 'indirect' )
904
+ __rkwargs__ = DerivedDimension .__rkwargs__ + \
905
+ ('symbolic_factor' , 'factor' , 'condition' , 'indirect' )
909
906
910
907
def __init_finalize__ (self , name , parent = None , factor = None , condition = None ,
911
- indirect = False , ** kwargs ):
908
+ indirect = False , symbolic_factor = None , ** kwargs ):
912
909
# `parent=None` degenerates to a ConditionalDimension outside of
913
910
# any iteration space
914
911
if parent is None :
915
912
parent = BOTTOM
916
913
917
914
super ().__init_finalize__ (name , parent )
918
915
919
- # Always make the factor symbolic to allow overrides with different factor.
920
- if factor is None or factor == 1 :
916
+ # Process subsampling factor
917
+ fname = f"{ name } f"
918
+ if factor is None :
921
919
self ._factor = None
922
- elif is_integer (factor ):
923
- self ._factor = SubsamplingFactor ( name = f" { name } f" , value = factor ,
924
- dtype = np . int32 )
925
- elif factor . is_Constant and is_integer ( factor .data ):
926
- self . _factor = factor
920
+ elif is_number (factor ):
921
+ self ._factor = int ( factor )
922
+ elif factor . is_Constant :
923
+ self . _factor = factor .data
924
+ fname = factor . name
927
925
else :
928
926
raise ValueError ("factor must be an integer or integer Constant" )
929
927
928
+ if self ._factor is not None :
929
+ # Always make the factor symbolic to allow overrides with different factor.
930
+ self ._symbolic_factor = symbolic_factor or \
931
+ SubsamplingFactor (name = fname , dtype = np .int32 , is_const = True )
932
+ else :
933
+ self ._symbolic_factor = None
934
+
930
935
self ._condition = condition
931
936
self ._indirect = indirect
932
937
933
938
@property
934
939
def spacing (self ):
935
- s = self ._factor .data if self ._factor is not None else 1
936
- return s * self .parent .spacing
940
+ return self .factor * self .parent .spacing
937
941
938
942
@property
939
943
def factor (self ):
940
944
return self ._factor if self ._factor is not None else 1
941
945
946
+ @property
947
+ def symbolic_factor (self ):
948
+ return self ._symbolic_factor
949
+
942
950
@property
943
951
def condition (self ):
944
952
return self ._condition
@@ -960,7 +968,7 @@ def free_symbols(self):
960
968
961
969
def _arg_values (self , interval , grid = None , ** kwargs ):
962
970
# Parent dimension define the interval
963
- fact = self ._factor . data if self . _factor is not None else 1
971
+ fact = self .factor
964
972
toint = lambda x : math .ceil (x / fact )
965
973
vals = {}
966
974
try :
@@ -984,12 +992,8 @@ def _arg_defaults(self, _min=None, size=None, alias=None):
984
992
dim = alias or self
985
993
if dim .condition is not None or size is None or dim ._factor is None :
986
994
return defaults
987
- try :
988
- # Is it a symbolic factor?
989
- factor = defaults [dim ._factor .name ] = self ._factor .data
990
- except AttributeError :
991
- factor = dim ._factor
992
995
996
+ factor = defaults [dim .symbolic_factor .name ] = self .factor
993
997
defaults [dim .parent .max_name ] = range (0 , factor * size - 1 )
994
998
995
999
return defaults
0 commit comments