def index_mode(self): index_mode = [] for i, fi in zip(self, self.findices): if is_integer(i) or q_affine(i, fi): index_mode.append('regular') else: dims = {i for i in i.free_symbols if isinstance(i, Dimension)} try: # There's still hope it's regular if a DerivedDimension is used candidate = dims.pop() if candidate.parent == fi and q_affine(i, candidate): index_mode.append('regular') continue except (KeyError, AttributeError): pass index_mode.append('irregular') return tuple(index_mode)
def index_mode(self): index_mode = [] for i, fi in zip(self, self.findices): if is_integer(i): index_mode.append('regular') elif q_affine(i, fi): index_mode.append('regular') else: index_mode.append('irregular') return tuple(index_mode)
def aindices(self): aindices = [] for i, fi in zip(self, self.findices): if is_integer(i): aindices.append(None) elif q_affine(i, fi): aindices.append(fi) else: dims = {i for i in i.free_symbols if isinstance(i, Dimension)} aindices.append(dims.pop() if len(dims) == 1 else None) return tuple(aindices)
def index_mode(self): retval = [] for i, fi in zip(self, self.findices): dims = {j for j in i.free_symbols if isinstance(j, Dimension)} if len(dims) == 0 and q_constant(i): retval.append(AFFINE) elif len(dims) == 1: candidate = dims.pop() if fi in candidate._defines and q_affine(i, candidate): retval.append(AFFINE) else: retval.append(IRREGULAR) else: retval.append(IRREGULAR) return tuple(retval)
def _extract_nonaffine_indices(self, cluster, template, **kwargs): """ Extract non-affine array indices, and assign them to temporaries. """ make = lambda: Scalar(name=template(), dtype=np.int32).indexify() mapper = OrderedDict() for e in cluster.exprs: for indexed in retrieve_indexed(e): for i, d in zip(indexed.indices, indexed.base.function.indices): if not (q_affine(i, d) or i.is_Number): mapper[i] = make() processed = [Eq(v, k) for k, v in mapper.items()] processed.extend([e.xreplace(mapper) for e in cluster.exprs]) return cluster.rebuild(processed)
def _extract_nonaffine_indices(self, cluster, template, **kwargs): """ Extract non-affine array indices, and assign them to temporaries. """ make = lambda: Scalar(name=template(), dtype=np.int32).indexify() mapper = OrderedDict() for e in cluster.exprs: # Note: using mode='all' and then checking for presence in the mapper # (a few lines below), rather retrieving unique indexeds only (a set), # is the key to deterministic code generation for indexed in retrieve_indexed(e, mode='all'): for i, d in zip(indexed.indices, indexed.function.indices): if q_affine(i, d) or q_scalar(i): continue elif i not in mapper: mapper[i] = make() processed = [Eq(v, k) for k, v in mapper.items()] processed.extend([e.xreplace(mapper) for e in cluster.exprs]) return cluster.rebuild(processed)
def _extract_nonaffine_indices(self, cluster, template, **kwargs): """ Extract non-affine array indices, and assign them to temporaries. """ make = lambda: Scalar(name=template(), dtype=np.int32).indexify() mapper = OrderedDict() for e in cluster.exprs: # Note: using mode='all' and then checking for presence in the mapper # (a few lines below), rather retrieving unique indexeds only (a set), # is the key to deterministic code generation for indexed in retrieve_indexed(e, mode='all'): for i, d in zip(indexed.indices, indexed.function.indices): if q_affine(i, d) or q_scalar(i): continue elif i not in mapper: mapper[i] = make() processed = [Eq(v, k) for k, v in mapper.items()] processed.extend([e.xreplace(mapper) for e in cluster.exprs]) return cluster.rebuild(processed)
def index_mode(self): return ['regular' if (is_integer(i) or q_affine(i, fi)) else 'irregular' for i, fi in zip(self, self.findices)]