Principe de compilation

Le projet Doomformer transforme un réseau neuronal à poids entiers en une carte du moteur DOOM. L’idée centrale consiste à exploiter les structures de données du format .wad – secteurs, plans, niveaux de lumière – comme supports de stockage pour les paramètres du réseau. Chaque poids et chaque biais du modèle est quantifié sur un intervalle compatible avec les valeurs autorisées par le moteur, ce qui évite tout recours à la virgule flottante.

Représentation des valeurs dans le moteur DOOM

Deux attributs du format de carte sont réutilisés : le niveau de lumière (0‑255) et la hauteur du plan (valeur 16‑bits signée). Le niveau de lumière encode directement les valeurs d’entrée et d’intermédiaire du réseau, tandis que la hauteur du plan sert à stocker les résultats intermédiaires d’opérations arithmétiques. Cette double utilisation garantit que chaque donnée reste dans les limites imposées par le moteur, limitant ainsi les risques de débordement ou de perte de précision.

Mécanisme d’arithmétique via entités

Les « voodoo dolls » – entités du jeu qui reproduisent les actions d’une autre entité – sont détournées pour réaliser les opérations de base du réseau (addition, multiplication, comparaison). Chaque doll est positionnée dans le niveau de façon à déclencher un script de déplacement ou de changement de lumière lorsqu’elle est activée. En combinant plusieurs dolls, le système reproduit les fonctions d’activation et les agrégations de neurones. Le processus repose entièrement sur le moteur de rendu et les règles de collision de DOOM, sans injection de code externe.

Validation et limites

Pour vérifier la fidélité du calcul, l’auteur compare les sorties de la carte DOOM avec celles d’une implémentation NumPy du même réseau, en appliquant une tolérance définie par l’utilisateur. La comparaison montre que les écarts restent inférieurs à la marge spécifiée, ce qui confirme que la quantisation et la représentation via lumière/hauteur sont suffisantes pour des réseaux modestes. Cependant, la capacité de stockage du format impose une contrainte stricte sur la taille du modèle : chaque poids occupe un octet (niveau de lumière) ou deux octets (hauteur), limitant le nombre total de paramètres à quelques dizaines de milliers. De plus, l’absence de support natif pour les fonctions non linéaires complexes oblige à approximer les activations par des combinaisons d’opérations de base, ce qui peut affecter la précision sur des tâches plus exigeantes.