factorizations.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from sympy.matrices.expressions import MatrixExpr
  2. from sympy.assumptions.ask import Q
  3. class Factorization(MatrixExpr):
  4. arg = property(lambda self: self.args[0])
  5. shape = property(lambda self: self.arg.shape) # type: ignore
  6. class LofLU(Factorization):
  7. @property
  8. def predicates(self):
  9. return (Q.lower_triangular,)
  10. class UofLU(Factorization):
  11. @property
  12. def predicates(self):
  13. return (Q.upper_triangular,)
  14. class LofCholesky(LofLU): pass
  15. class UofCholesky(UofLU): pass
  16. class QofQR(Factorization):
  17. @property
  18. def predicates(self):
  19. return (Q.orthogonal,)
  20. class RofQR(Factorization):
  21. @property
  22. def predicates(self):
  23. return (Q.upper_triangular,)
  24. class EigenVectors(Factorization):
  25. @property
  26. def predicates(self):
  27. return (Q.orthogonal,)
  28. class EigenValues(Factorization):
  29. @property
  30. def predicates(self):
  31. return (Q.diagonal,)
  32. class UofSVD(Factorization):
  33. @property
  34. def predicates(self):
  35. return (Q.orthogonal,)
  36. class SofSVD(Factorization):
  37. @property
  38. def predicates(self):
  39. return (Q.diagonal,)
  40. class VofSVD(Factorization):
  41. @property
  42. def predicates(self):
  43. return (Q.orthogonal,)
  44. def lu(expr):
  45. return LofLU(expr), UofLU(expr)
  46. def qr(expr):
  47. return QofQR(expr), RofQR(expr)
  48. def eig(expr):
  49. return EigenValues(expr), EigenVectors(expr)
  50. def svd(expr):
  51. return UofSVD(expr), SofSVD(expr), VofSVD(expr)