import datetime as dt
import io
import logging
import random
import wave
import folium
import networkx as nx
import numpy as np
import pandas as pd
import streamlit as st
from folium.plugins import AntPath
from geopy.distance import geodesic
from streamlit_folium import st_folium
logging.basicConfig(level=logging.INFO, format="%(levelname)s:%(message)s")
SANTA = "\U0001F385"
SNOWFLAKE = "\u2744\ufe0f"
SPARKLES = "\u2728"
GIFT = "\U0001F381"
st.set_page_config(
page_title="Quantum Santa's Path Optimizer",
page_icon=SANTA,
layout="wide",
initial_sidebar_state="expanded",
)
CITY_DATA = [
{"name": "North Pole", "lat": 90.0, "lon": 0.0, "tz": 0.0, "icon": SNOWFLAKE, "base_risk": 0.05},
{"name": "New York", "lat": 40.7128, "lon": -74.0060, "tz": -5.0, "icon": "\U0001F5FD", "base_risk": 0.30},
{"name": "London", "lat": 51.5074, "lon": -0.1278, "tz": 0.0, "icon": "\U0001F3F0", "base_risk": 0.25},
{"name": "Tokyo", "lat": 35.6762, "lon": 139.6503, "tz": 9.0, "icon": "\U0001F5FC", "base_risk": 0.35},
{"name": "Sydney", "lat": -33.8688, "lon": 151.2093, "tz": 10.0, "icon": "\U0001F998", "base_risk": 0.20},
{"name": "Paris", "lat": 48.8566, "lon": 2.3522, "tz": 1.0, "icon": "\U0001F950", "base_risk": 0.28},
{"name": "Cairo", "lat": 30.0444, "lon": 31.2357, "tz": 2.0, "icon": "\U0001F9FF", "base_risk": 0.32},
{"name": "Rio de Janeiro", "lat": -22.9068, "lon": -43.1729, "tz": -3.0, "icon": "\U0001F334", "base_risk": 0.33},
{"name": "Cape Town", "lat": -33.9249, "lon": 18.4241, "tz": 2.0, "icon": "\U0001F427", "base_risk": 0.22},
{"name": "Moscow", "lat": 55.7558, "lon": 37.6176, "tz": 3.0, "icon": "\U0001F9CA", "base_risk": 0.27},
{"name": "Mumbai", "lat": 19.0760, "lon": 72.8777, "tz": 5.5, "icon": "\U0001F54C", "base_risk": 0.38},
{"name": "Singapore", "lat": 1.3521, "lon": 103.8198, "tz": 8.0, "icon": "\U0001F981", "base_risk": 0.31},
{"name": "Los Angeles", "lat": 34.0522, "lon": -118.2437, "tz": -8.0, "icon": "\U0001F3AC", "base_risk": 0.29},
{"name": "Mexico City", "lat": 19.4326, "lon": -99.1332, "tz": -6.0, "icon": "\U0001F32E", "base_risk": 0.34},
{"name": "Toronto", "lat": 43.6532, "lon": -79.3832, "tz": -5.0, "icon": "\U0001F341", "base_risk": 0.26},
]
def build_city_df():
return pd.DataFrame(CITY_DATA).set_index("name")
def distance_km(city_a, city_b):
return geodesic((city_a["lat"], city_a["lon"]), (city_b["lat"], city_b["lon"])).km
def build_distance_matrix(city_df):
names = list(city_df.index)
n = len(names)
dist = np.zeros((n, n))
for i in range(n):
for j in range(i + 1, n):
d = distance_km(city_df.loc[names[i]], city_df.loc[names[j]])
dist[i, j] = d
dist[j, i] = d
return dist, names
def route_length(route, dist):
total = 0.0
for i in range(len(route) - 1):
total += dist[route[i], route[i + 1]]
return total
def nearest_neighbor_route(dist):
n = dist.shape[0]
unvisited = set(range(1, n))
route = [0]
while unvisited:
last = route[-1]
next_city = min(unvisited, key=lambda x: dist[last, x])
route.append(next_city)
unvisited.remove(next_city)
route.append(0)
return route
def christofides_route(dist):
n = dist.shape[0]
g = nx.Graph()
for i in range(n):
for j in range(i + 1, n):
g.add_edge(i, j, weight=dist[i, j])
cycle = nx.algorithms.approximation.traveling_salesman_problem(
g,
weight="weight",
cycle=True,
method=nx.algorithms.approximation.christofides,
)
return rotate_cycle_start(cycle, 0)
def rotate_cycle_start(route, start_index):
if route[0] == start_index and route[-1] == start_index:
return route
if start_index in route:
idx = route.index(start_index)
rotated = route[idx:] + route[1:idx + 1]
if rotated[0] != start_index:
rotated = [start_index] + rotated
if rotated[-1] != start_index:
rotated.append(start_index)
return rotated
return [start_index] + route + [start_index]
def compute_arrivals(route, city_df, dist, start_dt, speed_kmph):
arrivals = []
elapsed_hours = 0.0
names = list(city_df.index)
for idx, city_idx in enumerate(route):
city_name = names[city_idx]
city = city_df.loc[city_name]
arrival_utc = start_dt + dt.timedelta(hours=elapsed_hours)
local_time = arrival_utc + dt.timedelta(hours=city["tz"])
arrivals.append(
{
"city": city_name,
"order": idx + 1,
"arrival_utc": arrival_utc,
"local_time": local_time,
}
)
if idx < len(route) - 1:
leg_km = dist[route[idx], route[idx + 1]]
elapsed_hours += leg_km / speed_kmph
return arrivals
def predict_awake_probability(base_prob, hour):
if 23 <= hour or hour < 5:
time_factor = 0.3
elif 5 <= hour < 8:
time_factor = 0.7
elif 8 <= hour < 18:
time_factor = 1.2
else:
time_factor = 0.8
return min(0.95, base_prob * time_factor)
def compute_route_metrics(route, city_df, dist, start_dt, speed_kmph):
arrivals = compute_arrivals(route, city_df, dist, start_dt, speed_kmph)
risks = []
for item in arrivals:
city = city_df.loc[item["city"]]
hour = item["local_time"].hour
risk = predict_awake_probability(city["base_risk"], hour)
item["risk"] = risk
risks.append(risk)
total_distance = route_length(route, dist)
avg_risk = float(np.mean(risks)) if risks else 0.0
return total_distance, avg_risk, arrivals
def route_edge_similarity(route_a, route_b):
edges_a = {(route_a[i], route_a[i + 1]) for i in range(len(route_a) - 1)}
edges_b = {(route_b[i], route_b[i + 1]) for i in range(len(route_b) - 1)}
if not edges_a:
return 0.0
return len(edges_a & edges_b) / len(edges_a)
def quantum_inspired_tsp(dist, start_dt, strength, city_df, speed_kmph):
base_route = nearest_neighbor_route(dist)
candidates = [base_route]
rng = np.random.default_rng()
num_candidates = int(10 + 20 * strength)
for _ in range(num_candidates):
perm = base_route[1:-1]
perm = perm.copy()
swaps = max(1, int(strength * len(perm)))
for _ in range(swaps):
i, j = rng.integers(0, len(perm), size=2)
perm[i], perm[j] = perm[j], perm[i]
candidate = [0] + perm + [0]
candidates.append(candidate)
costs = []
for route in candidates:
dist_km, avg_risk, _ = compute_route_metrics(route, city_df, dist, start_dt, speed_kmph)
costs.append(dist_km * (1.0 + avg_risk))
best_idx = int(np.argmin(costs))
worst_idx = int(np.argmax(costs))
best_route = candidates[best_idx]
worst_route = candidates[worst_idx]
amplitudes = []
for route, cost in zip(candidates, costs):
weight = 1.0 / (1.0 + cost)
sim_best = route_edge_similarity(route, best_route)
sim_worst = route_edge_similarity(route, worst_route)
interference = (1.0 + 0.5 * sim_best) * (1.0 - 0.3 * sim_worst * strength)
amplitudes.append(max(1e-6, weight * interference))
amplitudes = np.array(amplitudes)
amplitudes = amplitudes / amplitudes.sum()
if random.random() < 0.25 * strength:
worse_pool = np.argsort(costs)[-max(2, len(candidates) // 4):]
pick = int(rng.choice(worse_pool))
return candidates[pick]
pick = int(rng.choice(len(candidates), p=amplitudes))
return candidates[pick]
def build_map(city_df, route, arrivals):
names = list(city_df.index)
map_center = [city_df["lat"].mean(), city_df["lon"].mean()]
fmap = folium.Map(location=map_center, zoom_start=1, tiles="CartoDB dark_matter")
risk_lookup = {item["city"]: item["risk"] for item in arrivals}
coords = []
for order, city_idx in enumerate(route):
city_name = names[city_idx]
city = city_df.loc[city_name]
coords.append((city["lat"], city["lon"]))
risk = risk_lookup.get(city_name, 0.0)
color = "#2ecc71" if risk < 0.2 else "#f1c40f" if risk < 0.5 else "#e74c3c"
popup = (
f"{order + 1}. {city_name}
"
f"Local time: {arrivals[order]['local_time'].strftime('%H:%M')}
"
f"Awake risk: {risk:.0%}"
)
folium.CircleMarker(
location=(city["lat"], city["lon"]),
radius=7,
color=color,
fill=True,
fill_color=color,
popup=popup,
).add_to(fmap)
folium.PolyLine(coords, weight=3, color="#d4af37", opacity=0.9).add_to(fmap)
AntPath(coords, color="#e6f1ff", weight=2, delay=800).add_to(fmap)
return fmap
def santa_summary(route, city_df, total_distance, avg_risk):
names = list(city_df.index)
path = " -> ".join(names[i] for i in route)
return f"Route: {path}\nDistance: {total_distance:.1f} km\nAvg awake risk: {avg_risk:.0%}"
def render_quantum_cards():
cards = [
("Superposition", "Explore many candidate routes at once to mimic quantum states."),
("Tunneling", "Occasionally accept worse routes to escape local minima."),
("Interference", "Reinforce good paths and dampen weak ones via similarity weighting."),
]
cols = st.columns(3)
for col, (title, body) in zip(cols, cards):
with col:
st.markdown(
f"""
{body}
{total_distance:.0f} km
{avg_risk:.0%}
{elapsed:.2f} s