学習目標
- NIMOの3層モジュラーアーキテクチャを理解する
- コンポーネント間のCSVベースのデータフローを学ぶ
- コアワークフロー関数をマスターする:selection()、preparation_input()、analysis_output()
- AI、ロボット、可視化モジュールがどのように連携するかを理解する
2.1 3層アーキテクチャ
NIMOは、関心事を明確に分離した3つの主要レイヤーで設計されています。このモジュラーアプローチにより、研究者は様々なAIアルゴリズムと様々なロボットシステムを自由に組み合わせることができます。
ベイズ最適化] AI2[BLOX
ランダムフォレスト] AI3[PDC
相図構築] AI4[RE
ランダム] AI5[... 他7種] end subgraph Layer2[レイヤー2: ロボットインターフェース] R1[STAN
標準] R2[NAREE
電気化学] R3[COMBAT
カスタム] end subgraph Layer3[レイヤー3: 可視化] V1[履歴プロット] V2[分布図] V3[相図] end Layer1 -->|CSV| Layer2 Layer2 -->|CSV| Layer1 Layer1 --> Layer3 Layer2 --> Layer3 style Layer1 fill:#667eea,color:#fff style Layer2 fill:#11998e,color:#fff style Layer3 fill:#f093fb,color:#fff
モジュラーアーキテクチャ(Modular Architecture)
システムを独立した交換可能なモジュールに分割するソフトウェア設計手法です。各モジュールは明確に定義されたインターフェースを持ち、他に影響を与えることなくコンポーネントを交換またはアップグレードできます。
レイヤー1: AI最適化モジュール
このレイヤーには、次の実験候補を選択するための11種類のアルゴリズムが含まれています:
| アルゴリズム | 正式名称 | 最適な用途 |
|---|---|---|
| RE | Random Exploration | 初期データ収集 |
| PHYSBO | Bayesian Optimization | 一般的な最適化(推奨) |
| BLOX | Random Forest | 高次元空間 |
| PDC | Phase Diagram Construction | 多相材料 |
| SLESA | Single-Loop Efficient Selection | 高速探索 |
| PTR | Pareto-based Thompson Ranking | 多目的最適化 |
| BOMP | Bayesian Opt. Multi-Phase | 複雑な相図 |
| ES | Evolutionary Strategy | 大域的最適化 |
| COMBI | Combination Search | 離散的組み合わせ |
| RSVM | Ranking SVM | 選好学習 |
| WAM | Weighted Average Model | アンサンブル予測 |
レイヤー2: ロボットインターフェースモジュール
このレイヤーは、物理的なロボットシステムとの通信を担当します:
- STAN: 汎用ロボット向けの標準インターフェース
- NAREE: NIMSの電気化学実験に特化
- COMBAT: ユーザー定義のロボットシステム用カスタムインターフェース
レイヤー3: 可視化モジュール
このレイヤーは、最適化の進捗を監視・分析するためのツールを提供します:
- plot_history: イテレーションごとの最良目的値を追跡
- plot_distribution: サンプリングされた点の分布を可視化
- plot_phase_diagram: 多成分系の相図を生成
2.2 CSVベースのデータフロー
NIMOは、すべてのコンポーネント間のユニバーサルインターフェースとしてCSVファイルを使用します。この設計選択には次のような利点があります:
- 透明性: 各ステップでデータを検査・編集できる
- 移植性: CSV読み書き可能なあらゆるシステムで動作
- デバッグ: 中間ファイルを調べて問題を特定しやすい
- 柔軟性: シミュレーションと実際の実験の両方に対応
CSVファイルの形式
NIMO内のすべてのCSVファイルは一貫した形式に従います:
x1,x2,x3,objective
0.1,0.5,0.4,NaN
0.2,0.4,0.4,NaN
0.3,0.3,0.4,1.25
0.4,0.2,0.4,NaN
0.5,0.1,0.4,2.31
重要なポイント
- 記述子列(x1, x2, x3): 探索空間を定義
- 目的関数列: 最適化する値(NaN = 未テスト)
NaNの目的関数を持つ行は将来の実験候補- 値を持つ行はすでにテスト済み
2.3 コアワークフロー関数
NIMOは、完全な最適化ループを形成する4つの主要関数を提供します:
1. selection() - 次の実験を選択
この関数は、AIアルゴリズムを使用して、未テストのプールから最も有望な候補を選択します。
import nimo
# ベイズ最適化を使用して候補を選択
nimo.selection(
method="PHYSBO", # 使用するAIアルゴリズム
input_file="candidates.csv", # すべての候補を含むファイル
output_file="proposals.csv", # 選択された候補の出力
num_objectives=1, # 目的関数の数
num_proposals=3 # 選択する候補の数
)
パラメータの説明:
method: 使用するAIアルゴリズム(上記の表を参照)input_file: 現在の結果を含むすべての候補のCSVoutput_file: 選択された候補を書き込む場所num_objectives: 単目的の場合は1、多目的の場合は2以上num_proposals: 各サイクルで提案する実験の数
2. preparation_input() - ロボット用に準備
この関数は、選択された提案をロボットシステムが必要とする形式に変換します。
import nimo
# STANロボットインターフェース用に提案を準備
nimo.preparation_input(
machine="STAN", # ロボットシステムの種類
input_file="proposals.csv", # 選択された候補
output_file="robot_input.csv" # ロボット用フォーマット
)
3. analysis_output() - ロボット結果を処理
ロボットが実験を実行した後、この関数は結果をNIMO形式に戻します。
import nimo
# ロボットからの結果を処理
nimo.analysis_output(
machine="STAN", # ロボットシステムの種類
input_file="robot_output.csv", # 生のロボット結果
output_file="results.csv" # 処理された結果
)
4. history() - 進捗を追跡
この関数は、最適化履歴の記録を提供します。
import nimo
# 最適化履歴を取得
history_data = nimo.history(
input_file="candidates.csv",
num_objectives=1
)
print("発見した最良値:", history_data['best_objective'])
print("実験回数:", history_data['num_experiments'])
2.4 完全なワークフロー例
典型的な最適化サイクルで、すべてのピースがどのように組み合わさるかを見てみましょう:
import nimo
import pandas as pd
# 設定
NUM_CYCLES = 10
PROPOSALS_PER_CYCLE = 3
# 初期化: 探索空間を持つ候補ファイルを作成
candidates = pd.DataFrame({
'x1': [i/10 for i in range(11)],
'x2': [1 - i/10 for i in range(11)],
'objective': [float('nan')] * 11
})
candidates.to_csv('candidates.csv', index=False)
# メイン最適化ループ
for cycle in range(NUM_CYCLES):
print(f"\n=== サイクル {cycle + 1} ===")
# ステップ1: 候補を選択
if cycle == 0:
# 最初のサイクル: ランダム選択を使用
method = "RE"
else:
# 以降のサイクル: ベイズ最適化を使用
method = "PHYSBO"
nimo.selection(
method=method,
input_file="candidates.csv",
output_file="proposals.csv",
num_objectives=1,
num_proposals=PROPOSALS_PER_CYCLE
)
# ステップ2: ロボット用に準備
nimo.preparation_input(
machine="STAN",
input_file="proposals.csv",
output_file="robot_input.csv"
)
# ステップ3: [ここでロボットが実験を実行]
# シミュレーションでは、目的値を計算します
# 実際の実験では、robot_output.csvはロボットが生成します
# ステップ4: 結果を処理
nimo.analysis_output(
machine="STAN",
input_file="robot_output.csv",
output_file="results.csv"
)
# ステップ5: 新しい結果で候補ファイルを更新
# (NIMOが内部で処理)
print(f"{PROPOSALS_PER_CYCLE}件の実験が完了")
ワークフローのまとめ
- selection(): AIがテストする最良の候補を選択
- preparation_input(): ロボット用にデータをフォーマット
- [ロボット実行]: 物理的な実験が行われる
- analysis_output(): 結果をNIMO形式に戻す
- 繰り返し: 新しいデータを使ってより良い選択を行う
演習
演習1: データフローを追跡する
この初期candidates.csvが与えられた場合:
x1,x2,objective
0.2,0.8,NaN
0.5,0.5,1.5
0.8,0.2,NaN
NIMOのselection()が行0(x1=0.2, x2=0.8)を次の実験に選択した場合:
- proposals.csvはどのようになりますか?
- ロボットがこのサンプルでobjective=2.1を測定した後、更新されたcandidates.csvはどのようになりますか?
演習2: アーキテクチャのマッチング
各NIMOコンポーネントをその役割にマッチさせてください:
- PHYSBO
- STAN
- plot_history
- RE
役割: A) ロボットインターフェース、B) ベイズ最適化、C) ランダムサンプリング、D) 可視化
まとめ
- NIMOは3層アーキテクチャを使用:AI、ロボット、可視化
- CSVファイルがコンポーネント間のユニバーサルデータ形式として機能
- 4つのコア関数:
selection()、preparation_input()、analysis_output()、history() - モジュラー設計により、異なるAIアルゴリズムと様々なロボットシステムを組み合わせ可能
- 各サイクル:選択 → 準備 → 実行 → 分析 → 繰り返し