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
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)
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):
for pre, fill, node in RenderTree(n0):
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
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.
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)