# 問題・結果・試行を保存して共有する

**後で何を確認したいかによって、残すデータを選びます。** 候補の値だけでは、どの問題を評価した結果か分かりません。一方、すべての作業に実験管理を導入する必要もありません。OMMXは、問題と結果の受け渡し、関連データの保存、複数の試行の記録を、必要な範囲で利用できます。

この章は、手元の問題や結果を別の人・プロセスへ渡したい人、試行を後で調べたい人のためのものです。求解や変換の章を先に読む必要はありません。具体的な保存・読出しのコードはAPI Referenceにあります。

## 受け渡す相手と、残す関係で選ぶ

| 目的 | 選ぶもの | 選ぶときに確認すること |
|---|---|---|
| MPS入力に対応する外部ツールへ現在のモデルを渡す | MPSファイル | 相手が扱える式・変数の種類と係数の規約。OMMXのラベルや結果評価のための情報はすべて保持されない |
| 問題、評価結果、表や説明をまとめて渡す | Artifact | 後で必要なデータと、その対応関係を明示的に含める |
| 複数の試行で条件と結果を対応づけて調べる | Experiment | 試行ごとの条件、共通の入力、個別の結果をどの単位で記録するか |

Artifactは関連するデータをまとめる保存の仕組みで、Experimentはその上に試行のまとまりを記録します。ファイル交換だけに試行の階層は不要です。いずれも問題の記述・変換・候補評価には必須ではありません。

例えば、外部ソルバーへMPSを渡しながら、元のOMMXの問題と得られた候補はArtifactに残す使い方ができます。MPSでの受け渡しと、後から結果を解釈するための保存は別の役割です。MPSだけを読み戻しても、変換前のラベルや評価用情報が復元されるとは限りません。

## 後で答えたい問いから記録範囲を決める

| 後で確認したいこと | 残す情報の例 |
|---|---|
| この候補は要求を満たすか | 評価対象の問題、候補または評価結果、業務上の意味を読むためのラベルや報告用指標 |
| 二つの結果は同じ基準で比較できるか | 共通の入力、評価する目的・条件、試行ごとの設定、結果との対応関係 |
| なぜこの変換・設定を選んだか | 元の問題、必要なら変換後の問題、選んだ方針や重み、その理由 |
| 同じ計算をもう一度実行できるか | 入力データに加えて、コードの版、依存パッケージ・ソルバーの版、設定、乱数など再実行に必要な情報 |

例えば、制約違反に加える罰則の重みを変えて得た二つの候補を比較する場合、記録した数値が変換後の目的値なのか、元の問題での評価値なのかを区別する必要があります。重みと結果だけでなく、比較基準となる問題を残すと、その判断を後から確かめられます。比較や採否の考え方は[候補を評価して結果を判断する](evaluate_and_interpret.md)で説明します。

Experimentには、共通の入力や説明と、一回の試行を表すRunごとの条件・データを記録できます。Adapter呼出しを記録する場合、渡した問題・オプションと返った結果が対応づけられます。ただし、Adapter内部で変換された問題、暗黙の設定、作業中のPython変数や実行環境を網羅的に収集するものではありません。後で必要な情報は明示的に残します。

また、試行が正常に終了したことと、実行可能な候補や最適解が得られたことは別です。記録の終了状態だけで結果を採用せず、保存した評価結果と解法側の報告を確認します。

## 読み手が取り出せる形で渡す

同じマシンで後から読みたい場合は、OMMXのローカル保存領域であるLocal Registryを使えます。別の人やマシンへ渡す場合は、ArtifactやExperimentをファイルに書き出すか、リモートレジストリへ配布します。ローカルで記録を確定するだけでは、ファイル転送やリモートへの送信は行われません。

ファイルを受け取った人は、自分のLocal Registryへ取り込み、保存されたデータを読み出せます。送信側のPythonオブジェクトやローカル保存領域を引き継ぐ必要はありません。ただし、ファイルに含めなかった外部データやコードまで届けられるわけではありません。

名前やタグはデータを探す手がかりですが、後から別の内容を指すことがあります。調べた内容を特定したいときは、内容から計算される識別子であるdigestも残します。問題と結果を同じ入れ物へ追加しただけで両者の対応が決まるわけではないため、どの問題を評価した結果かも記録します。

## 読み直す・試行を足す・再実行することを分ける

保存した結果を読み直す操作は、計算の再実行ではありません。Experimentの確定済み記録から新しい試行を追加することや、中断した記録の保存地点から編集を再開することも、ソルバー内部の探索状態を再開することとは異なります。

再実行には、その時点で必要なコード・データ・実行環境が利用できる必要があります。それらを記録しても、外部サービスや乱数、実装の違いによって同じ結果が得られるとは限りません。まず「結果を取り出せる」「条件を調べられる」「計算を再実行できる」のどこまでを目的にするか決めます。

## 具体的な操作へ進む

| 次にしたいこと | 説明と使用例 |
|---|---|
| 問題と結果を保存し、別プロセスから読み出す | {class}`~ommx.artifact.Artifact` |
| 試行の条件・結果を記録し、後から読み出す | {class}`~ommx.experiment.Experiment` |
| 保存済みの試行へ追加する／保存地点から復帰する | {meth}`~ommx.experiment.Experiment.fork`、{meth}`~ommx.experiment.Experiment.restore_from_checkpoint` |
| 外部ツールへMPSを渡す | {meth}`~ommx.Instance.save_mps` |
| 保存したデータを探し、Local Registryを整理する | [Local Registryの運用](../how_to/manage_local_registry.md) |
| リモートレジストリで配布する | [Artifactの共有と認証](../how_to/share_artifact_registry.md) |

他の言語やツールで形式を直接扱う場合は、[Message定義](https://github.com/Jij-Inc/ommx/tree/main/proto)と[Artifact形式仕様](https://github.com/Jij-Inc/ommx/blob/main/rust/ommx/doc/artifact_design.md)を参照してください。SDKの版と、保存データの形式・種別の版は別なので、受信側の対応形式も確認します。
