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}") | |