From cf14f7110a9cb0274a4ecec5e1c4d6dec1a000d2 Mon Sep 17 00:00:00 2001 From: Hyunwook Jung <47560396+jungsdao@users.noreply.github.com> Date: Sat, 13 Sep 2025 18:53:34 +0000 Subject: [PATCH 1/5] Update optimize.py --- wfl/generate/optimize.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/wfl/generate/optimize.py b/wfl/generate/optimize.py index 6af51889..0e83d3cd 100644 --- a/wfl/generate/optimize.py +++ b/wfl/generate/optimize.py @@ -34,7 +34,7 @@ def _new_log(self, forces=None): def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=1000, pressure=None, stress_mask=None, keep_symmetry=True, traj_step_interval=1, traj_subselect=None, skip_failures=True, results_prefix='last_op__optimize_', verbose=False, update_config_type="append", - rng=None, _autopara_per_item_info=None, + optimizer=PreconLBFGS, rng=None, _autopara_per_item_info=None, **opt_kwargs): """runs a structure optimization. By default calculator properties will be stored in keys prefixed with "last_op__optimize_", which may be overwritten by next operation. @@ -73,6 +73,8 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 optimisation logs are not printed unless this is True update_config_type: ["append" | "overwrite" | False], default "append" whether/how to add at.info['optimize_config_type'] to at.info['config_type'] + optimizer : ASE optimizer + optimizer to use, default LBFGSPrecon opt_kwargs keyword arguments for PreconLBFGS rng: numpy.random.Generator, default None @@ -93,8 +95,8 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 calculator = construct_calculator_picklesafe(calculator) - if smax is None: - smax = fmax +# if smax is None: +# smax = fmax if keep_symmetry: # noinspection PyUnresolvedReferences,PyUnresolvedReferences @@ -134,7 +136,7 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 else: wrapped_at = at - opt = PreconLBFGS(wrapped_at, **opt_kwargs_to_use) + opt = optimizer(wrapped_at, **opt_kwargs_to_use) # default status, will be overwritten for first and last configs in traj at.info['optimize_config_type'] = 'optimize_mid' @@ -161,7 +163,7 @@ def process_step(): final_status = 'unconverged' try: - opt.run(fmax=fmax, smax=smax, steps=steps) + opt.run(fmax=fmax, steps=steps) except Exception as exc: # label actual failed optimizations # when this happens, the atomic config somehow ends up with a 6-vector stress, which can't be From 3e6971c4934afb0eadc233330ad97c9fa9cb8738 Mon Sep 17 00:00:00 2001 From: Hyunwook Jung Date: Tue, 21 Jul 2026 18:09:01 +0200 Subject: [PATCH 2/5] differentiate precon/normal optimizer --- wfl/generate/optimize.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/wfl/generate/optimize.py b/wfl/generate/optimize.py index 39f267d8..e5371d8c 100644 --- a/wfl/generate/optimize.py +++ b/wfl/generate/optimize.py @@ -95,8 +95,8 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 calculator = construct_calculator_picklesafe(calculator) -# if smax is None: -# smax = fmax + if "precon" in optimizer.__module__.split(".") and smax is None: + smax = fmax if keep_symmetry: # noinspection PyUnresolvedReferences,PyUnresolvedReferences @@ -164,7 +164,10 @@ def process_step(): converged = False try: - converged = opt.run(fmax=fmax, smax=smax, steps=steps) + if smax is None: + converged = opt.run(fmax=fmax, steps=steps) + else: + converged = opt.run(fmax=fmax, smax=smax, steps=steps) except Exception as exc: # label actual failed optimizations # when this happens, the atomic config somehow ends up with a 6-vector stress, which can't be From 3bae7af5fba25f5d977fadf86d96a3ec9c3630c7 Mon Sep 17 00:00:00 2001 From: Hyunwook Jung Date: Tue, 21 Jul 2026 22:30:45 +0200 Subject: [PATCH 3/5] change docstring --- wfl/generate/optimize.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wfl/generate/optimize.py b/wfl/generate/optimize.py index e5371d8c..d911b160 100644 --- a/wfl/generate/optimize.py +++ b/wfl/generate/optimize.py @@ -73,10 +73,10 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 optimisation logs are not printed unless this is True update_config_type: ["append" | "overwrite" | False], default "append" whether/how to add at.info['optimize_config_type'] to at.info['config_type'] - optimizer : ASE optimizer - optimizer to use, default LBFGSPrecon + optimizer : ASE optimizer, default PreconLBFGS + optimizer to use. opt_kwargs - keyword arguments for PreconLBFGS + keyword arguments for optimizer rng: numpy.random.Generator, default None random number generator to use (needed for pressure sampling, initial temperature, or Langevin dynamics) _autopara_per_item_info: dict From 82bc9c2939e2b62bda80d09915e94f74e553bca5 Mon Sep 17 00:00:00 2001 From: Hyunwook Jung Date: Wed, 22 Jul 2026 10:42:13 +0200 Subject: [PATCH 4/5] apply patch --- wfl/generate/optimize.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/wfl/generate/optimize.py b/wfl/generate/optimize.py index d911b160..667bc40c 100644 --- a/wfl/generate/optimize.py +++ b/wfl/generate/optimize.py @@ -95,9 +95,6 @@ def _run_autopara_wrappable(atoms, calculator, fmax=1.0e-3, smax=None, steps=100 calculator = construct_calculator_picklesafe(calculator) - if "precon" in optimizer.__module__.split(".") and smax is None: - smax = fmax - if keep_symmetry: # noinspection PyUnresolvedReferences,PyUnresolvedReferences try: @@ -164,10 +161,17 @@ def process_step(): converged = False try: - if smax is None: - converged = opt.run(fmax=fmax, steps=steps) - else: - converged = opt.run(fmax=fmax, smax=smax, steps=steps) + try: + converged = opt.run(fmax=fmax, smax=smax if smax is not None else fmax, steps=steps) + except TypeError as exc: + if "unexpected keyword argument" in str(exc): + # opt.run doesn't accept smax + if smax is not None: + # passed in explicitly, fail + raise + converged = opt.run(fmax=fmax, steps=steps) + else: # some other error + raise except Exception as exc: # label actual failed optimizations # when this happens, the atomic config somehow ends up with a 6-vector stress, which can't be From 48cbcadac16ae35b2111d55770c3c8655e1d8104 Mon Sep 17 00:00:00 2001 From: Hyunwook Jung Date: Wed, 22 Jul 2026 10:56:20 +0200 Subject: [PATCH 5/5] change buildcell --- .github/workflows/pytests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pytests.yml b/.github/workflows/pytests.yml index 8a5eb0fe..9f585820 100644 --- a/.github/workflows/pytests.yml +++ b/.github/workflows/pytests.yml @@ -209,9 +209,9 @@ jobs: - name: Install buildcell run: | sudo apt-get install gfortran - wget https://www.mtg.msm.cam.ac.uk/system/files/documents/airss-0.9.1.tgz - tar xzf airss-0.9.1.tgz - cd airss-0.9.1 + wget https://www.mtg.msm.cam.ac.uk/files/airss-v0.9.4.tgz + tar xzf airss-v0.9.4.tgz + cd airss make buildcell mkdir -p $HOME/bin cp src/buildcell/src/buildcell $HOME/bin/