diff --git a/src/rules_tree.py b/src/rules_tree.py index 70a6937..4596ca9 100644 --- a/src/rules_tree.py +++ b/src/rules_tree.py @@ -1,11 +1,10 @@ import model - +from anytree import Node, RenderTree # from anytree import Node, AnyNode, NodeMixin, RenderTree, find_by_attr # from anytree.exporter import DotExporter from ete3 import Tree # https://stackoverflow.com/ - # read-data-from-a-file-and-create-a-tree-using-anytree-in-python # https://www.delftstack.com/howto/python/trees-in-python/ # https://python-gtk-3-tutorial.readthedocs.io/en/latest/treeview.html @@ -33,129 +32,39 @@ class TreeNode(object): def __init__(self, id, parent, x, site, weight): self.id = id self.parent = parent - self.ch = [] + self.children = [] self.x = x self.site = site self.weight = weight - def id(self): - return id - - def add_child(self, ch_id): - self.ch.append(ch_id) - self.ch = sorted(self.ch, key=id) + def add_child(self, children_id): + self.children.append(children_id) + self.children = sorted(self.children, key=id) -lll = [] +cnd_list = [] +nodes_list = [] #[Node("0")] for i in conditions_set: # sorted(conditions_set, key=id): cndt = TreeNode(i[0], i[1], i[2], i[3], i[4]) # TODO y,z,... - lll.append(cndt) + cnd_list.append(cndt) -for i in lll: - for j in lll: +for i in cnd_list: + for j in cnd_list: if (i.id == j.parent): i.add_child(j) - -print('\n', "conditions (node_id, parent_id, nb enfants, liste enfants)", '\n') - -dsp = '' - -for i in lll: - dsp = str(i.id) + ' ' + str(i.parent) + ' n=' + str(len(i.ch)) + ' ' - if len(i.ch) > 0: - for c in range(0, len(i.ch)): - dsp += str(i.ch[c].id) + ', ' - print(dsp) + nodes_list.append(Node(str(i))) #(Node(str(i), parent=str(i.parent))) #(i) -""" -## +n0 = Node("0") +n1 = Node("1", parent=n0) +n2 = Node("2", parent=n1) +n3 = Node("3", parent=n2) +n4 = Node("4", parent=n2) -A = Node("A") -A1 = Node("A1", parent=A) -A2 = Node("A2", parent=A) -A21 = Node("A21", parent=A2) +for pre, fill, node in RenderTree(n0): + print("%s%s" % (pre, node.name)) -root = Node([0]) +for i in nodes_list: + print(i) #print(i.id, ' ', i.parent) - -https://python-gtk-3-tutorial.readthedocs.io/en/latest/treeview.html - - -A -├── A1 -└── A2 - └── A21 - -with open('input.txt', 'r') as f: - lines = f.readlines()[1:] - root = Node(lines[0].split(" ")[0]) - - for line in lines: - line = line.split(" ") - Node("".join(line[1:]).strip(), parent=find_by_attr(root, line[0])) - - for pre, _, node in RenderTree(root): - print("%s%s" % (pre, node.name)) - - -## -testmodel.get_states().get_space(space_id). - -print("\n*** Conditions tree ***") -print(type(model.testmodel.get_conditions())) -print("\n") -print(model.testmodel.get_conditions().get_condition(0).get_coord('x')) -print("\n") -print() - - -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()) - - -print("\n space size = ", size, " nb de sites par cellule = ", sites, - " nb total de flèches dans l'espace = ", nb_arrows) - -print(' | ', end=' ') - -# TODO Contrôles de cohérence des données -# condition et arrow -# 1) weight < weight_max (à définir) -# 2) arrow.site < site_multiplicity -# 3) arrow.x < space-param.dimension.x (idem autres axes) -# condition -# 1) parent <= condition.node_id max value (donc deux lectures) -# 2) pas de node sans un node_parent_id - - -for n in range(0, size + 1): - for s in range(0, sites): - arr = 0 - for a in range(0, nb_arrows): - if ( - sp.get_arrow(a).get_coord("x") == n - and sp.get_arrow(a).get_site() == s - ): - arr = sp.get_arrow(a).get_weight() - if arr > 0: - print(str(arr), end=' ') - else: - print('.', end=' ') - - print(' | ', end=' ') - -print('\n ' + ' ' * sites * 2, end='') - - -for k in range(0, size + 1): - if k < 9: - print(k + 1, end=' ' + ' ' * sites * 2) - else: - print(k + 1, end=' ' + ' ' * sites * 2) - -print('\n', end = "") -""" diff --git a/src/space.py b/src/space.py index a7bd365..132d400 100644 --- a/src/space.py +++ b/src/space.py @@ -5,8 +5,11 @@ STRUCTURES DE DONNÉES -------- - 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). + Chaque arrow associe + - les coordonnées d'une cellule, + - le n° d'un site, et + - un 'poids', égal au nombre de flèches présentes 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. @@ -23,29 +26,33 @@ STRUCTURES DE DONNÉES DISCUSSION -Les éléments d'interêt pour le moteur graphique sont dans un tableau. +Les éléments d'interêt pour le moteur graphique +sont dans le tableau des sites contenant des flèches. 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. +Cependant, ce tableau ne répertorie que les sites occupés. +Pour qu'il puisse être accédé rapidement, il faut l'indexer. + +Puis, pour construire une image, il faut calculer la localisation de +chaque point occupé de l'image à partir des coordonnées de chaque site occupé. NB Les sites non mentionnés dans ce tableau sont supposés vides. +--- + +Dans le cas d'un espace de taille constante (cas le plus fréquent), +un tableau de tout l'espace (et pas seulement des sites occupés) permettrait +d'accéder au contenu de chaque site en une seule étape, par un calcul simple +identique à celui effectué pour produire l'image. + +Cette représentation pourrait améliorer la lisibilité des algorithmes d'édition. +NB Lors de l'édition, aucune optimisation graphique n'est nécessaire. + + 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 @@ -72,6 +79,8 @@ view = ' | ' # 2) pas de node sans un node_parent_id +coord = ' ' * sites + ' ' + for n in range(0, size + 1): for s in range(0, sites): arr = 0 @@ -88,13 +97,10 @@ for n in range(0, size + 1): view += ' | ' -coord = ' ' * sites + ' ' - -for k in range(0, size + 1): - if k < 10: - coord += str(k) + ' ' + ' ' * sites * 2 + if n < 10: + coord += str(n) + ' ' + ' ' * sites * 2 else: - coord += str(k) + ' ' + ' ' * sites * 2 + coord += str(n) + ' ' + ' ' * sites * 2 print(view) print(coord)