euler-eval 2.32.0__tar.gz → 2.34.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. {euler_eval-2.32.0/euler_eval.egg-info → euler_eval-2.34.0}/PKG-INFO +1 -1
  2. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/cli.md +5 -0
  3. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/configuration.md +62 -1
  4. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/output.md +15 -10
  5. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/cli.py +454 -54
  6. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/protocol.py +1 -1
  7. {euler_eval-2.32.0 → euler_eval-2.34.0/euler_eval.egg-info}/PKG-INFO +1 -1
  8. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval.egg-info/SOURCES.txt +1 -0
  9. {euler_eval-2.32.0 → euler_eval-2.34.0}/pyproject.toml +1 -1
  10. euler_eval-2.34.0/tests/test_experiments.py +489 -0
  11. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_protocol.py +9 -2
  12. {euler_eval-2.32.0 → euler_eval-2.34.0}/LICENSE +0 -0
  13. {euler_eval-2.32.0 → euler_eval-2.34.0}/MANIFEST.in +0 -0
  14. {euler_eval-2.32.0 → euler_eval-2.34.0}/README.md +0 -0
  15. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/README.md +0 -0
  16. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/alignment.md +0 -0
  17. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/distributions.md +0 -0
  18. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/feature-request-unified-evaluation-framework.md +0 -0
  19. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/metrics.md +0 -0
  20. {euler_eval-2.32.0 → euler_eval-2.34.0}/docs/validation.md +0 -0
  21. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/THIRD_PARTY_NOTICES.md +0 -0
  22. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/__init__.py +0 -0
  23. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/calibration.py +0 -0
  24. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/config_paths.py +0 -0
  25. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/data.py +0 -0
  26. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/distribution_contract.py +0 -0
  27. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/distributions.py +0 -0
  28. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/evaluate.py +0 -0
  29. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metric_sets.py +0 -0
  30. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/__init__.py +0 -0
  31. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/_natural_scene_models.py +0 -0
  32. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/absrel.py +0 -0
  33. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/daniel_error.py +0 -0
  34. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/depth_binned_error.py +0 -0
  35. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/depth_edge_f1.py +0 -0
  36. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/depth_standard.py +0 -0
  37. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/fade.py +0 -0
  38. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/fid_kid.py +0 -0
  39. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/gpu_depth_batch.py +0 -0
  40. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/gpu_image_batch.py +0 -0
  41. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/high_freq_energy.py +0 -0
  42. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/lpips_metric.py +0 -0
  43. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/niqe.py +0 -0
  44. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/normal_consistency.py +0 -0
  45. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/points3d_cloud.py +0 -0
  46. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/points3d_decomposition.py +0 -0
  47. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/points3d_distance.py +0 -0
  48. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/points3d_geometry.py +0 -0
  49. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/psnr.py +0 -0
  50. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/rgb_edge_f1.py +0 -0
  51. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/rgb_lpips.py +0 -0
  52. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/rgb_psnr_ssim.py +0 -0
  53. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/rho_a.py +0 -0
  54. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/rmse.py +0 -0
  55. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/scale_invariant_log.py +0 -0
  56. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/sky_iou.py +0 -0
  57. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/ssim.py +0 -0
  58. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/tail_errors.py +0 -0
  59. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/metrics/utils.py +0 -0
  60. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/sanity_checker.py +0 -0
  61. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/schemas/distribution-v1.schema.json +0 -0
  62. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/utils/hierarchy_parser.py +0 -0
  63. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval/validation.py +0 -0
  64. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval.egg-info/dependency_links.txt +0 -0
  65. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval.egg-info/entry_points.txt +0 -0
  66. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval.egg-info/requires.txt +0 -0
  67. {euler_eval-2.32.0 → euler_eval-2.34.0}/euler_eval.egg-info/top_level.txt +0 -0
  68. {euler_eval-2.32.0 → euler_eval-2.34.0}/init_cache.py +0 -0
  69. {euler_eval-2.32.0 → euler_eval-2.34.0}/scripts/generate_distribution_fixtures.py +0 -0
  70. {euler_eval-2.32.0 → euler_eval-2.34.0}/setup.cfg +0 -0
  71. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/__init__.py +0 -0
  72. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/conftest.py +0 -0
  73. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/distribution_contract_utils.py +0 -0
  74. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/eval_output.py +0 -0
  75. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/README.md +0 -0
  76. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/counts-depth.eval.json +0 -0
  77. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/counts-points3d.eval.json +0 -0
  78. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/counts-sparsedepth.eval.json +0 -0
  79. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/future-sum-by-depth.eval.json +0 -0
  80. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/histogram-only.eval.json +0 -0
  81. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/per-file-only.eval.json +0 -0
  82. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/fixtures/distributions/scalar-only.eval.json +0 -0
  83. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/mock_files/calibration_output.json +0 -0
  84. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/mock_files/depth_output.json +0 -0
  85. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/mock_files/rgb_output.json +0 -0
  86. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/mock_files/segmentation_output.json +0 -0
  87. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_alignment.py +0 -0
  88. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_cli_device.py +0 -0
  89. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_cli_sparse_outputs.py +0 -0
  90. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_config.py +0 -0
  91. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_data.py +0 -0
  92. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_data_builders.py +0 -0
  93. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_depth_alignment_output.py +0 -0
  94. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_depth_standard.py +0 -0
  95. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_distribution_contract.py +0 -0
  96. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_distributions.py +0 -0
  97. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_domain_metrics.py +0 -0
  98. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_evaluate_helpers.py +0 -0
  99. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_init_cache.py +0 -0
  100. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_integration.py +0 -0
  101. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_mask_sky_pairing.py +0 -0
  102. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_mask_sky_prediction.py +0 -0
  103. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_meta_output.py +0 -0
  104. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_metrics_utils.py +0 -0
  105. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_normal_consistency.py +0 -0
  106. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_points_3d.py +0 -0
  107. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_points_3d_sparse.py +0 -0
  108. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_rgb_fid_output.py +0 -0
  109. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_rho_a.py +0 -0
  110. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_save_results.py +0 -0
  111. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_sky_iou.py +0 -0
  112. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_sky_iou_cli.py +0 -0
  113. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_sparse_depth.py +0 -0
  114. {euler_eval-2.32.0 → euler_eval-2.34.0}/tests/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euler-eval
