> For the complete documentation index, see [llms.txt](https://docs.augelab.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.augelab.com/french/function-blocks/blocks-reference/data-logic/flow-control/subsystem-loop.md).

# Subsystem Loop

Ce bloc fonction répète un workflow interne pour chaque élément d'une liste (ou autre collection de taille). Utilisez-le lorsque vous souhaitez traiter une série d'éléments un par un à l'intérieur d'un sous-système contenu et rassembler les résultats sous forme de listes.

## 📥 Entrées

Ce bloc fonction n'a pas de prises d'entrée exposées au niveau supérieur.\
Pour fournir des données au workflow répété, utilisez des blocs internes à l'intérieur du sous-système (par exemple `Subsystem In`).

## 📤 Sorties

Ce bloc fonction n'expose pas de prises de sortie directes au niveau supérieur.\
Les résultats produits à l'intérieur du workflow répété sont renvoyés via des blocs internes (par exemple `Subsystem Out`) et sont collectés sous forme de listes par ce bloc.

## 🕹️ Contrôles

Il n'y a pas de paramètres visibles sur le bloc lui‑même. L'interaction et la configuration se font dans l'espace de travail du sous-système contenu où vous placez les blocs d'aide d'entrée/sortie :

* `Subsystem In` : à utiliser à l'intérieur du sous-système pour recevoir l'élément courant (ou des entrées partagées) à chaque itération.
* `Subsystem Out` : à utiliser à l'intérieur du sous-système pour émettre le résultat par étape qui sera collecté par la boucle.

## 🎨 Fonctionnalités

* Traitement itératif : exécute le workflow interne une fois par élément de la première collection de type collection que vous fournissez.
* Support multi-listes : si plusieurs collections de même longueur sont fournies, elles seront itérées en parallèle. Utilisez des outils de mise en paire si vous avez besoin d'un appariement explicite.
* Agrégation : les sorties produites par le workflow interne sont collectées sous forme de listes (une liste par sortie) et renvoyées après la fin de la boucle.
* Arrêt sûr et propagation de statut : les erreurs internes ou états invalides sont propagés afin que le scénario parent puisse réagir.

## ⚙️ Mécanisme d'exécution (en langage clair)

* Le bloc recherche la première entrée de type collection que vous fournissez (par exemple une liste d'images ou de nombres).
* Pour chaque élément de cette collection, il ouvre l'espace de travail du sous-système et exécute le workflow contenu une fois en utilisant l'élément courant.
* Toutes les valeurs que vous envoyez à l'extérieur du sous-système avec `Subsystem Out` sont ajoutées aux listes. Après la fin de la boucle, vous obtenez une liste collectée par sortie.
* Si vous devez itérer plusieurs listes ensemble, assurez-vous qu'elles ont la même longueur ou couplez-les avant de les alimenter dans le sous-système.

## 📝 Comment utiliser

1. Placez le bloc `Subsystem Loop` dans votre scénario.
2. Double-cliquez (ou ouvrez) l'espace de travail du sous-système et ajoutez à l'intérieur :
   * des blocs `Subsystem In` pour recevoir les entrées par étape sur lesquelles vous voulez travailler ;
   * vos blocs de traitement (filtres, détecteurs, calculs) pour opérer sur chaque élément ;
   * des blocs `Subsystem Out` pour renvoyer les résultats vers l'agrégateur de la boucle.
3. Si vous souhaitez itérer plusieurs listes ensemble, préparez-les à l'aide d'un utilitaire de listes (par exemple `List Operations`) avant de les fournir au sous-système.
4. Exécutez le scénario. La boucle lancera le workflow interne pour chaque élément et renverra des listes agrégées des sorties.

## 💡 Astuces et conseils

* Pour itérer plusieurs listes liées en synchronisation, préparez-les avec le bloc `List Operations` (utilisez l'option de mise en paire si disponible) avant de les fournir au sous-système.
* Utilisez `Get Element` à l'intérieur du sous-système uniquement si vous avez besoin d'un accès indexé direct à des listes fournies comme entrées partagées.
* Pour de grands lot d'images, combinez `Batch Processing` et `Debatch` pour réduire l'utilisation mémoire et garder le traitement par étape efficace.
* Utilisez `Data Read Local` / `Data Write Local` (ou les variantes Global) pour partager des données persistantes entre le scénario principal et le sous-système lorsque une simple connexion entrée/sortie n'est pas pratique.
* Si vous devez exécuter le même traitement sur des images individuelles puis visualiser les résultats, connectez un bloc `Show Image` après les sorties de la boucle pour prévisualiser les images collectées.
* Lorsque vous travaillez avec des listes pouvant contenir des entrées vides ou manquantes, ajoutez un contrôle `Is None` à l'intérieur du sous-système pour éviter des erreurs inattendues.

## 🛠️ Dépannage

* Aucune itération : vérifiez que vous avez fourni au moins une entrée de type collection à l'intérieur du sous-système (via `Subsystem In`).
* Les sorties reviennent emballées dans des listes à un seul élément : vérifiez combien de blocs `Subsystem Out` sont présents et confirmez qu'ils renvoient bien les valeurs prévues par étape.
* Longueurs de listes différentes : si vous attendez que plusieurs listes soient itérées ensemble, assurez-vous qu'elles ont la même longueur ou couplez-les au préalable avec `List Operations`.
* Utilisation mémoire élevée : privilégiez `Batch Processing` et `Debatch` ou traitez des segments plus petits à l'intérieur du sous-système pour réduire le pic mémoire.
