Skip to content

Commit 174bb0f

Browse files
committed
fix: grid search tests
1 parent 7968364 commit 174bb0f

File tree

2 files changed

+117
-72
lines changed

2 files changed

+117
-72
lines changed

SignalSharp.Tests/Optimization/GridSearchOptimizerTests.cs

Lines changed: 116 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,14 @@ public async Task OptimizeAsync_NoParameters_ReturnsFailure()
5555
CancellationToken.None
5656
);
5757

58-
Assert.That(result.Success, Is.False);
59-
Assert.That(result.Message, Is.EqualTo("No parameters to optimize."));
60-
Assert.That(double.IsNaN(result.MinimizedMetric), Is.True);
61-
Assert.That(result.BestParameters, Is.Empty);
62-
Assert.That(result.FunctionEvaluations, Is.EqualTo(0));
58+
using (Assert.EnterMultipleScope())
59+
{
60+
Assert.That(result.Success, Is.False);
61+
Assert.That(result.Message, Is.EqualTo("No parameters to optimize."));
62+
Assert.That(double.IsNaN(result.MinimizedMetric), Is.True);
63+
Assert.That(result.BestParameters, Is.Empty);
64+
Assert.That(result.FunctionEvaluations, Is.EqualTo(0));
65+
}
6366
}
6467

6568
[Test]
@@ -76,10 +79,13 @@ public async Task OptimizeAsync_1D_Quadratic_FindsMinimum()
7679
CancellationToken.None
7780
);
7881

79-
Assert.That(result.Success, Is.True);
80-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
81-
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
82-
Assert.That(result.FunctionEvaluations, Is.EqualTo(11));
82+
using (Assert.EnterMultipleScope())
83+
{
84+
Assert.That(result.Success, Is.True);
85+
Assert.That(result.MinimizedMetric, Is.Zero.Within(Tolerance));
86+
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
87+
Assert.That(result.FunctionEvaluations, Is.EqualTo(11));
88+
}
8389
}
8490

8591
[Test]
@@ -96,11 +102,14 @@ public async Task OptimizeAsync_2D_Quadratic_FindsMinimum_Sequential()
96102
CancellationToken.None
97103
);
98104

99-
Assert.That(result.Success, Is.True);
100-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
101-
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
102-
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
103-
Assert.That(result.FunctionEvaluations, Is.EqualTo(36));
105+
using (Assert.EnterMultipleScope())
106+
{
107+
Assert.That(result.Success, Is.True);
108+
Assert.That(result.MinimizedMetric, Is.Zero.Within(Tolerance));
109+
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
110+
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
111+
Assert.That(result.FunctionEvaluations, Is.EqualTo(36));
112+
}
104113
}
105114

106115
[Test]
@@ -133,11 +142,14 @@ public async Task OptimizeAsync_AllEvaluationsFail_ReturnsFailureResult()
133142

134143
var result = await optimizer.OptimizeAsync(_testInputData, parameters, ObjectiveFunctions.ThrowingFunction, CancellationToken.None);
135144

136-
Assert.That(result.Success, Is.False);
137-
Assert.That(double.IsPositiveInfinity(result.MinimizedMetric), Is.True);
138-
Assert.That(result.BestParameters, Is.Empty);
139-
Assert.That(result.FunctionEvaluations, Is.EqualTo(3));
140-
Assert.That(result.Message, Does.Contain("Grid search optimization failed to find any valid parameters"));
145+
using (Assert.EnterMultipleScope())
146+
{
147+
Assert.That(result.Success, Is.False);
148+
Assert.That(double.IsPositiveInfinity(result.MinimizedMetric), Is.True);
149+
Assert.That(result.BestParameters, Is.Empty);
150+
Assert.That(result.FunctionEvaluations, Is.EqualTo(3));
151+
Assert.That(result.Message, Does.Contain("Grid search optimization failed to find any valid parameters"));
152+
}
141153
}
142154

143155
#endregion
@@ -162,11 +174,14 @@ public async Task OptimizeAsync_PerParameterGridSteps_OverridesDefault()
162174
CancellationToken.None
163175
);
164176

