예제 #1
0
    def __new__(cls, *args):
        args = [_sympify(arg) for arg in args]
        args = cls._flatten(args)
        ranks = [get_rank(arg) for arg in args]

        if len(args) == 1:
            return args[0]

        # If there are contraction objects inside, transform the whole
        # expression into `CodegenArrayContraction`:
        contractions = {i: arg for i, arg in enumerate(args) if isinstance(arg, CodegenArrayContraction)}
        if contractions:
            cumulative_ranks = list(accumulate([0] + ranks))[:-1]
            tp = cls(*[arg.expr if isinstance(arg, CodegenArrayContraction) else arg for arg in args])
            contraction_indices = [tuple(cumulative_ranks[i] + k for k in j) for i, arg in contractions.items() for j in arg.contraction_indices]
            return CodegenArrayContraction(tp, *contraction_indices)

        #newargs = [i for i in args if hasattr(i, "shape")]
        #coeff = reduce(lambda x, y: x*y, [i for i in args if not hasattr(i, "shape")], S.One)
        #newargs[0] *= coeff

        obj = Basic.__new__(cls, *args)
        obj._subranks = ranks
        shapes = [get_shape(i) for i in args]

        if any(i is None for i in shapes):
            obj._shape = None
        else:
            obj._shape = tuple(j for i in shapes for j in i)
        return obj
예제 #2
0
 def _contraction_tuples_to_contraction_indices(expr, contraction_tuples):
     # TODO: check that `expr` has `.subranks`:
     ranks = expr.subranks
     cumulative_ranks = [0] + list(accumulate(ranks))
     return [
         tuple(cumulative_ranks[j] + k for j, k in i)
         for i in contraction_tuples
     ]
예제 #3
0
파일: array_utils.py 프로젝트: cklb/sympy
 def _contraction_tuples_to_contraction_indices(expr, contraction_tuples):
     # TODO: check that `expr` has `.subranks`:
     ranks = expr.subranks
     cumulative_ranks = [0] + list(accumulate(ranks))
     return [tuple(cumulative_ranks[j]+k for j, k in i) for i in contraction_tuples]