Spaces:
Runtime error
Runtime error
import torch | |
from torch.utils.data import DataLoader | |
import json | |
import os | |
import csv | |
from datetime import datetime | |
from nets.model import Model | |
from Actor.actor import Actor | |
from dataloader import VRP_Dataset | |
# --- تحميل الإعدادات --- | |
params_path = '/data/params_saved.json' | |
if not os.path.exists(params_path): | |
raise FileNotFoundError(f"Settings file not found at {params_path}") | |
with open(params_path, 'r') as f: | |
params = json.load(f) | |
# --- تعيين الجهاز --- | |
device = params['device'] | |
dataset_path = params['dataset_path'] | |
# --- مسار النموذج المحفوظ --- | |
model_path = "/data/model_state_dict.pt" | |
if not os.path.exists(model_path): | |
raise FileNotFoundError(f"Model not found at {model_path}") | |
# --- تحضير مجلد النتائج --- | |
os.makedirs("/data", exist_ok=True) | |
txt_results_file = "/data/inference_results.txt" | |
csv_results_file = "/data/inference_results.csv" | |
# --- إعداد بيانات inference --- | |
inference_dataset = VRP_Dataset( | |
size=1, | |
num_nodes=params['num_nodes'], | |
num_depots=params['num_depots'], | |
path=dataset_path, | |
device=device | |
) | |
input_size = inference_dataset.model_input_length() | |
# --- تحميل النموذج --- | |
model = Model( | |
input_size=input_size, | |
embedding_size=params["embedding_size"], | |
decoder_input_size=params["decoder_input_size"] | |
) | |
model.load_state_dict(torch.load(model_path, map_location=device)) | |
# --- تهيئة الممثل والـ NN Actor --- | |
actor = Actor(model=model, | |
num_movers=params['num_movers'], | |
num_neighbors_encoder=params['num_neighbors_encoder'], | |
num_neighbors_action=params['num_neighbors_action'], | |
device=device, | |
normalize=False) | |
actor.eval_mode() | |
nn_actor = Actor(model=None, num_movers=1, num_neighbors_action=1, device=device) | |
nn_actor.nearest_neighbors() | |
# --- استدلال وتخزين النتائج --- | |
dataloader = DataLoader(inference_dataset, batch_size=1, collate_fn=inference_dataset.collate) | |
output_lines = [] | |
for batch in dataloader: | |
with torch.no_grad(): | |
actor.greedy_search() | |
actor_output = actor(batch) | |
total_time = actor_output['total_time'].item() | |
nn_output = nn_actor(batch) | |
nn_time = nn_output['total_time'].item() | |
improvement = (nn_time - total_time) / nn_time * 100 | |
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") | |
result_text = ( | |
"\n===== INFERENCE RESULT =====\n" | |
f"Time: {timestamp}\n" | |
f"Actor Model Total Cost: {total_time:.4f}\n" | |
f"Nearest Neighbor Cost : {nn_time:.4f}\n" | |
f"Improvement over NN : {improvement:.2f}%\n" | |
) | |
print(result_text) | |
output_lines.append(result_text) | |
# حفظ النتائج إلى CSV | |
write_header = not os.path.exists(csv_results_file) | |
with open(csv_results_file, 'a', newline='') as csvfile: | |
writer = csv.writer(csvfile) | |
if write_header: | |
writer.writerow(["Timestamp", "Actor Cost", "NN Cost", "Improvement (%)"]) | |
writer.writerow([timestamp, f"{total_time:.4f}", f"{nn_time:.4f}", f"{improvement:.2f}"]) | |
# --- حفظ النتائج إلى ملف نصي --- | |
with open(txt_results_file, 'a') as f: | |
f.write("\n".join(output_lines)) | |
f.write("\n=============================\n") | |
print(f"\n✅ Results saved to:\n- {txt_results_file}\n- {csv_results_file}") | |