# 外部計算エンジン連携型 最適化プログラム作成手順書  
― tkoptimize_flex フレームワーク（optimize_ATLAS 系）―

---

## 1. 本手順書の目的

本手順書は、  
`tkoptimize_flex` フレームワークを用いて、

- **Python 内部では評価できない**
- **外部計算エンジン（TCAD / 実行ファイル / DLL）を用いる**
- **計算コストが高い・ブラックボックス的な評価関数**

を対象とした **最適化プログラム**を新規に作成するための  
**実践的な開発手順**をまとめたものです。

典型例としては：

- Silvaco ATLAS / Sentaurus などの TCAD
- 自作 Fortran / C / C++ コード
- 実験装置制御＋測定結果取得
- DLL / SO を介した高速数値計算

を想定しています。

---

## 2. 外部エンジン最適化の基本思想（重要）

---

外部エンジンを用いる最適化では、  
以下の考え方が極めて重要です。

- 評価関数は **遅い**
- 評価関数は **ノイジー**
- 内部構造は **見えない**
- 実行に **失敗する可能性がある**

そのため、本フレームワークでは、

- 最適化アルゴリズムと評価関数を完全分離
- 外部実行を mf / lib 層に隔離
- キャッシュ・サロゲートを前提設計

としています。

---

## 3. 全体構成（外部エンジン型）

---

外部エンジン連携型最適化では、以下の構成を取ります。

---

- optimize_xxx.py  
  メインプログラム（最適化シナリオ）

- optimize_xxx_mf.py  
  外部実行対応 mf（middle framework）

- optimize_xxx_lib.py  
  外部エンジン固有 I/O・解析ライブラリ

- tkoptimize_flex  
  最適化制御フレームワーク

- tkFit_mxy_flex  
  最適化アルゴリズム本体

- tkmlr（任意）  
  サロゲート最適化・機械学習

- 外部計算エンジン  
  （exe / dll / so / 装置制御）

---

## 4. 開発全体の流れ（概要）

---

1. 外部エンジン単体での動作確認  
2. 外部エンジン I/O を扱う lib の作成  
3. mf 層で外部実行を評価関数に変換  
4. メインプログラムで最適化シナリオを定義  
5. サロゲート・尤度評価を含めた拡張  

---

## 5. Step 1  
## 外部計算エンジンの単体確認

---

### 目的

- Python から呼ばなくてもよい
- **外部エンジンが安定して動くこと**を最初に確認する

---

### 確認事項

---

- 入力ファイル（テンプレート）が正しい
- 単一条件で実行できる
- 出力ログが確実に生成される
- 実行時間のオーダーを把握

---

**この段階で不安定なものは、  
最適化に組み込んではいけません。**

---

## 6. Step 2  
## 外部エンジン用 lib（optimize_xxx_lib.py）の作成

---

### 6.1 このファイルの役割

---

optimize_xxx_lib.py は、

- 外部エンジン固有の知識
- 入力ファイル形式
- 出力ログ形式
- 補間・照合ルール

を **すべて引き受ける層**です。

---

### 6.2 実装すべき主な機能

---

- 入力データ読み込み  
  （xlsx / csv / log など）

- 外部エンジン入力ファイル生成  
  （テンプレート展開・自動生成）

- 外部エンジン出力解析  
  （IV, DOS, 物理量など）

- 実測点と計算点の対応付け  
  （補間・照合）

---

### 設計上の注意

---

- mf 層に ATLAS 固有コードを書かない
- lib は **単体テスト可能**にする
- 「最適化」を意識しない

---

## 7. Step 3  
## mf 層（optimize_xxx_mf.py）の作成

---

### 7.1 mf 層の役割

---

mf 層は、

- tkoptimize_flex と外部世界の **唯一の接点**
- 外部実行を **評価関数 y(x)** に変換

するための層です。

---

### 7.2 必須関数

---

- initialize(app)
- initialize_minimize_func(app)
- init_fit(app, cfg)
- read_input_data(app, infile, cfg)
- cal_ylist(app, xk_all, x_list, ...)

---

### 7.3 核心：cal_ylist()

---

cal_ylist() では、

1. パラメータ制約チェック
2. 外部エンジン入力更新
3. 外部エンジン実行（subprocess / ctypes）
4. 出力ログ解析（lib 呼び出し）
5. y_list を返却

を **1 回の関数評価として実装**します。

---

### 推奨事項

---

- lru_cache による結果キャッシュ
- 失敗時のペナルティ付与
- 実行ログの保存

---

## 8. Step 4  
## メインプログラム（optimize_xxx.py）の作成

---

### 8.1 このファイルの役割

---

- CLI 引数定義
- mode 分岐
- 最適化シナリオ制御
- 可視化・後処理

---

### 8.2 外部エンジン特有の mode 例

---

- make_input_data  
  入力データ生成

- update  
  入力ファイル更新

- plot_iv / plot_dos  
  外部計算結果可視化

- plot_dll  
  DLL 動作確認

---

### 8.3 共通最適化 mode

---

以下は内部モデルと完全に共通です。

---

- plot / sim
- lfit / fit
- scan / mapping
- sampling
- mlr（サロゲート）
- error

---

## 9. Step 5  
## 最適化アルゴリズムの選択

---

### 外部エンジン最適化での推奨

---

| 段階 | 推奨手法 |
|---|---|
| 初期探索 | GA / Swarm |
| 安定化 | SIMPLEX |
| 微調整 | Nelder–Mead |
| 高コスト | surrogate（so:xxx） |

---

### 注意

---

- 勾配法は基本的に不向き
- 再実行回数を常に意識する

---

## 10. Step 6  
## サロゲート最適化（強く推奨）

---

### 目的

---

- 外部エンジン実行回数を削減
- 探索効率を向上

---

### 実装ポイント

---

- tkmlr を使用
- GPR / RF / PHYSBO を選択
- 履歴ファイルを学習データとして活用

---

## 11. Step 7  
## 尤度関数による誤差評価

---

### 基本的考え方

---

最小化している評価関数は、

$$
f(\mathbf{x}) \approx -2 \log \mathcal{L}(\mathbf{x})
$$

と解釈できます。

---

### 誤差評価方法

---

- 共分散行列は使用しない
- 1変数ずつ固定してスキャン
- 他パラメータは再最適化

---

$$
\Delta f(x_i)
=
f(x_i) - f_{\min}
$$

---

### 外部エンジン特有の注意

---

- ノイズによる揺らぎを考慮
- 同一点の再評価も検討

---

## 12. 実践的な注意点まとめ

---

- 外部エンジンは「信用しすぎない」
- ログは必ず保存
- 途中で止められる設計にする
- surrogate を早めに導入する

---

## 13. まとめ

---

外部エンジン最適化は、

- 数値最適化
- プロセス制御
- データ同化

が融合した問題です。

tkoptimize_flex フレームワークは、

- 評価関数の所在を問わず
- 同一の最適化思想で扱える

よう設計されています。

本手順書に従えば、

> **「遅くてブラックボックスな外部計算エンジン」を  
> 安全かつ再現性高く最適化に組み込む**

プログラムを構築できます。

---
