essais / erreurs

This commit is contained in:
Jean Sirmai 2022-06-17 19:37:05 +02:00
parent be2fe2e451
commit 52a1315eb2
Signed by: jean
GPG Key ID: FB3115C340E057E3
19 changed files with 187 additions and 1951 deletions

View File

@ -1,714 +0,0 @@
2022-06-03 9h00
_____________________________________________________________
| |
| 714 lines 4880 mots 28266 car 36435 octets |
|____________________________________________________________|
Le client est la partie dont l'exécution est rythmée par l'utilisateur.
Il comporte:
- les entrées / sorties / contrôles d'erreurs associés
- le contrôle par l'utilisateur du déroulement du calcul effectué par le serveur
- demande / initialisation / terminaison du calcul (dialogues client/serveur)
- interface serveur > user (quel est l'état du modèle ? comment fonctionne l'automate ?)
- user > interface serveur (stop, slow / speed, undo / redo, modify the nb of threads or the algorithm...)
- la gestion des vues (conformité à une view_type)
- les éditions
- des états
- des règles de transition
- des arbres de règles
- les interprétation des mesures des états du modèle et de son histoire
- les traductions, la gestion du vocabulaire
- des aides/facilités/présentation (textes, vues, liens) vers :
- le contexte théorique, la bibliographie
- principes / justifications / limites du modèle
- licence, droits, auteurs, informations pratiques
- outils de présentation
Le nombre de calculs pouvant être effectués en parallèle dépend :
- du rapport entre l'étendue de l'espace local et celui de l'espace global
- du temps de parcours moyen des règles (si l'on néglige les opérations d'initiation et de terminaison des threads de calcul et les opérations de communication de la boucle principale avec son environnement)
Note : l'interface ligne de commande doit également intercepter les demandes des utilisateurs et les déléguer a des threads ou processus dédiés
-----------------
Thread de calcul:
- initialisé avec adresse + orientation dans l'[espace graphique]
- boucle for qui suit le même trajet dans cet espace et dans l'[arbre des règles]
et compare, à chaque étape, l'état de l'espace à la condition de l'arbre correspondante
si la condition est satisfaite (l'état de l'espace est conforme à la règle)
alors continuer le chemin
sinon return (aucune règle ne s'applique)
les choses sont un peu plus compliquées à cause des 'branches neutres':
si la règle ne pose pas de condition sur un état de l'espace rencontré,
alors, plusieurs règles pourraient convenir: il faut aller voir au delà et revenir;
les variables nécessaires pour mener à bien ces explorations sont toutes locales.
- en cas de succès,
* écrit les opérations prescrites par la règle dans l'[espace graphique]
* écrit les additions / délétions dans [arrows list]
* indique à Mesures le n° de la règle qui s'applique
- dans tous les cas (succès, échec, erreur), indique à Mesures le résultat du cycle.
l'[arbre des règles] est seulement lu.
espace graphique
arbre des règles
arrows list
* Users interface agit sur les paramètres du calcul:
- on / off, vitesse,
- fréquence des mesures, (transmis au module Mesures)
- fréquence de transmission des résultats (transmis au module Superviseur)
--------------------------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/Cahier%20des%20charges%20client
deux modes de communication:
-. commandes en ligne via un terminal et 'raw data' (données non formatées) ou
-. interface graphique
deux types de sessions:
-. fabrication (repérage et correction des erreurs) ou
-. interprétation (quelle part de la réalité ce modèle ce modèle représente-t-il ?)
liste des vues et des fonctions auxquelles elles donnent accès:
-. run
-. run, stop
-. speed, slow
-. pas à pas: montre l'état local et la règle sélectionnée, avant et après application
-. do, undo, redo (en continu +/- rapide ou pas à pas)
-. état global
-. défilement,
-. zoom,
-. sélection (objets, tags,...),
-. filtres apparence (links, tiles),
-. recherches
-. état local
-. extraction de l'état global,
-. filtres apparence (links, tiles),
-. édition,
-. copie (en vue d'une édition d'une règle)
-. règles
-. images état local (avant, après),
-. identité (nom, chemin),
-. listes (avec filtres, tris) (conditions, actions, commentaires)
-. texte complet (format XML, texte,...)
-. vignettes (lien vers la règle)
-. activation / inhibition
-. mesures d'activité
-. tracking
-. édition de règles
-. à partir d'une copie d'un état local,
-. à partir de structures extraites de bases de données
-. de novo
-. étude du domaine d'application de la règle (essais d'application à d'autres situations)
-. activité des règles ('rules account')
-. filtres (sélection de groupes de règles àpartir d'arbres utilisateurs)
-. liens vers les vignettes,
-. activation / inhibition
-. mesures d'activité
-. tracking
-. transformations
-. activation / inhibition,
-. mesures d'activité
-. tracking
-. arbre des conditions
-. complet,
-. condensé (les noeuds sans bifurcations sont supprimés),
-. édition manuelle ?
-. filtre branches neutres,
-. activation / inhibition,
-. mesures d'activité
-. tracking
-. liens vers les vignettes
-. arbres utilisateurs
-. édition
-. mesures d'activité
-. tracking
-. liens vers les vignettes
-. histoire
-. concentrations,
-. transformations,...
-. filtres objets, ensembles d'objets, transformations,...
-. durées de vie des objets ('lifespans')
-. filtres objets, ensembles d'objets
-. espace de phases
-. axes objets / axes transformations / mixtes ?
-. corrélations
-. entre objets, transformations, les deux ?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Fichiers de profils et de sessions
Chaque utilisateur de gem-graph peut travailler sur différents modèles gem-graph et peut, ou non, faire appel aux serveurs gem-graph.
Dans chaque situation, il peut avoir ses propres préférences (langage, apparences, aides, contexte, correspondants, etc...).
Une session gem-graph est une exécution (une instance) du client gem-graph.
Une session est, le plus souvent, exécutée à propos d'un modèle.
Durant cette session, l'utilisateur peut ou non être connecté à un serveur gem-graph.
Les données gem-graph sont donc de différents types (et stockées dans différents fichiers) selon qu'elles sont relatives à :
Un utilisateur. Celui-ci peut vouloir éditer ses préférences-client sans travailler sur un modèle. A chaque utilisateur est associé un fichier préférences-client.
Un utilisateur travaillant sur un modèle. A chaque paire modèle-client est associée un fichier session.
Un utilisateur établissant une connexion avec un serveur. Chaque utilisateur est identifié dans une base de données utilisateurs et modèles accédée uniquement par les serveurs.
Un serveur travaillant (à la demande d'un client) sur un modèle. A chaque modèle vu par un serveur est associé un fichier modèle.
Un administrateur de serveur (fichier journal, base de données utilisateurs et modèles, base de données serveurs)
Une session gem-graph commence donc par la lecture d'un fichier préférences-client et se termine par son enregistrement.
Il existe autant de fichiers préférences-client que de clients.
Si l'utilisateur veut travailler sur un modèle, il doit charger ou créer un fichier session. Ce fichier décrit un modèle vu par un client.
Il existe autant de fichiers session-modèle-client que de paires (tuples) utilisateur-modèle.
En fin de session, les modifications du modèle sont enregistrées dans ce fichier session-modèle-client.
Si l'utilisateur veut faire tourner un modèle sur un serveur, il doit d'abord demander un accès à un serveur.
Cet accès utilise des données de la base de données utilisateurs et modèles.
Il doit, après s'être identifié, choisir le modèle qu'il veut faire tourner.
Il peut s'agir d'un modèle déjà répertorié dans la base de données, d'un modèle modifié ou d'un nouveau modèle.
Tout modèle, quel que soit son statut, est enregistré dans la base de données utilisateurs et modèles.
Opérations traitées par un client gem-graph:
édition d'un modèle en cours
comparaisons, fusion de modèles (complètes ou partielles), recombinaisons...
-----------------------------------
Accès aux données : le cas des modèles ayant un espace global dont la taille est invariante.
Pour représenter un espace de taille fixe dans le client, un tableau de tous les sites dans toutes les cellules faciliterait les accès.
Un module en C (avec get / set) permettrait d'optimiser (dans un second temps) ce cas particulier mais fréquent.
----------------------------------
UI : détection des erreurs reproductibles et aléatoires lors de la fabrication d'un modèle.
Ces deux types d'erreurs sont repérables par des techniques différentes faisant appel à des outils parfois communs, parfois différents.
Cette issue a pour but de lister ces outils afin de faciliter le design du client.
Il va probablement falloir un sous-groupe Gem-graph-lab spécialisé dans le dépistage des erreurs reproductibles et disposant d'un moteur monothread (lent mais indépendant) pour traiter des demandes incompatibles avec les performances demandées au serveur (voir les issues serveur #25, #26 et #27, trop contraignantes pour le serveur).
Le serveur devrait être dédié aux calculs haute performance nécessaires à la recherche d'erreurs aléatoires puis à l'étude des résultats des modèles (leur confrontation à la réalité).
Voir aussi liste des outils dans le cahier des charges : https://git.a-lec.org/gem-graph/gem-graph/-/blob/38e5c855e90d08fa5c6bddba7de5f7e4151b5149/Cahier%20des%20charges
Les erreurs reproductibles (systématiques) sont facilement repérables car elles bloquent rapidement l'exécution du modèle en générant un état cahotique ou, au minimum, non conforme à des critères facilement définissables. Ces critères peuvent porter sur la structure de l'état global (présence ou absence de tel type d'objet ou variation du nombre d'objets de tel type au dela d'un seuil, etc....) ou sur la fréquence d'exécution d'un règle ou d'un groupe de règles.
Ces erreurs peuvent (liste non limitative) :
bloquer complètement l'exécution d'une règle
survenir à chaque exécution d'une règle
survenir toujours dans la même situation ou en présence du même objet
effectuer une modification facilement identifiable
...
Elles surviennent fréquemment lors de la création des modèles.
Elles sont facilement identifiées et corrigées avec des outils simples :
do/undo/redo
slow down/speed up
pas à pas à une localisation aléatoire
pas à pas à une localisation choisie
retour à l'état du modèle précédant la dernière modification
tracage et/ou inhibition sélective de règles ou groupes de règles
édition de nouvelles règles à partir de copies d'états locaux non reconnus
...
A ce niveau de complexité, l'édition est maladroite. Il faut accepter de procéder par essais / erreurs, c'est-à-dire, en gros, de 'pousser à la rencontre les uns des autres' les objets et les règles nouvellement créés, d'observer en détail ce qui se passe et de rééditer jusqu'à obtenir ce que l'on veut.
Les erreurs aléatoires sont difficiles à repérer car :
elles ne bloquent pas l'exécution du modèle
elles provoquent un effet imprévu et qui survient rarement
elles peuvent être indirectes (l'effet imprévu est lui-même causé par un autre effet imprévu)
Garantir qu'aucune erreur aléatoire n'est présente au sein du modèle est impossible.
Les outils les plus utiles pour les repérer sont (liste non limitative) :
Les confrontations prédictions / bilans (nombre d'objets, de situations, de transitions) (resp. meta-x)
la surveillance de l'évolution (vues 'histoire du modèle', histogrammes nombres d'objets, exécutions de règles)
les statistiques globales ou avec focus sur un object, une situation ou une règle
l'inhibition sélective de règles ou groupes de règles
la suppression transitoire d'objets ou de groupes d'objets
la soustraction d'une partie du modèle ou sa divison en branches si elle est possible
...
----------------------------
Traduction Internationalisation
----------------------------
UI : deux types exclusifs de sessions : exécution / édition (d'un modèle)
L'exécution et l'édition d'un modèle sont des opérations exclusives. Un modèle ne peut ni être édité pendant une exécution ni être exécuté pendant une édition.
Ce principe de fonctionnement pourra être remis en cause si la création de modèles capables de s'auto-éditer est envisagée, mais, d'ici là, il doit guider la première phase de développement. (nov 2021)
----------------------------
UI : deux types d'arbres des règles : par conditions et par fonctions
Les arbres des règles par conditions sont essentiellement destinés au serveur. Ils sont au coeur de la représentation des transitions dans le modèle XML.
Les arbres des règles par fonctions sont essentiellement destinés à l'utilisateur. Chaque utilisateur peut avoir le sien et en avoir plusieurs s'il le souhaite.
Un arbre des règles par fonctions peut servir à inhiber temporairement une règle ou un groupe de règles.
--------------------------
UI : permettre l'affichage d'une règle spécifique
Affichage 'complet' :
graphe 'avant' (état local avant application de la règle)
graphe 'après' (état local après application de la règle)
liste des conditions
liste des actions
Vignette : les deux graphes sous une forme 'miniature' pour faciliter les comparaisons entre règles
--------------------------
UI : afficher l'arbre de conditions
Il y a plusieurs arbres des conditions possibles.
Les arbres qui intéresseront le plus les utilisateurs seront ceux qui leurs permettront d'organiser les règles à leur convenance. voir issue : afficher l'arbre de l'utilisateur
Le plus simple de ces arbres est celui qui réunit les conditions de toutes les règles en suivant un chemin en spirale qui parcourt systématiquement tous les sites de toutes les unités de l'espace en partant de l'origine.
Ces arbres peuvent être créés suivant d'autres parcours de l'espace des règles. Par exemple, un parcours aléatoire des sites, ou commençant à mi-profondeur, ou dans une zone de densité particulière des conditions, pourrait s'avérer plus rentable que le parcours en spirale...
Toutes ces possibilités donneront des résultats variables d'un modèle à un autre et devront parfois être évaluées et comparées.
--------------------------
UI : afficher les objets des modèles
L'utilisateur a besoin :
d'une liste ou d'un arbre lui permettant d'accéder à tous les objets de son modèle
d'une (au moins) image de l'objet sur lequel il veut travailler (+ liste 'texte' des flèches)
de liens vers les autre objets-modèles qui représentent le même objet-réel
et vers le meta-objet
Même si les meta-objets sont initialement 'fabriqués à la main', il faut les prévoir (leur prévoir une place = des noms, des liens d'accès)
Il faudra les manipuler pour comprendre quelles sont les fonctions à automatiser.
--------------------------
UI : afficher les état des modèles
--------------------------
UI : graphes pour les états des modèles et le suivi/monitoring de la modélisation
--------------------------
Graphics : afficher les états des modèles
--------------------------
Réseau : communiquer avec le serveurs
--------------------------
Parsing/chargement de modèle
identity
(model identity)
parameters id="..." date="..." author="..."
(simulation & space parameters)
objects id="..." date="..." author="..."
(each object is a list of arrows)
savestates id="..." date="..." author="..."
(each savestates is a list of arrows)
conditions id="..." date="..." author="..."
(a list of conditions)
(each condition associates x, y, z, site, weight, node_id, parent)
transitions
(a list of transitions)
(each transition has a parent)
(each transition is a list of arrows)
--------------------------
UI : création d'une GUI
Fonctionnalités prévues
Deux modes de visualisation exclusifs : édition / contrôle
Plusieurs types de session :
+ évaluation de gem-graph
+ fabrication d'un modèle (pas à pas)
+ tests qualité
+ observation
+ analyse résultats
+ présentation
... (voir les issues liées)
--------------------------
Cycle de vie d'un modèle et définition de l'automate du client gem-graph.
Création d'un modèle.
essais de courte durée pour mettre en évidence les erreurs reproductibles.
les outils :
Renvoyer au client des copies des états locaux auxquels aucune règle ne s'adapte.
Tracer une règle (obtenir des informations chaque fois qu'elle est appliquée).
Déclencher une seule transition en un point choisi de l'espace global.
...
Mise au point
essais prolongés adaptés au repérage des erreurs aléatoires.
...
Confrontation à la réalité
Lorsque le modèle produit des résultats suffisament reproductibles.
Un sous-groupe Gem-graph-lab disposant d'un moteur monothread localisé dans le client (peu performant mais indépendant) devrait être spécialisé dans le dépistage des erreurs reproductibles.
Certaines fonctionnalités, indispensables à ce travail, sont, en effet, incompatibles avec le fonctionnement du moteur du serveur.
Ex (voir les issues serveur #25, #26 et #27 - liste non limitative) :
Le serveur devrait être dédié aux calculs haute performance et longue durée nécessaires à la recherche d'erreurs aléatoires puis à l'étude de l'adéquation du modèle (confronté à la réalité).
--------------------------
Représentation probabiliste des volumes.
A chaque case d'un espace peut être associée une probabilité de présence d'un volume.
Cette technique permettrait d'associer aux volumes des contours 'flous' et pourrait faciliter leurs déplacements et la représentation de leurs interactions.
Le 'remplissage' des objets par 'de la présence' permettrait de représenter des ondes de densité: ces ondes seraient générées sur un bord et, lorsqu'elles atteidraient un bord opposé, elles le déplaceraient. Un seul mécanisme représenterait ainsi les mouvements de tous les objets, quelle que soit leur forme.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-situations.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) une même 'situation-réelle' de différentes façons selon les positions ou les états des objets en situation (en interaction).
Il peut souhaiter également éditer des liens entre ces différents représentations et, éventuellement, y ajouter d'autres informations.
L'ensemble des informations concernant une même 'situation-réelle' constitue une meta-situation.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-situations.
Si, par exemple, le concepteur du modèle fait l'hypothèse que l'évolution d'une situation (réelle) est connue de façon certaine, il est inutile de simuler l'évolution de cette situation de façon détaillée. Il faut qu'il puisse simplifier cette étape. L'objectif du modèle est ailleurs.
Il est donc utile, dans ce cas, de pouvoir identifier toutes les configurations (toutes les 'situation-dessinées') qui représentent cette 'situation-réelle' et de leur appliquer la même meta-transition.
Cette fonctionnalité suppose la possibilité de créer et d'éditer des meta-situations.
Elle diffère de l'édition de meta-objets parce qu'une meta-situation associe nécessairement plusieurs objets ou meta-objets.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Réfléchir aux choix des conventions nécessaires à l'écriture des modèles. Préparer l'internationalisation.
Des conventions sont nécessaires pour pouvoir écrire des modèles de gem-graph.
Par exemple:
Les directions de l'espace seront-elles énumérés dans l'ordre x, -x, y, -y, z, -z, etc... ou dans le sens trigonométrique ou dans le sens horaire ?
Faut-il encourager ou 'déprécier' l'usage des noms des points cardinaux, des mots 'gauche', 'droite' ?
Le sens de lecture, etc...
Des décisions, conformes aux habitudes de chacun, qui peuvent sembler parfaitement adaptées et logiques à un moment du développement peuvent devenir contre-productives ultérieurement...
Pour mémoire, cette sonde qui s'est écrasée sur Mars parceque deux équipes utilisaient - pour des raisons culturelles - des unités de longueur différentes (pieds vs. mètres) et qu'il semblait évident à chacune que tout le monde faisait comme elle.
Des décisions indispensables - peu nombreuses - ont déjà été prises. De futurs utilisateurs ou contributeurs pourraient demander qu'elles soient répertoriées et justifiées.
Le but est d'être le plus simple et le plus compréhensible possible dans le plus grand nombre de contextes possible.
--------------------------
Le client gem-graph devrait fournir des outils d'extraction de graphes non géométriques et de dessins.
Des graphes non géométriques pourraient être 'extraits' de chaque état d'un gem-graph.
Ces graphes s'intéresseraient seulement aux propriétés non géométriques des gem-graphs, oubliant les propriétés liées à leurs coordonnées spatiales.
Il pourrait être utile de les comparer, de les classer et d'étudier leurs propriétés mathématiques.
Le client gem-graph devrait fournir - sous forme de modules - des outils d'extraction de tels graphes à partir de gem-graphs.
Des dessins (sans graphe associé) pourraient être 'extraits' de chaque état d'un gem-graph.
Les annotations, qui ne représentent pas les objets eux-mêmes ni les situations, seraient alors supprimées ou converties.
--------------------------
Une organisation modulaire des clients gem-graph simplifierait le traitement des clients particuliers.
Des interfaces gem-graph spécialisées devraient être créés pour traiter les modèles de certains systèmes complexes particuliers.
Liste (non exhaustive) de communautés d'utilisateurs potentiels:
biologie cellulaire,
biologie du développement,
écologie,
géographie,
climatologie,
économie,
urbanisme,
...
Une organisation modulaire du logiciel permettrait de développer séparément les interfaces dédiées à des utilisateurs particuliers (ex: accès à certaines banques de données, références, contexte,...) qui présenteraient peu d'intérêt pou les autres.
Une bibliothèque de modules spécialisés devrait être organisée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-transitions.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) un même 'objet-réel' de différentes façons selon les situations ou suivant les transitions qui s'appliquent à cet objet.
L'ensemble des informations concernant un même 'objet-réel' constitue un meta-objet.
Le concepteur peut souhaiter définir une même transition sur tout ou partie des objets (graphes connexes) d'un ou de plusieurs meta-objet(s).
Un ensemble des transitions concernant un même 'objet-réel' ou meta-objet constitue une meta-transition.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-transitions.
L'utilisation d'outils utilisant des représentations vectorielles des meta-objets devrait être encouragée lorsqu'elle est possible.
L'identification d'objets et de situations par un ensemble de conditions est une technique de 'pattern recognition' qui pourrait être optimisée par des méthodes développées en IA.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-objets.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) un même 'objet-réel' de différentes façons selon les situations ou suivant les transitions qui s'appliquent à cet objet.
Il peut donc considérer plusieurs 'objets-dessinés' (graphes connexes) comme des représentations d'un même 'objet-réel'.
Il peut souhaiter également éditer des liens entre ces différents représentations et, éventuellement, y ajouter d'autres informations.
L'ensemble des informations concernant un même 'objet-réel' constitue un meta-objet.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-objets.
La représentation vectorielle, partielle ou complète, des objets devrait être encouragée lorsqu'elle est possible.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Chaque modèle gem-graph devrait pouvoir être couplé à des modèles décrivant des ondes.
Certains phénomènes participant à des phénomènes complexes sont décrits de façon optimale par des équations continues représentant des ondes.
Chaque modèle gem-graph devrait pouvoir être couplé à de tels modèles.
Ce couplage suppose remplies toutes les conditions suivantes:
superposition des espaces et des temps des deux modèles
lecture des valeurs d'une variable d'intérêt du modèle décrivant les ondes par le modèle gem-graph au moyen de conditions spécifiques prenant en compte l'orientation, la section efficace, l'énergie, la phase,...
écriture dans le modèle continu des modifications effectuées par le modèle gem-graph au moyen d'une action ('assignment') spécifique
A la date de création de cette issue, cette technique n'a jamais été testée.
--------------------------
Chaque modèle gem-graph devrait pouvoir être couplé à des modèles décrivant des flux.
Certains phénomènes participant à des phénomènes complexes sont décrits de façon optimale par des équations continues représentant des flux.
Ces modèles utilisent des gradients de variables intensives (ex: pression, température, densité,...) pour décrire les états et calculer leurs évolutions.
Chaque modèle gem-graph devrait pouvoir être couplé à de tels modèles.
L'idée d'un couplage entre modèles de nature différente a déjà été proposée. (ref 1)
Ce couplage suppose remplies au moins toutes les conditions suivantes:
superposition des espaces et des temps des deux modèles
lecture des valeurs d'une variable d'intérêt du modèle continu par le modèle gem-graph au moyen d'une condition spécifique
écriture dans le modèle continu des modifications effectuées par le modèle gem-graph au moyen d'une action ('assignment') spécifique
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'addition de modèles.
L'addition de modèles est une propriété importante de gem-graph.
Elle permet à des concepteurs ayant produit indépendamment des modèles partiels d'un même phénomènes global de vérifier la compatibilité de leurs modèles.
Pour additionner deux modèles, il faut additionner
(1) leurs états
(2) leurs transitions
Le client gem-graph devrait fournir des outils facilitant ces opérations.
Définir des normes de compatibilité faciliterait l'addition de modèles.
--------------------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/Analyse%20client-serveurs
### gem-graph: architecture client / serveur
serveur: 3 modules principaux:
- CLI (= interface administrateur)
- Requests manager
- Scheduler
Requests manager: reçoit les demandes des utilisateurs (via un terminal ou une interface graphique) et les répartit vers des modules spécialisés:
- account creation
- begin / end a session (login, authorizations, preferences, locale, language)
- preferences (read / write file or use default)
- load / save a model (read / write model file, init [Paramètres du calcul], init measures)
- control (using a control view or a terminal)
- run / stop, slow / speed, do / undo / redo
- modification [Paramètres du calcul]
- choix des vues, de la présentation des données (forme, fréquence, alarmes)
- résultats
- raw data,
- états,
- transitions,
- fonctionnement de l'automate
- analyse (outils / AI)
- aides
- édition
- états (global, local, sélection selon objet, situation)
- règles
- arbre des règles (regroupements selon un "point de vue" utilisateur)
- facilities, support (littérature, liens, correspondants, outils de présentation,...)
Views provider: reçoit de [Requests manager] une demande spécialisée:
(ex: user identification, begin / end session, run control, résults, data analysis tools, )
(éditions (state, rules, rules tree), help, facilities, support, preferences choice)
- cherche la vue adaptée dans [Views list]
- si possible, cherche dans un fichier les preferences utilisateurs
- si possible, cherche une traduction (default sinon) [Translations]
- si possible, cherche
* des résultats dans [Tables historiques], [espace graphique],
* des paramètres du modèle [arbre des règles], [paramètres du calcul]
- transmet l'ensemble au client
Translations:
Views list:
Superviseur:
- integrity control
- data assessement
- compression
Raw data: l'utilisateur demande l'accès aux données brutes
Mesures: chacune des mesures et des calculs de ce module est effectué avec une fréquence propre
(de une par cycle à une tous les 10^n cycles)
ces fréquences sont fixées par chaque utilisateur dans [Paramètres du calcul]
des arbitrages sont à prévoir en cas de conflit:
* certaines sessions sont destinées à identifier une règle ou un état
qui cause un comportement défectueux; ce comportement est reproductible.
* d'autres à vérifier la validité / conformité d'un modèle dans la durée
- Trois types de mesures:
* paramètres de fonctionnement de l'automate (ex: profil d'utilisation des règles)
* cohérence d'un modèle (jusqu'à ce que l'automate produise un résultat attendu)
* mesures utiles à l'interprétation d'un modèle:
l'automate produit le résultat attendu;
les mesures ont pour but de montrer la pertinence du modèle.
- reçoit de Scheduler des informations sur le nombre de cycles et leurs résultats:
(succès, échec, erreur)
- mesure le temps système et calcule la durée d'exécution du cycle à chaque réception
- reçoit de chaque thread de calcul le résultat de son calcul (succès, échec, erreur)
et, le cas échéant, le n° de la règle qui s'est appliquée.
- peut lire l'[espace graphique]
- met à jour les [Tables historiques]: opérations, objets simples, objets complexes.
d'après l'application des règles
ces mesures sont à confronter aux mesures réalisées à partir de l'[espace graphique]
- parcours systématique de la totalité de l'[espace graphique]
+ comparaison aux [Types du modèle] (lecture seule)
> objectif: dénombrement des objets de chaque type contenus dans l'[espace graphique]
- comparaison du nombre d'objets théoriquement produits par application des règles
au nombre d'objets effectivement présents dans l'[espace graphique]
+ reconnaissance d'éventuels objets non répertoriés, d'états cahotiques, etc... (méta-règles).
Cette mesure est coûteuse en temps de calcul mais elle permet de dépister les cas
où une règle s'applique à une situation pour laquelle elle n'avait pas été conçue.
Paramètres du calcul:
- fréquences des mesures
- inhibition d'une partie des règles
Tables historiques:
- opérations réalisée (transformations / transports / mouvements)
- objets de chaque type simple présents dans l'[espace graphique]
nombre calculé d'après l'application des règles
- nombres d' objets complexes créés / détruits
les objets complexes (ex: compartiment) sont prédéfinis dans [Types du modèle]
Types du modèle:
- liste les objets décrits par les règles (qui peuvent être présents dans l'[espace graphique])
- liste des objets composés ou topologiquement complexes prédéfinis (ex: compartiments)
- liste les transformations / transports / mouvements potentiels (décrits par les règles)
Scheduler: une boucle sans fin comportant 4 étapes:
- écoute CLI et Users Interface (qui peuvent interrompre le calcul ou en modifier la vitesse)
- transmet au module Mesures des informations:
nombre de cycles et résultat de chacun (succès, échec, erreur)
- cherche si un calcul local peut être entrepris (en un temps fini)
- cherche si un calcul local peut être achevé (en un temps fini)
* pour savoir si un calcul local peut être entrepris:
- lit [arrows list] <> tire une flèche au hasard
- lit [espace de préemption] <> l'espace où ce trouve cette flèche peut-il être calculé ?
- si oui, alors:
- tenter de le préempter (lit / écrit) (périphérique versus volumétrique ?)
- si la préemption a réussi, alors créer un thread de calcul à cet endroit
(lit / écrit dans la [liste des threads])
* pour savoir si un calcul local peut être achevé:
- lit la [liste des threads] <> un thread a-t-il fini son calcul (et écrit ses données) ?
- si oui, alors:
- le sortir de la [liste des threads] (écriture)
- lever la préemption (écriture dans l'[espace de préemption])
-----------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/architecture.md
Gem-graph Architecture
Le serveur est la partie dont l'exécution est rythmée par le calcul du modèle.
(Le client est la partie dont l'exécution est rythmée par l'utilisateur)
Le serveur comporte:
- l'interface cli (command line interface) qui gère le serveur sur la machine où il est exécuté, ou à distance via le client (prévoir les traductions, la gestion du vocabulaire)
- le scheduler qui coordonne le calcul du modèle en initiant et terminant le superviseur et les threads de calcul
- le superviseur qui:
- maintient l'historique et effectue des mesures
- effectue un test d'intégrité et renvoie son résultat au scheduler (pour détecter des états chaotiques, boucles infinies, répartitions déséquilibrées entre threads de calcul,...)
- les threads de calcul
----------------------------
--------------------------
--------------------------

View File

@ -1,740 +0,0 @@
2022-06-03 10h00
_____________________________________________________________
| |
| 740 lines 5015 mots 29314 car 37682 octets |
|____________________________________________________________|
Le client est la partie dont l'exécution est rythmée par l'utilisateur.
Il peut fonctionner en mode "client seul" ou en mode "client / serveur".
Certaines de ses fonctionnalités sont communes aux deux modes.
Quel que soit le mode, édition et exécution doivent être disjointes (sessions indépendantes)
En mode "client seul", le client travaille indépendemment du serveur.
Il opère sur des modèles locaux:
Ses fonctions sont:
- lectures/écritures de ces modèles dans une base de données locale
- édition/vérification/validation (règles de transition/états/arbres de règles)
- exécutions locales
- sans optimisation ni recherche de performances
- sous contrainte de compatibilité avec les spécifications du serveur
- additions de modèles
Fonctionnalités communes aux modes "client seul" et "client / serveur"
- visualisation des données
- traductions, gestion du vocabulaire
- outils de mesure
- états du modèle,
- histoire, - validité des règles,
- performances
- aides à l'interprétation
- édition d'aides
- le contexte théorique, la bibliographie
- principes / justifications / limites du modèle
- outils de présentation (textes, vues, liens)
- modèles, interprétations
- licence, droits, auteurs, informations pratiques
En mode "client / serveur", le client travaille connecté au serveur.
Il peut
- proposer au serveur des modèles locaux ou
- opèrer sur des modèles de la base de données du serveur.
Ses fonctions sont:
- les entrées / sorties / contrôles d'erreurs associés
- demande / initialisation / terminaison du calcul (dialogues client/serveur)
- le contrôle par l'utilisateur du déroulement du calcul effectué par le serveur
- interface serveur > user (quel est l'état du modèle ? comment fonctionne l'automate ?)
- user > interface serveur (stop, slow / speed, undo / redo, modify the nb of threads or the algorithm...)
- la gestion des vues (conformité à une view_type)
Contraintes communes au client et au serveur
recherche de performance.
Le nombre de calculs pouvant être effectués en parallèle dépend :
- du rapport entre l'étendue de l'espace local et celui de l'espace global
- du temps de parcours moyen des règles, si l'on néglige:
- les opérations d'initiation et de terminaison des threads de calcul et
- les opérations de communication de la boucle principale avec son environnement.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Thread de calcul:
- initialisé avec adresse + orientation dans l'[espace graphique]
- boucle for qui suit le même trajet dans cet espace et dans l'[arbre des règles]
et compare, à chaque étape, l'état de l'espace à la condition de l'arbre correspondante
si la condition est satisfaite (l'état de l'espace est conforme à la règle)
alors continuer le chemin
sinon return (aucune règle ne s'applique)
les choses sont un peu plus compliquées à cause des 'branches neutres':
si la règle ne pose pas de condition sur un état de l'espace rencontré,
alors, plusieurs règles pourraient convenir: il faut aller voir au delà et revenir;
les variables nécessaires pour mener à bien ces explorations sont toutes locales.
- en cas de succès,
* écrit les opérations prescrites par la règle dans l'[espace graphique]
* écrit les additions / délétions dans [arrows list]
* indique à Mesures le n° de la règle qui s'applique
- dans tous les cas (succès, échec, erreur), indique à Mesures le résultat du cycle.
l'[arbre des règles] est seulement lu.
espace graphique
arbre des règles
arrows list
* Users interface agit sur les paramètres du calcul:
- on / off, vitesse,
- fréquence des mesures, (transmis au module Mesures)
- fréquence de transmission des résultats (transmis au module Superviseur)
--------------------------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/Cahier%20des%20charges%20client
deux modes de communication:
-. commandes en ligne via un terminal et 'raw data' (données non formatées) ou
-. interface graphique
Note : l'interface ligne de commande doit intercepter les demandes des utilisateurs et les déléguer a des threads ou processus dédiés
deux types de sessions:
-. fabrication (repérage et correction des erreurs) ou
-. interprétation (quelle part de la réalité ce modèle ce modèle représente-t-il ?)
liste des vues et des fonctions auxquelles elles donnent accès:
-. run
-. run, stop
-. speed, slow
-. pas à pas: montre l'état local et la règle sélectionnée, avant et après application
-. do, undo, redo (en continu +/- rapide ou pas à pas)
-. état global
-. défilement,
-. zoom,
-. sélection (objets, tags,...),
-. filtres apparence (links, tiles),
-. recherches
-. état local
-. extraction de l'état global,
-. filtres apparence (links, tiles),
-. édition,
-. copie (en vue d'une édition d'une règle)
-. règles
-. images état local (avant, après),
-. identité (nom, chemin),
-. listes (avec filtres, tris) (conditions, actions, commentaires)
-. texte complet (format XML, texte,...)
-. vignettes (lien vers la règle)
-. activation / inhibition
-. mesures d'activité
-. tracking
-. édition de règles
-. à partir d'une copie d'un état local,
-. à partir de structures extraites de bases de données
-. de novo
-. étude du domaine d'application de la règle (essais d'application à d'autres situations)
-. activité des règles ('rules account')
-. filtres (sélection de groupes de règles àpartir d'arbres utilisateurs)
-. liens vers les vignettes,
-. activation / inhibition
-. mesures d'activité
-. tracking
-. transformations
-. activation / inhibition,
-. mesures d'activité
-. tracking
-. arbre des conditions
-. complet,
-. condensé (les noeuds sans bifurcations sont supprimés),
-. édition manuelle ?
-. filtre branches neutres,
-. activation / inhibition,
-. mesures d'activité
-. tracking
-. liens vers les vignettes
-. arbres utilisateurs
-. édition
-. mesures d'activité
-. tracking
-. liens vers les vignettes
-. histoire
-. concentrations,
-. transformations,...
-. filtres objets, ensembles d'objets, transformations,...
-. durées de vie des objets ('lifespans')
-. filtres objets, ensembles d'objets
-. espace de phases
-. axes objets / axes transformations / mixtes ?
-. corrélations
-. entre objets, transformations, les deux ?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Fichiers de profils et de sessions
Chaque utilisateur de gem-graph peut travailler sur différents modèles gem-graph et peut, ou non, faire appel aux serveurs gem-graph.
Dans chaque situation, il peut avoir ses propres préférences (langage, apparences, aides, contexte, correspondants, etc...).
Une session gem-graph est une exécution (une instance) du client gem-graph.
Une session est, le plus souvent, exécutée à propos d'un modèle.
Durant cette session, l'utilisateur peut ou non être connecté à un serveur gem-graph.
Les données gem-graph sont donc de différents types (et stockées dans différents fichiers) selon qu'elles sont relatives à :
Un utilisateur. Celui-ci peut vouloir éditer ses préférences-client sans travailler sur un modèle. A chaque utilisateur est associé un fichier préférences-client.
Un utilisateur travaillant sur un modèle. A chaque paire modèle-client est associée un fichier session.
Un utilisateur établissant une connexion avec un serveur. Chaque utilisateur est identifié dans une base de données utilisateurs et modèles accédée uniquement par les serveurs.
Un serveur travaillant (à la demande d'un client) sur un modèle. A chaque modèle vu par un serveur est associé un fichier modèle.
Un administrateur de serveur (fichier journal, base de données utilisateurs et modèles, base de données serveurs)
Une session gem-graph commence donc par la lecture d'un fichier préférences-client et se termine par son enregistrement.
Il existe autant de fichiers préférences-client que de clients.
Si l'utilisateur veut travailler sur un modèle, il doit charger ou créer un fichier session. Ce fichier décrit un modèle vu par un client.
Il existe autant de fichiers session-modèle-client que de paires (tuples) utilisateur-modèle.
En fin de session, les modifications du modèle sont enregistrées dans ce fichier session-modèle-client.
Si l'utilisateur veut faire tourner un modèle sur un serveur, il doit d'abord demander un accès à un serveur.
Cet accès utilise des données de la base de données utilisateurs et modèles.
Il doit, après s'être identifié, choisir le modèle qu'il veut faire tourner.
Il peut s'agir d'un modèle déjà répertorié dans la base de données, d'un modèle modifié ou d'un nouveau modèle.
Tout modèle, quel que soit son statut, est enregistré dans la base de données utilisateurs et modèles.
Opérations traitées par un client gem-graph:
édition d'un modèle en cours
comparaisons, fusion de modèles (complètes ou partielles), recombinaisons...
-----------------------------------
Accès aux données : le cas des modèles ayant un espace global dont la taille est invariante.
Pour représenter un espace de taille fixe dans le client, un tableau de tous les sites dans toutes les cellules faciliterait les accès.
Un module en C (avec get / set) permettrait d'optimiser (dans un second temps) ce cas particulier mais fréquent.
----------------------------------
UI : détection des erreurs reproductibles et aléatoires lors de la fabrication d'un modèle.
Ces deux types d'erreurs sont repérables par des techniques différentes faisant appel à des outils parfois communs, parfois différents.
Cette issue a pour but de lister ces outils afin de faciliter le design du client.
Il va probablement falloir un sous-groupe Gem-graph-lab spécialisé dans le dépistage des erreurs reproductibles et disposant d'un moteur monothread (lent mais indépendant) pour traiter des demandes incompatibles avec les performances demandées au serveur (voir les issues serveur #25, #26 et #27, trop contraignantes pour le serveur).
Le serveur devrait être dédié aux calculs haute performance nécessaires à la recherche d'erreurs aléatoires puis à l'étude des résultats des modèles (leur confrontation à la réalité).
Voir aussi liste des outils dans le cahier des charges : https://git.a-lec.org/gem-graph/gem-graph/-/blob/38e5c855e90d08fa5c6bddba7de5f7e4151b5149/Cahier%20des%20charges
Les erreurs reproductibles (systématiques) sont facilement repérables car elles bloquent rapidement l'exécution du modèle en générant un état cahotique ou, au minimum, non conforme à des critères facilement définissables. Ces critères peuvent porter sur la structure de l'état global (présence ou absence de tel type d'objet ou variation du nombre d'objets de tel type au dela d'un seuil, etc....) ou sur la fréquence d'exécution d'un règle ou d'un groupe de règles.
Ces erreurs peuvent (liste non limitative) :
bloquer complètement l'exécution d'une règle
survenir à chaque exécution d'une règle
survenir toujours dans la même situation ou en présence du même objet
effectuer une modification facilement identifiable
...
Elles surviennent fréquemment lors de la création des modèles.
Elles sont facilement identifiées et corrigées avec des outils simples :
do/undo/redo
slow down/speed up
pas à pas à une localisation aléatoire
pas à pas à une localisation choisie
retour à l'état du modèle précédant la dernière modification
tracage et/ou inhibition sélective de règles ou groupes de règles
édition de nouvelles règles à partir de copies d'états locaux non reconnus
...
A ce niveau de complexité, l'édition est maladroite. Il faut accepter de procéder par essais / erreurs, c'est-à-dire, en gros, de 'pousser à la rencontre les uns des autres' les objets et les règles nouvellement créés, d'observer en détail ce qui se passe et de rééditer jusqu'à obtenir ce que l'on veut.
Les erreurs aléatoires sont difficiles à repérer car :
elles ne bloquent pas l'exécution du modèle
elles provoquent un effet imprévu et qui survient rarement
elles peuvent être indirectes (l'effet imprévu est lui-même causé par un autre effet imprévu)
Garantir qu'aucune erreur aléatoire n'est présente au sein du modèle est impossible.
Les outils les plus utiles pour les repérer sont (liste non limitative) :
Les confrontations prédictions / bilans (nombre d'objets, de situations, de transitions) (resp. meta-x)
la surveillance de l'évolution (vues 'histoire du modèle', histogrammes nombres d'objets, exécutions de règles)
les statistiques globales ou avec focus sur un object, une situation ou une règle
l'inhibition sélective de règles ou groupes de règles
la suppression transitoire d'objets ou de groupes d'objets
la soustraction d'une partie du modèle ou sa divison en branches si elle est possible
...
----------------------------
Traduction Internationalisation
----------------------------
UI : deux types exclusifs de sessions : exécution / édition (d'un modèle)
L'exécution et l'édition d'un modèle sont des opérations exclusives. Un modèle ne peut ni être édité pendant une exécution ni être exécuté pendant une édition.
Ce principe de fonctionnement pourra être remis en cause si la création de modèles capables de s'auto-éditer est envisagée, mais, d'ici là, il doit guider la première phase de développement. (nov 2021)
----------------------------
UI : deux types d'arbres des règles : par conditions et par fonctions
Les arbres des règles par conditions sont essentiellement destinés au serveur. Ils sont au coeur de la représentation des transitions dans le modèle XML.
Les arbres des règles par fonctions sont essentiellement destinés à l'utilisateur. Chaque utilisateur peut avoir le sien et en avoir plusieurs s'il le souhaite.
Un arbre des règles par fonctions peut servir à inhiber temporairement une règle ou un groupe de règles.
--------------------------
UI : permettre l'affichage d'une règle spécifique
Affichage 'complet' :
graphe 'avant' (état local avant application de la règle)
graphe 'après' (état local après application de la règle)
liste des conditions
liste des actions
Vignette : les deux graphes sous une forme 'miniature' pour faciliter les comparaisons entre règles
--------------------------
UI : afficher l'arbre de conditions
Il y a plusieurs arbres des conditions possibles.
Les arbres qui intéresseront le plus les utilisateurs seront ceux qui leurs permettront d'organiser les règles à leur convenance. voir issue : afficher l'arbre de l'utilisateur
Le plus simple de ces arbres est celui qui réunit les conditions de toutes les règles en suivant un chemin en spirale qui parcourt systématiquement tous les sites de toutes les unités de l'espace en partant de l'origine.
Ces arbres peuvent être créés suivant d'autres parcours de l'espace des règles. Par exemple, un parcours aléatoire des sites, ou commençant à mi-profondeur, ou dans une zone de densité particulière des conditions, pourrait s'avérer plus rentable que le parcours en spirale...
Toutes ces possibilités donneront des résultats variables d'un modèle à un autre et devront parfois être évaluées et comparées.
--------------------------
UI : afficher les objets des modèles
L'utilisateur a besoin :
d'une liste ou d'un arbre lui permettant d'accéder à tous les objets de son modèle
d'une (au moins) image de l'objet sur lequel il veut travailler (+ liste 'texte' des flèches)
de liens vers les autre objets-modèles qui représentent le même objet-réel
et vers le meta-objet
Même si les meta-objets sont initialement 'fabriqués à la main', il faut les prévoir (leur prévoir une place = des noms, des liens d'accès)
Il faudra les manipuler pour comprendre quelles sont les fonctions à automatiser.
--------------------------
UI : afficher les état des modèles
--------------------------
UI : graphes pour les états des modèles et le suivi/monitoring de la modélisation
--------------------------
Graphics : afficher les états des modèles
--------------------------
Réseau : communiquer avec le serveurs
--------------------------
Parsing/chargement de modèle
identity
(model identity)
parameters id="..." date="..." author="..."
(simulation & space parameters)
objects id="..." date="..." author="..."
(each object is a list of arrows)
savestates id="..." date="..." author="..."
(each savestates is a list of arrows)
conditions id="..." date="..." author="..."
(a list of conditions)
(each condition associates x, y, z, site, weight, node_id, parent)
transitions
(a list of transitions)
(each transition has a parent)
(each transition is a list of arrows)
--------------------------
UI : création d'une GUI
Fonctionnalités prévues
Deux modes de visualisation exclusifs : édition / contrôle
Plusieurs types de session :
+ évaluation de gem-graph
+ fabrication d'un modèle (pas à pas)
+ tests qualité
+ observation
+ analyse résultats
+ présentation
... (voir les issues liées)
--------------------------
Cycle de vie d'un modèle et définition de l'automate du client gem-graph.
Création d'un modèle.
essais de courte durée pour mettre en évidence les erreurs reproductibles.
les outils :
Renvoyer au client des copies des états locaux auxquels aucune règle ne s'adapte.
Tracer une règle (obtenir des informations chaque fois qu'elle est appliquée).
Déclencher une seule transition en un point choisi de l'espace global.
...
Mise au point
essais prolongés adaptés au repérage des erreurs aléatoires.
...
Confrontation à la réalité
Lorsque le modèle produit des résultats suffisament reproductibles.
Un sous-groupe Gem-graph-lab disposant d'un moteur monothread localisé dans le client (peu performant mais indépendant) devrait être spécialisé dans le dépistage des erreurs reproductibles.
Certaines fonctionnalités, indispensables à ce travail, sont, en effet, incompatibles avec le fonctionnement du moteur du serveur.
Ex (voir les issues serveur #25, #26 et #27 - liste non limitative) :
Le serveur devrait être dédié aux calculs haute performance et longue durée nécessaires à la recherche d'erreurs aléatoires puis à l'étude de l'adéquation du modèle (confronté à la réalité).
--------------------------
Représentation probabiliste des volumes.
A chaque case d'un espace peut être associée une probabilité de présence d'un volume.
Cette technique permettrait d'associer aux volumes des contours 'flous' et pourrait faciliter leurs déplacements et la représentation de leurs interactions.
Le 'remplissage' des objets par 'de la présence' permettrait de représenter des ondes de densité: ces ondes seraient générées sur un bord et, lorsqu'elles atteidraient un bord opposé, elles le déplaceraient. Un seul mécanisme représenterait ainsi les mouvements de tous les objets, quelle que soit leur forme.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-situations.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) une même 'situation-réelle' de différentes façons selon les positions ou les états des objets en situation (en interaction).
Il peut souhaiter également éditer des liens entre ces différents représentations et, éventuellement, y ajouter d'autres informations.
L'ensemble des informations concernant une même 'situation-réelle' constitue une meta-situation.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-situations.
Si, par exemple, le concepteur du modèle fait l'hypothèse que l'évolution d'une situation (réelle) est connue de façon certaine, il est inutile de simuler l'évolution de cette situation de façon détaillée. Il faut qu'il puisse simplifier cette étape. L'objectif du modèle est ailleurs.
Il est donc utile, dans ce cas, de pouvoir identifier toutes les configurations (toutes les 'situation-dessinées') qui représentent cette 'situation-réelle' et de leur appliquer la même meta-transition.
Cette fonctionnalité suppose la possibilité de créer et d'éditer des meta-situations.
Elle diffère de l'édition de meta-objets parce qu'une meta-situation associe nécessairement plusieurs objets ou meta-objets.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Réfléchir aux choix des conventions nécessaires à l'écriture des modèles. Préparer l'internationalisation.
Des conventions sont nécessaires pour pouvoir écrire des modèles de gem-graph.
Par exemple:
Les directions de l'espace seront-elles énumérés dans l'ordre x, -x, y, -y, z, -z, etc... ou dans le sens trigonométrique ou dans le sens horaire ?
Faut-il encourager ou 'déprécier' l'usage des noms des points cardinaux, des mots 'gauche', 'droite' ?
Le sens de lecture, etc...
Des décisions, conformes aux habitudes de chacun, qui peuvent sembler parfaitement adaptées et logiques à un moment du développement peuvent devenir contre-productives ultérieurement...
Pour mémoire, cette sonde qui s'est écrasée sur Mars parceque deux équipes utilisaient - pour des raisons culturelles - des unités de longueur différentes (pieds vs. mètres) et qu'il semblait évident à chacune que tout le monde faisait comme elle.
Des décisions indispensables - peu nombreuses - ont déjà été prises. De futurs utilisateurs ou contributeurs pourraient demander qu'elles soient répertoriées et justifiées.
Le but est d'être le plus simple et le plus compréhensible possible dans le plus grand nombre de contextes possible.
--------------------------
Le client gem-graph devrait fournir des outils d'extraction de graphes non géométriques et de dessins.
Des graphes non géométriques pourraient être 'extraits' de chaque état d'un gem-graph.
Ces graphes s'intéresseraient seulement aux propriétés non géométriques des gem-graphs, oubliant les propriétés liées à leurs coordonnées spatiales.
Il pourrait être utile de les comparer, de les classer et d'étudier leurs propriétés mathématiques.
Le client gem-graph devrait fournir - sous forme de modules - des outils d'extraction de tels graphes à partir de gem-graphs.
Des dessins (sans graphe associé) pourraient être 'extraits' de chaque état d'un gem-graph.
Les annotations, qui ne représentent pas les objets eux-mêmes ni les situations, seraient alors supprimées ou converties.
--------------------------
Une organisation modulaire des clients gem-graph simplifierait le traitement des clients particuliers.
Des interfaces gem-graph spécialisées devraient être créés pour traiter les modèles de certains systèmes complexes particuliers.
Liste (non exhaustive) de communautés d'utilisateurs potentiels:
biologie cellulaire,
biologie du développement,
écologie,
géographie,
climatologie,
économie,
urbanisme,
...
Une organisation modulaire du logiciel permettrait de développer séparément les interfaces dédiées à des utilisateurs particuliers (ex: accès à certaines banques de données, références, contexte,...) qui présenteraient peu d'intérêt pou les autres.
Une bibliothèque de modules spécialisés devrait être organisée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-transitions.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) un même 'objet-réel' de différentes façons selon les situations ou suivant les transitions qui s'appliquent à cet objet.
L'ensemble des informations concernant un même 'objet-réel' constitue un meta-objet.
Le concepteur peut souhaiter définir une même transition sur tout ou partie des objets (graphes connexes) d'un ou de plusieurs meta-objet(s).
Un ensemble des transitions concernant un même 'objet-réel' ou meta-objet constitue une meta-transition.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-transitions.
L'utilisation d'outils utilisant des représentations vectorielles des meta-objets devrait être encouragée lorsqu'elle est possible.
L'identification d'objets et de situations par un ensemble de conditions est une technique de 'pattern recognition' qui pourrait être optimisée par des méthodes développées en IA.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-objets.
Le concepteur d'un modèle peut souhaiter représenter (dessiner) un même 'objet-réel' de différentes façons selon les situations ou suivant les transitions qui s'appliquent à cet objet.
Il peut donc considérer plusieurs 'objets-dessinés' (graphes connexes) comme des représentations d'un même 'objet-réel'.
Il peut souhaiter également éditer des liens entre ces différents représentations et, éventuellement, y ajouter d'autres informations.
L'ensemble des informations concernant un même 'objet-réel' constitue un meta-objet.
Le client gem-graph devrait fournir des outils facilitant l'édition de meta-objets.
La représentation vectorielle, partielle ou complète, des objets devrait être encouragée lorsqu'elle est possible.
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Chaque modèle gem-graph devrait pouvoir être couplé à des modèles décrivant des ondes.
Certains phénomènes participant à des phénomènes complexes sont décrits de façon optimale par des équations continues représentant des ondes.
Chaque modèle gem-graph devrait pouvoir être couplé à de tels modèles.
Ce couplage suppose remplies toutes les conditions suivantes:
superposition des espaces et des temps des deux modèles
lecture des valeurs d'une variable d'intérêt du modèle décrivant les ondes par le modèle gem-graph au moyen de conditions spécifiques prenant en compte l'orientation, la section efficace, l'énergie, la phase,...
écriture dans le modèle continu des modifications effectuées par le modèle gem-graph au moyen d'une action ('assignment') spécifique
A la date de création de cette issue, cette technique n'a jamais été testée.
--------------------------
Chaque modèle gem-graph devrait pouvoir être couplé à des modèles décrivant des flux.
Certains phénomènes participant à des phénomènes complexes sont décrits de façon optimale par des équations continues représentant des flux.
Ces modèles utilisent des gradients de variables intensives (ex: pression, température, densité,...) pour décrire les états et calculer leurs évolutions.
Chaque modèle gem-graph devrait pouvoir être couplé à de tels modèles.
L'idée d'un couplage entre modèles de nature différente a déjà été proposée. (ref 1)
Ce couplage suppose remplies au moins toutes les conditions suivantes:
superposition des espaces et des temps des deux modèles
lecture des valeurs d'une variable d'intérêt du modèle continu par le modèle gem-graph au moyen d'une condition spécifique
écriture dans le modèle continu des modifications effectuées par le modèle gem-graph au moyen d'une action ('assignment') spécifique
A la date de création de cette issue (nov 2021), cette technique n'a jamais été testée.
--------------------------
Le client gem-graph devrait fournir des outils facilitant l'addition de modèles.
L'addition de modèles est une propriété importante de gem-graph.
Elle permet à des concepteurs ayant produit indépendamment des modèles partiels d'un même phénomènes global de vérifier la compatibilité de leurs modèles.
Pour additionner deux modèles, il faut additionner
(1) leurs états
(2) leurs transitions
Le client gem-graph devrait fournir des outils facilitant ces opérations.
Définir des normes de compatibilité faciliterait l'addition de modèles.
--------------------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/Analyse%20client-serveurs
### gem-graph: architecture client / serveur
serveur: 3 modules principaux:
- CLI (= interface administrateur)
- Requests manager
- Scheduler
Requests manager: reçoit les demandes des utilisateurs (via un terminal ou une interface graphique) et les répartit vers des modules spécialisés:
- account creation
- begin / end a session (login, authorizations, preferences, locale, language)
- preferences (read / write file or use default)
- load / save a model (read / write model file, init [Paramètres du calcul], init measures)
- control (using a control view or a terminal)
- run / stop, slow / speed, do / undo / redo
- modification [Paramètres du calcul]
- choix des vues, de la présentation des données (forme, fréquence, alarmes)
- résultats
- raw data,
- états,
- transitions,
- fonctionnement de l'automate
- analyse (outils / AI)
- aides
- édition
- états (global, local, sélection selon objet, situation)
- règles
- arbre des règles (regroupements selon un "point de vue" utilisateur)
- facilities, support (littérature, liens, correspondants, outils de présentation,...)
Views provider: reçoit de [Requests manager] une demande spécialisée:
(ex: user identification, begin / end session, run control, résults, data analysis tools, )
(éditions (state, rules, rules tree), help, facilities, support, preferences choice)
- cherche la vue adaptée dans [Views list]
- si possible, cherche dans un fichier les preferences utilisateurs
- si possible, cherche une traduction (default sinon) [Translations]
- si possible, cherche
* des résultats dans [Tables historiques], [espace graphique],
* des paramètres du modèle [arbre des règles], [paramètres du calcul]
- transmet l'ensemble au client
Translations:
Views list:
Superviseur:
- integrity control
- data assessement
- compression
Raw data: l'utilisateur demande l'accès aux données brutes
Mesures: chacune des mesures et des calculs de ce module est effectué avec une fréquence propre
(de une par cycle à une tous les 10^n cycles)
ces fréquences sont fixées par chaque utilisateur dans [Paramètres du calcul]
des arbitrages sont à prévoir en cas de conflit:
* certaines sessions sont destinées à identifier une règle ou un état
qui cause un comportement défectueux; ce comportement est reproductible.
* d'autres à vérifier la validité / conformité d'un modèle dans la durée
- Trois types de mesures:
* paramètres de fonctionnement de l'automate (ex: profil d'utilisation des règles)
* cohérence d'un modèle (jusqu'à ce que l'automate produise un résultat attendu)
* mesures utiles à l'interprétation d'un modèle:
l'automate produit le résultat attendu;
les mesures ont pour but de montrer la pertinence du modèle.
- reçoit de Scheduler des informations sur le nombre de cycles et leurs résultats:
(succès, échec, erreur)
- mesure le temps système et calcule la durée d'exécution du cycle à chaque réception
- reçoit de chaque thread de calcul le résultat de son calcul (succès, échec, erreur)
et, le cas échéant, le n° de la règle qui s'est appliquée.
- peut lire l'[espace graphique]
- met à jour les [Tables historiques]: opérations, objets simples, objets complexes.
d'après l'application des règles
ces mesures sont à confronter aux mesures réalisées à partir de l'[espace graphique]
- parcours systématique de la totalité de l'[espace graphique]
+ comparaison aux [Types du modèle] (lecture seule)
> objectif: dénombrement des objets de chaque type contenus dans l'[espace graphique]
- comparaison du nombre d'objets théoriquement produits par application des règles
au nombre d'objets effectivement présents dans l'[espace graphique]
+ reconnaissance d'éventuels objets non répertoriés, d'états cahotiques, etc... (méta-règles).
Cette mesure est coûteuse en temps de calcul mais elle permet de dépister les cas
où une règle s'applique à une situation pour laquelle elle n'avait pas été conçue.
Paramètres du calcul:
- fréquences des mesures
- inhibition d'une partie des règles
Tables historiques:
- opérations réalisée (transformations / transports / mouvements)
- objets de chaque type simple présents dans l'[espace graphique]
nombre calculé d'après l'application des règles
- nombres d' objets complexes créés / détruits
les objets complexes (ex: compartiment) sont prédéfinis dans [Types du modèle]
Types du modèle:
- liste les objets décrits par les règles (qui peuvent être présents dans l'[espace graphique])
- liste des objets composés ou topologiquement complexes prédéfinis (ex: compartiments)
- liste les transformations / transports / mouvements potentiels (décrits par les règles)
Scheduler: une boucle sans fin comportant 4 étapes:
- écoute CLI et Users Interface (qui peuvent interrompre le calcul ou en modifier la vitesse)
- transmet au module Mesures des informations:
nombre de cycles et résultat de chacun (succès, échec, erreur)
- cherche si un calcul local peut être entrepris (en un temps fini)
- cherche si un calcul local peut être achevé (en un temps fini)
* pour savoir si un calcul local peut être entrepris:
- lit [arrows list] <> tire une flèche au hasard
- lit [espace de préemption] <> l'espace où ce trouve cette flèche peut-il être calculé ?
- si oui, alors:
- tenter de le préempter (lit / écrit) (périphérique versus volumétrique ?)
- si la préemption a réussi, alors créer un thread de calcul à cet endroit
(lit / écrit dans la [liste des threads])
* pour savoir si un calcul local peut être achevé:
- lit la [liste des threads] <> un thread a-t-il fini son calcul (et écrit ses données) ?
- si oui, alors:
- le sortir de la [liste des threads] (écriture)
- lever la préemption (écriture dans l'[espace de préemption])
-----------------
https://git.a-lec.org/gem-graph/gem-graph/-/blob/master/architecture.md
Gem-graph Architecture
Le serveur est la partie dont l'exécution est rythmée par le calcul du modèle.
(Le client est la partie dont l'exécution est rythmée par l'utilisateur)
Le serveur comporte:
- l'interface cli (command line interface) qui gère le serveur sur la machine où il est exécuté, ou à distance via le client (prévoir les traductions, la gestion du vocabulaire)
- le scheduler qui coordonne le calcul du modèle en initiant et terminant le superviseur et les threads de calcul
- le superviseur qui:
- maintient l'historique et effectue des mesures
- effectue un test d'intégrité et renvoie son résultat au scheduler (pour détecter des états chaotiques, boucles infinies, répartitions déséquilibrées entre threads de calcul,...)
- les threads de calcul
----------------------------
--------------------------
--------------------------

View File

@ -1,121 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gem-graph-model version="0.2.1">
<identity>
<name>Chrysalide</name>
<owner>Léontine qui patine</owner>
<owner_id>2</owner_id>
<date>1630000000</date>
<version>1.0</version>
<g_ref id="diff" date="1630000000" author="Léontine" lang="en">Qui ça ?'</g_ref>
</identity>
<parameters id="texte" date="0" author="Léontine qui trottine.">
<simulation>
<max_thread>0</max_thread>
<max_cycles>9</max_cycles>
</simulation>
<space-param>
<!-- loop_on_zero="true" anything moved before zero reenters at the end of space-->
<!-- loop_on_zero="false" anything moved before zero is lost-->
<!-- loop_on_max="true" anything moved beyond max reenters at the zero of space-->
<!-- loop_on_max="false" anything moved beyond max is lost-->
<dimension x="20"/>
<!-- Site_multiplicity = number of sites in a space unit. -->
<!-- Each site points towards a neighbouring space unit. -->
<!-- Several arrows can be stacked in the same site. -->
<site_multiplicity>3</site_multiplicity>
</space-param>
</parameters>
<!-- Model objects definition -->
<objects id="only dimers in this model" date="1630000000" author="inanimés,... âme ?">
<object id="a dimer" date="1630000000" author="Alphonse">
<arrow site="1" weight="1" x="0"/>
<arrow site="2" weight="1" x="1"/>
</object>
</objects>
<!-- Saved space description (initial space is sequence 0) -->
<states id="texte" date="1630000000" author="Here, states are spaces.">
<space id="initial" date="1630000000" author="Une souris verte,">
<arrow site="0" weight="6" x="0"/>
<arrow site="1" weight="1" x="0"/>
<arrow site="2" weight="7" x="1"/>
<arrow site="1" weight="3" x="6"/>
<arrow site="2" weight="1" x="7"/>
<arrow site="1" weight="4" x="14"/>
<arrow site="0" weight="8" x="14"/>
<arrow site="2" weight="5" x="15"/>
<arrow site="1" weight="2" x="17"/>
<arrow site="2" weight="7" x="18"/>
<arrow site="2" weight="9" x="20"/>
<arrow site="0" weight="4" x="20"/>
</space>
</states>
<!-- Model transitions definition (rules) -->
<!-- In this version : <xs:sequence minOccurs="0" maxOccurs="unbounded">-->
<!-- Transitions should be edited by hand and written in a 'human-readable' format -->
<conditions id="random walk of dimers" date="1630000000" author="Zazard le lézard !">
<condition site="1" weight="1" node_id="1" parent="0" x="0"/>
<condition site="2" weight="1" node_id="2" parent="1" x="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at atation (0,1). -->
<condition site="1" weight="0" node_id="3" parent="2" x="2"/>
<!-- as soon as condition 3 is satisfied,
the neighbouring space unhit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. -->
<condition site="2" weight="0" node_id="4" parent="2" x="-1"/>
<!-- as soon as condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. -->
</conditions>
<transitions>
<transition id="move_a_dimer_to_east" date="1630000000" author="Pas moi..."
parent="3" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="1" weight="1" x="1"/>
<arrow site="2" weight="1" x="2"/>
</transition>
<transition id="move_a_dimer_to_west" date="1630000000" author="Ni moi !"
parent="4" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
</transitions>
</gem-graph-model>

View File

@ -80,15 +80,15 @@
<condition site="1" weight="1" node_id="1" parent="0" x="0"/> <condition site="1" weight="1" node_id="1" parent="0" x="0"/>
<condition site="2" weight="1" node_id="2" parent="1" x="1"/> <condition site="2" weight="1" node_id="2" parent="1" x="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at atation (0,1). --> <!-- if conditions 1 and 2 are satisfied, a dimer is identified at loc (0,1). -->
<condition site="1" weight="0" node_id="3" parent="2" x="2"/> <condition site="1" weight="0" node_id="3" parent="2" x="2"/>
<!-- as soon as condition 3 is satisfied, <!-- if condition 3 is satisfied,
the neighbouring space unhit to East of the dimer is empty the neighbouring space unhit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. --> and the dimer identified by conditions (1,2) can be moved to East. -->
<condition site="2" weight="0" node_id="4" parent="2" x="-1"/> <condition site="2" weight="0" node_id="4" parent="2" x="-1"/>
<!-- as soon as condition 4 is satisfied, <!-- if condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. --> and the dimer identified by conditions (1,2) can be moved to West. -->

View File

@ -1,173 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gem-graph-model version="0.2.1">
<identity>
<name>Chrysalide</name>
<owner>Léontine qui patine</owner>
<owner_id>2</owner_id>
<date>1630000000</date>
<version>1.0</version>
<g_ref id="diff" date="1630000000" author="Léontine" lang="en">Qui ça ?'</g_ref>
</identity>
<parameters id="texte" date="0" author="Léontine qui trottine.">
<simulation>
<max_thread>0</max_thread>
<max_cycles>9</max_cycles>
</simulation>
<space-param>
<!-- loop_on_zero="true" anything moved before zero reenters at the end of space-->
<!-- loop_on_zero="false" anything moved before zero is lost-->
<!-- loop_on_max="true" anything moved beyond max reenters at the zero of space-->
<!-- loop_on_max="false" anything moved beyond max is lost-->
<dimension x="20"/>
<!-- Site_multiplicity = number of sites in a space unit. -->
<!-- Each site points towards a neighbouring space unit. -->
<!-- Several arrows can be stacked in the same site. -->
<site_multiplicity>3</site_multiplicity>
</space-param>
</parameters>
<!-- Model objects definition -->
<objects id="only dimers in this model" date="1630000000" author="inanimés,... âme ?">
<object id="a dimer" date="1630000000" author="Alphonse">
<arrow site="1" weight="1" x="0"/>
<arrow site="2" weight="1" x="1"/>
</object>
</objects>
<!-- Saved space description (initial space is sequence 0) -->
<states id="texte" date="1630000000" author="Here, states are spaces.">
<space id="initial" date="1630000000" author="Une souris verte,">
<arrow site="0" weight="6" x="0"/>
<arrow site="1" weight="1" x="0"/>
<arrow site="2" weight="9" x="0"/>
<arrow site="2" weight="7" x="1"/>
<arrow site="1" weight="3" x="6"/>
<arrow site="0" weight="1" x="7"/>
<arrow site="1" weight="1" x="7"/>
<arrow site="2" weight="1" x="7"/>
<arrow site="1" weight="3" x="8"/>
<arrow site="1" weight="4" x="14"/>
<arrow site="0" weight="8" x="14"/>
<arrow site="2" weight="5" x="15"/>
<arrow site="1" weight="2" x="17"/>
<arrow site="2" weight="7" x="18"/>
<arrow site="2" weight="9" x="20"/>
<arrow site="0" weight="6" x="20"/>
<arrow site="1" weight="4" x="20"/>
</space>
</states>
<!-- Model transitions definition (rules) -->
<!-- In this version : <xs:sequence minOccurs="1" maxOccurs="unbounded">-->
<!-- Transitions should be edited by hand and written in a 'human-readable' format -->
<conditions id="random walk of dimers" date="1630000000" author="Zazard le lézard !">
<condition site="1" weight="1" node_id="1" parent="0" x="0"/>
<condition site="2" weight="1" node_id="2" parent="1" x="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at location (0,1). -->
<condition site="1" weight="0" node_id="3" parent="2" x="2"/>
<!-- as soon as condition 3 is satisfied,
the neighbouring space unhit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. -->
<condition site="2" weight="0" node_id="4" parent="2" x="1"/>
<!-- as soon as condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. -->
<condition site="2" weight="1" node_id="5" parent="3" x="1"/>
<condition site="2" weight="0" node_id="6" parent="4" x="1"/>
<condition site="2" weight="2" node_id="7" parent="3" x="1"/>
<condition site="0" weight="3" node_id="8" parent="6" x="1"/>
<condition site="0" weight="4" node_id="9" parent="6" x="1"/>
<condition site="0" weight="5" node_id="10" parent="8" x="1"/>
<condition site="9" weight="6" node_id="11" parent="1" x="1"/>
</conditions>
<transitions>
<transition id="move_a_dimer_to_east" date="1630000000" author="Pas moi..."
parent="7" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="1" weight="1" x="1"/>
<arrow site="2" weight="1" x="2"/>
</transition>
<transition id="move_a_dimer_to_west" date="1630000000" author="Ni moi !"
parent="10" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
<transition id="do_anything_you_want !" date="1630000000" author="Ni moi !"
parent="9" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
<transition id="do_nothing or something" date="1630000000" author="Ni moi !"
parent="5" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
<transition id="di da doo da da !" date="1630000000" author="Ni moi !"
parent="11" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
<transition id="ba di bou bi dou whaaah..." date="1630000000" author="Ni moi !"
parent="11" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
</transitions>
</gem-graph-model>

View File

@ -1,83 +0,0 @@
<gem-graph-model version="0.2">
<!-- Model identity informations -->
<identity>
<name>Modèle de test</name>
<owner>Gaston Lagaffe</owner>
<owner_id>2</owner_id>
<date>1629830000</date>
<version>1.0</version>
<g_ref id="texte" date="1629830000" author="Jean" lang="en">Ref</g_ref>
</identity>
<!-- Model parameters -->
<parameters id="texte" date="0" author="Gaston Lagaffe">
<simulation>
<max_thread>0</max_thread>
<max_cycles>9</max_cycles>
</simulation>
<space-param>
<dimension>
<!-- loop_on_zero="true" anything moved before zero reenters at the end of space-->
<!-- loop_on_zero="false" anything moved before zero is lost-->
<!-- loop_on_max="true" anything moved beyond max reenters at the zero of space-->
<!-- loop_on_max="false" anything moved beyond max is lost-->
<axis name="x" size="29"/>
<axis name="y" size="0"/>
<axis name="z" size="0"/>
</dimension>
<!-- Site_multiplicity = number of sites in a space unit. -->
<!-- Each site points towards a neighbouring space unit. -->
<!-- Several arrows can be stacked in the same site. -->
<site_multiplicity>3</site_multiplicity>
</space-param>
</parameters>
<!-- Model objects definition -->
<objects id="texte" date="1629830000" author="Jean Sirmai">
<object id="dimer 1-1" date="1629830000" author="Jean Sirmai">
<arrow x="0" y="0" z="0" site="1" weight="1"/>
<arrow x="1" y="0" z="0" site="2" weight="1"/>
</object>
</objects>
<!-- Saved space description (initial space is sequence 0) -->
<savestates id="texte" date="1629830000" author="THE MATRIX">
<space id="initial" date="1629830000" author="Jean Sirmai" sequence="0">
<arrow x="0" y="0" z="0" site="1" weight="1"/>
<arrow x="1" y="0" z="0" site="2" weight="1"/>
<arrow x="10" y="0" z="0" site="1" weight="1"/>
<arrow x="11" y="0" z="0" site="2" weight="1"/>
<arrow x="20" y="0" z="0" site="1" weight="1"/>
<arrow x="21" y="0" z="0" site="2" weight="1"/>
<!-- Three dimers 1-1 are drawn in the global space
at locations (0,1) (10,11) and (20,21) -->
</space>
</savestates>
<!-- Model transitions definition (rules) -->
<!-- In this version : <xs:sequence minOccurs="0" maxOccurs="unbounded">-->
<!-- Transitions should be edited by hand and written in a 'human-readable' format -->
<conditions id="random walk of dimers" date="1629822222" author="Jean">
<condition x="0" y="0" z="0" site="1" weight="1" node_id="1" parent="0"/>
<condition x="1" y="0" z="0" site="2" weight="1" node_id="2" parent="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at location (0,1). -->
<condition x="2" y="0" z="0" site="1" weight="0" node_id="3" parent="2"/>
<!-- as soon as condition 3 is satisfied,
the neighbouring space unit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. -->
<condition x="-1" y="0" z="0" site="2" weight="0" node_id="4" parent="2"/>
<!-- as soon as condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. -->
</conditions>
<transitions>
<transition id="move_a_dimer_to_east" date="1629811111" author="Jean" parent="3" probability="1">
<arrow x="0" y="0" z="0" site="1" weight="0"/>
<arrow x="1" y="0" z="0" site="2" weight="0"/>
<arrow x="1" y="0" z="0" site="1" weight="1"/>
<arrow x="2" y="0" z="0" site="2" weight="1"/>
</transition>
<transition id="move_a_dimer_to_west" date="1629811112" author="Jean" parent="4" probability="1">
<arrow x="0" y="0" z="0" site="1" weight="0"/>
<arrow x="1" y="0" z="0" site="2" weight="0"/>
<arrow x="0" y="0" z="0" site="2" weight="1"/>
<arrow x="-1" y="0" z="0" site="1" weight="1"/>
</transition>
</transitions>
</gem-graph-model>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<root version="0.2.1" >
<p rank="0" id="Root" pp="Root" >Root</p>
<p rank="0" id="A" pp="Root" >A</p>
<p rank="1" id="B" pp="Root" >B</p>
<p rank="2" id="C" pp="Root" >C</p>
<p rank="3" id="D" pp="Root" >D</p>
<p rank="0" id="E" pp="B" >E</p>
<p rank="1" id="F" pp="B" >F</p>
<p rank="2" id="G" pp="B" >G</p>
<p rank="1" id="H" pp="F" >H</p>
<p rank="0" id="I" pp="G" >I</p>
<p rank="1" id="J" pp="G" >J</p>
<p rank="2" id="K" pp="G" >K</p>
</root>

View File

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gem-graph-model version="0.2.1">
<identity>
<name>Chrysalide</name>
<owner>Léontine qui patine</owner>
<owner_id>2</owner_id>
<date>1630000000</date>
<version>1.0</version>
<g_ref id="diff" date="1630000000" author="Léontine" lang="en">Qui ça ?'</g_ref>
</identity>
<!-- Model transitions definition (rules) -->
<!-- In this version : <xs:sequence minOccurs="1" maxOccurs="unbounded">-->
<!-- Transitions should be edited by hand and written in a 'human-readable' format -->
<conditions id="random walk of dimers" date="1630000000" author="Zazard le lézard !">
<condition site="1" weight="1" node_id="1" parent="0" x="0"/>
<condition site="2" weight="1" node_id="2" parent="1" x="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at location (0,1). -->
<condition site="1" weight="0" node_id="3" parent="2" x="2"/>
<!-- as soon as condition 3 is satisfied,
the neighbouring space unhit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. -->
<condition site="2" weight="0" node_id="4" parent="2" x="-1"/>
<!-- as soon as condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. -->
</conditions>
<transitions>
<transition id="move_a_dimer_to_east" date="1630000000" author="Pas moi..."
parent="3" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="1" weight="1" x="1"/>
<arrow site="2" weight="1" x="2"/>
</transition>
<transition id="move_a_dimer_to_west" date="1630000000" author="Ni moi !"
parent="4" probability="1">
<arrow site="1" weight="0" x="0"/>
<arrow site="2" weight="0" x="1"/>
<arrow site="2" weight="1" x="0"/>
<arrow site="1" weight="1" x="1"/>
</transition>
</transitions>
</gem-graph-model>

View File

32
schemas/model_ex.xmls Normal file
View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- https://www.freeformatter.com/xml-validator-xsd.html -->
<xs:attribute name="id" type="xs:string"/>
<xs:attribute name="pp" type="xs:string"/>
<xs:attribute name="rank" type="xs:string"/>
<!--<proposition id="00" parent="None">a text</proposition>-->
<xs:element name="p">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="id" use="required"/>
<xs:attribute ref="pp" use="required"/>
<xs:attribute ref="rank" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="root">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element ref="p"/>
</xs:sequence>
<xs:attribute name="version" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>

Binary file not shown.

Binary file not shown.

62
src/any_tree_ex.py Normal file
View File

@ -0,0 +1,62 @@
#!/usr/bin/python3
import gi
import files_addr
import rules_tree
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from lxml import etree # r = Resolver()
from anytree import NodeMixin, RenderTree, Resolver, AsciiStyle, LevelOrderIter
class Window(Gtk.Window):
def create_editable_tree(self, store, tree):
Gtk_node = [None] * 10
sketch = ''
nb = 0
for pre, fill, node in RenderTree(tree):
if node.is_root:
Gtk_node[nb] = store.append(parent=None, row=[0, 'root ' + str(node.id)])
sketch += u"%s%s" % (pre + '', ' node ' + str(node.id) + ' (root)\n')
else:
nb += 1
if node.is_leaf:
Gtk_node[nb] = store.append(parent = Gtk_node[node.parent.id],
row = [nb, str(node.id)])
sketch += u"%s%s" % (pre, str(node.id) + '\n')
else:
Gtk_node[nb] = store.append(parent = Gtk_node[node.parent.id],
row = [nb, 'node ' + str(node.id)])
sketch += u"%s%s" % (pre + '', ' node' + str(node.id) + '\n')
sketch += "\n"
print(sketch)
def __init__(self):
super().__init__(title="Minimal Tree View")
tree = rules_tree.get_tree()
self.my_tree_store = Gtk.TreeStore(int, str)
self.create_editable_tree(self.my_tree_store, tree)
self.current_filter_button = None
self.language_filter = self.my_tree_store.filter_new()
self.treeview = Gtk.TreeView(model=self.language_filter)
for i, column_title in enumerate(["Row", "Path"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
self.treeview.append_column(column)
self.scrollable_treelist = Gtk.ScrolledWindow()
self.scrollable_treelist.add(self.treeview)
self.tree_viewport = Gtk.Viewport()
self.tree_viewport.add(self.scrollable_treelist)
self.tree_viewport.set_size_request(300, 200)
self.add(self.tree_viewport)
win = Window()
win.connect("destroy", Gtk.main_quit)
win.show_all()
#Gtk.main()

16
src/files_addr.py Normal file
View File

@ -0,0 +1,16 @@
glade_path = "/home/jean/Gem-Graph/gem-graph-client/ui/GLArea.glade"
modelPath = "/home/jean/Gem-Graph/gem-graph-client/models/dimers random walk.user.xml"
schemaPath = "/home/jean/Gem-Graph/gem-graph-client/schemas/models_0.2.1.xmls"
# les deux fichiers suivants pour me guider dans la fabrication d'un arbre "dynamique"
schemaExPath = "/home/jean/Gem-Graph/gem-graph-client/schemas/model_ex.xmls"
treeExPath = "/home/jean/Gem-Graph/gem-graph-client/ui/tree.ex"
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/treeview.html#the-model
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/objects.html
# https://anytree.readthedocs.io/en/latest/_modules/anytree/node/nodemixin.html
# from newick import loads

View File

@ -21,35 +21,76 @@
# ------------------------------------------------------------------------- # # ------------------------------------------------------------------------- #
import gi import gi
from anytree import RenderTree from anytree import RenderTree, LevelOrderIter
import rules_tree import rules_tree
import files_addr
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk from gi.repository import Gtk
from gi.repository import GObject from gi.repository import GObject
glade_path = "/home/jean/Gem-Graph/gem-graph-client/ui/GLArea.glade" def create_editable_tree(store, tree):
glade_path = "/home/jean/Gem-Graph/gem-graph-client/ui/GLArea.glade" Gtk_node = [None] * 10
sketch = ''
nb = 0
for pre, fill, node in RenderTree(tree):
if node.is_root:
Gtk_node[nb] = store.append(parent=None, row=[0, 'root ' + str(node.id)])
sketch += u"%s%s" % (pre + '', ' node ' + str(node.id) + ' (root)\n')
else:
nb += 1
if node.is_leaf:
Gtk_node[nb] = store.append(parent = Gtk_node[node.parent.id],
row = [nb, str(node.id)])
sketch += u"%s%s" % (pre, str(node.id) + '\n')
else:
Gtk_node[nb] = store.append(parent = Gtk_node[node.parent.id],
row = [nb, 'node ' + str(node.id)])
sketch += u"%s%s" % (pre + '', ' node' + str(node.id) + '\n')
sketch += "\n"
print(sketch)
## Main window ## Main window
store = Gtk.TreeStore(str, str)
tree = rules_tree.get_tree() tree = rules_tree.get_tree()
toto = '' sketch = '------'
for pre, fill, node in RenderTree(tree): my_tree_store = Gtk.TreeStore(int, str)
treestr = u"%s%s" % (pre, node.id) create_editable_tree(my_tree_store, tree)
# print(treestr.ljust(0))
toto += treestr + "\n"
# print(toto) current_filter_button = None
language_filter = my_tree_store.filter_new()
treeview = Gtk.TreeView(model=language_filter)
for i, column_title in enumerate(["Row", "Path"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
treeview.append_column(column)
scrollable_treelist = Gtk.ScrolledWindow()
scrollable_treelist.add(treeview)
tree_viewport = Gtk.Viewport()
tree_viewport.add(scrollable_treelist)
tree_viewport.set_size_request(300, 200)
builder = Gtk.Builder() builder = Gtk.Builder()
builder.add_from_file(glade_path) builder.add_from_file(files_addr.glade_path)
transit = builder.get_object("Id_Transitions") transit = builder.get_object("Id_Transitions")
transit.set_label(toto) transit.set_label(sketch)
transit.add(tree_viewport)
window = builder.get_object("GemGraphMainWindow") window = builder.get_object("GemGraphMainWindow")
# window.show_all() # window.show_all()
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html """
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/objects.html treestr = ''
for pre, fill, node in RenderTree(tree):
treestr = u"%s%s" % (pre, node.id)
treestr += treestr + "\n"
"""

View File

@ -1,5 +1,7 @@
from lxml import etree from lxml import etree
import datetime as DT import datetime as DT
import files_addr
## Identity ## Identity
@ -248,6 +250,7 @@ class Objects:
def set_object(self, i, Object): def set_object(self, i, Object):
self.__objects[i] = Object # TODO Assert self.__objects[i] = Object # TODO Assert
## States ## States
@ -305,6 +308,7 @@ class TreeNode(object):
self.ch.append(ch_id) self.ch.append(ch_id)
self.ch = sorted(self.ch, key=id) self.ch = sorted(self.ch, key=id)
## Conditions ## Conditions
@ -403,6 +407,7 @@ class Transitions:
def get_all(self): def get_all(self):
return self.__transitions return self.__transitions
## Model ## Model
@ -490,7 +495,4 @@ class Model:
self.tree.write("../models/" + name + ".xml", encoding="utf-8") self.tree.write("../models/" + name + ".xml", encoding="utf-8")
modelPath = "/home/jean/Gem-Graph/gem-graph-client/models/dimers random walk.xml" testmodel = Model(files_addr.modelPath, files_addr.schemaPath)
schemaPath = "/home/jean/Gem-Graph/gem-graph-client/schemas/models_0.2.1.xmls"
testmodel = Model(modelPath, schemaPath)

View File

@ -1,11 +1,10 @@
# https://anytree.readthedocs.io/en/latest/_modules/anytree/node/nodemixin.html
from anytree import NodeMixin, LevelOrderIter, RenderTree from anytree import NodeMixin, LevelOrderIter, RenderTree
# from newick import loads
import model import model
# TODO Contrôles de cohérence des données # TODO Contrôles de cohérence des données
# 1) node_id <> pas de doublons # 1) node_id <> pas de doublons
# 2) tout node doit avoir un node_parent_id # 2) tout node doit avoir un node_parent_id (assess 'is_node' ?)
# Process # Process
# 1) lors de l'adoption, le parent doit être une feuille et exister # 1) lors de l'adoption, le parent doit être une feuille et exister
@ -14,6 +13,7 @@ class TreeNode(NodeMixin):
def __init__(self, id, parent_id, weight, site, x, y, z): def __init__(self, id, parent_id, weight, site, x, y, z):
super(TreeNode, self).__init__() super(TreeNode, self).__init__()
self.id = id self.id = id
self.enonce = str(id)
self.parent_id = parent_id self.parent_id = parent_id
self.parent = None self.parent = None
self.weight = weight self.weight = weight
@ -23,8 +23,8 @@ class TreeNode(NodeMixin):
self.z = z self.z = z
def is_adopted_by(self, parent_node): def is_adopted_by(self, parent_node):
# print('orphan node ', self.id, ' is adopted by node ', parent_node.id)
self.parent = parent_node self.parent = parent_node
# print('orphan node ', self.id, ' is adopted by node ', parent_node.id)
conditions_set = set() conditions_set = set()
@ -62,24 +62,8 @@ for condition_node in LevelOrderIter(root):
transition_node.is_adopted_by(condition_node) transition_node.is_adopted_by(condition_node)
## print tree
if 0:
for pre, fill, node in RenderTree(root):
treestr = u"%s%s" % (pre, node.id)
if type(node) == TreeNode:
print(treestr.ljust(19), node.weight, ' arrow(s) at [site', node.site,
'in cell', node.x, end='')
if not node.depth == 3: # tree.depth()
print(end=']\n')
else:
print('] --> ', node.children[0].id, end='\n')
## get the tree ## get the tree
def get_tree(): def get_tree():
return root return root
# print([node.id for node in LevelOrderIter(root) if node.is_leaf])

9
ui/tree.ex Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<root version="0.2.1">
<p rank="0" id="0" pp="0">condition 0 = ROOT</p>
<p rank="0" id="1" pp="0">condition 1</p>
<p rank="0" id="2" pp="1">condition 2</p>
<p rank="1" id="3" pp="1">condition 3</p>
<p rank="0" id="E" pp="2">move_a_dimer_to_east</p>
<p rank="0" id="W" pp="3">move_a_dimer_to_west</p>
</root>