En calcul évolutionnaire, ladiversitéest la condition d'efficacité de l'algorithme : ce n'est qu'en maintenant un nombre suffisant de solutions candidates que la pression de sélection n'enfermera pas prématurément la population dans un optimum local. Mais la diversité implique en même temps une charge de calcul considérable — une seule exécution nécessite souvent d'évaluer des dizaines de milliers, voire des millions de solutions candidates. Lorsque les candidats sont écrits sous forme de tableaux d'objets ordinaires et évalués un par un à l'aide de boucles élément par élément, la majeure partie du temps de calcul est absorbée par l'ordonnancement élément par élément et le flux de contrôle du langage hôte, plutôt que par les opérations numériques proprement dites. C'est précisément làla raison pour laquelle les boucles CPU sérielles classiques sont inefficaces pour traiter des dizaines de milliers d'évaluations de candidatsla cause profonde.
Un saut dans la représentation : de la liste de candidats au graphe de calcul tensorisé
Le changement apporté par EvoX n'est pas l'accélération locale d'un opérateur, maisun changement dans la façon de représenter le processus évolutionnaire: on passe d'un traitement sous forme de liste, candidat par candidat, à un calcul par lots où le tenseur est un citoyen de première classe. L'ensemble des candidats n'est plus dispersé dans des tableaux d'objets ; il est organisé de manière unifiée sous forme de tenseurs avec les résultats d'évaluation et l'état de l'algorithme, ce qui leur permet de participer aux opérations en tant qu'ensemble.
- Tenseur de candidats: toute une génération de candidats est écrite sous forme d'un tenseur de forme [taille de population, dimension de solution]. Un « candidat » n'est alors qu'une ligne du tenseur, et non plus un objet indépendant du langage hôte.
- Opérateurs par lots: des opérations comme la mutation s'appliquent directement à toute la population ; un seul appel met à jour l'ensemble des candidats, au lieu de N appels en boucle.
- Évaluation par lots: sous la forme evaluate(tenseur de candidats), on obtient en une seule fois les résultats d'évaluation de toute la génération ; l'unité de mesure des évaluations passe de « l'unité » au « lot ».
- Graphe de calcul: la sélection et la mise à jour d'état ne sont plus de simples logiques de contrôle sérielles, mais des nœuds du graphe, ce qui leur ouvre la voie aux optimisations de compilation telles que la fusion d'opérateurs et l'ordonnancement parallèle.
Comparaison des deux écritures
L'écriture sous forme de liste revient à : extraire les candidats un par un, les évaluer un par un, les comparer un par un et mettre à jour l'état — chaque étape dépend des boucles du langage hôte, ce qui rend difficile toute optimisation globale. L'écriture tensorisée, elle, procède ainsi : tenseur de candidats → mutation → évaluation → sélection → mise à jour d'état ; toute la chaîne est composée d'opérations tensorielles et exprimée sous forme d'un graphe de calcul, que le compilateur peut fusionner et ordonnancer sur les appareils. À noter : la logique de l'algorithme (distribution de mutation, pression de sélection) n'est pas réécrite ; ce qui est réécrit, c'estla façon de le représenter.
