()

AFIR追加機能の検証記録

2026-10-20: IRC・履歴・キュー・拘束スキャン・適応経路・解析

Sellaの両方向IRC、原子的JSONによる計算履歴保存・構造からの再開、UMA/AnySolvのジョブ間常駐とFIFOキュー、内部座標拘束と1D/2D緩和スキャン、適応CI-NEBと経路分割、収束・成分表示、射影した振動スペクトルによる熱化学、鏡映を許さない重ね合わせと重複判定を追加しました。操作・数値処理・失敗条件はRESEARCH.mdに記載します。

公開可能な汎用の水分子サンプルによる機能試験の記録です。実測した範囲と未実施の範囲を区別します。

2026-10-19: UMA / fairchem-core接続

公式ドキュメントとPyPI配布版fairchem-core 2.23.0のpretrained_mlip・InferenceSettings・FAIRChemCalculatorを確認し、非周期分子用omolの接続を追加しました。CPU/CUDA、モデル名、float32/64はCLIで指定します。TF32・compile・MoLE mergeは無効です。MIN・AFIR-MIN・CI-NEB・Sella・ASE振動解析の共通処理へeV・eV/Åで渡します。

2026-10-19: 分子描画エリアの高さ調整

分子ビューの下端にドラッグ用ハンドルを追加し、見出しの「高さ −/+」でも80pxずつ調整できます。手動の高さは160〜1600pxで、このブラウザのlocalStorageへ保存します。「自動」で保存値を削除して画面サイズに応じた従来の高さへ戻します。ハンドルは上下キーで20px、Shift併用で80px調整でき、Home/Endで最小/最大、Enterで自動に戻ります。結果グラフの開閉、全画面、モバイル幅への変更でも手動の高さを保持します。描画領域とcanvasの高さを同期し、高さ操作中も構造列の再生を継続します。分子座標・数値計算・bridge.pyは変更していません。

2026-10-18: 再生中の視点操作と表示設定の保存

構造フレーム再生中の回転・ロール・平行移動・ズーム・視点ボタンで再生を継続し、原子編集は停止するよう変更しました。AFIRと外部エンジンのライブ表示を初回オンとし、各チェックのオン/オフとXYZヘッダー表示をlocalStorageへ保存します。装飾見出しの01・02を取り除きました。原子番号・フレーム番号、計算条件・数値処理・bridge.pyは変更していません。

2026-10-18: ワークスペース全体のUI整理

分子ビューと座標編集の左右構成を維持し、ファイル操作、編集モード、構造作成、計算、表示、結果を別の操作群に整理しました。計算ショートカットは描画直上、構造列の再生は描画直下、投影・視野角は折りたたみ設定へ配置しました。座標欄では座標本文と適用操作を優先し、説明と読み込み設定を下へ移しました。右側に座標・原子編集・AFIRへの移動ボタンを追加し、計算ダイアログの実行・中止・閉じるを下部に固定しました。既存の要素IDと操作を保持し、計算処理・既定値・bridge.pyは変更していません。

2026-10-17: 表示構造の計算・書き出しと振動矢印

現在構造の参照を表示座標へ統一し、計算・編集に使うプレビュー構造をUndo可能な入力へ引き継ぐ処理を追加しました。書き出しと経路端点の参照では入力を変更しません。振動矢印の最大長を独立したスライダーで調整し、各原子の変位比を保持します。物理エンジン・数値アルゴリズム・bridge.pyは変更していません。

2026-10-16: 計算既定値・操作配置・描画座標の同期

ブラウザのCI-NEB既定値を100ステップ・0.05 eV/Å・最大変位0.03 Å・ばね1 eV/Ų・CI開始5ステップ、TSの力閾値を0.05 eV/Å、振動差分幅を0.001 Åに設定しました。条件は操作モードごとに保持します。画像で指定された計算・投影ボタンを描画直上へ移し、長いヘルプを初期状態で折りたたみました。座標欄は編集タブの外に置き、ライブ経路・結果プレビュー・振動動画の描画座標へ同期します。プレビュー中もコピー可能で、未適用の入力は保持・復元します。数値アルゴリズムとbridge.pyは変更していません。

2026-10-17: 経路入力と再開をCI-NEBへ統一

AFIR抽出列の取り込み、3構造以上の経路を開く際の初期選択、ノード補間後の再開をCI-NEBへ統一し、通常NEB単独の選択肢を削除しました。ボタンと案内もCI-NEBと明記します。CI開始前のNEB緩和、開始ステップの検証、数値計算、bridge.pyは変更していません。

2026-10-16: NEBライブ表示の選択維持と背景クリック

NEBなどの経路プロファイルで点やスライダーを選択してもライブ取得を止めず、同じノード番号の最新座標・エネルギーを表示します。完了時にも選択を保持します。明示的なライブ更新解除・非表示・入力編集による停止、およびAFIRの過去ステップ選択時の停止は維持しています。ダイアログ外の背景クリックは「閉じる」と同じ動作で、外部エンジンのジョブを中止しません。数値計算・bridge.py・認証は変更していません。

2026-10-16 Sella TS・ASE振動解析・NEBノード補間

2026-10-16 エネルギーを考慮したAFIR抽出・NEB入力

2026-10-16 AFIR・座標パネルの高さ調整

2026-10-16 表示回転の操作修正

過去の検証(2026-10-14)

当時の記録ではJavaScript 54件合格、Python 20件中16件合格・4件skip。人工項の有限差分、複数ペアと原子ID検査、実g-xTBの水分子・短いAFIR計算・停止、ブラウザからの設定・結果保存・適用を確認しています。この記録は今回の実g-xTB再試験を意味しません。

再現手順

リポジトリのルートから、上記のNode/Pythonテストを実行します。Pythonの依存関係はmolecule-visualizer/local-engine/requirements.txtで導入します。Windowsではg-xTBのDLLが見つかるよう、実行ファイルのディレクトリをPATHへ追加し、GXTB_TEST_BINARYをその実行ファイルの絶対パスに設定してください。AFIR_TEST_RECORDにローカル出力先を指定すると、汎用の水分子試験をJSONに保存できます。

画面確認はローカルサービスの手順に従い、--site-dirで同じアプリを配信して再現できます。公開サイトから接続する場合は--allow-origin https://h-nabata.github.ioを指定します。サービスを終了したら、次回は新しいTokenで再接続します。

未実施・対象外

任意の分子での反応成功、TS精密化・振動解析・IRC、UMA連携、ブラウザ内でのg-xTB/UMA実行は未実装・未検証です。対象元素範囲内でも、計算エンジンのパラメータやSCF収束は入力ごとに確認が必要です。OS停止をまたぐ計算継続やFIRE内部状態の完全再開には対応していません。

2026-10-15 ペア追加の操作修正

公開画面の水サンプルで、原子1と原子2を順に登録してもA/Bがともに原子団1のままになり、追加を拒否することを再現しました。理由はパネル下部にしか表示されず、追加ボタンの近くでは無反応に見える状態でした。Bを原子団2に変更すると追加でき、「人工項を確認」が有効になることを確認しました。

初期選択を異なる原子団にし、追加の成功・失敗理由をボタン直下にも表示する修正です。物理計算・人工項の式・通信処理は変更していません。

2026-10-15 最大ステップ数を10,000に変更

AFIRの既定値と上限を10,000に統一しました。HTML、JavaScript検証、送信データ、PythonのAFIR入力検証を変更し、bridge.pyを1.1.1に更新しました。他の計算モードの既定値150・上限1,000は維持しています。保存済みのAFIR条件は上書きせず、旧bridge.pyで500を超える場合は開始前に更新を案内します。時間制限・収束条件・数値計算法は変更していません。

2026-10-16 外部エンジンの上限と数値欄の上下操作

外部エンジンの全モードで最大ステップ数を1〜10,000へ拡張し、bridge.pyを1.1.2へ更新しました。外部エンジンの既定値150、AFIRの既定値10,000は維持しています。旧サービスで1,000を超える外部計算を指定した場合は、ジョブ送信前に更新を案内します。

