diff --git a/demos/paper_demos/cartesian_wiener_filter.py b/demos/paper_demos/cartesian_wiener_filter.py index eeab6ab5cf5af74bbc9146fbcee4d5d5087a1283..69cc161a7871b604b7717cac639ea45ab47dd8ac 100644 --- a/demos/paper_demos/cartesian_wiener_filter.py +++ b/demos/paper_demos/cartesian_wiener_filter.py @@ -90,7 +90,7 @@ if __name__ == "__main__": # Wiener filter j = R_harmonic.adjoint_times(N.inverse_times(data)) - ctrl = ift.DefaultIterationController(verbose=True, tol_custom=1e-3, convergence_level=3) + ctrl = ift.DefaultIterationController(verbose=True, iteration_limit=100) inverter = ift.ConjugateGradient(controller=ctrl) wiener_curvature = ift.library.WienerFilterCurvature(S=S, N=N, R=R_harmonic, inverter=inverter) diff --git a/nifty/energies/line_energy.py b/nifty/energies/line_energy.py index f0e67deefcfe8d908c3c9b8cb0f90caa40110a72..7215072bc65df08129076c6f74c87b473f436ac5 100644 --- a/nifty/energies/line_energy.py +++ b/nifty/energies/line_energy.py @@ -95,10 +95,8 @@ class LineEnergy(object): """ - return self.__class__(line_position, - self.energy, - self.line_direction, - offset=self.line_position) + return LineEnergy(line_position, self.energy, self.line_direction, + offset=self.line_position) @property def value(self): diff --git a/nifty/energies/quadratic_energy.py b/nifty/energies/quadratic_energy.py index 2f97da569c33b6132945e3554fdb4781024f47d6..7194c66be2a7a63dd6a0622be361fd3661c89b46 100644 --- a/nifty/energies/quadratic_energy.py +++ b/nifty/energies/quadratic_energy.py @@ -8,23 +8,21 @@ class QuadraticEnergy(Energy): position-independent. """ - def __init__(self, position, A, b, _grad=None, _bnorm=None): + def __init__(self, position, A, b, _grad=None): super(QuadraticEnergy, self).__init__(position=position) self._A = A self._b = b - self._bnorm = _bnorm if _grad is not None: self._Ax = _grad + self._b else: self._Ax = self._A(self.position) def at(self, position): - return self.__class__(position=position, A=self._A, b=self._b, - _bnorm=self.norm_b) + return QuadraticEnergy(position=position, A=self._A, b=self._b) def at_with_grad(self, position, grad): - return self.__class__(position=position, A=self._A, b=self._b, - _grad=grad, _bnorm=self.norm_b) + return QuadraticEnergy(position=position, A=self._A, b=self._b, + _grad=grad) @property @memo @@ -39,9 +37,3 @@ class QuadraticEnergy(Energy): @property def curvature(self): return self._A - - @property - def norm_b(self): - if self._bnorm is None: - self._bnorm = self._b.norm() - return self._bnorm diff --git a/nifty/minimization/conjugate_gradient.py b/nifty/minimization/conjugate_gradient.py index 98ab46ecb1dffbd73dffefe3e4b6f03e6096ead6..ed458d94fc61d309bf3592fd2839499dec9a5893 100644 --- a/nifty/minimization/conjugate_gradient.py +++ b/nifty/minimization/conjugate_gradient.py @@ -73,7 +73,6 @@ class ConjugateGradient(Minimizer): if status != controller.CONTINUE: return energy, status - norm_b = energy.norm_b r = energy.gradient if preconditioner is not None: d = preconditioner(r) @@ -111,9 +110,7 @@ class ConjugateGradient(Minimizer): if gamma == 0: return energy, controller.CONVERGED - status = self._controller.check(energy, - custom_measure=np.sqrt(gamma) / - norm_b) + status = self._controller.check(energy) if status != controller.CONTINUE: return energy, status diff --git a/nifty/minimization/default_iteration_controller.py b/nifty/minimization/default_iteration_controller.py index cd596e3e40e916ec9eb585506f4f81ecbbe273a6..fa5353dc6ceec9ff71af05d17745582611abb91c 100644 --- a/nifty/minimization/default_iteration_controller.py +++ b/nifty/minimization/default_iteration_controller.py @@ -22,26 +22,25 @@ from .iteration_controller import IterationController class DefaultIterationController(IterationController): def __init__(self, tol_abs_gradnorm=None, tol_rel_gradnorm=None, - tol_custom=None, convergence_level=1, iteration_limit=None, + convergence_level=1, iteration_limit=None, name=None, verbose=None): super(DefaultIterationController, self).__init__() self._tol_abs_gradnorm = tol_abs_gradnorm self._tol_rel_gradnorm = tol_rel_gradnorm - self._tol_custom = tol_custom self._convergence_level = convergence_level self._iteration_limit = iteration_limit self._name = name self._verbose = verbose - def start(self, energy, custom_measure=None): + def start(self, energy): self._itcount = -1 self._ccount = 0 if self._tol_rel_gradnorm is not None: self._tol_rel_gradnorm_now = self._tol_rel_gradnorm \ * energy.gradient_norm - return self.check(energy, custom_measure) + return self.check(energy) - def check(self, energy, custom_measure=None): + def check(self, energy): self._itcount += 1 inclvl = False @@ -51,9 +50,6 @@ class DefaultIterationController(IterationController): if self._tol_rel_gradnorm is not None: if energy.gradient_norm <= self._tol_rel_gradnorm_now: inclvl = True - if self._tol_custom is not None and custom_measure is not None: - if custom_measure <= self._tol_custom: - inclvl = True if inclvl: self._ccount += 1 else: @@ -67,8 +63,6 @@ class DefaultIterationController(IterationController): msg += " Iteration #" + str(self._itcount) msg += " energy=" + str(energy.value) msg += " gradnorm=" + str(energy.gradient_norm) - if custom_measure is not None: - msg += " custom=" + str(custom_measure) msg += " clvl=" + str(self._ccount) print(msg) # self.logger.info(msg)