{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Bucket renormalization\n", "\n", "This notebook reproduces some results from [this paper](https://arxiv.org/abs/1803.05104) on bucket renormalization. See paper for details\n", "\n", "Also it demonstrates how to use InferLO helpers for loading UAI datasets and for caching experiment results." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from time import time\n", "from networkx import grid_graph\n", "\n", "import inferlo\n", "from inferlo import testing\n", "from inferlo.datasets import DatasetLoader\n", "from inferlo.interop import LibDaiInterop\n", "import inferlo.generic.inference as inf\n", "\n", "loader = DatasetLoader()\n", "libdai = LibDaiInterop()\n", "assert libdai.is_libdai_ready()\n", "exp_runner = inferlo.testing.ExperimentRunner() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Ising model on grid\n", "\n", "Built random Ising model on 15x15 grid, with varying interaction strength. Observed how accuracy of log partition function depends on interaction strength. \n", "\n", "Ran for Mini-Bucket elimination, Global-Buclet elimination. Compared with Belief Propagation, Mean Field, Mini-Bucket Elimination, Weighted Mini-Bucket Elimination. Used Bucket Elimination for getting exact answer.\n", "\n", "Corresponds to Fig. 3(b) in the paper." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def ising_grid_delta_v2(grid_size=5, delta=1.0, seed=0, ibound=10):\n", " graph = grid_graph(dim=(grid_size, grid_size))\n", " model = testing.ising_model_on_graph(graph, field_range=0.1, interaction_range=delta, seed=seed) \n", " true_log_pf = inf.bucket_elimination(model, elimination_order_method=\"not_random\")\n", " get_error = lambda x: np.abs(x - true_log_pf) * np.log(10)\n", " return {\n", " \"MBR\" : get_error(inf.bucket_renormalization(model, max_iter=0)),\n", " \"GBR\" : get_error(inf.bucket_renormalization(model, max_iter=1)),\n", " \"MBE\" : get_error(inf.mini_bucket_elimination(model, ibound=ibound)),\n", " \"WMBE\" : get_error(inf.weighted_mini_bucket_elimination(model, ibound=ibound)),\n", " \"MF\" : get_error(inf.mean_field(model)),\n", " \"BP\" : get_error(libdai.infer(model, 'BP').log_pf),\n", " }\n", "\n", "delta_range = np.linspace(0, 2, 9)\n", "repeats = 3\n", "for delta in delta_range:\n", " for seed in range(repeats):\n", " exp_runner.run_experiment(ising_grid_delta_v2, {'grid_size': 15, 'delta':delta, 'seed':seed})\n", "\n", "results = exp_runner.get_results('ising_grid_delta_v2', filter_params={'grid_size': 15})\n", "algos = [\"MBR\", \"GBR\", \"MBE\", \"WMBE\", \"MF\", \"BP\"]\n", "\n", "for algo in algos:\n", " avg_errors = []\n", " for delta in delta_range:\n", " errors = [r['result'][algo] for r in results if r['params']['delta'] == delta]\n", " avg_error = np.mean(errors) / (np.log(10)**2)\n", " avg_errors.append(avg_error) \n", " plt.plot(delta_range, avg_errors, label=algo, marker='o')\n", "\n", "plt.xlabel('Δ')\n", "plt.ylabel('log partition function error')\n", "plt.grid()\n", "plt.legend()\n", "plt.xlim([0, 2])\n", "plt.ylim([0, 8])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Promedus dataset\n", "\n", "Corresponds to Fig. 3(f) in the paper." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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ktO6J2DxdVAdWlSk4iPnMcCwaa16y40bNzJixIgWn3/11VcpLi5m//795OXlceeddx73mg8//JCqqiqGDRvWqjp4ZWfcxhhjktOy2ceSdlh1pVPeRq6++mqGDx/O6aefDhxrKv/oo4/4j//4D2655Zb61y5cuJBhw4ZxyimncNVVV5GTk9PS28aVJW5jjDHJqWJHbOUuDB48mNWrV9c/fuCBB1i2bBmffPLJca+94IILGi3neeGFF7Ju3TpWrlzJrbfeyp49/gyBtMRtjDFxZNPDelDQK7ZyF84880yqqqr43e9+V192+PDhZl/b0nKeo0aN4vvf/z7z5vkz6ZAlbmOMiZPw9LC7DzmdmMLTw1rydumsWZDVZO3trFynvJVEhGeffZa//e1v9OnThy9/+ctMnz6du+++Gzh2jXv48OH86U9/4p577mn2fX784x/zxz/+MaGrgoVZ5zRjjImTSNPDWk98F8Id0JbNdprHC3o5SbuVHdPCCgsLWbBgwXHlBw4coKKiotmYpkt99uzZ07emckvcxhgTJzY9bBsYNs1zok411lRujDFxYtPDmniwxJ3krGOLMcFl08OaeLCm8iRm6x4bE2zhz2l4ydPCvEJmjJhhn1/jiZ1xJzFb99iY4LPpYU1bs8SdxKxjizHGmKYscScx69hijDFtT0T43ve+V/+4pqaGrl278u1vfxtovITn4MGDmTp1av0kLaWlpRQVFVFcXFx/Ky8vT2j9LXEnMevYYowxbS8vL48NGzZQWenMg/7yyy9TVFTU6DXhJTw3btxIdnY2CxcurH9u5syZrF27tv7WqVOnRFY/folbRE4WkeUisklENorIjFB5qYjsFJG1odv58apD0Nm6x8aYdBceWTPssWFtOrLm/PPPZ8kS573mz5/PRRdd1OzrampqOHToULPLe/olnmfcNcCNqjoIOAO4WkQGhZ6bq6rFodtf41iHwLOOLcaYdNVwylhF23TK2O985zssWLCAqqoq1q1bx+jRoxs9v3DhQoqLiykqKuLTTz+lpKSk/rm5c+fWN5NPnDjRc11iFbfEraq7VXV16P4BYDNQFDnKGGOMccRzZM2wYcPYvn078+fP5/zzj2/4DTeV79mzh6FDhzJnzpz65xo2lS9fvtxzXWKVkGvcItIbOA1YFSq6RkTWicgfRCR52h+MMcYkjXiPrLngggu4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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def infer_uai_dataset(dataset_name='', algo=''):\n", " model = loader.load_uai_dataset(dataset_name).model\n", " if algo == 'MBR':\n", " return inf.bucket_renormalization(model, max_iter=0)\n", " elif algo == 'GBR':\n", " return inf.bucket_renormalization(model, max_iter=1)\n", " elif algo == 'MBE':\n", " return inf.mini_bucket_elimination(model, ibound=10)\n", " elif algo == 'WMBE':\n", " return inf.weighted_mini_bucket_elimination(model, ibound=10)\n", " elif algo == 'BP':\n", " return inf.belief_propagation(model).log_pf\n", " elif algo == 'IJGP':\n", " return inf.iterative_join_graph_propagation(model, ibound=10)\n", " elif algo[:4] == 'DAI-':\n", " return libdai.infer(model, algo[4:]).log_pf\n", " else:\n", " raise ValueError(algo)\n", " \n", "algos = ['MBR', 'GBR', 'MBE', 'WMBE', 'DAI-BP']\n", "dataset_id_range = np.array(range(11, 39)) \n", "fig = plt.figure(figsize=(8, 5))\n", "ax = fig.add_subplot(1, 1, 1)\n", "\n", "for algo in algos:\n", " errors = []\n", " for dataset_id in dataset_id_range:\n", " dataset_name = 'Promedus_%d.uai' % dataset_id\n", " true_log_pf = loader.load_uai_dataset(dataset_name).true_log_pf\n", " result = exp_runner.run_experiment(infer_uai_dataset, {'dataset_name': dataset_name, 'algo': algo})\n", " error_log10 = np.abs(result['result'] - true_log_pf) / np.log(10)\n", " errors.append(error_log10)\n", " ax.scatter(dataset_id_range - 10, errors, label=algo)\n", " \n", "ax.set_xlabel('instance number') \n", "ax.set_ylabel('log-partition function') \n", "ax.set_xticks(dataset_id_range - 10)\n", "ax.set_ylim([0, 30])\n", "ax.grid()\n", "ax.legend()\n", "plt.show() " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }