# 状態

Blocks は、データの通信と共有のために [PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) および [BlockState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) データ構造に依存しています。

| 状態 | 説明 |
|-------|-------------|
| [PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) | パイプラインの実行に必要な全体データを保持し、ブロックがそのデータの読み取りと更新を行うことを可能にします。 |
| [BlockState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) | `inputs`から必要なデータを使用して、各ブロックが計算を実行できるようにします|

このガイドでは、ステートの仕組みと、ブロックを接続する方法について説明します。

## PipelineState

[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) は、すべてのブロック用のグローバルな状態コンテナです。パイプラインの完全なランタイム状態を保持し、ブロックが共有データを読み書きするための構造化された方法を提供します。

[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) は、ユーザーが指定した入力値とブロックによって生成される中間出力値を含む **変更可能** な状態である `values` ディクショナリにすべてのデータを格納します。あるブロックが `input` を変更した場合、`set_block_state` を呼び出した後、その変更は `values` ディクショナリに反映されます。

```py
PipelineState(
  values={
    'prompt': 'a cat'
    'guidance_scale': 7.0
    'num_inference_steps': 25
    'prompt_embeds': Tensor(dtype=torch.float32, shape=torch.Size([1, 1, 1, 1]))
    'negative_prompt_embeds': None
  },
)
```

## BlockState

[BlockState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) は、個々のブロックが計算を実行するために [PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) から必要な関連変数のローカルビューです。

`block_state.image` のように、これらの変数を直接アトリビュートとしてアクセスできます。

```py
BlockState(
    image: <PIL.Image.Image image mode=RGB size=512x512 at 0x7F3ECC494640>
)
```

ブロックの`__call__`メソッドが実行されると、`self.get_block_state(state)`によって`BlockState`を取得し、処理を実行したうえで、`self.set_block_state(state, block_state)`によって[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState)を更新します。

```py
def __call__(self, components, state):
    # retrieve BlockState
    block_state = self.get_block_state(state)

    # computation logic on inputs

    # update PipelineState
    self.set_block_state(state, block_state)
    return components, state
```

## 状態の相互作用

[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState)と[BlockState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState)の相互作用は、ブロックの`inputs`と`intermediate_outputs`によって定義されます。

- `inputs`では、ブロックは入力（`block_state.image` など）を変更でき、`set_block_state`を呼び出すことで、この変更を[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState)にグローバルに反映させることができます。
- `intermediate_outputs` は、ブロックが作成する新しい変数です。[PipelineState](/docs/diffusers/main/ja/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) の `values` ディクショナリに追加され、後続のブロックで使用可能になるほか、パイプラインの最終出力としてユーザーからアクセスできます。

