# Estados

Os blocos dependem das estruturas de dados [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) e [BlockState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) para comunicar e compartilhar dados.

| Estado | Descrição |
|-------|-------------|
| [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) | Mantém os dados gerais necessários para a execução de um pipeline e permite que os blocos leiam e atualizem seus dados. |
| [BlockState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) | Permite que cada bloco execute seu cálculo com os dados necessários de `inputs`|

Este guia explica como os estados funcionam e como eles conectam os blocos.

## PipelineState

O [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) é um contêiner de estado global para todos os blocos. Ele mantém o estado de tempo de execução completo do pipeline e fornece uma maneira estruturada para que os blocos leiam e gravem dados compartilhados.

[PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) armazena todos os dados em um dicionário `values`, que é um estado **mutável** contendo os valores de entrada fornecidos pelo usuário e os valores de saída intermediários gerados pelos blocos. Se um bloco modifica uma `input`, essa modificação será refletida no dicionário `values` após a chamada de `set_block_state`.

```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

O [BlockState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) é uma visão local das variáveis relevantes que um bloco individual precisa do [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) para realizar seus cálculos.

Acesse essas variáveis diretamente como atributos, como `block_state.image`.

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

Quando o método `__call__` de um bloco é executado, ele recupera o `BlockState` com `self.get_block_state(state)`, executa suas operações e atualiza o [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) com `self.set_block_state(state, block_state)`.

```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
```

## Interação de estado

A interação entre [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) e [BlockState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) é definida pelos `inputs` e pelos `intermediate_outputs` de um bloco.

- `inputs`, um bloco pode modificar uma entrada - como `block_state.image` - e essa alteração pode ser propagada globalmente para [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) chamando `set_block_state`.
- `intermediate_outputs` é uma nova variável criada por um bloco. Ela é adicionada ao dicionário `values` do [PipelineState](/docs/diffusers/v0.43.0/pt/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) e fica disponível para blocos subsequentes ou acessada pelos usuários como saída final do pipeline.

