Exemplo n.º 1
0
    def _eval_derivative_matrix_lines(self, x):
        from sympy.core.expr import ExprBuilder
        from sympy.codegen.array_utils import (
            CodegenArrayContraction,
            CodegenArrayTensorProduct,
        )
        from .matmul import MatMul
        from .inverse import Inverse

        exp = self.exp
        if self.base.shape == (1, 1) and not exp.has(x):
            lr = self.base._eval_derivative_matrix_lines(x)
            for i in lr:
                subexpr = ExprBuilder(
                    CodegenArrayContraction,
                    [
                        ExprBuilder(
                            CodegenArrayTensorProduct,
                            [
                                Identity(1),
                                i._lines[0],
                                exp * self.base**(exp - 1),
                                i._lines[1],
                                Identity(1),
                            ],
                        ),
                        (0, 3, 4),
                        (5, 7, 8),
                    ],
                    validator=CodegenArrayContraction._validate,
                )
                i._first_pointer_parent = subexpr.args[0].args
                i._first_pointer_index = 0
                i._second_pointer_parent = subexpr.args[0].args
                i._second_pointer_index = 4
                i._lines = [subexpr]
            return lr
        if (exp > 0) == True:
            newexpr = MatMul.fromiter([self.base for i in range(exp)])
        elif (exp == -1) == True:
            return Inverse(self.base)._eval_derivative_matrix_lines(x)
        elif (exp < 0) == True:
            newexpr = MatMul.fromiter(
                [Inverse(self.base) for i in range(-exp)])
        elif (exp == 0) == True:
            return self.doit()._eval_derivative_matrix_lines(x)
        else:
            raise NotImplementedError("cannot evaluate %s derived by %s" %
                                      (self, x))
        return newexpr._eval_derivative_matrix_lines(x)
Exemplo n.º 2
0
Arquivo: matpow.py Projeto: cklb/sympy
 def _eval_derivative_matrix_lines(self, x):
     from .matmul import MatMul
     exp = self.exp
     if (exp > 0) == True:
         newexpr = MatMul.fromiter([self.base for i in range(exp)])
     elif (exp == -1) == True:
         return Inverse(self.base)._eval_derivative_matrix_lines(x)
     elif (exp < 0) == True:
         newexpr = MatMul.fromiter([Inverse(self.base) for i in range(-exp)])
     elif (exp == 0) == True:
         return self.doit()._eval_derivative_matrix_lines(x)
     else:
         raise NotImplementedError("cannot evaluate %s derived by %s" % (self, x))
     return newexpr._eval_derivative_matrix_lines(x)
 def _eval_derivative_matrix_lines(self, x):
     from .matmul import MatMul
     from .inverse import Inverse
     exp = self.exp
     if (exp > 0) == True:
         newexpr = MatMul.fromiter([self.base for i in range(exp)])
     elif (exp == -1) == True:
         return Inverse(self.base)._eval_derivative_matrix_lines(x)
     elif (exp < 0) == True:
         newexpr = MatMul.fromiter([Inverse(self.base) for i in range(-exp)])
     elif (exp == 0) == True:
         return self.doit()._eval_derivative_matrix_lines(x)
     else:
         raise NotImplementedError("cannot evaluate %s derived by %s" % (self, x))
     return newexpr._eval_derivative_matrix_lines(x)
Exemplo n.º 4
0
 def _eval_derivative_matrix_lines(self, x):
     from sympy.core.expr import ExprBuilder
     from sympy.codegen.array_utils import CodegenArrayContraction, CodegenArrayTensorProduct
     from .matmul import MatMul
     from .inverse import Inverse
     exp = self.exp
     if self.base.shape == (1, 1) and not exp.has(x):
         lr = self.base._eval_derivative_matrix_lines(x)
         for i in lr:
             subexpr = ExprBuilder(
                 CodegenArrayContraction,
                 [
                     ExprBuilder(
                         CodegenArrayTensorProduct,
                         [
                             Identity(1),
                             i._lines[0],
                             exp*self.base**(exp-1),
                             i._lines[1],
                             Identity(1),
                         ]
                     ),
                     (0, 3, 4), (5, 7, 8)
                 ],
                 validator=CodegenArrayContraction._validate
             )
             i._first_pointer_parent = subexpr.args[0].args
             i._first_pointer_index = 0
             i._second_pointer_parent = subexpr.args[0].args
             i._second_pointer_index = 4
             i._lines = [subexpr]
         return lr
     if (exp > 0) == True:
         newexpr = MatMul.fromiter([self.base for i in range(exp)])
     elif (exp == -1) == True:
         return Inverse(self.base)._eval_derivative_matrix_lines(x)
     elif (exp < 0) == True:
         newexpr = MatMul.fromiter([Inverse(self.base) for i in range(-exp)])
     elif (exp == 0) == True:
         return self.doit()._eval_derivative_matrix_lines(x)
     else:
         raise NotImplementedError("cannot evaluate %s derived by %s" % (self, x))
     return newexpr._eval_derivative_matrix_lines(x)