energy.py 2.99 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
from nifty.nifty_meta import NiftyMeta

21
from keepers import Loggable
22

23
24

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

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

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

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

    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.

    """
65

Theo Steininger's avatar
Theo Steininger committed
66
    __metaclass__ = NiftyMeta
67

68
69
70
71
72
73
    def __init__(self, position):
        self._cache = {}
        try:
            position = position.copy()
        except AttributeError:
            pass
Theo Steininger's avatar
Theo Steininger committed
74
        self._position = position
75
76

    def at(self, position):
77
78
79
80
81
82
83
84
85
86
87
88
89
        """ 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.

        """
90
91
        return self.__class__(position)

92
93
94
95
    @property
    def position(self):
        return self._position

96
97
98
99
100
101
102
103
104
105
106
    @property
    def value(self):
        raise NotImplementedError

    @property
    def gradient(self):
        raise NotImplementedError

    @property
    def curvature(self):
        raise NotImplementedError