-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrafice.py
More file actions
148 lines (117 loc) · 5.34 KB
/
grafice.py
File metadata and controls
148 lines (117 loc) · 5.34 KB
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
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import matplotlib.ticker as ticker
# CONFIGURARE
FISIER_CSV = "rezultate.csv"
FOLDER_GRAFICE = "grafice_output"
if not os.path.exists(FOLDER_GRAFICE):
os.makedirs(FOLDER_GRAFICE)
def curata_nume_test(nume_fisier):
# Transforma "test_16_KillerNF.txt" in "KillerNF" pentru grafic curat
nume = nume_fisier.replace(".txt", "")
piese = nume.split("_")
if len(piese) >= 3:
return piese[2] # Returneaza tipul (ex: KillerNF, Heavy)
return nume
def genereaza_toate_graficele():
if not os.path.exists(FISIER_CSV):
print(f"Eroare: Lipseste {FISIER_CSV}")
return
df = pd.read_csv(FISIER_CSV)
# Conversie Secunde -> Milisecunde
df["Timp_ms"] = df["Timp(s)"] * 1000
# Adaugam o coloana cu Tipul testului (extras din nume)
df["Tip_Test"] = df["Nume_Test"].apply(curata_nume_test)
sns.set_theme(style="whitegrid")
# ============================================================
# GRAFIC 1: TIMP DE EXECUTIE (Scara Logaritmica)
# Axa OY este in MILISECUNDE
# ============================================================
print("Generare Grafic 1: Timp vs N (Log Scale)...")
# Filtram doar testele relevante pentru scalabilitate
df_time = df[df["Tip_Test"].isin(["Random", "Massive"])].sort_values(by="N")
if not df_time.empty:
plt.figure(figsize=(10, 6))
# Desenam graficul folosind Timp_ms pe Y
g = sns.lineplot(
data=df_time,
x="N",
y="Timp_ms",
hue="Algoritm",
style="Algoritm",
markers=True,
linewidth=2
)
# Formatare axa Y
g.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _: '{:g}'.format(y)))
plt.title("Performanță: Timp de Execuție vs Număr Obiecte (Log-Log Scale)", fontsize=14)
plt.ylabel("Timp (milisecunde)", fontsize=12)
plt.xlabel("Număr Obiecte (N)", fontsize=12)
plt.grid(True, which="major", ls="-", alpha=0.8)
plt.grid(True, which="minor", ls="--", alpha=0.4)
plt.tight_layout()
plt.savefig(os.path.join(FOLDER_GRAFICE, "1_timp_executie.png"), dpi=300)
plt.close()
# ============================================================
# GRAFIC 2: CALITATE PE TESTE "KILLER" (Bar Chart)
# ============================================================
print("Generare Grafic 2: Calitate pe Teste Speciale...")
tipuri_interesante = ["KillerNF", "OrderCheck", "Heavy", "Edge"]
mask = df["Tip_Test"].str.contains("|".join(tipuri_interesante))
df_quality = df[mask].copy()
if not df_quality.empty:
plt.figure(figsize=(12, 6))
sns.barplot(
data=df_quality,
x="Nume_Test",
y="Cosuri",
hue="Algoritm",
palette="viridis"
)
plt.title("Calitatea Soluției pe Teste Dificile (Mai puțin e mai bine)", fontsize=14)
plt.ylabel("Număr Coșuri Folosite", fontsize=12)
plt.xlabel("Test Specific", fontsize=12)
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig(os.path.join(FOLDER_GRAFICE, "2_calitate_killer.png"), dpi=300)
plt.close()
# ============================================================
# GRAFIC 3: CALITATE SCALABILITATE (Line Chart)
# ============================================================
print("Generare Grafic 3: Scalabilitate Calitate...")
df_scale_quality = df[df["Tip_Test"] == "Random"].sort_values(by="N")
if not df_scale_quality.empty:
plt.figure(figsize=(10, 6))
sns.lineplot(data=df_scale_quality, x="N", y="Cosuri", hue="Algoritm", style="Algoritm", markers=True, linewidth=2)
plt.title("Eficiență: Număr Coșuri vs Dimensiune Input (Date Random)", fontsize=14)
plt.ylabel("Număr Coșuri", fontsize=12)
plt.xlabel("Număr Obiecte (N)", fontsize=12)
plt.tight_layout()
plt.savefig(os.path.join(FOLDER_GRAFICE, "3_scalabilitate_cosuri.png"), dpi=300)
plt.close()
print(f"Gata! Verifica folderul '{FOLDER_GRAFICE}' pentru cele 3 imagini.")
def genereaza_tabel_latex():
df = pd.read_csv("rezultate.csv")
# Lista de teste interesante pentru tabel
teste_interesante = ["test_01", "test_03", "test_16", "test_30"]
print("\n--- COPY PASTE ASTA IN LATEX (TABEL) ---")
print(r"\begin{tabular}{lcccc}")
print(r"\toprule")
print(r"\textbf{Test} & \textbf{N} & \textbf{NF Coșuri} & \textbf{FF Coșuri} & \textbf{FFD Coșuri} \\")
print(r"\midrule")
for nume_partial in teste_interesante:
subset = df[df["Nume_Test"].str.contains(nume_partial)]
if subset.empty: continue
nume = subset.iloc[0]["Nume_Test"].replace("_", "\\_")
n = subset.iloc[0]["N"]
nf = subset[subset["Algoritm"] == "NextFit"]["Cosuri"].values[0]
ff = subset[subset["Algoritm"] == "FirstFit"]["Cosuri"].values[0]
ffd = subset[subset["Algoritm"] == "FFD"]["Cosuri"].values[0]
print(f"{nume} & {n} & {nf} & {ff} & {ffd} \\\\")
print(r"\bottomrule")
print(r"\end{tabular}")
if __name__ == "__main__":
genereaza_toate_graficele()
genereaza_tabel_latex()