rmfit プロセス
rmfit (/groups/rdeboer1/user/rdeboer1/R-matrix/rmfit/、そこにREADMEあり) は、評価者が手作業で行うこと——ポリッシュ、干渉符号の反転、レベルの追加または削除、疑わしいデータセットの除外——を、再開可能なステップとして実行します。これらのステップはスクリプトによって1つのクラスタノード上で実行され、新しいセッションは STATUS.md から状態を読み取って続行できます。これはパッケージとしてインストールされていません。
export PYTHONPATH=/groups/rdeboer1/user/rdeboer1/R-matrix
python3 -m rmfit.cli <campaign_dir> <command> [options]
新しい反応に対する最初のコマンドの前に、このファイルを最初から最後まで読んでください。キャンペーンを再開する場合は、「状態を読み取る」と「ループ」のセクションで十分です。改良点は最後のログに記録します。
1. 状態を読み取り、決して再計算しない
キャンペーンディレクトリには、新しいセッションに必要なすべてが含まれています。
STATUS.md— 構造ごとの最良検証目的関数、最近のラウンドとログ行。statusで再生成します。status --jsonでコンパクトなダンプが得られます。readme— 実験ノート(rmfitは各ラウンドごとに1段落を追加します。log "..."で自分で追加できます)。アーカイブの慣例:何かに触れる前に読んでください。campaign.log— ドライバーが出力したすべての行。rmfit_sge.log/rmfit_*.log— クラスタジョブのログ。ledger.sqlite+candidates/*.npz— すべての候補ベクトルとスコア。最良解(incumbent)は、verifiedスコア(完全なモデルの新しいシングルセッション評価)を持つ最良の候補です。シャード数はランク付けに使用され、検証された数値が報告されます。campaign.json— ベースモデル、エンジンフラグ、シャード数、境界ポリシー、検索設定。<reaction>.azr+.sav— 最良解のGUIレビュー用エクスポート。variants/— シャードファイル、ウィンドウモデル、レベルあり/なしファイル(使い捨て)。
最初に qstat -u $USER を実行します。1つのキャンペーンコマンドを1つのディレクトリにつき1つだけ実行します(これらは台帳と variants/ を共有します)。ログインノードは status、report、log、export、および短いテスト(<= 6ワーカー、<= 30分)に使用します。それ以外はすべてジョブとして実行します。
2. 新しい反応でキャンペーンを開始する
前提条件(これらはキャンペーンディレクトリではなく、反応のフィットディレクトリで行ってください):
- GUIで開く
.azrファイルで、data/ディレクトリ、output/ディレクトリ、readmeファイルがあること。この反応で使用するCLIモードフラグ(--use-brune、--ignore-externals、--no-long-wavelength、...)を知っておいてください。これらは.azrにはなく、反応によって異なります(~/R-matrix/CLAUDE.mdに記載)。rmfitは--flagsJSONとしてそれらを必要とします。 - その上に構築する前に、最後に完了したフィットを再現します:名前で
param.savをロードし(pyazr)、目的関数がchiSquared.out(chi2 + ノルムペナルティ)と一致することを確認し、それをクリーンなファイルに焼き付け(rmfit.engine.bake)、空の外部ファイルを使用してモード1のCLIでチェックします。.savを外部ファイルとして「検証」された焼き付けは決して信頼しないでください(それは<levels>を上書きします)。また、実行中またはクラッシュしたフィットのパラメータは決して使用せず、最後に完了したものだけを使用します。非アクティブなレベル行を削除します。 - 新しいデータセットを焼き付けられたファイルにマージします(
AzrModel.add_data_segment)。レベルスキームがカバーするエネルギー範囲に制限し(set_segment_energy_range)、ノルマリゼーションは自由に設定し、系統誤差はその論文を反映するように設定します。すべての新しいファイルを確認します。単一の負の断面積やスパイクが目的関数を支配する可能性があります。 - これらすべてを反応ディレクトリの
readmeに記録します。
最初のフィット:グローバルフィットの前に開始パラメータを構築する(DeBoer, 2026-10-25 — 後日再評価)
暫定版。 これはDeBoerの一般的な提案であり、エンドツーエンドで試される前に書き留められたものです。実際のフィットが得られたら(この手順を使用する最初の反応、10B+a/10-25-26_Rmatrix_Claude)、何が機能し、何が機能しなかったかをここに記録し、それに応じて手順を変更または削除してください。
DeBoer:「1つの代表的なデータセットのノルムを固定し、他のデータセットは変化させる。これにより、最初は断面積に対してより固定されたスケールが提供されるが、一貫性のないノルムだが一貫性のある形状を持つデータセットがフィットを妨げることはない。我々の場合、すべてのチャンネルにデータがあるので、最初は我々のデータを固定し、他のデータセットを変化させることを提案する。また、各粒子対について最も低いLチャンネルを変化させることを許可し、文献がそのチャンネルへの分岐を与えていない場合でも、すべてのレベルに小さな非ゼロ値を与えるべきである。低エネルギーから始めて、1つのレベルずつポリッシュを行い、どれだけデータに適合できるかを見ることを提案する。その後、共鳴が明らかに存在し、既知のレベルのエネルギーや幅と一致しない場所にレベルを追加してみる。十分に良い開始パラメータが得られるまで、実際のフィットは試みるべきではない。」
手順として:
- 1つの代表的なデータセットでスケールを固定する。 そのノルムを1に固定します(すべてのチャンネルをカバーする我々自身のデータの場合)。他のすべてのデータセットのノルムは変化させます。これにより、一貫性のある形状だが異なるスケールを持つデータセットがフィットを妨げることはありません。
- すべてのレベルについて、すべてのペアの最低Lチャンネルをシードする。 小さな非ゼロ振幅(0.01 γ_W、エンジンで設定。物理的なプレースホルダーは非常に小さい。2026-10-25のシーディングエントリを参照)を与えます。文献にそのチャンネルへの分岐がリストされていない場合でも同様です。
- フィット範囲内で開くすべてのチャンネルは、デフォルトでモデルに含める。 フィット範囲が拡張される(新しいエネルギーウィンドウ、またはより高いエネルギーに達するデータセット)たびに、範囲のTOPより下で開くすべてのパーティション(各残存核の各励起状態(ENSDF)およびその他の軽粒子パーティション(d、t、³He、...))をリストします。しきい値 Ex = sepE + e2 を使用します。フィットの前に、各ペアに対して、すべてのレベル上の各チャンネルスピンの最低許容Lを追加します(尋ねられることなく)。しきい値またはその0.5 MeV下にあるレベルには項目2に従ってシードし、背景極には不活性(0、固定)にします。それ以外では不活性にします。新しい出口をすべての合計セグメント(全断面積、全(n,p)、(n,α)、...)に追加します。しきい値でデータウィンドウをキャップしないでください。キャップは一時しのぎです:それを強制したチャンネルとともに readme に記録し、評価者のためにリストアップしてください。
(DeBoer 2026-10-30、11B+α HE拡張:ELBE ¹⁴N+n 全断面積は E_n 5.1 MeV でキャップされていました。¹⁴N(n,n₄) にペアがなかったためです。これにより、フィットの上部1.2 MeVが最も強い制約(ノルム固定の全断面積)を失っていました。ビルダーの例:
11B+a/10-27-26_HE_claude/model/add_pairs_he.py、7ペア n4 a3 d0 p1 n5 n6 p2。) - 低エネルギーからレベルごとに。 1つのレベル(そのエネルギーと幅、および自由ノルム)をその周囲のデータに対してポリッシュし、どれだけデータに適合できるかを確認します。
- 次にレベルを追加する 共鳴が明らかに存在し、既知のレベルがそのエネルギーや幅と一致しない場所に。
- そして初めて実際の(グローバル)フィットを行う: 結果に対して
initでキャンペーンを開始します。
理由(10B+α ステージ1、2026-10-25):悪い出発点(χ²/N ≈ 200、2-27-25のレベルで新しいチャンネルがほぼゼロ)からのグローバルポリッシュは、不足している強度をノルマリゼーションと交換しました。すべてのノルムが自由な状態で、ほぼすべてが150回の評価で0.38-0.68に低下しました。0.7-1.5に制限すると、8つが境界に達し、フィットは χ²/N 12.7 で停滞しました。χ² ~ 10⁵ の場合、数パーセントのノルム事前確率はほとんどコストになりません(10B+a/10-25-26_rmfit_stage1、_stage1b)。
次に、新しい日付付きキャンペーンディレクトリ(<reaction>/<M>-<D>-<YY>_rmfit_campaign/)で:
mkdir <dir> && cp <base>.azr <dir>/ && cp -r data <dir>/data && mkdir <dir>/output
python3 -m rmfit.cli <dir> init --base <dir>/<base>.azr [--sav <base>.sav] --nshards 24 \
--flags '{"use_long_wavelength": false, "ignore_externals": true, "use_brune": true}' \
--policy '{"theta2_cap": 1.0, "bg_theta2_cap": 3.0, "bg_energy": <データより上の Ex>, "e_window": 0.3, "norm_range": [0.2, 5.0]}' \
--search '{"top_k": 6, "pairs_per_group": 4, "stage1_nfev": 30, "stage2_nfev": 60, "union_nfev": 100}'
--flags はそのまま pyazr.azure2() に渡されるため、パラメータ化はそこで選択されます:
"use_brune": true(Brune、アーカイブデフォルト)、"use_park": true(Park:フィットベクトルは観測された換算幅振幅を保持します。Gamma = 2 P gamma^2。AZURE2スキルの「Parkのパラメータ化」を参照)、"use_brune": false(標準のLane-Thomas)。キャンペーンごとに1つの基底——台帳のベクトル、.npz スナップショット、.sav コンパニオンはすべてその基底にあります。
オプション --objective JSON(campaign.json objective、deBoer et al. 2017 Sec. on fitting):
{"dataset_weight": "reduced", "dataset_key": "file", "loss": "sivia"}。
dataset_weight: reduced は縮小カイ二乗法です(各データセットのカイ二乗をそのデータ点数で割り、N/Kで再スケーリングして目的関数がカイ二乗の大きさを維持するようにします。ペナルティ行は重み付けなし)——これにより、誤差が小さい大きなデータセットが支配的になるのを防ぎます。loss: sivia はカイ二乗をSiviaのより広いPDFで置き換えます。
-2 log[(1 - e^{-R^2/2})/R^2] - 2 log 2(小さな残差では ~R^2/2、外れ値では ~2 log R^2:外れ値は誤差範囲が拡大されたかのようにダウンウェイトされます)。Sivia損失は、各データセットの参照 chi2/N で標準化された残差に適用されます(loss_scale: dataset、スケールは init によってプレーンベースラインから計算され、campaign.json に保存されます)。これがないと、chi2/N ~ 20-300 のモデルではすべての点が対数テールに位置し、データは二次ノルムペナルティに対して約10倍の重みを失い、フィットはドリフトします(13C+a、2026-09-08:プレーン chi2 701k -> 1,190k が1回のポリッシュで、MANAは放棄され、ノルムは名目値にスナップしました)。どちらの方法も「統計的には正しくないが、誤差範囲が過小評価されている場合に有用」です。目的関数
はキャンペーンのプロパティです:異なる目的関数の下で検証された候補は比較できないため、目的関数の変更は新しいキャンペーンディレクトリを意味します(以前のエクスポートでシードします)。REPORT.md と segment_scores は、目的関数に関わらず、データセットごとのプレーンなカイ二乗を保持します。rmfit/tests/test_objective_13n.py で検証済み。
init はベースラインを検証し(1回の完全モデル評価)、構造を登録し、STATUS.md とジョブスクリプト run_crc_rmfit(24コア long ノード、[email protected] にメール、-m abe)を書き込みます。init を再実行しても、新しい値が指定されない限り、既存の設定は保持されます。ポリシーの意味:theta2_cap は物理レベルのWigner限界ボックス、bg_theta2_cap は背景極(Ex >= bg_energy のレベル、エネルギーは固定)のためのもので、3.0 は最初の推測値であり、物理的なデフォルトではありません:それを信頼する前に、ベースラインの背景振幅がすでにどこにあるかを確認してください(init のキャップ監査)。12C+alpha 弾性散乱は ~100 が必要でした(2026-09-30 のログエントリを参照)。e_window はポリッシュごとのレベルのエネルギー自由度(MeV)です。norm_range は名目ノルマリゼーションの乗数です。narrow_window(オプション、例 {"gamma_kev": 5, "factor": 3, "min_kev": 1})は、自由な部分幅の合計が gamma_kev 未満のレベルを、±e_window の代わりに現在のエネルギーの ±max(min_kev, factor·Γ) 以内に保つため、ポリッシュが狭いレベルをそのピークから遠ざけることができなくなります(13C+a 9/2+ は1回のタイトニングポリッシュで180 keV ドリフトしました)。シャード数 = コア数。シャーディングは正確です(カイ二乗はセグメントに対して加算的)。したがって、より多くのシャードは速度のみを向上させます。
新しいモデルのコストチェック(init 後の campaign.log):1回のシャード化目的関数は数秒、ヤコビアンは数十秒であるべきです。ターゲット効果の畳み込みを持つセグメントが支配的である場合(13C+a でのCierjacksのように)、rmfitはそれ自体でそれを折り畳みます(model.ConvSpec)。複合「合計」セグメントは畳み込みの一部として許可されます。
2b. スペック、監査、決定事項(2026-11-07;R-matrix/rmfit/DESIGN.md のフェーズ1)
init の前に、キャンペーンの スペック を書きます(spec.json、テンプレート rmfit/templates/SPEC_TEMPLATE.json、スキーマは rmfit/spec.py):各データセットの役割(anchor = 名目値でノルム固定、free は prior_sigma 付き、excluded は理由付き、screen)、フィットウィンドウ、フリーズブロック、存在しなければならないペア、境界/目的関数/検索、ドライバーが単独で実行できること(pre_authorized:adopt_level true/false/ルール、flip_adopt、dataset_off_adopt、...)、停止ルール、および所有者と日付が付いた standing decisions。その後:
python3 -m rmfit.audit <base>.azr --out AUDIT.md # 事前チェック、エンジンセッションなし:ゼロ自由幅、1 keVマージ、
# 名目ノルム != 1、normError を分数として、FLAG列を
# エラー、小さな誤差、重複、スパイク、しきい値、テストセグメントの <targetInt>、
# レガシー.sav名、出力パス、エンジンピン
python3 -m rmfit.cli <dir> init --base ... --spec spec.json # フラグ/ポリシー/検索/目的関数/シャード数は、指定されていない限りスペックから取得
# .azr との HIGH 不一致は init を拒否
python3 -m rmfit.cli <dir> spec check # いつでも:SPEC_CHECK.md;spec render -> SPEC.md;audit -> AUDIT.md
HIGH 監査発見事項は、ベースラインの前に修正されるか(またはスペックの standing decisions で受け入れ済みとして記録されます)。キャンペーン中、スペックが答えないものは DECISIONS.md に送られます(rmfit decisions でリスト表示、rmfit decide D-003 "adopt" --by DeBoer で回答)。スペックが事前承認しないレベル追加の accept は、accept-pending として記録され、キューに入れられた決定とともに、採用されません(古い自動採用はスペックのないキャンペーンにのみ適用されます)。コピーするスペックドラフト:10B+a/11-6-26_s5_highE/spec_draft.json、13C+a/11-06-26_merged_regionD/spec_draft.json。
セクション3bの3つのアイドルタイムレビューは、2026-11-07以降、手書きではなく生成されます:
python3 -m rmfit.cli <dir> audit --kind all # audits/{input,data,literature}/PROMPT.md + 空の FINDINGS.md
# 各 PROMPT.md をバックグラウンドサブエージェントに渡します(Agentツール、より安価なモデル、最大3つ同時)。サブエージェントは FINDINGS.md を書き込みます。
python3 -m rmfit.cli <dir> audit --findings # 未検証(候補)の行をすべての FINDINGS.md から取得
python3 -m rmfit.cli <dir> audit --status data 1 confirmed --note "line 4007 check