# FlowMapEulerDiscreteScheduler

`FlowMapEulerDiscreteScheduler` は、フローマップ蒸留拡散モデル向けに設計された Euler 方式のサンプラーです。フローマップモデルは、consistency モデルの固定された $\mathbf{z}_t \to \mathbf{z}_0$ マッピングとは異なり、任意の間隔の遷移 $\mathbf{z}_t \to \mathbf{z}_r$ を学習します。ステップの両端点は呼び出し側で指定されるため、任意ステップサンプリングが可能になります。これにより、単一の蒸留済みチェックポイントを再学習せずに、NFE 1、2、4、8、16... で評価できます。

このスケジューラは [AnyFlow: Any-Step Video Diffusion Model with On-Policy Flow Map Distillation](https://huggingface.co/papers/2605.13724) で導入され、`AnyFlowPipeline` および `AnyFlowFARPipeline` の統合に同梱されていますが、AnyFlow 固有のものではありません。フローマップ蒸留されたチェックポイントであれば、いずれもこのスケジューラを使用できます。

## FlowMapEulerDiscreteScheduler[[diffusers.FlowMapEulerDiscreteScheduler]]

#### diffusers.FlowMapEulerDiscreteScheduler[[diffusers.FlowMapEulerDiscreteScheduler]]

```python
diffusers.FlowMapEulerDiscreteScheduler(num_train_timesteps: int = 1000, shift: float = 1.0)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L42)

**パラメータ:**

num_train_timesteps (*int*、デフォルトは 1000) : 基盤となる flow-map モデルの学習に使用される拡散ステップ数。

shift (*float*、デフォルト値は 1.0) : 推論スケジュールに適用される乗法的なタイムステップシフトです。`shift=1.0` は恒等変換であり、1.0 以上の値はスケジュールを後続ステップでのより強いノイズ除去方向にシフトさせます（例: `shift=5` は Wan2.1 のデフォルト値と一致します）。

フローマップ蒸留拡散モデル向けのオイラー型サンプラー。

Flow-map モデルは、consistency モデルの固定された \\(z_t \to z_0\\) マッピングではなく、任意の区間への遷移 \\(z_t \to z_r\\) を学習するため、再学習せずに 1、2、4、8、... NFE で単一の蒸留済みチェックポイントを評価できます。*step* メソッドは、予測された速度に沿って、サンプルを *timestep* から *r_timestep* へ進めます。

Yuchao Gu、Guian Fang らによる [AnyFlow: Any-Step Video Diffusion Model with On-Policy Flow Map Distillation](https://huggingface.co/papers/2605.13724) で紹介されました。

このスケジューラは [*SchedulerMixin*] と [*ConfigMixin*] を継承しています。すべてのスケジューラに実装されている汎用的なメソッド（読み込み、保存など）については、スーパークラスのドキュメントを参照してください。

#### apply_shift[[diffusers.FlowMapEulerDiscreteScheduler.apply_shift]]

```python
apply_shift(sigmas: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L117)

設定されたシフト変換をシグマテンソルに適用します。

#### index_for_timestep[[diffusers.FlowMapEulerDiscreteScheduler.index_for_timestep]]

```python
index_for_timestep(timestep: typing.Union[float, torch.FloatTensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L207)

現在のスケジュール上の`timestep`のインデックスを返します。スケジュール外の場合は`None`を返します。

`self.timesteps` に対して、小さな fp 許容誤差を用いて参照が行われます。線形の `timesteps = sigmas * num_train_timesteps` の関係を前提とせず、対応する sigma を復元するために使用されます。これにより、カスタムスケジュール（非線形シフトや手動で設定された timesteps など）でも正しく解決されます。

#### scale_model_input[[diffusers.FlowMapEulerDiscreteScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, *args, **kwargs)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L99)

何もしない恒等スケーリング。他の Diffusers スケジューラとの API 互換性のために提供されています。

#### scale_noise[[diffusers.FlowMapEulerDiscreteScheduler.scale_noise]]

```python
scale_noise(sample: FloatTensor, timestep: typing.Union[float, torch.FloatTensor], noise: typing.Optional[torch.FloatTensor] = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L103)

正規化された`timestep`に従って、`sample`を`noise`へ線形補間します。

#### set_begin_index[[diffusers.FlowMapEulerDiscreteScheduler.set_begin_index]]

```python
set_begin_index(begin_index: int = 0)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L94)

スケジューラの開始インデックスを設定します。スケジュールの途中から開始するパイプライン（例: image-to-image）は、`set_timesteps`と最初の`step`の間にこれを呼び出して、ロールアウトの基準点を固定します。

#### set_timesteps[[diffusers.FlowMapEulerDiscreteScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: typing.Optional[int] = None, device: typing.Union[str, torch.device] = None, sigmas: typing.Optional[typing.List[float]] = None, timesteps: typing.Optional[typing.List[float]] = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L123)

**パラメータ:**

num_inference_steps (*int*, *optional*) : 推論ステップ数。`None`の場合、`sigmas`または`timesteps`を渡す必要があります。

device (*str* または *torch.device*、*optional*) : `self.sigmas` / `self.timesteps` のターゲットデバイス。

sigmas (*List[float]*、*optional*) : 長さ `num_inference_steps` のカスタム sigma スケジュール。末尾の `0` sigma は自動的に追加されます。設定された `shift` がその上に適用されます。

timesteps (*List[float]*, *optional*) : `num_inference_steps` の長さを持つカスタムなタイムステップスケジュールです。`self.timesteps` と同じ単位（つまり `num_train_timesteps` でスケーリングされた値）で指定します。内部でシグマに変換されます。`sigmas` と `timesteps` の両方が渡された場合、その長さは一致する必要があります。

推論用のタイムステップスケジュールを構築します。

内部では、長さ `num_inference_steps + 1` の `self.sigmas` を管理しています（デフォルトでは、`1.0` から `0.0` への linspace に設定されたシフトが適用されます）。`self.timesteps` は、`num_train_timesteps` によってスケーリングされた最初の `num_inference_steps` 個のシグマを公開します。つまり、推論ステップごとに1つのタイムステップが割り当てられ、[FlowMatchEulerDiscreteScheduler](/docs/diffusers/v0.43.0/ja/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler) と一致します。最後のシグマ（`0`）は、最後のステップの暗黙の r 端点であり、`sigmas` / `timesteps` がユーザーによって提供された場合、自動的に追加されます。

#### ステップ[[diffusers.FlowMapEulerDiscreteScheduler.step]]

```python
step(model_output: FloatTensor, timestep: typing.Union[float, torch.FloatTensor], sample: FloatTensor, r_timestep: typing.Union[float, torch.FloatTensor, NoneType] = None, return_dict: bool = True)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L223)

