from ripser import ripser
from persim import plot_diagrams
import numpy as np
import matplotlib.pyplot as plt

# Generar un círculo con 200 puntos
theta = np.linspace(0, 2*np.pi, 200)
X = np.stack((np.cos(theta), np.sin(theta)), axis=1)

# Calcular la homología persistente
result = ripser(X) #esto calcular homologia persistente sin maxdim y sin thresh (epsilon maximo) y por default los coeficientes son en F_2

# Extraemos el diagrama de persistencia
dgms = result['dgms']




#ahora agregamos ruido gaussiano al círculo
#desplazamos cada uno de los puntos originales en una dirección aleatoria

ruido = 0.1 * np.random.randn(*X.shape)  #0.1 resulta la desviación estándar
X_noisy = X + ruido

resultp=ripser(X_noisy)
dgmp = resultp['dgms'] 



fig, axs = plt.subplots(2, 2, figsize=(11, 8))

# Gráfico de la nube de puntos
axs[0,0].scatter(X_noisy[:, 0], X_noisy[:, 1], s=4, alpha=0.7)
axs[0,0].set_title("Nube de puntos con ruido")
axs[0,0].axis('equal')

# Diagrama de persistencia
plot_diagrams(dgmp, ax=axs[0,1])
axs[0,1].set_title("Diagrama de persistencia con ruido")

axs[1,0].scatter(X[:, 0], X[:, 1], s=4, alpha=0.7)
axs[1,0].set_title("Nube de puntos sin ruido")
axs[1,0].axis('equal')

plot_diagrams(dgms, ax=axs[1,1])
axs[1,1].set_title("diagrama del círculo sin ruido")
plt.tight_layout()
plt.show()