From 5deec7cc4bc7104f4764b662024f03fe3fd78e24 Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Tue, 18 Aug 2026 11:49:53 +0300 Subject: [PATCH 1/2] Clamp calibration padding to probability bounds --- src/rtichoke/calibration/calibration.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rtichoke/calibration/calibration.py b/src/rtichoke/calibration/calibration.py index 6f1a0ea3..d76b4081 100644 --- a/src/rtichoke/calibration/calibration.py +++ b/src/rtichoke/calibration/calibration.py @@ -976,9 +976,10 @@ def _define_limits_for_calibration_plot(deciles_dat: pl.DataFrame) -> List[float ) ) + padding = (upper_bound - lower_bound) * 0.05 return [ - lower_bound - (upper_bound - lower_bound) * 0.05, - upper_bound + (upper_bound - lower_bound) * 0.05, + max(0.0, lower_bound - padding), + min(1.0, upper_bound + padding), ] From b649dcd118aa2f1b873d4bd3f41ffdd3fc248e9e Mon Sep 17 00:00:00 2001 From: Uriah Finkel Date: Tue, 18 Aug 2026 11:50:07 +0300 Subject: [PATCH 2/2] Test calibration limits stay within probability bounds --- tests/test_calibration.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/test_calibration.py b/tests/test_calibration.py index f17a2b91..adc52c0a 100644 --- a/tests/test_calibration.py +++ b/tests/test_calibration.py @@ -1,5 +1,10 @@ import numpy as np -from rtichoke.calibration.calibration import create_calibration_curve +import polars as pl + +from rtichoke.calibration.calibration import ( + _define_limits_for_calibration_plot, + create_calibration_curve, +) def test_create_calibration_curve_smooth(): @@ -43,3 +48,13 @@ def test_create_calibration_curve_multiple_populations_unequal_sizes(): probs, reals, calibration_type=calibration_type ) assert {trace.name for trace in fig.data if trace.name} >= {"Train", "Test"} + + +def test_calibration_limits_keep_padding_without_leaving_probability_scale(): + near_zero = pl.DataFrame({"x": [0.01, 0.20], "y": [0.02, 0.70]}) + near_one = pl.DataFrame({"x": [0.30, 0.99], "y": [0.40, 0.98]}) + mid_range = pl.DataFrame({"x": [0.20, 0.80], "y": [0.25, 0.75]}) + + assert _define_limits_for_calibration_plot(near_zero) == [0.0, 0.7345] + assert _define_limits_for_calibration_plot(near_one) == [0.2655, 1.0] + assert _define_limits_for_calibration_plot(mid_range) == [0.17, 0.8300000000000001]