-
Notifications
You must be signed in to change notification settings - Fork 0
/
utility.py
158 lines (122 loc) · 4.79 KB
/
utility.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
'''
Moduł zawiea funkcje pomocnicze, służące do zapisu oraz odczytu z plików
'''
def load_input(filename = 'example_input.txt'):
'''
Funkcja wczytuje całą zawartość pliku
'''
with open(filename, 'r') as file:
file_contents = file.readlines()
return file_contents
def input_to_matrix(input):
'''
Przetłumaczenie zawartości pliku na macierz oraz wektor
zgodnie z przyjętą konwencją:
- pierwsza linia to rozmiar macierzy n
- następne n lini o długości n to kolejne elementy macierzy
- w n + 1 wierszu znajduje się wektor wyrazów wolnych
'''
matrix_size = int(input[0][:-1])
# Macierz z wartościami
matrix = []
for row in range(1, matrix_size + 1):
matrix.append(list(map(float, input[row].split())))
# Wektor z wyrazami wolnymi
vector = list(map(float, input[matrix_size + 1].split()))
return matrix, vector
def save_graph_as_DOT(G, alphabet, filename = "tmp/G.dot"):
'''
Funkcja zapisuje graf Diekerta do pliku w formacie .dot
'''
with open(filename, "w") as file:
file.write("digraph g {\n")
file.write("rankdir=TB;\n") # Vertically stack subgraphs
# Ustawienia globalne
file.write("node [style=filled];\n") # Aby węzły były wypełnione kolorem
# Zapisanie krawędzi
for s1_id in range(len(G)):
for s2_id in G[s1_id]:
file.write(f"{s1_id} -> {s2_id}\n")
prefix = alphabet[0][:3]
file.write('subgraph '+prefix+' {\n')
file.write("rank=same;\n")
# Zapisanie węzłów z odpowiednimi etykietami i kolorami
for i, symbol in enumerate(alphabet):
if prefix != symbol[:3]:
prefix = symbol[:3]
file.write("}\n")
file.write('subgraph '+prefix+' {\n')
file.write("rank=same;\n")
if 'A' in symbol:
color = 'lightgreen'
elif 'B' in symbol:
color = 'orange'
else:
color = 'lightblue'
file.write(f"{i} [label=\"{symbol}\", fillcolor={color}, style=filled]\n")
file.write("}\n")
file.write("}\n")
def save_traces_theory_output(alphabet, D, w, foaty, filename):
'''
Funkcja zapisuje do pliku:
- Alfabet w sensie teori śladów
- Relację zależności
- Algorytm eliminacji Gaussa w postaci ciągu symboli (słowo)
- Postać normalną Foaty
'''
with open(filename, "w", encoding="utf-8") as file:
file.write("Alfabet w sensie teorii śladów:\n")
file.write("Σ = {\n")
for i, element in enumerate(alphabet):
separator = "," if i < len(alphabet) - 1 else ""
file.write(f" {element}{separator}")
if (i + 1) % 5 == 0 or i == len(alphabet) - 1:
file.write("\n")
else:
file.write(" ")
file.write("}\n\n")
file.write('Relacja zależności\n')
file.write("D = sym{{\n")
for i, element in enumerate(D):
separator = "," if i < len(D) - 1 else ""
file.write(f" {element}{separator}")
if (i + 1) % 5 == 0 or i == len(D) - 1:
file.write("\n")
else:
file.write(" ")
file.write("}^+} ∪ I_Σ\n\n")
file.write('Algorytm eliminacj Gaussa w postaci ciągu symboli alfabetu:\n')
file.write("w={<\n")
for i, element in enumerate(w):
separator = "," if i < len(w) - 1 else ""
file.write(f" {element}{separator}")
if (i + 1) % 5 == 0 or i == len(w) - 1:
file.write("\n")
else:
file.write(" ")
file.write(">}\n\n")
file.write('Postać normalna Foaty:\n')
file.write("FNF= {\n")
for cls in foaty:
file.write("[{")
for i, element in enumerate(cls):
separator = "," if i < len(cls) - 1 else ""
file.write(f" {element}{separator}")
if (i + 1) % 5 == 0:
file.write("\n")
else:
file.write(" ")
file.write("}]⌢\n")
file.write("}")
def save_gauss_result(M, X, filename = 'output/gauss_output.txt'):
'''
Zapisuje wyniki obliczeń do pliku
'''
with open(filename, "w", encoding="utf-8") as file:
file.write(f"{len(M)}\n")
for m in M:
for el in m:
file.write(f"{el} ")
file.write("\n")
for x in X:
file.write(f"{x} ")