initial commit

This commit is contained in:
2026-03-02 20:55:36 +09:00
commit f224644b49
86 changed files with 1065250 additions and 0 deletions
@@ -0,0 +1,95 @@
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
def read_dimacs(file):
idx = 0
with open(f"{folder}/{file}", "r") as f:
for line in f:
line = line.strip()
if line.startswith("c"):
continue
elif line.startswith("p"):
_, _, n, e = line.split()
edges = int(e)
data = [0] * edges
elif line.startswith("a"):
_, u, v, w = line.split()
data[idx] = int(w)
idx += 1
return data
def visualize_weights(file):
data = read_dimacs(file)
sample = np.array(data)
save_folder = f"{res_folder}/{file}"
os.makedirs(save_folder, exist_ok=True)
plt.figure(figsize=(8, 5))
plt.hist(sample, bins=100)
plt.title("Edge Weight Distribution (Original Scale)")
plt.xlabel("Weight")
plt.ylabel("Frequency")
plt.tight_layout()
plt.savefig(f"{save_folder}/hist_original.png")
plt.close()
log_sample = np.log(sample[sample > 0])
plt.figure(figsize=(8, 5))
plt.hist(log_sample, bins=100)
plt.title("Log(Weight) Distribution")
plt.xlabel("log(Weight)")
plt.ylabel("Frequency")
plt.tight_layout()
plt.savefig(f"{save_folder}/hist_log.png")
plt.close()
plt.figure(figsize=(8, 5))
plt.hist(log_sample, bins=100, density=True)
plt.title("Log(Weight) Density")
plt.xlabel("log(Weight)")
plt.ylabel("Density")
plt.tight_layout()
plt.savefig(f"{save_folder}/hist_log_density.png")
plt.close()
return {
"file": file,
"edges": len(sample),
"mean": np.mean(sample),
"std": np.std(sample),
"min": np.min(sample),
"max": np.max(sample)
}
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.USA.gr",
"USA-road-d.W.gr"
]
res_folder = "results/real_data/derived/dimacs_graph_distribution"
os.makedirs(res_folder, exist_ok=True)
rows = []
for file in files:
row = visualize_weights(file)
rows.append(row)
df = pd.DataFrame(rows)
df.to_csv(f"{res_folder}/distribution.csv", index=False)
@@ -0,0 +1,21 @@
def dimacs_convert_graph(filename):
with open(filename, 'r') as f:
for line in f:
line = line.strip()
if line.startswith('c'):
continue
elif line.startswith('p'):
_, _, n, e = line.split()
nodes = int(n)
edges = int(e)
adj = [[] for _ in range(nodes + 1)]
elif line.startswith('a'):
_, u, v, w = line.split()
u, v, w = int(u) - 1, int(v) - 1, int(w)
adj[u].append((v, w))
return nodes, adj
@@ -0,0 +1,102 @@
import os
import time
import pandas as pd
import numpy as np
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 run_test(
folder,
files,
trials,
base_seed
):
rows = []
timer = time.perf_counter
rng = np.random.default_rng(base_seed)
INF = float('inf')
for file in files:
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
bin_heap = BinHeap(nodes)
st = timer()
dist, stats = heap_dijkstra(nodes, adj, bin_heap, start, end)
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,
}
)
df = pd.DataFrame(rows)
return df
# Settings
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.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)