公開画面で、収束しきい値0.30の上矢印が0.30001、最大変位0.04の上矢印が0.041になることを再現しました。HTMLのminがstepの基準になるためです。数値欄の基準を0へ変更し、実際に計算可能な正の下限はJavaScriptとPythonで引き続き検証します。上下ボタンの刻みは、収束しきい値・変位0.01、ばね定数0.1です。手入力の細かな値を自動で丸めません。

γの100→101には微小なずれがありませんでした。一方、登録済みペアのγの変更で入力欄が再生成され、フォーカスを失うことを確認しました。γだけの更新では同じ入力欄を維持するよう修正しました。

2026-10-15: エネルギープロファイルとライブ表示

「構造列を適用・再生」が構造列を適用するだけで再生を開始しない実装を修正。点・スライダーで構造を選択できる共有グラフ、既定オフのライブ表示、bridge.py 1.2.0の進捗取得を追加しました。数値最適化・人工項・単位は変更していません。

ローカルで、表示切り替えによる入力・保存内容・Undoの保持、再生開始時の座標変化とグラフ同期、10,001点の選択と極値の保持、未取得の途中座標の扱いを確認。Pythonでは表示オン/オフの最終計算結果の一致、全構造評価後の経路とエネルギーの対応、AFIRの差分取得上限・通常応答からの途中座標除外を確認しました。

実g-xTBバイナリでの追加測定は未実施です。該当する2試験はskipのままです。ローカルの既存プロセス停止試験は、この実行環境で子プロセスPIDをpsutilから見つけられず失敗するため、GitHub Actions上の結果も別途確認します。ブラウザ確認では実tbliteを利用し、短時間で完了する環境でもライブ表示を確実に通すため、実計算結果の先頭2構造を一度だけ進捗応答として再送する試験を含めます。

2026-10-16: グラフ操作と表示構造の推定結合

描画エリア上部にグラフの表示切り替えを追加し、カーソル移動だけで構造が切り替わる処理を削除しました。非表示中に届いた進捗や計算完了でグラフを開き直さず、結果と選択位置を保持します。操作メニューは「単一構造の最適化(AFIR法を含む)」の下に通常の最適化とAFIR設定への入口を置き、AFIR選択だけではジョブを開始しません。

結果プレビュー・ライブ表示・フレーム切替で、選択中の座標から推定結合を再判定します。入力や手動結合を変更せず、距離に応じた推定結合の生成・切断を描画へ反映します。物理計算・AFIR人工項・単位・認証は変更していません。

2026-10-16: XYZ構造列の保存・抽出と通常最適化の履歴

AFIRと通常の最適化結果に、全構造のXYZ保存、番号等分、累積RMS変位の等分による抽出を追加しました。両端点・指定数・順序を保ち、同じフレームを重複選択しません。総変位が0なら番号等分へ切り替えます。XYZは座標を補間せず、元の原子順序と構造番号、物理エネルギー、AFIR人工項・合計を区別して記録します。

bridge.py 1.3.0は通常の最適化の評価済み構造を保持します。ライブ表示のオン/オフは履歴や最終結果を変えません。中止・失敗時は受領済みの途中構造のみを返し、未収束とします。最適化アルゴリズム・力・単位・認証は変更していません。

2026-10-16: GRRM LUP infile形式の出力

構造列の保存画面に、指定された# NODE nと--による座標列の形式を追加しました。全構造と抽出後の構造をそれぞれ1ファイルに保存し、0始まりの連番・元の原子順序・座標を保持します。AFIR・通常最適化の履歴と、NEB・CI-NEBなどの最終経路を同じ画面から保存できます。周期セル・エネルギー・GRRM本体の計算条件は含めません。数値計算とbridge.pyは変更していません。

2026-10-16: NODE形式のlogファイル名と全文表示

