import numpy as np
import matplotlib.pyplot as plt
import statsmodels.graphics.tsaplots as sm
import seaborn as sns; sns.set(color_codes=True)# Defines the pdf 
sns.set(font_scale=2) #fontsize in plots
sns.set_style("white")

np.random.seed(42)

def f(x,x0,gamma=1):
    return np.exp(-gamma*(x**2-x0)**2 )

#defines the metropolis-hastings routine
def MH(sigma,x0):
    N=10000
    X=np.zeros(N)
    X[0]=0;
    px=f(X[0],x0)
    
    for i in range(N-1):
        y=X[i]+sigma*np.random.standard_normal(1)
        py=f(y,x0)
        px=f(X[i],x0)
        if py/px > np.random.random(1):
            X[i+1]=y
        else:
            X[i+1]=X[i]

    plt.plot(X)
    plt.gca().set_rasterized(True) 
    plt.title('Trace plots x0='+str(x0)+' $\sigma$='+str(sigma))
    plt.show()
    
    sm.plot_acf(X,lags=100)
    plt.gca().set_rasterized(True) 
    plt.title('ACF x0='+str(x0)+' $\sigma$='+str(sigma))
    plt.show()
    
    sns.kdeplot(X, shade=True, color="r")
    plt.gca().set_rasterized(True) 
    plt.title('KDE x0='+str(x0)+' $\sigma$='+str(sigma))
    plt.show()

    return X

## Runs experiments 
xx=np.array([1,25])
ss=np.array([1,4,10,16] )

for i in range(len(xx)):
    for j in range(len(ss)):
        MH(ss[j],xx[i])
