euler-preprocess 3.8.0__tar.gz → 3.9.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 (61) hide show
  1. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/PKG-INFO +1 -1
  2. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/PKG-INFO +1 -1
  3. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/pyproject.toml +1 -1
  4. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_dense_gloomy_daylight_config.py +8 -1
  5. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_real_drive_sim_scenario_profiles.py +21 -7
  6. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/MANIFEST.in +0 -0
  7. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/README.md +0 -0
  8. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/__init__.py +0 -0
  9. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/cli.py +0 -0
  10. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/__init__.py +0 -0
  11. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/color.py +0 -0
  12. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/dataset.py +0 -0
  13. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/device.py +0 -0
  14. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/intrinsics.py +0 -0
  15. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/io.py +0 -0
  16. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/logging.py +0 -0
  17. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/noise.py +0 -0
  18. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/normalize.py +0 -0
  19. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/output.py +0 -0
  20. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/sampling.py +0 -0
  21. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/common/transform.py +0 -0
  22. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/__init__.py +0 -0
  23. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/airlight_from_sky.py +0 -0
  24. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/atmospheric_light.py +0 -0
  25. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/augmentations.py +0 -0
  26. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/capture.py +0 -0
  27. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/dcp_airlight.py +0 -0
  28. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/dcp_airlight_torch.py +0 -0
  29. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/dcp_heuristic_airlight.py +0 -0
  30. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/dcp_heuristic_airlight_torch.py +0 -0
  31. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/foggify.py +0 -0
  32. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/foggify_logging.py +0 -0
  33. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/inference.py +0 -0
  34. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/logging.py +0 -0
  35. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/models.py +0 -0
  36. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/pipeline.py +0 -0
  37. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/fog/transform.py +0 -0
  38. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/radial/__init__.py +0 -0
  39. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/radial/transform.py +0 -0
  40. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/sky_depth/__init__.py +0 -0
  41. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess/sky_depth/transform.py +0 -0
  42. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/SOURCES.txt +0 -0
  43. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/dependency_links.txt +0 -0
  44. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/entry_points.txt +0 -0
  45. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/requires.txt +0 -0
  46. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/euler_preprocess.egg-info/top_level.txt +0 -0
  47. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/setup.cfg +0 -0
  48. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_airlight_fallback.py +0 -0
  49. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_cli_sample_selection.py +0 -0
  50. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_dcp_heuristic_airlight.py +0 -0
  51. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_fog_aux_outputs.py +0 -0
  52. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_fog_aware_auto_exposure.py +0 -0
  53. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_fog_cpu_gpu_parity.py +0 -0
  54. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_foggify_integration.py +0 -0
  55. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_radial.py +0 -0
  56. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_scene_illumination.py +0 -0
  57. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_sensor_identity.py +0 -0
  58. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_sky_depth.py +0 -0
  59. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_source_backed_output.py +0 -0
  60. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_tone_map_lut.py +0 -0
  61. {euler_preprocess-3.8.0 → euler_preprocess-3.9.0}/tests/test_zip_output.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euler-preprocess
3
- Version: 3.8.0
3
+ Version: 3.9.0
4
4
  Summary: Physics-based preprocessing (fog, etc.) for RGB+depth datasets
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euler-preprocess
3
- Version: 3.8.0
3
+ Version: 3.9.0
4
4
  Summary: Physics-based preprocessing (fog, etc.) for RGB+depth datasets
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "euler-preprocess"
3
- version = "3.8.0"
3
+ version = "3.9.0"
4
4
  description = "Physics-based preprocessing (fog, etc.) for RGB+depth datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -54,7 +54,7 @@ def test_dense_gloomy_daylight_config_activates_realism_stack() -> None:
54
54
  assert profile["isp"]["tone_map_lut_domain"] == "linear"
55
55
  assert len(profile["isp"]["tone_map_lut"]) >= 2
56
56
 
