# LoopSequentialPipelineBlocks

[LoopSequentialPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks) هي نوع متعدد الكتل يجمع كتل [ModularPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) أخرى معًا في حلقة. تتدفق البيانات بشكل دائري باستخدام `inputs` و`intermediate_outputs`، وتُنفَّذ كل كتلة بشكل تكراري. يُستخدم هذا عادةً لإنشاء حلقة إزالة الضوضاء (denoising loop) التي تكون تكرارية افتراضيًا.

يُظهر لك هذا الدليل كيفية إنشاء [LoopSequentialPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks).

## غلاف الحلقة

[LoopSequentialPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks)، يُعرف أيضًا بـ *loop wrapper* لأنه يحدد بنية الحلقة ومتغيرات التكرار والإعدادات. داخل الـ loop wrapper، تحتاج إلى المتغيرات التالية.

- `loop_inputs` هي قيم يوفّرها المستخدم وتُكافئ `inputs`.
- `loop_intermediate_outputs` هي متغيرات وسيطة جديدة ينشئها الكتلة وتُضاف إلى [PipelineState](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState). وهي مكافئة لـ `intermediate_outputs`.
- تعرف طريقة `__call__` بنية الحلقة ومنطق التكرار.

```py
import torch
from diffusers.modular_pipelines import LoopSequentialPipelineBlocks, ModularPipelineBlocks, InputParam, OutputParam

class LoopWrapper(LoopSequentialPipelineBlocks):
    model_name = "test"
    @property
    def description(self):
        return "I'm a loop!!"
    @property
    def loop_inputs(self):
        return [InputParam(name="num_steps")]
    @torch.no_grad()
    def __call__(self, components, state):
        block_state = self.get_block_state(state)
        # Loop structure - can be customized to your needs
        for i in range(block_state.num_steps):
            # loop_step executes all registered blocks in sequence
            components, block_state = self.loop_step(components, block_state, i=i)
        self.set_block_state(state, block_state)
        return components, state
```

يمكن لغلّف الحلقة تمرير حِجج إضافية، مثل فهرس التكرار الحالي، إلى كتل الحلقة.

## كتل الحلقات

كتلة الحلقة هي [ModularPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks)، لكن طريقة `__call__` تتصرف بشكل مختلف.

- يستقبل متغير التكرار من غلاف الحلقة.
- يعمل مباشرة مع [BlockState](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) بدلاً من [PipelineState](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState).
- لا يتطلب استرداد [BlockState](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) أو تحديثه.

تشارك كتل الحلقات نفس [BlockState](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) للسماح بتراكم القيم وتغييرها في كل تكرار داخل الحلقة.

```py
class LoopBlock(ModularPipelineBlocks):
    model_name = "test"
    @property
    def inputs(self):
        return [InputParam(name="x")]
    @property
    def intermediate_outputs(self):
        # outputs produced by this block
        return [OutputParam(name="x")]
    @property
    def description(self):
        return "I'm a block used inside the `LoopWrapper` class"
    def __call__(self, components, block_state, i: int):
        block_state.x += 1
        return components, block_state
```

## LoopSequentialPipelineBlocks

استخدم طريقة [from_blocks_dict()](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.from_blocks_dict) لإضافة كتلة الحلقة إلى غلاف الحلقة لإنشاء [LoopSequentialPipelineBlocks](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks).

```py
loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock})
```

أضِف المزيد من كتل الحلقات لتنفيذها داخل كل تكرار باستخدام [from_blocks_dict()](/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.LoopSequentialPipelineBlocks.from_blocks_dict). يتيح لك ذلك تعديل الكتل دون تغيير منطق الحلقة نفسه.

```py
loop = LoopWrapper.from_blocks_dict({"block1": LoopBlock(), "block2": LoopBlock})
```

لإضافة كتلة حلقة إلى حلقة إزالة الضوضاء في خط أنابيب موجود، على سبيل المثال كتلة تُنفّذ دالة `callback_on_step_end` في كل خطوة، راجع [خطوط الأنابيب المعيارية](../using-diffusers/callback#modular-pipelines) في دليل الاستدعاءات.

