Salome HOME
mergefrom branch BR_V511_PR tag mergeto_trunk_03feb09
[modules/yacs.git] / doc / principes.rst
1
2 :tocdepth: 3
3
4 .. _principes:
5
6 Principes généraux de YACS
7 ===============================
8 La construction d'un schéma de calcul s'appuie sur le concept de noeud de calcul.
9 Un noeud de calcul représente un calcul élémentaire qui peut être l'exécution
10 locale d'un script Python ou l'exécution distante d'un service de composant SALOME.
11
12 Le schéma de calcul est un assemblage de noeuds de calcul plus ou moins complexe.
13
14 Cet assemblage est réalisé par connexion de ports d'entrée et de sortie de ces noeuds
15 de calcul.
16
17 Les données sont échangées entre noeuds via les ports. Elles sont typées.
18
19 Les noeuds composés : Bloc, Loop, Switch, permettent de modulariser un schéma de calcul 
20 et de définir des processus itératifs, des calculs paramétriques ou des débranchements.
21
22 Enfin les containers permettent de définir où seront exécutés les composants SALOME 
23 (sur un réseau ou un cluster).
24
25 .. _datatypes:
26
27 Les types de données
28 ----------------------
29 Les données échangées entre noeuds de calcul via les ports sont typées. 
30 On a 4 catégories de types : les types de base, les références d'objets, les séquences et les
31 structures.
32 Il est possible de définir des types utilisateurs par composition de ces éléments de base.
33 De nombreux types sont prédéfinis soit par YACS soit par les composants utilisés comme GEOM ou SMESH.
34
35 Les types de base
36 '''''''''''''''''''''
37 Les types de base sont au nombre de 5 : int, double, bool, string et file. Ils sont prédéfinis par YACS.
38
39 ================= =====================================
40 Type YACS          Commentaire
41 ================= =====================================
42 int                 pour les entiers
43 double              pour les réels doubles
44 bool                pour les booléens
45 string              pour les chaines de caractères
46 file                pour les fichiers
47 ================= =====================================
48
49 Les références d'objet
50 ''''''''''''''''''''''''''
51 Les références d'objet sont utilisées pour typer les objets CORBA gérés par les composants SALOME.
52 En général, ces types sont définis par les composants qui les utilisent.
53 Pour définir un type YACS référence d'objet, il suffit de lui donner un nom et de l'associer
54 au Repository ID CORBA. Voici quelques exemples de types prédéfinis.
55
56 ================= ==============================
57 Type YACS          Repository ID CORBA
58 ================= ==============================
59 Study               IDL:SALOMEDS/Study:1.0
60 SObject             IDL:SALOMEDS/SObject:1.0
61 GEOM_Shape          IDL:GEOM/GEOM_Object:1.0
62 MESH                IDL:SALOME_MED/MESH:1.0
63 FIELD               IDL:SALOME_MED/FIELD:1.0
64 ================= ==============================
65
66 Il est possible de définir des relations d'héritage simple ou multiple entre ces types.
67 Voici un exemple extrait du composant MED.
68
69 ================= ============================== =====================================
70 Type YACS          Types de base                     Repository ID CORBA
71 ================= ============================== =====================================
72 FIELDDOUBLE         FIELD                           IDL:SALOME_MED/FIELDDOUBLE:1.0
73 ================= ============================== =====================================
74
75 YACS définit également des types pour les ports datastream :
76
77 ================= =======================================================
78 Type YACS                Repository ID CORBA
79 ================= =======================================================
80 CALCIUM_integer    IDL:Ports/Calcium_Ports/Calcium_Integer_Port:1.0
81 CALCIUM_real       IDL:Ports/Calcium_Ports/Calcium_Real_Port:1.0
82 CALCIUM_double     IDL:Ports/Calcium_Ports/Calcium_Double_Port:1.0
83 CALCIUM_string     IDL:Ports/Calcium_Ports/Calcium_String_Port:1.0
84 CALCIUM_logical    IDL:Ports/Calcium_Ports/Calcium_Logical_Port:1.0
85 CALCIUM_boolean    IDL:Ports/Calcium_Ports/Calcium_Logical_Port:1.0
86 CALCIUM_complex    IDL:Ports/Calcium_Ports/Calcium_Complex_Port:1.0
87 ================= =======================================================
88
89 On peut avoir la liste des types disponsibles en consultant les catalogues des composants
90 SALOME : GEOMCatalog.xml, SMESHCatalog.xml, MEDCatalog.xml, etc. Ces catalogues sont au format XML
91 qui est décrit ici : :ref:`schemaxml`. On peut également en avoir une vue dans l'IHM graphique en 
92 consultant le catalogue de composants.
93
94 Les séquences
95 '''''''''''''''
96 Un type séquence sert à typer une liste d'éléments homogènes. Le type contenu dans la liste est le même
97 pour tous les éléments.
98 Pour définir un type séquence, on lui donne un nom et on spécifie le type des éléments de la séquence.
99
100 Le KERNEL de SALOME définit des types séquences pour les types de base.
101
102 ================= ==============================
103 Type YACS          Type des éléments
104 ================= ==============================
105 dblevec               double
106 intvec                int
107 stringvec             string
108 boolvec               bool
109 ================= ==============================
110
111 Il est possible de définir un type séquence de séquence. Dans ce cas, le type de l'élément est un type séquence.
112
113 Les structures
114 ''''''''''''''''
115 Le type structure sert à typer une donnée structurée comme un struct C. Cette donnée contient des membres nommés
116 et typés.
117 Pour définir un type structure, on lui donne un nom et on spécifie la liste des membres (nom, type).
118
119 Le composant GEOM définit un type structure de nom "BCError" comportant un seul membre de nom "incriminated" et
120 de type "ListOfLong". "ListOfLong" est lui-même une séquence d'"int".
121
122 Les ports
123 -------------
124 Un port peut être considéré comme une interface d'un noeud avec l'extérieur.
125 Il existe trois types de port : les ports de contrôle, les ports de données et les ports datastream.
126 Chacun a une sémantique différente.
127
128 Les ports de contrôle
129 ''''''''''''''''''''''''
130 Ce type de port est utilisé pour mettre des contraintes sur des enchainements d'exécution de noeuds.
131 Un noeud élémentaire ou composé dispose, en général, d'un port de contrôle entrant et d'un port
132 sortant. 
133 Un noeud qui a son port de contrôle d'entrée connecté au port de sortie d'un autre noeud ne 
134 sera exécuté que lorsque ce deuxième noeud sera terminé.
135
136 Les ports de données
137 ''''''''''''''''''''''''
138 Ce type de port est utilisé pour définir les données qui seront utilisées par le noeud lors de son exécution
139 et les données qui seront produites par le noeud à la fin de son exécution.
140 Un port de données a un nom, un sens (input, output) et les données qu'il portent ont un type.
141 L'ordre de définition des ports est important car il est utilisé comme ordre des arguments lors de l'appel
142 des services de composants SALOME.
143
144 De façon générale, l'exécution d'un noeud de calcul élémentaire se passe comme suit :
145    - le contrôle est donné au noeud via le port de contrôle d'entrée
146    - les données d'entrée sont acquises par le noeud via les ports de données d'entrée
147    - le noeud s'exécute
148    - les données de sortie sont fournies aux ports de sortie
149    - le contrôle est rendu par le noeud via le port de contrôle de sortie
150
151 Un port de données d'entrée peut être initialisé ou connecté à un port de données de sortie.
152
153 Les ports datastream
154 ''''''''''''''''''''''''
155 Ce type de port est utilisé pour l'échange de données pendant l'exécution. Tous les noeuds élémentaires ne supportent
156 pas ce type de port. Pour le moment seuls les noeuds liés à des composants SALOME supportent ce type de port.
157 Un port datastream a un nom, un sens (input, output) et un type.
158 Ce type n'est pas directement le type d'une donnée mais plutôt celui d'un objet CORBA qui gère l'échange de 
159 données (voir ports DSC pour plus d'informations).
160
161 Les noeuds de calcul élémentaires
162 -------------------------------------
163 Un noeud de calcul élémentaire représente une fonction de calcul particulière (multiplication de 2 matrices, par exemple). 
164 Tout noeud de calcul a un type. 
165 On peut avoir un type de noeud qui exécute un service d'un composant Salome et un autre 
166 type de noeud qui exécute un bout de script Python. 
167 Les noeuds de calcul élémentaires se répartissent en deux catégories : les noeuds inlines
168 qui s'exécutent en local dans le coupleur YACS et les noeuds de service qui s'exécutent à 
169 distance et correspondent à la mise en oeuvre de composants SALOME.
170
171 Tout noeud de calcul a un nom qui sert d'identificateur. Cet identificateur doit etre unique dans son contexte de définition. 
172 Un schéma de calcul ou un noeud composé définit un contexte.
173
174 Un noeud de calcul a un port de contrôle d'entrée et un port de contrôle de sortie. 
175 Ces ports de contrôle sont connectés à travers le flot de contrôle.
176
177 Un noeud de calcul a, en général, des ports de données d'entrée et de sortie. 
178 Le nombre et le type des ports de données est déterminé par le type de noeud de calcul. 
179 Ces ports de données sont connectés à travers le flot de données.
180
181 Un noeud de calcul peut avoir des propriétés. Une propriété est un couple (nom, valeur)
182 où nom est le nom de la propriété et valeur une chaine de caractère qui donne sa valeur.
183
184 Noeud inline script Python
185 ''''''''''''''''''''''''''''''
186 Un noeud script Python exécute du code Python dans un contexte où sont présentes des variables
187 qui ont pour valeur le contenu des ports de données d'entrée au lancement de cette exécution.
188 Par exemple, si le noeud a un port de données d'entrée de nom "matrice", la variable "matrice" sera
189 présente dans le contexte d'exécution du script et aura pour valeur le contenu du port de même nom.
190 En fin d'exécution du script, les ports de données de sortie sont remplis avec les valeurs des variables
191 de même nom présentes dans le contexte d'exécution. Ces variables doivent être obligatoirement présentes.
192
193 Lorsque ce type de noeud est un noeud interne d'une boucle, le contexte d'exécution est réinitialisé
194 à chaque tour de boucle.
195
196 Noeud inline fonction Python
197 ''''''''''''''''''''''''''''''
198 Un noeud fonction Python exécute une fonction Python dont les arguments correspondent aux ports de données
199 d'entrée du noeud. Le nom de la fonction à exécuter est donné par un paramètre du noeud.
200 Si un tel noeud a 3 ports de données d'entrée de nom 'a', 'b', 'c' et que le nom de la fonction est 'f', l'exécution
201 du noeud correspondra à l'appel de f(a,b,c) où a, b et c sont les valeurs des ports de données de même nom.
202
203 Les données de sortie du noeud sont attendues comme un retour de la fonction sous la forme d'un tuple Python.
204 Par exemple, si on a 3 ports de données de sortie de nom 'x', 'y', 'z', la fonction devra se terminer
205 par "return x,y,z" où x,y et z sont les valeurs pour les ports de sortie de même nom.
206
207 Lorsque ce type de noeud est un noeud interne d'une boucle, le contexte d'exécution est conservé
208 à chaque tour de boucle ce qui permet de réutiliser des variables pendant les itérations.
209
210 Noeud de service SALOME
211 ''''''''''''''''''''''''''''''
212 Un noeud de service SALOME exécute un service d'un composant SALOME. 
213 On peut définir un noeud de service de deux façons :
214
215   1. en indiquant le type de composant (GEOM, SMESH, ...) et le service à exécuter
216   2. en indiquant un noeud de service existant et le service à exécuter
217
218 La deuxième forme existe car, dans certains cas, on veut utiliser l'état du composant à la
219 fin de l'exécution du premier service pour exécuter le deuxième service. L'état du composant
220 est conservé dans une instance de composant qui est créée à chaque fois qu'on utilise la
221 première forme. Si on utilise la deuxième forme, on ne crée pas une nouvelle instance de
222 composant mais on réutilise l'instance existante.
223
224 Un noeud de service a des ports de données d'entrée et de sortie et peut avoir également
225 des ports datastream d'entrée et de sortie.
226
227 Un noeud de service est chargé et exécuté sur un container SALOME. Ce placement est géré
228 au moyen du concept de container YACS (voir `Les containers`_) qui est une légère abstraction 
229 du container SALOME.
230 Pour gérer le placement du service SALOME, il est possible de désigner par son nom le container
231 YACS sur lequel on veut qu'il soit placé. Ceci n'est possible qu'avec la première forme de définition
232 du noeud. Si aucune information de placement n'est donnée, le service sera placé sur 
233 le container par défaut de la plate-forme SALOME : container FactoryServer sur la machine locale.
234
235 Les propriétés d'un noeud de service SALOME sont converties en variable d'environnement 
236 lors de l'exécution du service.
237
238 Noeud SalomePython
239 ''''''''''''''''''''''''''''''
240 Un noeud SalomePython est un noeud fonction Python à qui YACS fournit (dans le contexte
241 d'exécution Python) les informations nécessaires pour lancer des composants SALOME et exécuter leurs services.
242 Il s'agit de l'adresse du container sur lequel il faut charger et exécuter le composant. Cette adresse
243 est donnée dans la variable "__container__from__YACS__" qui a la forme <nom machine>/<nom container>.
244 Ce noeud est donc paramétrable avec des informations de placement sur un container comme un noeud
245 de service SALOME.
246
247 Restriction : ce type de noeud ne peut pas exécuter de service SALOME doté de ports datastream. Le noeud
248 est vu par YACS comme un noeud Python. Les ports datastream ne sont pas gérés.
249
250 Noeuds Data
251 ''''''''''''''''''''''''''''''
252 Un noeud Data sert à définir des données (noeud DataIn) ou à collecter des résultats (noeud DataOut)
253 d'un schéma de calcul.
254
255 Noeud DataIn
256 ++++++++++++++++++
257 Un noeud DataIn a uniquement des ports de données sortants qui servent à définir les données d'entrée
258 du schéma de calcul. 
259 Ces données ont un nom (le nom du port), un type (le type du port) et une valeur initiale.
260
261 Noeud DataOut
262 ++++++++++++++++++
263 Un noeud DataOut a uniquement des ports de données entrants qui servent pour stocker les résultats en sortie
264 du schéma de calcul.
265 Ces résultats ont un nom (le nom du port) et un type (le type du port).
266 Si le résultat est un fichier, on peut donner un nom de fichier dans lequel le fichier résultat sera copié.
267
268 L'ensemble des valeurs des résultats du noeud peut être sauvegardé dans un fichier en fin de calcul.
269
270 Noeuds Study
271 ''''''''''''''''''''''''''''''
272 Un noeud Study sert à relier les éléments d'une étude SALOME aux données et résultats d'un schéma de calcul.
273
274 Noeud StudyIn
275 ++++++++++++++++++
276 Un noeud StudyIn a uniquement des ports de données sortants. Il sert pour définir les données
277 du schéma de calcul provenant d'une étude SALOME.
278 L'étude associée est donnée par son StudyID SALOME.
279
280 Un port correspond à une donnée stockée dans l'étude associée. La donnée a un nom (le nom du port),
281 un type (le type du port) et une référence qui donne l'entrée dans l'étude. Cette référence est
282 soit une Entry SALOME (par exemple, 0:1:1:2) soit un chemin dans l'arbre d'étude SALOME (par exemple,
283 /Geometry/Box_1).
284
285
286 Noeud StudyOut
287 ++++++++++++++++++
288 Un noeud StudyOut a uniquement des ports de données entrants. Il sert pour ranger des
289 résultats dans une étude SALOME.
290 L'étude associée est donnée par son StudyID SALOME.
291
292 Un port correspond à un résultat stocké dans l'étude associée. Le résultat a un nom (le nom du port),
293 un type (le type du port) et une référence qui donne l'entrée dans l'étude.
294 Cette référence est soit une Entry SALOME (par exemple, 0:1:1:2) soit un chemin dans l'arbre 
295 d'étude SALOME (par exemple, /Geometry/Box_1).
296
297 L'étude associée peut être sauvegardée dans un fichier en fin de calcul.
298
299 Les connexions
300 -----------------
301 Les connexions entre ports d'entrée et de sortie des noeuds élémentaires ou composés sont
302 réalisées en établissant des liens entre ces ports.
303
304 Les liens de contrôle
305 ''''''''''''''''''''''''''''''
306 Les liens de contrôle servent à définir un ordre dans l'exécution des noeuds. Ils relient
307 un port de sortie d'un noeud à un port d'entrée d'un autre noeud. Ces deux noeuds 
308 doivent être définis dans le même contexte.
309 La définition du lien se réduit à donner le nom du noeud amont et le nom du noeud aval.
310
311 Les liens dataflow
312 ''''''''''''''''''''''''''''''
313 Les liens dataflow servent à définir un flot de données entre un port de données de sortie d'un noeud
314 et un port de données d'entrée d'un autre noeud. Il n'est pas nécessaire que ces noeuds soient définis dans 
315 le même contexte.
316 Un lien dataflow ajoute un lien de contrôle entre les deux noeuds concernés
317 ou entre les noeuds parents adéquats pour respecter la règle de définition des liens de 
318 contrôle. Le lien dataflow garantit la cohérence entre le flot de données et l'ordre d'exécution.
319 Pour définir le lien, il suffit de donner les noms du noeud et du port amont et les noms du noeud
320 et du port aval.
321 Les types des ports doivent être compatibles (voir `Compatibilité des types de données`_).
322
323 Les liens data
324 ''''''''''''''''''''''''''''''
325 Dans quelques cas (boucles principalement), il est utile de pouvoir définir des flots de données
326 sans définir le lien de contrôle associé comme dans le lien dataflow. On utilise alors le lien
327 data.
328 La définition est identique à celle du lien dataflow.
329 Les types des ports doivent être compatibles (voir `Compatibilité des types de données`_).
330
331 Les liens datastream
332 ''''''''''''''''''''''''''''''
333 Les liens datastream servent à définir un flot de données entre un port datastream sortant d'un noeud et un 
334 port datastream entrant d'un autre noeud. Ces deux noeuds doivent être définis dans un même contexte
335 et pouvoir être exécutés en parallèle. Il ne doit donc exister aucun lien de contrôle direct
336 ou indirect entre eux.
337 Pour définir le lien, on donne les noms du noeud et du port sortant et les noms du noeud
338 et du port entrant. La définition des liens datastream peut être complétée par des propriétés
339 qui paramètrent le comportement du port DSC qui réalise l'échange de données (voir ports DSC).
340 Les types des ports doivent être compatibles (voir `Compatibilité des types de données`_).
341
342 Compatibilité des types de données
343 '''''''''''''''''''''''''''''''''''''''''
344 Un lien data, dataflow ou datastream peut être créé seulement si le type de données du port 
345 sortant est compatible avec le type de données du port entrant.
346 Il y a trois formes de compatibilité :
347
348   - l'identité des types (par exemple double -> double)
349   - la spécialisation des types (par exemple FIELDDOUBLE -> FIELD)
350   - la conversion des types (par exemple int -> double)
351
352 Compatibilité par conversion
353 +++++++++++++++++++++++++++++++
354 La compatibilité par conversion s'applique uniquement aux types de base et à leurs dérivés 
355 (séquence, structure).
356 Les conversions acceptées sont les suivantes :
357
358 ================= ============================== ====================================
359 Type YACS          Conversion possible en                Commentaire
360 ================= ============================== ====================================
361 int                 double
362 int                 bool                           true si int != 0 false sinon
363 ================= ============================== ====================================
364
365 La conversion s'applique également aux types construits comme une séquence d'int qui
366 peut être convertie en une séquence de double. YACS prend en charge la conversion.
367 Ceci s'applique également aux structures et aux types imbriqués séquence de séquence,
368 structure de structure, séquence de structure, etc.
369
370 Compatibilité par spécialisation
371 +++++++++++++++++++++++++++++++++++
372 La règle de compatibilité s'exprime différemment pour les liens data (ou dataflow) et les
373 liens datastream.
374
375 Dans le cas des liens data (ou dataflow), il faut que le type du port de données sortant
376 soit dérivé (ou identique) du type du port de données entrant. Par exemple un port de données
377 sortant avec un type FIELDDOUBLE pourra être connecté à un port de données entrant avec le
378 type FIELD car le type FIELDDOUBLE est dérivé du type FIELD (ou FIELD est type de base de
379 FIELDDOUBLE).
380
381 Dans le cas des liens datastream, la règle est l'exact inverse de celle pour les liens data :
382 le type du port datastream entrant doit être dérivé de celui du port sortant. Il n'existe 
383 pour le moment aucun type datastream dérivé. La seule règle qui s'applique est donc l'identité
384 des types.
385
386 Liens multiples
387 '''''''''''''''''''
388 Les ports de contrôle supportent les liens multiples, aussi bien 1 vers N que N vers 1.
389
390 Les ports de données supportent les liens multiples 1 vers N et N vers 1. 
391 Les liens 1 vers N ne posent pas de problèmes. Les liens N vers 1 sont à utiliser avec 
392 précaution car le résultat final dépend de l'ordre dans lequel sont réalisés les échanges.
393 On réservera ce type de lien pour les rebouclages dans les boucles itératives. Dans ce 
394 cas l'ordre de réalisation des échanges est parfaitement reproductible.
395
396 Les ports datastream supportent également les liens multiples, 1 vers N et N vers 1. 
397 Les liens datastream 1 vers N ne posent pas de problèmes particuliers : les échanges de données sont
398 simplement dupliqués pour tous les ports d'entrée connectés.
399 Par contre, pour les liens datastream N vers 1, les échanges de données vont se recouvrir dans 
400 l'unique port d'entrée. Le résultat final peut dépendre de l'ordre dans lequel seront réalisés
401 les échanges.
402
403 Les noeuds composés
404 --------------------------------
405 Les noeuds composés sont de plusieurs types : bloc, boucles, noeud-switch.
406 Un noeud composé peut contenir un ou plusieurs noeuds de type quelconque (élémentaires ou composés).
407 Par défaut, l'ensemble des entrées et sorties des noeuds constituant le noeud composé sont accessibles de l'extérieur. 
408 On peut dire que les entrées du noeud composé sont constituées de l'ensemble des entrées des noeuds internes. 
409 Même chose pour les sorties. C'est le concept de boîte blanche.
410
411 Le noeud Bloc
412 ''''''''''''''
413 C'est un regroupement de noeuds avec des liens de dépendance entre les noeuds internes. 
414 Le Bloc est une boite blanche (les noeuds internes sont visibles). 
415 Un schéma de calcul est un Bloc.
416 Le Bloc se manipule de façon similaire à un noeud élémentaire. 
417 Il dispose d'un seul port de contrôle en entrée et d'un seul en sortie. 
418 En conséquence, deux blocs raccordés par un lien de donnée dataflow s'exécutent en séquence, tous les noeuds du premier bloc sont exécutés avant de passer au second bloc.
419
420 Le noeud ForLoop
421 ''''''''''''''''''''''
422 Une boucle permet des itérations sur un noeud interne.
423 Ce noeud interne peut être un noeud composé ou un noeud élémentaire. 
424 Certaines des sorties du noeud interne peuvent être explicitement rebouclées sur des entrées de ce même noeud interne.
425 Une boucle ForLoop exécute le noeud interne un nombre fixe de fois. Ce nombre est donné par un port
426 de donnée de la boucle de nom "nsteps" ou par un paramètre de la boucle de même nom. 
427
428 Le noeud While
429 ''''''''''''''''''''''
430 Une boucle While exécute le noeud interne tant qu'une condition est vraie. La valeur de la condition
431 est donnée par un port de donnée de la boucle de nom "condition".
432
433 Le noeud ForEach
434 ''''''''''''''''''''''
435 Le noeud ForEach est également une boucle mais il sert à exécuter, en parallèle, un corps de boucle en itérant 
436 sur une et une seule collection de données. Une collection de données est du type séquence.
437 Un port de données d'entrée du noeud ForEach de nom "SmplsCollection" reçoit la collection de données sur laquelle la boucle itère.
438 Cette collection de données est typée. Le type de donnée sur lequel la boucle itère est unique.
439 Le nombre de branches parallèles que la boucle gère est fixé par un paramètre de la boucle. Si la collection est de 
440 taille 100 et que ce paramètre est fixé à 25, la boucle exécutera 4 paquets de 25 calculs en parallèle.
441 Le noeud interne a accès à l'itéré courant de la collection de données via le port de données sortant de la boucle
442 de nom "SmplPrt".
443
444 En sortie de boucle il est possible de construire des collections de données typées. Il suffit de relier un port de 
445 données de sortie du noeud interne à un port de données d'entrée d'un noeud hors de la boucle. La collection de 
446 données est contruite automatiquement par la boucle.
447
448 Le noeud Switch
449 ''''''''''''''''''''''
450 Le noeud Switch permet l'exécution conditionnelle (parmi N) d'un noeud (composé, élémentaire). 
451 Ces noeuds doivent avoir un minimum d'entrées et de sorties compatibles.
452 La condition de switch (entier, réel) permet d'aiguiller l'exécution d'un noeud parmi n.
453 La condition de switch est donné par un port de donnée entrant du noeud Switch de nom "select" ou par un paramètre 
454 de ce noeud de même nom.
455
456 Si les noeuds sont terminaux (rien n'est exécuté à partir de leurs sorties), ils n'ont pas besoin d'avoir des sorties compatibles. 
457 Les ports de sortie exploités en sortie du noeud doivent être compatibles entre eux (i.e. dériver d'un type générique commun exploitable par un autre noeud en entrée).
458
459
460 Les containers
461 ---------------------
462 La plate-forme SALOME exécute ses composants après les avoir chargés dans des containers. Un container SALOME est un
463 processus géré par la plate-forme qui peut être exécuté sur toute machine connue.
464
465 Un container YACS sert à définir des contraintes de placement des composants sans pour autant définir précisément
466 la machine à utiliser ou le nom du container.
467
468 Le container YACS a un nom. Les contraintes sont données sous la forme de propriétés du container.
469 La liste actuelle des propriétés est la suivante :
470
471 =================== ============= =============================================
472 Nom                   Type            Type de contrainte
473 =================== ============= =============================================
474 policy               "best",       Choisit dans la liste des machines, une fois
475                      "first" ou    les autres critères appliqués, la meilleure
476                      "cycl"        ou la première ou la suivante. Par défaut,
477                                    YACS utilise la politique "cycl" qui
478                                    prend la machine suivante dans la liste
479                                    des machines connues.
480 container_name        string       si donné impose le nom du container SALOME
481 hostname              string       si donné impose la machine
482 OS                    string       si donné restreint le choix de l'OS
483 parallelLib           string       ??
484 workingdir            string      si donné, spécifie le répertoire d'exécution.
485                                   Par défaut, c'est le répertoire de lancement
486                                   de YACS sur la machine locale et le $HOME
487                                   sur les machines distantes.
488 isMPI                 bool         indique si le container doit supporter MPI
489 mem_mb                int          taille mémoire minimale demandée
490 cpu_clock             int          vitesse cpu minimale demandée
491 nb_proc_per_node      int          ??
492 nb_node               int          ??
493 nb_component_nodes    int          ??
494 =================== ============= =============================================
495
496 Le catalogue des ressources matérielles
497 ''''''''''''''''''''''''''''''''''''''''''
498 La liste des ressources matérielles (machines) connues de SALOME est donnée par le catalogue des
499 ressources : fichier CatalogResources.xml qui doit se trouver dans le répertoire de l'application SALOME utilisée.
500 Ce fichier est au format XML. Chaque machine est décrite avec le tag machine qui a plusieurs attributs
501 qui permettent de la caractériser.
502
503 ================================== =========================== ==============================================
504 Caractéristique                        Attribut XML                Description
505 ================================== =========================== ==============================================
506 nom                                 hostname                   soit le nom complet : c'est la clef 
507                                                                qui détermine la machine de manière unique 
508                                                                (exemple : "nickel.ccc.cea.fr") 
509 alias                               alias                      chaine de caractères qui permet d'identifier 
510                                                                la machine (exemple : "pluton")
511 protocole d'accès                   protocol                   "rsh" (défaut) ou "ssh"
512 type d'accès                        mode                       interactif "i" ou batch "b". Par défaut "i"
513 username                            userName                   user avec lequel on va se connecter sur 
514                                                                la machine
515 système d'exploitation              OS
516 taille de la mémoire centrale       memInMB
517 fréquence d'horloge                 CPUFreqMHz
518 nombre de noeuds                    nbOfNodes
519 nombre de processeurs par noeud     nbOfProcPerNode
520 application SALOME                  appliPath                  répertoire de l'application SALOME à utiliser
521                                                                sur cette machine
522 implémentation mpi                  mpi                        indique quelle implémentation de MPI est
523                                                                utilisée sur cette machine ("lam", "mpich1",
524                                                                "mpich2", "openmpi")
525 gestionnaire de batch               batch                      si la machine doit être utilisée au travers
526                                                                d'un système de batch donne le nom du
527                                                                gestionnaire de batch ("pbs", "lsf", "slurm").
528                                                                Pas de défaut.
529 ================================== =========================== ==============================================
530
531 Il est possible d'indiquer également la liste des modules SALOME présents sur la machine.
532 Par défaut, SALOME suppose que tous les composants demandés par YACS sont présents.
533 Chaque module présent est donné par le sous tag modules et son attribut moduleName.
534
535 Voici un exemple de catalogue de ressources::
536
537   <!DOCTYPE ResourcesCatalog>
538   <resources>
539     <machine hostname="is111790" alias="is111790" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" 
540              protocol="rsh" mode="interactif" nbOfNodes="1" nbOfProcPerNode="1" >
541     </machine>
542     <machine hostname="is111915" alias="is111915" OS="LINUX" CPUFreqMHz="2992" memInMB="1024" 
543              protocol="ssh" mode="interactif" nbOfNodes="1" nbOfProcPerNode="1" 
544              appliPath="SALOME43/Run">
545              <modules moduleName="GEOM"/>
546     </machine>
547   </resources>
548
549 .. _etats:
550
551 Les états d'un noeud
552 -----------------------------
553 Au cours de l'édition d'un schéma de calcul, les états possibles d'un noeud sont : 
554
555 =================== =============================================
556 Etat                  Commentaire
557 =================== =============================================
558 READY                 le noeud est valide, prêt à être exécuté
559 INVALID               le noeud est invalide, le schéma ne peut
560                       pas être exécuté
561 =================== =============================================
562
563 Au cours de l'exécution d'un schéma de calcul, les états possibles d'un noeud sont :
564
565 =================== =============================================================
566 Etat                  Commentaire
567 =================== =============================================================
568 READY                 le noeud est valide, prêt à être exécuté
569 TOLOAD                le composant associé au noeud peut être chargé
570 LOADED                le composant associé au noeud est chargé
571 TOACTIVATE            le noeud peut être exécuté
572 ACTIVATED             le noeud est en exécution
573 DONE                  l'exécution du noeud est terminée sans erreur
574 ERROR                 l'exécution du noeud est terminée avec erreur
575 FAILED                noeud en erreur car des noeuds précédents sont en erreur
576 DISABLED              l'exécution du noeud est désactivée
577 PAUSE                 l'exécution du noeud est suspendue
578 =================== =============================================================
579
580 .. _nommage:
581
582 Le nommage contextuel des noeuds
583 -------------------------------------
584 On a vu que les noeuds élémentaires et composés ont un nom unique dans le contexte de définition
585 qui correspond au noeud parent (schéma de calcul ou noeud composé). Pour pouvoir désigner les noeuds
586 dans toutes les situations possibles, on utilise plusieurs sortes de nommage :
587
588   - le nommage local : c'est le nom du noeud dans son contexte de définition
589   - le nommage absolu : c'est le nom du noeud vu depuis le niveau le plus haut du schéma de calcul
590   - le nommage relatif : c'est le nom du noeud vu d'un noeud composé parent
591
592 La règle générale est que les noms absolu et relatif sont construits en concaténant les noms locaux
593 du noeud et de ses parents en les séparant par des points.
594
595 Prenons l'exemple d'un noeud élémentaire de nom "n" défini dans un bloc de nom "b" qui lui même est défini
596 dans un bloc de nom "c" lui même défini au niveau le plus haut du schéma. Le nom local du noeud est "n".
597 Le nom absolu est "c.b.n". Le nom relatif dans le bloc "c" est "b.n". On applique la même règle pour
598 nommer les ports. Si le noeud "n" a un port de nom "p". Il suffit d'ajouter ".p" au nom du noeud
599 pour avoir le nom du port.
600
601 Il y a une exception à cette règle. Elle concerne le noeud Switch. Dans ce cas, il faut tenir compte du case
602 qui n'est pas un vrai noeud. Si on dit que le bloc "b" de l'exemple précédent est un switch qui a un case avec
603 une valeur de 1 et un default, alors le nom absolu du noeud "n" dans le case sera "c.b.p1_n" et celui dans
604 le default sera "c.b.default_n".
605
606 .. _errorreport:
607
608 Rapport d'erreur
609 -------------------
610 Chaque noeud a un rapport d'erreur associé si son état est INVALID, ERROR ou FAILED.
611 Ce rapport est au format XML. 
612
613 Les noeuds élémentaires produisent un rapport simple qui contient un seul tag (error)
614 avec 2 attributs :
615
616 - node : qui donne le nom du noeud
617 - state : qui indique son état
618
619 Le contenu du tag est le texte de l'erreur. Pour un noeud script python ce sera la plupart du temps,
620 le traceback de l'exception rencontrée. Pour un noeud de service, ce sera soit le contenu d'une
621 exception SALOME soit le contenu d'une exception CORBA.
622
623 Les noeuds composés produisent un rapport composite contenu dans un tag de même nom (error) avec
624 les 2 mêmes attributs node et state.
625 Le tag contient l'ensemble des rapports d'erreur des noeuds fils erronés.
626
627 Voici un exemple de rapport d'erreur pour une division par zéro dans un noeud python 
628 contenu dans une boucle::
629
630   <error node= proc state= FAILED>
631   <error node= l1 state= FAILED>
632   <error node= node2 state= ERROR>
633   Traceback (most recent call last):
634     File "<string>", line 1, in ?
635   ZeroDivisionError: integer division or modulo by zero
636   
637   </error>
638   </error>
639   </error>
640
641 Trace d'exécution
642 ------------------
643 Pour chaque exécution une trace d'exécution est produite dans un fichier de nom traceExec_<nom du schema>
644 où <nom du schema> est le nom donné au schéma.
645
646 Chaque ligne du fichier représente un évènement relatif à un noeud. Elle contient deux
647 chaines de caractères. La première est le nom du noeud. La deuxième décrit l'évènement.
648
649 Voici une trace pour le même exemple que ci-dessus::
650
651   n load
652   n initService
653   n connectService
654   n launch
655   n start execution
656   n end execution OK
657   n disconnectService
658   l1.node2 load
659   l1.node2 initService
660   l1.node2 connectService
661   l1.node2 launch
662   l1.node2 start execution
663   l1.node2 end execution ABORT, Error during execution
664   l1.node2 disconnectService
665
666 Exécution des branches concurrentes
667 -------------------------------------
668 YACS peut exécuter simultanément les noeuds de calcul d'un schéma.
669 Cependant l'exécution simultanée d'un grand nombre de noeuds peut saturer le système.
670 Il est possible de controler le nombre maximum
671 d'exécutions simultanées en fixant le nombre maximum de threads utilisés avec
672 la variable d'environnement YACS_MAX_THREADS. Par défaut, cette valeur vaut 50.
673
674 .. _archi:
675
676 YACS general architecture
677 ------------------------------
678
679 YACS module implements API of a full SALOME module only for the schema execution.  The schema edition is done in the GUI process alone.  For execution, YACS has a CORBA servant that implements Engines::Component CORBA interface (see SALOME 4 KERNEL IDL interfaces).  YACS GUI and YACS CORBA engine share YACS core libraries (engine and runtime): GUI uses them at schema design time, then a schema XML file is saved and passed to YACS CORBA API, and finally YACS core libraries execute the schema at YACS CORBA server side.
680
681 YACS GUI differs from standard full SALOME modules (such as Geometry or Mesh) in that it does not use SALOMEDS objects to create Object Browser representation of its data, and creates this representation in a way light SALOME modules do.  This is done in order to avoid publishing lots of objects in SALOMEDS study just to create visual representation of data and thus to improve GUI performance.
682
683 YACS architecture scheme is shown on the picture below.
684
685 .. image:: images/general_architecture_0.jpg
686      :align: center
687
688 The YACS module will be developed as a Salome module with one document (study) per desktop.
689
690 YACS is composed of several packages. The main things are mentioned in the next sections.
691
692 Bases package
693 '''''''''''''''''''''''
694 Bases package contains common base classes (exception, threads, etc.) and constants.
695
696 Engine package
697 '''''''''''''''''''''''
698 Engine package consists of calculation schema generic classes (calculation nodes, control nodes, control and data flow links, etc.) Engine is in charge to
699
700     * edit,
701     * check consistency,
702     * schedule,
703     * execute
704
705 graphs independently from the context (i.e. Runtime) the graph is destined to run.
706
707 SALOME Runtime package
708 '''''''''''''''''''''''
709 Runtime package provides implementation of YACS generic calculation nodes for SALOMR platform. Runtime exists in a given Context.  Runtime is in charge to:
710
711     * treat physically the basic execution of elementary tasks in a given context,
712     * transfer data in this context,
713     * perform the physical deployment of the execution.
714
715 Runtime simply appears in Engine as an interface that a concrete Runtime must implement to be piloted by Engine.
716 SALOME Runtime nodes
717
718
719 The SALOME Runtime implements following nodes.
720
721     * Inline function node.  A function inline node is implemented by a Python function.
722     * Inline script node.  A script inline node is implemented by a Python script.
723     * Component service node.  This is a calculation node associated with a component service.
724     * CORBA reference service node.  Reference service node for CORBA objects.  This is a node that executes a CORBA service.
725     * CPP node.  This is a C++ node (in process component), i.e. local C++ implementation - single process.
726
727 XML file loader package
728 ''''''''''''''''''''''''''''''''
729 This is XML reader for generic calculation schema.
730
731 XML file loader provides
732
733     * a possibility to load a calculation schema in memory by reading and parsing a XML file describing it,
734     * an executable named driver that can be used to load and execute (see Using YACS driver) a calculation schema given as a XML file (see Writing XML file).
735
736 GUI design
737 ''''''''''''''''''''''''''''''''
738 Goals of Graphic User Interface design are the following.
739
740     * Provide a general mechanism for the synchronisation of several views (tree views, 2D canvas views, edition dialogs).  For this goal, a subject/observers design pattern is used: several observers can attach or detach themselves to/from the subject.  The subject send update events to the lists of observers and does not know the implementation of the observers.  The observers correspond to the different views in case of YACS.
741     * Provide an interface of Engine for edition with a general mechanism for undo-redo (future version!).
742     * Be as independent as possible of Qt (and SALOME), to avoid problems in Qt4 migration, and allow a potential re-use of YACS GUI outside SALOME.
743
744