---
title: Blackbox MCMC Testing
format:
    html:
        copy-code: true
        embed-resources: true
fig-responsive: true
fig-width: 8
---

```{python}
from blackbox import mystery
import numpy as np
import matplotlib.pyplot as plt

plt.style.use(['seaborn-v0_8-darkgrid', 'seaborn-v0_8-poster'])
```

Making sure initially that we can plot the mystery function:
```{python}
xs = np.linspace(-30,30, 1000)
plt.plot(xs, mystery(xs), '.')
plt.show()
```

Setting up our sampler:

```{python}
def mcmc_sampler(func, start, step_size, num_steps):
    samples = [start]
    accepted = 1
    while len(samples) < num_steps:
        current = samples[-1]
        proposed = np.random.normal(current, step_size)
        ratio = func(proposed) / func(current)
        if ratio > np.random.uniform(0,1):
            samples.append(proposed)
            accepted += 1
        else:
            samples.append(current)
    return samples, accepted / len(samples)
```

Running the sampler
```{python}
samples, accept_rate = mcmc_sampler(mystery, -20, .5, 50000)
accept_rate
```

Looking at the trace plot:
```{python}
plt.figure(figsize=(16,9))
plt.plot(samples[:2000])
plt.xlabel('Iterations')
plt.ylabel('x')
plt.savefig('mcmc_trace.png', facecolor='#ffffff00')
plt.show()
```

Looking at the lag plot:
```{python}
burned = samples[1000:]
plt.figure(figsize=(16,9))
plt.plot(burned[:-1], burned[1:], '.', alpha=0.1)
plt.xlabel(r"$x_{j}$")
plt.ylabel(r"$x_{j+1}$")
plt.savefig('mcmc_lag.png', facecolor='#ffffff00')
plt.show()
```

And looking at the overall histogram:
```{python}
plt.hist(burned, bins=200)
plt.xlabel('x')
plt.ylabel('Counts')
plt.show()
```