165-
Assert.That(result.Success, Is.True);
166-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.25).Within(Tolerance));
167-
Assert.That(result.BestParameters["x"], Is.EqualTo(2.5).Within(ParamTolerance));
168-
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
169-
Assert.That(result.FunctionEvaluations, Is.EqualTo(18));
177+
using (Assert.EnterMultipleScope())
178+
{
179+
Assert.That(result.Success, Is.True);
180+
Assert.That(result.MinimizedMetric, Is.EqualTo(0.25).Within(Tolerance));
181+
Assert.That(result.BestParameters["x"], Is.EqualTo(2.5).Within(ParamTolerance));
182+
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
183+
Assert.That(result.FunctionEvaluations, Is.EqualTo(18));
184+
}
170185
}
171186

172187
[Test]
@@ -183,10 +198,13 @@ public async Task OptimizeAsync_MaxFunctionEvaluations_LimitsEvaluations()
183198
CancellationToken.None
184199
);
185200

186-
Assert.That(result.Success, Is.True);
187-
Assert.That(result.FunctionEvaluations, Is.EqualTo(10));
188-
Assert.That(result.BestParameters.ContainsKey("x"), Is.True);
189-
Assert.That(result.BestParameters.ContainsKey("y"), Is.True);
201+
using (Assert.EnterMultipleScope())
202+
{
203+
Assert.That(result.Success, Is.True);
204+
Assert.That(result.FunctionEvaluations, Is.EqualTo(10));
205+
Assert.That(result.BestParameters.ContainsKey("x"), Is.True);
206+
Assert.That(result.BestParameters.ContainsKey("y"), Is.True);
207+
}
190208
}
191209

192210
[Test]
@@ -208,12 +226,15 @@ public async Task OptimizeAsync_EarlyStopping_StopsWhenThresholdReached()
208226
CancellationToken.None
209227
);
210228

211-
Assert.That(result.Success, Is.True);
212-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
213-
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
214-
Assert.That(result.BestParameters["y"], Is.EqualTo(2.0).Within(ParamTolerance));
215-
Assert.That(result.FunctionEvaluations, Is.LessThan(36));
216-
Assert.That(result.Message, Does.Contain("Grid search completed early due to reaching threshold."));
229+
using (Assert.EnterMultipleScope())
230+
{
231+
Assert.That(result.Success, Is.True);
232+
Assert.That(result.MinimizedMetric, Is.Zero.Within(Tolerance));
233+
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
234+
Assert.That(result.BestParameters["y"], Is.EqualTo(2.0).Within(ParamTolerance));
235+
Assert.That(result.FunctionEvaluations, Is.LessThan(36));
236+
Assert.That(result.Message, Does.Contain("Grid search completed early due to reaching threshold."));
237+
}
217238
}
218239

219240
#endregion
@@ -240,9 +261,12 @@ public async Task OptimizeAsync_LogarithmicScaling_ImprovesPrecisionForSmallValu
240261
var logOptimizer = new GridSearchOptimizer<TestInput, double>(logOptions, _logger);
241262
var logResult = await logOptimizer.OptimizeAsync(_testInputData, parameters, objectiveFunc, CancellationToken.None);
242263

243-
// Log scaling should get closer to the 0.01 target
244-
Assert.That(logResult.MinimizedMetric, Is.LessThan(linearResult.MinimizedMetric));
245-
Assert.That(Math.Abs(logResult.BestParameters["x"] - 0.01), Is.LessThan(Math.Abs(linearResult.BestParameters["x"] - 0.01)));
264+
using (Assert.EnterMultipleScope())
265+
{
266+
// Log scaling should get closer to the 0.01 target
267+
Assert.That(logResult.MinimizedMetric, Is.LessThan(linearResult.MinimizedMetric));
268+
Assert.That(Math.Abs(logResult.BestParameters["x"] - 0.01), Is.LessThan(Math.Abs(linearResult.BestParameters["x"] - 0.01)));
269+
}
246270
}
247271

248272
[Test]
@@ -259,8 +283,11 @@ public async Task OptimizeAsync_LogScaleWithInvalidBounds_FallsBackToLinear()
259283

