ASE 3.27 での リファクタリングの一環で、フィルター関連のクラス は 従来の constraints モジュール からfilters モジュールに移動したため、従来の ase.constraints からのインポート方法では読み込めず、エラーが発生します。エラーが発生した場合は、ase.filters モジュールから読み込むようにコードを書き換えてご利用ください。
また、ExpCellFilter は セル変数に対する勾配計算が数学的に厳密ではない(解析微分と数値微分がコンシステントではない)という問題を抱えているため、その問題を解決した FrechetCellFilter への移行をお勧めします。
なお、FrechetCellFilter を含む Filters モジュールは ASE 3.23 以降で実装されています。
filters モジュールに実装されているクラス一覧
FilterStrainFilterUnitCellFilterExpCellFilter-
FrechetCellFilter
※FrechetCellFilterは ASE 3.23 で新しく導入されたクラスであり、従来のase.constraintsには存在しません。
参照リンク:
- ASE Release note:https://ase-lib.org/releasenotes.html#version-3-27-0
-
ase.constarintsにおけるExpCellFilterのソースコード: https://gitlab.com/ase/ase/-/blob/3.23.0/ase/constraints.py#L2417 -
ase.filtersにおけるFrechetCellFilterのソースコード:https://gitlab.com/ase/ase/-/blob/3.23.0/ase/filters.py#L495 - fix cell gradient in
ExpCellFilter(MR!3024):https://gitlab.com/ase/ase/-/merge_requests/3024
警告メッセージの例:ASE 3.23 ~ 3.26 において ase.constarints から ExpCellFilter をインポートした場合に以下のように表示されます。
/tmp/ipykernel_2550684/1537781631.py:11: FutureWarning: Import ExpCellFilter from ase.filters
filt = ExpCellFilter(atoms)
/home/jovyan/.py311/lib/python3.11/site-packages/ase/constraints.py:2449: DeprecationWarning: Use FrechetCellFilter for better convergence w.r.t. cell variables.
super().__init__(*args, **kwargs)
なお、2026年1月21日現在の最新版 pfp-api-client 2.0.2 に含まれる ASE のバージョンは 3.26 です。特別な理由がない場合は、ASE のみを 3.27 に更新せずに、pfp-api-client に合わせて更新することをお勧めします。
エラーの詳細:
ASE 3.27 以降では、 ase.constraints からフィルターのインポートしようとすると、インポートエラーが起きます。
インポートエラー例:ASE3.27 で ase.constraints から読み込んだ ExpCellFilter を実行した場合、以下のように表示されます。
コード例:上記エラーを再現したい場合は、ASE 3.27 で以下のように実行してください。
from ase.constraints import ExpCellFilter
from ase.build import bulk
atoms = bulk('Cu', 'fcc', a=3.6)
filt = ExpCellFilter(atoms)
対処:
フィルターは ase.filters からインポートしてください。ASE 3.23 ~3.26 でも 下記のように ase.filters からの読み込みで動作します。
コード例;ExpCellFilter
from ase.filters import ExpCellFilter
from ase.build import bulk
atoms = bulk('Cu', 'fcc', a=3.6)
filt = ExpCellFilter(atoms)
FrechetCellFilter を利用する場合は以下のようにします。
コード例:FrechetCellFilter
from ase.filters import FrechetCellFilter
from ase.build import bulk
atoms = bulk('Cu', 'fcc', a=3.6)
filt = FrechetCellFilter(atoms)