finish all analysis and upload data and results
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
import pandas as pd
|
||||
import os
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn.metrics import mean_squared_error, mean_absolute_error
|
||||
|
||||
raw_path = "results/real_data/raw/dimacs_s42.csv"
|
||||
pred_path = "results/real_data/derived/distribution/dimacs_prediction_result/prediction.csv"
|
||||
save_folder = "results/real_data/derived/comparison"
|
||||
os.makedirs(save_folder, exist_ok=True)
|
||||
|
||||
raw = pd.read_csv(raw_path)
|
||||
pred = pd.read_csv(pred_path)
|
||||
|
||||
# real: trial 평균
|
||||
agg = (
|
||||
raw.groupby("file")
|
||||
.agg(
|
||||
nodes = ("nodes", "first"),
|
||||
density = ("density", "first"),
|
||||
real_time = ("time", "mean"),
|
||||
real_relax = ("relax_success","mean"),
|
||||
)
|
||||
.reset_index()
|
||||
)
|
||||
|
||||
# prediction: file 기준으로 merge
|
||||
pred_cols = pred[["file", "predict_time", "relax_success"]].rename(
|
||||
columns={"relax_success": "pred_relax"}
|
||||
)
|
||||
|
||||
merged = agg.merge(pred_cols, on="file", how="inner")
|
||||
|
||||
# 오차 계산
|
||||
for real_col, pred_col, prefix in [
|
||||
("real_time", "predict_time", "time"),
|
||||
("real_relax", "pred_relax", "relax"),
|
||||
]:
|
||||
merged[f"{prefix}_abs_err"] = (merged[pred_col] - merged[real_col]).abs()
|
||||
merged[f"{prefix}_rel_err"] = merged[f"{prefix}_abs_err"] / merged[real_col]
|
||||
|
||||
cols = [
|
||||
"file", "nodes", "density",
|
||||
"real_time", "predict_time", "time_abs_err", "time_rel_err",
|
||||
"real_relax", "pred_relax", "relax_abs_err", "relax_rel_err",
|
||||
]
|
||||
merged[cols].to_csv(os.path.join(save_folder, "comparison.csv"), index=False)
|
||||
print(merged[cols].to_string(index=False))
|
||||
print(f"\nSaved → {save_folder}/comparison.csv")
|
||||
|
||||
for real_col, pred_col, label in [
|
||||
("real_time", "predict_time", "time"),
|
||||
("real_relax", "pred_relax", "relax_success"),
|
||||
]:
|
||||
y = merged[real_col].to_numpy()
|
||||
y_hat = merged[pred_col].to_numpy()
|
||||
ss_res = ((y - y_hat) ** 2).sum()
|
||||
ss_tot = ((y - y.mean()) ** 2).sum()
|
||||
r2 = 1 - ss_res / ss_tot
|
||||
rmse = mean_squared_error(y, y_hat) ** 0.5
|
||||
mae = mean_absolute_error(y, y_hat)
|
||||
print(f"\n[{label}] R²={r2:.4f} RMSE={rmse:.4g} MAE={mae:.4g}")
|
||||
|
||||
|
||||
# ── Plot ───────────────────────────────────────────────────────────────────────
|
||||
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
|
||||
|
||||
for ax, real_col, pred_col, label in [
|
||||
(axes[0], "real_time", "predict_time", "Runtime [s]"),
|
||||
(axes[1], "real_relax", "pred_relax", "Relax Success"),
|
||||
]:
|
||||
x = merged[real_col].to_numpy()
|
||||
y = merged[pred_col].to_numpy()
|
||||
mn, mx = min(x.min(), y.min()), max(x.max(), y.max())
|
||||
|
||||
ax.scatter(x, y, s=60, zorder=3)
|
||||
for _, row in merged.iterrows():
|
||||
ax.annotate(
|
||||
row["file"].replace("USA-road-d.", "").replace(".gr", ""),
|
||||
(row[real_col], row[pred_col]),
|
||||
fontsize=6, textcoords="offset points", xytext=(4, 2)
|
||||
)
|
||||
ax.plot([mn, mx], [mn, mx], color="red", linestyle="--", linewidth=1.2, label="y = x")
|
||||
ax.set_xlabel(f"Real {label}")
|
||||
ax.set_ylabel(f"Predicted {label}")
|
||||
ax.set_title(f"Predicted vs Real — {label}")
|
||||
ax.legend(fontsize=8)
|
||||
ax.grid(True, alpha=0.4)
|
||||
|
||||
fig.tight_layout()
|
||||
fig.savefig(os.path.join(save_folder, "comparison_plot.png"), dpi=300)
|
||||
plt.close(fig)
|
||||
print(f"Saved → {save_folder}/comparison_plot.png")
|
||||
@@ -0,0 +1,78 @@
|
||||
from experiments.synthetic_data.analysis.processing_time_analysis import mean_l
|
||||
from experiments.synthetic_data.analysis.processing_time_analysis import regression_k3
|
||||
from experiments.synthetic_data.analysis.processing_time_analysis import regression_m
|
||||
from experiments.synthetic_data.analysis.call_number_analysis import (
|
||||
nonlinear_regression,
|
||||
)
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import os
|
||||
|
||||
|
||||
def k3(V):
|
||||
return k3_a * np.exp(-k3_b * V) + k3_c
|
||||
|
||||
|
||||
def m(V):
|
||||
return m_a * np.log2(V) + m_b
|
||||
|
||||
|
||||
def relax_success(E, S, AVG_DEG):
|
||||
relax_attempts = E
|
||||
relax_success_ratio = (rs_a * np.log(S) + rs_b) * AVG_DEG**rs_c
|
||||
return relax_attempts * relax_success_ratio
|
||||
|
||||
|
||||
def runtime_predict(V, D, S):
|
||||
E = V * (V - 1) * D
|
||||
AVG_DEG = (V - 1) * D
|
||||
if AVG_DEG < 1:
|
||||
return False, False
|
||||
|
||||
runtime = V * l + E * k3(V) + relax_success(E, S, AVG_DEG) * m(V)
|
||||
print(relax_success(E, S, AVG_DEG))
|
||||
# runtime_eq = f"[V * {l}] + [E * {k3_a} * exp(-{k3_b} * V) + {k3_c}] + [E * ({rs_a} * log(S) + {rs_b}) * AVG_DEG ** {rs_c} * {m_a} * log_2(V) + {m_b}]"
|
||||
|
||||
return runtime, relax_success(E, S, AVG_DEG)
|
||||
|
||||
|
||||
l = mean_l()
|
||||
k3_a, k3_b, k3_c = regression_k3()
|
||||
m_a, m_b = regression_m()
|
||||
rs_a, rs_b, rs_c = nonlinear_regression()
|
||||
|
||||
csv_file = "results/real_data/derived/dimacs_graph_distribution/distribution.csv"
|
||||
save_folder = f"results/real_data/derived/{os.path.splitext(os.path.basename(csv_file))[0]}/dimacs_prediction_result"
|
||||
os.makedirs(save_folder, exist_ok=True)
|
||||
|
||||
df = pd.read_csv(csv_file)
|
||||
|
||||
records = []
|
||||
|
||||
for row in df.itertuples():
|
||||
nodes = row.nodes
|
||||
density = row.density
|
||||
sigma = np.sqrt(np.log((row.std / row.mean) ** 2 + 1))
|
||||
|
||||
pred_time, pred_relax_success = runtime_predict(nodes, density, sigma)
|
||||
|
||||
if pred_time is False:
|
||||
continue
|
||||
records.append(
|
||||
{
|
||||
"file": row.file,
|
||||
"nodes": nodes,
|
||||
"density": density,
|
||||
"sigma": sigma,
|
||||
"predict_time": pred_time,
|
||||
"relax_success": pred_relax_success,
|
||||
}
|
||||
)
|
||||
print(f"finished {row.file}")
|
||||
|
||||
result = pd.DataFrame(records)
|
||||
out_path = os.path.join(save_folder, "prediction.csv")
|
||||
result.to_csv(out_path, index=False)
|
||||
print(f"Saved {len(result)} rows → {out_path}")
|
||||
|
||||
|
||||
@@ -102,18 +102,18 @@ def visualize_weights(file):
|
||||
|
||||
folder = "experiments/real_data/data/dimacs_data"
|
||||
files = [
|
||||
# "USA-road-d.BAY.gr",
|
||||
# "USA-road-d.CAL.gr",
|
||||
# "USA-road-d.COL.gr",
|
||||
# "USA-road-d.CTR.gr",
|
||||
# "USA-road-d.E.gr",
|
||||
# "USA-road-d.FLA.gr",
|
||||
# "USA-road-d.LKS.gr",
|
||||
# "USA-road-d.NE.gr",
|
||||
# "USA-road-d.NW.gr",
|
||||
# "USA-road-d.NY.gr",
|
||||
"USA-road-d.BAY.gr",
|
||||
"USA-road-d.CAL.gr",
|
||||
"USA-road-d.COL.gr",
|
||||
"USA-road-d.CTR.gr",
|
||||
"USA-road-d.E.gr",
|
||||
"USA-road-d.FLA.gr",
|
||||
"USA-road-d.LKS.gr",
|
||||
"USA-road-d.NE.gr",
|
||||
"USA-road-d.NW.gr",
|
||||
"USA-road-d.NY.gr",
|
||||
"USA-road-d.USA.gr",
|
||||
# "USA-road-d.W.gr"
|
||||
"USA-road-d.W.gr"
|
||||
]
|
||||
|
||||
res_folder = "results/real_data/derived/dimacs_graph_distribution"
|
||||
|
||||
@@ -1,75 +1,73 @@
|
||||
import os
|
||||
import gc
|
||||
import time
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import random
|
||||
|
||||
from experiments.real_data.graph_converters.dimacs_graph_converter import dimacs_convert_graph
|
||||
from core.dijkstra.heap_dijkstra import heap_dijkstra
|
||||
from core.heaps.binary_heap import BinHeap
|
||||
from core.heaps.fibonacci_heap import FiboHeap
|
||||
|
||||
def done_trials(out_path, file):
|
||||
if not os.path.exists(out_path):
|
||||
return set()
|
||||
df = pd.read_csv(out_path, usecols=["file", "trial"])
|
||||
return set(df[df["file"] == file]["trial"].tolist())
|
||||
|
||||
def run_test(
|
||||
folder,
|
||||
files,
|
||||
trials,
|
||||
base_seed
|
||||
base_seed,
|
||||
out_path,
|
||||
trials=10,
|
||||
):
|
||||
rows = []
|
||||
timer = time.perf_counter
|
||||
rng = np.random.default_rng(base_seed)
|
||||
INF = float('inf')
|
||||
write_header = not os.path.exists(out_path)
|
||||
|
||||
for file in files:
|
||||
completed = done_trials(out_path, file)
|
||||
remaining = [t for t in range(1, trials + 1) if t not in completed]
|
||||
|
||||
if not remaining:
|
||||
print(f"[SKIP] {file} (all {trials} trials done)")
|
||||
continue
|
||||
|
||||
print(f"[LOAD] {file} (completed: {sorted(completed)}, remaining: {remaining})")
|
||||
nodes, adj = dimacs_convert_graph(f'{folder}/{file}')
|
||||
density = len(adj) / (nodes * (nodes - 1))
|
||||
|
||||
for trial in range(1, trials + 1):
|
||||
start, end = rng.choice(nodes, size=2, replace=False) + 1
|
||||
for trial in remaining:
|
||||
print(f" trial {trial}/{trials}")
|
||||
|
||||
random.seed(base_seed + trial)
|
||||
start = random.randint(1, nodes)
|
||||
|
||||
bin_heap = BinHeap(nodes)
|
||||
st = timer()
|
||||
dist, stats = heap_dijkstra(nodes, adj, bin_heap, start, end)
|
||||
stats = heap_dijkstra(nodes, adj, bin_heap, start)
|
||||
et = timer()
|
||||
rows.append(
|
||||
{
|
||||
"file": file,
|
||||
"nodes": nodes,
|
||||
"density": density,
|
||||
"trial": trial,
|
||||
"start": start,
|
||||
"end": end,
|
||||
"time": et - st,
|
||||
"algorithm": "binary",
|
||||
"reached": dist != INF,
|
||||
"extract_min_calls": stats.extract_min_calls,
|
||||
"relax_attempts": stats.relax_attempts,
|
||||
"relax_success": stats.relax_success,
|
||||
}
|
||||
)
|
||||
|
||||
fibo_heap = FiboHeap(nodes)
|
||||
st = timer()
|
||||
dist, stats = heap_dijkstra(nodes, adj, fibo_heap, start, end)
|
||||
et = timer()
|
||||
rows.append(
|
||||
{
|
||||
"file": file,
|
||||
"nodes": nodes,
|
||||
"density": density,
|
||||
"trial": trial,
|
||||
"start": start,
|
||||
"end": end,
|
||||
"time": et - st,
|
||||
"algorithm": "fibonacci",
|
||||
"reached": dist != INF,
|
||||
"extract_min_calls": stats.extract_min_calls,
|
||||
"relax_attempts": stats.relax_attempts,
|
||||
"relax_success": stats.relax_success,
|
||||
}
|
||||
)
|
||||
row = pd.DataFrame([{
|
||||
"file": file,
|
||||
"nodes": nodes,
|
||||
"density": density,
|
||||
"start": start,
|
||||
"time": et - st,
|
||||
"trial": trial,
|
||||
"extract_min_calls": stats.extract_min_calls,
|
||||
"relax_attempts": stats.relax_attempts,
|
||||
"relax_success": stats.relax_success,
|
||||
}])
|
||||
row.to_csv(out_path, mode="a", header=write_header, index=False)
|
||||
write_header = False
|
||||
|
||||
del bin_heap
|
||||
gc.collect()
|
||||
|
||||
del adj
|
||||
gc.collect()
|
||||
print(f"[DONE] {file}")
|
||||
|
||||
df = pd.DataFrame(rows)
|
||||
return df
|
||||
|
||||
# Settings
|
||||
folder = "experiments/real_data/data/dimacs_data"
|
||||
@@ -87,16 +85,15 @@ files = [
|
||||
"USA-road-d.USA.gr",
|
||||
"USA-road-d.W.gr"
|
||||
]
|
||||
trials = 200
|
||||
base_seed = 42
|
||||
|
||||
df = run_test(
|
||||
folder=folder,
|
||||
files=files,
|
||||
trials=trials,
|
||||
base_seed=base_seed
|
||||
)
|
||||
|
||||
save_folder = "results/real_data/raw"
|
||||
os.makedirs(save_folder, exist_ok=True)
|
||||
df.to_csv(f"{save_folder}/dimacs_t{trials}_s{base_seed}.csv", index=False)
|
||||
out_path = f"{save_folder}/dimacs_s{base_seed}.csv"
|
||||
|
||||
run_test(
|
||||
folder=folder,
|
||||
files=files,
|
||||
base_seed=base_seed,
|
||||
out_path=out_path,
|
||||
)
|
||||
Reference in New Issue
Block a user