import numpy as np
import matplotlib.pyplot as plt
from quantum_states import sample_and_calculate
from tqdm import tqdm

# Define range of dimensions to test
fixed_dim = 64
dimensions = np.arange(2, 64, 2)  # Test dimensions from 2 to 50 in steps of 2
expected_entropies = []
theoretical_entropies = []
predicted_entropies = []

# Calculate entropies for each dimension
for dim in tqdm(dimensions, desc="Calculating entropies"):
    # For each dimension, we'll keep one subsystem fixed at dim=2 
    # and vary the other dimension
    entropies = sample_and_calculate(dim, fixed_dim, n_samples=1000)
    expected_entropies.append(np.mean(entropies))
    theoretical_entropies.append(np.log2(min(dim, fixed_dim)))
    beta = min(dim, fixed_dim)/(2*np.log(2)*max(dim, fixed_dim))
    predicted_entropies.append(np.log2(min(dim, fixed_dim)) - beta)

# Create the plot
plt.figure(figsize=(10, 6))
plt.plot(dimensions, expected_entropies, 'b-', label='Expected Entropy')
plt.plot(dimensions, theoretical_entropies, 'r--', label='Theoretical Entropy')
plt.plot(dimensions, predicted_entropies, 'g--', label='Predicted Entropy')
plt.xlabel('Dimension of Subsystem B')
plt.ylabel('von Neumann Entropy (bits)')
plt.title(f'von Neumann Entropy vs. System Dimension, with Dimension of Subsystem A = {fixed_dim}')
plt.legend()
plt.grid(True)
plt.show()
