Sellaの両方向IRC、原子的JSONによる計算履歴保存・構造からの再開、UMA/AnySolvのジョブ間常駐とFIFOキュー、内部座標拘束と1D/2D緩和スキャン、適応CI-NEBと経路分割、収束・成分表示、射影した振動スペクトルによる熱化学、鏡映を許さない重ね合わせと重複判定を追加しました。操作・数値処理・失敗条件はRESEARCH.mdに記載します。
33615bbfc007f93c2baf7e843a3f470cade58a9c)でJavaScript 119件、Python 100件中96件、Chromium 11系統が成功しました。Pythonの実g-xTB 2件・実UMA 1件・実AnySolv 1件は通常ジョブでskipですが、別ジョブではAnySolv公開compactモデルのCPUエネルギー・力の有限差分・真空基準の試験1件が成功しています。ローカル実行環境で失敗していた子プロセス停止試験もCIで成功しました。公開可能な汎用の水分子サンプルによる機能試験の記録です。実測した範囲と未実施の範囲を区別します。
公式ドキュメントと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/Åで渡します。
psutil.NoSuchProcessで失敗し、GitHub Actionsで再確認します。UMA_TEST_MODEL=uma-s-1p2p1(任意でUMA_TEST_DEVICE=cuda)を明示したローカル環境では、水の実エネルギーと力の有限差分試験を実行できます。skipや偽予測器の合格を実モデルの精度・収束性の検証とは扱いません。CUDA/Windowsネイティブの実機検証も未実施です。9bf48c5eff0520183e77d8f0b68b8f0e7c1c5a8f)は成功。JavaScript100件、Python46件が合格、実g-xTB2件・実UMA1件はskipです。ローカル環境で失敗した既存の子プロセス停止試験も合格しました。Chromium全7スイートが合格し、UMA接続の条件表示・未blur入力の送信・固定MIN・結果適用・JSON保存・接続解除を確認しました。既存の実tblite/Sella、AFIR、CI-NEB、一括MIN、振動モード、手動編集の回帰試験も成功しています。分子ビューの下端にドラッグ用ハンドルを追加し、見出しの「高さ −/+」でも80pxずつ調整できます。手動の高さは160〜1600pxで、このブラウザのlocalStorageへ保存します。「自動」で保存値を削除して画面サイズに応じた従来の高さへ戻します。ハンドルは上下キーで20px、Shift併用で80px調整でき、Home/Endで最小/最大、Enterで自動に戻ります。結果グラフの開閉、全画面、モバイル幅への変更でも手動の高さを保持します。描画領域とcanvasの高さを同期し、高さ操作中も構造列の再生を継続します。分子座標・数値計算・bridge.pyは変更していません。
構造フレーム再生中の回転・ロール・平行移動・ズーム・視点ボタンで再生を継続し、原子編集は停止するよう変更しました。AFIRと外部エンジンのライブ表示を初回オンとし、各チェックのオン/オフとXYZヘッダー表示をlocalStorageへ保存します。装飾見出しの01・02を取り除きました。原子番号・フレーム番号、計算条件・数値処理・bridge.pyは変更していません。
Chromium統合試験へ再読み込み後のチェックと座標書式の復元、フレーム更新をまたぐ回転・パン・ロール・ズーム、視点保持・座標不変、停止ボタンと原子移動操作による停止を追加しました。ライブ表示オフの通信試験は明示的にオフにして保持します。
分子ビューと座標編集の左右構成を維持し、ファイル操作、編集モード、構造作成、計算、表示、結果を別の操作群に整理しました。計算ショートカットは描画直上、構造列の再生は描画直下、投影・視野角は折りたたみ設定へ配置しました。座標欄では座標本文と適用操作を優先し、説明と読み込み設定を下へ移しました。右側に座標・原子編集・AFIRへの移動ボタンを追加し、計算ダイアログの実行・中止・閉じるを下部に固定しました。既存の要素IDと操作を保持し、計算処理・既定値・bridge.pyは変更していません。
Chromium試験に、右側の移動ボタンで座標テキストを保持すること、座標欄のフォーカス、AFIR開閉・編集タブへの移動、および新配置に合わせた折りたたみ表示設定の操作を追加しました。既存の原子選択、計算、結果適用、保存とモバイル試験も実行しました。
現在構造の参照を表示座標へ統一し、計算・編集に使うプレビュー構造をUndo可能な入力へ引き継ぐ処理を追加しました。書き出しと経路端点の参照では入力を変更しません。振動矢印の最大長を独立したスライダーで調整し、各原子の変位比を保持します。物理エンジン・数値アルゴリズム・bridge.pyは変更していません。
Chromium試験に、スライダー操作、表示構造の書き出し、振動プレビューからの実振動解析、および選択したNEBノードのプレビューから実TS計算へ渡す座標の一致を追加しました。
ブラウザのCI-NEB既定値を100ステップ・0.05 eV/Å・最大変位0.03 Å・ばね1 eV/Ų・CI開始5ステップ、TSの力閾値を0.05 eV/Å、振動差分幅を0.001 Åに設定しました。条件は操作モードごとに保持します。画像で指定された計算・投影ボタンを描画直上へ移し、長いヘルプを初期状態で折りたたみました。座標欄は編集タブの外に置き、ライブ経路・結果プレビュー・振動動画の描画座標へ同期します。プレビュー中もコピー可能で、未適用の入力は保持・復元します。数値アルゴリズムとbridge.pyは変更していません。
psutil.NoSuchProcess)。今回の実g-xTB試験と大規模な振動動画の性能測定は未実施です。Chromium統合試験に、ボタン列が描画の上にあること、座標欄がタブ切替後も表示されること、ヘルプ初期折りたたみ、CI/TS既定値とモード別の入力保持、AFIR・CI経路・振動動画と座標欄の一致を追加しました。
AFIR抽出列の取り込み、3構造以上の経路を開く際の初期選択、ノード補間後の再開をCI-NEBへ統一し、通常NEB単独の選択肢を削除しました。ボタンと案内もCI-NEBと明記します。CI開始前のNEB緩和、開始ステップの検証、数値計算、bridge.pyは変更していません。
psutil.NoSuchProcess)。実g-xTBの2件は実行ファイル未指定によりskipであり、今回の実g-xTB試験は未実施です。NEBなどの経路プロファイルで点やスライダーを選択してもライブ取得を止めず、同じノード番号の最新座標・エネルギーを表示します。完了時にも選択を保持します。明示的なライブ更新解除・非表示・入力編集による停止、およびAFIRの過去ステップ選択時の停止は維持しています。ダイアログ外の背景クリックは「閉じる」と同じ動作で、外部エンジンのジョブを中止しません。数値計算・bridge.py・認証は変更していません。
psutil.NoSuchProcess)。実g-xTBの追加試験は未実施です。ブラウザ統合試験には、5ノードの模擬進捗を使ったNEB選択・継続ポーリング・全点のエネルギー更新・座標更新・キーボードフォーカス・最終結果の選択保持を追加しました。この模擬進捗はUI検証専用で、物理計算の検証には数えません。既存の実tbliteによるNEB・CI-NEB・適用・保存・Undoの試験も実行します。
psutil.NoSuchProcess。追加6件では、解析的二原子の鞍点へPRFO/RFOの双方が収束し、L-BFGS/BFGSは極小化すること、最適化履歴へHessian試行点が混入しないこと、負の伸縮曲率から得た虚振動の数値・cm⁻¹/meV単位、2/4点法の評価数、差分キャッシュ削除、振動解析失敗時の構造保持、NEBの全評価済み経路チェックポイントを確認しました。psutil.NoSuchProcessが発生しました。実g-xTBの2件は実行ファイル未指定でskipし、今回の再検証済みとは扱っていません。psutil.NoSuchProcessが発生しましたが、同じ試験はGitHub Actionsで合格しています。psutil.NoSuchProcessが発生しましたが、同じ試験はGitHub Actionsで合格しています。実g-xTBの2件は実行ファイル未指定でskipし、再検証済みとは扱っていません。当時の記録では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内部状態の完全再開には対応していません。
公開画面の水サンプルで、原子1と原子2を順に登録してもA/Bがともに原子団1のままになり、追加を拒否することを再現しました。理由はパネル下部にしか表示されず、追加ボタンの近くでは無反応に見える状態でした。Bを原子団2に変更すると追加でき、「人工項を確認」が有効になることを確認しました。
初期選択を異なる原子団にし、追加の成功・失敗理由をボタン直下にも表示する修正です。物理計算・人工項の式・通信処理は変更していません。
node --test molecule-visualizer/tests/*.test.cjs: 60件合格。初期選択、既存選択の保持、同一原子団・重なり・重複・空のγの拒否、拒否時の入力保持、AFIR対応エンジンの有無による開始ボタンの状態を確認しました。python -m unittest discover -s molecule-visualizer/tests -p 'test_*.py' -v: 20件中17件合格、2件skip、1件error。停止テストが子プロセスを列挙する時点で対象PIDが存在せず、psutil.NoSuchProcessになりました。この環境では今回のUI修正前にも同じ失敗があり、合格には数えていません。afir-ui.js?v=17)でも2つの原子団を登録し、A=f1/B=f2の初期選択、そのままのペア追加、人工項評価を確認しました。同一原子団を手動で選び直した場合にはボタン直下に理由が表示され、登録済みペアは保持されます。25f8e56のGitHub Actionsは成功しました。Python、JavaScript、engine-browser.cjsを含むブラウザ統合試験が合格しました。CIの実エンジンはtbliteで、AFIRの計算・結果JSON保存・構造列適用も対象です。実g-xTBの再検証としては数えていません。GitHub Pagesの公開処理も成功しました。AFIRの既定値と上限を10,000に統一しました。HTML、JavaScript検証、送信データ、PythonのAFIR入力検証を変更し、bridge.pyを1.1.1に更新しました。他の計算モードの既定値150・上限1,000は維持しています。保存済みのAFIR条件は上書きせず、旧bridge.pyで500を超える場合は開始前に更新を案内します。時間制限・収束条件・数値計算法は変更していません。
psutil.NoSuchProcessです。外部エンジンの全モードで最大ステップ数を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には微小なずれがありませんでした。一方、登録済みペアのγの変更で入力欄が再生成され、フォーカスを失うことを確認しました。γだけの更新では同じ入力欄を維持するよう修正しました。
psutil.NoSuchProcess、skipは実g-xTBバイナリ未導入によるものです。「構造列を適用・再生」が構造列を適用するだけで再生を開始しない実装を修正。点・スライダーで構造を選択できる共有グラフ、既定オフのライブ表示、bridge.py 1.2.0の進捗取得を追加しました。数値最適化・人工項・単位は変更していません。
ローカルで、表示切り替えによる入力・保存内容・Undoの保持、再生開始時の座標変化とグラフ同期、10,001点の選択と極値の保持、未取得の途中座標の扱いを確認。Pythonでは表示オン/オフの最終計算結果の一致、全構造評価後の経路とエネルギーの対応、AFIRの差分取得上限・通常応答からの途中座標除外を確認しました。
実g-xTBバイナリでの追加測定は未実施です。該当する2試験はskipのままです。ローカルの既存プロセス停止試験は、この実行環境で子プロセスPIDをpsutilから見つけられず失敗するため、GitHub Actions上の結果も別途確認します。ブラウザ確認では実tbliteを利用し、短時間で完了する環境でもライブ表示を確実に通すため、実計算結果の先頭2構造を一度だけ進捗応答として再送する試験を含めます。
描画エリア上部にグラフの表示切り替えを追加し、カーソル移動だけで構造が切り替わる処理を削除しました。非表示中に届いた進捗や計算完了でグラフを開き直さず、結果と選択位置を保持します。操作メニューは「単一構造の最適化(AFIR法を含む)」の下に通常の最適化とAFIR設定への入口を置き、AFIR選択だけではジョブを開始しません。
結果プレビュー・ライブ表示・フレーム切替で、選択中の座標から推定結合を再判定します。入力や手動結合を変更せず、距離に応じた推定結合の生成・切断を描画へ反映します。物理計算・AFIR人工項・単位・認証は変更していません。
AFIRと通常の最適化結果に、全構造のXYZ保存、番号等分、累積RMS変位の等分による抽出を追加しました。両端点・指定数・順序を保ち、同じフレームを重複選択しません。総変位が0なら番号等分へ切り替えます。XYZは座標を補間せず、元の原子順序と構造番号、物理エネルギー、AFIR人工項・合計を区別して記録します。
bridge.py 1.3.0は通常の最適化の評価済み構造を保持します。ライブ表示のオン/オフは履歴や最終結果を変えません。中止・失敗時は受領済みの途中構造のみを返し、未収束とします。最適化アルゴリズム・力・単位・認証は変更していません。
構造列の保存画面に、指定された# NODE nと--による座標列の形式を追加しました。全構造と抽出後の構造をそれぞれ1ファイルに保存し、0始まりの連番・元の原子順序・座標を保持します。AFIR・通常最適化の履歴と、NEB・CI-NEBなどの最終経路を同じ画面から保存できます。周期セル・エネルギー・GRRM本体の計算条件は含めません。数値計算とbridge.pyは変更していません。
NODE形式の保存名を<名前>_infile.logへ変更しました。計算開始時の構造名を初期値とし、保存画面で名前を変更できます。全構造・抽出構造の全文を、保存と同じ生成処理から読み取り専用欄に表示します。表示のみの操作ではダウンロードせず、形式・ノード数・抽出方法の変更時は旧表示を消します。数値計算・bridge.py・認証は変更していません。
_infile.logでの保存、モバイルでの表示・全選択を確認しました。--/NODE区切り・原子数指定・不正入力・元素順序/セル不一致・ID対応・入力不変性、最低値とCSV、順次実行・構造単位の失敗・中止・通信断の検証を追加。全95件合格。psutil.NoSuchProcess。GitHub Actionsでは同じ全テストの32件合格・2件skipを確認(run 39191891362)。実g-xTB・Windowsネイティブでの今回の一括最適化は未実施。既存の単一構造optimize APIを順番に呼ぶ方式で、Pythonエンジンの数値アルゴリズムには変更なし。
psutil.NoSuchProcess。これを合格には数えない。GitHub Actionsで再確認する。ブラウザ結合試験の再生用入力は、結果適用時と同様に各フレームで判定済みの結合を保持する形式へ変更した。手動編集を再生・ナビゲーションで上書きしない仕様に対応。
0103a562bb9bac55e87fa5377626d1a3e8ba7586)は成功。JavaScript100件、Python37件が合格し、実g-xTBの2件は未指定でskip。ローカルで失敗した既存の子プロセス停止試験もCIでは合格した。psutil.NoSuchProcess。実g-xTBの2件と実UMAの1件は未指定のためskipであり、合格に含めない。計算エンジン・力・単位の実装は変更していない。9c8a52ccc09bcc2c45938157316f00a1dac66d66)成功。JavaScript106件、Python46件が合格、3件skip。新規クリップボード試験を含む全8ブラウザスイートが合格した。PCと390px幅のスクリーンショットを確認し、ツールバーの折り返しと横はみ出しがないことを確認。初回の追加ブラウザ試験は権限拒否を模擬するテストコードの括弧不足で開始できなかったため、修正・構文確認後に再実行した。実UMAモデルと実g-xTBの追加検証は行っていない。f1983178f6987a74870044b9077d9f49bd5138aab532765841dabe0b3bf19b2d も確認。NativeAnySolvを含む追加Python6件が合格。psutil.NoSuchProcess。実g-xTB2件・実UMA1件・通常実行時のAnySolv実モデル1件はskipで、合格には数えない。AnySolv実モデルは上記の専用環境で別途実行。e6a19c182d643c49ff876de3385d5dba6f334290)成功。JavaScript106件、Python51件が合格・4件skip。別ジョブの実AnySolv Compactの1件も合格。全9ブラウザスイートが合格し、UMA/AnySolvの独立spawn・別GPUマスク(モック)・MIN/AFIRへの設定伝達・結果内訳保存と構造適用・補正失敗時の評価済み履歴・中止後の気相再計算・再接続時の解除を確認した。初回追加ブラウザ試験はテストの原子番号を0始まりで指定したため中断し、1始まりへ修正して再実行した。終了後の設定欄の有効化も明示した。既存の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に増やした。ベンチマークは通常の回帰試験とは分離し、未収束ケースを速度向上として集計しない。
psutil.NoSuchProcess。実g-xTB2件・実UMA1件・実AnySolv1件のskipは合格に含めない。独立した実tbliteの経路ベンチマークは上記のとおり実行した。c62ff95fc05b52447eb8a2ff503f098d51727100)成功。Python114件中110件合格・4件skip、JavaScript124件合格、全11ブラウザスイート合格。ローカルでPID環境依存だった子プロセス停止試験もCIでは合格した。別ジョブの実AnySolv Compact CPU試験1件も合格。新LUPのブラウザ試験は制御したAPI応答で条件送信・ライブ描画・保存・履歴・ノード追加を検査し、数値収束はPythonと実tbliteベンチマークで検査した。新経路法の実g-xTB・UMA・GPU上の速度比較は未実施。