# Re-import necessary libraries after execution state reset
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)

# Parameters for a single Poisson process
lambda_single = 1.0  # Intensity
T_max_single = 10  # Maximum time

# Generate Poisson process arrivals
arrival_times = []
inter_arrivals = []
t = 0
while t < T_max_single:
    interarrival = np.random.exponential(1 / lambda_single)
    inter_arrivals.append(interarrival)
    t += interarrival
    if t < T_max_single:
        arrival_times.append(t)

# Compute cumulative sum for inter-arrival times (just for visualization)
arrival_steps = np.insert(arrival_times, 0, 0)
inter_arrival_steps = np.insert(inter_arrivals, 0, 0)

# Create figure
fig, ax = plt.subplots(figsize=(8, 5))

# Plot Poisson process
ax.step(arrival_steps, np.arange(len(arrival_steps)), where="post", label="Poisson Process", linewidth=2)

# Plot interarrival times as horizontal lines
for i in range(1, len(arrival_steps)):
    ax.plot([arrival_steps[i-1], arrival_steps[i]], [i-1, i-1], 'r--', alpha=0.6)

# Annotations for interarrival times
for i in range(1, len(arrival_steps)):
    ax.text((arrival_steps[i-1] + arrival_steps[i]) / 2, i-1 + 0.2, 
            f"{inter_arrival_steps[i]:.2f}", fontsize=10, color='red', rotation=90)

# Labels and title
ax.set_xlabel("$t$")
ax.set_ylabel("$N_t$")
# ax.set_title(f"Poisson Process (λ={lambda_single}) with Inter-Arrival Times")
#ax.legend()
ax.grid(True)

if True:
    plt.savefig("poisson-process.png", dpi=300)

# Show plot
plt.show()
