WIP: Comment créer l'arbre des règles en utilisant anytree ?
This commit is contained in:
parent
0e226e5cc8
commit
ef03bd717b
|
@ -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 = "")
|
|
||||||
"""
|
|
||||||
|
|
50
src/space.py
50
src/space.py
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue