FR 3076921 A1 20190719 FR 1872121 A 20181130 Description Titre de l'invention : OptimiSation DU TEMPS D'exÉcution D'UN programME D'ORDINATEUR EN DÉTERMINANT LA MISE EN OEUVRE D'UNE fOnctionEN FONCTION D'UN ÉVENTAIL DE paramÈtREsD'ENTRÉEET D'UNE EXACTITUDE Domaine technique [0001] L'invention se rapporte à l'optimisation d'un programme d'ordinateur afin d'améliorer ses performances d'exécution. En particulier, l'invention s'applique au domaine de programmes d'ordinateur réalisant des tâches de calcul. [0002] ARRIÈRE-PLAN DE L'INVENTION [0003] Certains programmes d'ordinateur sont dédiés à des domaines tels que les prévisions météorologiques, une simulation d'accident, un jeu en 3D, etc., ce qui implique des tâches de calcul énormes. [0004] Le développeur d'un tel programme d'ordinateur écrit un code exécutable, dans n'importe quel langage informatique, qui, à certains moments, appelle une fonction en charge de tâches de calcul dédiées. Les fonctions peuvent souvent être rendues disponibles pour le développeur par une bibliothèque de logiciels. Elles peuvent être génériques (calcul de sinus, de cosinus, etc.) ou plus spécifiques (calcul en 3D...). [0005] Toutefois, en général, le but de telles bibliothèques est d'être indépendantes de l'application. Par conséquent, l'algorithme mettant en oeuvre la fonction doit être générique de sorte à s'appliquer à un large éventail de conditions. [0006] D'un autre côté, on sait que, dans certaines conditions plus restreintes, de meilleures performances peuvent être obtenues, parfois équilibrées par une précision moindre dans le résultat mais qui pourraient être acceptables étant donné l'application. [0007] Par exemple, un calcul trigonométrique (sinus, cosinus...) peut être mis en oeuvre par différents algorithmes, qui a pour but de trouver de bonnes approximations numériques du vrai calcul mathématique. Chaque algorithme fournit des caractéristiques respectives en termes de performances, de précision (ou d'exactitude), qui peuvent dépendre de conditions du calcul, telles que spécialement la valeur des paramètres d'entrée sur lesquels le calcul est effectué. [0008] En conséquence, le développeur d'un programme informatique devrait être prudent pour chaque appel d'une fonction si la mise en oeuvre de la bibliothèque peut ou non être utilisée ou si une mise en oeuvre spéciale doit, de préférence, être utilisée. La détermination de chaque appel, le choix et le remplacement du code de mise en oeuvre sont des étapes réalisées manuellement par les développeurs. [0009] 2 [0010] Certains outils existent pour analyser automatiquement le code exécutable d'un programme d'ordinateur mais aucun ne propose de déterminer automatiquement des appels de fonctions, éligibles au remplacement du code exécutable de mise en oeuvre « par défaut ». De plus, aucune solution ne propose un outil automatisant complètement le processus d'optimisation du programme d'ordinateur en ce qui concerne les appels de fonctions de calcul. Résumé de l'invention [0011] L'objet de la présente invention est d'atténuer au moins partiellement les incon- vénients mentionnés ci-dessus. [0012] Plus particulièrement, l'invention a pour but de déterminer des appels éligibles de fonctions et d'enchaîner ces déterminations avec la génération automatique d'un code exécutable approprié, adapté aux conditions des appels respectifs, et avec le remplacement automatique du précédent code exécutable « par défaut » par le code exécutable généré. [0013] Ce but est atteint avec un procédé d'optimisation d'un programme d'ordinateur, comprenant : une première étape de détermination dans ledit programme d'ordinateur d'un appel d'une fonction ayant au moins un paramètre d'entrée, ledit appel correspondant à un premier critère selon lequel ledit au moins un paramètre d'entrée se trouve à l'intérieur d'un intervalle sensiblement plus petit que la fourchette de valeurs possibles pour ledit paramètre d'entrée, et à un second critère correspondant à une exactitude souhaitée pour ledit appel ; une deuxième étape de génération automatique d'un code exécutable pour mettre en oeuvre ladite fonction, minimisant le temps d'exécution pour ledit au moins un paramètre d'entrée qui se trouve à l'intérieur dudit intervalle et est compatible avec ladite exactitude souhaitée ; une troisième étape de remplacement du code existant mettant en oeuvre ladite fonction par le code exécutable généré à ladite deuxième étape. [0014] Des modes de réalisation préférés comprennent une ou plusieurs des caractéristiques suivantes, qui peuvent être prises séparément ou ensemble, soit en combinaison partielle soit en combinaison complète. - ladite première étape comprend le déclenchement automatique d'une série d'exécutions pour ledit programme d'ordinateur et l'analyse automatique de ladite exécution pour mesurer, pour chacun desdits appels, la valeur dudit au moins un paramètre de sorte à déterminer ledit intervalle ; - ladite exactitude souhaitée est déterminée au moins partiellement sur la base de l'environnement dudit appel dans ledit programme d'ordinateur ; 3 - ladite deuxième étape comprend la génération d'expressions de code, associées chacune à un terme d'une suite mathématique approximant ladite fonction, dans lequel le nombre desdites expressions de code est déterminé par ladite exactitude souhaitée ; - ladite fonction est une fonction trigonométrique ; - ladite deuxième étape consiste à générer un premier code d'exécution en se basant sur une série de Taylor, ou un second code d'exécution en se basant sur des polynômes de Tchebychev ; - ladite deuxième étape consiste à générer ledit premier code d'exécution en se basant sur une série de Taylor si ledit intervalle est proche de zéro, et ledit second code d'exécution en se basant sinon sur des polynômes de Tchebychev. [0015] Un autre objet de l'invention consiste en une plate-forme pour l'optimisation d'un programme d'ordinateur, comprenant des moyens pour déterminer dans ledit programme d'ordinateur d'un appel d'une fonction ayant au moins un paramètre d'entrée, ledit appel correspondant à un premier critère selon lequel ledit au moins un paramètre d'entrée se trouve à l'intérieur d'un intervalle sensiblement plus petit que la fourchette de valeurs possibles pour ledit paramètre d'entrée, et à un second critère correspondant à une exactitude souhaitée pour ledit appel ; un programme d'ordinateur pour la génération automatique d'un code exécutable pour mettre en oeuvre ladite fonction minimisant le temps d'exécution pour ledit au moins un paramètre d'entrée qui se trouve à l'intérieur dudit intervalle et est compatible avec ladite exactitude souhaitée, et le remplacement du code existant mettant en oeuvre ladite fonction par le code exécutable généré à ladite deuxième étape. [0016] Selon un mode de réalisation de cette plate-forme, lesdits moyens sont un second programme d'ordinateur conçu pour la détermination automatique dudit appel. [0017] D'autres caractéristiques et avantages de l'invention apparaîtront à partir de la des- cription suivante des modes de réalisation de l'invention, donnés en tant qu'exemples non limitatifs, en se référant aux dessins ci-joints listés ci-dessous. Brève description des dessins [0018] [fig.1] montre un flux de données illustratif selon des modes de réalisation de l'invention. [0019] [fig.21 montre un exemple schématique d'un appel à une fonction, selon des modes de réalisation de l'invention. Description des modes de réalisation [0020] L'invention a pour but l'optimisation d'un programme d'ordinateur existant afin d'améliorer ses performances en se concentrant sur les appels à des fonctions mettant en oeuvre un calcul. 4 [0021] Ce qui est appelé « calcul » dans la description suivante comprend notamment le calcul de fonctions mathématiques, spécialement les fonctions pour lesquelles le résultat ne peut pas être exactement déterminé mais est une approximation déterminée par un algorithme heuristique. [0022] Des exemples typiques, mais non exhaustifs, sont des fonctions trigonométriques telles que la fonction sinusoïdale ou cosinusoïdale, qui sont largement utilisées dans un grand éventail d'applications. Le sinus ou le cosinus ne peut pas être directement calculé par un ordinateur mais des approximations peuvent être déterminées par des algorithmes tels que la série de Taylor ou les polynômes de Tchebychev. Des descriptions de ces deux algorithmes peuvent être, par exemple, trouvés dans l'encyclopédie participative Wikipedia : https://en.wikipedia.org/wiki/Taylor series https://en.wikipedia.org/wiki/Chebyshev polynomials [0023] Bien sûr, d'autres algorithmes d'approximation sont également possibles pour mettre en oeuvre une fonction sinusoïdale ou cosinusoïdale. [0024] De même, un autre type de fonctions mathématiques peut être considéré comme « calcul » et abordé par la présente invention : les transformées de Fourier et d'autres transformées, un calcul matriciel, etc. [0025] Toutes ces approches fournissent seulement des résultats d'approximation surtout pour ces deux raisons. [0026] D'abord, parce qu'elles sont basées sur des séries mathématiques ou d'autres procédés d'approximation qui, par définition, fourniront un résultat exact seulement après le calcul d'une infinité de termes. Mais également, parce que des ordinateurs ne peuvent pas traiter des valeurs « réelles » mais seulement des approximations, telles que, par exemple, la double précision (DP) de la norme 1EEE754. Ce schéma de codage est expliqué, par exemple, dans https://en.wikipedia.org/wiki/IEEE 754. [0027] Selon l'invention, et comme représenté dans le flux de données illustratif de la figure 1, une première étape Sll consiste à déterminer dans un programme d'ordinateur à optimiser les appels à certaines fonctions identifiées. Ces fonctions identifiées sont celles qui mettent en oeuvre un calcul tel que défini ci-dessus. Bien sûr, le procédé peut seulement se concentrer sur un sous-ensemble de ces dernières, ou même sur une ou deux de ces fonctions telles que les fonctions sinusoïdales ou cosinusoïdales, par exemple. [0028] Afin de recueillir un échantillon substantiel de valeurs de paramètres d'entrée, le programme d'ordinateur peut être exécuté plusieurs fois. À chaque exécution, la valeur du ou des paramètres d'entrée peut être stockée de telle sorte qu'à la fin de l'ensemble d'exécutions, un « espace » de valeurs soit constitué, formant un intervalle entre une valeur minimale et une valeur maximale. [0029] En outre, typiquement, pendant un temps d'exécution, un appel donné à une fonction peut avoir lieu plusieurs fois grâce à des boucles dans le programme d'ordinateur. Chaque fois, les paramètres d'entrée de la fonction sont normalement différents. [0030] La figure 2 illustre un tel exemple schématique dans lequel la première ligne verticale représente la fonction principale MF, composée d'une séquence d'instructions Ti, T2, T3, ..., Ti, ..., Tn. À l'étape Tn, la fonction principale fait des boucles sur l'instruction T2. L'instruction Ti appelle la fonction SF qui comprend les étapes Si, S2, S3, Sp. L'instruction Sp met fin à l'appel de fonction et le traitement passe à l'instruction suivante de Ti de la fonction principale MF. [0031] L'appel de la fonction SF peut être conforme à un format différent en fonction des langages logiciels et des plates-formes sous-jacentes mais il peut ressembler à [0032] [Math.1] y = SF (x). [0033] dans lequel SF est un identifiant de la fonction, y est le résultat (une valeur ou un ensemble de valeurs) et x constitue les paramètres (une valeur ou un ensemble de valeurs). [0034] Il peut être apprécié dans cet exemple que la fonction SF sera appelée à chaque boucle dans la fonction principale MF. À chaque boucle, les paramètres d'entrée x devraient normalement être différents. [0035] Pour chaque appel déterminé à l'étape S11, dans une seconde étape 512, le procédé comprend la détermination de l'intervalle constitué par les valeurs des paramètres d'entrée de la fonction à chaque occurrence des appels. [0036] Dans le cas habituel dans lequel un appel donné a lieu plusieurs fois, les différentes valeurs des paramètres pour toutes ces occurrences peuvent être stockées de sorte à déterminer les valeurs minimale et maximale. Lorsque la fonction comprend plusieurs paramètres d'entrée, cela peut être réalisé pour tous les paramètres. [0037] Ces valeurs minimale et maximale forment un intervalle qui sera utile pour dé- terminer si l'appel est éligible à une optimisation. [0038] L'étape 513 peut être réalisée en parallèle à l'étape 512, ou en séquence avec cette dernière. Elle consiste à déterminer une précision souhaitable pour l'appel. [0039] Une telle précision, ou exactitude, peut être déterminée manuellement par le dé- veloppeur, en fonction du programme d'ordinateur qui est développé. [0040] De même, l'exactitude peut être déterminée au moins partiellement sur la base de l'environnement dudit appel dans le programme d'ordinateur. [0041] Cet environnement peut comprendre les instructions se servant du résultat de la fonction. [0042] Selon un mode de réalisation, cet environnement peut être regardé à travers une « 6 fenêtre », qui peut comprendre les quelques précédentes instructions avant l'appel et certaines instructions ultérieures après l'appel. Dans l'exemple de la figure 2, une telle fenêtre peut être formalisée sous la forme d'un sous-ensemble d'instructions [Ti - a ; Ti + 01 de la boucle principale MF, dans lequel a et 13 sont deux paramètres de configuration, a peut être zéro de telle sorte que seules des instructions ultérieures soient prises en compte pour déterminer l'environnement. [0043] Au moyen d'une analyse automatique de ces instructions, il est possible d'obtenir des informations concernant la manière avec laquelle est utilisé le résultat de la fonction dans la fonction principale. En particulier, en fonction de la manière avec laquelle le résultat est traité par des instructions ultérieures, on peut déterminer l'impact de son exactitude sur l'exactitude des résultats de ces résultats ultérieurs. [0044] Un exemple trivial est l'arrondi de la fonction de résultat en tant qu'instruction ul- térieure, comme dans l'exemple suivant : [0045] [Math.21 [0046] dans lequel le « 4 » signifie que z est arrondi à 4 chiffres après la virgule. [0047] Dans une telle situation triviale, il ne serait pas nécessaire de calculer y = sin(x) avec une exactitude plus importante puisque les données supplémentaires calculées seront perdues par les instructions ultérieures (à savoir l'instruction « arrondir »). [0048] À l'étape S14, il est alors possible de déterminer si l'appel est éligible à une opti- misation s'il correspond à deux critères : - un premier critère selon lequel l'intervalle déterminé à l'étape S12 est sensiblement plus petit que la fourchette de valeurs possibles pour le ou les paramètres d'entrée ; - un second critère correspondant à l'exactitude souhaitée du résultat de la fonction, déterminé à l'étape S13. [0049] L'intervalle déterminé devrait être assez petit par comparaison avec la fourchette de valeurs possibles de sorte que certaines caractéristiques spécifiques puissent être associées à cet intervalle. En d'autres mots, il devrait être le déclencheur de la détermination d'une mise en oeuvre particulière de la fonction qui serait appropriée dans cet intervalle. [0050] Par conséquent, la granularité de l'intervalle approprié et, donc, la signification du terme « sensiblement plus petit » dépend de la fonction à laquelle l'appel doit être optimisé. Pour certaines fonctions, certaines caractéristiques peuvent être déterminées pour une proximité à zéro, par exemple, le déclenchement d'une mise en oeuvre spécifique ; pour d'autres fonctions, les intervalles appropriés pourraient être des valeurs positives et négatives d'un paramètre, etc. 7 [0051] Selon un mode de réalisation particulier, différentes mises en oeuvre peuvent chacune être associées à un intervalle approprié. Alors, l'intervalle déterminé à l'étape S12 peut être comparé à cet intervalle. Si un intervalle englobant cet intervalle déterminé est trouvé et si une exactitude souhaitée a été déterminée, alors l'appel est éligible à une optimisation. [0052] Une fois qu'un appel d'une fonction a été déterminé comme remplissant les deux critères, un code exécutable est automatiquement généré à l'étape S2 pour réduire à un minimum le temps d'exécution pour cette fonction, lorsque les paramètres d'entrée se trouvent dans l'intervalle déterminé auparavant et étant donné que l'exactitude calculée peut être assouplie à l'exactitude déterminée auparavant. [0053] En d'autres mots, il est supposé que l'échantillon sur lequel l'intervalle des pa- ramètres d'entrée est déterminé est assez approprié (par exemple, assez important) de sorte que les exécutions ultérieures du programme d'ordinateur produiront des valeurs de paramètre pour cet appel dans ce même intervalle. [0054] Le code exécutable pour mettre en oeuvre la fonction est choisi à la fois en fonction de cet intervalle et de l'exactitude souhaitée. Cette exactitude souhaitée peut servir à la fois de degré de liberté, permettant des choix plus importants de mises en oeuvre, mais également de paramètre pour optimiser davantage la mise en oeuvre choisie. [0055] Par conséquent, les deux critères travaillent en synergie pour définir le code exécutable le plus approprié mettant en oeuvre la fonction. [0056] Par exemple, certaines mises en oeuvre d'une fonction comprennent une séquence d'expressions de code, chacune étant associée à un terme d'une série mathématique approximant cette fonction. Alors, le nombre de ces termes (et, donc, d'une expression de code) est déterminé par cette exactitude souhaitée. [0057] Par conséquent, le code exécutable généré est optimisé comme comprenant seulement le nombre minimal de termes permettant d'atteindre l'exactitude souhaitée (étant donné que n'importe quel terme supplémentaire donnera une exactitude supplémentaire inutile et augmentera le temps d'exécution global à cause de ces termes supplémentaires à calculer). [0058] Des exemples concrets peuvent être fournis en ce qui concerne des fonctions mathé- matiques telles que des fonctions trigonométriques (sinusoïdale, cosinusoïdale, ...). [0059] Si l'intervalle déterminé est proche de zéro, une mise en oeuvre basée sur une série de Taylor peut être sélectionnée. Sinon, une mise en oeuvre basée sur des polynômes de Tchebychev peut être sélectionnée. [0060] Alors, l'exactitude souhaitée peut être utilisée pour affiner le code exécutable de sorte à être généré pour mettre en oeuvre la fonction. [0061] Bien sûr, d'autres mises en oeuvre sont possibles mais, pour la clarté et la concision de la description, un exemple basé sur ces 2 mises en oeuvre sera décrit. L'homme de 8 l'art sera capable de trouver la manière d'adapter cet exemple à d'autres mises en oeuvre. [0062] Les séries de Taylor sont des techniques bien connues pour approximer des fonctions mathématiques telles que des fonctions trigonométriques. En théorie, des séries infinies donnent le résultat exact mais, dans un calcul numérique, les séries devraient évidemment être limitées à un certain nombre N de termes. [0063] [Math.3] sin (-1)' 2 COS arc sri +1) [0064] B2n étant les nombres de Bernoulli. [0065] Ensuite, l'exactitude souhaitée peut être utilisée pour déterminer le nombre N de termes de la série qui doit être calculée. [0066] Selon l'algorithme de mise en oeuvre sélectionné et ce nombre N déterminé, le code exécutable peut être automatiquement généré. [0067] Ensuite, avec une exactitude souhaitée déterminant N = 5, le code d'exécution généré pourrait ressembler à: [0068] [Math.4] dbe mysp (co doubie ubie - (0,00833333333333333333333333. _f ma -0,166666666666(666,666,666667). ma _ f ma turn z; [0069] dans lequel fma est la fonction classique « multiplication et ajout fusionnés » et mul est une simple multiplication. [0070] Avec un nombre N de termes plus important, le code d'exécution généré peut ressembler à: 9 [0071] [Math.51 deubie mysin7 Vonst double double -64469596404571726804541778342.521.e 67) ; (1.,64397470831657903351.58153477343e - 63)) -3'866623513960593886-82'91976978711e 60)) ; (83596508471828039833247254227972e --- 57)) 52108677421951.8869829563371.38e - (2,98931.0827142404510789.1.219144872e 50)) -12 -4902469756513543397694159939759e - 47)) 15 îi,gnes similaires ne.,7 sont pas représentées pour k concis:Ln de la pation -ma (-0'00)1.98-41269841269841269841 fnrn (2r: 2r (z1:2. (-0,1666666656666 jrna_r, z, _fma_rn return z [0072] Comme pour les polynômes de Tchebychev, plusieurs approches peuvent être utilisées. [0073] Selon un mode de réalisation, le sous-problème à traiter consiste à trouver la com- binaison des polynômes de Tchebychev qui optimisent l'approximation dans l'intervalle déterminé. Ces polynômes Pi ont la propriété de définir une base (dans le sens mathématique). Ensuite, une fonction f(x) peut être approximée par n polynômes de Tchebychev : [0074] [Math.61 [0075] La détermination des coefficients a, peut être réalisée au moyen de résolutions d'équations, qui peuvent être automatiquement effectuées par un outil de calcul formel. [0076] En utilisant le langage d'un outil bien connu tel que le produit logiciel Mathematica, la détermination du coefficient peut être réalisée par le code suivant : [0077] [Math.71 Pi f\ indices [RANGE 1 ;.eule.?r [g = Nintegrate rt 1 x'21.),(x, -1, 1.), WorkingPreciston-> 120. Pr cftionGoà1 - 25 I eb inned Chebvsii.eteni scale[801INDA.alt'' .Sin[bOUND.ARle *c]iiirenentCheb s.hepT[ 4.ChebyshevT che.b/trindices = .roe s[[1. + È.12 >r. C.TJebys.he sifie[x. scale[1.xl -1) otai apixi /0.Éne-iice .x1( BOUN.DARY .)) ; [0078] dans lequel BOUNDARY est la limite par rapport à l'intervalle et RANGE est la série d'indices des coefficients qui doivent être déterminés. [0079] Cet exemple dérive des enseignements de l'article trouvé à l'adresse URL suivante : http :////m00000 000/cheb y shev- sine-approximation [0080] Ensuite, ces coefficients peuvent être introduits dans le code d'exécution qui doit être généré. [0081] En particulier, dans le cas où les coefficients ont été déterminés par un outil de calcul formel tel que « Mathematica », les coefficients peuvent être convertis et affichés. Un code pour ce faire pourrait être : [0082] [Math.81 Nxp and[X71} For: MAX, sintf Ch-mn [Coeff .- [0083] Ensuite, le coefficient peut être utilisé de la même manière que dans le cas de la série de Taylor ci-dessus. Par exemple, pour un intervalle déterminé par BOUNDARY = 2 Tr , un code d'exécution généré peut être : [0084] 11 [Math.91 douWe mysin3(geedoubie doubtè (0,00244a414.277640195526611) (z,; .x2, (-0, 1095821850691169157383)) 1n (Z:. x2, (0,8331853926375413.273273)) ; .JR7.&et x I reiurn z [0085] Ou, pour une précision, ou une exactitude, plus grande : [0086] [Math.10] double nu ysi)-t2 colut double z ; 5369196481185774086991e - !ince:J.1 (1,619.1.8965394971365023e- 63)) ; -3,86300500767834087.0269e - 8,3ç927652962167080,8748e - 57) 1,6552.0797.1952329213549 - :i.emes simildires ne sent pas. repréSentéeS pf3er la concis.ion de la d ima.gatien 5052108385441.71.877505e 8 (2,75.5731.9223985890652S6e fn're 0,D001984.1.2698417698412 6984)) ; rna_? (0'008333333333333333333333)) ; 0,1b66,66666666666667)) tnegfe return z ; [0087] À la différence de la série de Taylor, les coefficients dépendent de l'exactitude 12 souhaitée, à savoir la valeur de RANGE dans l'algorithme ci-dessus et de l'intervalle, à savoir la valeur de BOUNDARY. [0088] Les polynômes de Tchebychev donnent une approximation avec une exactitude presque strictement constante pour toutes les valeurs possibles des paramètres d'entrée à l'intérieur de RANGE (au moins par comparaison à l'approximation fournie par des séries de Taylor). Toutefois, des séries de Taylor donnent une meilleure approximation proche de zéro de telle sorte que, pour une exactitude souhaitée donnée, moins de termes soient requis, impliquant une meilleure optimisation en termes de temps de traitement. [0089] De même, de nombreux autres algorithmes de mise en oeuvre peuvent être utilisés pour approximer la fonction, chacun ayant des caractéristiques différentes en termes d'exactitude, d'exactitude par rapport à un équilibre d'intervalle, de temps de traitement, etc. Plus des algorithmes de mise en oeuvre sont disponibles, plus appropriée peut être la détermination du code d'exécution qui doit être généré. [0090] Une fois que le code d'exécution est généré, il remplacera le code d'exécution utilisé auparavant qui a mis en oeuvre la fonction appelée. Cette étape de remplacement S3 peut être réalisée en joignant simplement le code d'exécution au code global du programme d'ordinateur et en remplaçant l'appel à la fonction par un appel à cette nouvelle mise en oeuvre de la fonction (à savoir sans supprimer nécessairement la précédente mise en oeuvre, qui pourrait être utilisée pour mettre en oeuvre la fonction en ce qui concerne un autre appel à elle au moyen du programme d'ordinateur). [0091] L'invention a été décrite en se référant à des modes de réalisation préférés. Toutefois, de nombreuses modifications sont possibles dans la portée de l'invention. 13 [Revendication 11 [Revendication 21 [Revendication 31 [Revendication 41 [Revendication 51 [Revendication 61