diff --git a/Project.toml b/Project.toml index 2d9474b20..e521cc75b 100644 --- a/Project.toml +++ b/Project.toml @@ -35,6 +35,7 @@ FiniteDiff = "2" ForwardDiff = "0.10.3" LineSearches = "7" LinearSolve = "2" +NonlinearProblemLibrary = "0.1" PrecompileTools = "1" RecursiveArrayTools = "2" Reexport = "0.2, 1" @@ -52,6 +53,7 @@ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +NonlinearProblemLibrary = "b7050fa9-e91f-4b37-bcee-a89a063da141" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" @@ -62,4 +64,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" [targets] -test = ["Enzyme", "BenchmarkTools", "SafeTestsets", "Pkg", "Test", "ForwardDiff", "StaticArrays", "Symbolics", "LinearSolve", "Random", "LinearAlgebra", "Zygote", "SparseDiffTools"] +test = ["Enzyme", "BenchmarkTools", "SafeTestsets", "Pkg", "Test", "ForwardDiff", "StaticArrays", "Symbolics", "LinearSolve", "Random", "LinearAlgebra", "Zygote", "SparseDiffTools", "NonlinearProblemLibrary"] diff --git a/test/23_test_problems.jl b/test/23_test_problems.jl new file mode 100644 index 000000000..f13182119 --- /dev/null +++ b/test/23_test_problems.jl @@ -0,0 +1,62 @@ +using NonlinearSolve, LinearAlgebra, NonlinearProblemLibrary, Test + +problems = NonlinearProblemLibrary.problems +dicts = NonlinearProblemLibrary.dicts + +function test_on_library(problems, dicts, alg_ops, broken_tests, ϵ = 1e-5) + for (idx, (problem, dict)) in enumerate(zip(problems, dicts)) + x = dict["start"] + res = similar(x) + nlprob = NonlinearProblem(problem, x) + @testset "$(dict["title"])" begin + for alg in alg_ops + sol = solve(nlprob, alg, abstol = 1e-15, reltol = 1e-15) + problem(res, sol.u, nothing) + broken = idx in broken_tests[alg] ? true : false + @test norm(res)≤ϵ broken=broken + end + end + end +end + +# NewtonRaphson +@testset "NewtonRaphson test problem library" begin + alg_ops = (NewtonRaphson(),) + + # dictionary with indices of test problems where method does not converge to small residual + broken_tests = Dict(alg => Int[] for alg in alg_ops) + broken_tests[alg_ops[1]] = [1, 6] + + test_on_library(problems, dicts, alg_ops, broken_tests) +end + +@testset "TrustRegion test problem library" begin + alg_ops = (TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Simple), + TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Fan), + TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Hei), + TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Yuan), + TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Bastin), + TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.NLsolve)) + + # dictionary with indices of test problems where method does not converge to small residual + broken_tests = Dict(alg => Int[] for alg in alg_ops) + broken_tests[alg_ops[1]] = [6, 11, 21] + broken_tests[alg_ops[2]] = [6, 11, 21] + broken_tests[alg_ops[3]] = [1, 6, 11, 12, 15, 16, 21] + broken_tests[alg_ops[4]] = [1, 6, 8, 11, 15, 16, 21, 22] + broken_tests[alg_ops[5]] = [6, 21] + broken_tests[alg_ops[6]] = [6, 21] + + test_on_library(problems, dicts, alg_ops, broken_tests) +end + +@testset "TrustRegion test problem library" begin + alg_ops = (LevenbergMarquardt(), LevenbergMarquardt(; α_geodesic = 0.5)) + + # dictionary with indices of test problems where method does not converge to small residual + broken_tests = Dict(alg => Int[] for alg in alg_ops) + broken_tests[alg_ops[1]] = [3, 6, 11, 17, 21] + broken_tests[alg_ops[2]] = [3, 6, 11, 21] + + test_on_library(problems, dicts, alg_ops, broken_tests) +end diff --git a/test/runtests.jl b/test/runtests.jl index a84fc3cb1..58ef647f0 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -15,6 +15,8 @@ end if GROUP == "All" || GROUP == "Core" @time @safetestset "Basic Tests + Some AD" include("basictests.jl") @time @safetestset "Sparsity Tests" include("sparse.jl") + + @time @safetestset "23 Test Problems" include("23_test_problems.jl") end if GROUP == "GPU"