Skip to content

Commit

Permalink
Merge pull request #1412 from mrocklin/transpose-decentralize
Browse files Browse the repository at this point in the history
Distributed transpose logic
  • Loading branch information
mrocklin committed Aug 2, 2012
2 parents bff3595 + f802721 commit 9625918
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 45 deletions.
6 changes: 3 additions & 3 deletions sympy/matrices/expressions/blockmatrix.py
Expand Up @@ -85,7 +85,7 @@ def _blockadd(self, other):


return MatrixExpr.__add__(self, other) return MatrixExpr.__add__(self, other)


def eval_transpose(self): def _eval_transpose(self):
# Flip all the individual matrices # Flip all the individual matrices
matrices = [Transpose(matrix) for matrix in self.mat.mat] matrices = [Transpose(matrix) for matrix in self.mat.mat]
# Make a copy # Make a copy
Expand All @@ -97,7 +97,7 @@ def eval_transpose(self):
#def transpose(self): #def transpose(self):
# return self.eval_transpose() # return self.eval_transpose()


def eval_inverse(self, expand=False): def _eval_inverse(self, expand=False):
# Inverse of one by one block matrix is easy # Inverse of one by one block matrix is easy
if self.blockshape==(1,1): if self.blockshape==(1,1):
mat = Matrix(1, 1, (Inverse(self.blocks[0]), )) mat = Matrix(1, 1, (Inverse(self.blocks[0]), ))
Expand Down Expand Up @@ -184,7 +184,7 @@ def __new__(cls, *mats):
def diag(self): def diag(self):
return self.args[2] return self.args[2]


def eval_inverse(self): def _eval_inverse(self):
return BlockDiagMatrix(*[Inverse(mat) for mat in self.diag]) return BlockDiagMatrix(*[Inverse(mat) for mat in self.diag])


def _blockmul(self, other): def _blockmul(self, other):
Expand Down
28 changes: 6 additions & 22 deletions sympy/matrices/expressions/inverse.py
Expand Up @@ -26,30 +26,13 @@ def __new__(cls, mat, **kwargs):
if not mat.is_Matrix: if not mat.is_Matrix:
return mat**(-1) return mat**(-1)


try:
return mat.eval_inverse(**kwargs)
except (AttributeError, NotImplementedError):
pass

if hasattr(mat, 'inv'):
return mat.inv()

if mat.is_Inverse:
return mat.arg

if mat.is_Identity:
return mat

if not mat.is_square: if not mat.is_square:
raise ShapeError("Inverse of non-square matrix %s"%mat) raise ShapeError("Inverse of non-square matrix %s"%mat)


if mat.is_Mul: try:
try: return mat._eval_inverse(**kwargs)
return MatMul(*[Inverse(arg) for arg in mat.args[::-1]]) except (AttributeError, NotImplementedError):
except ShapeError: return MatPow.__new__(cls, mat, -1)
pass

return MatPow.__new__(cls, mat, -1)


@property @property
def arg(self): def arg(self):
Expand All @@ -59,4 +42,5 @@ def arg(self):
def shape(self): def shape(self):
return self.arg.shape return self.arg.shape


from matmul import MatMul def _eval_inverse(self):
return self.arg
4 changes: 4 additions & 0 deletions sympy/matrices/expressions/matadd.py
Expand Up @@ -55,4 +55,8 @@ def shape(self):
def _entry(self, i, j): def _entry(self, i, j):
return Add(*[arg._entry(i,j) for arg in self.args]) return Add(*[arg._entry(i,j) for arg in self.args])


def _eval_transpose(self):
from transpose import Transpose
return MatAdd(*[Transpose(arg) for arg in self.args])

from matmul import MatMul from matmul import MatMul
12 changes: 8 additions & 4 deletions sympy/matrices/expressions/matexpr.py
Expand Up @@ -100,10 +100,10 @@ def cols(self):
def is_square(self): def is_square(self):
return self.rows == self.cols return self.rows == self.cols


def eval_transpose(self): def _eval_transpose(self):
raise NotImplementedError() raise NotImplementedError()


