From b076b5f9c3b4b29f20f3b400debe62096fef7fd7 Mon Sep 17 00:00:00 2001 From: Alexander Spears <39826690+Alexsp32@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:07:50 +0200 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9E=95=20Add=20ParallelTestRunner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Project.toml | 90 ++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index f259a849d..924add655 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,93 +1,96 @@ [deps] -# These are the additional test dependencies +AdvancedHMC = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d" +AdvancedMH = "5b7e9947-ddc0-4b3f-9b55-0d8042f74170" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Dictionaries = "85a47980-9c8c-11e8-2b9f-f7ca1fa99fb4" +DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d" DiffEqNoiseProcess = "77a26b50-5914-5dd7-bc55-306e6241c503" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" +HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" MKL = "33e6dc65-8f57-5167-99aa-e5a354878fb2" +MKL_jll = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" NQCBase = "78c76ebc-5665-4934-b512-82d81b5cbfb7" NQCCalculators = "ddd1f41d-9621-41e2-91a4-6b87cc8989f3" +NQCDInterfASE = "4606675f-2246-4a0b-99d5-75b910de637b" NQCDistributions = "657014a1-bd25-4aa2-92cb-cbcede0310ad" NQCDynamics = "36248dfb-79eb-4f4d-ab9c-e29ea5f33e14" NQCModels = "c814dc9f-a51f-4eaf-877f-82eda4edad48" -NQCDInterfASE = "4606675f-2246-4a0b-99d5-75b910de637b" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" -RingPolymerArrays = "81cd853e-d334-476c-b156-f95acc8a32dc" -SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" -Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -# These are NQCDynamics deps copied over from the main Project.toml -AdvancedHMC = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d" -AdvancedMH = "5b7e9947-ddc0-4b3f-9b55-0d8042f74170" -ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" -Dictionaries = "85a47980-9c8c-11e8-2b9f-f7ca1fa99fb4" -DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" -Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" -FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" -HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -MKL_jll = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -MuladdMacro = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" Optim = "429524aa-4258-5aef-a3af-852621145aeb" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +ParallelTestRunner = "d3525ed8-44d0-4b2c-a655-542cee43accc" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" PeriodicTable = "7b2266bf-644c-5ea3-82d8-af4bbd25a884" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" +PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +RingPolymerArrays = "81cd853e-d334-476c-b156-f95acc8a32dc" Roots = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" Rotations = "6038ab10-8711-5258-84ad-4b1120ba62dc" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" UnitfulAtomic = "a7773ee8-282e-5fa2-be4e-bd808c38a91a" +[sources] +NQCBase = {rev = "main", url = "https://github.com/NQCD/NQCBase.jl.git"} +NQCCalculators = {rev = "main", url = "https://github.com/NQCD/NQCCalculators.jl.git"} +NQCDInterfASE = {rev = "main", url = "https://github.com/NQCD/NQCDInterfASE.jl.git"} +NQCDistributions = {rev = "main", url = "https://github.com/NQCD/NQCDistributions.jl.git"} +NQCDynamics = {path = ".."} +NQCModels = {rev = "main", url = "https://github.com/NQCD/NQCModels.jl.git"} +RingPolymerArrays = {rev = "main", url = "https://github.com/NQCD/RingPolymerArrays.jl.git"} + [compat] -# This compat information covers the additional testing packages. -CSV = "0.10" -DataFrames = "1" -DiffEqDevTools = "2" -DiffEqNoiseProcess = "5" -FiniteDiff = "2" -JLD2 = "0.6" -JSON = "0.21" -MKL = "0.5, 0.6, 0.7, 0.8, 0.9" -NQCDInterfASE = "1" -Plots = "1" -PythonCall = "=0.9.0, =0.9.1, =0.9.2, =0.9.3, =0.9.4, =0.9.5, =0.9.6, =0.9.7, =0.9.8, =0.9.9, =0.9.10, =0.9.11, =0.9.12, =0.9.13, =0.9.14, =0.9.15, =0.9.16, =0.9.17, =0.9.18, =0.9.19, =0.9.20, =0.9.21, =0.9.22, =0.9.23, =0.9.24, =0.9.25, =0.9.26" -SafeTestsets = "0.1" -# This compat information should mirror the main Project.toml. AdvancedHMC = "0.5, 0.6" AdvancedMH = "0.8" +CSV = "0.10" ComponentArrays = "0.11, 0.12, 0.13, 0.14, 0.15" +DataFrames = "1" Dictionaries = "0.3, 0.4" DiffEqBase = "6" +DiffEqDevTools = "2" +DiffEqNoiseProcess = "5" Distributions = "0.25" FastBroadcast = "0.1, 0.2, 0.3" FastLapackInterface = "1, 2" +FiniteDiff = "2" HDF5 = "0.15, 0.16, 0.17" Interpolations = "0.13, 0.14, 0.15, 0.16" +JLD2 = "0.6" +JSON = "0.21" +MKL = "0.5, 0.6, 0.7, 0.8, 0.9" MuladdMacro = "0.2" NQCBase = "1" NQCCalculators = "1.0.10" +NQCDInterfASE = "1" NQCDistributions = "1" NQCModels = "1" Optim = "1" @@ -95,7 +98,9 @@ OrdinaryDiffEq = "6.103" OrdinaryDiffEqCore = "1.32, 2, 3" Parameters = "0.12" PeriodicTable = "1" +Plots = "1" ProgressMeter = "1" +PythonCall = "=0.9.0, =0.9.1, =0.9.2, =0.9.3, =0.9.4, =0.9.5, =0.9.6, =0.9.7, =0.9.8, =0.9.9, =0.9.10, =0.9.11, =0.9.12, =0.9.13, =0.9.14, =0.9.15, =0.9.16, =0.9.17, =0.9.18, =0.9.19, =0.9.20, =0.9.21, =0.9.22, =0.9.23, =0.9.24, =0.9.25, =0.9.26" QuadGK = "2" RecipesBase = "1" RecursiveArrayTools = "2, 3" @@ -103,6 +108,7 @@ Reexport = "1" RingPolymerArrays = "0.1, 1" Roots = "1, 2" Rotations = "1" +SafeTestsets = "0.1" SciMLBase = "1, 2" SciMLOperators = "0.3, 1" StaticArrays = "1" @@ -116,15 +122,3 @@ UnicodePlots = "2, 3" Unitful = "1" UnitfulAtomic = "1" julia = "1" - -# For testing, we should be using the most recent dev versions of our packages by default. -# Override this by manually installing e.g. custom branches first. -[sources] -NQCBase = {rev = "main", url = "https://github.com/NQCD/NQCBase.jl.git"} -NQCCalculators = {rev = "main", url = "https://github.com/NQCD/NQCCalculators.jl.git"} -NQCDistributions = {rev = "main", url = "https://github.com/NQCD/NQCDistributions.jl.git"} -NQCDynamics = {path="../"} -NQCDInterfASE = {rev = "main", url = "https://github.com/NQCD/NQCDInterfASE.jl.git"} -NQCModels = {rev = "main", url = "https://github.com/NQCD/NQCModels.jl.git"} -RingPolymerArrays = {rev = "main", url = "https://github.com/NQCD/RingPolymerArrays.jl.git"} - From 72c1d92b8c43c945e576a3665b8434d7adbed4f4 Mon Sep 17 00:00:00 2001 From: Alexander Spears <39826690+Alexsp32@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:08:19 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=91=B7=20Use=20ParallelTestRunner=20i?= =?UTF-8?q?nstead=20of=20test=20sets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/runtests.jl | 155 +---------------------------------------------- 1 file changed, 2 insertions(+), 153 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index cd57444e5..871ebafcb 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,157 +1,6 @@ using Test -using SafeTestsets +using ParallelTestRunner using NQCDynamics using JSON -const GROUP = get(ENV, "GROUP", "All") - -if GROUP == "All" || GROUP == "Core" - @safetestset "FastDeterminant Tests" begin - include("Core/FastDeterminant.jl") - end - @safetestset "Simulation Tests" begin - include("Core/simulations.jl") - end - @safetestset "Ring Polymer Tests" begin - include("Core/ring_polymers.jl") - end - -end - -if GROUP == "All" || GROUP == "Analysis" - @safetestset "Estimator tests" begin - include("Core/estimators.jl") - end - @safetestset "Structure Manipulation" begin - include("Structure/structure.jl") - end - @safetestset "Diatomic Analysis" begin - include("Analysis/diatomic.jl") - end -end - -if GROUP == "All" || GROUP == "InitialConditions" - @safetestset "Monte Carlo Tests" begin - include("InitialConditions/monte_carlo.jl") - end - @safetestset "AdvancedMH Sampling Tests" begin - include("InitialConditions/advancedmh_sampling.jl") - end - @safetestset "QuantisedDiatomic Tests" begin - include("InitialConditions/quantised_diatomic.jl") - end -end - -if GROUP == "All" || GROUP == "dynamics_classical" - @safetestset "DynamicsUtils Tests" begin - include("Dynamics/DynamicsUtils.jl") - end - @safetestset "Classical Tests" begin - include("Dynamics/classical.jl") - end - @safetestset "BCB Tests" begin - include("Dynamics/algorithms/bcb.jl") - end - @safetestset "Langevin Tests" begin - include("Dynamics/langevin.jl") - end -end - -if GROUP == "All" || GROUP == "dynamics_mdef" - @safetestset "MDEF BAOAB Tests" begin - include("Dynamics/mdef_baoab.jl") - end - @safetestset "MDEF Tests" begin - include("Dynamics/mdef.jl") - end - @safetestset "DiabaticMDEF Tests" begin - include("Dynamics/diabatic_mdef.jl") - end - @safetestset "RPMDEF Tests" begin - include("Dynamics/rpmdef.jl") - end -end - -if GROUP == "All" || GROUP == "dynamics_surface_hopping" - @safetestset "BCBwithTsit5 Tests" begin - include("Dynamics/bcbwithtsit5.jl") - end - @safetestset "FSSH Tests" begin - include("Dynamics/fssh.jl") - end - @safetestset "IESH Tests" begin - include("Dynamics/iesh.jl") - end - @safetestset "Decoherence Tests" begin - include("Dynamics/test_decoherence_corrections.jl") - end - @safetestset "RPIESH Tests" begin - include("Dynamics/rpiesh.jl") - end -end - -if GROUP == "All" || GROUP == "dynamics_cme" - @safetestset "CME Tests" begin - include("Dynamics/cme.jl") - end - @safetestset "BCME Tests" begin - include("Dynamics/bcme.jl") - end - @safetestset "RPCME Tests" begin - include("Dynamics/rpcme.jl") - end - @safetestset "RPBCME Tests" begin - include("Dynamics/rpbcme.jl") - end -end - - -if GROUP == "All" || GROUP == "dynamics_mapping" - @safetestset "Electronic dynamics Tests" begin - include("Dynamics/electronic_dynamics.jl") - end - @safetestset "NRPMD Tests" begin - include("Dynamics/nrpmd.jl") - end - @safetestset "CMM Tests" begin - include("Dynamics/cmm.jl") - end - @safetestset "RPeCMM Tests" begin - include("Dynamics/rpecmm.jl") - end - @safetestset "SpinMapping Tests" begin - include("Dynamics/spin_mapping.jl") - end -end - -if GROUP == "All" || GROUP == "dynamics_ehrenfest" - @safetestset "Ehrenfest Tests" begin - include("Dynamics/ehrenfest.jl") - end - @safetestset "NA Ehrenfest Tests" begin - include("Dynamics/ehrenfest_na.jl") - end - @safetestset "NA RPEhrenfest Tests" begin - include("Dynamics/rp_ehrenfest_na.jl") - end -end - - -if GROUP == "All" || GROUP == "dynamics_ensembles" - @safetestset "Ensemble Tests" begin - include("Ensembles/ensembles.jl") - end - @safetestset "Ensemble Selection Tests" begin - include("Ensembles/selections.jl") - end - @safetestset "Ensemble Reduction Tests" begin - include("Ensembles/reductions.jl") - end - @safetestset "Ensemble Output Tests" begin - include("Ensembles/outputs.jl") - end - @safetestset "Cell Boundary Callback Tests" begin - include("Dynamics/cell_boundary_callback.jl") - end -end - +runtests(NQCDynamics, ARGS) From 164ac314bb72e15e7cad822cb70428f89aba32e4 Mon Sep 17 00:00:00 2001 From: Alexander Spears <39826690+Alexsp32@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:11:40 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=91=B7=20CI=20modified=20for=20parall?= =?UTF-8?q?el=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CI.yml | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b7f80266e..0afc976b0 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -8,20 +8,6 @@ on: jobs: test: runs-on: ubuntu-latest - strategy: - matrix: - group: - - Core - - Analysis - - InitialConditions - - dynamics_classical - - dynamics_mdef - - dynamics_surface_hopping - - dynamics_cme - - dynamics_mapping - - dynamics_ehrenfest - - dynamics_ensembles - fail-fast: false steps: - id: workspace @@ -47,9 +33,6 @@ jobs: ${{ runner.os }}-test-${{ env.cache-name }}- ${{ runner.os }}-test- - - name: Add JuliaMolSim registry - run: julia -e 'using Pkg; Pkg.Registry.add(RegistrySpec(url="https://github.com/JuliaMolSim/MolSim"))' - shell: bash - name: Add ACEregistry run: julia -e 'using Pkg; Pkg.Registry.add(RegistrySpec(url="https://github.com/ACEsuit/ACEregistry"))' shell: bash @@ -60,7 +43,7 @@ jobs: - name: Install ase for IO tests id: install-python - run: | + run: | pip3 install ase echo "python="$(which python) >> $GITHUB_OUTPUT - uses: julia-actions/julia-buildpkg@v1 @@ -69,7 +52,6 @@ jobs: JULIA_CONDAPKG_BACKEND: "Null" - uses: julia-actions/julia-runtest@v1 env: - GROUP: ${{ matrix.group }} BENCHMARK_OUTPUT_DIR: /home/runner/NQCDynamics.jl/NQCDynamics.jl/benchmarks JULIA_PYTHONCALL_EXE: ${{ steps.install-python.outputs.python }} JULIA_CONDAPKG_BACKEND: "Null" @@ -80,7 +62,7 @@ jobs: - name: 'Upload Artifact' uses: actions/upload-artifact@v4 with: - name: ${{ matrix.group }}-timings + name: test-timings path: /home/runner/NQCDynamics.jl/NQCDynamics.jl/benchmarks/*.json retention-days: 21 upload_benchmarks: @@ -90,7 +72,7 @@ jobs: outputs: newest_release_version: ${{ steps.save_tag.current_version }} previous_release_version: ${{ steps.save_tag.last_version }} - steps: + steps: # Now we're in /home/runner/NQCDynamics.jl/NQCDynamics.jl - uses: actions/checkout@v4 with: @@ -165,4 +147,3 @@ jobs: echo "### Unit test benchmark :rocket:" >> "$GITHUB_STEP_SUMMARY" echo "Compared dynamics test timings between ${{ steps.save_tag.outputs.newest_release_version }} and ${{ github.sha }}." >> "$GITHUB_STEP_SUMMARY" echo "Download the results [here](${{ steps.upload-artifact.outputs.artifact-url }})" >> "$GITHUB_STEP_SUMMARY" - From 923848a04aee1cafcc88f03a0addfcf6518c1057 Mon Sep 17 00:00:00 2001 From: Alexander Spears <39826690+Alexsp32@users.noreply.github.com> Date: Tue, 11 Aug 2026 16:21:27 +0200 Subject: [PATCH 4/4] Add instructions for developers and AI agents --- AGENTS.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..bad39e935 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,11 @@ +# Information for developers + +Really these should just be called developer documentation, but hey ho, AI and all that. +I thought I'd hide these instructions in a separate file which LLMs will hopefully find. + +If you're making changes to dynamics propagation, adding new models or new methods, make sure to read the files in `docs/src/devdocs` for guidelines on how to do those things. + +When adding unit tests, make sure to add any new package dependencies to `test/Project.toml`, not the main `Project.toml`. +Unit tests should be as small as practical, as they will be run in parallel automatically. +This means no `include()` statements in test sets. +Any files in `test/` will be read automatically, no need to add anything more to `test/runtests.jl`.