diff --git a/meteor/settings.py b/meteor/settings.py index 0ae799f..54cd968 100644 --- a/meteor/settings.py +++ b/meteor/settings.py @@ -44,7 +44,8 @@ # tv denoising TV_WEIGHT_DEFAULT: float = 0.01 -BRACKET_FOR_GOLDEN_OPTIMIZATION: tuple[float, float] = (0.0, 0.05) +BRACKET_FOR_GOLDEN_OPTIMIZATION: tuple[float, float] = (0.0, 0.01) # the braket can expand +TV_MAX_WEIGHT_EXPECTED = 0.1 # this value sets the threshold for a warning to the user TV_STOP_TOLERANCE: float = 0.00000005 # inner loop; not for iterative-tv phase retrieval TV_MAX_NUM_ITER: int = 50 # inner loop; not for iterative-tv phase retrieval diff --git a/meteor/tv.py b/meteor/tv.py index 8b1f4c3..89c954d 100644 --- a/meteor/tv.py +++ b/meteor/tv.py @@ -9,6 +9,7 @@ from typing import Literal, overload import numpy as np +import structlog from skimage.restoration import denoise_tv_chambolle from .rsmap import Map @@ -16,10 +17,13 @@ BRACKET_FOR_GOLDEN_OPTIMIZATION, MAP_SAMPLING, TV_MAX_NUM_ITER, + TV_MAX_WEIGHT_EXPECTED, TV_STOP_TOLERANCE, ) from .validate import ScalarMaximizer, negentropy +log = structlog.get_logger() + @dataclass class TvDenoiseResult: @@ -177,6 +181,13 @@ def negentropy_objective(tv_weight: float) -> float: else: maximizer.optimize_with_golden_algorithm(bracket=BRACKET_FOR_GOLDEN_OPTIMIZATION) + if maximizer.argument_optimum > TV_MAX_WEIGHT_EXPECTED: + log.warning( + "TV regularization weight much larger than expected, something probably went wrong", + weight=maximizer.argument_optimum, + limit=TV_MAX_WEIGHT_EXPECTED, + ) + # denoise using the optimized parameters and convert to an rs.DataSet final_realspace_map_as_array = _tv_denoise_array( map_as_array=realspace_map_array,