# FlowMapEulerDiscreteScheduler

`FlowMapEulerDiscreteScheduler` هو مُعيّن بأسلوب أويلر مصمَّم لنماذج الانتشار المُقطّرة عبر خرائط التدفق. تتعلّم نماذج خريطة التدفق انتقالات بفواصل زمنية اختيارية $\mathbf{z}_t \to \mathbf{z}_r$ بدلاً من إسقاط $\mathbf{z}_t \to \mathbf{z}_0$ الثابت في نماذج الاتساق. كلا طرفَي الخطوة يُحدَّدان من قِبل المُستدعي، وهو ما يُتيح العيّن بعدد خطوات أيّ: يمكن تقييم نقطة تفتيش مُقطّرة واحدة عند 1 أو 2 أو 4 أو 8 أو 16... NFE دون إعادة تدريب.

تم تقديم المجدول في [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/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L42)

**المعاملات:**

num_train_timesteps (*int*، القيمة الافتراضية 1000) : عدد خطوات الانتشار المستخدمة لتدريب نموذج خريطة التدفق الأساسي.

shift (*float*، القيمة الافتراضية 1.0) : إزاحة توقيت الضرب المطبقة على جدول الاستدلال. `shift=1.0` هو الهوية؛ والقيم الأكبر من 1.0 تدفع الجدول نحو إزالة المزيد من الضوضاء في الخطوات اللاحقة (على سبيل المثال، `shift=5` يتطابق مع القيمة الافتراضية في Wan2.1).

مُعيّن بأسلوب أويلر لنماذج الانتشار المُقطّرة عبر خرائط التدفق.

تتعلم نماذج خريطة التدفق انتقالات بفواصل زمنية اختيارية \\(z_t \to z_r\\) بدلاً من إسقاط \\(z_t \to z_0\\) الثابت في نماذج الاتساق، لذا يمكن تقييم نقطة تحقق واحدة مُقطّرة عند 1، 2، 4، 8، ... NFE دون إعادة تدريب. تتقدم طريقة *step* العينة من *timestep* إلى *r_timestep* على طول السرعة المتوقعة.

