From f68e318079d39994ed97bd2555ab6deedd0f1820 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sun, 14 Jun 2026 09:02:29 -0400 Subject: [PATCH] Use SciMLTesting v1.2 folder-based run_tests Replace the hand-written GROUP dispatcher in test/runtests.jl with the SciMLTesting v1.2 folder-discovery run_tests harness. The Core testsets are split into self-contained top-level files (fast_log2_tests.jl, fast_pow_tests.jl, other_ad_engines_tests.jl) and the Enzyme group moves to test/Enzyme/ (enzyme_forward_tests.jl, enzyme_reverse_tests.jl), run in the main test env to match the pre-conversion behavior. QA stays in test/qa/ with its env. Adds SciMLTesting + SafeTestsets to the root and qa test deps and drops Pkg (the harness owns Pkg ops). test_groups.toml is unchanged; GROUP=All still runs Core + Enzyme (QA excluded), matching the old dispatcher. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 7 ++- test/Enzyme/enzyme_forward_tests.jl | 11 +++++ test/Enzyme/enzyme_reverse_tests.jl | 9 ++++ test/fast_log2_tests.jl | 6 +++ test/fast_pow_tests.jl | 13 +++++ test/other_ad_engines_tests.jl | 18 +++++++ test/qa/Project.toml | 5 +- test/runtests.jl | 77 +---------------------------- 8 files changed, 68 insertions(+), 78 deletions(-) create mode 100644 test/Enzyme/enzyme_forward_tests.jl create mode 100644 test/Enzyme/enzyme_reverse_tests.jl create mode 100644 test/fast_log2_tests.jl create mode 100644 test/fast_pow_tests.jl create mode 100644 test/other_ad_engines_tests.jl diff --git a/Project.toml b/Project.toml index fdc3e0f..7a5c29f 100644 --- a/Project.toml +++ b/Project.toml @@ -31,6 +31,8 @@ Measurements = "2.5" MonteCarloMeasurements = "1" Mooncake = "0.4, 0.5" ReverseDiff = "1.14" +SafeTestsets = "0.1, 1" +SciMLTesting = "1" Test = "1" Tracker = "0.2" julia = "1.10" @@ -40,10 +42,11 @@ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" EnzymeTestUtils = "12d8515a-0907-448a-8884-5fe00fdf1c5a" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" -Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" [targets] -test = ["Test", "Enzyme", "EnzymeTestUtils", "ForwardDiff", "Mooncake", "Pkg", "ReverseDiff", "Tracker"] +test = ["Enzyme", "EnzymeTestUtils", "ForwardDiff", "Mooncake", "ReverseDiff", "SafeTestsets", "SciMLTesting", "Test", "Tracker"] diff --git a/test/Enzyme/enzyme_forward_tests.jl b/test/Enzyme/enzyme_forward_tests.jl new file mode 100644 index 0000000..070b65e --- /dev/null +++ b/test/Enzyme/enzyme_forward_tests.jl @@ -0,0 +1,11 @@ +using FastPower: fastpower +using Enzyme, EnzymeTestUtils +using Test + +@testset for RT in (Duplicated, DuplicatedNoNeed), + Tx in (Const, Duplicated), + Ty in (Const, Duplicated) + x = 1.0 + y = 0.5 + test_forward(fastpower, RT, (x, Tx), (y, Ty), atol = 1.0e-4, rtol = 1.0e-3) +end diff --git a/test/Enzyme/enzyme_reverse_tests.jl b/test/Enzyme/enzyme_reverse_tests.jl new file mode 100644 index 0000000..c4e7898 --- /dev/null +++ b/test/Enzyme/enzyme_reverse_tests.jl @@ -0,0 +1,9 @@ +using FastPower: fastpower +using Enzyme, EnzymeTestUtils +using Test + +@testset for RT in (Active,), Tx in (Active, Const), Ty in (Active, Const) + x = 1.0 + y = 0.5 + test_reverse(fastpower, RT, (x, Tx), (y, Ty), atol = 1.0e-4, rtol = 1.0e-3) +end diff --git a/test/fast_log2_tests.jl b/test/fast_log2_tests.jl new file mode 100644 index 0000000..4ac032a --- /dev/null +++ b/test/fast_log2_tests.jl @@ -0,0 +1,6 @@ +using FastPower: fastlog2 +using Test + +for x in 0.001:0.001:1.2 # (0, 1+something] is the domain which a controller uses + @test log2(x) ≈ fastlog2(Float32(x)) atol = 1.0e-3 +end diff --git a/test/fast_pow_tests.jl b/test/fast_pow_tests.jl new file mode 100644 index 0000000..97714bf --- /dev/null +++ b/test/fast_pow_tests.jl @@ -0,0 +1,13 @@ +using FastPower: fastpower +using Test + +@test fastpower(1, 1) isa Float64 +@test fastpower(1.0, 1.0) isa Float64 +errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:1, y in 0.08:0.001:0.5] +@test maximum(errors) < 1.0e-4 + +errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:1, y in 0.08:0.001:1000.0] +@test maximum(errors) < 1.0e-3 + +errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:100, y in 0.08:0.001:1.0] +@test maximum(errors) < 1.0e-2 diff --git a/test/other_ad_engines_tests.jl b/test/other_ad_engines_tests.jl new file mode 100644 index 0000000..766778d --- /dev/null +++ b/test/other_ad_engines_tests.jl @@ -0,0 +1,18 @@ +using FastPower: fastpower +using ForwardDiff, ReverseDiff, Tracker, Mooncake +using Test + +function mooncake_derivative(f, x) + return Mooncake.value_and_gradient!!(Mooncake.build_rrule(f, x), f, x)[2][2] +end + +x = 1.5123233245141 +y = 0.22352354326 +@test ForwardDiff.derivative(x -> fastpower(x, x + y), x) ≈ + ForwardDiff.derivative(x -> ^(x, x + y), x) +@test Tracker.gradient(x -> fastpower(x, x + y), x)[1] ≈ + Tracker.gradient(x -> ^(x, x + y), x)[1] +@test ReverseDiff.gradient(x -> fastpower(x[1], x[1] + y), [x])[1] ≈ + ReverseDiff.gradient(x -> ^(x[1], x[1] + y), [x])[1] +@test mooncake_derivative(x -> fastpower(x, x + y), x) ≈ + mooncake_derivative(x -> ^(x, x + y), x) diff --git a/test/qa/Project.toml b/test/qa/Project.toml index 3016bac..5b9aa6a 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -2,7 +2,8 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" FastPower = "a4df4552-cc26-4903-aec0-212e50a0e84b" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" -Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources] @@ -11,5 +12,7 @@ FastPower = {path = "../.."} [compat] Aqua = "0.8" JET = "0.9,0.10,0.11" +SafeTestsets = "0.1, 1" +SciMLTesting = "1" Test = "1" julia = "1.10" diff --git a/test/runtests.jl b/test/runtests.jl index 269750b..a18a7cc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,75 +1,2 @@ -using Test -using ForwardDiff, ReverseDiff, Tracker, Mooncake -using Enzyme, EnzymeTestUtils - -const GROUP = get(ENV, "GROUP", "All") - -if GROUP == "QA" - using Pkg - Pkg.activate(joinpath(@__DIR__, "qa")) - Pkg.instantiate() - include(joinpath(@__DIR__, "qa", "qa.jl")) -end - -if GROUP == "All" || GROUP == "Core" || GROUP == "Enzyme" - using FastPower - using FastPower: fastlog2, fastpower -end - -if GROUP == "All" || GROUP == "Core" - @testset "Fast log2" begin - for x in 0.001:0.001:1.2 # (0, 1+something] is the domain which a controller uses - @test log2(x) ≈ fastlog2(Float32(x)) atol = 1.0e-3 - end - end - - @testset "Fast pow" begin - @test fastpower(1, 1) isa Float64 - @test fastpower(1.0, 1.0) isa Float64 - errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:1, y in 0.08:0.001:0.5] - @test maximum(errors) < 1.0e-4 - - errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:1, y in 0.08:0.001:1000.0] - @test maximum(errors) < 1.0e-3 - - errors = [abs(^(x, y) - fastpower(x, y)) for x in 0.001:0.001:100, y in 0.08:0.001:1.0] - @test maximum(errors) < 1.0e-2 - end - - function mooncake_derivative(f, x) - return Mooncake.value_and_gradient!!(Mooncake.build_rrule(f, x), f, x)[2][2] - end - @testset "Fast pow - Other AD Engines" begin - x = 1.5123233245141 - y = 0.22352354326 - @test ForwardDiff.derivative(x -> fastpower(x, x + y), x) ≈ - ForwardDiff.derivative(x -> ^(x, x + y), x) - @test Tracker.gradient(x -> fastpower(x, x + y), x)[1] ≈ - Tracker.gradient(x -> ^(x, x + y), x)[1] - @test ReverseDiff.gradient(x -> fastpower(x[1], x[1] + y), [x])[1] ≈ - ReverseDiff.gradient(x -> ^(x[1], x[1] + y), [x])[1] - @test mooncake_derivative(x -> fastpower(x, x + y), x) ≈ - mooncake_derivative(x -> ^(x, x + y), x) - end -end - -if GROUP == "All" || GROUP == "Enzyme" - @testset "Fast pow - Enzyme forward rule" begin - @testset for RT in (Duplicated, DuplicatedNoNeed), - Tx in (Const, Duplicated), - Ty in (Const, Duplicated) - - x = 1.0 - y = 0.5 - test_forward(fastpower, RT, (x, Tx), (y, Ty), atol = 1.0e-4, rtol = 1.0e-3) - end - end - - @testset "Fast pow - Enzyme reverse rule" begin - @testset for RT in (Active,), Tx in (Active, Const), Ty in (Active, Const) - x = 1.0 - y = 0.5 - test_reverse(fastpower, RT, (x, Tx), (y, Ty), atol = 1.0e-4, rtol = 1.0e-3) - end - end -end +using SciMLTesting +run_tests()