Commit 43cc5bfd authored by Martin Reinecke's avatar Martin Reinecke
Browse files

Merge branch 'imag_operator' into 'NIFTy_6'

Imag operator

See merge request !481
parents 2990b099 9953fdbd
Pipeline #75294 passed with stages
in 8 minutes and 40 seconds
...@@ -44,7 +44,7 @@ from .operators.block_diagonal_operator import BlockDiagonalOperator ...@@ -44,7 +44,7 @@ from .operators.block_diagonal_operator import BlockDiagonalOperator
from .operators.outer_product_operator import OuterProduct from .operators.outer_product_operator import OuterProduct
from .operators.simple_linear_operators import ( from .operators.simple_linear_operators import (
VdotOperator, ConjugationOperator, Realizer, FieldAdapter, ducktape, VdotOperator, ConjugationOperator, Realizer, FieldAdapter, ducktape,
GeometryRemover, NullOperator, PartialExtractor) GeometryRemover, NullOperator, PartialExtractor, Imaginizer)
from .operators.matrix_product_operator import MatrixProductOperator from .operators.matrix_product_operator import MatrixProductOperator
from .operators.value_inserter import ValueInserter from .operators.value_inserter import ValueInserter
from .operators.energy_operators import ( from .operators.energy_operators import (
......
...@@ -709,6 +709,7 @@ class Field(Operator): ...@@ -709,6 +709,7 @@ class Field(Operator):
tmp = ptw_dict[op][1](self._val, *argstmp, **kwargstmp) tmp = ptw_dict[op][1](self._val, *argstmp, **kwargstmp)
return (Field(self._domain, tmp[0]), Field(self._domain, tmp[1])) return (Field(self._domain, tmp[0]), Field(self._domain, tmp[1]))
for op in ["__add__", "__radd__", for op in ["__add__", "__radd__",
"__sub__", "__rsub__", "__sub__", "__rsub__",
"__mul__", "__rmul__", "__mul__", "__rmul__",
......
...@@ -133,6 +133,10 @@ class Linearization(Operator): ...@@ -133,6 +133,10 @@ class Linearization(Operator):
def real(self): def real(self):
return self.new(self._val.real, self._jac.real) return self.new(self._val.real, self._jac.real)
@property
def imag(self):
return self.new(self._val.imag, self._jac.imag)
def _myadd(self, other, neg): def _myadd(self, other, neg):
if np.isscalar(other) or other.jac is None: if np.isscalar(other) or other.jac is None:
return self.new(self._val-other if neg else self._val+other, return self.new(self._val-other if neg else self._val+other,
......
...@@ -168,7 +168,6 @@ class LinearOperator(Operator): ...@@ -168,7 +168,6 @@ class LinearOperator(Operator):
def __call__(self, x): def __call__(self, x):
"""Same as :meth:`times`""" """Same as :meth:`times`"""
from ..linearization import Linearization
if x.jac is not None: if x.jac is not None:
return x.new(self(x._val), self).prepend_jac(x.jac) return x.new(self(x._val), self).prepend_jac(x.jac)
if x.val is not None: if x.val is not None:
......
...@@ -149,6 +149,11 @@ class Operator(metaclass=NiftyMeta): ...@@ -149,6 +149,11 @@ class Operator(metaclass=NiftyMeta):
from .simple_linear_operators import Realizer from .simple_linear_operators import Realizer
return Realizer(self.target)(self) return Realizer(self.target)(self)
@property
def imag(self):
from .simple_linear_operators import Imaginizer
return Imaginizer(self.target)(self)
def __neg__(self): def __neg__(self):
return self.scale(-1) return self.scale(-1)
......
...@@ -112,6 +112,26 @@ class Realizer(EndomorphicOperator): ...@@ -112,6 +112,26 @@ class Realizer(EndomorphicOperator):
return x.real return x.real
class Imaginizer(EndomorphicOperator):
"""Operator returning the imaginary component of its input.
Parameters
----------
domain: Domain, tuple of domains or DomainTuple
domain of the input field
"""
def __init__(self, domain):
self._domain = DomainTuple.make(domain)
self._capability = self.TIMES | self.ADJOINT_TIMES
def apply(self, x, mode):
self._check_input(x, mode)
if mode == self.TIMES:
return x.imag
return 1j*x
class FieldAdapter(LinearOperator): class FieldAdapter(LinearOperator):
"""Operator for conversion between Fields and MultiFields. """Operator for conversion between Fields and MultiFields.
......
...@@ -82,6 +82,13 @@ def testRealizer(sp): ...@@ -82,6 +82,13 @@ def testRealizer(sp):
only_r_linear=True) only_r_linear=True)
@pmp('sp', _h_spaces + _p_spaces + _pow_spaces)
def testImaginizer(sp):
op = ift.Imaginizer(sp)
ift.extra.consistency_check(op, np.complex128, np.float64,
only_r_linear=True)
@pmp('sp', _h_spaces + _p_spaces + _pow_spaces) @pmp('sp', _h_spaces + _p_spaces + _pow_spaces)
def testConjugationOperator(sp): def testConjugationOperator(sp):
op = ift.ConjugationOperator(sp) op = ift.ConjugationOperator(sp)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment