Bonjour Vincent, I am adding sage-combinat-devel in cc to my answer to your email because I think it the discussion is pertinent. Although, I realized it in the end, so everything is in French... Sorry.
> Je viens de poster un brouillon de la classe LanguageOfFullWords. > Comme j'ai besoin de faire des calculs rapides, j'utilise le plus > possibles des objets python de base, mais évidemment ça limite > l'utilisation. En plus, on pourrait aller exponentiellement plus vite > (et gagner beaucoup de place) en utilisant en SuffixTrie... En effet, > la construction du langage est locale: pour construire les mots de > taille n on regarde juste les mots de taille n-1 et on fait > éventuellement un test de palindrome. Par contre on a besoin de > regarder à gauche et à droite. Cool, alors, je vais continuer à travailler sur le suffix trie à la cassaigne. > sage: L = sage.combinat.words.language.LanguageOfFullWords(2) > sage: L > Language of full words over the Ordered Alphabet ['0', '1'] > sage: [L.factor_complexity(i) for i in range(15)] > [1, 2, 4, 8, 16, 32, 64, 128, 252, 488, 932, 1756, 3246, 5916, 10618] > > Quelques remarques, dis-moi ce que tu en penses: > 1) Ce serait pratique d'avoir un __getitem__ dans Language, pour le > moment il est implémenté très bas (LanguageOfMorphism, > LanguageOfFullWords) D'abord le getitem retourne une liste des facteurs de longueurs n du langage, c'est bien ça qu'on veut? Je trouve ça pratique, sauf que souvent le getitem suit le comportement de __iter__ alors qu'ici __iter__ itère sur le facteurs eux-mêmes. Tu n'avais peut-être pas une version à jour lorsque tu as fait cette remarque, car __getitem__ est implémenté dans Language. > 2) L'utilisation de __new__ complique l'héritage ! Je suis obligé de > faire une méthode __new__ presque triviale dans ma nouvelle classe. Le but du __new__ est d'éviter d'appeler LanguageOfFullWords, LanguageOfMorphism, LanguageOfWord, pour construire une instance et d'utiliser plutôt et toujours le même mot clé Language. Maintenant, la question est de savoir comment reconnaître qu'avec certains arguments donnés l'utilisateur veut construire le language d'un morphisme, des facteurs d'un mot, des mots pleins, etc. En fait, je crois qu'une autre solution serait mieux dans ce cas-ci. L'utilisation de méthodes sur les objets permet d'éviter toute l'ambiguité due à la création d'un objet plus complexes à partir d'objets simples (qui peuvent utiliser les mêmes structures de données python pour représenter des objets différents). sage: W = Words('ab') sage: F = W.language_of_full_palindromic_words() sage: P = W.language_of_palindromes() De même, on pourrait faire la même chose pour le langage des facteurs d'un mot: sage: w = Word('aasldnafnasdfl') sage: L = w.language() et le langage d'une substitution: sage: m = WordMorphism('a->ab,b->ba') sage: L = m.language() Et on pourrait même éviter l'ajout du mot Language dans le namespace de Sage, car de toute façon, on doit toujours créer un autre objet Sage (Morphisme, Mot, Ensemble de mots) avant de créer une instance de langage. Qu'en penses-tu? Sébastien -- You received this message because you are subscribed to the Google Groups "sage-combinat-devel" group. To post to this group, send email to sage-combinat-de...@googlegroups.com. To unsubscribe from this group, send email to sage-combinat-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sage-combinat-devel?hl=en.