File size: 4,452 Bytes
17b50e6 7663567 88ea10b 19355fa 17b50e6 a370b55 b9941ac 88ea10b b9941ac a370b55 7663567 a370b55 7663567 a370b55 7663567 17b50e6 aa1a460 17b50e6 aa1a460 17b50e6 19355fa 17b50e6 a370b55 88ea10b a370b55 88ea10b a370b55 88ea10b aa1a460 88ea10b a370b55 7724504 17b50e6 a370b55 88ea10b a370b55 88ea10b a370b55 88ea10b a370b55 88ea10b a370b55 88ea10b a370b55 88ea10b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
import torch
import json
import os
import csv
from datetime import datetime
import pandas as pd
import numpy as np
from nets.model import Model
from Actor.actor import Actor
# --- إعداد المسارات ---
safe_data_dir = "/home/user/data"
orders_file = os.path.join(safe_data_dir, "orders.csv")
params_path = os.path.join(safe_data_dir, 'params_saved.json')
model_path = os.path.join(safe_data_dir, "model_state_dict.pt")
txt_results_file = os.path.join(safe_data_dir, "inference_results.txt")
csv_results_file = os.path.join(safe_data_dir, "inference_results.csv")
# --- التحقق من الملفات ---
if not os.path.exists(params_path):
raise FileNotFoundError(f"Settings file not found at {params_path}")
if not os.path.exists(model_path):
raise FileNotFoundError(f"Model not found at {model_path}")
if not os.path.exists(orders_file):
raise FileNotFoundError(f"orders.csv not found at {orders_file}")
# --- تحميل الإعدادات ---
with open(params_path, 'r') as f:
params = json.load(f)
device = params['device']
# --- تحميل النموذج بعد ضبط input_size = 4 ---
model = Model(
input_size = 4,
embedding_size=params["embedding_size"],
decoder_input_size=params["decoder_input_size"]
)
model.load_state_dict(torch.load(model_path, map_location=device))
model.eval()
# --- قراءة بيانات الطلبات ---
df = pd.read_csv(orders_file)
# --- استخراج الإحداثيات ---
pickup_lng = df['lng'].to_numpy()
pickup_lat = df['lat'].to_numpy()
delivery_lng = df['delivery_gps_lng'].to_numpy()
delivery_lat = df['delivery_gps_lat'].to_numpy()
coords = np.stack([pickup_lng, pickup_lat, delivery_lng, delivery_lat], axis=1)
coords_tensor = torch.tensor(coords, dtype=torch.float32).unsqueeze(0).to(device)
# --- تجهيز Batch كـ Tuple لتجنب unpacking error في Actor ---
graph_data = {"coords": coords_tensor}
fleet_data = {"dummy": torch.tensor([0])} # يمكن تعديل هذا لاحقاً عند الحاجة
batch = (graph_data, fleet_data)
# --- تهيئة الممثل والـ NN ---
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
)
nn_actor = Actor(model=None, num_movers=1, num_neighbors_action=1, device=device)
nn_actor.nearest_neighbors()
# --- تنفيذ الاستدلال ---
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")
# --- عرض ملخص الإدخالات ---
coords_preview = "\n".join([
f"Order {i}: P=({lng1:.4f},{lat1:.4f}) → D=({lng2:.4f},{lat2:.4f})"
for i, (lng1, lat1, lng2, lat2) in enumerate(coords[:5])
])
if coords.shape[0] > 5:
coords_preview += f"\n... (showing 5 of {coords.shape[0]} orders)"
input_summary = f"📌 Input Orders Preview:\n{coords_preview}"
# --- نتيجة مفصلة للطباعة ---
result_text = (
"\n===== INFERENCE RESULT =====\n"
f"Time: {timestamp}\n"
f"Actor Model Total Cost: {total_time:.4f} units\n"
f"Nearest Neighbor Cost : {nn_time:.4f} units\n"
f"Improvement over NN : {improvement:.2f}%\n"
)
print(result_text)
# --- ملخص للواجهة ---
summary_text = (
f"🕒 Time: {timestamp}\n"
f"🚚 Actor Cost: {total_time:.4f} units\n"
f"📍 NN Cost: {nn_time:.4f} units\n"
f"📈 Improvement: {improvement:.2f}%\n\n"
f"{input_summary}"
)
print(f"\n🔍 Summary for UI:\n{summary_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(result_text)
f.write("\n=============================\n")
|