def eval_inverse(self): def _eval_inverse(self):
raise NotImplementedError() raise NotImplementedError()


@property @property
Expand Down Expand Up @@ -260,7 +260,10 @@ class Identity(MatrixSymbol):
def __new__(cls, n): def __new__(cls, n):
return MatrixSymbol.__new__(cls, "I", n, n) return MatrixSymbol.__new__(cls, "I", n, n)


def transpose(self): def _eval_transpose(self):
return self

def _eval_inverse(self):
return self return self


def _entry(self, i, j): def _entry(self, i, j):
Expand All @@ -282,7 +285,8 @@ class ZeroMatrix(MatrixSymbol):
is_ZeroMatrix = True is_ZeroMatrix = True
def __new__(cls, n, m): def __new__(cls, n, m):
return MatrixSymbol.__new__(cls, "0", n, m) return MatrixSymbol.__new__(cls, "0", n, m)
def transpose(self):
def _eval_transpose(self):
return ZeroMatrix(self.cols, self.rows) return ZeroMatrix(self.cols, self.rows)


def _entry(self, i, j): def _entry(self, i, j):
Expand Down
13 changes: 12 additions & 1 deletion sympy/matrices/expressions/matmul.py
Expand Up @@ -84,5 +84,16 @@ def as_coeff_mmul(self):


return coeff, MatMul(*matrices) return coeff, MatMul(*matrices)


def _eval_transpose(self):
from transpose import Transpose
return MatMul(*[Transpose(arg) for arg in self.args[::-1]])

def _eval_inverse(self):
from inverse import Inverse
try:
return MatMul(*[Inverse(arg) for arg in self.args[::-1]])
except ShapeError:
raise NotImplementedError("Can not decompose this Inverse")


from matadd import MatAdd from matadd import MatAdd
from inverse import Inverse
21 changes: 6 additions & 15 deletions sympy/matrices/expressions/transpose.py
Expand Up @@ -24,19 +24,10 @@ def __new__(cls, mat):
if not mat.is_Matrix: if not mat.is_Matrix:
return mat return mat


if isinstance(mat, Transpose): try:
return mat.arg return mat._eval_transpose()

except (AttributeError, NotImplementedError):
if hasattr(mat, 'transpose'): return Basic.__new__(cls, mat)
return mat.transpose()

if mat.is_Mul:
return MatMul(*[Transpose(arg) for arg in mat.args[::-1]])

if mat.is_Add:
return MatAdd(*[Transpose(arg) for arg in mat.args])

return Basic.__new__(cls, mat)


@property @property
def arg(self): def arg(self):
Expand All @@ -49,5 +40,5 @@ def shape(self):
def _entry(self, i, j): def _entry(self, i, j):
return self.arg._entry(j, i) return self.arg._entry(j, i)


from matmul import MatMul def _eval_transpose(self):
from matadd import MatAdd return self.arg
1 change: 1 addition & 0 deletions sympy/matrices/immutable_matrix.py
Expand Up @@ -38,3 +38,4 @@ def __setitem__(self, *args):


equals = MatrixBase.equals equals = MatrixBase.equals
is_Identity = MatrixBase.is_Identity is_Identity = MatrixBase.is_Identity
_eval_transpose = MatrixBase._eval_transpose
5 changes: 5 additions & 0 deletions sympy/matrices/matrices.py
Expand Up @@ -174,6 +174,9 @@ def _handle_creation_inputs(cls, *args, **kwargs):


return rows, cols, mat return rows, cols, mat


def _eval_transpose(self):
return self.transpose()

def transpose(self): def transpose(self):
""" """
Matrix transposition. Matrix transposition.
Expand Down Expand Up @@ -816,6 +819,8 @@ def inv(self, method="GE", iszerofunc=_iszero, try_block_diag=False):
# if a new method is added. # if a new method is added.
raise ValueError("Inversion method unrecognized") raise ValueError("Inversion method unrecognized")


def _eval_inverse(self):
return self.inv()


def __mathml__(self): def __mathml__(self):
mml = "" mml = ""
Expand Down

0 comments on commit 9625918

Please sign in to comment.