Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)
Esempio n. 8
0
File: basic.py Progetto: nw0/devito
 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)]