From 5c572c60089a4418362fd89928f383831ef0f671 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 27 Dec 2025 16:42:34 +0100 Subject: [PATCH] refactor(quickadapter): harmonize error messages MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../freqaimodels/QuickAdapterRegressorV3.py | 13 +++--- .../user_data/strategies/QuickAdapterV3.py | 44 +++++++++---------- quickadapter/user_data/strategies/Utils.py | 2 +- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index ab19b3c..e6a9da1 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -297,8 +297,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): label_frequency_candles = default_label_frequency_candles else: logger.warning( - f"Invalid string value for label_frequency_candles {label_frequency_candles!r}, " - f"only 'auto' is supported, using default {default_label_frequency_candles!r}" + f"Invalid label_frequency_candles {label_frequency_candles!r}: only 'auto' is supported for string values. Using default {default_label_frequency_candles!r}" ) label_frequency_candles = default_label_frequency_candles elif isinstance(label_frequency_candles, (int, float)): @@ -306,14 +305,12 @@ class QuickAdapterRegressorV3(BaseRegressionModel): label_frequency_candles = int(label_frequency_candles) else: logger.warning( - f"Invalid numeric value for label_frequency_candles: {label_frequency_candles!r}, " - f"must be between 2 and 10000, using default {default_label_frequency_candles!r}" + f"Invalid label_frequency_candles {label_frequency_candles!r}: must be in range [2, 10000]. Using default {default_label_frequency_candles!r}" ) label_frequency_candles = default_label_frequency_candles else: logger.warning( - f"Invalid type for label_frequency_candles {type(label_frequency_candles).__name__!r}, " - f"expected int, float, or 'auto', using default {default_label_frequency_candles!r}" + f"Invalid label_frequency_candles {label_frequency_candles!r}: expected int, float, or 'auto'. Using default {default_label_frequency_candles!r}" ) label_frequency_candles = default_label_frequency_candles @@ -1436,7 +1433,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): extrema_fraction: float = 1.0, ) -> tuple[float, float]: if alpha < 0: - raise ValueError(f"Invalid alpha {alpha}: must be >= 0") + raise ValueError(f"Invalid alpha {alpha!r}: must be >= 0") pred_minima, pred_maxima = QuickAdapterRegressorV3.get_pred_min_max( pred_extrema, extrema_selection, extrema_fraction ) @@ -1693,7 +1690,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): if not np.all(np.isfinite(normalized_matrix)): raise ValueError( - "normalized_matrix must contain only finite values after normalization" + "Invalid normalized_matrix: must contain only finite values after normalization" ) return normalized_matrix diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 63fdd5d..4054808 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -495,7 +495,7 @@ class QuickAdapterV3(IStrategy): if not isinstance(lookback_period, int) or lookback_period < 0: logger.warning( - f"Invalid reversal_confirmation lookback_period {lookback_period!r}, using default {QuickAdapterV3.default_reversal_confirmation['lookback_period']}" + f"Invalid reversal_confirmation lookback_period {lookback_period!r}: must be >= 0. Using default {QuickAdapterV3.default_reversal_confirmation['lookback_period']!r}" ) lookback_period = QuickAdapterV3.default_reversal_confirmation[ "lookback_period" @@ -503,7 +503,7 @@ class QuickAdapterV3(IStrategy): if not isinstance(decay_ratio, (int, float)) or not (0.0 < decay_ratio <= 1.0): logger.warning( - f"Invalid reversal_confirmation decay_ratio {decay_ratio!r}, using default {QuickAdapterV3.default_reversal_confirmation['decay_ratio']}" + f"Invalid reversal_confirmation decay_ratio {decay_ratio!r}: must be in range (0, 1]. Using default {QuickAdapterV3.default_reversal_confirmation['decay_ratio']!r}" ) decay_ratio = QuickAdapterV3.default_reversal_confirmation["decay_ratio"] @@ -742,7 +742,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_strategy not in set(WEIGHT_STRATEGIES): logger.warning( - f"Invalid extrema_weighting strategy {weighting_strategy!r}, must be one of {WEIGHT_STRATEGIES}, using default {WEIGHT_STRATEGIES[0]!r}" + f"Invalid extrema_weighting strategy {weighting_strategy!r}. Supported: {', '.join(WEIGHT_STRATEGIES)}. Using default {WEIGHT_STRATEGIES[0]!r}" ) weighting_strategy = WEIGHT_STRATEGIES[0] @@ -754,7 +754,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_standardization not in set(STANDARDIZATION_TYPES): logger.warning( - f"Invalid extrema_weighting standardization {weighting_standardization!r}, must be one of {STANDARDIZATION_TYPES}, using default {STANDARDIZATION_TYPES[0]!r}" + f"Invalid extrema_weighting standardization {weighting_standardization!r}. Supported: {', '.join(STANDARDIZATION_TYPES)}. Using default {STANDARDIZATION_TYPES[0]!r}" ) weighting_standardization = STANDARDIZATION_TYPES[0] @@ -771,7 +771,7 @@ class QuickAdapterV3(IStrategy): or weighting_robust_quantiles[0] >= weighting_robust_quantiles[1] ): logger.warning( - f"Invalid extrema_weighting robust_quantiles {weighting_robust_quantiles!r}, must be (q1, q3) with 0 <= q1 < q3 <= 1, using default {DEFAULTS_EXTREMA_WEIGHTING['robust_quantiles']!r}" + f"Invalid extrema_weighting robust_quantiles {weighting_robust_quantiles!r}: must be (q1, q3) with 0 <= q1 < q3 <= 1. Using default {DEFAULTS_EXTREMA_WEIGHTING['robust_quantiles']!r}" ) weighting_robust_quantiles = DEFAULTS_EXTREMA_WEIGHTING["robust_quantiles"] else: @@ -789,7 +789,7 @@ class QuickAdapterV3(IStrategy): or weighting_mmad_scaling_factor <= 0 ): logger.warning( - f"Invalid extrema_weighting mmad_scaling_factor {weighting_mmad_scaling_factor!r}, must be a finite number > 0, using default {DEFAULTS_EXTREMA_WEIGHTING['mmad_scaling_factor']!r}" + f"Invalid extrema_weighting mmad_scaling_factor {weighting_mmad_scaling_factor!r}: must be a finite number > 0. Using default {DEFAULTS_EXTREMA_WEIGHTING['mmad_scaling_factor']!r}" ) weighting_mmad_scaling_factor = DEFAULTS_EXTREMA_WEIGHTING[ "mmad_scaling_factor" @@ -803,7 +803,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_normalization not in set(NORMALIZATION_TYPES): logger.warning( - f"Invalid extrema_weighting normalization {weighting_normalization!r}, must be one of {NORMALIZATION_TYPES}, using default {NORMALIZATION_TYPES[0]!r}" + f"Invalid extrema_weighting normalization {weighting_normalization!r}. Supported: {', '.join(NORMALIZATION_TYPES)}. Using default {NORMALIZATION_TYPES[0]!r}" ) weighting_normalization = NORMALIZATION_TYPES[0] @@ -838,7 +838,7 @@ class QuickAdapterV3(IStrategy): or weighting_minmax_range[0] >= weighting_minmax_range[1] ): logger.warning( - f"Invalid extrema_weighting minmax_range {weighting_minmax_range!r}, must be (min, max) with min < max, using default {DEFAULTS_EXTREMA_WEIGHTING['minmax_range']!r}" + f"Invalid extrema_weighting minmax_range {weighting_minmax_range!r}: must be (min, max) with min < max. Using default {DEFAULTS_EXTREMA_WEIGHTING['minmax_range']!r}" ) weighting_minmax_range = DEFAULTS_EXTREMA_WEIGHTING["minmax_range"] else: @@ -856,7 +856,7 @@ class QuickAdapterV3(IStrategy): or weighting_sigmoid_scale <= 0 ): logger.warning( - f"Invalid extrema_weighting sigmoid_scale {weighting_sigmoid_scale!r}, must be a finite number > 0, using default {DEFAULTS_EXTREMA_WEIGHTING['sigmoid_scale']!r}" + f"Invalid extrema_weighting sigmoid_scale {weighting_sigmoid_scale!r}: must be a finite number > 0. Using default {DEFAULTS_EXTREMA_WEIGHTING['sigmoid_scale']!r}" ) weighting_sigmoid_scale = DEFAULTS_EXTREMA_WEIGHTING["sigmoid_scale"] @@ -869,7 +869,7 @@ class QuickAdapterV3(IStrategy): or weighting_softmax_temperature <= 0 ): logger.warning( - f"Invalid extrema_weighting softmax_temperature {weighting_softmax_temperature!r}, must be a finite number > 0, using default {DEFAULTS_EXTREMA_WEIGHTING['softmax_temperature']!r}" + f"Invalid extrema_weighting softmax_temperature {weighting_softmax_temperature!r}: must be a finite number > 0. Using default {DEFAULTS_EXTREMA_WEIGHTING['softmax_temperature']!r}" ) weighting_softmax_temperature = DEFAULTS_EXTREMA_WEIGHTING[ "softmax_temperature" @@ -882,7 +882,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_rank_method not in set(RANK_METHODS): logger.warning( - f"Invalid extrema_weighting rank_method {weighting_rank_method!r}, must be one of {RANK_METHODS}, using default {RANK_METHODS[0]!r}" + f"Invalid extrema_weighting rank_method {weighting_rank_method!r}. Supported: {', '.join(RANK_METHODS)}. Using default {RANK_METHODS[0]!r}" ) weighting_rank_method = RANK_METHODS[0] @@ -896,7 +896,7 @@ class QuickAdapterV3(IStrategy): or not (0 < weighting_gamma <= 10.0) ): logger.warning( - f"Invalid extrema_weighting gamma {weighting_gamma!r}, must be a finite number in (0, 10], using default {DEFAULTS_EXTREMA_WEIGHTING['gamma']!r}" + f"Invalid extrema_weighting gamma {weighting_gamma!r}: must be in range (0, 10]. Using default {DEFAULTS_EXTREMA_WEIGHTING['gamma']!r}" ) weighting_gamma = DEFAULTS_EXTREMA_WEIGHTING["gamma"] @@ -905,7 +905,7 @@ class QuickAdapterV3(IStrategy): ) if not isinstance(weighting_source_weights, dict): logger.warning( - f"Invalid extrema_weighting source_weights {weighting_source_weights!r}, must be a dict of source name to weight, using default {DEFAULTS_EXTREMA_WEIGHTING['source_weights']!r}" + f"Invalid extrema_weighting source_weights {weighting_source_weights!r}: must be a dict of source name to weight. Using default {DEFAULTS_EXTREMA_WEIGHTING['source_weights']!r}" ) weighting_source_weights = DEFAULTS_EXTREMA_WEIGHTING["source_weights"] else: @@ -922,7 +922,7 @@ class QuickAdapterV3(IStrategy): sanitized_source_weights[str(source)] = float(weight) if not sanitized_source_weights: logger.warning( - f"Invalid/empty extrema_weighting source_weights {weighting_source_weights!r}, using default {DEFAULTS_EXTREMA_WEIGHTING['source_weights']!r}" + f"Invalid extrema_weighting source_weights {weighting_source_weights!r}: empty after sanitization. Using default {DEFAULTS_EXTREMA_WEIGHTING['source_weights']!r}" ) weighting_source_weights = DEFAULTS_EXTREMA_WEIGHTING["source_weights"] else: @@ -935,7 +935,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_aggregation not in set(HYBRID_AGGREGATIONS): logger.warning( - f"Invalid extrema_weighting aggregation {weighting_aggregation!r}, must be one of {HYBRID_AGGREGATIONS}, using default {HYBRID_AGGREGATIONS[0]!r}" + f"Invalid extrema_weighting aggregation {weighting_aggregation!r}. Supported: {', '.join(HYBRID_AGGREGATIONS)}. Using default {HYBRID_AGGREGATIONS[0]!r}" ) weighting_aggregation = DEFAULTS_EXTREMA_WEIGHTING["aggregation"] weighting_aggregation_normalization = str( @@ -946,7 +946,7 @@ class QuickAdapterV3(IStrategy): ) if weighting_aggregation_normalization not in set(NORMALIZATION_TYPES): logger.warning( - f"Invalid extrema_weighting aggregation_normalization {weighting_aggregation_normalization!r}, must be one of {NORMALIZATION_TYPES}, using default {NORMALIZATION_TYPES[6]!r}" + f"Invalid extrema_weighting aggregation_normalization {weighting_aggregation_normalization!r}. Supported: {', '.join(NORMALIZATION_TYPES)}. Using default {NORMALIZATION_TYPES[6]!r}" ) weighting_aggregation_normalization = DEFAULTS_EXTREMA_WEIGHTING[ "aggregation_normalization" @@ -992,7 +992,7 @@ class QuickAdapterV3(IStrategy): ) if smoothing_method not in set(SMOOTHING_METHODS): logger.warning( - f"Invalid extrema_smoothing method {smoothing_method!r}, must be one of {SMOOTHING_METHODS}, using default {SMOOTHING_METHODS[0]!r}" + f"Invalid extrema_smoothing method {smoothing_method!r}. Supported: {', '.join(SMOOTHING_METHODS)}. Using default {SMOOTHING_METHODS[0]!r}" ) smoothing_method = SMOOTHING_METHODS[0] @@ -1001,7 +1001,7 @@ class QuickAdapterV3(IStrategy): ) if not isinstance(smoothing_window, int) or smoothing_window < 3: logger.warning( - f"Invalid extrema_smoothing window {smoothing_window!r}, must be an integer >= 3, using default {DEFAULTS_EXTREMA_SMOOTHING['window']!r}" + f"Invalid extrema_smoothing window {smoothing_window!r}: must be an integer >= 3. Using default {DEFAULTS_EXTREMA_SMOOTHING['window']!r}" ) smoothing_window = DEFAULTS_EXTREMA_SMOOTHING["window"] @@ -1014,7 +1014,7 @@ class QuickAdapterV3(IStrategy): or smoothing_beta <= 0 ): logger.warning( - f"Invalid extrema_smoothing beta {smoothing_beta!r}, must be a finite number > 0, using default {DEFAULTS_EXTREMA_SMOOTHING['beta']!r}" + f"Invalid extrema_smoothing beta {smoothing_beta!r}: must be a finite number > 0. Using default {DEFAULTS_EXTREMA_SMOOTHING['beta']!r}" ) smoothing_beta = DEFAULTS_EXTREMA_SMOOTHING["beta"] @@ -1023,7 +1023,7 @@ class QuickAdapterV3(IStrategy): ) if not isinstance(smoothing_polyorder, int) or smoothing_polyorder < 1: logger.warning( - f"Invalid extrema_smoothing polyorder {smoothing_polyorder!r}, must be an integer >= 1, using default {DEFAULTS_EXTREMA_SMOOTHING['polyorder']!r}" + f"Invalid extrema_smoothing polyorder {smoothing_polyorder!r}: must be an integer >= 1. Using default {DEFAULTS_EXTREMA_SMOOTHING['polyorder']!r}" ) smoothing_polyorder = DEFAULTS_EXTREMA_SMOOTHING["polyorder"] @@ -1032,7 +1032,7 @@ class QuickAdapterV3(IStrategy): ) if smoothing_mode not in set(SMOOTHING_MODES): logger.warning( - f"Invalid extrema_smoothing mode {smoothing_mode!r}, must be one of {SMOOTHING_MODES}, using default {SMOOTHING_MODES[0]!r}" + f"Invalid extrema_smoothing mode {smoothing_mode!r}. Supported: {', '.join(SMOOTHING_MODES)}. Using default {SMOOTHING_MODES[0]!r}" ) smoothing_mode = SMOOTHING_MODES[0] @@ -1045,7 +1045,7 @@ class QuickAdapterV3(IStrategy): or not np.isfinite(smoothing_sigma) ): logger.warning( - f"Invalid extrema_smoothing sigma {smoothing_sigma!r}, must be a finite number > 0, using default {DEFAULTS_EXTREMA_SMOOTHING['sigma']!r}" + f"Invalid extrema_smoothing sigma {smoothing_sigma!r}: must be a finite number > 0. Using default {DEFAULTS_EXTREMA_SMOOTHING['sigma']!r}" ) smoothing_sigma = DEFAULTS_EXTREMA_SMOOTHING["sigma"] diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 3652ccc..b216cf9 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -2367,7 +2367,7 @@ def validate_range( or (non_negative and value < 0) ): logger.warning( - f"Invalid {name} {value!r}, must be {constraint_str}, using default {default_value!r}" + f"Invalid {name} {value!r}: must be {constraint_str}. Using default {default_value!r}" ) return default_value return value -- 2.43.0