Skip to content

Commit 9ef3b99

Browse files
committed
Merge branch 'main' into oneBranchToRuleThemAll
# Conflicts: # linegraph/renderLinegraph.py
2 parents 327f914 + c7217f9 commit 9ef3b99

12 files changed

Lines changed: 949 additions & 247 deletions

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ buildNumber.properties
115115
*.csv
116116
*.ser
117117
patches/*
118-
/.venv/
118+
.venv/
119119

120120
/input
121121
/error

lattice/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.gv

lattice/Problems with lattice.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Problems with lattice
2+
3+
1. NODER_PARSER in Z. 247 in renderLineGraph
4+
- fehlt hier ein "global NODER_PARSER"?
5+
- Variable wird nicht übrschrieben?
6+
- [Tutorial: How to use global variables in Python](https://thispointer.com/python-how-to-use-global-variables-in-a-function/)
7+
8+
2. Hierarche von Teilgraphen geht nicht (TM)
9+
networkx subgraph -> nicht so möglich, wie gewünscht (keine abgetrennten Teilgraphen und dazwischen keine Verbindungnen)
10+
- manuelle Position von Clustern bestimmen (graphviz, networtx)
11+
- [Dokueintrag zu `rank` u.ä.. Geht nur in dot (nicht in fdp)](https://graphviz.org/docs/attrs/rank/)
12+
- [Dokueintrag: Wie man sog. Cluster erstellt](https://graphviz.org/Gallery/undirected/fdpclust.html)
13+
- [Zusammenfassung (dot und anderes)](http://www.graphviz.org/pdf/dot.1.pdf)
14+
- [Graphviz in Python, mit Beispielen](https://graphviz.readthedocs.io/en/stable/examples.html)
15+
- [Tutorial: CausalNex plotting (networkx)](https://causalnex.readthedocs.io/en/latest/03_tutorial/03_plotting_tutorial.html)
16+
- [Zusammenfassung von Graphviz](https://pygraphviz.github.io/documentation/stable/pygraphviz.pdf)

lattice/createGraph.gv.pdf

71.1 KB
Binary file not shown.

lattice/dotguide.pdf

277 KB
Binary file not shown.

lattice/expected_output.png

126 KB
Loading

lattice/lattice.lg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
t # v 0 133v 1 25v 2 119v 3 131v 4 262v 5 38v 6 263v 7 45v 8 31v 9 260v 10 324v 11 231v 12 33v 13 77v 14 116v 15 230v 16 2v 17 272v 18 310v 19 314v 20 57v 21 14v 22 52v 23 73v 24 107v 25 121v 26 325v 27 12v 28 60v 29 123v 30 74v 31 55v 32 108v 33 122v 34 229v 35 315v 36 321v 37 277v 38 312v 39 30v 40 53v 41 311v 42 320v 43 329v 44 24v 45 66v 46 118v 47 130v 48 0v 49 44v 50 50v 51 330v 52 132v 53 134v 54 276v 55 51v 56 54e 0 3 subgraphe 7 5 subgraphe 7 49 subgraphe 7 50 subgraphe 8 39 subgraphe 8 30 subgraphe 8 32 subgraphe 11 2 subgraphe 11 34 subgraphe 11 51 subgraphe 12 21 subgraphe 13 25 subgraphe 14 12 subgraphe 14 24 subgraphe 14 49 subgraphe 15 46 subgraphe 15 29 subgraphe 15 43 subgraphe 15 34 subgraphe 16 48 subgraphe 17 49 subgraphe 18 50 subgraphe 19 50 subgraphe 27 31 subgraphe 27 33 subgraphe 28 31 subgraphe 29 25 subgraphe 29 26 subgraphe 29 33 subgraphe 30 23 subgraphe 32 24 subgraphe 34 33 subgraphe 36 26 subgraphe 37 54 subgraphe 38 35 subgraphe 39 23 subgraphe 39 24 subgraphe 40 22 subgraphe 40 56 subgraphe 41 18 subgraphe 41 19 subgraphe 42 5 subgraphe 42 36 subgraphe 42 55 subgraphe 43 26 subgraphe 44 21 subgraphe 46 25 subgraphe 47 25 subgraphe 52 47 subgraph

lattice/patterns.lg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
t # 133v 0 m20v 1 m20v 2 c2v 3 m00v 4 m03v 5 m02v 6 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 4 ae 6 4 at # 25v 0 m20v 1 m20v 2 m10v 3 m12v 4 c3v 5 c0e 1 0 bae 2 1 be 3 2 be 4 3 be 5 1 at # 119v 0 m20v 1 m20v 2 c2v 3 m00v 4 m02v 5 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 4 at # 131v 0 m20v 1 m20v 2 c2v 3 m00v 4 m03v 5 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 4 at # 262v 0 m20v 1 m20v 2 m22v 3 m00v 4 c1v 5 c2e 1 0 bae 2 1 bae 3 2 ae 4 3 ae 5 1 bt # 38v 0 m20v 1 m20v 2 m10v 3 c3v 4 m00v 5 c1e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 4 at # 263v 0 m20v 1 m20v 2 m22v 3 c2v 4 m00v 5 c1e 1 0 bae 2 1 bae 3 2 be 4 1 ae 5 4 at # 45v 0 m20v 1 m20v 2 m10v 3 c3v 4 c7v 5 m00v 6 c1e 1 0 bae 2 1 be 3 2 be 4 2 be 4 5 ae 5 1 ae 6 5 at # 31v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 c2v 6 c0v 7 m00e 1 0 bae 2 1 be 3 2 be 3 7 ae 4 2 be 4 7 ae 5 1 be 6 1 ae 7 1 at # 260v 0 m20v 1 m20v 2 m22v 3 c2v 4 m00v 5 c1e 1 0 bae 2 1 bae 3 2 be 4 2 ae 5 4 at # 324v 0 m20v 1 m20v 2 m00v 3 m02v 4 c4v 5 c1e 1 0 bae 2 1 ae 3 2 ae 4 1 be 4 3 ae 5 2 at # 231v 0 m20v 1 m20v 2 c2v 3 m00v 4 c7v 5 m02v 6 c1e 1 0 bae 2 1 be 3 1 ae 4 1 be 4 3 ae 5 3 ae 6 5 at # 33v 0 m20v 1 m20v 2 m10v 3 c3v 4 c0v 5 m00e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 1 at # 77v 0 m20v 1 m20v 2 m10v 3 c2v 4 m00v 5 c1e 1 0 bae 2 1 be 3 1 be 4 1 ae 5 4 at # 116v 0 m20v 1 m20v 2 m10v 3 c7v 4 c3v 5 c0v 6 m00e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 2 be 5 1 ae 6 1 at # 230v 0 m20v 1 m20v 2 c2v 3 m00v 4 c7v 5 m02v 6 c1e 1 0 bae 2 1 be 3 1 ae 4 1 be 4 3 ae 5 3 ae 6 3 at # 2v 0 m20v 1 m20v 2 m13v 3 c3v 4 m03v 5 c7v 6 m23e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 2 be 5 4 ae 6 2 be 6 4 at # 272v 0 m20v 1 m20v 2 m10v 3 m22v 4 c7v 5 c3v 6 m00e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 2 be 4 6 ae 5 2 be 6 1 at # 310v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 m00v 6 c1e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 2 be 4 5 ae 5 1 ae 6 5 at # 314v 0 m20v 1 m20v 2 m10v 3 c7v 4 m00v 5 m02v 6 c1e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 4 ae 6 4 at # 57v 0 m20v 1 m20v 2 c0v 3 m00v 4 m02v 5 c4e 1 0 bae 2 1 ae 3 1 ae 4 3 ae 5 1 be 5 4 at # 14v 0 m20v 1 m20v 2 m10v 3 c3v 4 c0e 1 0 bae 2 1 be 3 2 be 4 1 at # 52v 0 m20v 1 m20v 2 m12v 3 c7v 4 m02v 5 c0e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 1 at # 73v 0 m20v 1 m20v 2 m10v 3 c7v 4 c2v 5 m00e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 1 be 5 1 at # 107v 0 m20v 1 m20v 2 m10v 3 c7v 4 c0v 5 m00e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 1 ae 5 1 at # 121v 0 m20v 1 m20v 2 c2v 3 m00v 4 c1e 1 0 bae 2 1 be 3 1 ae 4 3 at # 325v 0 m20v 1 m20v 2 m00v 3 c7v 4 c1e 1 0 bae 2 1 ae 3 1 be 3 2 ae 4 2 at # 12v 0 m20v 1 m20v 2 c2v 3 c0v 4 m00v 5 c7e 1 0 bae 2 1 be 3 1 ae 4 1 ae 5 1 be 5 4 at # 60v 0 m20v 1 m20v 2 c0v 3 m00v 4 c7v 5 m02e 1 0 bae 2 1 ae 3 1 ae 4 1 be 4 3 ae 5 3 at # 123v 0 m20v 1 m20v 2 c2v 3 m00v 4 c7v 5 c1e 1 0 bae 2 1 be 3 1 ae 4 1 be 4 3 ae 5 3 at # 74v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 c2v 6 m00e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 2 be 4 6 ae 5 1 be 6 1 at # 55v 0 m20v 1 m20v 2 c0v 3 m00v 4 c7e 1 0 bae 2 1 ae 3 1 ae 4 1 be 4 3 at # 108v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 c0v 6 m00e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 2 be 4 6 ae 5 1 ae 6 1 at # 122v 0 m20v 1 m20v 2 c2v 3 m00v 4 c7e 1 0 bae 2 1 be 3 1 ae 4 1 be 4 3 at # 229v 0 m20v 1 m20v 2 c2v 3 m00v 4 c7v 5 m02e 1 0 bae 2 1 be 3 1 ae 4 1 be 4 3 ae 5 3 at # 315v 0 m20v 1 m20v 2 m10v 3 c7v 4 m00v 5 m02v 6 c1e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 4 ae 6 5 at # 321v 0 m20v 1 m20v 2 m10v 3 m00v 4 c1v 5 c7e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 1 be 5 3 at # 277v 0 m20v 1 m20v 2 m10v 3 m23v 4 c4v 5 m00v 6 m03v 7 c1e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 2 be 4 6 ae 5 1 ae 6 5 ae 7 5 at # 312v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 m00v 6 m02v 7 c1e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 2 be 4 5 ae 5 1 ae 6 5 ae 7 6 at # 30v 0 m20v 1 m20v 2 m10v 3 c7v 4 c2v 5 c0v 6 m00e 1 0 bae 2 1 be 3 2 be 3 6 ae 4 1 be 5 1 ae 6 1 at # 53v 0 m20v 1 m20v 2 m12v 3 c7v 4 m02v 5 c2v 6 c0e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 1 be 6 1 at # 311v 0 m20v 1 m20v 2 m10v 3 m23v 4 c7v 5 m00v 6 m02v 7 c1e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 2 be 4 5 ae 5 1 ae 6 5 ae 7 5 at # 320v 0 m20v 1 m20v 2 m10v 3 c3v 4 m00v 5 c1v 6 c7e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 4 ae 6 1 be 6 4 at # 329v 0 m20v 1 m20v 2 m00v 3 c7v 4 m02v 5 c1e 1 0 bae 2 1 ae 3 1 be 3 2 ae 4 2 ae 5 2 at # 24v 0 m20v 1 m20v 2 m10v 3 m12v 4 c3v 5 c0e 1 0 bae 2 1 be 3 2 be 4 2 be 5 1 at # 66v 0 m20v 1 m20v 2 m10v 3 c7v 4 m12v 5 c3e 1 0 bae 2 1 be 3 2 be 3 1 ae 4 2 be 5 4 bt # 118v 0 m20v 1 m20v 2 c2v 3 m00v 4 m02v 5 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 3 at # 130v 0 m20v 1 m20v 2 c2v 3 m00v 4 m03v 5 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 3 at # 0v 0 m20v 1 m20v 2 m13v 3 c3v 4 m03v 5 c7e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 2 be 5 4 at # 44v 0 m20v 1 m20v 2 m10v 3 c3v 4 c7v 5 m00e 1 0 bae 2 1 be 3 2 be 4 2 be 4 5 ae 5 1 at # 50v 0 m20v 1 m20v 2 m10v 3 c7v 4 m00v 5 c1e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 4 at # 330v 0 m20v 1 m20v 2 m00v 3 c7v 4 m02v 5 c1e 1 0 bae 2 1 ae 3 1 be 3 2 ae 4 2 ae 5 4 at # 132v 0 m20v 1 m20v 2 c2v 3 m00v 4 m03v 5 m02v 6 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 4 ae 6 3 at # 134v 0 m20v 1 m20v 2 c2v 3 m00v 4 m03v 5 m02v 6 c1e 1 0 bae 2 1 be 3 1 ae 4 3 ae 5 4 ae 6 5 at # 276v 0 m20v 1 m20v 2 m10v 3 c4v 4 m00v 5 m03v 6 c1e 1 0 bae 2 1 be 3 2 be 3 5 ae 4 1 ae 5 4 ae 6 4 at # 51v 0 m20v 1 m20v 2 m10v 3 c3v 4 m00v 5 c7e 1 0 bae 2 1 be 3 2 be 4 1 ae 5 1 be 5 4 at # 54v 0 m20v 1 m20v 2 m12v 3 c7v 4 m02v 5 c2e 1 0 bae 2 1 be 3 2 be 3 4 ae 4 1 ae 5 1 b

linegraph/createGraph.py

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
#!/usr/bin/python3
2+
3+
import argparse
4+
import graphviz
5+
6+
import graphGeneration as g
7+
8+
####################################################################
9+
# How to
10+
#
11+
# Run script with ./createGraph
12+
# Add arguments, such as
13+
# --patterns_path path to the patterns file (default: ../lattice/patterns.lg)
14+
# --lattice_path path to the lattice file (default: ../lattice/lattice.lg)
15+
# --node_parser (default|patternsdebug|patternsrelease)
16+
# how the node labels in the patterns file should be interpreted
17+
####################################################################
18+
19+
d = graphviz.Digraph(filename="../lattice/createGraph.gv", engine='fdp')
20+
21+
# set border colour of the nodes
22+
def nodeBorderColour(codetype):
23+
if codetype == g.CODETYPE_CODE:
24+
g.CODE_TYPE_CODE_COLOR
25+
else:
26+
g.CODE_TYPE_OTHER_COLOR
27+
28+
29+
# the filled colour of the node
30+
def nodeColour(difftype):
31+
if difftype == g.DIFFTYPE_NON:
32+
return g.DIFFTYPE_NON_COLOR
33+
elif difftype == g.DIFFTYPE_ADD:
34+
return g.DIFFTYPE_ADD_COLOR
35+
elif difftype == g.DIFFTYPE_REM:
36+
return g.DIFFTYPE_REM_COLOR
37+
38+
39+
# the colour of the edge according to the specification, for "a", "b", and "ab"
40+
def edgeColour(edge):
41+
if edge == "a":
42+
return g.EDGE_A_COLOUR
43+
elif edge == "b":
44+
return g.EDGE_B_COLOUR
45+
else: # "ab"
46+
return g.EDGE_AB_COLOUR
47+
48+
49+
# draw a node within a sub graph
50+
def drawNode(cluster, tree, nodeId, nodeLabel):
51+
nodedata = NODE_PARSER(nodeId, nodeLabel)
52+
53+
# create node
54+
cluster.node(
55+
tree + "_" + nodeId, # the identifier of the node
56+
label = nodedata.label, # the label of the node
57+
color = nodeBorderColour(nodedata.codetype), # border colour of the node
58+
fillcolor = nodeColour(nodedata.difftype), style = "filled") # colour of the filled node
59+
#cluster.node_attr.update(height=10)
60+
61+
62+
# draw an edge between node which are inside a sub graph
63+
def drawEdge(cluster, tree, childNodeId, parentNodeId, nodeLabel):
64+
# create edge
65+
cluster.edge(
66+
tree + "_" + childNodeId, # identifier of the destination node (where the edge arrow points to)
67+
tree + "_" + parentNodeId, # identifier of the source node (where the edge arrow points from)
68+
color=edgeColour(nodeLabel)) # colour of the edge
69+
70+
71+
# draw one tree, i.e. sub graph, of the patterns file
72+
def drawCluster(tree, nodes, edges):
73+
with d.subgraph(name = ("cluster_" + tree)) as c: # add cluster/sub graph
74+
c.attr(label = "tree " + tree, overlap='false', sep="+10") # title of clusters
75+
# draw all nodes
76+
for v in nodes:
77+
drawNode(c, tree, v[0], v[1])
78+
# draw all edges
79+
for e in edges:
80+
drawEdge(c, tree, e[0], e[1], e[2])
81+
82+
83+
# read in patterns file and read in vertices and edges
84+
def patterns(patterns_file_path):
85+
patternsFile = open(patterns_file_path, "r")
86+
patternLines = patternsFile.readlines()
87+
88+
trees = {} # contains all trees
89+
nodes = [] # contains all nodes of a tree
90+
edges = [] # contains all edges of a tree
91+
92+
for line in patternLines:
93+
line = line.replace("\n", "")
94+
line = line.replace("\r", "")
95+
96+
if line.startswith("t"):
97+
# save previous read tree
98+
if len(nodes):
99+
trees.update({tree : (nodes.copy(), edges.copy())})
100+
drawCluster(tree, nodes, edges)
101+
102+
# read new tree (and clear all nodes and edges)
103+
nodes.clear()
104+
edges.clear()
105+
# t # TREE_ID
106+
lineParams = line.split(" ")
107+
tree = lineParams[2]
108+
109+
# read in node
110+
elif line.startswith("v"):
111+
# v ID LABEL
112+
lineParams = line.split(" ")
113+
nodes.append((lineParams[1], ' '.join(lineParams[2:])))
114+
115+
# read in edge
116+
elif line.startswith("e"):
117+
# e NODE_CHILD_ID NODE_PARENT_ID LABEL
118+
lineParams = line.split(" ")
119+
edges.append((lineParams[1], lineParams[2], lineParams[3]))
120+
121+
# repeat saving process for the last tree
122+
trees.update({tree : (nodes.copy(), edges.copy())})
123+
drawCluster(tree, nodes, edges)
124+
125+
126+
# read in lattice file, i.e. the connections between all subgraphs
127+
def lattice(lattice_file_path):
128+
latticeFile = open(lattice_file_path, "r")
129+
latticeLines = latticeFile.readlines()
130+
131+
latticeNodes = {}
132+
#latticeEdges = []
133+
134+
for line in latticeLines:
135+
line = line.replace("\n", "")
136+
line = line.replace("\r", "")
137+
138+
if line.startswith("t"):
139+
# t # TREE_ID
140+
pass
141+
142+
elif line.startswith("v"):
143+
# v ID LABEL
144+
lineParams = line.split(" ")
145+
latticeNodes.update({lineParams[1]: lineParams[2]})
146+
147+
148+
elif line.startswith("e"):
149+
# e NODE_CHILD_ID NODE_PARENT_ID LABEL
150+
lineParams = line.split(" ")
151+
child = lineParams[1]
152+
parent = lineParams[2]
153+
# latticeEdges.append((child, parent))
154+
d.edge("cluster_" + latticeNodes.get(child), "cluster_" + latticeNodes.get(parent))
155+
#d.edge(latticeNodes.get(child) + "_0", latticeNodes.get(parent) + "_" + str(len(trees.get(latticeNodes.get(parent)))), ltail = "cluster_" + latticeNodes.get(child), lhead = "cluster_" + latticeNodes.get(parent))
156+
157+
NODE_PARSER = g.parseNodeReleaseAtomics
158+
159+
def main():
160+
# get parameters
161+
argparser = argparse.ArgumentParser()
162+
argparser.add_argument('--patterns_path', nargs='?', default="../lattice/patterns.lg", type=str)
163+
argparser.add_argument('--lattice_path', nargs='?', default="../lattice/lattice.lg", type=str)
164+
argparser.add_argument('--node_parser', nargs='?', default="patternsrelease", type=str)
165+
args = argparser.parse_args()
166+
167+
patterns_path = args.patterns_path
168+
lattice_path = args.lattice_path
169+
170+
# select the node parser
171+
global NODE_PARSER # accessing the gloabl variable NODE_PARSER
172+
if args.node_parser == "default":
173+
NODE_PARSER = g.parseNodeDefault
174+
elif args.node_parser == "patternsdebug":
175+
NODE_PARSER = g.parseNodeDebugAtomics
176+
elif args.node_parser == "patternsrelease":
177+
NODE_PARSER = g.parseNodeReleaseAtomics
178+
else:
179+
print("Node parser type does not exist.")
180+
181+
#d.attr(rankdir='LR')
182+
d.attr(overlap='false')
183+
#d.attr(compound='true')
184+
185+
d.attr(sep = "+10")
186+
187+
patterns(patterns_path)
188+
lattice(lattice_path)
189+
190+
d.view()
191+
192+
193+
if __name__ == "__main__":
194+
main()

0 commit comments

Comments
 (0)