تم تقديمه في [AnyFlow: Any-Step Video Diffusion Model with On-Policy Flow Map Distillation](https://huggingface.co/papers/2605.13724) بواسطة Yuchao Gu وGuian Fang وآخرون.

يرث هذا المجدول من [*SchedulerMixin*] و [*ConfigMixin*]. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع المجدولات (التحميل، الحفظ، إلخ).

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

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

[المصدر](https://github.com/huggingface/diffusers/blob/main/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/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L207)

أعد فهرس `timestep` على الجدول الزمني الحالي، أو `None` إذا كان خارج الجدول.

يتم البحث في `self.timesteps` مع تسامح بسيط في الفاصلة العائمة. يُستخدم لاستعادة قيمة sigma المقابلة دون افتراض العلاقة الخطية `timesteps = sigmas * num_train_timesteps` — وبذلك تُحلّ الجداول الزمنية المخصصة (مثل الإزاحة غير الخطية، أو الخطوات الزمنية المُعيّنة يدويًا) بشكل صحيح.

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

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

[المصدر](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L99)

تصعيد هوية بلا تأثير. يُوفَّر من أجل توافق واجهة البرمجة مع مجدولات Diffusers الأخرى.

#### 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/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L103)

استيفاء خطي لـ`sample` نحو `noise` وفقًا لـ`timestep` المُعايَر.

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

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

[المصدر](https://github.com/huggingface/diffusers/blob/main/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/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L123)

**المعاملات:**

num_inference_steps (*int*، *اختياري*) : عدد خطوات الاستدلال. إذا كانت `None`، يجب تمرير `sigmas` أو `timesteps`.

device (*str* أو *torch.device*، *اختياري*) : الجهاز المستهدف لـ `self.sigmas` / `self.timesteps`.

sigmas (*List[float]*، *اختياري*) : جدول سيجما مخصص بطول `num_inference_steps`. يُضاف سيجما النهائي `0` تلقائيًا. يُطبَّق `shift` المُعدّ فوق ذلك.

timesteps (*List[float]*، *اختياري*) : جدول خطوات زمنية مخصص بطول `num_inference_steps`، بنفس وحدات `self.timesteps` (أي مُقيَّم بواسطة `num_train_timesteps`). يتم تحويله إلى قيم sigmas داخليًا. إذا تم تمرير كل من `sigmas` و`timesteps`، فيجب أن يتطابق طولهما.

أنشئ جدول خطوات الاستدلال.

يتتبع داخليًا `self.sigmas` بطول `num_inference_steps + 1` (الإزاحة المُعدّة المطبّقة على linspace من `1.0` إلى `0.0` افتراضيًا)؛ يعرض `self.timesteps` أول `num_inference_steps` قيم sigma مُقيّسة بواسطة `num_train_timesteps` — أي خطوة زمنية واحدة لكل خطوة استنتاج، بما يتوافق مع [FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/ar/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler). القيمة النهائية لـ sigma (`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/main/src/diffusers/schedulers/scheduling_flow_map_euler_discrete.py#L223)

**المعاملات:**

model_output (*torch.Tensor*) : المخرجات المباشرة من نموذج خريطة التدفق (متوسط السرعة المتوقع).

timestep (*float* أو *torch.Tensor*) : خطوة الزمن المصدر `t` بنفس وحدات `self.timesteps`.

sample (*torch.Tensor*) : العينة الحالية \\(z_t\\).

r_timestep (*float* أو *torch.Tensor*، *اختياري*) : خطوة الزمن المستهدفة `r`. الافتراضي هو الخطوة التالية في الجدول الزمني عند `None`؛ مرّر قيمة صريحة لأي خطوة أخذ عينات. `r_timestep == timestep` لا يؤدي إلى أي تغيير.

return_dict (*bool*، القيمة الافتراضية *True*) : ما إذا كان يجب إرجاع [*FlowMapEulerDiscreteSchedulerOutput*] (وهو الافتراضي) أو مجرد tuple.

**يعيد:** [*FlowMapEulerDiscreteSchedulerOutput*] أو *tuple*

عندما يكون `return_dict=True`، تُرجع كائنًا من نوع [*FlowMapEulerDiscreteSchedulerOutput*] يكون حقله `prev_sample` هو \\(z_r\\). وإلا تُرجع مجموعة من عنصر واحد `(prev_sample,)`.

تقدّم `sample` من `timestep` إلى `r_timestep` باستخدام السرعة المتوقعة من النموذج.

على عكس مُجدول أويلر القياسي، يمكن أن يوفر المُستدعي كلا طرفَي الفترة، مما يجعل أخذ العينات بأي عدد من الخطوات ممكنًا: فمكالمة نموذج واحدة يمكنها الانتقال من *t* إلى أي هدف *r* مُختار (بما في ذلك *r=0* لتوليد دفعة واحدة). عند إغفال `r_timestep`، يكون الافتراضي هو الخطوة الزمنية التالية في الجدول (مطابقًا لدلالات `FlowMatchEulerDiscreteScheduler`).

داخليًا، يتم استرجاع قيم سيجما للمصدر والهدف عن طريق فهرسة `self.sigmas` عبر `index_for_timestep` بدلاً من قسمة خطوات الزمن المدخلة على `num_train_timesteps`، وبالتالي تبقى أي جدولة تكون العلاقة بين خطوة الزمن وقيمة سيجما فيها غير خطية (مثل إزاحة مخصصة) صحيحة. أما بالنسبة لقيمة `r_timestep` خارج الجدولة، فإن المجدول يلجأ إلى `r_timestep / num_train_timesteps` لضمان استمرار دعم أخذ العينات بأي خطوة خارج الجدولة.