260284
var result = await optimizer.OptimizeAsync(_testInputData, parameters, objectiveFunc, CancellationToken.None);
261285

262-
Assert.That(result.BestParameters["x"], Is.EqualTo(0.0).Within(ParamTolerance));
263-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0001).Within(Tolerance));
286+
using (Assert.EnterMultipleScope())
287+
{
288+
Assert.That(result.BestParameters["x"], Is.Zero.Within(ParamTolerance));
289+
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0001).Within(Tolerance));
290+
}
264291
}
265292

266293
#endregion
@@ -288,12 +315,15 @@ public async Task OptimizeAsync_AdaptiveRefinement_ImprovesSolution()
288315

289316
var result = await optimizer.OptimizeAsync(_testInputData, parameters, objectiveFunc, CancellationToken.None);
290317

291-
Assert.That(result.Success, Is.True);
292-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
293-
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
294-
Assert.That(result.BestParameters["y"], Is.EqualTo(targetY).Within(ParamTolerance));
295-
Assert.That(result.FunctionEvaluations, Is.EqualTo(36 + 25));
296-
Assert.That(result.Message, Does.Contain("Grid search with adaptive refinement completed successfully."));
318+
using (Assert.EnterMultipleScope())
319+
{
320+
Assert.That(result.Success, Is.True);
321+
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
322+
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
323+
Assert.That(result.BestParameters["y"], Is.EqualTo(targetY).Within(ParamTolerance));
324+
Assert.That(result.FunctionEvaluations, Is.EqualTo(36 + 25));
325+
Assert.That(result.Message, Does.Contain("Grid search with adaptive refinement completed successfully."));
326+
}
297327
}
298328

299329
[Test]
@@ -317,13 +347,16 @@ public async Task OptimizeAsync_AdaptiveRefinement_DoesNotImproveIfAlreadyOptima
317347

318348
var result = await optimizer.OptimizeAsync(_testInputData, parameters, objectiveFunc, CancellationToken.None);
319349

320-
Assert.That(result.Success, Is.True);
321-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
322-
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
323-
Assert.That(result.BestParameters["y"], Is.EqualTo(targetY).Within(ParamTolerance));
324-
Assert.That(result.FunctionEvaluations, Is.EqualTo(21 * 21 + 5 * 5));
325-
Assert.That(result.Message, Does.Contain("Grid search completed successfully."));
326-
Assert.That(result.Message, Does.Not.Contain("adaptive refinement completed successfully"));
350+
using (Assert.EnterMultipleScope())
351+
{
352+
Assert.That(result.Success, Is.True);
353+
Assert.That(result.MinimizedMetric, Is.EqualTo(0.0).Within(Tolerance));
354+
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
355+
Assert.That(result.BestParameters["y"], Is.EqualTo(targetY).Within(ParamTolerance));
356+
Assert.That(result.FunctionEvaluations, Is.EqualTo(21 * 21 + 5 * 5));
357+
Assert.That(result.Message, Does.Contain("Grid search completed successfully."));
358+
Assert.That(result.Message, Does.Not.Contain("adaptive refinement completed successfully"));
359+
}
327360
}
328361

329362
[Test]
@@ -347,12 +380,15 @@ public async Task OptimizeAsync_AdaptiveRefinement_InsufficientBudget_SkipsRefin
347380

348381
var result = await optimizer.OptimizeAsync(_testInputData, parameters, objectiveFunc, CancellationToken.None);
349382

350-
Assert.That(result.Success, Is.True);
351-
Assert.That(result.MinimizedMetric, Is.EqualTo(0.125).Within(Tolerance));
352-
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
353-
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
354-
Assert.That(result.FunctionEvaluations, Is.EqualTo(36));
355-
Assert.That(result.Message, Does.Not.Contain("adaptive refinement"));
383+
using (Assert.EnterMultipleScope())
384+
{
385+
Assert.That(result.Success, Is.True);
386+
Assert.That(result.MinimizedMetric, Is.EqualTo(0.125).Within(Tolerance));
387+
Assert.That(result.BestParameters["x"], Is.EqualTo(2.0).Within(ParamTolerance));
388+
Assert.That(result.BestParameters["y"], Is.EqualTo(3.0).Within(ParamTolerance));
389+
Assert.That(result.FunctionEvaluations, Is.EqualTo(36));
390+
Assert.That(result.Message, Does.Not.Contain("adaptive refinement"));
391+
}
356392
}
357393

