Toute simulation est identifiée par une chaîne de caractères unique (sérialisation de la représentation JSON).
Ajouter une simulation à la base revient à faire le lien entre cet identifiant et les fichiers compressés.
Par la suite, ce même identifiant permet de déterminer si une simulation existe déjà, pour extraire ses fichiers ou pour la supprimer de la base.
Gestion via les paramètres
Doublons et correction
La description de simulations peut être stockée dans un fichier JSON, ou générée via un script Python.
def generate():
return [
{
'folder': f'simulations/x_{x}',
'settings': {
'perturbation': {
'x': x,
'y': 0
}
}
}
for x in (0.8 * k / 9 for k in range(0, 10))
]
Gestion via les paramètres
Doublons et correction
L'identification des paramètres est stricte : '0.0' != '0' !
Les valeurs peuvent être altérées avant d'être utilisées via les fixers (arrondis, conversions, …).
une fois l'exécution finie, il lit la seconde et l'exécute,
…
Comment les générer en parallèle ?
Pour générer $N$ simulations sur $p$ processus parallèles, on peut découper la liste des simulations en $p$ groupes de $\frac{N}{p}$.
Automatisation complète
Jobs
Deux fichiers sont à la base des jobs :
un fichier listant les lignes de commande,
un compteur indiquant quelle ligne est la suivante à lancer.
Intérêt : plusieurs jobs peuvent tourner en parallèle, avec ajout dynamique possible.
Automatisation complète
Maker
À ce stade plusieurs étapes sont automatisées mais les liens entre eux restent manuels :
on utilise le manager pour extraire des simulations,
on obtient une erreur pour celles qui n'existent pas,
on utilise le générateur pour créer les fichiers nécessaires,
on utilise les jobs pour générer les simulations,
on utilise le manager pour ajouter les nouvelles simulations,
on utilise le manager pour extraire la liste complète.
Un nouveau module fait le lien entre tous : le Maker.
Le Maker boucle jusqu'à avoir toutes les simulations en utilisant les autres modules.
Recherche de paramètres
Recherche de paramètres
Exemple : recherche d'un zéro
Le Maker est utile pour tester des paramètres fixés à l'avance : comment l'utiliser pour déterminer un paramètre optimal ?
Exemple : un script admet pour paramètre un nombre $L$ et stocke les valeurs de la fonction $x \mapsto \cos(Lx)$ pour $x \in [-1,1]$.
On évalue une simulation en sommant les valeurs obtenues (jusqu'à l'avant-dernière) et on recherche le zéro de cette fonction d'évaluation.
Calculer cette somme revient à approcher l'intégrale de $\cos(L\cdot)$ sur $[-1,1]$ (à une constante multiplicative près). Les zéros de cette intégrale sont les multiples de $\pi$.
Recherche de paramètres
Exemple : recherche d'un zéro
Une première idée est d'utiliser le Maker : on teste plusieurs valeurs de $L$, on évalue chaque simulation et on affine l'intervalle de recherche manuellement.
C'est manuel, un peu (beaucoup) ennuyeux, et on stocke des simulations qui ne sont pas forcément nécessaires.
Un autre module permet d'automatiser cette tâche : le Mapper.
Recherche de paramètres
Évaluation d'une simulation
Une fonction d'évaluation est définie par l'utilisateur : elle associe une simulation ou un groupe de simulations à une valeur (généralement un nombre).
Le Mapper permet d'associer des simulations à ces valeurs sans nécessairement les stocker.
Le Mapper utilise le Maker pour générer les simulations décrites, puis appelle la fonction d'évaluation et enfin teste le passage en 0.
Recherche de paramètres
Recherche automatique
Le Mapper peut aussi être utilisé pour affiner l'intervalle de recherche automatiquement.
En utilisant une méthode de dichotomie ou de sécante, le bon paramètre peut être calculé :
on évalue quelques valeurs de paramètres pour commencer,
on teste le passage par la bonne valeur,
on obtient un intervalle qui définit une nouvelle valeur à tester,
la simulation correspondante est générée et évaluée,
et on continue jusqu'à avoir la bonne précision.
État des lieux du projet
État des lieux du projet
Hateno est utilisable, pour générer des simulations ou rechercher des paramètres optimaux.
Le code est instable et le restera jusqu'à la version 1.0 : des ajustements sont parfois nécessaires entre deux versions (exemple : la future version 0.17 qui va encore tout casser).
Ce ne sont pas les idées qui manquent pour la suite :