WIP: Comment créer l'arbre des règles en utilisant anytree ?

This commit is contained in:
Jean Sirmai 2022-01-02 12:46:31 +01:00
parent 0e226e5cc8
commit ef03bd717b
Signed by: jean
GPG Key ID: FB3115C340E057E3
2 changed files with 48 additions and 133 deletions

View File

@ -1,11 +1,10 @@
import model import model
from anytree import Node, RenderTree
# from anytree import Node, AnyNode, NodeMixin, RenderTree, find_by_attr # from anytree import Node, AnyNode, NodeMixin, RenderTree, find_by_attr
# from anytree.exporter import DotExporter from ete3 import Tree # from anytree.exporter import DotExporter from ete3 import Tree
# https://stackoverflow.com/ # https://stackoverflow.com/
# read-data-from-a-file-and-create-a-tree-using-anytree-in-python # read-data-from-a-file-and-create-a-tree-using-anytree-in-python
# https://www.delftstack.com/howto/python/trees-in-python/ # https://www.delftstack.com/howto/python/trees-in-python/
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/treeview.html # 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): def __init__(self, id, parent, x, site, weight):
self.id = id self.id = id
self.parent = parent self.parent = parent
self.ch = [] self.children = []
self.x = x self.x = x
self.site = site self.site = site
self.weight = weight self.weight = weight
def id(self): def add_child(self, children_id):
return id self.children.append(children_id)
self.children = sorted(self.children, key=id)
def add_child(self, ch_id):
self.ch.append(ch_id)
self.ch = sorted(self.ch, key=id)
lll = [] cnd_list = []
nodes_list = [] #[Node("0")]
for i in conditions_set: # sorted(conditions_set, key=id): 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,... 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 i in cnd_list:
for j in lll: for j in cnd_list:
if (i.id == j.parent): if (i.id == j.parent):
i.add_child(j) i.add_child(j)
nodes_list.append(Node(str(i))) #(Node(str(i), parent=str(i.parent))) #(i)
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)
""" 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") for pre, fill, node in RenderTree(n0):
A1 = Node("A1", parent=A)
A2 = Node("A2", parent=A)
A21 = Node("A21", parent=A2)
root = Node([0])
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)) print("%s%s" % (pre, node.name))
for i in nodes_list:
print(i) #print(i.id, ' ', i.parent)
##
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 = "")
"""

View File

@ -5,8 +5,11 @@ STRUCTURES DE DONNÉES
-------- --------
- XML - XML
Chaque espace est stocké sous forme d'une séquence d'arrows. 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 Chaque arrow associe
(le poids, 'weight', indique le nombre de flèches dans ce site). - 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. Seuls les sites contenant des flèches sont mentionnés dans cette séquence.
Par convention, les autres sites sont supposés vides. Par convention, les autres sites sont supposés vides.
@ -23,29 +26,33 @@ STRUCTURES DE DONNÉES
DISCUSSION 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. Ce tableau est créé par lxml lors de la lecture (parsing) du fichier XML.
Il est lu / écrit par des fonctions en C Il est lu / écrit par des fonctions en C
qui peuvent aller d'une case à l'autre par de simples additions. qui peuvent aller d'une case à l'autre par de simples additions.
Cependant,ce tableau ne répertorie que les sites occupés. 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é Pour qu'il puisse être accédé rapidement, il faut l'indexer.
s'il faut construire une image à la localisation indiquée par ses coordonnées.
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. 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é, Si un deuxième tableau est utilisé,
alors, des recopies périodiques dans le tableau lxml seront nécessaires. 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
@ -72,6 +79,8 @@ view = ' | '
# 2) pas de node sans un node_parent_id # 2) pas de node sans un node_parent_id
coord = ' ' * sites + ' '
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
@ -88,13 +97,10 @@ for n in range(0, size + 1):
view += ' | ' view += ' | '
coord = ' ' * sites + ' ' if n < 10:
coord += str(n) + ' ' + ' ' * sites * 2
for k in range(0, size + 1):
if k < 10:
coord += str(k) + ' ' + ' ' * sites * 2
else: else:
coord += str(k) + ' ' + ' ' * sites * 2 coord += str(n) + ' ' + ' ' * sites * 2
print(view) print(view)
print(coord) print(coord)