From f20dd65a7ac911dd84efe16501b0bfb58df821ac Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Mon, 23 Jun 2025 22:03:58 +0800 Subject: [PATCH 1/6] Fix pre test CI --- src/sampler.jl | 6 ++-- src/trajectory.jl | 7 ++-- test/AdvancedHMCTests.jl | 73 ++++++++++++++++++++++++++++++++++++++ test/Project.toml | 1 - test/demo.jl | 10 +++--- test/integrator.jl | 5 +-- test/runtests.jl | 75 ++-------------------------------------- test/trajectory.jl | 65 +++++++++++++++------------------- 8 files changed, 119 insertions(+), 123 deletions(-) create mode 100644 test/AdvancedHMCTests.jl diff --git a/src/sampler.jl b/src/sampler.jl index c0a42681..e0138819 100644 --- a/src/sampler.jl +++ b/src/sampler.jl @@ -117,7 +117,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=pm_next!, + (pm_next!)::Function=(pm_next!), ) return sample( Random.default_rng(), @@ -130,7 +130,7 @@ function sample( drop_warmup=drop_warmup, verbose=verbose, progress=progress, - (pm_next!)=pm_next!, + (pm_next!)=(pm_next!), ) end @@ -168,7 +168,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=pm_next!, + (pm_next!)::Function=(pm_next!), ) where {T<:AbstractVecOrMat{<:AbstractFloat}} @assert !(drop_warmup && (adaptor isa Adaptation.NoAdaptation)) "Cannot drop warmup samples if there is no adaptation phase." # Prepare containers to store sampling results diff --git a/src/trajectory.jl b/src/trajectory.jl index 9624e53a..a5199437 100644 --- a/src/trajectory.jl +++ b/src/trajectory.jl @@ -141,8 +141,9 @@ $(TYPEDEF) Slice sampler for the starting single leaf tree. Slice variable is initialized. """ -SliceTS(rng::AbstractRNG, z0::PhasePoint) = +function SliceTS(rng::AbstractRNG, z0::PhasePoint) SliceTS(z0, neg_energy(z0) - Random.randexp(rng), 1) +end """ $(TYPEDEF) @@ -292,7 +293,7 @@ function transition( hamiltonian_energy=H, hamiltonian_energy_error=H - H0, # check numerical error in proposed phase point. - numerical_error=!all(isfinite, H′), + numerical_error=(!all(isfinite, H′)), ), stat(τ.integrator), ) @@ -727,7 +728,7 @@ function transition( ( n_steps=tree.nα, is_accept=true, - acceptance_rate=tree.sum_α / tree.nα, + acceptance_rate=(tree.sum_α / tree.nα), log_density=zcand.ℓπ.value, hamiltonian_energy=H, hamiltonian_energy_error=H - H0, diff --git a/test/AdvancedHMCTests.jl b/test/AdvancedHMCTests.jl new file mode 100644 index 00000000..d9e5576f --- /dev/null +++ b/test/AdvancedHMCTests.jl @@ -0,0 +1,73 @@ +module AdvancedHMCTests + +using FillArrays +using AdvancedHMC: AdvancedHMC +using LogDensityProblems: LogDensityProblems +using LogDensityProblemsAD: LogDensityProblemsAD +using MCMCChains +using OrdinaryDiffEq +using ReTest + +println("Environment variables for testing") +println(ENV) + +const DIRECTORY_AdvancedHMC = dirname(dirname(pathof(AdvancedHMC))) +const DIRECTORY_Turing_tests = joinpath(DIRECTORY_AdvancedHMC, "test", "turing") +const GROUP = get(ENV, "AHMC_TEST_GROUP", "AdvancedHMC") + +include("common.jl") + +if GROUP == "All" || GROUP == "AdvancedHMC" + using ReTest + + include("quality.jl") + include("metric.jl") + include("hamiltonian.jl") + include("integrator.jl") + include("trajectory.jl") + include("adaptation.jl") + include("sampler.jl") + include("sampler-vec.jl") + include("demo.jl") + include("models.jl") + include("abstractmcmc.jl") + include("mcmcchains.jl") + include("constructors.jl") +end + +if GROUP == "All" || GROUP == "Experimental" + using Pkg + # activate separate test environment + Pkg.activate(joinpath(DIRECTORY_AdvancedHMC, "research")) + Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) + Pkg.instantiate() + include(joinpath(DIRECTORY_AdvancedHMC, "research/tests", "runtests.jl")) +end + +if GROUP == "All" || GROUP == "Downstream" + using Pkg + try + # activate separate test environment + Pkg.activate(DIRECTORY_Turing_tests) + Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) + Pkg.instantiate() + + # make sure that the new environment is considered `using` and `import` statements + # (not added automatically on Julia 1.3, see e.g. PR #209) + if !(joinpath(DIRECTORY_Turing_tests, "Project.toml") in Base.load_path()) + pushfirst!(LOAD_PATH, DIRECTORY_Turing_tests) + end + + # Avoids conflicting namespaces, e.g. `NUTS` used in Turing.jl's tests + # refers to `Turing.NUTS` not `AdvancedHMC.NUTS`. + include(joinpath("turing", "runtests.jl")) + catch err + err isa Pkg.Resolve.ResolverError || rethrow() + # If we can't resolve that means this is incompatible by SemVer and this is fine + # It means we marked this as a breaking change, so we don't need to worry about + # Mistakenly introducing a breaking change, as we have intentionally made one + @info "Not compatible with this release. No problem." exception = err + end +end + +end diff --git a/test/Project.toml b/test/Project.toml index f3821481..558e3d43 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -3,7 +3,6 @@ ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" Bijectors = "76274a88-744f-5084-9051-94815aaf08c4" -Comonicon = "863f3e99-da2a-4334-8734-de3dacbe5542" ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" diff --git a/test/demo.jl b/test/demo.jl index 98315daa..c9010a7f 100644 --- a/test/demo.jl +++ b/test/demo.jl @@ -10,8 +10,9 @@ using LinearAlgebra, ADTypes LogDensityProblems.logdensity(p::DemoProblem, θ) = logpdf(MvNormal(zeros(p.dim), I), θ) LogDensityProblems.dimension(p::DemoProblem) = p.dim - LogDensityProblems.capabilities(::Type{DemoProblem}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{DemoProblem}) = LogDensityProblems.LogDensityOrder{ + 0 + }() # Choose parameter dimensionality and initial parameter value D = 10 @@ -66,8 +67,9 @@ end return -((1 - p.μ) / p.σ)^2 end LogDensityProblems.dimension(::DemoProblemComponentArrays) = 2 - LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = LogDensityProblems.LogDensityOrder{ + 0 + }() ℓπ = DemoProblemComponentArrays() diff --git a/test/integrator.jl b/test/integrator.jl index b9eb1407..f5a3dbea 100644 --- a/test/integrator.jl +++ b/test/integrator.jl @@ -112,8 +112,9 @@ using Statistics: mean LogDensityProblems.logdensity(::NegU, x) = -dot(x, x) / 2 LogDensityProblems.dimension(d::NegU) = d.dim - LogDensityProblems.capabilities(::Type{NegU}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{NegU}) = LogDensityProblems.LogDensityOrder{ + 0 + }() negU = NegU(1) diff --git a/test/runtests.jl b/test/runtests.jl index 642f76d3..2418fdbc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,74 +1,5 @@ -using Comonicon -using FillArrays -using AdvancedHMC: AdvancedHMC -using LogDensityProblems: LogDensityProblems -using LogDensityProblemsAD: LogDensityProblemsAD -using MCMCChains -using OrdinaryDiffEq +using AdvancedHMC using ReTest -println("Environment variables for testing") -println(ENV) - -const DIRECTORY_AdvancedHMC = dirname(dirname(pathof(AdvancedHMC))) -const DIRECTORY_Turing_tests = joinpath(DIRECTORY_AdvancedHMC, "test", "turing") -const GROUP = get(ENV, "AHMC_TEST_GROUP", "AdvancedHMC") - -include("common.jl") - -if GROUP == "All" || GROUP == "AdvancedHMC" - using ReTest - - include("quality.jl") - include("metric.jl") - include("hamiltonian.jl") - include("integrator.jl") - include("trajectory.jl") - include("adaptation.jl") - include("sampler.jl") - include("sampler-vec.jl") - include("demo.jl") - include("models.jl") - include("abstractmcmc.jl") - include("mcmcchains.jl") - include("constructors.jl") - - Comonicon.@main function runtests(patterns...; dry::Bool=false) - return retest(patterns...; dry=dry, verbose=Inf) - end -end - -if GROUP == "All" || GROUP == "Experimental" - using Pkg - # activate separate test environment - Pkg.activate(joinpath(DIRECTORY_AdvancedHMC, "research")) - Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) - Pkg.instantiate() - include(joinpath(DIRECTORY_AdvancedHMC, "research/tests", "runtests.jl")) -end - -if GROUP == "All" || GROUP == "Downstream" - using Pkg - try - # activate separate test environment - Pkg.activate(DIRECTORY_Turing_tests) - Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) - Pkg.instantiate() - - # make sure that the new environment is considered `using` and `import` statements - # (not added automatically on Julia 1.3, see e.g. PR #209) - if !(joinpath(DIRECTORY_Turing_tests, "Project.toml") in Base.load_path()) - pushfirst!(LOAD_PATH, DIRECTORY_Turing_tests) - end - - # Avoids conflicting namespaces, e.g. `NUTS` used in Turing.jl's tests - # refers to `Turing.NUTS` not `AdvancedHMC.NUTS`. - include(joinpath("turing", "runtests.jl")) - catch err - err isa Pkg.Resolve.ResolverError || rethrow() - # If we can't resolve that means this is incompatible by SemVer and this is fine - # It means we marked this as a breaking change, so we don't need to worry about - # Mistakenly introducing a breaking change, as we have intentionally made one - @info "Not compatible with this release. No problem." exception = err - end -end +include("AdvancedHMCTests.jl"); +AdvancedHMCTests.runtests() diff --git a/test/trajectory.jl b/test/trajectory.jl index 403fd446..4bf0ac4d 100644 --- a/test/trajectory.jl +++ b/test/trajectory.jl @@ -257,46 +257,35 @@ end traj_r = hcat(map(z -> z.r, traj_z)...) rho = cumsum(traj_r; dims=2) - ts_hand_isturn_fwd = - hand_isturn.( - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) - ts_ahmc_isturn_fwd = - ahmc_isturn.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_fwd = hand_isturn.( + Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) + ) + ts_ahmc_isturn_fwd = ahmc_isturn.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_hand_isturn_generalised_fwd = - hand_isturn_generalised.( - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) - ts_ahmc_isturn_generalised_fwd = - ahmc_isturn_generalised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_generalised_fwd = hand_isturn_generalised.( + Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) + ) + ts_ahmc_isturn_generalised_fwd = ahmc_isturn_generalised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_ahmc_isturn_strictgeneralised_fwd = - ahmc_isturn_strictgeneralised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_ahmc_isturn_strictgeneralised_fwd = ahmc_isturn_strictgeneralised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) check_subtree_u_turns.( Ref(h), Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)] From 67549c1b1c1c4927583eb34f3c5a7b0f35f2ae60 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Mon, 23 Jun 2025 22:37:58 +0800 Subject: [PATCH 2/6] Fix format issues --- src/sampler.jl | 6 ++--- src/trajectory.jl | 7 +++-- test/demo.jl | 10 +++---- test/integrator.jl | 5 ++-- test/trajectory.jl | 65 +++++++++++++++++++++++++++------------------- 5 files changed, 50 insertions(+), 43 deletions(-) diff --git a/src/sampler.jl b/src/sampler.jl index e0138819..c0a42681 100644 --- a/src/sampler.jl +++ b/src/sampler.jl @@ -117,7 +117,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=(pm_next!), + (pm_next!)::Function=pm_next!, ) return sample( Random.default_rng(), @@ -130,7 +130,7 @@ function sample( drop_warmup=drop_warmup, verbose=verbose, progress=progress, - (pm_next!)=(pm_next!), + (pm_next!)=pm_next!, ) end @@ -168,7 +168,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=(pm_next!), + (pm_next!)::Function=pm_next!, ) where {T<:AbstractVecOrMat{<:AbstractFloat}} @assert !(drop_warmup && (adaptor isa Adaptation.NoAdaptation)) "Cannot drop warmup samples if there is no adaptation phase." # Prepare containers to store sampling results diff --git a/src/trajectory.jl b/src/trajectory.jl index a5199437..9624e53a 100644 --- a/src/trajectory.jl +++ b/src/trajectory.jl @@ -141,9 +141,8 @@ $(TYPEDEF) Slice sampler for the starting single leaf tree. Slice variable is initialized. """ -function SliceTS(rng::AbstractRNG, z0::PhasePoint) +SliceTS(rng::AbstractRNG, z0::PhasePoint) = SliceTS(z0, neg_energy(z0) - Random.randexp(rng), 1) -end """ $(TYPEDEF) @@ -293,7 +292,7 @@ function transition( hamiltonian_energy=H, hamiltonian_energy_error=H - H0, # check numerical error in proposed phase point. - numerical_error=(!all(isfinite, H′)), + numerical_error=!all(isfinite, H′), ), stat(τ.integrator), ) @@ -728,7 +727,7 @@ function transition( ( n_steps=tree.nα, is_accept=true, - acceptance_rate=(tree.sum_α / tree.nα), + acceptance_rate=tree.sum_α / tree.nα, log_density=zcand.ℓπ.value, hamiltonian_energy=H, hamiltonian_energy_error=H - H0, diff --git a/test/demo.jl b/test/demo.jl index c9010a7f..98315daa 100644 --- a/test/demo.jl +++ b/test/demo.jl @@ -10,9 +10,8 @@ using LinearAlgebra, ADTypes LogDensityProblems.logdensity(p::DemoProblem, θ) = logpdf(MvNormal(zeros(p.dim), I), θ) LogDensityProblems.dimension(p::DemoProblem) = p.dim - LogDensityProblems.capabilities(::Type{DemoProblem}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{DemoProblem}) = + LogDensityProblems.LogDensityOrder{0}() # Choose parameter dimensionality and initial parameter value D = 10 @@ -67,9 +66,8 @@ end return -((1 - p.μ) / p.σ)^2 end LogDensityProblems.dimension(::DemoProblemComponentArrays) = 2 - LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = + LogDensityProblems.LogDensityOrder{0}() ℓπ = DemoProblemComponentArrays() diff --git a/test/integrator.jl b/test/integrator.jl index f5a3dbea..b9eb1407 100644 --- a/test/integrator.jl +++ b/test/integrator.jl @@ -112,9 +112,8 @@ using Statistics: mean LogDensityProblems.logdensity(::NegU, x) = -dot(x, x) / 2 LogDensityProblems.dimension(d::NegU) = d.dim - LogDensityProblems.capabilities(::Type{NegU}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{NegU}) = + LogDensityProblems.LogDensityOrder{0}() negU = NegU(1) diff --git a/test/trajectory.jl b/test/trajectory.jl index 4bf0ac4d..403fd446 100644 --- a/test/trajectory.jl +++ b/test/trajectory.jl @@ -257,35 +257,46 @@ end traj_r = hcat(map(z -> z.r, traj_z)...) rho = cumsum(traj_r; dims=2) - ts_hand_isturn_fwd = hand_isturn.( - Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) - ) - ts_ahmc_isturn_fwd = ahmc_isturn.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_fwd = + hand_isturn.( + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) + ts_ahmc_isturn_fwd = + ahmc_isturn.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_hand_isturn_generalised_fwd = hand_isturn_generalised.( - Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) - ) - ts_ahmc_isturn_generalised_fwd = ahmc_isturn_generalised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_generalised_fwd = + hand_isturn_generalised.( + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) + ts_ahmc_isturn_generalised_fwd = + ahmc_isturn_generalised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_ahmc_isturn_strictgeneralised_fwd = ahmc_isturn_strictgeneralised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_ahmc_isturn_strictgeneralised_fwd = + ahmc_isturn_strictgeneralised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) check_subtree_u_turns.( Ref(h), Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)] From f49666385ed984de1408c33fbdafb0e43c3ce338 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Wed, 25 Jun 2025 01:37:51 +0800 Subject: [PATCH 3/6] Fix experimental CIs --- research/tests/AdvancedHMCResearchTests.jl | 11 +++++++++++ research/tests/Project.toml | 1 - research/tests/runtests.jl | 14 ++++---------- 3 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 research/tests/AdvancedHMCResearchTests.jl diff --git a/research/tests/AdvancedHMCResearchTests.jl b/research/tests/AdvancedHMCResearchTests.jl new file mode 100644 index 00000000..738f935d --- /dev/null +++ b/research/tests/AdvancedHMCResearchTests.jl @@ -0,0 +1,11 @@ +module AdvancedHMCResearchTests + +using ReTest + +# include the source code for experimental HMC +include("../src/relativistic_hmc.jl") + +# include the tests for experimental HMC +include("relativistic_hmc.jl") + +end diff --git a/research/tests/Project.toml b/research/tests/Project.toml index 17d4dd72..60ed4a3e 100644 --- a/research/tests/Project.toml +++ b/research/tests/Project.toml @@ -2,7 +2,6 @@ AdaptiveRejectionSampling = "c75e803d-635f-53bd-ab7d-544e482d8c75" AdvancedHMC = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d" BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -Comonicon = "863f3e99-da2a-4334-8734-de3dacbe5542" DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" DynamicPPL = "366bfd00-2699-11ea-058f-f148b4cae6d8" diff --git a/research/tests/runtests.jl b/research/tests/runtests.jl index 51d25f9a..d89db473 100644 --- a/research/tests/runtests.jl +++ b/research/tests/runtests.jl @@ -1,11 +1,5 @@ -using Comonicon, ReTest +using AdvancedHMC +using ReTest -# include the source code for experimental HMC -include("../src/relativistic_hmc.jl") - -# include the tests for experimental HMC -include("relativistic_hmc.jl") - -Comonicon.@main function runtests(patterns...; dry::Bool=false) - return retest(patterns...; dry=dry, verbose=Inf) -end +include("AdvancedHMCResearchTests.jl"); +AdvancedHMCResearchTests.runtests() From d5ee8e1e47099cd35a77a17ef4ba2e9fb13c0513 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Fri, 27 Jun 2025 23:20:00 +0800 Subject: [PATCH 4/6] Directly retest --- research/tests/AdvancedHMCResearchTests.jl | 11 ---- research/tests/runtests.jl | 10 ++- src/sampler.jl | 6 +- src/trajectory.jl | 7 ++- test/AdvancedHMCTests.jl | 73 ---------------------- test/demo.jl | 10 +-- test/integrator.jl | 5 +- test/runtests.jl | 71 ++++++++++++++++++++- test/trajectory.jl | 65 ++++++++----------- 9 files changed, 118 insertions(+), 140 deletions(-) delete mode 100644 research/tests/AdvancedHMCResearchTests.jl delete mode 100644 test/AdvancedHMCTests.jl diff --git a/research/tests/AdvancedHMCResearchTests.jl b/research/tests/AdvancedHMCResearchTests.jl deleted file mode 100644 index 738f935d..00000000 --- a/research/tests/AdvancedHMCResearchTests.jl +++ /dev/null @@ -1,11 +0,0 @@ -module AdvancedHMCResearchTests - -using ReTest - -# include the source code for experimental HMC -include("../src/relativistic_hmc.jl") - -# include the tests for experimental HMC -include("relativistic_hmc.jl") - -end diff --git a/research/tests/runtests.jl b/research/tests/runtests.jl index d89db473..62569e34 100644 --- a/research/tests/runtests.jl +++ b/research/tests/runtests.jl @@ -1,5 +1,9 @@ -using AdvancedHMC using ReTest -include("AdvancedHMCResearchTests.jl"); -AdvancedHMCResearchTests.runtests() +# include the source code for experimental HMC +include("../src/relativistic_hmc.jl") + +# include the tests for experimental HMC +include("relativistic_hmc.jl") + +retest(; dry=false, verbose=Inf) diff --git a/src/sampler.jl b/src/sampler.jl index c0a42681..e0138819 100644 --- a/src/sampler.jl +++ b/src/sampler.jl @@ -117,7 +117,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=pm_next!, + (pm_next!)::Function=(pm_next!), ) return sample( Random.default_rng(), @@ -130,7 +130,7 @@ function sample( drop_warmup=drop_warmup, verbose=verbose, progress=progress, - (pm_next!)=pm_next!, + (pm_next!)=(pm_next!), ) end @@ -168,7 +168,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=pm_next!, + (pm_next!)::Function=(pm_next!), ) where {T<:AbstractVecOrMat{<:AbstractFloat}} @assert !(drop_warmup && (adaptor isa Adaptation.NoAdaptation)) "Cannot drop warmup samples if there is no adaptation phase." # Prepare containers to store sampling results diff --git a/src/trajectory.jl b/src/trajectory.jl index 9624e53a..a5199437 100644 --- a/src/trajectory.jl +++ b/src/trajectory.jl @@ -141,8 +141,9 @@ $(TYPEDEF) Slice sampler for the starting single leaf tree. Slice variable is initialized. """ -SliceTS(rng::AbstractRNG, z0::PhasePoint) = +function SliceTS(rng::AbstractRNG, z0::PhasePoint) SliceTS(z0, neg_energy(z0) - Random.randexp(rng), 1) +end """ $(TYPEDEF) @@ -292,7 +293,7 @@ function transition( hamiltonian_energy=H, hamiltonian_energy_error=H - H0, # check numerical error in proposed phase point. - numerical_error=!all(isfinite, H′), + numerical_error=(!all(isfinite, H′)), ), stat(τ.integrator), ) @@ -727,7 +728,7 @@ function transition( ( n_steps=tree.nα, is_accept=true, - acceptance_rate=tree.sum_α / tree.nα, + acceptance_rate=(tree.sum_α / tree.nα), log_density=zcand.ℓπ.value, hamiltonian_energy=H, hamiltonian_energy_error=H - H0, diff --git a/test/AdvancedHMCTests.jl b/test/AdvancedHMCTests.jl deleted file mode 100644 index d9e5576f..00000000 --- a/test/AdvancedHMCTests.jl +++ /dev/null @@ -1,73 +0,0 @@ -module AdvancedHMCTests - -using FillArrays -using AdvancedHMC: AdvancedHMC -using LogDensityProblems: LogDensityProblems -using LogDensityProblemsAD: LogDensityProblemsAD -using MCMCChains -using OrdinaryDiffEq -using ReTest - -println("Environment variables for testing") -println(ENV) - -const DIRECTORY_AdvancedHMC = dirname(dirname(pathof(AdvancedHMC))) -const DIRECTORY_Turing_tests = joinpath(DIRECTORY_AdvancedHMC, "test", "turing") -const GROUP = get(ENV, "AHMC_TEST_GROUP", "AdvancedHMC") - -include("common.jl") - -if GROUP == "All" || GROUP == "AdvancedHMC" - using ReTest - - include("quality.jl") - include("metric.jl") - include("hamiltonian.jl") - include("integrator.jl") - include("trajectory.jl") - include("adaptation.jl") - include("sampler.jl") - include("sampler-vec.jl") - include("demo.jl") - include("models.jl") - include("abstractmcmc.jl") - include("mcmcchains.jl") - include("constructors.jl") -end - -if GROUP == "All" || GROUP == "Experimental" - using Pkg - # activate separate test environment - Pkg.activate(joinpath(DIRECTORY_AdvancedHMC, "research")) - Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) - Pkg.instantiate() - include(joinpath(DIRECTORY_AdvancedHMC, "research/tests", "runtests.jl")) -end - -if GROUP == "All" || GROUP == "Downstream" - using Pkg - try - # activate separate test environment - Pkg.activate(DIRECTORY_Turing_tests) - Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) - Pkg.instantiate() - - # make sure that the new environment is considered `using` and `import` statements - # (not added automatically on Julia 1.3, see e.g. PR #209) - if !(joinpath(DIRECTORY_Turing_tests, "Project.toml") in Base.load_path()) - pushfirst!(LOAD_PATH, DIRECTORY_Turing_tests) - end - - # Avoids conflicting namespaces, e.g. `NUTS` used in Turing.jl's tests - # refers to `Turing.NUTS` not `AdvancedHMC.NUTS`. - include(joinpath("turing", "runtests.jl")) - catch err - err isa Pkg.Resolve.ResolverError || rethrow() - # If we can't resolve that means this is incompatible by SemVer and this is fine - # It means we marked this as a breaking change, so we don't need to worry about - # Mistakenly introducing a breaking change, as we have intentionally made one - @info "Not compatible with this release. No problem." exception = err - end -end - -end diff --git a/test/demo.jl b/test/demo.jl index 98315daa..c9010a7f 100644 --- a/test/demo.jl +++ b/test/demo.jl @@ -10,8 +10,9 @@ using LinearAlgebra, ADTypes LogDensityProblems.logdensity(p::DemoProblem, θ) = logpdf(MvNormal(zeros(p.dim), I), θ) LogDensityProblems.dimension(p::DemoProblem) = p.dim - LogDensityProblems.capabilities(::Type{DemoProblem}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{DemoProblem}) = LogDensityProblems.LogDensityOrder{ + 0 + }() # Choose parameter dimensionality and initial parameter value D = 10 @@ -66,8 +67,9 @@ end return -((1 - p.μ) / p.σ)^2 end LogDensityProblems.dimension(::DemoProblemComponentArrays) = 2 - LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = LogDensityProblems.LogDensityOrder{ + 0 + }() ℓπ = DemoProblemComponentArrays() diff --git a/test/integrator.jl b/test/integrator.jl index b9eb1407..f5a3dbea 100644 --- a/test/integrator.jl +++ b/test/integrator.jl @@ -112,8 +112,9 @@ using Statistics: mean LogDensityProblems.logdensity(::NegU, x) = -dot(x, x) / 2 LogDensityProblems.dimension(d::NegU) = d.dim - LogDensityProblems.capabilities(::Type{NegU}) = - LogDensityProblems.LogDensityOrder{0}() + LogDensityProblems.capabilities(::Type{NegU}) = LogDensityProblems.LogDensityOrder{ + 0 + }() negU = NegU(1) diff --git a/test/runtests.jl b/test/runtests.jl index 2418fdbc..d0fb6ea8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,5 +1,70 @@ -using AdvancedHMC +using FillArrays +using AdvancedHMC: AdvancedHMC +using LogDensityProblems: LogDensityProblems +using LogDensityProblemsAD: LogDensityProblemsAD +using MCMCChains +using OrdinaryDiffEq using ReTest -include("AdvancedHMCTests.jl"); -AdvancedHMCTests.runtests() +println("Environment variables for testing") +println(ENV) + +const DIRECTORY_AdvancedHMC = dirname(dirname(pathof(AdvancedHMC))) +const DIRECTORY_Turing_tests = joinpath(DIRECTORY_AdvancedHMC, "test", "turing") +const GROUP = get(ENV, "AHMC_TEST_GROUP", "AdvancedHMC") + +include("common.jl") + +if GROUP == "All" || GROUP == "AdvancedHMC" + using ReTest + + include("quality.jl") + include("metric.jl") + include("hamiltonian.jl") + include("integrator.jl") + include("trajectory.jl") + include("adaptation.jl") + include("sampler.jl") + include("sampler-vec.jl") + include("demo.jl") + include("models.jl") + include("abstractmcmc.jl") + include("mcmcchains.jl") + include("constructors.jl") + retest(; dry=false, verbose=Inf) +end + +if GROUP == "All" || GROUP == "Experimental" + using Pkg + # activate separate test environment + Pkg.activate(joinpath(DIRECTORY_AdvancedHMC, "research")) + Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) + Pkg.instantiate() + include(joinpath(DIRECTORY_AdvancedHMC, "research/tests", "runtests.jl")) +end + +if GROUP == "All" || GROUP == "Downstream" + using Pkg + try + # activate separate test environment + Pkg.activate(DIRECTORY_Turing_tests) + Pkg.develop(PackageSpec(; path=DIRECTORY_AdvancedHMC)) + Pkg.instantiate() + + # make sure that the new environment is considered `using` and `import` statements + # (not added automatically on Julia 1.3, see e.g. PR #209) + if !(joinpath(DIRECTORY_Turing_tests, "Project.toml") in Base.load_path()) + pushfirst!(LOAD_PATH, DIRECTORY_Turing_tests) + end + + # Avoids conflicting namespaces, e.g. `NUTS` used in Turing.jl's tests + # refers to `Turing.NUTS` not `AdvancedHMC.NUTS`. + include(joinpath("turing", "runtests.jl")) + catch err + err isa Pkg.Resolve.ResolverError || rethrow() + # If we can't resolve that means this is incompatible by SemVer and this is fine + # It means we marked this as a breaking change, so we don't need to worry about + # Mistakenly introducing a breaking change, as we have intentionally made one + @info "Not compatible with this release. No problem." exception = err + end +end diff --git a/test/trajectory.jl b/test/trajectory.jl index 403fd446..4bf0ac4d 100644 --- a/test/trajectory.jl +++ b/test/trajectory.jl @@ -257,46 +257,35 @@ end traj_r = hcat(map(z -> z.r, traj_z)...) rho = cumsum(traj_r; dims=2) - ts_hand_isturn_fwd = - hand_isturn.( - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) - ts_ahmc_isturn_fwd = - ahmc_isturn.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_fwd = hand_isturn.( + Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) + ) + ts_ahmc_isturn_fwd = ahmc_isturn.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_hand_isturn_generalised_fwd = - hand_isturn_generalised.( - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) - ts_ahmc_isturn_generalised_fwd = - ahmc_isturn_generalised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_generalised_fwd = hand_isturn_generalised.( + Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) + ) + ts_ahmc_isturn_generalised_fwd = ahmc_isturn_generalised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_ahmc_isturn_strictgeneralised_fwd = - ahmc_isturn_strictgeneralised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_ahmc_isturn_strictgeneralised_fwd = ahmc_isturn_strictgeneralised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) check_subtree_u_turns.( Ref(h), Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)] From 268f5be9ead938e56b631887a986d8c0169d9985 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Sat, 28 Jun 2025 00:32:10 +0800 Subject: [PATCH 5/6] Format --- src/sampler.jl | 6 ++--- src/trajectory.jl | 5 ++-- test/demo.jl | 10 +++---- test/integrator.jl | 5 ++-- test/trajectory.jl | 65 +++++++++++++++++++++++++++------------------- 5 files changed, 49 insertions(+), 42 deletions(-) diff --git a/src/sampler.jl b/src/sampler.jl index e0138819..c0a42681 100644 --- a/src/sampler.jl +++ b/src/sampler.jl @@ -117,7 +117,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=(pm_next!), + (pm_next!)::Function=pm_next!, ) return sample( Random.default_rng(), @@ -130,7 +130,7 @@ function sample( drop_warmup=drop_warmup, verbose=verbose, progress=progress, - (pm_next!)=(pm_next!), + (pm_next!)=pm_next!, ) end @@ -168,7 +168,7 @@ function sample( drop_warmup=false, verbose::Bool=true, progress::Bool=false, - (pm_next!)::Function=(pm_next!), + (pm_next!)::Function=pm_next!, ) where {T<:AbstractVecOrMat{<:AbstractFloat}} @assert !(drop_warmup && (adaptor isa Adaptation.NoAdaptation)) "Cannot drop warmup samples if there is no adaptation phase." # Prepare containers to store sampling results diff --git a/src/trajectory.jl b/src/trajectory.jl index a5199437..35b1246b 100644 --- a/src/trajectory.jl +++ b/src/trajectory.jl @@ -141,9 +141,8 @@ $(TYPEDEF) Slice sampler for the starting single leaf tree. Slice variable is initialized. """ -function SliceTS(rng::AbstractRNG, z0::PhasePoint) +SliceTS(rng::AbstractRNG, z0::PhasePoint) = SliceTS(z0, neg_energy(z0) - Random.randexp(rng), 1) -end """ $(TYPEDEF) @@ -293,7 +292,7 @@ function transition( hamiltonian_energy=H, hamiltonian_energy_error=H - H0, # check numerical error in proposed phase point. - numerical_error=(!all(isfinite, H′)), + numerical_error=!all(isfinite, H′), ), stat(τ.integrator), ) diff --git a/test/demo.jl b/test/demo.jl index c9010a7f..98315daa 100644 --- a/test/demo.jl +++ b/test/demo.jl @@ -10,9 +10,8 @@ using LinearAlgebra, ADTypes LogDensityProblems.logdensity(p::DemoProblem, θ) = logpdf(MvNormal(zeros(p.dim), I), θ) LogDensityProblems.dimension(p::DemoProblem) = p.dim - LogDensityProblems.capabilities(::Type{DemoProblem}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{DemoProblem}) = + LogDensityProblems.LogDensityOrder{0}() # Choose parameter dimensionality and initial parameter value D = 10 @@ -67,9 +66,8 @@ end return -((1 - p.μ) / p.σ)^2 end LogDensityProblems.dimension(::DemoProblemComponentArrays) = 2 - LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{DemoProblemComponentArrays}) = + LogDensityProblems.LogDensityOrder{0}() ℓπ = DemoProblemComponentArrays() diff --git a/test/integrator.jl b/test/integrator.jl index f5a3dbea..b9eb1407 100644 --- a/test/integrator.jl +++ b/test/integrator.jl @@ -112,9 +112,8 @@ using Statistics: mean LogDensityProblems.logdensity(::NegU, x) = -dot(x, x) / 2 LogDensityProblems.dimension(d::NegU) = d.dim - LogDensityProblems.capabilities(::Type{NegU}) = LogDensityProblems.LogDensityOrder{ - 0 - }() + LogDensityProblems.capabilities(::Type{NegU}) = + LogDensityProblems.LogDensityOrder{0}() negU = NegU(1) diff --git a/test/trajectory.jl b/test/trajectory.jl index 4bf0ac4d..403fd446 100644 --- a/test/trajectory.jl +++ b/test/trajectory.jl @@ -257,35 +257,46 @@ end traj_r = hcat(map(z -> z.r, traj_z)...) rho = cumsum(traj_r; dims=2) - ts_hand_isturn_fwd = hand_isturn.( - Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) - ) - ts_ahmc_isturn_fwd = ahmc_isturn.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_fwd = + hand_isturn.( + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) + ts_ahmc_isturn_fwd = + ahmc_isturn.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_hand_isturn_generalised_fwd = hand_isturn_generalised.( - Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)], Ref(1) - ) - ts_ahmc_isturn_generalised_fwd = ahmc_isturn_generalised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_hand_isturn_generalised_fwd = + hand_isturn_generalised.( + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) + ts_ahmc_isturn_generalised_fwd = + ahmc_isturn_generalised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) - ts_ahmc_isturn_strictgeneralised_fwd = ahmc_isturn_strictgeneralised.( - Ref(h), - Ref(traj_z[1]), - traj_z, - [rho[:, i] for i in 1:length(traj_z)], - Ref(1), - ) + ts_ahmc_isturn_strictgeneralised_fwd = + ahmc_isturn_strictgeneralised.( + Ref(h), + Ref(traj_z[1]), + traj_z, + [rho[:, i] for i in 1:length(traj_z)], + Ref(1), + ) check_subtree_u_turns.( Ref(h), Ref(traj_z[1]), traj_z, [rho[:, i] for i in 1:length(traj_z)] From ec460c6608654e0714a7c4b5f4c24a89ae1a64dc Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Sat, 28 Jun 2025 00:33:02 +0800 Subject: [PATCH 6/6] Fix typo --- src/trajectory.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trajectory.jl b/src/trajectory.jl index 35b1246b..9624e53a 100644 --- a/src/trajectory.jl +++ b/src/trajectory.jl @@ -727,7 +727,7 @@ function transition( ( n_steps=tree.nα, is_accept=true, - acceptance_rate=(tree.sum_α / tree.nα), + acceptance_rate=tree.sum_α / tree.nα, log_density=zcand.ℓπ.value, hamiltonian_energy=H, hamiltonian_energy_error=H - H0,