149 lines
4.7 KiB
Python
149 lines
4.7 KiB
Python
import time
|
|
import pandas as pd
|
|
import numpy as np
|
|
from tqdm import tqdm
|
|
import datetime
|
|
import json
|
|
import os
|
|
|
|
from experiments.synthetic_data.graph_generators.outdegree_graph_generator import outdegree_generate_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(
|
|
nodes_li,
|
|
densities,
|
|
stds,
|
|
trials,
|
|
mean_dist,
|
|
start,
|
|
end,
|
|
base_seed
|
|
):
|
|
timer = time.perf_counter
|
|
file_exists = False
|
|
INF = float('inf')
|
|
|
|
total_jobs = (
|
|
len(nodes_li) *
|
|
len(densities) *
|
|
len(stds) *
|
|
trials
|
|
)
|
|
|
|
with tqdm(total=total_jobs) as pbar:
|
|
for nodes in nodes_li:
|
|
rows = []
|
|
|
|
for density in densities:
|
|
for std in stds:
|
|
sigma = np.sqrt(np.log((std / mean_dist)**2 + 1))
|
|
mu = np.log(mean_dist) - (sigma**2) / 2
|
|
distribution = ('lognormal', (mu, sigma))
|
|
|
|
for trial in range(1, trials + 1):
|
|
seed = (base_seed * 1_000_003) ^ (nodes * 9176) ^ int(density * 1e9) ^ int(sigma * 1e6) ^ trial
|
|
seed &= 0xFFFFFFFF
|
|
|
|
adj = outdegree_generate_graph(
|
|
NODES=nodes,
|
|
DENSITY=density,
|
|
DISTRIBUTION=distribution,
|
|
SEED=seed
|
|
)
|
|
|
|
bin_heap = BinHeap(nodes)
|
|
st = timer()
|
|
dist, stats = heap_dijkstra(nodes, adj, bin_heap, start, end)
|
|
et = timer()
|
|
rows.append(
|
|
{
|
|
"nodes": nodes,
|
|
"density": density,
|
|
"std": std,
|
|
"sigma": sigma,
|
|
"trial": trial,
|
|
"seed": seed,
|
|
"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(
|
|
{
|
|
"nodes": nodes,
|
|
"density": density,
|
|
"std": std,
|
|
"sigma": sigma,
|
|
"trial": trial,
|
|
"seed": seed,
|
|
"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,
|
|
}
|
|
)
|
|
|
|
pbar.update(1)
|
|
|
|
df_nodes = pd.DataFrame(rows)
|
|
df_nodes.to_csv(
|
|
csv_file,
|
|
mode='a',
|
|
header=not file_exists,
|
|
index=False
|
|
)
|
|
file_exists = True
|
|
print(f"=== SAVED nodes = {nodes} ({len(df_nodes)} rows) ===")
|
|
return
|
|
|
|
# Settings
|
|
nodes_li = [2000, 4000, 8000, 16000]
|
|
densities = [0.00015, 0.0003, 0.0006, 0.0012, 0.0024, 0.0048, 0.0096, 0.0192, 0.0384]
|
|
stds = [1000, 1500, 2000, 3000, 4000, 6000, 8000, 12000, 16000]
|
|
trials = 400
|
|
mean_dist = 3000
|
|
start = 0
|
|
end = 1
|
|
base_seed = 42
|
|
|
|
save_folder = "results/synthetic_data/raw"
|
|
os.makedirs(save_folder, exist_ok=True)
|
|
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
csv_file = f"{save_folder}/{timestamp}.csv"
|
|
config_file = f"{save_folder}/{timestamp}.json"
|
|
|
|
config = {
|
|
"nodes_li": nodes_li,
|
|
"densities": densities,
|
|
"stds": stds,
|
|
"trials": trials,
|
|
"mean_dist": mean_dist,
|
|
"start": start,
|
|
"end": end,
|
|
"base_seed": base_seed,
|
|
}
|
|
with open(config_file, "w") as f:
|
|
json.dump(config, f, indent=4)
|
|
|
|
df = run_test(
|
|
nodes_li = nodes_li,
|
|
densities = densities,
|
|
stds = stds,
|
|
trials = trials,
|
|
mean_dist = mean_dist,
|
|
start = start,
|
|
end = end,
|
|
base_seed = base_seed
|
|
) |