Mes deux dernières semaines

07/07/2018

Un long moment sans nouvelle…

Il s’est passé pas mal de temps depuis le dernier billet ; celui-ci sera un rapide récaputilatif de toutes les tâches que j’ai pu accomplir depuis les deux dernières semaines.

Semaine du 25 au 29 juillet 2018

PySD

J’ai passé l’essentiel du début de la semaine à contribuer au projet PySD, la bibliothèque qui m’a permis de traduire (transpiler) le modèle Vensim en une version Python. J’ai notamment effectué une Pull Request1 qui concerne le comportement de la fonction ACTIVE INITIAL. Elle avait en effet un petit souci : la fonction ACTIVE INITIAL de Vensim permet d’initialiser des variables au premier pas de temps avec une valeur donnée, puis de lui affecter sa formule. Par exemple, voici comment est définie la variable food ratio :

food ratio  = 
        ACTIVE INITIAL( food per capita 
                  / subsistence food per capita , 
             1)
    ~   Dmnl
    ~     FOOD RATIO (FR#127)

La variable est initialisée à 1 en 1900, puis dès 1900,52 est calculé par le rapport foodpercapitasubsistencefoodpercapita\frac[food\ per\ capita][subsistence\ food\ per\ capita]. Cette fonction est utile lorsque des cycles ou boucles sont présents dans le graphe du modèle et éviter une initialisation circulaire irrésolvable. On comprend que ce type de fonction est utilisé, World3 comprend exactement 1 863 803 boucles élémentaires (dont chaque élément de la boucle est présent une seule fois), dont 519 861 comprennent la variable food_ratio.

Le hic : l’implémentation PySD les paramètres de cette fonction était évalués (= calculait) à son appel, qu’on soit à l’initialisation ou après… Ce qui automatiquement, créait les fameuses boucles d’initialisation tant évitées. En Python, il suffisait de faire passer les paramètres en tant que fonctions (auparavant passées par valeur) grâce au mot clé lambda pour pouvoir appeler ces dernières en temps voulu.

def food_ratio():
    return functions.active_initial(lambda: food_per_capita() / subsistence_food_per_capita(),
                                    lambda: 1.0)
Nouvelle implémentation de food_ratio en Python
Le premier paramètre est la formule, et le deuxième est la valeur prise à l’initalisation

Parallélisation

En vue de l’analyse de sensibilité, j’ai essayé de paralléliser le calcul de W3 pour l’accélérer. Malheureusement, j’ai perdu pas mal de temps dessus en me dirigeant vers des solutions trop complexes (multiprocessing en Python alors que le langage n’est pas concçu pour ça…). Les tâches étant indépendantes, il me suffisait en fait de découper les jeux de paramètres d’entrée pour pouvoir les lancer simultanément.

Semaine de 2 au 6 juillet 2018

Rangement du modèle

J’ai généré un fichier JSON de la liste de toutes les variables du modèle avec leur type, leurs identifiants (abbréviation et code numérique), leurs dépendances, leur nom et un commentaire. Comme tous mes travaux, ce fichier est disponible et mis à jour sur mon repo git : liste des variables de W3. Vous pouvez ainsi exploiter ces données plus facilement et par exemple générer vos propres graphes, faire des recherches sur les variables, etc. Je créerai peut-être prochainement un outil web pour pouvoir explorer ces données facilement.

Comparaison des versions 1972 et 2003 de W3 et analyses de sensibilité (AS)

Une AS relativement complète de W3 a déjà été faite en 19763. Une première mission est de comparer les résultats qui ont été tirés de la première version de W3 avec la version 2003 (celle avec laquelle je travaille). Ces résultats peuvent aussi être un premier jet d’une AS complète. Cette tâche commence par une comparaison des variables utilisées dans W3-72 et W3-03 (disponible dans le fichier Comparaison 1972-2003.ods du repo git). Mis à part l’intégration d’un index de bien-être dans la dernière version, les différences entre les versions 1972 et 2003 sont essentiellement d’ordre ergonomique, permettent de mieux appréhender le modèle, comme expliqué dans l’annexe du livre Les limites à la croissance du Club de Rome.

J’ai enfin pu récupérer mes identifiants pour le centre de calcul de l’IN2P3, les résultats des analyses de sensibilité préliminaires arriveront donc très prochainement.

Quelques autres infos annexes

Il me reste au moment où j’écris ce billet deux semaines de stage à l’INRIA, les résultats arriveront très vite et j’essaierai au mieux de publier plus fréquemment jusqu’à la fin du mois. Je pense que je continuerai de tenir ce blog après mon stage, au moins pendant la rédaction de mon rapport.

Parallèlement à mon stage, le maintien de ce blog m’a permis de développer un générateur de blog en Python, qui utilise Pandoc, que je passe pas mal de temps à peaufiner. Celui-ci sera prochainement disponible librement. Extrêmement simple et un minimum extensible, se concentrant sur le contenu et autorisant l’intégration de code, formules et figures, je pense qu’il se destine plutôt aux scientifiques souhaitant publier sur le web.


  1. le nom qu’on donne aux requêtes d’intégration d’une contribution pour un projet sur GitHub

  2. rappel : W3 est calculé sur des temps de 0,5 an

  3. Je détaillerai cette analyse dans un autre billet