{ "cells": [ { "cell_type": "markdown", "id": "75ef17c2", "metadata": {}, "source": [ "# Installation + Quickstart\n", "\n", "To install alabi, clone it from the git repo:\n", "```bash\n", "git clone https://github.com/jbirky/alabi\n", "cd alabi\n", "python setup.py install\n", "```" ] }, { "cell_type": "markdown", "id": "70d9a98a", "metadata": {}, "source": [ "### Step 1\n", "\n", "Import python modules:" ] }, { "cell_type": "code", "execution_count": 1, "id": "837133d5", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from alabi.core import SurrogateModel\n", "\n", "from matplotlib import rcParams\n", "# rcParams['font.family'] = 'serif'\n", "# rcParams['text.usetex'] = True\n", "\n", "random_state = 7\n", "np.random.seed(random_state)" ] }, { "cell_type": "markdown", "id": "9430b5dc", "metadata": {}, "source": [ "### Step 2\n", "\n", "Define the test function and the bounds for the input space. For example:" ] }, { "cell_type": "code", "execution_count": 2, "id": "cb7178a1", "metadata": {}, "outputs": [], "source": [ "def test1d_fn(x):\n", " return np.sin(5 * x) * (1 - np.tanh(x**2))\n", "\n", "bounds = [(-1, 1)]" ] }, { "cell_type": "markdown", "id": "138bb986", "metadata": {}, "source": [ "### Step 3\n", "\n", "Initialize the surrogate model, specifying the function to train on, the bounds of the input space, and directory where the results will be saved:" ] }, { "cell_type": "code", "execution_count": 3, "id": "133ebc9f", "metadata": {}, "outputs": [], "source": [ "sm = SurrogateModel(lnlike_fn=test1d_fn, bounds=bounds, savedir=f\"results/test1d\", random_state=random_state)" ] }, { "cell_type": "markdown", "id": "838a4347", "metadata": {}, "source": [ "### Step 4\n", "\n", "Initialize the gaussian process surrogate model by specifying a kernel. In this example we'll use a squared exponential kernel:\n", "\n", "$ k(x, x') = \\sigma_f^2 \\exp\\left(-\\frac{(x - x')^2}{2\\ell^2}\\right) $\n", "\n", "where $ k(x, x') $ is the kernel function, $ \\sigma_f^2 $ is the amplitude hyperparameter, $ \\ell $ is the length scale hyperparameter, and $ x $ and $ x' $ are input points." ] }, { "cell_type": "code", "execution_count": 4, "id": "f0527174", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initialized GP with squared exponential kernel.\n", "Successfully initialized GP on attempt 1\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Optimizing GP: 100%|██████████| 3/3 [00:00<00:00, 54.26it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Initial -logL: \t 0.5847 | \t Regularization: 1.6234 | \t Total: 2.2081\n", "Final -logL: \t -8.6579 | \t Regularization: 1.3110 | \t Total: -7.3469 \n", "13 iterations | Success: True | Message: CONVERGENCE: RELATIVE REDUCTION OF F <= FACTR*EPSMCH \n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "sm.init_samples(ntrain=10)\n", "sm.init_gp(kernel=\"ExpSquaredKernel\", fit_amp=True, fit_mean=True, hyperopt_method=\"ml\", overwrite=True)" ] }, { "cell_type": "markdown", "id": "15dc17ee", "metadata": {}, "source": [ "### Step 5\n", "\n", "Improve the surrogate model fit by iteratively selecting new training points using active learning:" ] }, { "cell_type": "code", "execution_count": 5, "id": "e668f854", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running 30 active learning iterations using bape...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Optimizing GP: 100%|██████████| 3/3 [00:00<00:00, 53.97it/s]\n", " 33%|███▎ | 10/30 [00:00<00:00, 72.83it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Initial -logL: \t -57.3958 | \t Regularization: 1.3110 | \t Total: -56.0848\n", "Final -logL: \t -59.0394 | \t Regularization: 1.3352 | \t Total: -57.7042 \n", "18 iterations | Success: True | Message: CONVERGENCE: RELATIVE REDUCTION OF F <= FACTR*EPSMCH \n", "\n", "Train MSE: 9.298666599099183e-10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Optimizing GP: 100%|██████████| 3/3 [00:00<00:00, 60.86it/s]\n", " 67%|██████▋ | 20/30 [00:00<00:00, 75.69it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Initial -logL: \t -121.3295 | \t Regularization: 1.3352 | \t Total: -119.9943\n", "Final -logL: \t -121.3499 | \t Regularization: 1.3367 | \t Total: -120.0132 \n", "17 iterations | Success: True | Message: CONVERGENCE: RELATIVE REDUCTION OF F <= FACTR*EPSMCH \n", "\n", "Train MSE: 2.79227309296412e-09\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Optimizing GP: 100%|██████████| 3/3 [00:00<00:00, 4.29it/s]\n", "100%|██████████| 30/30 [00:02<00:00, 13.53it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Initial -logL: \t -185.4210 | \t Regularization: 1.3367 | \t Total: -184.0843\n", "Final -logL: \t -185.4270 | \t Regularization: 1.3376 | \t Total: -184.0893 \n", "6 iterations | Success: True | Message: CONVERGENCE: RELATIVE REDUCTION OF F <= FACTR*EPSMCH \n", "\n", "Train MSE: 2.5884057559963692e-09\n", "Caching model to results/test1d/surrogate_model...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "sm.active_train(niter=30, algorithm=\"bape\", gp_opt_freq=10)" ] }, { "cell_type": "markdown", "id": "53d46dec", "metadata": {}, "source": [ "### Step 6\n", "\n", "Run Markov Chain Monte Carlo (MCMC) sampler using either the `emcee` package:" ] }, { "cell_type": "code", "execution_count": 6, "id": "dbc58b2f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initializing emcee with self.surrogate_log_likelihood surrogate model as likelihood.\n", "No prior_fn specified. Defaulting to uniform prior with bounds [[-1 1]]\n", "Running emcee with 4 walkers for 50000 steps on 1 cores...\n", "\n", "Run 1: Need 10000 more samples...\n", "==================================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 50000/50000 [00:51<00:00, 973.36it/s] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "burn-in estimate: 118\n", "thin estimate: 29\n", "\n", "Run 1 complete: 6880 samples\n", "Total accumulated samples: 6880\n", "\n", "Run 2: Need 3120 more samples...\n", "==================================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 50000/50000 [00:50<00:00, 981.16it/s] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "burn-in estimate: 105\n", "thin estimate: 26\n", "\n", "Run 2 complete: 7676 samples\n", "Total accumulated samples: 14556\n", "\n", "Combined 2 runs into 14556 total samples\n", "Total samples: 14556\n", "Mean acceptance fraction: 0.694\n", "Mean autocorrelation time: 52.681 steps\n", "Caching model to results/test1d/surrogate_model...\n", "Saving final emcee samples to results/test1d/emcee_samples_final_surrogate_iter_30.npz ...\n" ] } ], "source": [ "sm.run_emcee(nwalkers=4, nsteps=int(5e4))" ] }, { "cell_type": "code", "execution_count": 7, "id": "ea769d83", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initializing dynesty with self.surrogate_log_likelihood surrogate model as likelihood.\n", "Initialized dynesty DynamicNestedSampler.\n", "Running dynesty with 50 live points on 1 cores...\n", "\n", "Run 1: Need 10000 more samples...\n", "==================================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "10103it [00:09, 1057.98it/s, batch: 78 | bound: 0 | nc: 1 | ncall: 22538 | eff(%): 44.827 | loglstar: -inf < 0.909 < 0.295 | logz: 0.127 +/- 0.022 | stop: 0.999]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Run 1 complete: 10103 samples, logZ = 0.127\n", "Total accumulated samples: 10103\n", "Caching model to results/test1d/surrogate_model...\n", "Saved dynesty samples to results/test1d/dynesty_samples_final_surrogate_iter_30.npz\n" ] } ], "source": [ "sm.run_dynesty()" ] }, { "cell_type": "code", "execution_count": 8, "id": "d372e98f", "metadata": {}, "outputs": [ { "data": { "image/png": "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Ez755BNMnz4dH374IWc4psBlrAaKxgFt9jvUHz//05dffon6+nokJydj3Lhxdl9LRIEr4JObtrY288yW7e3tSEpKwqJFi6BUKqUOzSWZmZmIj4/H1KlTsWbNGlx99dX46KOPesyMbFJtaMaxAz0XEuwuvk8k19oh39R0uCuxmb4ESBpus9jx8z999dVXAIDJkydzVuIAtm3bNixevBizZs3C0PiA/xijXgjo34pDhw5h6tSp+OabbwAA06dPx+LFi80diP3NxIkTsXbtWkyePBnl5eWYMmUKPv30U/Tp08dcpn9MBADg+Q178OP6Vrv7i4kIg/b+CUxwyHclDe+a68mGY2I9avB3Ev/oo49CqVT2GGVIgeXtt9/GO++8g9bWVjw9fy6Av5ooaxzUxPdycWTyPwGd3MTHxyMiIgKCIKCoqAjXXXcdQkKsL2/gLyZMmID169fjyiuvxKZNm7B69WpkZWWZn0/u29UXZ+GMron/bNl3sBH3luxA3dFWJjcUMEJCQjBixAipwyAPmzNnDl5//XWsXLkS9957FwaLUUjZdA+wycELI2KB3G+Z4ASBgEtuGhoaEBkZiejoaISHh+P999+HKIo46aSTpA7NbS644AKUl5fjm2++sUhsuksd0BcY7J6h8kREviQtLQ3nnHMOvvvuO6xc/wXmtSzA29fJu/7u2VK7F1gxp6vJk8lNwAuoutuKigqcc845ePDBB83bUlJSAiqxMTn33HNx9913m39ubW3tsVI5UTCZMmUKsrKysGfPHqlDIS8wLaD54ftv44CY2FVT/ddyNVYfdvpuUeAJiORGFEW89NJLuOCCC6DX6/Hxxx+joaFB6rC85tChQ7jkkkugVqv/3li7F6jZYfMRXbsTg1ErRbhEbldnOIy1a9eitLQUMTFsZg0G119/PWJiYlC192e0HNgtdTjkY/y+Waq+4QimTZuGTz75BEDXqKIlS5agf//+EkfmPatWrcK2bduwbds2nJLcD9kRsV3Vr3akAtBGRaG6cSwANl+Rf9u8YQ06OzsxevTogKyppZ7i4uJw/fXX44033sCRylUAVFKHRD7E75Ob62beiT/+PITIyEi89NJLuOOOO/y+07CrZs6cie+//x4LFy7ELXfej5SPl2H8mafYfU31LzuQsukehB0zeClKIs/Rrl0FALj22msljoS86a677sK6DeVo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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xgrid = np.linspace(bounds[0][0], bounds[0][1], 100)\n", "ygrid = np.exp(test1d_fn(xgrid))\n", "\n", "plt.hist(sm.emcee_samples.T[0], bins=50, histtype='step', density=True, label=\"emcee samples\")\n", "plt.hist(sm.dynesty_samples.T[0], bins=50, histtype='step', density=True, label=\"dynesty samples\")\n", "plt.plot(xgrid, ygrid/max(ygrid), label=\"true function\", color=\"k\", linestyle=\"--\")\n", "plt.xlabel(\"$x$\", fontsize=25)\n", "plt.xlim(*bounds)\n", "plt.legend(loc=\"upper left\", fontsize=18, frameon=False)\n", "plt.minorticks_on()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "45ecb412", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py314", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.2" } }, "nbformat": 4, "nbformat_minor": 5 }