**パラメータ:**

model_output (*torch.Tensor*) : フローマップモデルの直接出力（予測平均速度）。

timestep (*float* または *torch.Tensor*) : `self.timesteps` と同じ単位で表したソースタイムステップ `t`。

sample (*torch.Tensor*) : 現在のサンプル \\(z_t\\)。

r_timestep (*float* または *torch.Tensor*、*optional*) : 対象のタイムステップ `r`。`None` の場合はスケジュール上の次のタイムステップがデフォルトになります。any-step サンプリングには明示的な値を指定してください。`r_timestep == timestep` は何もしません。

return_dict (*bool*、デフォルトは *True*) : [*FlowMapEulerDiscreteSchedulerOutput*]（デフォルト）を返すか、通常のタプルを返すかを指定します。

**戻り値:** [*FlowMapEulerDiscreteSchedulerOutput*] または *tuple*

`return_dict=True` の場合、`prev_sample` が \\(z_r\\ となる [*FlowMapEulerDiscreteSchedulerOutput*] を返します。それ以外の場合は、1タプル `(prev_sample,)` を返します。

モデルが予測した速度を用いて、`timestep` から `r_timestep` へ `sample` を進めます。

標準的な Euler スケジューラとは異なり、区間の両端を呼び出し側で指定できるため、任意ステップのサンプリングが可能です。単一のモデル呼び出しで、*t* から任意に選択したターゲット *r*（ワンショット生成のための *r=0* を含む）へステップを進めることができます。`r_timestep` が省略された場合、スケジュール上の次のタイムステップがデフォルトとして使用されます（`FlowMatchEulerDiscreteScheduler` のセマンティクスと一致）。

内部では、ソースおよびターゲットのシグマは、入力タイムステップを`num_train_timesteps`で割るのではなく、`index_for_timestep`を介して`self.sigmas`にインデックスを指定することで復元されるため、タイムステップとシグマの関係が非線形であるスケジュール（カスタムシフトなど）でも正しく動作します。スケジュール外の`r_timestep`に対しては、スケジューラは`r_timestep / num_train_timesteps`にフォールバックするため、スケジュール外の任意のステップでのサンプリングも引き続きサポートされます。

