refactor(constants): centralize magic constants from functionals (N4/N6 audit)
- Add LOG_EDGE_LENGTH_FLOOR (-30.0) for degenerate edge handling - Add HYPER_IDEAL_SCALE_FLOOR (0.01) for negative-scale clamping - Add ASIN_DOMAIN_GUARD (1.0 - 1e-15) for asin argument bounding - Each constant is documented with rationale and units - Update 4 usage sites: euclidean_functional, hyper_ideal_functional, spherical_functional, spherical_geometry - Add constants.hpp include to hyper_ideal_functional and spherical_functional 282/282 tests pass. Addresses N4 (unnamed magic constants) and N6 (centralize tolerances) from numerical-stability audit. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,4 +17,21 @@ constexpr double PI = 3.14159265358979323846264338328;
|
||||
/// 2π (full turn).
|
||||
constexpr double TWO_PI = 2.0 * PI;
|
||||
|
||||
// ── Numerical thresholds and bounds (N4/N6 audit) ──────────────────────────
|
||||
|
||||
/// Edge length floor for log-scale functionals (euclidean_functional, spherical_functional).
|
||||
/// exp(-30.0) ≈ 3e-7: edges below this length are treated as degenerate/zero.
|
||||
/// Rationale: avoids log(tiny) overflow and enforces a minimum edge scale.
|
||||
constexpr double LOG_EDGE_LENGTH_FLOOR = -30.0;
|
||||
|
||||
/// Hyper-ideal scale factor lower bound (hyper_ideal_functional:179-181).
|
||||
/// If b (scale) becomes negative (infeasible), clamp to 0.01 to keep geometry valid.
|
||||
/// Rationale: ensures b > 0 maintains the Lorentzian model's causal structure.
|
||||
constexpr double HYPER_IDEAL_SCALE_FLOOR = 0.01;
|
||||
|
||||
/// Domain guard for asin in spherical_l (spherical_geometry:34).
|
||||
/// Clamps exp(λ/2) to slightly below 1.0 so asin stays in [−π/2, π/2].
|
||||
/// Rationale: asin(x) is undefined for |x| > 1; this prevents IEEE Inf/NaN.
|
||||
constexpr double ASIN_DOMAIN_GUARD = 1.0 - 1e-15;
|
||||
|
||||
} // namespace conformallab
|
||||
|
||||
Reference in New Issue
Block a user