WIP: Cas des espaces de taille constante: string. + discussion.

This commit is contained in:
Jean Sirmai 2021-12-21 17:39:07 +01:00
parent 8a7f97f53a
commit 0e226e5cc8
Signed by: jean
GPG Key ID: FB3115C340E057E3
3 changed files with 61 additions and 10 deletions

Binary file not shown.

View File

@ -253,20 +253,20 @@ class Objects:
class Space: class Space:
__arrows = [] __arrows = []
nb_arrows = 0 nb_occupied_sites = 0
def __init__(self, node): def __init__(self, node):
self.node = node self.node = node
for child in node: for child in node:
if(child.tag == "arrow"): if(child.tag == "arrow"):
self.nb_arrows += 1 self.nb_occupied_sites += 1
self.__arrows.append(Arrow(child)) self.__arrows.append(Arrow(child))
def get_arrow(self, i): def get_arrow(self, i):
return self.__arrows[i] return self.__arrows[i]
def get_nb_arrows(self): def get_nb_occupied_sites(self):
return self.nb_arrows return self.nb_occupied_sites
def get_weight(self, cell, site): def get_weight(self, cell, site):
return 4096 return 4096

View File

@ -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 import model
sp = model.testmodel.get_states().get_space(0) sp = model.testmodel.get_states().get_space(0)
size = model.testmodel.get_parameters().spaceparam.get_dimension().get_x() size = model.testmodel.get_parameters().spaceparam.get_dimension().get_x()
sites = int(model.testmodel.get_parameters().spaceparam.get_site_multiplicity()) 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, 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 = ' | ' view = ' | '
@ -24,7 +75,7 @@ view = ' | '
for n in range(0, size + 1): for n in range(0, size + 1):
for s in range(0, sites): for s in range(0, sites):
arr = 0 arr = 0
for a in range(0, nb_arrows): for a in range(0, occupied):
if ( if (
sp.get_arrow(a).get_coord("x") == n sp.get_arrow(a).get_coord("x") == n
and sp.get_arrow(a).get_site() == s and sp.get_arrow(a).get_site() == s
@ -40,10 +91,10 @@ for n in range(0, size + 1):
coord = ' ' * sites + ' ' coord = ' ' * sites + ' '
for k in range(0, size + 1): for k in range(0, size + 1):
if k < 9: if k < 10:
coord += str(k + 1) + ' ' + ' ' * sites * 2 coord += str(k) + ' ' + ' ' * sites * 2
else: else:
coord += str(k + 1) + ' ' + ' ' * sites * 2 coord += str(k) + ' ' + ' ' * sites * 2
print(view) print(view)
print(coord) print(coord)