Martin Reinecke committed Jan 17, 2018 1 2 3 4 5 6 7 8 9 10 11 12 13 ``````# 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 . # `````` Martin Reinecke committed Feb 17, 2018 14 ``````# Copyright(C) 2013-2018 Max-Planck-Society `````` Martin Reinecke committed Jan 17, 2018 15 16 17 18 ``````# # NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik # and financially supported by the Studienstiftung des deutschen Volkes. `````` Martin Reinecke committed Aug 23, 2017 19 ``````from .energy import Energy `````` Martin Reinecke committed Aug 19, 2017 20 21 22 23 `````` class QuadraticEnergy(Energy): """The Energy for a quadratic form. `````` Martin Reinecke committed Aug 19, 2017 24 25 `````` The most important aspect of this energy is that its curvature must be position-independent. `````` Martin Reinecke committed Aug 19, 2017 26 27 `````` """ `````` Martin Reinecke committed Sep 29, 2017 28 `````` def __init__(self, position, A, b, _grad=None): `````` Martin Reinecke committed Aug 19, 2017 29 30 31 `````` super(QuadraticEnergy, self).__init__(position=position) self._A = A self._b = b `````` Martin Reinecke committed Sep 07, 2017 32 `````` if _grad is not None: `````` Martin Reinecke committed Dec 03, 2017 33 34 `````` self._grad = _grad Ax = _grad + self._b `````` Martin Reinecke committed Aug 20, 2017 35 `````` else: `````` Martin Reinecke committed Dec 03, 2017 36 37 `````` Ax = self._A(self.position) self._grad = Ax - self._b `````` Martin Reinecke committed Feb 18, 2018 38 `````` self._grad.lock() `````` Martin Reinecke committed Dec 03, 2017 39 `````` self._value = 0.5*self.position.vdot(Ax) - b.vdot(self.position) `````` Martin Reinecke committed Aug 19, 2017 40 41 `````` def at(self, position): `````` Martin Reinecke committed Sep 29, 2017 42 `````` return QuadraticEnergy(position=position, A=self._A, b=self._b) `````` Martin Reinecke committed Aug 19, 2017 43 `````` `````` Martin Reinecke committed Aug 20, 2017 44 `````` def at_with_grad(self, position, grad): `````` Martin Reinecke committed Feb 18, 2018 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 `````` """ Specialized version of `at`, taking also a gradient. This custom method is meant for use within :class:ConjugateGradient` minimizers, which already have the gradient available. It saves time by not recomputing it. Parameters ---------- position : Field Location in parameter space for the new Energy object. grad : Field Energy gradient at the new position. Returns ------- Energy Energy object at new position. """ `````` Martin Reinecke committed Sep 29, 2017 63 64 `````` return QuadraticEnergy(position=position, A=self._A, b=self._b, _grad=grad) `````` Martin Reinecke committed Aug 20, 2017 65 `````` `````` Martin Reinecke committed Aug 19, 2017 66 67 `````` @property def value(self): `````` Martin Reinecke committed Dec 03, 2017 68 `````` return self._value `````` Martin Reinecke committed Aug 19, 2017 69 70 71 `````` @property def gradient(self): `````` Martin Reinecke committed Dec 03, 2017 72 `````` return self._grad `````` Martin Reinecke committed Aug 19, 2017 73 74 75 76 `````` @property def curvature(self): return self._A``````