La PoC (Preuve de concept) dont il est ici question est en python, mais elle est généralisable à tout langage objet.
Le projet
Aujourd'hui à 99% de couverture de code on peut considérer la PoC complète. Le code source sur github est ici.
Le projet vise à transformer de manière portable les tableaux associatifs en vecteur algébrique.
Pour ça on part d'un développement initialement piloté par les propriétés algébriques pour obtenir du code chez moi ça marche©.
Pourquoi ? Parce que c'est drôle, mais incidemment, et on va explorer plus tard comment : c'est utile.
La présentation FOSDEM 2017 est ici, la version vidéo est ici.
Comment ?
En utilisant des traits ou mixins (votre éclairage sur le sujet est bienvenu) par surcharge des opérateurs (à droite et à gauche) on obtient des comportements qui sont compatibles avec n'importe quoi qui a l'interface d'une table associative.
En composant les traits, on obtient deux familles de tableaux associatifs algébriques

Les tableaux associatifs algébriques qui supportent la logique de combinaison linéaire.
Et les tableaux associatifs vectoriels qui supportent les opérations sur la norme, le produit scalaire et le cosinus.
Utilité
Avoir des vecteurs de dimensions n et fractal
Autant la fractalité des vecteurs me laisse de marbre et je ne vois pas l'utilité, autant avoir des vecteurs indéfinis est utile. Un cas simple est le fameux « word counter » (compte mots) utilisé dans les exemples d'indexation textuelle.
Plus un cosinus est proche de 1 plus vos deux vecteurs pointent dans la même direction ce qui permet de mesurer la similarité.
Ce qui est vrai avec des comptes mots est vrai avec d'autres vecteurs.
Utiliser python comme démonstrateur de pseudo code qui « marche » pour de l'objet
Foncièrement, les ficelles utilisées dans ce projet sont les mêmes que pour du C++/ruby/php?/C# : de la bonne vieille surcharge d'opérateur et des utilisations d'interfaces.
Il est donc possible de porter le code en utilisant les algorithmes pas très sioux utilisés et les tests vers d'autres langages.

# Il dit qu'il n'a plus de genou
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 6 (+3/-0).
Je n'ai rien compris. Enfin, presque rien. Et pourtant, les tableaux associatifs et les vecteurs, j'ai une assez bonne idée de ce que c'est et ce qu'on peut faire avec.
Ça ne donne aucune idée de ce dont il s'agit concrètement, mais bravo.
Euh, tu as utilisé des traits et des mixins et tu aimerais avoir des explications à ce sujet ‽
Je m'arrête là, c'est trop mal expliqué pour moi. Je vais aller voir la présentation et le code pour voir si j'en tire quelque chose de compréhensible, parce que c'est quand même intriguant cette histoire.
[^] # Re: Il dit qu'il n'a plus de genou
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 6 (+3/-0).
Super le code, ça s'appelle l'archerie et les fichiers Python s'appellent la caserne, l'arc, le carquois et la flèche. Je vois que c'est optimisé pour le divertissement de l'auteur, pas pour la relecture.
Sinon, visiblement il s'agit de classes qui implémentent des dictionnaires avec des trucs dignes d'un espace vectoriel, à savoir :
le tout en respectant suffisamment bien les axiomes d'un espace vectoriel.
Voilà, est-ce que ce n'est pas plus clair en présentant les choses comme ça ?
[^] # Re: Il dit qu'il n'a plus de genou
Posté par Jul (site web personnel) . Évalué à 1 (+0/-0).
J'étais parti de l'idée que j'utilisais des traits, et après, j'ai filé la métaphore pour tenter d'être cohérent.
Après tout, un ensemble de traits (flèches en anglais) c'est un carquois …
Et une implémentation concrète d'un ensemble de trait ça paraissait « logique » d'appeler ça un arc (car c'est avec ça qu'on lance des « traits »).
Après, avec le temps, je me suis aperçu que c'était un poil foireux, mais j'ai pas eu l'imagination nécessaire à trouver des meilleurs noms. J'ai juste changé les arcs japonais initiaux (hankyus et daikyus) par mdict (dict qui multiplie) et vdict (dict vectoriel)…
Nommer c'est dur. Ça m'a servi de leçon, depuis, j'essaie d'éviter la créativité.
si si.
Il faut croire que la communication n'est pas mon fort. _^
Merci pour ce résumé qui à mon avis est plus éclairant que ma présentation.
[^] # Re: Il dit qu'il n'a plus de genou
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3 (+0/-0). Dernière modification le 14 avril 2026 à 10:44.
Oui, la métaphore filée, c'est justement assez difficile à filer jusqu'au bout. :-)
[^] # Re: Il dit qu'il n'a plus de genou
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 5 (+2/-0).
Bon, j'ai regardé un peu le code. C'est assez étrange à mes yeux, il faut dire que je ne comprends pour le moment rien du tout aux traits et aux mixins, donc accessoirement ce n'est pas moi qui pourrai t'éclairer sur les concepts que tu as utilisés. Personnellement, je m'amuserais bien à faire ce genre de truc sans m'encombrer de ces concepts : après tout, ça devrait être faisable en définissant simplement quelques classes héritant de
dict.Quoi qu'il en soit, j'ai l'explication que je cherchais : l'addition et la multiplication par un scalaire, qui sont au cœur d'un espace vectoriel, fonctionnent en travaillant coordonnée par coordonnée, en considérant chaque clef comme un indice de coordonnée.
Par conséquent, cela ne fonctionne que pour les dictionnaires à valeurs susceptibles d'être additionnées ou multipliées par un scalaire. Forcément, sinon ce ne serait pas des maths mais de la magie.
À mon sens, cela consiste à considérer un espace vectoriel de dimension infinie à coordonnées indexées par n'importe quels objets immuables. C'est intéressant.
[^] # Re: Il dit qu'il n'a plus de genou
Posté par Jul (site web personnel) . Évalué à 1 (+0/-0).
L'avantage du duck typing (juste s'appuyer sur la présence de __setitem__ et __getitem__) c'est que ça permet de faire un truc générique.
Ce qui permet de faire hériter des classes qui ne sont pas des dict des méthodes nécessaires à l'implémentation de l'algèbre linéaire (ou plus), mais ont une interface de dict en lui faisant hériter des traits (ou mixins) par composition.
Ex (peut être que du code c'est plus clair) :
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.