インタラクティブモード (Jupyter Notebook)
2025年3月6日
準備
CrySPYをインストールすればASEは自動的にインストールされている. ワークステーションやローカルPCでJupyterを使えるようにしておく. このチュートリアルでは,構造最適化にPure Python EMT calculatorを用いる.このEMTポテンシャルの精度は悪く,デモ用のものなので注意.
exampleのノートブックには汎用機械学習ポテンシャルのCHGNetを使用するコードも書いてあるので,CHGNetを試したい場合は事前にpipでインストールしておく.
入力ファイル
どこか適当なワーキングディレクトリに移動して,まずはexampleをコピーしてくる.下記のどちらからコピー してきても良い.
- CrySPY_utility/examples/interactiveからダウンロード
- インストールしておいたCrySPY utilityからコピーする
インタラクティブモードでも,cryspy.in
を入力ファイルとして使用する.
インタラクティブモードではcalc_in
ディレクトリは使用しない.
input_examples
ディレクトリの中に,いくつかの入力ファイル例が入っているので参考にしてほしい.
ここではEA-vcを用いた下記のcryspy.in
を使用する.EA-vcについてはEA-vcのチュートリアルを見ること.
[basic]
algo = EA-vc
calc_code = ASE
nstage = 1
njob = 10
jobcmd = zsh
jobfile = job_cryspy
[structure]
atype = Cu Au
ll_nat = 0 0
ul_nat = 8 8
[ASE]
ase_python = ase_in.py
[EA]
n_pop = 20
n_crsov = 5
n_perm = 2
n_strain = 2
n_rand = 2
n_add = 3
n_elim = 3
n_subs = 3
target = random
n_elite = 2
n_fittest = 10
slct_func = TNM
t_size = 2
maxgen_ea = 5
end_point = 0.0 0.0
[option]
ノートブック
cryspy_interactive.ipynb
を開いて,上から実行していく.
Check current working directory
最初のセルはファイルやcryspy.inの中身を確認しているだけ.
!pwd
print()
!ls
print()
!cat cryspy.in
Import
コメントアウトされているものは今回は無視して,CrySPYのインタラクティブモードで核となるライブラリをインポートするセルを実行する.
# ---------- import
from cryspy.interactive import action
Initialize CrySPY
このセルは通常の初回実行に対応している.cryspy.in
を読み込んで初期構造が生成される.
# ---------- initial structure generation
action.initialize()
Set calculator
このセルでASEのcalculatorをセットする.ここではASEのEMTを用いる.
# ---------- EMT in ASE
from ase.calculators.emt import EMT
calculator = EMT()
# ---------- CHGNet
#from chgnet.model import CHGNetCalculator
#calculator = CHGNetCalculator()
Restart CrySPY
このセルを実行すると,先ほど生成した初期構造の最適化が始まる. インタラクティブモードでは一つ一つ順番に構造最適化計算を行う.その際に進捗バーも表示される.
# ---------- structure optimization
action.restart(
njob=20, # njob=0: njob in cryspy.in will be used
calculator=calculator,
optimizer='BFGS', # 'FIRE', 'BFGS' or 'LBFGS'
symmetry=True, # default: True
fmax=0.01, # default: 0.01 eV/Å
steps=2000, # default: 2000
)
- njob: 一度の実行で最適化計算を行う構造数.0の場合は
cryspy.in
に書いてある値が使用される. - calculator: 先に設定したcalculatorを代入
- optimizer:
FIRE
,BFGS
,LBFGS
から選択.文字列で指定する. - symmetry: Trueなら対称性を維持した構造最適化を行う
- fmax: 収束判定に使われる原子に働く力の最大値(eV/Å)
- steps: 最大最適化ステップ数
njob
の値を小さくしている場合は,何度かこのセルを実行して,全ての初期構造の最適化を終了させる.
EA-vcを用いている場合,すべて終わると以下のように表示される.
EA is ready
もう一度このセルを実行すると世代交代が行われるので,次世代の構造生成が終了したら,あとは同様にこのセルの実行を繰り返す.
Show results
このセルを実行すると,cryspy_rslt_energy_asc
などのファイルを表示できる.
# ---------- show results
#!cat ./data/cryspy_rslt # Order of structure optimization completion
!cat ./data/cryspy_rslt_energy_asc # show energy ascending order
#!sed -n 2,4p ./data/cryspy_rslt # show i--jth lines
#!tail -n 5 ./data/cryspy_rslt # show last 5 lines
Structure visualization
初期構造や最適化済みの構造をインタラクティブに可視化できる.
from ase.visualize import view
atoms = action.get_atoms('opt', cid=0) # 'init' or 'opt'
view(atoms, viewer='ngl') # viewer = 'ngl', 'ase', or 'x3d'
action.get_atoms('opt', cid=0)
のところでopt
をinit
に変えると,初期構造が確認できる.
cid
で構造IDを指定する.
ASEの機能を使用しているのでviewer
にはngl
, ase
, x3d
が利用できる.
ngl
を使うにはnglviewのインストールが必要なのでpipでインストールしておく.
Energy plot for RS, EA
ランダムサーチ(RS)や進化的アルゴリズム(EA)の場合,下記画像のようなエネルギーグラフを表示できる. EA-vcの場合は原子数が異なるので単純にエネルギーを比較できないので,後述のconvex hullプロットを使う.
fig, ax = action.plot_E(
title=None,
ymax=2.0,
ymin=-0.5,
markersize=12,
marker_edge_width=1.0,
marker_edge_color='black',
alpha=1.0,
)
Convex hull plot for EA-vc
Interactive plot using Plotly
EA-vcの場合はPlotlyを用いたconvex hullのインタラクティブプロットが利用できる. CrySPYをインストールすればPlotlyは自動的にインストールされている. このconvex hullプロットはpymatgenの機能を用いている.
action.interactive_plot_convex_hull(cgen=None, show_unstable=0.2, ternary_style='2d')
- cgen: どの世代までプロットするかを指定.Noneであれば最新の世代までプロットされる.
- show_unstable: 描画するhull distanceの最大値.
- ternary_style
- 2元系: ternary_style = ‘2d’
- 3元系: ternary_style = ‘2d’, ‘3d’
- 4元系: ternary_style = ‘3d’
2元系ではなく,3元系や4元系で計算しているときは下記のようなインタラクティブプロットが得られる. 左から順に,3元系(ternary_style = ‘2d’),3元系(ternary_style = ‘3d’),4元系(ternary_style = ‘3d’)のプロット
Binary system using matplotlib
このセルを実行すると,matplotlibを用いて2元系のconvex hullをプロットできる.
fig, ax = action.plot_convex_hull_binary(
cgen=None,
show_max=0.2,
label_stable=True,
vmax=0.2,
bottom_margin=0.02,
)
fig # to show plot in jupyter
- cgen: どの世代までプロットするかを指定.Noneであれば最新の世代までプロットされる.
- show_max: 描画するhull distanceの最大値.
- label_stable: 安定相のラベルを表示するかどうか.
- vmax: カラーバーのhull distaceの最大値.
- bottom_margin: y軸の下部のマージン.
Ternary system using matplotlib
もし3元系の探索をしている場合は,このセルを実行することでmatplotlibを使ったconvex hullのプロットができる.
fig, ax = action.plot_convex_hull_ternary(
cgen=None,
show_max=0.2,
label_stable=True,
vmax=0.2,
)
fig # to show plot in jupyter
- cgen: どの世代までプロットするかを指定.Noneであれば最新の世代までプロットされる.
- show_max: 描画するhull distanceの最大値.
- label_stable: 安定相のラベルを表示するかどうか.
- vmax: カラーバーのhull distaceの最大値.
例えば以下のようなプロットが得られる.