# DiscreteDDIMScheduler

يعتمد `DiscreteDDIMScheduler` على أخذ عينات من كل موضع في اللوحة من التوزيع الخلفي المنفصل الدقيق لعملية التلوث المنتظم (D3PM)، وذلك وفقاً لـ [Structured Denoising Diffusion Models in Discrete State-Spaces](https://huggingface.co/papers/2107.03006). وهو خالٍ من المعلمات، حيث يقوم الخطوة النهائية بتثبيت الرموز المتوقعة بشكل حتمي. وتضيف وضع الاختبار والتصحيح الاختياري عمليات مسح Gibbs التي تستبعد عنصراً واحداً من [Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation](https://huggingface.co/papers/2605.22765) عبر `corrector_steps`.

يُستخدم هذا المجدول بواسطة [DiffusionGemmaPipeline](/docs/diffusers/main/ar/api/pipelines/diffusion_gemma#diffusers.DiffusionGemmaPipeline).

## DiscreteDDIMScheduler[[diffusers.DiscreteDDIMScheduler]]

#### diffusers.DiscreteDDIMScheduler[[diffusers.DiscreteDDIMScheduler]]

```python
diffusers.DiscreteDDIMScheduler(num_inference_steps: int = 32, corrector_steps: int = 0, corrector_k: int = 1, corrector_selection: str = 'lowest_log_margin', corrector_selection_tau: float = 1.0)
```

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

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

num_inference_steps (`int`، القيمة الافتراضية 32) : عدد خطوات إزالة الضوضاء، الذي يحدد الشبكة الزمنية الخطية التي تُقيَّم عليها التوزيع اللاحق.

corrector_steps (`int`، القيمة الافتراضية 0) : عدد عمليات المسح التصحيحية لجيبس (Gibbs corrector sweeps) التي تُنفَّذ بعد كل خطوة تنبؤية. القيمة `0` تعيد استرجاع أخذ العينات العادي بطريقة DDIM الأصلية.

corrector_k (`int`، القيمة الافتراضية 1) : عدد المواضع التي يتم إعادة أخذ عينات منها في كل جولة تصحيح.

corrector_selection (`str`، القيمة الافتراضية هي `"lowest_log_margin"`) : كيفية اختيار المواضع المُعاد أخذ عيناتها: `"lowest_log_margin"`، أو `"lowest_maxprob"`، أو `"lowest_current_prob"`، أو `"random"`.

corrector_selection_tau (`float`، القيمة الافتراضية 1.0) : درجة حرارة اختيار الموضع Gumbel-top-k (كلما انخفضت القيمة زادت الجشعية).

مجدول DDIM المنفصل لعملية التلوث المنتظم، وفقًا لورقة "نماذج الانتشار غير الضوضائية المهيكلة في فضاءات الحالة المنفصلة" (D3PM، https://huggingface.co/papers/2107.03006).

في الجدول الزمني الخطي، تكون احتمالية بقاء رمز نظيف عند الزمن `t` هي `alpha(t) = 1 - t`. يقوم كل خطوة إزالة ضوضاء من الزمن `t` إلى `s < t` بسحب كل موضع في الكتلة من التوزيع اللاحق الدقيق `q(x_s | x_t, x0)`، والذي بالنسبة لنواة موحّدة يتفكك إلى ثلاث مسارات: القفز إلى الرمز النظيف المتوقع `x0`، أو البقاء على الرمز الحالي، أو القفز إلى رمز عشوائي موحّد. على عكس الانتشار المقنّع، لا يوجد رمز قناع؛ فالمواضع غير المُثبّتة تحمل رموزًا عشوائية.

يتبع وضع المُتنبِّئ-المُصحِّح الاختياري ما ورد في "Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation" عبر مُزيل الضوضاء leave-one-out (LOO) (https://huggingface.co/papers/2605.22765). عند `corrector_steps > 0`، تُنفّذ خطّ الأنابيب ذلك العدد من جولات تصحيح Gibbs بعد كل خطوة تنبؤ (انظر [step_correct()](/docs/diffusers/main/ar/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMScheduler.step_correct))، مع إعادة أخذ عينات من المواضع الأقلّ ثقة من الشرطي أحادي الإحداثي `Cat(alpha_s * x0_loo + (1 - alpha_s) / K)` مع تثبيت البقية، مما يُبقي التوزيع الحافّي `p_s` ثابتاً ويُحسّن التوليد دون أي تكلفة تدريب.

#### خطوة[[diffusers.DiscreteDDIMScheduler.step]]

```python
step(model_output: torch.Tensor, timestep: int | torch.Tensor, sample: torch.LongTensor, temperature: float = 0.0, generator: torch.Generator | None = None, return_dict: bool = True)
```

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

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

model_output (`torch.Tensor` من الشكل `(batch_size, block_length, vocab_size)`) : القيم الخام (logits) من النموذج للكتلة الحالية.

timestep (`int` أو `torch.Tensor`) : فهرس الخطوة الحالية ضمن جدول إزالة الضوضاء، ضمن `[0, num_inference_steps - 1]`.

sample (`torch.LongTensor` من الشكل `(batch_size, block_length)`) : معرّفات رموز الكتلة الحالية `x_t`.

temperature (`float`) : درجة الحرارة المستخدمة في أخذ العينات المطبقة على القيم اللوجستية عند سحب `x0`.

generator (`torch.Generator`، *اختياري*) : مولّد الأرقام العشوائية (RNG) للعينات.

return_dict (`bool`) : ما إذا كان يجب إرجاع [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) أو مجرد tuple.

استخرج الكتلة التالية من التوزيع اللاحق `q(x_s | x_t, x0)` لعملية التلوث المنتظمة.

حيث `a = alpha_t / alpha_s` (احتمال البقاء من `s` إلى `t`) و`b = alpha_s`، فإن الكتلة اللاحقة لكل مسار هي

نظيف: `b * (1 - a) / K + a * b * 1[x_t = x0]`، ثابت: `a * (1 - b) / K`، ضوضاء: `(1 - a) * (1 - b) / K`،

إذن، الخطوة الأخيرة (`b = 1`) تُثبّت بشكل حتمي الرموز النظيفة المتوقعة.

#### step_correct[[diffusers.DiscreteDDIMScheduler.step_correct]]

```python
step_correct(model_output: torch.Tensor, timestep: int | torch.Tensor, sample: torch.LongTensor, generator: torch.Generator | None = None, return_dict: bool = True)
```

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

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

model_output (`torch.Tensor` من الشكل `(batch_size, block_length, vocab_size)`) : القيم الخام (logits) من النموذج المُعاد حسابها على `sample` الحالي (بعد المُتنبّئ).

timestep (`int` أو `torch.Tensor`) : فهرس خطوة المُتنبِّئ الذي اكتمل للتو؛ يعمل المُصحِّح عند نقطة الشبكة التالية `s`.

sample (`torch.LongTensor` من الشكل `(batch_size, block_length)`) : معرّفات الرموز الحالية للكتلة التي يجب تحسينها.

generator (`torch.Generator`، *اختياري*) : مولّد الأرقام العشوائية (RNG) للعينات.

return_dict (`bool`) : ما إذا كان يجب إرجاع [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ar/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) أو مجرد tuple.

نفّذ مسحًا واحدًا لمصحّح غيبس عند وقت ما بعد المُتنبّئ `s`، متّبعًا منهج المُتنبّئ-المُصحّح مع استبعاد عنصر واحد كما هو موصوف في https://huggingface.co/papers/2605.22765.

تُحوَّل قيم النموذج (المُعاد حسابها على `sample` الحالي) إلى مُزيل الضوضاء LOO، وتُشكَّل الشرطية ذات الإحداثي الواحد `p_s(x^l | x^{-l}) = Cat(alpha_s * x0_loo + (1 - alpha_s) / K)`، ثم تُختار مواضع `corrector_k` الأقل ثقة، وتُعاد عينة تلك المواضع بينما تبقى بقية المواضع ثابتة. يحافظ المسح على `p_s`، لذا فهو يُحسّن العينة دون تغيير توزيعها الحدي ولا يتطلب تدريبًا إضافيًا.

## DiscreteDDIMSchedulerOutput[[diffusers.DiscreteDDIMSchedulerOutput]]

#### diffusers.DiscreteDDIMSchedulerOutput[[diffusers.DiscreteDDIMSchedulerOutput]]

```python
diffusers.DiscreteDDIMSchedulerOutput(prev_sample: torch.LongTensor, sampled_tokens: torch.LongTensor, sampled_probs: torch.Tensor, pred_logits: torch.Tensor)
```

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

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

prev_sample (`torch.LongTensor` من الشكل `(batch_size, block_length)`) : رموز الكتلة المحدّثة بعد خطوة إزالة الضوضاء الحالية.

sampled_tokens (`torch.LongTensor` من الشكل `(batch_size, block_length)`) : معرّفات الرموز المُستخرجة من نتائج النموذج (logits)، أي الرموز النظيفة المتوقعة `x0`.

sampled_probs (`torch.Tensor` من الشكل `(batch_size, block_length)`) : احتمالات الرموز المُستخرجة.

pred_logits (`torch.Tensor` من الشكل `(batch_size, block_length, vocab_size)`) : قيم اللوجيت الخاصة بإزالة الضوضاء، تُمرَّر لتسهيل التكييف الذاتي في الخطوة التالية.

فئة الإخراج لمجدول DDIM المنفصل.