NODE形式の保存名を<名前>_infile.logへ変更しました。計算開始時の構造名を初期値とし、保存画面で名前を変更できます。全構造・抽出構造の全文を、保存と同じ生成処理から読み取り専用欄に表示します。表示のみの操作ではダウンロードせず、形式・ノード数・抽出方法の変更時は旧表示を消します。数値計算・bridge.py・認証は変更していません。

2026-10-19 一括最適化

2026-10-19 原子固定と結合更新範囲

2026-10-19 選択原子団のコピーと貼り付け

2026-10-19 UMA + AnySolv

2026-10-20 LUP系(CI-String)

収束効率の実測

既存のCI-NEB(FIRE)、追加したCI-String(FIRE/投影L-BFGS)と、従来の再分布なし直交緩和を比較した。GRRMの実装との比較ではない。公開可能な4種類の解析ポテンシャル×2初期経路と、実tbliteのNH3反転を使用。解析ポテンシャルの勾配は有限差分と照合した。全手法で同じ10ノード・端点・初期座標・最大1,000ステップ・最大有効力0.001 eV/Å・最大原子変位0.03 Åを使用。CI開始5ステップ、CI-NEBのばね1 eV/Ų、LUP系は5ステップごとの再分布と残差0.001 Å。自動ノード追加はオフ。

表は実際にポテンシャルへ渡ったエネルギー・力の評価回数。端点・参照TSの準備と検証、報告用計算は含まない。壁時計時間の高速化を示すものではない。CIを使う3手法は全9条件で各自の収束基準を達成し、最高点の物理力も0.001 eV/Å以下だった。

ポテンシャル/初期経路 CI-NEB / FIRE CI-String / FIRE CI-String / L-BFGS L-BFGSの評価回数(CI-NEB比)
curved-soft / 1 738 3530 306 41.5%
curved-soft / 2 770 3490 210 27.3%
curved-stiff / 1 866 1650 242 27.9%
curved-stiff / 2 922 450 170 18.4%
asymmetric-curved / 1 946 1730 194 20.5%
asymmetric-curved / 2 946 1778 242 25.6%
straight-stiff / 1 898 1082 146 16.3%
straight-stiff / 2 1194 1642 170 14.2%
NH3反転 / GFN2-xTB 978 522 146 14.9%

この試験範囲ではL-BFGS版の評価回数がCI-NEBの14.2〜41.5%となったため、LUP系の既定に投影L-BFGSを採用。既存CI-NEBはFIREのまま維持した。FIRE版CI-Stringは解析例8条件中7条件でCI-NEBより遅かったため、「string法なら常に速い」とは解釈しない。小さな解析系・単一分子の結果であり、大分子・GPUモデル・多段階反応一般の速度を保証しない。

L-BFGS版の障壁誤差は解析8条件で最大2.45×10⁻⁸ eV。NH3では独立に平面D3h構造のN–H距離を最適化し、参照TSの最大力6.95×10⁻⁷ eV/Å、0.001 Å・4点差分で有意な虚振動1本(約971.36 cm⁻¹)を確認した。共通端点は別にBFGSで最適化。初期経路は偶数ノードで参照TSを含めない。NH3のL-BFGS版は146評価、最高点の物理力5.52×10⁻⁶ eV/Å、参照障壁との差1.72×10⁻¹² eV。これはGFN2-xTB上の数値的な一致であり、化学的な障壁精度の主張ではない。

直交緩和だけの比較対象は全条件で射影力が収束したが、最高点の物理力が0.028〜0.439 eV/Å残った。CIによるTS候補の収束とは同等でないため、上表の速度比には含めていない。

再現コマンド(numpy 2.5.4、ASE 3.29.0、psutil 7.2.2、tblite 0.7.0、CPU 1スレッド):

OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 python molecule-visualizer/tests/benchmark_lup.py --native --initializations 2 --json /tmp/lup-benchmark.json

APIやUIの既定最大ステップは100で、上のベンチマークだけは厳しい力閾値のため1,000に増やした。ベンチマークは通常の回帰試験とは分離し、未収束ケースを速度向上として集計しない。

回帰・失敗時の検証