Skip to content

Commit

Permalink
ENH: add inverse where missing to some operators, closes #164
Browse files Browse the repository at this point in the history
  • Loading branch information
adler-j committed May 11, 2016
1 parent 4c45462 commit 81d9a28
Showing 1 changed file with 33 additions and 9 deletions.
42 changes: 33 additions & 9 deletions odl/operator/operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1346,7 +1346,8 @@ def inverse(self):
"""
if self._scalar == 0.0:
raise ZeroDivisionError('{} not invertible.'.format(self))
return OperatorLeftScalarMult(self._op.inverse, 1.0 / self._scalar)

return self._op.inverse * (1.0 / self._scalar)

def derivative(self, x):
"""Return the derivative at ``x``.
Expand All @@ -1365,7 +1366,7 @@ def derivative(self, x):
--------
OperatorLeftScalarMult : the result
"""
return OperatorLeftScalarMult(self._op.derivative(x), self._scalar)
return self._scalar * self._op.derivative(x)

@property
def adjoint(self):
Expand All @@ -1386,8 +1387,7 @@ def adjoint(self):
if not self.is_linear:
raise OpNotImplementedError('Nonlinear operators have no adjoint')

return OperatorRightScalarMult(self._op.adjoint,
self._scalar.conjugate())
return self._scalar.conjugate() * self._op.adjoint

def __repr__(self):
"""Return ``repr(self)``."""
Expand Down Expand Up @@ -1465,7 +1465,7 @@ def inverse(self):
if self._scalar == 0.0:
raise ZeroDivisionError('{} not invertible.'.format(self))

return OperatorLeftScalarMult(self._op.inverse, 1.0 / self._scalar)
return (1.0 / self._scalar) * self._op.inverse

def derivative(self, x):
"""Return the derivative at ``x``.
Expand All @@ -1481,8 +1481,7 @@ def derivative(self, x):
x : `Operator.domain` `element-like`
Evaluation point of the derivative
"""
return OperatorLeftScalarMult(self._op.derivative(self._scalar * x),
self._scalar)
return self._scalar * self._op.derivative(self._scalar * x)

@property
def adjoint(self):
Expand All @@ -1503,8 +1502,7 @@ def adjoint(self):
if not self.is_linear:
raise OpNotImplementedError('Nonlinear operators have no adjoint')

return OperatorRightScalarMult(self._op.adjoint,
self._scalar.conjugate())
return self._op.adjoint * self._scalar.conjugate()

def __repr__(self):
"""Return ``repr(self)``."""
Expand Down Expand Up @@ -1642,6 +1640,19 @@ def _call(self, x, out=None):
self._op(x, out=out)
out *= self._vector

@property
def inverse(self):
"""The inverse operator.
The inverse of ``vector * op`` is given by
``op.inverse / vector``.
``OperatorLeftVectorMult(op, vector).inverse <==>``
``OperatorRightVectorMult(op.inverse, 1.0/vector)``
"""

return self._op.inverse * (1.0 / self._vector)

def derivative(self, x):
"""Return the derivative at ``x``.
Expand Down Expand Up @@ -1726,6 +1737,19 @@ def _call(self, x, out=None):
tmp.multiply(self._vector, x)
self._op(tmp, out=out)

@property
def inverse(self):
"""The inverse operator.
The inverse of ``op * vector`` is given by
``(1.0 / vector) * op.inverse``.
``OperatorRightVectorMult(op, vector).inverse <==>``
``OperatorLeftVectorMult(op.inverse, 1.0/vector)``
"""

return (1.0 / self._vector) * self._op.inverse

def derivative(self, x):
"""Return the derivative at ``x``.
Expand Down

0 comments on commit 81d9a28

Please sign in to comment.