diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs index 3cf0ec00..fc20695a 100644 --- a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresBaseTraces.cs @@ -480,4 +480,133 @@ internal static class BlsBaseTraces end Converged 6 3f800000 bf800000 bf800000 00000000 3dcccccd """, }; + + // The FreeViolated lines of the same cases: the free-set test is a decision the base took inline and did not record, so these + // are recorded at head. The decisions they feed (Miss, Stall, Kkt) are the base commit's above, and the structural test ties each line to them. + internal static readonly Dictionary FreeViolatedLines = new() + { + ["confirm-pass-1"] = """ + FreeViolated 1 4.191491598248831E-11 3.4029892871621996E-11 0 + """, + ["confirm-pass-2"] = """ + FreeViolated 0 9.329426120530115E-11 9.174025280630848E-11 0 + """, + ["noise-one-heavy"] = """ + FreeViolated 0 1.3877787807814457E-17 0 0 + FreeViolated 0 1.6046192152785466E-17 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 4.336808689942018E-19 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 1.3010426069826053E-18 0 0 + FreeViolated 5 4.336808689942018E-19 0 0 + FreeViolated 0 4.336808689942018E-19 0 0 + FreeViolated 5 2.168404344971009E-19 0 0 + """, + ["noise-one-light"] = """ + FreeViolated 0 5.684341886080802E-14 0 0 + FreeViolated 0 2.9753977059954195E-14 0 0 + FreeViolated 5 8.881784197001252E-16 0 0 + FreeViolated 0 3.9968028886505635E-15 0 0 + FreeViolated 5 2.220446049250313E-16 0 0 + FreeViolated 0 3.1086244689504383E-15 0 0 + FreeViolated 5 6.661338147750939E-16 0 0 + """, + ["noise-ascending"] = """ + FreeViolated 0 6.938893903907228E-17 0 0 + FreeViolated 0 2.6020852139652106E-18 0 0 + FreeViolated 5 1.1368683772161603E-13 0 0 + """, + ["below-noise-2"] = """ + FreeViolated 1 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 2 5.4569682106375694E-12 3.610817172344793E-14 0 + FreeViolated 3 7.275957614183426E-12 3.610817172344793E-14 0 + FreeViolated 4 1.4551915228366852E-11 3.610817172344793E-14 0 + FreeViolated 5 3.2741809263825417E-11 3.610817172344793E-14 0 + FreeViolated 6 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 7 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 10 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 11 1.4551915228366852E-11 3.610817172344793E-14 0 + FreeViolated 12 2.0372681319713593E-10 3.610817172344793E-14 0 + FreeViolated 14 3.637978807091713E-12 3.610817172344793E-14 0 + FreeViolated 15 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 16 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 17 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 18 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 19 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 20 7.275957614183426E-12 3.610817172344793E-14 0 + FreeViolated 21 1.1641532182693481E-10 3.610817172344793E-14 0 + FreeViolated 23 1.1641532182693481E-10 3.610817172344793E-14 0 + FreeViolated 0 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 1 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 2 5.4569682106375694E-12 3.610817172344793E-14 0 + FreeViolated 3 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 4 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 5 1.0913936421275139E-11 3.610817172344793E-14 0 + FreeViolated 7 4.3655745685100555E-11 3.610817172344793E-14 0 + FreeViolated 8 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 9 1.8189894035458565E-12 3.610817172344793E-14 0 + FreeViolated 10 2.1827872842550278E-11 3.610817172344793E-14 0 + FreeViolated 11 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 12 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 13 8.731149137020111E-11 3.610817172344793E-14 0 + FreeViolated 14 3.637978807091713E-12 3.610817172344793E-14 0 + FreeViolated 17 2.3283064365386963E-10 3.610817172344793E-14 0 + FreeViolated 18 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 19 2.9103830456733704E-11 3.610817172344793E-14 0 + FreeViolated 20 3.637978807091713E-11 3.610817172344793E-14 0 + FreeViolated 21 5.820766091346741E-11 3.610817172344793E-14 0 + FreeViolated 22 7.275957614183426E-11 3.610817172344793E-14 0 + FreeViolated 23 2.9103830456733704E-11 3.610817172344793E-14 0 + """, + ["below-noise-9"] = """ + FreeViolated 0 1.8189894035458565E-12 5.814784892130276E-14 0 + FreeViolated 1 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 2 4.001776687800884E-11 5.814784892130276E-14 0 + FreeViolated 3 8.731149137020111E-11 5.814784892130276E-14 0 + FreeViolated 4 5.093170329928398E-11 5.814784892130276E-14 0 + FreeViolated 5 1.8189894035458565E-12 5.814784892130276E-14 0 + FreeViolated 6 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 7 2.9103830456733704E-11 5.814784892130276E-14 0 + FreeViolated 8 1.382431946694851E-10 5.814784892130276E-14 0 + FreeViolated 9 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 10 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 11 6.184563972055912E-11 5.814784892130276E-14 0 + FreeViolated 12 1.3642420526593924E-11 5.814784892130276E-14 0 + FreeViolated 13 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 14 8.003553375601768E-11 5.814784892130276E-14 0 + FreeViolated 15 1.8189894035458565E-11 5.814784892130276E-14 0 + FreeViolated 16 7.275957614183426E-11 5.814784892130276E-14 0 + FreeViolated 17 6.548361852765083E-11 5.814784892130276E-14 0 + FreeViolated 18 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 19 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 20 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 21 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 22 3.637978807091713E-12 5.814784892130276E-14 0 + FreeViolated 23 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 0 1.000444171950221E-11 5.814784892130276E-14 0 + FreeViolated 1 1.2369127944111824E-10 5.814784892130276E-14 0 + FreeViolated 2 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 3 5.093170329928398E-11 5.814784892130276E-14 0 + FreeViolated 4 5.820766091346741E-11 5.814784892130276E-14 0 + FreeViolated 5 3.637978807091713E-12 5.814784892130276E-14 0 + FreeViolated 6 5.820766091346741E-11 5.814784892130276E-14 0 + FreeViolated 7 4.3655745685100555E-11 5.814784892130276E-14 0 + FreeViolated 8 1.4551915228366852E-10 5.814784892130276E-14 0 + FreeViolated 9 7.275957614183426E-12 5.814784892130276E-14 0 + FreeViolated 10 1.3096723705530167E-10 5.814784892130276E-14 0 + FreeViolated 11 5.4569682106375694E-11 5.814784892130276E-14 0 + FreeViolated 12 1.6370904631912708E-11 5.814784892130276E-14 0 + FreeViolated 13 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 14 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 15 2.1827872842550278E-11 5.814784892130276E-14 0 + FreeViolated 16 1.4551915228366852E-10 5.814784892130276E-14 0 + FreeViolated 17 3.637978807091713E-11 5.814784892130276E-14 0 + FreeViolated 18 8.003553375601768E-11 5.814784892130276E-14 0 + FreeViolated 19 7.275957614183426E-12 5.814784892130276E-14 0 + FreeViolated 20 2.9103830456733704E-11 5.814784892130276E-14 0 + FreeViolated 21 8.731149137020111E-11 5.814784892130276E-14 0 + FreeViolated 22 1.4551915228366852E-11 5.814784892130276E-14 0 + FreeViolated 23 1.0913936421275139E-10 5.814784892130276E-14 0 + """, + }; } diff --git a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs index c40ddce8..57b2f9f2 100644 --- a/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs +++ b/packages/cultmath/tests/CultMath.Tests/BoundedLeastSquaresTraceTests.cs @@ -23,7 +23,10 @@ public sealed class BoundedLeastSquaresTraceTests foreach (var c in BlsTrace.Cases()) { Assert.True(BlsBaseTraces.Expected.TryGetValue(c.Name, out var expected), $"{c.Name}: no base trace"); - Assert.Equal(Normal(expected!), WithoutFreeViolated(BlsTrace.Trace(c))); + var trace = BlsTrace.Trace(c); + Assert.Equal(Normal(expected!), WithoutFreeViolated(trace)); + var free = string.Join("\n", trace.Split('\n').Where(l => l.StartsWith("FreeViolated ", StringComparison.Ordinal))); + Assert.Equal(Normal(BlsBaseTraces.FreeViolatedLines.GetValueOrDefault(c.Name, "")), free); } Assert.Equal(BlsTrace.Cases().Count(), BlsBaseTraces.Expected.Count); }