From 0e226e5cc8a5730c98a529b839eabcb0389a4b1f Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Tue, 21 Dec 2021 17:39:07 +0100 Subject: [PATCH] WIP: Cas des espaces de taille constante: string. + discussion. --- src/__pycache__/model.cpython-39.pyc | Bin 18922 -> 18946 bytes src/model.py | 8 ++-- src/space.py | 63 ++++++++++++++++++++++++--- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/__pycache__/model.cpython-39.pyc b/src/__pycache__/model.cpython-39.pyc index 6de209438b0d052223150cf68cc1752c43051001..e4e5fa394d3ac1a3a75a3e60d0cb43569c0a09c4 100644 GIT binary patch delta 113 zcmaDgnXzdKBX1%vFBbz4$UZ)p_+}$-xrU%%UQ&F1a&l=wW@<`&ab`*C=3Wg}#>oq; mSuN0Iig_3r7>b!d`WdUFg9{RqQ}xnQOXAVhZQie`tpET(0VSmX delta 89 zcmZpg!uV=3BX1%vFBbz4ym)&c@ytfvat%(-yrlTVqN4or%~Lg487DswXVrj-6!S1L eFcdR^)H7BI2NxtJr|PArmc+y4H(%G(RsaAGt{lz) diff --git a/src/model.py b/src/model.py index b7e6cbc..c4380bc 100644 --- a/src/model.py +++ b/src/model.py @@ -253,20 +253,20 @@ class Objects: class Space: __arrows = [] - nb_arrows = 0 + nb_occupied_sites = 0 def __init__(self, node): self.node = node for child in node: if(child.tag == "arrow"): - self.nb_arrows += 1 + self.nb_occupied_sites += 1 self.__arrows.append(Arrow(child)) def get_arrow(self, i): return self.__arrows[i] - def get_nb_arrows(self): - return self.nb_arrows + def get_nb_occupied_sites(self): + return self.nb_occupied_sites def get_weight(self, cell, site): return 4096 diff --git a/src/space.py b/src/space.py index c4f53aa..a7bd365 100644 --- a/src/space.py +++ b/src/space.py @@ -1,13 +1,64 @@ +""" +STRUCTURES DE DONNÉES + +1) STOCKAGE + -------- +- XML + Chaque espace est stocké sous forme d'une séquence d'arrows. + Chaque arrow associe les coordonnées d'une cellule, un n° de site et un poids + (le poids, 'weight', indique le nombre de flèches dans ce site). + Seuls les sites contenant des flèches sont mentionnés dans cette séquence. + Par convention, les autres sites sont supposés vides. + +2) TRAVAIL + ------- +- si la taille de l'espace est constante, + et le nombre maximal de flèches par site peu élevé, + alors, l'espace peut être représenté par une string + sinon par une liste. + +- Le but de ces structure est: + * la visualisation (lors de l'exécution des transitions et des undo/redo). + * l'édition de l'espace. + +DISCUSSION + +Les éléments d'interêt pour le moteur graphique sont dans un tableau. +Ce tableau est créé par lxml lors de la lecture (parsing) du fichier XML. +Il est lu / écrit par des fonctions en C +qui peuvent aller d'une case à l'autre par de simples additions. + +Cependant,ce tableau ne répertorie que les sites occupés. +Un calcul est donc nécessaire chaque fois qu'un site y a été trouvé +s'il faut construire une image à la localisation indiquée par ses coordonnées. +NB Les sites non mentionnés dans ce tableau sont supposés vides. + +Si un deuxième tableau est utilisé, +alors, des recopies périodiques dans le tableau lxml seront nécessaires. + +Cependant, dans le cas d'un espace de taille constante (cas le plus fréquent), +c'est un tableau de tout l'espace (et pas seulement des sites occupés) qui sera +construit. +Ce tableau permettra d'accéder au contenu de chaque site en une seule étape, +par un calcul simple. +Et ce calcul sera le même que celui effectué pour produire l'image. + +Cette représentation peut améliorer la lisibilité des algorithmes d'édition. +Par ailleurs, lors de l'édition, aucune optimisation graphique n'est nécessaire. + +""" + import model sp = model.testmodel.get_states().get_space(0) size = model.testmodel.get_parameters().spaceparam.get_dimension().get_x() sites = int(model.testmodel.get_parameters().spaceparam.get_site_multiplicity()) -nb_arrows = int(model.testmodel.get_states().get_space(0).get_nb_arrows()) +occupied = int(model.testmodel.get_states().get_space(0).nb_occupied_sites) print("\nspace size =", size, " nb de sites par cellule =", sites, - " nb total de flèches dans l'espace =", nb_arrows, end='\n') + " nb de sites occupés dans l'ensemble de l' l'espace =", + occupied, end='\n') view = ' | ' @@ -24,7 +75,7 @@ view = ' | ' for n in range(0, size + 1): for s in range(0, sites): arr = 0 - for a in range(0, nb_arrows): + for a in range(0, occupied): if ( sp.get_arrow(a).get_coord("x") == n and sp.get_arrow(a).get_site() == s @@ -40,10 +91,10 @@ for n in range(0, size + 1): coord = ' ' * sites + ' ' for k in range(0, size + 1): - if k < 9: - coord += str(k + 1) + ' ' + ' ' * sites * 2 + if k < 10: + coord += str(k) + ' ' + ' ' * sites * 2 else: - coord += str(k + 1) + ' ' + ' ' * sites * 2 + coord += str(k) + ' ' + ' ' * sites * 2 print(view) print(coord)