Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7b5cda9
Migrate from EquivariantModels.jl to EquivariantTensors.jl
claude Nov 12, 2025
7936bea
Add comprehensive testing documentation for migration
claude Nov 12, 2025
8380f3d
Add CI investigation: Why CI is not running on feature branch
claude Nov 12, 2025
5b486b5
Document fork CI issue: Why PR #1 has no checks
claude Nov 12, 2025
1f4782d
Fix: Remove EquivariantModels to resolve Lux version conflict
claude Nov 12, 2025
9e8563e
Add CI failure diagnosis documentation
claude Nov 12, 2025
ae2d177
Add CLAUDE.md with migration status and development guidance
jameskermode Nov 12, 2025
f3cf7c3
Migration progress: Package compiles, Option 3 implemented
jameskermode Nov 12, 2025
d80560d
Implement force calculations using ForwardDiff - Migration Complete ✅
jameskermode Nov 12, 2025
db8e829
Add ACEbase test dependency and document virial implementation
jameskermode Nov 12, 2025
a433c88
Add performance comparison: Migration shows net improvement
jameskermode Nov 12, 2025
d175e6e
Add model size analysis: 77 vs 120 basis functions explained
jameskermode Nov 12, 2025
4318a1f
Update MIGRATION_STATUS.md: Migration complete and successful
jameskermode Nov 12, 2025
b3009a7
Update documentation for EquivariantTensors v0.3 migration
jameskermode Nov 12, 2025
ea44bec
Fix: Handle SparseVector weights in fast_evaluator
jameskermode Nov 12, 2025
0179aec
Add Julia 1.12 support
jameskermode Nov 13, 2025
0544796
Add degree semantic shift investigation - No adjustment needed
jameskermode Nov 13, 2025
18bb1f2
Expand CI to test Julia 1.11 and 1.12 in parallel
jameskermode Nov 13, 2025
f7cd0bf
Update CI to use Python 3.11 instead of EOL Python 3.8
jameskermode Nov 13, 2025
1c1adf2
Update RMSE test thresholds with scientific baseline methodology
jameskermode Nov 13, 2025
227c267
Refactor: Migrate to upstream SparseACEbasis from EquivariantTensors
jameskermode Nov 13, 2025
3e5e1e6
Fix: Update fasteval.jl for SparseACEbasis (partial - fast_evaluator …
jameskermode Nov 13, 2025
d295ca5
Fix: Disable fast_evaluator due to SparseACEbasis incompatibility
jameskermode Nov 13, 2025
387452e
Mark test_bugs.jl as known failure on Julia 1.12
jameskermode Nov 13, 2025
485b373
Cleanup: Remove temporary files and update CLAUDE.md
jameskermode Nov 13, 2025
f2fe131
cleanup
jameskermode Nov 13, 2025
705a8f6
Bump version to 0.10.0
jameskermode Nov 14, 2025
65185fc
Merge pull request #1 from jameskermode/claude/explore-repo-structure…
jameskermode Nov 14, 2025
6601c42
Merge pull request #303 from jameskermode/equivarient-tensors-port
cortner Nov 15, 2025
4b14f31
minor edits/cleanup
cortner Nov 16, 2025
0910f52
fix basis size bug
cortner Nov 19, 2025
df05b8e
Revert "Update RMSE test thresholds with scientific baseline methodol…
jameskermode Nov 20, 2025
aef7888
more conflict resolution
jameskermode Nov 20, 2025
e8f37cd
Document critical basis size bug fix from commit 0910f528
jameskermode Nov 20, 2025
e5c0670
Update bug fix notes: RMSE thresholds reverted to strict values
jameskermode Nov 20, 2025
900bfdc
Document future Lux-based backend migration roadmap
jameskermode Nov 20, 2025
cd0701d
Revise version details and installation instructions
jameskermode Dec 3, 2025
0714368
Revise Quick Start instructions in README.md
jameskermode Dec 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ jobs:
version:
# - '1.10' (dramatic failures => to be understood)
- '1.11'
- '1.12'
# - 'nightly'
python-version:
- '3.8'
python-version:
- '3.11'
os:
- ubuntu-latest
arch:
Expand Down Expand Up @@ -144,8 +145,8 @@ jobs:
Pkg.pkg"registry add https://github.com/ACEsuit/ACEregistry"
shell: bash -c "julia --color=yes {0}"
- uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
with:
python-version: '3.11'
- uses: julia-actions/julia-buildpkg@v1
- uses: julia-actions/julia-docdeploy@v1
env:
Expand Down
451 changes: 451 additions & 0 deletions CLAUDE.md

Large diffs are not rendered by default.

24 changes: 13 additions & 11 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "ACEpotentials"
uuid = "3b96b61c-0fcc-4693-95ed-1ef9f35fcc53"
version = "0.9.1"
version = "0.10.0"

[deps]
ACEfit = "ad31a8ef-59f5-4a01-b543-a85c2f73e95c"
Expand All @@ -9,12 +9,13 @@ AtomsBase = "a963bdd2-2df7-4f54-a1ee-49d51e6be12a"
AtomsBuilder = "f5cc8831-eeb7-4288-8d9f-d6c1ddb77004"
AtomsCalculators = "a3e0e189-c65a-42c1-833c-339540406eb1"
AtomsCalculatorsUtilities = "9855a07e-8816-4d1b-ac92-859c17475477"
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
Bumper = "8ce10254-0962-460f-a3d8-1f77fea1446e"
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
ChunkSplitters = "ae650224-84b6-46f8-82ea-d812ca08434e"
DynamicPolynomials = "7c1d4256-1411-5781-91ec-d7bc3513ac07"
EmpiricalPotentials = "38527215-9240-4c91-a638-d4250620c9e2"
EquivariantModels = "73ee3e68-46fd-466f-9c56-451dc0291ebc"
EquivariantTensors = "5e107534-7145-4f8f-b06f-47a52840c895"
ExtXYZ = "352459e4-ddd7-4360-8937-99dcb397b478"
Folds = "41a02a25-b8f0-4f67-bc48-60067656b558"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
Expand Down Expand Up @@ -54,25 +55,26 @@ AtomsBase = "0.5"
AtomsBuilder = "0.2.0"
AtomsCalculators = "0.2"
AtomsCalculatorsUtilities = "0.1"
Bumper = "0.6"
BenchmarkTools = "1.6.3"
Bumper = "0.7"
ChunkSplitters = "3.0"
EquivariantModels = "0.0.6"
EquivariantTensors = "0.3"
ExtXYZ = "0.2.0"
Interpolations = "0.15"
PrettyTables = "1.3, 2.0"
Reexport = "1"
StaticArrays = "1"
YAML = "0.4"
Lux = "0.5"
LuxCore = "0.1"
Lux = "1.25"
LuxCore = "1"
RepLieGroups = "0.1.1"
Optimisers = "0.3.4"
Polynomials4ML = "0.3"
Zygote = "0.6"
julia = "1.10, 1.11"
Optimisers = "0.3.4, 0.4"
Polynomials4ML = "0.5"
Zygote = "0.6, 0.7"
julia = "1.10, 1.11, 1.12"
SparseArrays = "1.10"
NamedTupleTools = "0.13, 0.14"
SpheriCart = "0.1"
SpheriCart = "0.2"

[extras]
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
Expand Down
25 changes: 22 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,34 @@
- Version 0.6.x uses `ACE1.jl` as a backend. It is mature and suitable for linear models with few species. This is not longer actively developed, but critical bugfixes can still be provided. [[docs-v0.6]](https://acesuit.github.io/ACEpotentials.jl/v0.6/)
- Version 0.7.x is reserved
- Version 0.8.x and onwards provides a new and much more flexible implementation, and integrates with the [AtomsBase](https://github.com/JuliaMolSim/AtomsBase.jl) ecosystem. Most but not all features from 0.6.x have been ported to this re-implementation. Usability should be the same or improved for most end-users. For developers this provides a much more flexible framework for experimentation. [[docs-v0.8]](https://acesuit.github.io/ACEpotentials.jl/dev/)
- Version 0.9 onwards is technically compatible with Julia 1.10, but some unit tests show unexplained increases in fit accuracy, hence we highly recommend to use it only with Julia 1.11.
- Version 0.9.0 onwards is technically compatible with Julia 1.10, but some unit tests show unexplained increases in fit accuracy, hence we highly recommend to use it only with Julia 1.11.
- Version 0.10 migrates internally to `EquivariantTensors.jl` for improved maintainability, flexibility for model building and different execution backends. User-facing API remains unchanged; existing code should mostly continue to work. Note however that support for the fast evaluator used for some Hessian calculations has been (temporarily) dropped. This series of minor releases is compatible with Julia 1.12

## Contributing

Contributions are very welcome. Until clear guidelines and practices are established, we recommend to open an issue where the bugfix or enhancement can be discussed, before starting a pull request. We will do our best to respond in a timely manner.

## Quick Start
## Quick Start for v0.10.x

- Install Julia 1.11
- Versions after v0.10.x are registered in the General registry and are compatible with Julia 1.12
- Install Julia 1.12
- Create new folder a.g. `acetutorial`; Open a shell
- Create a new project in `acetutorial` and install `ACEpotentials.jl`
```
julia --project=.
]
add ACEpotentials
```
- Install the Julia tutorials (this installs two Jupyter notebook tutorials)
```julia-repl
using ACEpotentials
ACEpotentials.copy_tutorial()
```
- Work through the tutorials.

## Quick Start for v0.9.x

- Install Julia 1.11
- Create new folder a.g. `acetutorial`; Open a shell
- Create a new project in `acetutorial` and install `ACEpotentials.jl`
```
Expand Down
1 change: 0 additions & 1 deletion docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ ACE models are defined in terms of body-ordered invariant features of atomic env
### Key Dependencies

* [`Polynomials4ML.jl`](https://github.com/ACEsuit/Polynomials4ML.jl) : basic kernels for embeddings and tensors
* [`EquivariantModels.jl`](https://github.com/ACEsuit/EquivariantModels.jl) : tools for equivariant model building
* [`RepLieGroups.jl`](https://github.com/ACEsuit/RepLieGroups.jl) : coupling coefficients for equivariant tensors
* [`ACEfit.jl`](https://github.com/ACEsuit/ACEfit.jl) : unified interface to various regression algorithms
* [`AtomsBase.jl`](https://github.com/JuliaMolSim/AtomsBase.jl) : community interface for atomic structures / systems
Expand Down
42 changes: 24 additions & 18 deletions docs/src/tutorials/asp.jl
Original file line number Diff line number Diff line change
Expand Up @@ -62,38 +62,44 @@ omp_result = ACEfit.solve(solver_omp, Wt .* At, Wt .* yt, Wv .* Av, Wv .* yv);
# We can select the final model, a model with 500 active parameters, and a model with a validation error within 1.3 times the minimum validation error.
# We can use the `ACEfit.asp_select` function to select the desired models from the result.

asp_final = set_parameters!( deepcopy(model),
asp_final = set_parameters!( deepcopy(model),
ACEfit.asp_select(asp_result, :final)[1]);
asp_size_50 = set_parameters!( deepcopy(model),
asp_size_50 = set_parameters!( deepcopy(model),
ACEfit.asp_select(asp_result, (:bysize, 50))[1]);
asp_error13 = set_parameters!( deepcopy(model),
asp_error13 = set_parameters!( deepcopy(model),
ACEfit.asp_select(asp_result, (:byerror, 1.3))[1]);

pot_final = fast_evaluator(asp_final; aa_static = false);
pot_50 = fast_evaluator(asp_size_50; aa_static = true);
pot_13 = fast_evaluator(asp_error13; aa_static = true);
# NOTE: fast_evaluator temporarily disabled due to incompatibility with
# upstream SparseACEbasis (requires major refactoring)
# pot_final = fast_evaluator(asp_final; aa_static = false);
# pot_50 = fast_evaluator(asp_size_50; aa_static = true);
# pot_13 = fast_evaluator(asp_error13; aa_static = true);

err_13 = ACEpotentials.compute_errors(test_data, pot_13);
err_50 = ACEpotentials.compute_errors(test_data, pot_50);
err_fin = ACEpotentials.compute_errors(test_data, pot_final);
# Use the models directly for now
err_13 = ACEpotentials.compute_errors(test_data, asp_error13);
err_50 = ACEpotentials.compute_errors(test_data, asp_size_50);
err_fin = ACEpotentials.compute_errors(test_data, asp_final);


# Similarly, we can compute the errors for the OMP models.

omp_final = set_parameters!( deepcopy(model),
omp_final = set_parameters!( deepcopy(model),
ACEfit.asp_select(omp_result, :final)[1]);
omp_50 = set_parameters!( deepcopy(model),
omp_50 = set_parameters!( deepcopy(model),
ACEfit.asp_select(omp_result, (:bysize, 50))[1]);
omp_13 = set_parameters!( deepcopy(model),
omp_13 = set_parameters!( deepcopy(model),
ACEfit.asp_select(omp_result, (:byerror, 1.3))[1]);

pot_fin = fast_evaluator(omp_final; aa_static = false);
pot_50 = fast_evaluator(omp_50; aa_static = true);
pot_13 = fast_evaluator(omp_13; aa_static = true);
# NOTE: fast_evaluator temporarily disabled due to incompatibility with
# upstream SparseACEbasis (requires major refactoring)
# pot_fin = fast_evaluator(omp_final; aa_static = false);
# pot_50 = fast_evaluator(omp_50; aa_static = true);
# pot_13 = fast_evaluator(omp_13; aa_static = true);

err_13 = ACEpotentials.compute_errors(test_data, pot_13);
err_50 = ACEpotentials.compute_errors(test_data, pot_50);
err_fin = ACEpotentials.compute_errors(test_data, pot_fin);
# Use the models directly for now
err_13 = ACEpotentials.compute_errors(test_data, omp_13);
err_50 = ACEpotentials.compute_errors(test_data, omp_50);
err_fin = ACEpotentials.compute_errors(test_data, omp_final);


# Finally, we can visualize the results along the solution path.
Expand Down
6 changes: 1 addition & 5 deletions src/ACEpotentials.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,9 @@ include("analysis/potential_analysis.jl")
include("descriptor.jl")


# TODO: to be completely rewritten
# TODO: to be completely rewritten or retired
# include("export.jl")

# Experimental
# TODO: this is basically the UFACE interface which we need to revive
# include("experimental.jl")


# ----------------- Exports that seem important to make the tutorials work.

Expand Down
24 changes: 0 additions & 24 deletions src/experimental.jl

This file was deleted.

8 changes: 4 additions & 4 deletions src/models/Rnl_basis.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

import LuxCore: AbstractExplicitLayer,
initialparameters,
import LuxCore: AbstractLuxLayer,
initialparameters,
initialstates
using StaticArrays: SMatrix, SVector
using Random: AbstractRNG
Expand All @@ -27,7 +27,7 @@ const SPL_OF_SVEC{DIM, T} =
}


mutable struct LearnableRnlrzzBasis{NZ, TPOLY, TT, TENV, T} <: AbstractExplicitLayer
mutable struct LearnableRnlrzzBasis{NZ, TPOLY, TT, TENV, T} <: AbstractLuxLayer
_i2z::NTuple{NZ, Int}
polys::TPOLY
transforms::SMatrix{NZ, NZ, TT}
Expand All @@ -41,7 +41,7 @@ mutable struct LearnableRnlrzzBasis{NZ, TPOLY, TT, TENV, T} <: AbstractExplicitL
end


mutable struct SplineRnlrzzBasis{NZ, TT, TENV, LEN, T} <: AbstractExplicitLayer
mutable struct SplineRnlrzzBasis{NZ, TT, TENV, LEN, T} <: AbstractLuxLayer
_i2z::NTuple{NZ, Int}
transforms::SMatrix{NZ, NZ, TT}
envelopes::SMatrix{NZ, NZ, TENV}
Expand Down
Loading
Loading