From 81d9a28a4f56bbf55238e8da1613f4234c6e9085 Mon Sep 17 00:00:00 2001 From: Jonas Adler Date: Wed, 11 May 2016 10:19:56 +0200 Subject: [PATCH] ENH: add inverse where missing to some operators, closes #164 --- odl/operator/operator.py | 42 +++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/odl/operator/operator.py b/odl/operator/operator.py index f12a5c0a0c5..d89fe5380a5 100644 --- a/odl/operator/operator.py +++ b/odl/operator/operator.py @@ -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``. @@ -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): @@ -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)``.""" @@ -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``. @@ -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): @@ -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)``.""" @@ -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``. @@ -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``.