@@ -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
0 commit comments