energy.py 2.92 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
from keepers import Loggable
20

21
22

class Energy(Loggable, object):
23
24
    """ The Energy object provides the structure required for minimization schemes.

25
   The implementation of a scalar function with its gradient and curvature at some position.
26
27
28

    Parameters
    ----------
Jakob Knollmueller's avatar
Jakob Knollmueller committed
29
    position : Field, float
30
31
32
33
        The parameter of the scalar function and its first and second derivative.

    Attributes
    ----------
Jakob Knollmueller's avatar
Jakob Knollmueller committed
34
    position : Field, float
35
36
37
        The Field location in parameter space where value, gradient and curvature is evaluated.
    value : float
        The evaluation of the energy functional at given position.
38
    gradient : Field, float
39
        The gradient at given position in parameter direction.
Jakob Knollmueller's avatar
Jakob Knollmueller committed
40
    curvature : callable
41
42
        A positive semi-definite operator or function describing the curvature of the potential
        at given position.
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

    Raises
    ------
    NotImplementedError
        Raised if
            * value, gradient or curvature is called
    AttributeError
        Raised if
            * copying of the position fails

    Notes
    -----
    The Energy object gives the blueprint how to formulate the model in order to apply
    various inference schemes. The functions value, gradient and curvature have to be
    implemented according to the concrete inference problem.

    Memorizing the evaluations of some quantities minimizes the computational effort
    for multiple calls.

    """
63
64
65
66
67
68
69
70
71
    def __init__(self, position):
        self._cache = {}
        try:
            position = position.copy()
        except AttributeError:
            pass
        self.position = position

    def at(self, position):
72
73
74
75
76
77
78
79
80
81
82
83
84
        """ Initializes and returns new Energy object at new position.

        Parameters
        ----------
        position : Field
            Parameter for the new Energy object.

        Returns
        -------
        out : Energy
            Energy object at new position.

        """
85
86
        return self.__class__(position)

87
88
89
90
    @property
    def position(self):
        return self._position

91
92
93
94
95
96
97
98
99
100
101
    @property
    def value(self):
        raise NotImplementedError

    @property
    def gradient(self):
        raise NotImplementedError

    @property
    def curvature(self):
        raise NotImplementedError