1. このページの目的
このページでは、optimize_flex フレームワークを用いて 新しい最適化プログラム(optimize_xxx)を作成する手順と設計思想 を解説します。
対象読者は、
- optimize_mup / peakfit / ATLAS を理解した研究者
- 自分用に最適化コードを拡張したい人
- 学生・後継者に設計を伝えたい人
です。
2. 基本方針 ― まず決めるべきこと
新しい最適化プログラムを作る前に、 必ず次の問いに答えてください。
- 評価関数はどこで計算されるか(内部 / 外部)
- パラメータ数は固定か、可変か
- 線形に分離できるパラメータはあるか
- 評価コストは低いか、高いか
これらの答えによって、 optimize_mup 型 / peakfit 型 / ATLAS 型の どれに近いかが自然に決まります。
3. 必要なファイル構成
新しい最適化プログラムは、原則として 次の 3 ファイル構成 で作成します。
- optimize_xxx.py(アプリケーション層)
- optimize_xxx_mf.py(mf 層)
- optimize_xxx_lib.py(任意・外部依存)
内部モデルのみの場合、lib は不要なこともあります。
4. optimize_xxx.py の役割
optimize_xxx.py は、 「最適化そのものを書かない」 ことが最重要です。
このファイルに書くのは、
- CLI 引数定義
- mode(plot / sim / fit / scan 等)の切り替え
- mf 層の呼び出し
- 結果の可視化・保存
であり、
- 評価関数の中身
- 最適化アルゴリズムの実装
は一切書きません。
この制約を守ることで、 プログラムの寿命が大きく延びます。
5. optimize_xxx_mf.py の設計指針
mf 層は、optimize_flex における 最重要ファイル です。
ここで行うことは一つだけです。
「どんなモデルであっても、最適化可能な形に変換する」
mf 層では、最終的に
f(x) → y_list
という関数を提供します。
内部で行ってよい処理は、
- パラメータ展開・整形
- モデル呼び出し
- 外部エンジン実行
- 失敗時の例外処理
- 評価値の整形
です。
逆に、
- 最適化戦略
- 探索順序
をここに書いてはいけません。
6. lib 層を書くべき場合
次のような処理が必要な場合、 optimize_xxx_lib.py を分離してください。
- 外部プログラム用入力ファイル生成
- ログファイル解析
- 装置依存 I/O
- 大量のテキスト処理
lib 層は、 「最適化とは無関係な雑務」 を引き受ける場所です。
mf 層を読みやすく保つために、 積極的に分離することを推奨します。
7. 線形・非線形パラメータの分離
可能な限り、
- 線形パラメータ → lfit
- 非線形パラメータ → fit
に分離してください。
これは、
- 最適化の安定性
- 収束速度
- 誤差評価の信頼性
を大きく改善します。
8. 実装時のチェックリスト
- plot モードで物理的に破綻していないか
- sim モードが単体で動くか
- 失敗時に落ちずに戻るか
- パラメータ境界が守られているか
- scan が実行可能か
これらが満たされていれば、 「optimize_flex 準拠」 と言えます。
9. まとめ
optimize_flex における最適化プログラム作成は、
- アルゴリズムを書く作業ではなく
- モデルと評価を正しく分離する作業
です。
この設計思想を守れば、
- 問題が変わっても
- アルゴリズムが変わっても
コードを書き直す必要はありません。
次のページでは、 外部計算エンジンを用いる場合の 具体的な注意点と実装パターン を解説します。