Optimizeモジュール

Optimizer

FIRELBFGS

matlantis_featuresにある FIRELBFGS をgrrmpyから呼び出せるようにした.
今後matlantis_featuresのアップデートによりFIRELBFGSの位置が変わった場合には修正する必要がある

引用 FIRELBFGSとは

ヒューリスティックにうまくいきそうな最適化アルゴリズムとして、
  • 構造最適化の初期など、不安定な場所では、FIREを用いて勾配を下っていく。

  • ある程度安定点に達したら(Forceなどが小さな値になったら)LBFGS法を用いて高速に収束を試みる。

という方法がうまくいきそうです。
matlantis-features では、このようなアルゴリズムを FIRELBFGS Optimizer として実装をしています。
from grrmpy.optimize import FIRELBFGS

opt = FIRELBFGS(atoms,maxstep_fire=0.2,maxstep_lbfgs=0.2)
opt.run(fmax=0.001,steps=10000)

OptWithCond(STOP機能付きOptimizer)

 from grrmpy.optimize import OptWithCond
 from grrmpy.io import write_html
 from ase.optimize import FIRE
 from ase.neb import NEB

 neb = NEB(images,climb=False,parallel=True)
 opt = OptWithCond(FIRE,neb,maxstep=0.2) # FIREを継承しOptimizerをインスタンス化
 opt.attach_stop(steep_peak(opt,300,30))
 opt.attach_stop(lambda:same_energy_and_fmax(opt,10,2))
 opt.attach(lambda:write_html("NEB.html",images))
grrmpy.optimize.optimizer.OptWithCond(optimizer, atoms, **kwargs)[ソース]
OptWithCond.stopがTrueになると計算が停止するOptimizer
attach_stop()の引数にTrue,Falseを返す関数をアタッチできる.
イタレーション毎にattach_stopで設定した関数が実行され,関数の返り値がTrueになればOptWithCond.stopがTureとなり,計算が停止する.

Parameters:

optimizer: class
継承するoptimizer
atoms: Atoms
Atomsオブジェクト
kwargs:
optimizerの引数
戻り値

Stop機能を付けたOptimizer object

戻り値の型

class

attach

automate_maxstep

grrmpy.optimize.attach.automate_maxstep(opt, maxstep=None)[ソース]

maxstepの値を変更しながら最適化を行なう

Parameters:

opt: optimizer object

Optimizerオブジェクト

maxstep (_type_, optional)
{fmax:maxstep}の辞書で与える.
Noneの場合はNEB(climb=True,False),opt等に合わせて自動で設定する

write_traj

grrmpy.optimize.attach.write_traj(outfile, opt, dist=0.25, mic=None, method=0)[ソース]

最適化中の構造をある条件に従って保存する.

IRC Pathのようなものを作成することができる

method=0 : TS構造からの距離がdistずつ離れるたびに記録
method=1 : 緩和中の移動距離がdistずつ移動するたびに記録

Parameters:

outfile: str

保存先のtrajファイルパス.既に存在するファイルを設定するとエラー

opt: Optimizer object

Optimizer

dist: float

dist Å構造が変化する度に構造を保存する.

mic:
周期境界条件で最小移動規則を適用し距離を算出する場合,True
Noneの場合,計算する構造が周期境界を持っている場合は自動でTrueにする.
method: Int

メソッド

注釈

他のattachとは異なりlambda文でのattachを行なわないことに注意する.
Exampleを参照する.

サンプル

>>> opt = LBFGS(atoms)
>>> opt.attach(write_traj('forward_path.traj',opt))

optimize_eq

grrmpy.optimize.attach.optimize_eq(neb, calc_func=<function pfp_calculator>)[ソース]

iniとfinを最適化しながらNEB計算を行なう

Parameters:

neb: neb object

NEBオブジェクト

calc_func: function object

calculatorを返す関数

same_energy_and_fmax

grrmpy.optimize.attach.same_energy_and_fmax(opt, times, row, force_digit=4, energy_digit=6)[ソース]

同じEnergyとfmaxを繰り返す場合に停止する.

OptWithCondと上で使用する.

Parameters:

opt: optimizer

Optimizer(OptWithCond)

times: int

times回連続で同じfmax,energy繰り返す事態がrow回あれば停止する.

row: int

times回連続で同じfmax,energy繰り返す事態がrow回あれば停止する.

force_digit: int

小数点以下force_digit桁が一致するか

energy_digit: integer

小数点以下energy_digit桁が一致するか

サンプル

>>> from grrmpy.optimize import OptWithCond
>>> opt = OptWithCond(FIRE,atoms,maxstep=0.2)
>>> opt.attach_stop(same_energy_and_fmax(opt,10,2))

steep_peak

grrmpy.optimize.attach.steep_peak(opt, max_ea, nsteps)[ソース]
NEB計算中にあるイメージと隣のイメージとのエネルギー差がmax_ea(kJ/mol)以上になれば計算を停止する.
計算初期はイメージが高く出るのでnsteps(回)イタレーションが終わった後から計測を始める.

Parameters:

opt: optimizer

Optimizerオブジェクト

max_ea: float

隣のイメージとのエネルギー差がmax_ea(kJ/mol)以上になれば計算を停止する

nsteps (_type_):

始めのnsteps回のあとから計測を始める

サンプル

>>> from grrmpy.optimize import OptWithCond
>>> neb = NEB(images,climb=False,parallel=True)
>>> opt = OptWithCond(FIRE,neb,maxstep=0.2)
>>> opt.attach_stop(lambda:steep_peak(opt,300,30))