Skip to content

Commit 23f9eaa

Browse files
committed
compiler: Polish ConditionalDimension
1 parent f59a4fe commit 23f9eaa

1 file changed

Lines changed: 26 additions & 26 deletions

File tree

devito/types/dimension.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -904,10 +904,10 @@ class ConditionalDimension(DerivedDimension):
904904
is_Conditional = True
905905

906906
__rkwargs__ = DerivedDimension.__rkwargs__ + \
907-
('symbolic_factor', 'factor', 'condition', 'indirect')
907+
('factor', 'condition', 'indirect')
908908

909909
def __init_finalize__(self, name, parent=None, factor=None, condition=None,
910-
indirect=False, symbolic_factor=None, **kwargs):
910+
indirect=False, **kwargs):
911911
# `parent=None` degenerates to a ConditionalDimension outside of
912912
# any iteration space
913913
if parent is None:
@@ -916,31 +916,22 @@ def __init_finalize__(self, name, parent=None, factor=None, condition=None,
916916
super().__init_finalize__(name, parent)
917917

918918
# Process subsampling factor
919-
fname = f"{name}f"
920919
if factor is None or factor == 1:
921920
self._factor = None
922921
elif is_number(factor):
923922
self._factor = int(factor)
924923
elif factor.is_Constant:
925924
deprecations.constant_factor_warn
926925
self._factor = factor
927-
symbolic_factor = factor
928926
else:
929-
raise ValueError("factor must be an integer or integer Constant")
930-
931-
if self._factor is not None:
932-
# Always make the factor symbolic to allow overrides with different factor.
933-
self._symbolic_factor = symbolic_factor or \
934-
SubsamplingFactor(name=fname, dtype=np.int32, is_const=True)
935-
else:
936-
self._symbolic_factor = None
927+
raise ValueError("factor must be an integer")
937928

938929
self._condition = condition
939930
self._indirect = indirect
940931

941932
@property
942-
def spacing(self):
943-
return self.factor_data * self.parent.spacing
933+
def uses_symbolic_factor(self):
934+
return self._factor is not None
944935

945936
@property
946937
def factor_data(self):
@@ -950,12 +941,23 @@ def factor_data(self):
950941
return self.factor
951942

952943
@property
953-
def factor(self):
954-
return self._factor if self._factor is not None else 1
944+
def spacing(self):
945+
return self.factor_data * self.parent.spacing
955946

956947
@property
948+
def factor(self):
949+
return self._factor if self.uses_symbolic_factor else 1
950+
951+
@cached_property
957952
def symbolic_factor(self):
958-
return self._symbolic_factor
953+
if not self.uses_symbolic_factor:
954+
return None
955+
elif isinstance(self.factor, Constant):
956+
return self.factor
957+
else:
958+
return SubsamplingFactor(
959+
name=f'{self.name}f', dtype=np.int32, is_const=True
960+
)
959961

960962
@property
961963
def condition(self):
@@ -977,14 +979,13 @@ def free_symbols(self):
977979
return retval
978980

979981
def _arg_values(self, interval, grid=None, args=None, **kwargs):
980-
if self.symbolic_factor is not None:
981-
fname = self.symbolic_factor.name
982-
args = args or {}
983-
fact = kwargs.get(fname, args.get(fname, self.factor_data))
984-
else:
985-
# No factor
982+
if not self.uses_symbolic_factor:
986983
return {}
987984

985+
args = args or {}
986+
fname = self.symbolic_factor.name
987+
fact = kwargs.get(fname, args.get(fname, self.factor_data))
988+
988989
toint = lambda x: math.ceil(x / fact)
989990
vals = {}
990991
try:
@@ -997,8 +998,7 @@ def _arg_values(self, interval, grid=None, args=None, **kwargs):
997998
except (KeyError, TypeError):
998999
pass
9991000

1000-
if self.symbolic_factor is not None:
1001-
vals[self.symbolic_factor.name] = fact
1001+
vals[self.symbolic_factor.name] = fact
10021002

10031003
return vals
10041004

@@ -1009,7 +1009,7 @@ def _arg_defaults(self, _min=None, size=None, alias=None):
10091009
# `factor` endpoints are legal, so we return them all. It's then
10101010
# up to the caller to decide which one to pick upon reduction
10111011
dim = alias or self
1012-
if dim.symbolic_factor is not None:
1012+
if dim.uses_symbolic_factor:
10131013
factor = defaults[dim.symbolic_factor.name] = self.factor_data
10141014
defaults[dim.parent.max_name] = range(0, factor*size - 1)
10151015

0 commit comments

Comments
 (0)