line_energy.py 2.63 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

from .energy import Energy


class LineEnergy(Energy):
23
24
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
    """A Energy object restricting an underlying Energy along some descent direction.
    Given some Energy and descent direction, its position is parametrized by a scalar
    step size along the descent direction.

    Parameters
    ----------
    position : float
        The step length parameter along the given line direction.

    Attributes
    ----------
    position :  float
        The step length along the given line direction.
    value : float
        The evaluation of the energy functional at given position.
    gradient : float
        The gradient along the line direction projected on the current line position.
    curvature : callable
        A positive semi-definite operator or function describing the curvature of the potential
        at given position.
    line_direction : field
        Direction along which the movement is restricted. Does not have to be normalized.
    energy : Energy
        The underlying Energy at the resulting position along the line according to the step length.


    """
50
    def __init__(self, position, energy, line_direction, zero_point=None):
51
        super(LineEnergy, self).__init__(position=position)
52
53
54
55
56
57
58
59
        self.line_direction = line_direction

        if zero_point is None:
            zero_point = energy.position
        self._zero_point = zero_point

        position_on_line = self._zero_point + self.position*line_direction
        self.energy = energy.at(position=position_on_line)
60
61

    def at(self, position):
62
63
64
65
        return self.__class__(position,
                              self.energy,
                              self.line_direction,
                              zero_point=self._zero_point)
66
67
68
69
70
71
72
73
74
75
76
77

    @property
    def value(self):
        return self.energy.value

    @property
    def gradient(self):
        return self.energy.gradient.dot(self.line_direction)

    @property
    def curvature(self):
        return self.energy.curvature