invertible_operator_mixin.py 3.64 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# NIFTy
# Copyright (C) 2017  Theo Steininger
#
# Author: Theo Steininger
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
20
21
22
23
24

from nifty.minimization import ConjugateGradient

from nifty.field import Field


class InvertibleOperatorMixin(object):
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

    """NIFTY to invert implicit defined operators.
    To invert the application of a given implicitly defined operator on a field,
    this class gives the necessary functionality. Inheriting functionality from
    this class provides you with the inverse to the given implicitly definied
    application of the operator on a field. (e.g. .inverse_times vs. .times
    and .adjoint_times vs. .adjoint_inverse_times)

    Parameters
    ----------
    inverter : Minimization object
        Defines the object how to minimize the functional
        (default: ConjugateGradient)

    preconditioner : LinearOperator
        Preconditions the minimizaion problem
        (further details see any good text book about conjugate gradient)

    Attributes
    ----------

    Raises
    ------

    Notes
    -----

    Examples
    --------
    most promiment see PropagatorOperator class

    See Also
    --------
    EndomorphicOperator, ProjectionOperator,
    DiagonalOperator, SmoothingOperator, ResponseOperator,
    PropagatorOperator, ComposedOperator

    """

64
    def __init__(self, inverter=None, preconditioner=None, *args, **kwargs):
65
66
67
68
69
        self.__preconditioner = preconditioner
        if inverter is not None:
            self.__inverter = inverter
        else:
            self.__inverter = ConjugateGradient(
70
                                        preconditioner=self.__preconditioner)
71

72
    def _times(self, x, spaces, x0=None):
73
74
75
        if x0 is None:
            x0 = Field(self.target, val=0., dtype=x.dtype)

76
77
78
        (result, convergence) = self.__inverter(A=self.inverse_times,
                                                b=x,
                                                x0=x0)
79
80
        return result

81
    def _adjoint_times(self, x, spaces, x0=None):
82
83
84
        if x0 is None:
            x0 = Field(self.domain, val=0., dtype=x.dtype)

85
86
87
        (result, convergence) = self.__inverter(A=self.adjoint_inverse_times,
                                                b=x,
                                                x0=x0)
88
89
        return result

90
    def _inverse_times(self, x, spaces, x0=None):
91
92
93
        if x0 is None:
            x0 = Field(self.domain, val=0., dtype=x.dtype)

94
95
96
        (result, convergence) = self.__inverter(A=self.times,
                                                b=x,
                                                x0=x0)
97
98
        return result

99
    def _adjoint_inverse_times(self, x, spaces, x0=None):
100
101
102
        if x0 is None:
            x0 = Field(self.target, val=0., dtype=x.dtype)

103
104
105
        (result, convergence) = self.__inverter(A=self.adjoint_times,
                                                b=x,
                                                x0=x0)
106
107
        return result

108
    def _inverse_adjoint_times(self, x, spaces):
109
110
        raise NotImplementedError(
            "no generic instance method 'inverse_adjoint_times'.")