3
- Version: 2.32.0
3
+ Version: 2.34.0
4
4
  Summary: Evaluation toolkit for depth, RGB, ray and 3D point-map predictions
5
5
  Author-email: Daniel Rothenpieler <rothenpielerdaniel@gmail.com>
6
6
  License: MIT
@@ -38,6 +38,7 @@ validation exits with status `1` before any dataset is opened.
38
38
  | `--distribution-scale` | `{log,linear}` | `log` | Spacing of finite histogram bins |
39
39
  | `--distribution-range` | `float float` | `0.001 100` | Finite error range `[MIN, MAX)` in evaluated space units; zero/small-error and overflow bins retain the tails |
40
40
  | `--eval-name` | `str` | `eval` | Name this evaluation: results are written as `<name>.json` in each prediction dataset's `.eval/` folder, so differently named runs sit side by side; a dataset's `output_file` still wins ([details](output.md#where-results-land)) |
41
+ | `--experiment` | `str` | all | Run only this experiment from the config's [`experiments`](configuration.md#experiments-section-optional) section; repeatable |
41
42
 
42
43
  Histogram settings can also be specified in the config's `distributions`
43
44
  section. A bin, scale or range flag enables histograms and overrides that
@@ -73,6 +74,10 @@ euler-eval config.json --skip-rgb --skip-rays --skip-points-3d
73
74
  # Keep a sky-masked run beside the default results: .eval/[<scope>/]no_sky.json
74
75
  euler-eval config.json --mask-sky --eval-name no_sky
75
76
 
77
+ # Run every experiment in the config's "experiments" section, or just one
78
+ euler-eval config.json --device cuda --batch-size 32
79
+ euler-eval config.json --experiment no_sky
80
+
76
81
  # Force affine scale+shift alignment on all depth predictions
77
82
  euler-eval config.json --depth-alignment affine
78
83
 
@@ -250,6 +250,66 @@ sources:
250
250
  unprojected on the fly. Whether the GT depth is radial or planar is read from
251
251
  its metadata (`radial_depth`).
252
252
 
253
+ ## `experiments` section (optional)
254
+
255
+ Runs the same config several times in one invocation, each time with its own
256
+ command-line flags and under its own name:
257
+
258
+ ```json
259
+ {
260
+ "gt": { "depth": { "path": "/data/gt/depth" } },
261
+ "datasets": [{ "name": "model_a", "depth": { "path": "/data/model_a/depth" } }],
262
+ "experiments": [
263
+ { "name": "eval" },
264
+ { "name": "no_sky", "args": ["--mask-sky", "--benchmark-depth-range", 0.01, 80] },
265
+ { "name": "affine", "args": ["--depth-alignment", "affine"] },
266
+ { "name": "capped_no_mask", "args": ["--sky-depth", 80], "modalities": ["depth"] }
267
+ ]
268
+ }
269
+ ```
270
+
271
+ | Field | Required | Description |
272
+ |---|---|---|
273
+ | `name` | yes | Evaluation name: results are written as `<name>.json` in each prediction dataset's `.eval/` folder ([where results land](output.md#where-results-land)). Same rules as `--eval-name`; unique |
274
+ | `args` | no | Command-line tokens this experiment adds, exactly as you would type them; numbers may be written as JSON numbers |
275
+ | `modalities` | no | The prediction modalities (`datasets[]` entries) this experiment may load (default: all): `depth` (also covers `relative_depth` and `affine_depth`), `rgb`, `rays`, `points_3d`, `sky_mask`. The `gt` section is always used as configured |
276
+
277
+ - **The command line is the base.** Each experiment runs with the flags given on
278
+ the command line followed by its own `args`, so for a flag that takes a
279
+ value, the experiment's value wins. Switches such as `--mask-sky` can only be
280
+ turned on that way, so put the ones that vary between experiments in
281
+ `args`, not on the command line.
282
+ - **Checked before any work.** Every experiment's `args` are parsed and
283
+ validated before the first one runs. `--eval-name` and `--experiment` are not
284
+ allowed in `args`, and `--eval-name` cannot be combined with an `experiments`
285
+ section, because `name` names the results.
286
+ - **Modalities.** An experiment with `modalities` runs as if the unlisted
287
+ prediction entries were not in `datasets[]`; a `sky_mask` goes with its depth
288
+ prediction. GT inputs are not selected this way: they stay as configured,
289
+ and flags decide which ones an evaluation reads (`--mask-sky` the
290
+ segmentation, for example), so GT names such as `segmentation` or
291
+ `sparse_depth` are rejected. A listed modality is still read only when the
292
+ evaluation needs it, e.g. `sky_mask` only with `--sky-depth`,
293
+ `--mask-sky-prediction` or `--sky-iou`; with just `--mask-sky`, listing
294
+ `sky_mask` changes nothing. This is how to compare runs where a modality's
295
+ presence changes the output: above, `capped_no_mask` caps depth at 80 m
296
+ without filling the predicted sky. A dataset left without a prediction is
297
+ not evaluated in that experiment. Listing a modality no dataset has only
298
+ prints a warning, so one experiment list can serve several generated
299
+ configs.
300
+ - **Selecting experiments.** By default all experiments run, in config order.
301
+ `--experiment NAME` (repeatable) runs only the named ones, e.g. one per task
302
+ of a job array.
303
+ - **Failures.** An experiment that fails is reported and the rest still run;
304
+ the exit status is then `1`.
305
+
306
+ Each experiment loads and scores the data again, and its results carry the
307
+ settings it ran with in [`protocol.parameters`](output.md#comparing-evaluations)
308
+ and its name in `meta.eval_name`. With euler-train logging, each prediction
309
+ dataset is logged once per experiment, as `<name>/<experiment>`; the
310
+ sanity-check report is written per experiment as
311
+ `sanity_check_report_<experiment>.json`.
312
+
253
313
  ## `euler_train` section (optional)
254
314
 
255
315
  When present, results are logged to an
@@ -260,7 +320,8 @@ created and finished on completion) or a full path to an existing run directory
260
320
  only supported key.
261
321
 
262
322
  Each prediction dataset is registered as an evaluation named after its config
263
- `name`, first as `running` and then with its metrics attached, alongside package
323
+ `name` (`<name>/<experiment>` with [`experiments`](#experiments-section-optional)),
324
+ first as `running` and then with its metrics attached, alongside package
264
325
  provenance (euler-eval version, Python, torch, CUDA).
265
326
 
266
327
  ## Loader resolution & dataset metadata
@@ -74,7 +74,7 @@ set.
74
74
  "metricDescriptions": { "absrel": { "…": "…" } }
75
75
  },
76
76
  "protocol": {
77
- "schemaVersion": "1.0",
77
+ "schemaVersion": "1.1",
78
78
  "parameters": { "reference.gt.dataset": "muses", "method.depth_alignment": "auto_affine", "…": "…" }
79
79
  },
80
80
  "dataset_info": { "num_pairs": 500, "gt_name": "GT", "pred_name": "model_a" },
@@ -188,7 +188,7 @@ values differ say where. Nothing else in the file needs to be compared for that;
188
188
 
189
189
  ```json
190
190
  "protocol": {
191
- "schemaVersion": "1.0",
191
+ "schemaVersion": "1.1",
192
192
  "parameters": {
193
193
  "reference.gt.modality": "sparse_depth",
194
194
  "reference.gt.dataset": "seeingthroughfog",
@@ -213,7 +213,8 @@ values differ say where. Nothing else in the file needs to be compared for that;
213
213
  "population.benchmark_depth_range_m": [0.01, 80.0],
214
214
  "method.metrics_revision": 1,
215
215
  "method.depth_alignment": "auto_affine",
216
- "method.sky_depth_m": null
216
+ "method.sky_depth_m": null,
217
+ "method.pred_sky_mask": false
217
218
  }
218
219
  }
219
220
  ```
@@ -224,14 +225,14 @@ The first segment of a key is its section:
224
225
  |---|---|
225
226
  | `reference` | The GT the prediction is scored against (`gt`, with its config key as `modality`) and every other GT input the modality reads, each identified by `dataset` (the `dataset.id` of its `dataset-head.json`), metadata `scope` and `split` — not by file path, so the same data on another machine matches |
226
227
  | `population` | Which samples and pixels were scored: the matched `samples`, sky masking, the grid the metrics were computed on and benchmark depth bins |
227
- | `method` | How they were scored: alignment modes, the sky-depth cap, how GT and prediction resolutions were reconciled, the FID backend and `metrics_revision` |
228
+ | `method` | How they were scored: alignment modes, the sky-depth cap and whether the prediction's `sky_mask` was used, how GT and prediction resolutions were reconciled, the FID backend and `metrics_revision` |
228
229
 
229
230
  What is recorded, per modality:
230
231
 
231
232
  | Modality | `reference` inputs besides `gt` | `population` | `method` |
232
233
  |---|---|---|---|
233
- | `depth` | `calibration`, `segmentation` | `samples`, `gt_sky_masking`, `pred_sky_masking`, `evaluated_resolution`, `benchmark_depth_range_m` | `depth_alignment`, `sky_depth_m`, `spatial_alignment` |
234
- | `sparsedepth` | `intrinsics`, `camera_extrinsics`, `lidar_extrinsics`, `segmentation` | as `depth` | `depth_alignment`, `sky_depth_m` |
234
+ | `depth` | `calibration`, `segmentation` | `samples`, `gt_sky_masking`, `pred_sky_masking`, `evaluated_resolution`, `benchmark_depth_range_m` | `depth_alignment`, `sky_depth_m`, `pred_sky_mask`, `spatial_alignment` |
235
+ | `sparsedepth` | `intrinsics`, `camera_extrinsics`, `lidar_extrinsics`, `segmentation` | as `depth` | `depth_alignment`, `sky_depth_m`, `pred_sky_mask` |
235
236
  | `rgb` | `depth`, `calibration`, `segmentation` | `samples`, `gt_sky_masking`, `evaluated_resolution`, `benchmark_depth_range_m` | `fid_backend`, `spatial_alignment` |
236
237
  | `rays` | `calibration` | `samples`, `evaluated_resolution` | `spatial_alignment` |
237
238
  | `points3d` (dense) | `intrinsics`, `calibration`, `segmentation` | `samples`, `gt_sky_masking`, `evaluated_resolution` | `points_3d_alignment`, `spatial_alignment` |
@@ -253,10 +254,14 @@ Rules that keep comparisons a plain map comparison:
253
254
  for identical inputs and settings, which the [changelog](../CHANGELOG.md)
254
255
  then says. Different revisions are not comparable even when every other
255
256
  key matches.
256
- - Settings are recorded, not what they caused. With `--mask-sky-prediction`,
257
- `population.pred_sky_masking` is `true` for every prediction, while
258
- `meta.pred_sky_masking` records how much each model's own sky removed;
259
- `metricSet.metadata` records whether an alignment was actually applied.
257
+ - Settings are recorded, not what they caused. `population.pred_sky_masking`
258
+ is the `--mask-sky-prediction` flag, and `method.pred_sky_mask` says whether
259
+ the prediction's `sky_mask` was loaded and scored with (filled at
260
+ `--sky-depth`, or excluded by `--mask-sky-prediction`). It is `false` for a
261
+ prediction without one, or an [experiment](configuration.md#experiments-section-optional)
262
+ that leaves it out. How much each model's own sky removed is in
263
+ `meta.pred_sky_masking`, and `metricSet.metadata` records whether an
264
+ alignment was actually applied.
260
265
  - Renaming or removing a key bumps the major `schemaVersion`; adding one bumps
261
266
  the minor version.
262
267