> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 検証

> iws.Validation を使って、データフィットで得たパラメータを保留した実験データに対して検証する方法を説明します

`Validation` 要素は、パイプライン前段で生成されたパラメータを使って `objectives` に列挙された実験をシミュレートし、測定データと比較します。フィットしたデータ範囲外への汎化性能を確認するための要素です。

## 最小構成の検証

```python theme={null}
import pybamm
import ionworks_schema as iws
from ionworks import Ionworks

known = iws.direct_entries.DirectEntry(
    parameters={"Ambient temperature [K]": 298.15},
)

# 検証対象の保留実験
val = iws.Validation(
    objectives={
        "0.5C": iws.objectives.CurrentDriven(
            data_input="file:examples/data/chen_synthetic_0.5C/time_series.csv",
            options={"model": pybamm.lithium_ion.SPMe()},
        ),
    },
    summary_stats=[iws.costs.RMSE(), iws.costs.MAE(), iws.costs.Max()],
)

pipeline = iws.Pipeline({"known": known, "validate": val})

client = Ionworks()
submission = client.pipeline.create(pipeline)
client.pipeline.wait_for_completion(submission.id)
```

`summary_stats` を省略すると、測定データと同じ物理単位で報告されるよう適切なデフォルトが補われます。

<Note>
  `Validation.objectives` は `DataFit.objectives` と同じ `type` ベースの判別共用体で検証されます。未知の objective 型、判別キーの欠落や競合、未知の内部キー、辞書でもインスタンスでもない値(例: `{"bad": "RMSE"}`)は送信時に拒否されます。ルールと例の全容は [目的関数 (objective) の厳密な検証](/pipelines/data-fitting/overview#目的関数-objective-の厳密な検証)を参照してください。
</Note>

## 検証結果の取得

`element_results` には目的関数ごとの集約統計量が格納されます。

```python theme={null}
result = client.pipeline.result(submission.id)
print(result.element_results["validate"]["summary_stats"])
```

点ごとの詳細(時系列トレース、プロット設定)は別途保存され、`get_element_metadata` で取得します。

```python theme={null}
metadata = client.pipeline.get_element_metadata(submission.id, "validate")
```

要素名(上記の `"validate"`)はパイプラインの `elements` dict で指定したキーです。`"validate_pristine"` と `"validate_aged"` のように複数の検証要素を 1 つのパイプラインで実行できます。

## 検証プロットに対応しない目的関数

一部の目的関数(代表例は `iws.objectives.Pulse` などの特徴量抽出系の目的関数)は、時系列の検証プロットを生成しません。フィット時に比較対象となる「測定値」が連続したトレースではなく、派生特徴量(パルス抵抗、フィットした傾きなど)であるためです。

このような目的関数に対して検証ステップを実行すると、**検証要素**の結果がプロットデータの代わりに、トップレベルに `validation_not_supported` フラグを持つフラットな辞書として返ります（目的関数ごとのエントリではなく、要素全体が対象です）。

```python theme={null}
result = client.pipeline.result(submission.id)
# 検証要素(ここではパイプラインで付けたキーに従い "validate")の結果の
# トップレベルにフラグが格納されています。
validation = result.element_results["validate"]

if validation.get("validation_not_supported"):
    print(validation["message"])
    # → "Validation plots are not supported for this objective type."
```

フィット自体は実行され、集約統計量も通常どおり報告されます。利用できないのは点ごとの検証プロットだけです。UI では、検証タブに空のチャートや汎用エラーではなく、このメッセージが表示されます。

## フィット後の検証

フィットと検証を同じパイプライン内に置くと、パラメータが自動的に共有されます。

```python theme={null}
pipeline = iws.Pipeline(
    {
        "known": known,
        "fit": fit,           # iws.DataFit、/ja/pipelines/data-fitting/overview を参照
        "validate": val,
    },
)
```

検証ステップは `fit` の最適パラメータを受け取り、保留した実験に対して走らせます。

## Ionworks Studio での検証プロットの確認

検証およびデータフィットの結果は、Ionworks Studio Web アプリ上で対話的なプロットとして表示されます。プロットは以下の操作に対応しています。

* **ズーム**: クリック&ドラッグで領域を拡大
* **パン**: Shift を押しながらドラッグで移動
* **リセット**: ダブルクリックで表示をリセット
* **ホバー**: カーソルを当てて値を確認

初期表示では大規模ジョブでも素早く描画できるよう、ダウンサンプリングされたトレースが表示されます。ズームすると、表示中の x 範囲に対してより高解像度のスライスが自動で再取得されます。データ取得中はローディングインジケータが表示されます。

<Info>
  この挙動は `Validation` 要素と、`DataFit` 要素が生成する検証プロットの両方に適用されます。トレースデータとプロットごとのレイアウトは `element_results` とは別に保存され、SDK からは `client.pipeline.get_element_metadata(submission_id, element_name)` で同じペイロードを取得できます。
</Info>

<CardGroup cols={2}>
  <Card title="パイプライン概要" icon="diagram-project" href="/ja/pipelines/overview">
    検証が直接エントリ・計算・データフィットとどう連結するか。
  </Card>

  <Card title="データフィッティング概要" icon="chart-line" href="/ja/pipelines/data-fitting/overview">
    検証対象となるパラメータの生成方法。
  </Card>
</CardGroup>
