diff --git a/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs b/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs index 4075e953..78a3b795 100644 --- a/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs @@ -938,7 +938,7 @@ public sealed class NoiseBoundTests /// empty (its upper density 0) must be proved empty gated too. A gate that errs toward giving up /// (the reach inflated, a gradient or Hessian term overstated) loosens the bound exactly there and /// costs only culling, which no enclosure test sees; a gate that errs the other way only costs probes, - /// which the cost contract (IntervalSkipHalvesEvaluations) sees. Over seeded slices of both wells at + /// which the cost contract (IntervalSkipHalvesEvaluations) sees. Over seeded slices of both wells and the fog interior at /// warp 0 and the Aetheria warp, N = 8, in both modes, no slice the ungated bound proves empty is /// left open by the gated one, and at least 200 are proved empty. /// @@ -949,7 +949,7 @@ public sealed class NoiseBoundTests var (proved, lost) = (0, new List()); foreach (var mode in new[] { BoundMode.Interval, BoundMode.Affine }) foreach (var warp in new[] { 0.0f, FogField.AetheriaWarp }) - foreach (var field in new[] { FogField.DeepWell(warp, mode), FogField.Wells(warp, mode) }) + foreach (var field in new[] { FogField.DeepWell(warp, mode), FogField.Wells(warp, mode), FogField.InsideFog(warp, mode) }) for (var t = 0; t < 1500; t++) { var tile = field.DrawTile(random, 8); @@ -1796,11 +1796,6 @@ public sealed class NoiseBoundTests return low ? new float2(-1.0f, min(-1.0f + e, 1.0f)) : new float2(max(1.0f - e, -1.0f), 1.0f); } - // The affine gate takes the detail octave at its full range: its best-case ball never decided a probe - // on the gate test's slices or the deep wells, and a gate that skips it proves the same slices with - // fewer probes. (The interval gate keeps its detail ball: inside the fog, row (b), it decides.) - private static readonly float2 DetailRange = new(-0.5f, 0.5f); - private static float2 Clip(float2 range) => new(max(range.x, -1.0f), min(range.y, 1.0f)); /// @@ -1823,7 +1818,7 @@ public sealed class NoiseBoundTests foreach (var low in new[] { true, false }) { var coverage = Noise.CoverageBound(BestForm(slice.Coverage0.Reach, low), BestForm(slice.Coverage1.Reach, low), tile.Time); - provable |= Compose(s, fade, iv_add(coverage, DetailRange)).y <= 0.0f; + provable |= Compose(s, fade, iv_add(coverage, iv_scale(BestForm(slice.Detail.Reach, low), 0.5f))).y <= 0.0f; } if (!provable)