Beispiel #1
0
        def dist(prod):
            if not isinstance(prod, Product):
                return prod

            leading = []
            for i in prod.children:
                if isinstance(i, Sum):
                    break
                else:
                    leading.append(i)

            if len(leading) == len(prod.children):
                # no more sums found
                result = pymbolic.flattened_product(prod.children)
                return result
            else:
                sum = prod.children[len(leading)]
                assert isinstance(sum, Sum)
                rest = prod.children[len(leading)+1:]
                if rest:
                    rest = dist(Product(rest))
                else:
                    rest = 1

                result = self.collect(pymbolic.flattened_sum(
                       pymbolic.flattened_product(leading) * dist(sumchild*rest)
                       for sumchild in sum.children
                       ))
                return result
Beispiel #2
0
 def map_call(self, expr, *args):
     return pymbolic.flattened_sum(
         self.function_map(i,
                           expr.function,
                           self.rec_undiff(expr.parameters, *args),
                           allowed_nonsmoothness=self.allowed_nonsmoothness)
         * self.rec(par, *args) for i, par in enumerate(expr.parameters))
Beispiel #3
0
 def map_product(self, expr, *args):
     return pymbolic.flattened_sum(
         pymbolic.flattened_product(
             [self.rec_undiff(ch, *args)
              for ch in expr.children[0:i]] + [self.rec(child, *args)] +
             [self.rec_undiff(ch, *args) for ch in expr.children[i + 1:]])
         for i, child in enumerate(expr.children))
Beispiel #4
0
 def map_product(self, expr):
     return pymbolic.flattened_sum(
         pymbolic.flattened_product(
             expr.children[0:i] +
             (self.rec(child),) +
             expr.children[i+1:])
         for i, child in enumerate(expr.children))
Beispiel #5
0
 def map_call(self, expr, *args):
     return pymbolic.flattened_sum(
         self.function_map(
             i, expr.function, self.rec_undiff(expr.parameters, *args))
         * self.rec(par, *args)
         for i, par in enumerate(expr.parameters)
         )
Beispiel #6
0
        def expand(prod):
            if not isinstance(prod, Product):
                return prod

            leading = []
            for i in prod.children:
                if isinstance(i, Sum):
                    break
                else:
                    leading.append(i)

            if len(leading) == len(prod.children):
                # no more sums found
                result = pymbolic.flattened_product(prod.children)
                return result
            else:
                sum = prod.children[len(leading)]
                assert isinstance(sum, Sum)
                rest = prod.children[len(leading)+1:]
                if rest:
                    rest = expand(Product(rest))
                else:
                    rest = 1

                result = self.collector(pymbolic.flattened_sum(
                       pymbolic.flattened_product(leading) * expand(sumchild*rest)
                       for sumchild in sum.children
                       ))
                return result
Beispiel #7
0
 def map_product(self, expr, *args):
     return pymbolic.flattened_sum(
         pymbolic.flattened_product(
             [self.rec_undiff(ch, *args) for ch in expr.children[0:i]] +
             [self.rec(child, *args)] +
             [self.rec_undiff(ch, *args) for ch in expr.children[i+1:]]
             )
         for i, child in enumerate(expr.children))
Beispiel #8
0
    def map_sum(self, mysum):
        term2coeff = {}
        for child in mysum.children:
            term, coeff = self.split_term(child)
            term2coeff[term] = term2coeff.get(term, 0) + coeff

        def rep2term(rep):
            return pymbolic.flattened_product(base ** exp for base, exp in rep)

        result = pymbolic.flattened_sum(coeff * rep2term(termrep) for termrep, coeff in term2coeff.iteritems())
        return result
Beispiel #9
0
    def map_sum(self, mysum):
        term2coeff = {}
        for child in mysum.children:
            term, coeff = self.split_term(child)
            term2coeff[term] = term2coeff.get(term, 0) + coeff

        def rep2term(rep):
            return pymbolic.flattened_product(base**exp for base, exp in rep)

        result = pymbolic.flattened_sum(
            coeff * rep2term(termrep)
            for termrep, coeff in six.iteritems(term2coeff))
        return result
Beispiel #10
0
 def map_product(self, expr):
     return pymbolic.flattened_sum(
         pymbolic.flattened_product(expr.children[0:i] +
                                    (self.rec(child), ) +
                                    expr.children[i + 1:])
         for i, child in enumerate(expr.children))
Beispiel #11
0
 def map_sum(self, expr):
     return pymbolic.flattened_sum(
         self.rec(child) for child in expr.children)
Beispiel #12
0
 def map_call(self, expr):
     return pymbolic.flattened_sum(
         self.function_map(i, expr.function, expr.parameters) *
         self.rec(par) for i, par in enumerate(expr.parameters))
Beispiel #13
0
 def map_sum(self, expr, *args):
     return pymbolic.flattened_sum(
             self.rec(child, *args) for child in expr.children)
Beispiel #14
0
 def map_call(self, expr):
     return pymbolic.flattened_sum(
         self.function_map(i, expr.function, expr.parameters)
         * self.rec(par)
         for i, par in enumerate(expr.parameters)
         )