57
- assert config["scenario_profiles"]
57
+ assert len(config["scenario_profiles"]) == 6
58
58
  clear = _profile_by_name(
59
59
  config["scenario_profiles"],
60
60
  "clear_weather_camera_reference",
@@ -62,6 +62,13 @@ def test_dense_gloomy_daylight_config_activates_realism_stack() -> None:
62
62
  assert clear["clear_weather"] is True
63
63
  assert clear["weight"] == 0.1
64
64
  assert clear["model"] == "uniform"
65
+ high_visibility = _profile_by_name(
66
+ config["scenario_profiles"],
67
+ "clear_high_visibility_daylight_reference",
68
+ )
69
+ assert high_visibility.get("clear_weather", False) is False
70
+ assert high_visibility["weight"] == 0.09
71
+ assert high_visibility["model"] == "heterogeneous_k_ls"
65
72
  assert sum(scenario["weight"] for scenario in config["scenario_profiles"]) == 1.0
66
73
  underexposed_condition = _profile_by_name(
67
74
  profile["sensor"]["condition_profiles"],
@@ -33,6 +33,7 @@ DEFAULT_RDS_SAMPLE_ZIP = (
33
33
  RDS_CONFIG_PATH = Path("configs/dense_gloomy_daylight_fog_camera.json")
34
34
  SCENARIO_ORDER = (
35
35
  "clear_weather_camera_reference",
36
+ "clear_high_visibility_daylight_reference",
36
37
  "light_haze_soft_overcast",
37
38
  "moderate_gloomy_fog_nominal_camera",
38
39
  "underexposed_dense_gloom",
@@ -137,10 +138,17 @@ def test_dense_gloomy_scenario_profiles_render_real_drive_sim_samples(
137
138
  for sample in rds_samples:
138
139
  metrics = _render_scenario_metrics(transform, sample)
139
140
 
140
- opacity_by_scenario = [
141
- metrics[name]["opacity_mean"] for name in SCENARIO_ORDER
142
- ]
143
- assert opacity_by_scenario == sorted(opacity_by_scenario)
141
+ clear_metrics = metrics["clear_weather_camera_reference"]
142
+ assert clear_metrics["beta"] == 0.0
143
+ assert clear_metrics["opacity_mean"] == 0.0
144
+ assert clear_metrics["opacity_p95"] == 0.0
145
+ fog_profiles = SCENARIO_ORDER[1:]
146
+ assert all(metrics[name]["opacity_mean"] > 0.0 for name in fog_profiles)
147
+ # Adjacent fog profiles intentionally have overlapping distributions,
148
+ # so sampled opacity need not be strictly ordered for every image.
149
+ assert metrics["severe_low_contrast_sensor_stress"]["opacity_mean"] > (
150
+ metrics["clear_high_visibility_daylight_reference"]["opacity_mean"]
151
+ )
144
152
  assert metrics["severe_low_contrast_sensor_stress"]["opacity_mean"] > (
145
153
  metrics["clear_weather_camera_reference"]["opacity_mean"] + 0.25
146
154
  )
@@ -151,7 +159,7 @@ def test_dense_gloomy_scenario_profiles_render_real_drive_sim_samples(
151
159
  assert metrics["severe_low_contrast_sensor_stress"]["luma_mean"] < (
152
160
  metrics["clear_weather_camera_reference"]["luma_mean"] * 0.65
153
161
  )
154
- chromatically_bounded_profiles = SCENARIO_ORDER[:3]
162
+ chromatically_bounded_profiles = SCENARIO_ORDER[:4]
155
163
  assert all(
156
164
  0.75 <= metrics[name]["blue_red_ratio"] <= 1.65
157
165
  for name in chromatically_bounded_profiles
@@ -164,7 +172,7 @@ def test_dense_gloomy_scenario_profiles_render_real_drive_sim_samples(
164
172
  assert metrics["underexposed_dense_gloom"]["blue_red_ratio"] <= 2.5, {
165
173
  sample["id"]: metrics
166
174
  }
167
- stress_profiles = SCENARIO_ORDER[3:]
175
+ stress_profiles = SCENARIO_ORDER[4:]
168
176
  assert all(
169
177
  metrics[name]["blue_minus_red_mean"] <= 0.1 for name in stress_profiles
170
178
  ), {sample["id"]: metrics}
@@ -328,7 +336,12 @@ def _render_profile(
328
336
  profile: dict[str, Any],
329
337
  scenario_index: int,
330
338
  ):
331
- rng = np.random.default_rng(np.random.SeedSequence([1337, scenario_index, 1]))
339
+ # Keep the original five profiles on their historical deterministic seeds
340
+ # when the new clear-weather profile is inserted at the front.
341
+ stable_scenario_index = max(0, scenario_index - 1)
342
+ rng = np.random.default_rng(
343
+ np.random.SeedSequence([1337, stable_scenario_index, 1])
344
+ )
332
345
  plan = transform._resolve_render_plan(
333
346
  rng,
334
347
  scenario=profile,
@@ -346,6 +359,7 @@ def _render_profile(
346
359
  intrinsics=sample["intrinsics"]["intrinsics"],
347
360
  airlight_method=plan.airlight_method,
348
361
  capture_artifacts=plan.capture_artifacts,
362
+ clear_weather=plan.clear_weather,
349
363
  )
350
364
 
351
365