From d27bca16e0c3d6a6fba795d91f7084caeffd0f05 Mon Sep 17 00:00:00 2001 From: Martin Reinecke <martin@mpa-garching.mpg.de> Date: Fri, 14 Jul 2017 16:03:27 +0200 Subject: [PATCH] new stopping criterion --- demos/critical_filtering.py | 29 ++++++++++--------- nifty/energies/line_energy.py | 5 ++-- nifty/minimization/descent_minimizer.py | 5 +++- .../test_descent_minimizers.py | 3 +- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/demos/critical_filtering.py b/demos/critical_filtering.py index 5674ec834..11356f172 100644 --- a/demos/critical_filtering.py +++ b/demos/critical_filtering.py @@ -76,8 +76,8 @@ if __name__ == "__main__": # Choosing the measurement instrument - Instrument = SmoothingOperator(s_space, sigma=0.01) - # Instrument = DiagonalOperator(s_space, diagonal=1.) + # Instrument = SmoothingOperator(s_space, sigma=0.01) + Instrument = DiagonalOperator(s_space, diagonal=1.) # Instrument._diagonal.val[200:400, 200:400] = 0 #Instrument._diagonal.val[64:512-64, 64:512-64] = 0 @@ -100,8 +100,8 @@ if __name__ == "__main__": realized_power = log(sh.power_analyze(binbounds=p_space.binbounds)) data_power = log(fft(d).power_analyze(binbounds=p_space.binbounds)) d_data = d.val.get_full_data().real - #if rank == 0: - # pl.plot([go.Heatmap(z=d_data)], filename='data.html') + if rank == 0: + pl.plot([go.Heatmap(z=d_data)], filename='data.html') # minimization strategy @@ -110,17 +110,18 @@ if __name__ == "__main__": print (x, iteration) - minimizer1 = RelaxedNewton(convergence_tolerance=1e-2, - convergence_level=2, + minimizer1 = RelaxedNewton(convergence_tolerance=1e-8, + convergence_level=1, iteration_limit=5, callback=convergence_measure) - minimizer2 = VL_BFGS(convergence_tolerance=1e-3, - iteration_limit=20, + minimizer2 = VL_BFGS(convergence_tolerance=1e-8, + convergence_level=1, + iteration_limit=1000, callback=convergence_measure, - max_history_length=10) - minimizer3 = SteepestDescent(convergence_tolerance=1e-3, - iteration_limit=70, + max_history_length=20) + minimizer3 = SteepestDescent(convergence_tolerance=1e-8, + iteration_limit=500, callback=convergence_measure) # Setting starting position @@ -143,7 +144,7 @@ if __name__ == "__main__": # Initializing the power energy with updated parameters power_energy = CriticalPowerEnergy(position=t0, m=m0, D=D0, smoothness_prior=10., samples=3) - (power_energy, convergence) = minimizer3(power_energy) + (power_energy, convergence) = minimizer2(power_energy) # Setting new power spectrum @@ -151,7 +152,7 @@ if __name__ == "__main__": # Plotting current estimate print i - #if i%50 == 0: - # plot_parameters(m0,t0,log(sp), data_power) + if i%50 == 0: + plot_parameters(m0,t0,log(sp), data_power) diff --git a/nifty/energies/line_energy.py b/nifty/energies/line_energy.py index 3f9c0f75b..e816203e5 100644 --- a/nifty/energies/line_energy.py +++ b/nifty/energies/line_energy.py @@ -108,6 +108,7 @@ class LineEnergy: @property def dd(self): res = self.energy.gradient.vdot(self.linedir) - assert abs(res-res.real)<1e-12, \ - "directional derivative has non-negligible imaginary part" + if abs(res.imag)/max(abs(res.real),1.)>1e-12: + print "directional derivative has non-negligible " \ + "imaginary part:", res return res.real diff --git a/nifty/minimization/descent_minimizer.py b/nifty/minimization/descent_minimizer.py index be3abb535..10436faf5 100644 --- a/nifty/minimization/descent_minimizer.py +++ b/nifty/minimization/descent_minimizer.py @@ -154,6 +154,10 @@ class DescentMinimizer(Loggable, object): energy=energy, pk=descent_direction, f_k_minus_1=f_k_minus_1) + if f_k_minus_1 is None: + delta=1e30 + else: + delta = abs(f_k -f_k_minus_1)/max(abs(f_k),abs(f_k_minus_1),1.) f_k_minus_1 = energy.value tx1=energy.position-new_energy.position # check if new energy value is bigger than old energy value @@ -165,7 +169,6 @@ class DescentMinimizer(Loggable, object): energy = new_energy # check convergence - delta = abs(gradient).max() * step_length / gradient_norm self.logger.debug("Iteration:%08u step_length=%3.1E " "delta=%3.1E energy=%3.1E" % (iteration_number, step_length, delta, diff --git a/test/test_minimization/test_descent_minimizers.py b/test/test_minimization/test_descent_minimizers.py index fcffa73d7..81daf7eb5 100644 --- a/test/test_minimization/test_descent_minimizers.py +++ b/test/test_minimization/test_descent_minimizers.py @@ -43,7 +43,8 @@ class Test_DescentMinimizers(unittest.TestCase): covariance = DiagonalOperator(space, diagonal=covariance_diagonal) energy = QuadraticPotential(position=starting_point, eigenvalues=covariance) - minimizer = minimizer_class(iteration_limit=30) + minimizer = minimizer_class(iteration_limit=30, + convergence_tolerance=1e-10) (energy, convergence) = minimizer(energy) -- GitLab