@@ -213,104 +213,90 @@ using Preferences
213213
214214
215215
216- @testset " Different Algorithm for Every Size Category Test" begin
217- # Test with different algorithm preferences for every size category
218- # and verify it chooses the right one at each size
216+ @testset " RFLU vs GenericLU Size Category Verification" begin
217+ # Test by setting one size to RFLU and all others to GenericLU
218+ # Rotate through each size category to verify preferences work correctly
219+
220+ # Test cases: one size gets RFLU, others get GenericLU
221+ rflu_test_scenarios = [
222+ # (rflu_size, rflu_category, test_sizes_with_categories)
223+ (15 , " tiny" , [(50 , " small" ), (200 , " medium" ), (500 , " large" ), (1500 , " big" )]),
224+ (50 , " small" , [(15 , " tiny" ), (200 , " medium" ), (500 , " large" ), (1500 , " big" )]),
225+ (200 , " medium" , [(15 , " tiny" ), (50 , " small" ), (500 , " large" ), (1500 , " big" )]),
226+ (500 , " large" , [(15 , " tiny" ), (50 , " small" ), (200 , " medium" ), (1500 , " big" )]),
227+ (1500 , " big" , [(15 , " tiny" ), (50 , " small" ), (200 , " medium" ), (500 , " large" )])
228+ ]
219229
220- # Clear all preferences first
221- for eltype in target_eltypes
222- for size_cat in size_categories
223- for pref_type in [" best_algorithm" , " best_always_loaded" ]
224- pref_key = " $(pref_type) _$(eltype) _$(size_cat) "
225- if Preferences. has_preference (LinearSolve, pref_key)
226- Preferences. delete_preferences! (LinearSolve, pref_key; force = true )
230+ for (rflu_size, rflu_category, other_test_sizes) in rflu_test_scenarios
231+ println (" Testing RFLU at $(rflu_category) category (size $(rflu_size) )" )
232+
233+ # Clear all preferences
234+ for eltype in target_eltypes
235+ for size_cat in size_categories
236+ for pref_type in [" best_algorithm" , " best_always_loaded" ]
237+ pref_key = " $(pref_type) _$(eltype) _$(size_cat) "
238+ if Preferences. has_preference (LinearSolve, pref_key)
239+ Preferences. delete_preferences! (LinearSolve, pref_key; force = true )
240+ end
227241 end
228242 end
229243 end
230- end
231-
232- # Set different algorithms for each size category
233- size_algorithm_map = [
234- (" tiny" , " GenericLUFactorization" ),
235- (" small" , " RFLUFactorization" ),
236- (" medium" , " AppleAccelerateLUFactorization" ),
237- (" large" , " MKLLUFactorization" ),
238- (" big" , " LUFactorization" )
239- ]
240-
241- # Set preferences for each size category
242- for (size_cat, algorithm) in size_algorithm_map
243- Preferences. set_preferences! (LinearSolve, " best_algorithm_Float64_$(size_cat) " => algorithm; force = true )
244- Preferences. set_preferences! (LinearSolve, " best_always_loaded_Float64_$(size_cat) " => algorithm; force = true )
245- end
246-
247- # Test sizes that should land in each category (testing mode enabled at test start)
248- test_cases = [
249- # (test_size, expected_category, expected_algorithm)
250- (15 , " tiny" , LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization),
251- (80 , " small" , LinearSolve. DefaultAlgorithmChoice. RFLUFactorization),
252- (200 , " medium" , LinearSolve. DefaultAlgorithmChoice. AppleAccelerateLUFactorization),
253- (500 , " large" , LinearSolve. DefaultAlgorithmChoice. MKLLUFactorization),
254- (1500 , " big" , LinearSolve. DefaultAlgorithmChoice. LUFactorization)
255- ]
256-
257- for (test_size, expected_category, expected_algorithm) in test_cases
258- println (" Testing size $(test_size) → $(expected_category) category" )
259244
260- A = rand (Float64, test_size, test_size) + I (test_size)
261- b = rand (Float64, test_size)
245+ # Set RFLU for the target category
246+ Preferences. set_preferences! (LinearSolve, " best_algorithm_Float64_$(rflu_category) " => " RFLUFactorization" ; force = true )
247+ Preferences. set_preferences! (LinearSolve, " best_always_loaded_Float64_$(rflu_category) " => " RFLUFactorization" ; force = true )
262248
263- chosen_alg = LinearSolve. defaultalg (A, b, LinearSolve. OperatorAssumptions (true ))
264-
265- if test_size <= 10
266- # Tiny override should always choose GenericLU regardless of preferences
267- @test chosen_alg. alg === LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization
268- println (" ✅ Tiny override correctly chose GenericLU" )
269- else
270- # Test that it chooses the expected algorithm when preference system is active
271- @test chosen_alg. alg === expected_algorithm
272- println (" ✅ Size $(test_size) chose: $(chosen_alg. alg) (expected: $(expected_algorithm) )" )
249+ # Set GenericLU for all other categories
250+ for other_category in size_categories
251+ if other_category != rflu_category
252+ Preferences. set_preferences! (LinearSolve, " best_algorithm_Float64_$(other_category) " => " GenericLUFactorization" ; force = true )
253+ Preferences. set_preferences! (LinearSolve, " best_always_loaded_Float64_$(other_category) " => " GenericLUFactorization" ; force = true )
254+ end
273255 end
274256
275- # Test that the problem can be solved
276- prob = LinearProblem (A, b)
277- sol = solve (prob)
278- @test sol. retcode == ReturnCode. Success
279- @test norm (A * sol. u - b) < (test_size <= 10 ? 1e-12 : 1e-8 )
280- end
281-
282- # Additional boundary testing
283- boundary_test_cases = [
284- # Test exact boundaries
285- (20 , " tiny" , LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization), # At tiny boundary
286- (21 , " small" , LinearSolve. DefaultAlgorithmChoice. RFLUFactorization), # Start of small
287- (100 , " small" , LinearSolve. DefaultAlgorithmChoice. RFLUFactorization), # End of small
288- (101 , " medium" , LinearSolve. DefaultAlgorithmChoice. AppleAccelerateLUFactorization), # Start of medium
289- (300 , " medium" , LinearSolve. DefaultAlgorithmChoice. AppleAccelerateLUFactorization), # End of medium
290- (301 , " large" , LinearSolve. DefaultAlgorithmChoice. MKLLUFactorization), # Start of large
291- (1000 , " large" , LinearSolve. DefaultAlgorithmChoice. MKLLUFactorization), # End of large
292- (1001 , " big" , LinearSolve. DefaultAlgorithmChoice. LUFactorization) # Start of big
293- ]
294-
295- for (boundary_size, boundary_category, boundary_expected) in boundary_test_cases
296- A_boundary = rand (Float64, boundary_size, boundary_size) + I (boundary_size)
297- b_boundary = rand (Float64, boundary_size)
298-
299- chosen_boundary = LinearSolve. defaultalg (A_boundary, b_boundary, LinearSolve. OperatorAssumptions (true ))
257+ # Test the RFLU size
258+ A_rflu = rand (Float64, rflu_size, rflu_size) + I (rflu_size)
259+ b_rflu = rand (Float64, rflu_size)
260+ chosen_rflu = LinearSolve. defaultalg (A_rflu, b_rflu, LinearSolve. OperatorAssumptions (true ))
300261
301- if boundary_size <= 10
302- @test chosen_boundary. alg === LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization
262+ if rflu_size <= 10
263+ # Tiny override should always choose GenericLU
264+ @test chosen_rflu. alg === LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization
265+ println (" ✅ Tiny override: size $(rflu_size) chose GenericLU (as expected)" )
303266 else
304- # Test that it matches expected algorithm for the boundary
305- @test chosen_boundary. alg === boundary_expected
306- println (" Boundary $(boundary_size) ($(boundary_category) ) chose: $(chosen_boundary. alg) " )
267+ # Should choose RFLU based on preference
268+ @test chosen_rflu. alg === LinearSolve. DefaultAlgorithmChoice. RFLUFactorization
269+ println (" ✅ RFLU preference: size $(rflu_size) chose RFLUFactorization" )
270+ end
271+
272+ # Test other sizes should choose GenericLU
273+ for (other_size, other_category) in other_test_sizes
274+ A_other = rand (Float64, other_size, other_size) + I (other_size)
275+ b_other = rand (Float64, other_size)
276+ chosen_other = LinearSolve. defaultalg (A_other, b_other, LinearSolve. OperatorAssumptions (true ))
277+
278+ if other_size <= 10
279+ # Tiny override
280+ @test chosen_other. alg === LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization
281+ println (" ✅ Tiny override: size $(other_size) chose GenericLU" )
282+ else
283+ # Should choose GenericLU based on preference
284+ @test chosen_other. alg === LinearSolve. DefaultAlgorithmChoice. GenericLUFactorization
285+ println (" ✅ GenericLU preference: size $(other_size) chose GenericLUFactorization" )
286+ end
287+
288+ # Test that problems solve
289+ prob_other = LinearProblem (A_other, b_other)
290+ sol_other = solve (prob_other)
291+ @test sol_other. retcode == ReturnCode. Success
292+ @test norm (A_other * sol_other. u - b_other) < (other_size <= 10 ? 1e-12 : 1e-8 )
307293 end
308294
309- # Test that boundary cases solve correctly
310- prob_boundary = LinearProblem (A_boundary, b_boundary )
311- sol_boundary = solve (prob_boundary )
312- @test sol_boundary . retcode == ReturnCode. Success
313- @test norm (A_boundary * sol_boundary . u - b_boundary ) < (boundary_size <= 10 ? 1e-12 : 1e-8 )
295+ # Test that RFLU size problem solves
296+ prob_rflu = LinearProblem (A_rflu, b_rflu )
297+ sol_rflu = solve (prob_rflu )
298+ @test sol_rflu . retcode == ReturnCode. Success
299+ @test norm (A_rflu * sol_rflu . u - b_rflu ) < (rflu_size <= 10 ? 1e-12 : 1e-8 )
314300 end
315301 end
316302
0 commit comments