diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b76dcf07..bf7da9d3 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -11,7 +11,7 @@ repos:
exclude: ^example/AlN-LDA/
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.6.4
+ rev: v0.6.5
hooks:
- id: ruff
args: [ "--fix", "--show-fixes" ]
diff --git a/doc/changelog.md b/doc/changelog.md
index 25cf858f..70523225 100644
--- a/doc/changelog.md
+++ b/doc/changelog.md
@@ -2,6 +2,10 @@
# Change Log
+## Sep-19-2024: Version 3.5.1
+
+- A small fix.
+
## Sep-13-2024: Version 3.5
- Maintenance release.
diff --git a/doc/conf.py b/doc/conf.py
index cb1804de..a4f00a21 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -60,7 +60,7 @@
# The short X.Y version.
version = "3.5"
# The full version, including alpha/beta/rc tags.
-release = "3.5.0"
+release = "3.5.1"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/index.md b/doc/index.md
index d7272258..8b3bf4d3 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -44,6 +44,7 @@ direct-solution
wigner-solution
workload-distribution
random-displacements
+pypolymlp
cutoff-pair
external-tools
phono3py-api
diff --git a/doc/pypolymlp.md b/doc/pypolymlp.md
new file mode 100644
index 00000000..aca7c093
--- /dev/null
+++ b/doc/pypolymlp.md
@@ -0,0 +1,329 @@
+(pypolymlp-interface)=
+
+# Force constants calculation using pypolymlp (machine learning potential)
+
+**This is an experimental feature.**
+
+With the `--pypolymlp` option, phono3py can interface with the polynomial
+machine learning potential (MLP) code,
+[pypolymlp](https://github.com/sekocha/pypolymlp), to perform training and
+evaluation tasks of MLPs. This feature aims to reduce the computational cost of
+anharmonic force constant calculations by using MLPs as an intermediary layer,
+efficiently representing atomic interactions.
+
+The training process involves using a dataset consisting of supercell
+displacements, forces, and energies. The trained MLPs are then employed to
+compute forces for supercells with specific displacements.
+
+For more details on the methodology, refer to A. Togo and A. Seko, J. Chem. Phys.
+**160**, 211001 (2024) [[doi](https://doi.org/10.1063/5.0211296)].
+
+An example of its usage can be found in the `example/NaCl-pypolymlp` directory
+in the distribution from GitHub or PyPI.
+
+## Requirement
+
+- [pypolymlp](https://github.com/sekocha/pypolymlp)
+- [symfc](https://github.com/symfc/symfc)
+
+## Workflow
+
+1. Generate random displacements in supercells. Use {ref}`--rd
+ ` option.
+2. Calculate corresponding forces and energies in supercells. Use of VASP
+ interface is recommended for {ref}`--sp ` option is supported.
+3. Prepare dataset composed of displacements, forces, and energies in
+ supercells. The dataset must be stored in a phono3py-yaml-like file, e.g.,
+ `phono3py_params.yaml`. Use {ref}`--cf3 ` and {ref}`--sp
+ ` option simultaneously.
+4. Develop MLPs. At this step `phono3py.pmlp` is saved.
+5. Generate displacements in supercells either systematic or random displacements.
+6. Evaluate MLPs for forces of the supercells generated in step 5.
+7. Calculate force constants from displacement-force dataset from steps 5 and 6.
+
+The steps 4-7 are executed in running phono3py with `--pypolymlp`
+option.
+
+### Steps 1-3: Dataset preparation
+
+For the training, the following supercell data are required in the phono3py
+setting to use pypolymlp:
+
+- Displacements
+- Forces
+- Total energies
+
+These data must be stored in phono3py.yaml-like file.
+
+The supercells with displacements are generated by
+
+```
+% phono3py --pa auto --rd 100 -c POSCAR-unitcell --dim 2 2 2
+ _ _____
+ _ __ | |__ ___ _ __ ___|___ / _ __ _ _
+ | '_ \| '_ \ / _ \| '_ \ / _ \ |_ \| '_ \| | | |
+ | |_) | | | | (_) | | | | (_) |__) | |_) | |_| |
+ | .__/|_| |_|\___/|_| |_|\___/____/| .__/ \__, |
+ |_| |_| |___/
+ 3.5.0
+
+-------------------------[time 2024-09-19 14:40:00]-------------------------
+Compiled with OpenMP support (max 10 threads).
+Python version 3.12.4
+Spglib version 2.5.0
+
+Unit cell was read from "POSCAR-unitcell".
+-------------------------------- unit cell ---------------------------------
+Lattice vectors:
+ a 5.603287477054753 0.000000000000000 0.000000000000000
+ b 0.000000000000000 5.603287477054753 0.000000000000000
+ c 0.000000000000000 0.000000000000000 5.603287477054753
+Atomic positions (fractional):
+ 1 Na 0.00000000000000 0.00000000000000 0.00000000000000 22.990
+ 2 Na 0.00000000000000 0.50000000000000 0.50000000000000 22.990
+ 3 Na 0.50000000000000 0.00000000000000 0.50000000000000 22.990
+ 4 Na 0.50000000000000 0.50000000000000 0.00000000000000 22.990
+ 5 Cl 0.50000000000000 0.50000000000000 0.50000000000000 35.453
+ 6 Cl 0.50000000000000 0.00000000000000 0.00000000000000 35.453
+ 7 Cl 0.00000000000000 0.50000000000000 0.00000000000000 35.453
+ 8 Cl 0.00000000000000 0.00000000000000 0.50000000000000 35.453
+----------------------------------------------------------------------------
+Supercell (dim): [2 2 2]
+Primitive matrix:
+ [0. 0.5 0.5]
+ [0.5 0. 0.5]
+ [0.5 0.5 0. ]
+Displacement distance: 0.03
+Number of displacements: 100
+NAC parameters were read from "BORN".
+Spacegroup: Fm-3m (225)
+Displacement dataset was written in "phono3py_disp.yaml".
+-------------------------[time 2024-09-19 14:40:00]-------------------------
+ _
+ ___ _ __ __| |
+ / _ \ '_ \ / _` |
+ | __/ | | | (_| |
+ \___|_| |_|\__,_|
+```
+
+For the generated supercells, forces and energies are calculated. Here it is
+assumed to use the VASP code. Once the calculations are complete, the data
+(forces and energies) can be extracted using the following command:
+
+```bash
+% phono3py --sp --cf3 vasprun_xmls/vasprun-{00001..00100}.xml
+```
+
+This command extracts the necessary data and stores it in the
+`phono3py_params.yaml` file. For more details, refer to the description of the
+{ref}`--sp ` option. Currently, supercell energy extraction from
+calculator outputs is only supported when using the VASP interface.
+
+``````{note}
+A set of the VASP calculation results is placed in `example/NaCl-rd`. It is
+obtained by
+
+```bash
+% tar xvfa ../NaCl-rd/vasprun_xmls.tar.xz
+```
+``````
+
+
+### Steps 4-7: Force constants calculation (systematic displacements in step 5)
+
+After developing MLPs, displacements are generated systematically considering
+crystal symmetry.
+
+Having `phono3py_params.yaml`, phono3py is executed with `--pypolymlp` option,
+
+```
+% phono3py-load --pypolymlp phono3py_params.yaml
+ _ _____
+ _ __ | |__ ___ _ __ ___|___ / _ __ _ _
+ | '_ \| '_ \ / _ \| '_ \ / _ \ |_ \| '_ \| | | |
+ | |_) | | | | (_) | | | | (_) |__) | |_) | |_| |
+ | .__/|_| |_|\___/|_| |_|\___/____/| .__/ \__, |
+ |_| |_| |___/
+ 3.5.0
+
+-------------------------[time 2024-09-19 15:20:27]-------------------------
+Compiled with OpenMP support (max 10 threads).
+Running in phono3py.load mode.
+Python version 3.12.6
+Spglib version 2.5.0
+----------------------------- General settings -----------------------------
+HDF5 data compression filter: gzip
+Crystal structure was read from "phono3py_params.yaml".
+Supercell (dim): [2 2 2]
+Primitive matrix:
+ [0. 0.5 0.5]
+ [0.5 0. 0.5]
+ [0.5 0.5 0. ]
+Spacegroup: Fm-3m (225)
+Use -v option to watch primitive cell, unit cell, and supercell structures.
+NAC parameters were read from "phono3py_params.yaml".
+----------------------------- Force constants ------------------------------
+Displacement dataset for fc3 was read from "phono3py_params.yaml".
+----------------------------- pypolymlp start ------------------------------
+Pypolymlp is a generator of polynomial machine learning potentials.
+Please cite the paper: A. Seko, J. Appl. Phys. 133, 011101 (2023).
+Pypolymlp is developed at https://github.com/sekocha/pypolymlp.
+Developing MLPs by pypolymlp...
+Regression: cholesky decomposition ...
+- alpha: 0.001
+- alpha: 0.01
+- alpha: 0.1
+- alpha: 1.0
+- alpha: 10.0
+Clear training X.T @ X
+Calculate X.T @ X for test data
+Clear test X.T @ X
+Regression: model selection ...
+- alpha = 1.000e-03 : rmse (train, test) = 9.39542e+14 9.39543e+14
+- alpha = 1.000e-02 : rmse (train, test) = 9.39542e+14 9.39543e+14
+- alpha = 1.000e-01 : rmse (train, test) = 0.03738 0.04961
+- alpha = 1.000e+00 : rmse (train, test) = 0.03900 0.04742
+- alpha = 1.000e+01 : rmse (train, test) = 0.04058 0.04584
+MLPs were written into "phono3py.pmlp"
+------------------------------ pypolymlp end -------------------------------
+Generate displacements
+ Displacement distance: 0.001
+Evaluate forces in 292 supercells by pypolymlp
+Computing fc3[ 1, x, x ] using numpy.linalg.pinv.
+Displacements (in Angstrom):
+ [ 0.0010 0.0000 0.0000]
+ [-0.0010 0.0000 0.0000]
+Computing fc3[ 33, x, x ] using numpy.linalg.pinv.
+Displacements (in Angstrom):
+ [ 0.0010 0.0000 0.0000]
+ [-0.0010 0.0000 0.0000]
+Expanding fc3.
+fc3 was symmetrized.
+fc2 was symmetrized.
+Max drift of fc3: -0.000000 (zzz) -0.000000 (zzz) -0.000000 (zzz)
+Max drift of fc2: -0.000000 (zz) -0.000000 (zz)
+fc3 was written into "fc3.hdf5".
+fc2 was written into "fc2.hdf5".
+----------- None of ph-ph interaction calculation was performed. -----------
+Dataset generated using MMLPs was written in "phono3py_mlp_eval_dataset.yaml".
+Summary of calculation was written in "phono3py.yaml".
+-------------------------[time 2024-09-19 15:21:41]-------------------------
+ _
+ ___ _ __ __| |
+ / _ \ '_ \ / _` |
+ | __/ | | | (_| |
+ \___|_| |_|\__,_|
+```
+
+Information about the development of MLPs using pypolymlp is provided between
+the `pypolymlp start` and `pypolymlp end` sections. The polynomial MLPs are
+saved in the `phono3py.pmlp` file, which can be reused in subsequent phono3py
+executions with the `--pypolymlp` option when only displacements (and no forces)
+are provided.
+
+After the MLPs are developed, systematic displacements, such as those involving
+the displacement of one or two atoms in supercells, are generated with a
+displacement distance of 0.001 Angstrom. The forces for these supercells are
+then evaluated using pypolymlp. Both the generated displacements and the
+corresponding forces are stored in the `phono3py_mlp_eval_dataset` file.
+
+### Steps 4-6: Force constants calculation (random displacements in step 5)
+
+After developing MLPs, random displacements are generated by specifying
+{ref}`--rd ` option. To compute force constants
+with random displacements, an external force constants calculator is necessary.
+For this, symfc is used which is invoked by `--symfc` option.
+
+Having `phono3py_params.yaml`, phono3py is executed with `--pypolymlp` option,
+
+```
+% phono3py-load --pypolymlp --rd 200 --symfc phono3py_params.yaml
+ _ _____
+ _ __ | |__ ___ _ __ ___|___ / _ __ _ _
+ | '_ \| '_ \ / _ \| '_ \ / _ \ |_ \| '_ \| | | |
+ | |_) | | | | (_) | | | | (_) |__) | |_) | |_| |
+ | .__/|_| |_|\___/|_| |_|\___/____/| .__/ \__, |
+ |_| |_| |___/
+ 3.5.0-dev22+g575c4107
+
+-------------------------[time 2024-09-19 15:33:23]-------------------------
+Compiled with OpenMP support (max 10 threads).
+Running in phono3py.load mode.
+Python version 3.12.6
+Spglib version 2.5.0
+----------------------------- General settings -----------------------------
+HDF5 data compression filter: gzip
+Crystal structure was read from "phono3py_params.yaml".
+Supercell (dim): [2 2 2]
+Primitive matrix:
+ [0. 0.5 0.5]
+ [0.5 0. 0.5]
+ [0.5 0.5 0. ]
+Spacegroup: Fm-3m (225)
+Use -v option to watch primitive cell, unit cell, and supercell structures.
+NAC parameters were read from "phono3py_params.yaml".
+----------------------------- Force constants ------------------------------
+Displacement dataset for fc3 was read from "phono3py_params.yaml".
+----------------------------- pypolymlp start ------------------------------
+Pypolymlp is a generator of polynomial machine learning potentials.
+Please cite the paper: A. Seko, J. Appl. Phys. 133, 011101 (2023).
+Pypolymlp is developed at https://github.com/sekocha/pypolymlp.
+Developing MLPs by pypolymlp...
+Regression: cholesky decomposition ...
+- alpha: 0.001
+- alpha: 0.01
+- alpha: 0.1
+- alpha: 1.0
+- alpha: 10.0
+Clear training X.T @ X
+Calculate X.T @ X for test data
+Clear test X.T @ X
+Regression: model selection ...
+- alpha = 1.000e-03 : rmse (train, test) = 9.39542e+14 9.39543e+14
+- alpha = 1.000e-02 : rmse (train, test) = 9.39542e+14 9.39543e+14
+- alpha = 1.000e-01 : rmse (train, test) = 0.03738 0.04961
+- alpha = 1.000e+00 : rmse (train, test) = 0.03900 0.04742
+- alpha = 1.000e+01 : rmse (train, test) = 0.04058 0.04584
+MLPs were written into "phono3py.pmlp"
+------------------------------ pypolymlp end -------------------------------
+Generate random displacements
+ Twice of number of snapshots will be generated for plus-minus displacements.
+ Displacement distance: 0.001
+Evaluate forces in 400 supercells by pypolymlp
+-------------------------------- Symfc start -------------------------------
+Symfc is a non-trivial force constants calculator. Please cite the paper:
+A. Seko and A. Togo, arXiv:2403.03588.
+Symfc is developed at https://github.com/symfc/symfc.
+Computing [2, 3] order force constants.
+Increase log-level to watch detailed symfc log.
+--------------------------------- Symfc end --------------------------------
+-------------------------------- Symfc start -------------------------------
+Symfc is a non-trivial force constants calculator. Please cite the paper:
+A. Seko and A. Togo, arXiv:2403.03588.
+Symfc is developed at https://github.com/symfc/symfc.
+Computing [2] order force constants.
+Increase log-level to watch detailed symfc log.
+--------------------------------- Symfc end --------------------------------
+Max drift of fc3: -0.000000 (xyx) 0.000000 (zyy) -0.000000 (xyx)
+Max drift of fc2: 0.000000 (xx) 0.000000 (xx)
+fc3 was written into "fc3.hdf5".
+fc2 was written into "fc2.hdf5".
+----------- None of ph-ph interaction calculation was performed. -----------
+Dataset generated using MMLPs was written in "phono3py_mlp_eval_dataset.yaml".
+Summary of calculation was written in "phono3py.yaml".
+-------------------------[time 2024-09-19 15:34:41]-------------------------
+ _
+ ___ _ __ __| |
+ / _ \ '_ \ / _` |
+ | __/ | | | (_| |
+ \___|_| |_|\__,_|
+```
+
+The development of MLPs follows the same procedure as described for the
+systematic displacements (in step 5) above.
+
+After the MLPs are developed, 200 supercells with random directional
+displacements are generated. These displacements are then inverted, resulting in
+an additional 200 supercells. In total, 400 supercells are created. The forces
+for these supercells are then evaluated. Finally, the force constants are
+calculated using symfc.
diff --git a/example/NaCl-pypolymlp/BORN b/example/NaCl-pypolymlp/BORN
new file mode 100644
index 00000000..c6199d2a
--- /dev/null
+++ b/example/NaCl-pypolymlp/BORN
@@ -0,0 +1,4 @@
+# epsilon and Z* of atoms 1 2
+ 2.56345522 0.00000000 -0.00000000 0.00000000 2.56345522 -0.00000000 0.00000000 -0.00000000 2.56345522
+ 1.09044426 0.00000000 -0.00000000 0.00000000 1.09044426 -0.00000000 0.00000000 -0.00000000 1.09044426
+ -1.09044426 -0.00000000 0.00000000 -0.00000000 -1.09044426 0.00000000 -0.00000000 0.00000000 -1.09044426
diff --git a/example/NaCl-pypolymlp/POSCAR-unitcell b/example/NaCl-pypolymlp/POSCAR-unitcell
new file mode 100644
index 00000000..8fc4f52a
--- /dev/null
+++ b/example/NaCl-pypolymlp/POSCAR-unitcell
@@ -0,0 +1,16 @@
+generated by phonopy
+ 1.0
+ 5.6032874770547529 0.0000000000000000 0.0000000000000000
+ 0.0000000000000000 5.6032874770547529 0.0000000000000000
+ 0.0000000000000000 0.0000000000000000 5.6032874770547529
+Na Cl
+ 4 4
+Direct
+ 0.0000000000000000 0.0000000000000000 0.0000000000000000
+ 0.0000000000000000 0.5000000000000000 0.5000000000000000
+ 0.5000000000000000 0.0000000000000000 0.5000000000000000
+ 0.5000000000000000 0.5000000000000000 0.0000000000000000
+ 0.5000000000000000 0.5000000000000000 0.5000000000000000
+ 0.5000000000000000 0.0000000000000000 0.0000000000000000
+ 0.0000000000000000 0.5000000000000000 0.0000000000000000
+ 0.0000000000000000 0.0000000000000000 0.5000000000000000
diff --git a/example/NaCl-pypolymlp/phono3py_disp.yaml.xz b/example/NaCl-pypolymlp/phono3py_disp.yaml.xz
new file mode 100644
index 00000000..d1fcfecd
Binary files /dev/null and b/example/NaCl-pypolymlp/phono3py_disp.yaml.xz differ
diff --git a/phono3py/cui/create_force_sets.py b/phono3py/cui/create_force_sets.py
index 84bec1ff..ed5b654f 100644
--- a/phono3py/cui/create_force_sets.py
+++ b/phono3py/cui/create_force_sets.py
@@ -417,6 +417,7 @@ def _set_forces_and_nac_params(
calc_dataset_fc2["supercell_energies"], dtype="double"
)
- nac_params = get_nac_params(primitive=ph3py_yaml.primitive)
- if nac_params:
- ph3py_yaml.nac_params = nac_params
+ if ph3py_yaml.nac_params is None:
+ nac_params = get_nac_params(primitive=ph3py_yaml.primitive)
+ if nac_params:
+ ph3py_yaml.nac_params = nac_params
diff --git a/phono3py/version.py b/phono3py/version.py
index d6368a53..b8845155 100644
--- a/phono3py/version.py
+++ b/phono3py/version.py
@@ -34,4 +34,4 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-__version__ = "3.5.0"
+__version__ = "3.5.1"