euler-eval 2.19.0__tar.gz → 2.20.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 (65) hide show
  1. {euler_eval-2.19.0 → euler_eval-2.20.0}/PKG-INFO +1 -1
  2. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/evaluate.py +9 -0
  3. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/sanity_checker.py +16 -4
  4. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/PKG-INFO +1 -1
  5. {euler_eval-2.19.0 → euler_eval-2.20.0}/pyproject.toml +1 -1
  6. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_points_3d.py +9 -0
  7. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_points_3d_sparse.py +16 -0
  8. {euler_eval-2.19.0 → euler_eval-2.20.0}/README.md +0 -0
  9. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/__init__.py +0 -0
  10. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/calibration.py +0 -0
  11. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/cli.py +0 -0
  12. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/config_paths.py +0 -0
  13. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/data.py +0 -0
  14. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/__init__.py +0 -0
  15. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/absrel.py +0 -0
  16. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/daniel_error.py +0 -0
  17. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/depth_binned_error.py +0 -0
  18. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/depth_edge_f1.py +0 -0
  19. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/depth_standard.py +0 -0
  20. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/fid_kid.py +0 -0
  21. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/gpu_depth_batch.py +0 -0
  22. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/gpu_image_batch.py +0 -0
  23. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/high_freq_energy.py +0 -0
  24. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/lpips_metric.py +0 -0
  25. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/normal_consistency.py +0 -0
  26. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/points3d_cloud.py +0 -0
  27. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/points3d_decomposition.py +0 -0
  28. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/points3d_distance.py +0 -0
  29. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/points3d_geometry.py +0 -0
  30. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/psnr.py +0 -0
  31. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/rgb_edge_f1.py +0 -0
  32. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/rgb_lpips.py +0 -0
  33. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/rgb_psnr_ssim.py +0 -0
  34. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/rho_a.py +0 -0
  35. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/rmse.py +0 -0
  36. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/scale_invariant_log.py +0 -0
  37. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/ssim.py +0 -0
  38. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/tail_errors.py +0 -0
  39. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/metrics/utils.py +0 -0
  40. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/utils/hierarchy_parser.py +0 -0
  41. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval/validation.py +0 -0
  42. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/SOURCES.txt +0 -0
  43. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/dependency_links.txt +0 -0
  44. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/entry_points.txt +0 -0
  45. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/requires.txt +0 -0
  46. {euler_eval-2.19.0 → euler_eval-2.20.0}/euler_eval.egg-info/top_level.txt +0 -0
  47. {euler_eval-2.19.0 → euler_eval-2.20.0}/init_cache.py +0 -0
  48. {euler_eval-2.19.0 → euler_eval-2.20.0}/setup.cfg +0 -0
  49. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_alignment.py +0 -0
  50. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_cli_device.py +0 -0
  51. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_config.py +0 -0
  52. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_data.py +0 -0
  53. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_data_builders.py +0 -0
  54. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_depth_alignment_output.py +0 -0
  55. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_depth_standard.py +0 -0
  56. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_evaluate_helpers.py +0 -0
  57. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_init_cache.py +0 -0
  58. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_integration.py +0 -0
  59. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_meta_output.py +0 -0
  60. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_metrics_utils.py +0 -0
  61. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_rgb_fid_output.py +0 -0
  62. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_rho_a.py +0 -0
  63. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_save_results.py +0 -0
  64. {euler_eval-2.19.0 → euler_eval-2.20.0}/tests/test_sparse_depth.py +0 -0
  65. {euler_eval-2.19.0 → euler_eval-2.20.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.19.0
3
+ Version: 2.20.0
4
4
  Summary: Depth map evaluation toolkit with comprehensive metrics
5
5
  Author: Depth Eval Contributors
6
6
  License: MIT
@@ -3829,6 +3829,15 @@ def evaluate_points_3d_sparse_samples(
3829
3829
  pred_ok_native = pred_ok_native & sky_valid
3830
3830
  pred_ok_metric = pred_ok_metric & sky_valid
3831
3831
 
3832
+ if sanity_checker is not None:
3833
+ # Keep the sanity-check sample accounting consistent with
3834
+ # the dense points_3d evaluator. Metric validation below
3835
+ # may add warnings, but sample counting belongs to input
3836
+ # validation so each evaluated pair is counted once.
3837
+ sanity_checker.validate_points_3d_input(
3838
+ pred_map_native, gt_point_map, entry_id
3839
+ )
3840
+
3832
3841
  # Native correspondence mask drives the shared angular metrics.
3833
3842
  native_corr = gt_valid & pred_ok_native
3834
3843
  total_evaluated_points += int(native_corr.sum())
@@ -1119,7 +1119,10 @@ class SanityChecker:
1119
1119
  print("-" * 70)
1120
1120
 
1121
1121
  for key, info in depth_report["warnings_by_type"].items():
1122
- ratio = info["count"] / depth_report["total_samples"]
1122
+ ratio = (
1123
+ info["count"] / depth_report["total_samples"]
1124
+ if depth_report["total_samples"] > 0 else 0
1125
+ )
1123
1126
  print(f"\n {info['metric']} - {info['type']}:")
1124
1127
  print(f" Occurrences: {info['count']}/{depth_report['total_samples']} ({ratio*100:.1f}%)")
1125
1128
  print(f" {info['message']}")
@@ -1134,7 +1137,10 @@ class SanityChecker:
1134
1137
  print("-" * 70)
1135
1138
 
1136
1139
  for key, info in rgb_report["warnings_by_type"].items():
1137
- ratio = info["count"] / rgb_report["total_samples"]
1140
+ ratio = (
1141
+ info["count"] / rgb_report["total_samples"]
1142
+ if rgb_report["total_samples"] > 0 else 0
1143
+ )
1138
1144
  print(f"\n {info['metric']} - {info['type']}:")
1139
1145
  print(f" Occurrences: {info['count']}/{rgb_report['total_samples']} ({ratio*100:.1f}%)")
1140
1146
  print(f" {info['message']}")
@@ -1149,7 +1155,10 @@ class SanityChecker:
1149
1155
  print("-" * 70)
1150
1156
 
1151
1157
  for key, info in rays_report["warnings_by_type"].items():
1152
- ratio = info["count"] / rays_report["total_samples"]
1158
+ ratio = (
1159
+ info["count"] / rays_report["total_samples"]
1160
+ if rays_report["total_samples"] > 0 else 0
1161
+ )
1153
1162
  print(f"\n {info['metric']} - {info['type']}:")
1154
1163
  print(f" Occurrences: {info['count']}/{rays_report['total_samples']} ({ratio*100:.1f}%)")
1155
1164
  print(f" {info['message']}")
@@ -1164,7 +1173,10 @@ class SanityChecker:
1164
1173
  print("-" * 70)
1165
1174
 
1166
1175
  for key, info in points_3d_report["warnings_by_type"].items():
1167
- ratio = info["count"] / points_3d_report["total_samples"]
1176
+ ratio = (
1177
+ info["count"] / points_3d_report["total_samples"]
1178
+ if points_3d_report["total_samples"] > 0 else 0
1179
+ )
1168
1180
  print(f"\n {info['metric']} - {info['type']}:")
1169
1181
  print(f" Occurrences: {info['count']}/{points_3d_report['total_samples']} ({ratio*100:.1f}%)")
1170
1182
  print(f" {info['message']}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euler-eval
3
- Version: 2.19.0
3
+ Version: 2.20.0
4
4
  Summary: Depth map evaluation toolkit with comprehensive metrics
5
5
  Author: Depth Eval Contributors
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "euler-eval"
7
- version = "2.19.0"
7
+ version = "2.20.0"
8
8
  description = "Depth map evaluation toolkit with comprehensive metrics"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -485,6 +485,15 @@ class TestSanity:
485
485
  assert "camera_dominated_error" in types
486
486
  assert "rho_a_too_low" in types
487
487
 
488
+ def test_report_handles_metric_warning_without_counted_input(self, capsys):
489
+ sc = self._checker()
490
+ sc.validate_points_3d_metrics(lateral_fraction=0.95, file_id="f0")
491
+
492
+ sc.print_report()
493
+
494
+ output = capsys.readouterr().out
495
+ assert "Occurrences: 1/0 (0.0%)" in output
496
+
488
497
  def test_full_report_includes_points_3d(self):
489
498
  sc = self._checker()
490
499
  assert "points_3d" in sc.get_full_report()
@@ -20,6 +20,7 @@ from euler_eval.data import (
20
20
  )
21
21
  from euler_eval.evaluate import evaluate_points_3d_sparse_samples
22
22
  from euler_eval.metrics import compute_sparse_cloud_distance_metrics
23
+ from euler_eval.sanity_checker import SanityChecker
23
24
 
24
25
 
25
26
  def _rot_z(theta):
@@ -91,6 +92,21 @@ def _perfect_dataset(seed=0, **kwargs):
91
92
  return _SparsePointDataset(cloud, depth, K, **kwargs), depth, K, cloud
92
93
 
93
94
 
95
+ def test_sparse_evaluation_counts_sanity_check_samples():
96
+ dataset, _, _, _ = _perfect_dataset()
97
+ sanity_checker = SanityChecker()
98
+
99
+ evaluate_points_3d_sparse_samples(
100
+ dataset,
101
+ pred_is_radial=False,
102
+ num_workers=0,
103
+ sanity_checker=sanity_checker,
104
+ alignment_mode="none",
105
+ )
106
+
107
+ assert sanity_checker.get_points_3d_report()["total_samples"] == 1
108
+
109
+
94
110
  # ---------------------------------------------------------------------------
95
111
  # Directed (sparse) cloud distance
96
112
  # ---------------------------------------------------------------------------
File without changes
File without changes
File without changes