358394
#endregion
@@ -373,10 +409,13 @@ public async Task OptimizeAsync_OptimumAtBoundary_IncludesWarningInResult()
373409
CancellationToken.None
374410
);
375411

376-
Assert.That(result.Success, Is.True);
377-
Assert.That(result.BestParameters["x"], Is.EqualTo(0.0).Within(ParamTolerance));
378-
Assert.That(result.Message, Does.Contain("Warning: The following parameters are at or near their bounds"));
379-
Assert.That(result.Message, Does.Contain("x (at lower bound, distance: 0.00%)"));
412+
using (Assert.EnterMultipleScope())
413+
{
414+
Assert.That(result.Success, Is.True);
415+
Assert.That(result.BestParameters["x"], Is.Zero.Within(ParamTolerance));
416+
Assert.That(result.Message, Does.Contain("Warning: The following parameters are at or near their bounds"));
417+
Assert.That(result.Message, Does.Contain("x (at lower bound, distance: 0.00"));
418+
}
380419
}
381420

382421
[Test]
@@ -394,10 +433,13 @@ public async Task OptimizeAsync_OptimumNearBoundary_IncludesWarningInResult()
394433
CancellationToken.None
395434
);
396435

397-
Assert.That(result.Success, Is.True);
398-
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
399-
Assert.That(result.Message, Does.Contain("Warning: The following parameters are at or near their bounds"));
400-
Assert.That(result.Message, Does.Contain("x (at lower bound"));
436+
using (Assert.EnterMultipleScope())
437+
{
438+
Assert.That(result.Success, Is.True);
439+
Assert.That(result.BestParameters["x"], Is.EqualTo(targetX).Within(ParamTolerance));
440+
Assert.That(result.Message, Does.Contain("Warning: The following parameters are at or near their bounds"));
441+
Assert.That(result.Message, Does.Contain("x (at lower bound"));
442+
}
401443
}
402444

403445
#endregion
@@ -430,11 +472,14 @@ public void OptimizeAsync_CancellationRequested_TerminatesGracefully()
430472
OptimizationResult<double> result = default;
431473
Assert.DoesNotThrowAsync(async () => result = await optimizer.OptimizeAsync(_testInputData, parameters, objectiveFuncWithCancel, cts.Token));
432474

433-
Assert.That(result, Is.Not.Null);
434-
Assert.That(result.Success, Is.True);
435-
Assert.That(result.MinimizedMetric, Is.Not.EqualTo(double.PositiveInfinity));
436-
Assert.That(result.FunctionEvaluations, Is.GreaterThan(0));
437-
Assert.That(result.FunctionEvaluations, Is.LessThan(options.DefaultGridSteps * options.DefaultGridSteps));
475+
using (Assert.EnterMultipleScope())
476+
{
477+
Assert.That(result, Is.Not.Null);
478+
Assert.That(result.Success, Is.True);
479+
Assert.That(result.MinimizedMetric, Is.Not.EqualTo(double.PositiveInfinity));
480+
Assert.That(result.FunctionEvaluations, Is.GreaterThan(0));
481+
Assert.That(result.FunctionEvaluations, Is.LessThan(options.DefaultGridSteps * options.DefaultGridSteps));
482+
}
438483
}
439484

440485
#endregion

SignalSharp/SignalSharp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<TargetFramework>net8.0</TargetFramework>
44
<ImplicitUsings>enable</ImplicitUsings>
55
<Nullable>enable</Nullable>
6-
<Version>0.1.9</Version>
6+
<Version>0.1.10</Version>
77
<Title>SignalSharp</Title>
88
<Authors>emmorts</Authors>
99
<Description>SignalSharp is a library designed for signal processing and time series analysis.</Description>

0 commit comments

Comments
 (0)