File size: 1,936 Bytes
3daa112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from src.data_loader import load_carriers
from src.world_model import MaritimeWorldModel


class TemporalModel:
    def __init__(self, world_model: MaritimeWorldModel):
        self._ports = world_model.get_port_graph()
        self._routes = world_model.get_routes()
        self._carriers = load_carriers()
        self._port_data = {port["id"]: port for _, port in world_model._ports.iterrows()}
        self._route_data = {route["id"]: route for _, route in self._routes.iterrows()}
        self._carrier_data = {carrier["id"]: carrier for _, carrier in self._carriers.iterrows()}

    def get_baseline(self, port_id: str) -> dict:
        if port_id not in self._port_data:
            raise KeyError(f"Port not found: {port_id}")
        port = self._port_data[port_id]
        dwell = int(port["typical_dwell_hours"])
        return {
            "port_id": port_id,
            "typical_dwell_hours": dwell,
            "congestion_baseline": dwell / 72.0,
        }

    def get_delay_distribution(self, route_id: str) -> dict:
        if route_id not in self._route_data:
            raise KeyError(f"Route not found: {route_id}")
        route = self._route_data[route_id]
        transit = int(route["transit_days"])
        return {
            "route_id": route_id,
            "transit_days": transit,
            "delay_std_days": transit * 0.1,
            "on_time_pct": 0.85,
        }

    def get_carrier_pattern(self, carrier_id: str) -> dict:
        if carrier_id not in self._carrier_data:
            raise KeyError(f"Carrier not found: {carrier_id}")
        carrier = self._carrier_data[carrier_id]
        exposures = carrier["chokepoint_exposure"]
        avg_exposure = sum(exposures.values()) / len(exposures) if exposures else 0.0
        return {
            "carrier_id": carrier_id,
            "routes": list(carrier["typical_routes"]),
            "avg_exposure": round(avg_exposure, 4),
        }