3 Commits
Author SHA1 Message Date
facok 3fec154341 Refactor: extract shared _hue_lerp and _wrap_hue_diff helpers
- Add _wrap_hue_diff() and _hue_lerp() to core/color_space.py for
  reuse across the codebase
- Remove duplicate _hue_lerp from nodes/intervene.py, import from core
- Update diagnostics.py to use shared _hue_lerp instead of inline logic
- Move input_var computation outside strength loop in test_type_ii_uniformity
- Move get_alpha_beta_t50() outside sigma loop in test_early_timestep_amplification
2026-03-19 18:14:13 +08:00
facok b8834564e2 Refactor: extract _bicone_factor helper and clean up diagnostics
- Extract repeated bicone factor formula (1 - |2L - 1|) into _bicone_factor()
  helper function, used in 4 places across color_space.py
- Optimize test_type_ii_uniformity: move decode outside strength loop
- Add named constants for test parameters in diagnostics.py
- Remove unused imports and variables
2026-03-19 15:47:20 +08:00
facok 651599b003 Fix bicone geometry: normalize chroma radii to equatorial
The chromatic anchors (R,G,B,C,M,Y) have different lightness levels
(L=0.38-0.63), so their observed chroma radii are already scaled by
the bicone factor (1 - |2L - 1|). The old code double-counted this
factor, causing round-trip errors of 10-12 units and color distortion.

Fix: In _hue_to_chroma_vector, normalize anchor radii to equatorial
(radius at L=0.5) before interpolation. During encode/decode, apply
bicone factor at target lightness. This ensures proper round-trip:
- encode(lcs) → hsl → encode(hsl) ≈ lcs with error < 1e-5
- Saturation now correctly returns 1.0 for saturated anchor colors

Also add diagnostics module for blurriness analysis:
- test_round_trip_consistency: verify bicone math
- test_normalization_stability: check timestep amplification
- test_type_ii_uniformity: measure variance loss at different strengths
- analyze_blurriness_causes: comprehensive diagnostic report
2026-03-19 13:21:12 +08:00