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 38 `````` Ax = self._A(self.position) self._grad = Ax - self._b self._value = 0.5*self.position.vdot(Ax) - b.vdot(self.position) `````` Martin Reinecke committed Aug 19, 2017 39 40 `````` def at(self, position): `````` Martin Reinecke committed Sep 29, 2017 41 `````` return QuadraticEnergy(position=position, A=self._A, b=self._b) `````` Martin Reinecke committed Aug 19, 2017 42 `````` `````` Martin Reinecke committed Aug 20, 2017 43 `````` def at_with_grad(self, position, grad): `````` Martin Reinecke committed Sep 29, 2017 44 45 `````` return QuadraticEnergy(position=position, A=self._A, b=self._b, _grad=grad) `````` Martin Reinecke committed Aug 20, 2017 46 `````` `````` Martin Reinecke committed Aug 19, 2017 47 48 `````` @property def value(self): `````` Martin Reinecke committed Dec 03, 2017 49 `````` return self._value `````` Martin Reinecke committed Aug 19, 2017 50 51 52 `````` @property def gradient(self): `````` Martin Reinecke committed Dec 03, 2017 53 `````` return self._grad `````` Martin Reinecke committed Aug 19, 2017 54 55 56 57 `````` @property def curvature(self): return self._A``````