(dataset_size: int)
| 238 | |
| 239 | |
| 240 | def build_default_timeline(dataset_size: int) -> list[TimelineMilestone]: |
| 241 | if dataset_size <= 0: |
| 242 | raise ValueError("Dataset must contain at least one example.") |
| 243 | |
| 244 | specs: list[tuple[str, str, str, float, float | None]] = [ |
| 245 | ("initial", "Initial weights", "initial", 0.0, None), |
| 246 | ("approx_50", "≈50 images", "approx", 50 / BASE_DATASET_SIZE, None), |
| 247 | ("approx_120", "≈120 images", "approx", 120 / BASE_DATASET_SIZE, None), |
| 248 | ("approx_250", "≈250 images", "approx", 250 / BASE_DATASET_SIZE, None), |
| 249 | ("approx_500", "≈500 images", "approx", 500 / BASE_DATASET_SIZE, None), |
| 250 | ("approx_1k", "≈1k images", "approx", 1_000 / BASE_DATASET_SIZE, None), |
| 251 | ("approx_2k", "≈2k images", "approx", 2_000 / BASE_DATASET_SIZE, None), |
| 252 | ("approx_3_5k", "≈3.5k images", "approx", 3_500 / BASE_DATASET_SIZE, None), |
| 253 | ("approx_5_8k", "≈5.8k images", "approx", 5_800 / BASE_DATASET_SIZE, None), |
| 254 | ("approx_8_7k", "≈8.7k images", "approx", 8_700 / BASE_DATASET_SIZE, None), |
| 255 | ("approx_13k", "≈13k images", "approx", 13_000 / BASE_DATASET_SIZE, None), |
| 256 | ("approx_19_5k", "≈19.5k images", "approx", 19_500 / BASE_DATASET_SIZE, None), |
| 257 | ("approx_28_5k", "≈28.5k images", "approx", 28_500 / BASE_DATASET_SIZE, None), |
| 258 | ("approx_40k", "≈40k images", "approx", 40_000 / BASE_DATASET_SIZE, None), |
| 259 | ("dataset_1x", "1× dataset", "dataset_multiple", 1.0, 1.0), |
| 260 | ("approx_80k", "≈80k images", "approx", 80_000 / BASE_DATASET_SIZE, None), |
| 261 | ("dataset_1_5x", "1.5× dataset", "dataset_multiple", 1.5, 1.5), |
| 262 | ("dataset_2x", "2× dataset", "dataset_multiple", 2.0, 2.0), |
| 263 | ("dataset_2_5x", "2.5× dataset", "dataset_multiple", 2.5, 2.5), |
| 264 | ("dataset_3x", "3× dataset", "dataset_multiple", 3.0, 3.0), |
| 265 | ("dataset_4x", "4× dataset", "dataset_multiple", 4.0, 4.0), |
| 266 | ("dataset_5x", "5× dataset", "dataset_multiple", 5.0, 5.0), |
| 267 | ("dataset_6_5x", "6.5× dataset", "dataset_multiple", 6.5, 6.5), |
| 268 | ("dataset_8_5x", "8.5× dataset", "dataset_multiple", 8.5, 8.5), |
| 269 | ("dataset_10x", "10× dataset", "dataset_multiple", 10.0, 10.0), |
| 270 | ("dataset_12_5x", "12.5× dataset", "dataset_multiple", 12.5, 12.5), |
| 271 | ("dataset_15x", "15× dataset", "dataset_multiple", 15.0, 15.0), |
| 272 | ("dataset_17_5x", "17.5× dataset", "dataset_multiple", 17.5, 17.5), |
| 273 | ("dataset_20x", "20× dataset", "dataset_multiple", 20.0, 20.0), |
| 274 | ("dataset_25x", "25× dataset", "dataset_multiple", 25.0, 25.0), |
| 275 | ("dataset_30x", "30× dataset", "dataset_multiple", 30.0, 30.0), |
| 276 | ("dataset_35x", "35× dataset", "dataset_multiple", 35.0, 35.0), |
| 277 | ("dataset_40x", "40× dataset", "dataset_multiple", 40.0, 40.0), |
| 278 | ("dataset_45x", "45× dataset", "dataset_multiple", 45.0, 45.0), |
| 279 | ("dataset_50x", "50× dataset", "dataset_multiple", 50.0, 50.0), |
| 280 | ] |
| 281 | |
| 282 | milestones: list[TimelineMilestone] = [] |
| 283 | last_threshold = -1 |
| 284 | for identifier, label, kind, ratio, dataset_multiple in specs: |
| 285 | if ratio <= 0.0: |
| 286 | threshold_images = 0 |
| 287 | else: |
| 288 | scaled = dataset_size * ratio |
| 289 | threshold_images = max(1, int(round(scaled))) |
| 290 | if threshold_images <= last_threshold: |
| 291 | threshold_images = last_threshold + 1 |
| 292 | milestones.append( |
| 293 | TimelineMilestone( |
| 294 | identifier, |
| 295 | threshold_images, |
| 296 | label, |
| 297 | kind, |
no test coverage detected