diff --git a/learning/01 Introduction.ipynb b/learning/01 Introduction.ipynb index b73b06d..892e7a3 100644 --- a/learning/01 Introduction.ipynb +++ b/learning/01 Introduction.ipynb @@ -20,7 +20,7 @@ "\n", "```bash\n", "#make a new conda environment named recode, with python 3.9 and the packages in requirements.txt\n", - "conda env create --name recode python=3.9\n", + "conda env create --name recode python=3.9 --file requirements.txt\n", "\n", "#activate the environment\n", "conda activate recode\n", @@ -258,13 +258,13 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 6, "id": "0ad5b92f-521f-48c2-9f5b-7950f5a3f931", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAJMCAYAAAAYBLcfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABC/UlEQVR4nO3de9RtV13f/883CeSEWwCJXMQfYVDKxQL5wfEcRMWUKNj6UyAGAUWkFR0IUrFShZ/9IVhHTUuHlJagtigBq+ESRDFWAg2GcD9syBUCSBVaEMUKyEXSSjJ/f6y5k52duef6zsvez/PM836N8Yw8Z+215pzrstfzXXN+14yFEAQAADCaE/a6AQAAANtAkAMAAIZEkAMAAIZEkAMAAIZEkAMAAIZEkAMAAIZEkAMAAIZEkAMAAIZEkAMAAIZ0UsnKl112WTh06JAWi4Vr/cOHD9/4u3cbALt3t7vdTWeffbbtdTu2aXn/AjCW6667To985COT96+iIOfQoUM6cuSIjh496lp/9X8Z4d0GwO6dd955e92ErVvevwCM5dixYxs/KxquWiwWMvM/7JnZjT8AAAC7RE4OAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAYEkEOAAAY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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAJMCAYAAAAYBLcfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABCGUlEQVR4nO3de7htV1nf8d9LAjnhFqAgoFjCQzEEBVI8noOoGAkXWx/lYhAvSFHBB4m2oFSxtBRsH0lrK6Xl4KUoAavhjmJUAgRDuB825ApJKNWgqJFyk4ukLcnoH3OuZGVlrDHecVlr7z3O9/M8+8nOXHOOMeZlzf3OMd45joUQBAAAMJpb7XYDAAAANoEgBwAADIkgBwAADIkgBwAADIkgBwAADIkgBwAADIkgBwAADIkgBwAADIkgBwAADOn4kpXf+MY3hmuvvXZTbQGwS+5xj3voCU94gu12OzbpoosuCgcOHNjtZgDo7LrrrtPDH/7w6P2rKMi59tprddZZZ/VpFYA948iRI7vdhI07cOCADh06tNvNANDZ0aNH137GcBUAABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgSQQ4AABgS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\n", "text/plain": [ "
" ] @@ -324,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 7, "id": "686782b5-aa37-4084-9786-538fdc89fef1", "metadata": {}, "outputs": [ @@ -332,12 +332,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "mean = -0.00036800000000000043, standard error = 0.0026727883866853363\n" + "mean = -2.399999999999989e-05, standard error = 0.002981907148118465\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -399,12 +399,12 @@ "source": [ "## Exercise 2: Write a faster version of `energy(state)`\n", "\n", - "You can use `numpy`, `numba`, `cython`, or anything else, by what factor can you beat the naive approach?. Numba is probably the easiest here." + "You can use `numpy`, `numba`, `cython`, or anything else, by what factor can you beat the naive approach? Numba is probably the easiest here." ] }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 10, "id": "40386cda-cc14-4fdd-8f9f-71840d1ebb40", "metadata": {}, "outputs": [ @@ -413,10 +413,10 @@ "output_type": "stream", "text": [ "Naive baseline implementation\n", - "92.5 ms ± 2.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "73.4 ms ± 1.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "\n", "Your version\n", - "87.6 ms ± 6.35 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "72.3 ms ± 485 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "Your speedup: 1x !\n" ] } @@ -440,7 +440,7 @@ "test_energy_function(\n", " energy\n", ") # this should always pass because it's just comparing to itself!\n", - "naice = %timeit -o time_energy_function(energy)\n", + "naive = %timeit -o time_energy_function(energy)\n", "\n", "print(\"\\nYour version\")\n", "test_energy_function(your_faster_energy_function)\n", @@ -458,52 +458,7 @@ }, { "cell_type": "code", - "execution_count": 70, - "id": "26a6252d-ca67-49e0-b04e-7f001bae97ab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[-3.9572, -3.9592, -0.0168, -3.1144]\n", - "[-3.9572, -3.9592, -0.0168, -3.1144]\n", - "[-3.9572, -3.9592, -0.0168, -3.1144]\n", - "[-3.9572, -3.9592, -0.0168, -3.1144]\n" - ] - }, - { - "data": { - "text/plain": [ - "[True, True, True, True]" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def numpy_energy(state):\n", - " E = -np.sum(state[:-1, :] * state[1:, :]) - np.sum(state[:, :-1] * state[:, 1:])\n", - " return 2 * E / np.product(state.shape)\n", - "\n", - "\n", - "test_energy_function(numpy_energy)\n", - "\n", - "states[0][0, 5] = -1\n", - "states[0][0, 0] = -1\n", - "states[1][-1, -1] = 1\n", - "print([energy(state) for state in states])\n", - "print([energy2(state) for state in states])\n", - "print([numba_energy(state) for state in states])\n", - "print([numpy_energy(state) for state in states])\n", - "[numpy_energy(state) == energy(state) for state in states]" - ] - }, - { - "cell_type": "code", - "execution_count": 74, + "execution_count": 11, "id": "c96720d4-2c0b-4fa5-b9ce-4fc7be533a62", "metadata": {}, "outputs": [ @@ -512,15 +467,15 @@ "output_type": "stream", "text": [ "Naive baseline implementation\n", - "80.7 ms ± 974 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "74.8 ms ± 2.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "\n", "Numba version\n", - "195 µs ± 4.92 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", - "Numba Speedup: 427x !\n", + "184 µs ± 3.13 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", + "Numba Speedup: 409x !\n", "\n", "Numpy version\n", - "193 µs ± 2.96 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", - "Numpy Speedup: 421x !\n" + "202 µs ± 13.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", + "Numpy Speedup: 388x !\n" ] } ], @@ -594,7 +549,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 12, "id": "755ec34c-4975-467f-a559-f585f9d6a42f", "metadata": {}, "outputs": [ @@ -604,7 +559,7 @@ "text": [ "\n", "Improved Naive version\n", - "35.9 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "33.2 ms ± 369 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "Speedup: 2x !\n" ] } @@ -647,18 +602,31 @@ }, { "cell_type": "code", - "execution_count": 191, + "execution_count": 13, "id": "2586a542-35f2-419e-9aa2-2bb9e9ab74b9", "metadata": {}, "outputs": [ + { + "ename": "NameError", + "evalue": "name 'initial_state' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [13]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 25\u001b[0m ncols \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(Ts)\n\u001b[1;32m 26\u001b[0m f, axes \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(ncols \u001b[38;5;241m=\u001b[39m ncols, figsize \u001b[38;5;241m=\u001b[39m (\u001b[38;5;241m5\u001b[39m\u001b[38;5;241m*\u001b[39mncols, \u001b[38;5;241m5\u001b[39m))\n\u001b[0;32m---> 28\u001b[0m show_state(\u001b[43minitial_state\u001b[49m, ax \u001b[38;5;241m=\u001b[39m axes[\u001b[38;5;241m0\u001b[39m])\n\u001b[1;32m 29\u001b[0m axes[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mset(title \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInitial state\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m T, ax \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(Ts, axes[\u001b[38;5;241m1\u001b[39m:]):\n\u001b[1;32m 32\u001b[0m \u001b[38;5;66;03m# initial_state = rng.choice([1,-1], size = (50,50))\u001b[39;00m\n", + "\u001b[0;31mNameError\u001b[0m: name 'initial_state' is not defined" + ] + }, { "data": { - "image/png": "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\n", + "image/png": "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lEQAAAAAREkEAAAAQJREAAAAAERJBAAAAECURAAAAABESQQAAABAlEQAAAAAREkEAAAAQJREAAAAAERJBAAAAECURAAAAABESQQAAABAlEQAAAAAREkEAAAAQJREAAAAAERJBAAAAECURAAAAABESQQAAABABpZEVXW6qp6tqotVdc8Ox7yvqp6pqqer6g+WOyaALAKmQRYBUyCLgFU4ttsBVXV1kvuT/Oskl5I8WVXrrbVnFo45meS3kvxya+07VfUTqxoYOJpkETAFsgiYAlkErMqQbxLdnORia+251torSR5McmbLMR9Mcn9r7TtJ0lp7cbljAsgiYBJkETAFsghYiSEl0fVJnl94fGn+3KK3JXlbVX2pqh6vqtPLGhBgThYBUyCLgCmQRcBK7Ppzsz38nZNJ3pPkeJLHquodrbW/Wzyoqs4mOZsk58+fz2w2W9Lbj+Py5ctd79D7/En/O/Q+/wTJog71Pn/S/w69zz9BsqhDvc+f9L9D7/NPkCzqVO879D5/cjh22K8hJdELSU4sPD4+f27RpSRPtNa+n+SbVfVn2QykJxcPaq2dS3IuSTY2Ntra2tp+556E2WyWnnfoff6k/x16nz/JQYanLNpB7+dR7/Mn/e/Q+/yJLJqC3s+j3udP+t+h9/kTWTQFh+U86nmH3udP+t/hSrJoyM/NnkxysqpurKprktyRZH3LMf8nmw11quq6bH618bl9TwXwerIImAJZBEyBLAJWYteSqLX2apK7kzyS5OtJHmqtPV1V91XV7fPDHkny7ap6JsmjSX6ztfbtVQ0NHD2yCJgCWQRMgSwCVmXQNYlaaxeSXNjy3L0L91uSj8xvACshi4ApkEXAFMgiYBWG/NwMAAAAgENOSQQAAACAkggAAAAAJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABREgEAAAAQJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABREgEAAAAQJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABREgEAAAAQJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABREgEAAAAQJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABREgEAAAAQJREAAAAAURIBAAAAECURAAAAAFESAQAAABAlEQAAAABR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\n", "text/plain": [ "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], diff --git a/learning/02 Expanding our codebase.ipynb b/learning/02 Expanding our codebase.ipynb new file mode 100644 index 0000000..fb9733c --- /dev/null +++ b/learning/02 Expanding our codebase.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5ac56056-ca33-4f13-8e36-564b94144c1e", + "metadata": { + "tags": [] + }, + "source": [ + "

Markov Chain Monte Carlo for fun and profit

\n", + "

🎲 ⛓️ 👉 🧪

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "eb5d773e-4cc0-48ae-bb71-7ece7ab5f936", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from numba import jit\n", + "\n", + "# This loads some custom styles for matplotlib\n", + "import json, matplotlib\n", + "\n", + "with open(\"assets/matplotlibrc.json\") as f:\n", + " matplotlib.rcParams.update(json.load(f))\n", + "\n", + "np.random.seed(\n", + " 42\n", + ") # This makes our random numbers reproducable when the notebook is rerun in order\n", + "\n", + "\n", + "def show_state(state, ax=None):\n", + " if ax is None:\n", + " f, ax = plt.subplots()\n", + " ax.matshow(state, cmap=\"Greys\", vmin=-1, vmax=1)\n", + " ax.set(xticks=[], yticks=[])" + ] + }, + { + "cell_type": "markdown", + "id": "337f1de8-d743-441f-bc15-387bcfff558d", + "metadata": { + "tags": [] + }, + "source": [ + "# Doing Monte Carlo!\n", + "\n", + "Now that we can evaluate the energy of a state there isn't that much more work to do Markov Chain Monte Carlo on it. I won't go into the details of how MCMC works but put very simply:\n", + "\n", + "We want to calculate thermal averages about a physical system. For example, is this bag of H20 molecules solid or liquid at T = -20C? Our Ising model is much simpler so the equivalent question would be what's the average color of this system at some T?\n", + "\n", + "It turns out that this question is pretty hard to answer using maths, it can be done for the 2D Ising model but for anything more complicated it's pretty much impossible. This is where MCMC comes in. MCMC is a numerical method that gives us a rule to probalistically jump from one state of the system to another. \n", + "\n", + "If we perform many such jumps many times we get a (Markov) chain of states. The great thing about this chain is that if we average a measurement over it, such as looking at the average proportion of white pixels, the answer we get will be close to the real answer for this system and will converge closer and closer to the true answer as we extend the chain. \n", + "\n", + "I've written a very basic MCMC sampler for the 2D Ising model below. It needs:\n", + "- an initial start to start the chain\n", + "- to know how many steps to take\n", + "- the temperature we want to simulate at\n", + "- a way to measure the energy of a state, which we wrote in a previous chapter\n", + "\n", + "It then loops over:\n", + "- modify the state a little, here we just flip one bond\n", + "- accepting $p = \\exp(-\\Delta_E / T)$ based on how the energy changed\n", + "- if we rejected, change the state back to how it was" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "2586a542-35f2-419e-9aa2-2bb9e9ab74b9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "@jit(nopython=True, nogil=True)\n", + "def energy(state):\n", + " E = 0\n", + " N, M = state.shape\n", + " for i in range(N):\n", + " for j in range(M):\n", + " # handle the north and south neighbours\n", + " if 0 <= (i + 1) < N:\n", + " E -= state[i, j] * state[i + 1, j]\n", + "\n", + " # handle the east and west neighbours\n", + " if 0 <= (j + 1) < M:\n", + " E -= state[i, j] * state[i, j + 1]\n", + "\n", + " return 2 * E / (N * M)\n", + "\n", + "\n", + "# While writing numba it's useful to keep the list of supported numpy functions open:\n", + "# https://numba.pydata.org/numba-doc/dev/reference/numpysupported.html\n", + "@jit(nopython=True, nogil=True)\n", + "def mcmc(initial_state, steps, T, energy=energy):\n", + " N, M = initial_state.shape\n", + " assert N == M\n", + "\n", + " current_state = initial_state.copy()\n", + " E = N**2 * energy(current_state)\n", + " for i in range(steps):\n", + " i, j = np.random.randint(N), np.random.randint(N)\n", + "\n", + " # modify the state a little, here we just flip a random pixel\n", + " current_state[i, j] *= -1\n", + " new_E = N**2 * energy(current_state)\n", + "\n", + " if (new_E < E) or np.exp(-(new_E - E) / T) > np.random.random():\n", + " E = new_E\n", + " else:\n", + " current_state[i, j] *= -1 # reject the change we made\n", + "\n", + " return current_state\n", + "\n", + "\n", + "Ts = [4, 5, 50]\n", + "\n", + "ncols = 1 + len(Ts)\n", + "f, axes = plt.subplots(ncols=ncols, figsize=(5 * ncols, 5))\n", + "\n", + "initial_state = np.ones(shape=(50, 50))\n", + "axes[0].set(title=\"Initial state\")\n", + "show_state(initial_state, ax=ax)\n", + "\n", + "for T, ax in zip(Ts, axes[1:]):\n", + " # initial_state = rng.choice([1,-1], size = (50,50))\n", + "\n", + " final_state = mcmc(initial_state, steps=100_000, T=T)\n", + " show_state(final_state, ax=ax)\n", + " ax.set(title=f\"T = {T}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5d1874d4-4585-49ed-bc6f-b11c22231669", + "metadata": {}, + "source": [ + "These images give a flavour of why physicists find this model useful, it gives window into how thermal noise and spontaneous order interact. At low temperatures the energy cost of being different from your neighbours is the most important thing, while at high temperatures, it doesn't matter and you really just do your own thing.\n", + "\n", + "There's a special point somewhere in the middle called the critical point $T_c$ where all sorts of cool things happen, but my favourite is that for large system sizes you get a kind of fractal behaviour which I will demonstrate more once we've sped this code up and can simulate larger systems in a reasonable time. You can kinda see it for 50x50 systesm at T = 5 but not really clearly." + ] + }, + { + "cell_type": "markdown", + "id": "5f728039-a975-4083-b68e-a13b4f2d1f87", + "metadata": {}, + "source": [ + "The code we have so far is really just a sketch of a solution. So this is a good time to step back and think about what are aims are and how this software will fulfil them. I see three broad areas on which it needs improvement:\n", + "\n", + "**Functionality**\n", + "Right now we can't really do much except print nice pictures of states, but (within the fiction of this project) we really want to be able to do science! So we need to think about what measurements and observations we might want to make and how that might affect the structure of our code.\n", + "\n", + "**Testing**\n", + "I've already missed at least one devastating bug in this code, and there are almost certainly more! Before we start adding too much new code we should think about how to increase our confidence that the individual components are working correctly. It's very easy to build a huge project out of hundreds of functions, realise there's a bug and then struggle to find the source of that bug. If we test our components individually and thoroughly, we can avoid some of that pain.\n", + "\n", + "**Performance**\n", + "Performance only matters in so far as it limits what we can do. And there is a real danger that trying to optimise for performance too early or in the wrong places will just lead to complexity that makes the code harder to read, harder to write and more likely to contain bugs. However I do want to show you the fractal states at the critical point, and I can't currently generate those images in a reasonable time, so some optimisation will happen!" + ] + }, + { + "cell_type": "markdown", + "id": "486f066c-f027-44e8-8937-8636a52f32fb", + "metadata": {}, + "source": [ + "## Functionality\n", + "\n", + "The main thing we want to be able to do is to take measurements, the code as I have writting it doesn't really allow that because it only returns the final state in the chain. Let's say we have a measurement called `average_color(state)` that we want to average over the whole chain. We could just stick that inside our definition of `mcmc` but we know that we will likely make other measurements too and we don't want to keep writing new versions of our core functionality!\n", + "\n", + "## Exercise 1\n", + "Have a think about how you would implement this and what options you have." + ] + }, + { + "cell_type": "markdown", + "id": "c28b0a86-28f8-426f-9013-70e962f02256", + "metadata": {}, + "source": [ + "## Solution 1\n", + "So I chatted with my mentors on this project on how to best do this and we came up with a few ideas:\n", + "\n", + "### Just save all the states and return them\n", + "\n", + "The problem with this is the states are very big and we don't want to waste all that memory. For an NxN state that uses 8 bit integers (the smallest we can use in numpy) 1000 samples would already use 2.5Gb of memory! We will see later that we'd really like to be able to go a bit bigger than 50x50 and 1000 samples!\n", + "\n", + "### Pass in a function to make measurements\n", + "```python\n", + "\n", + "def mcmc(initial_state, steps, T, measurement, energy=energy):\n", + " ...\n", + "\n", + " current_state = initial_state.copy()\n", + " E = N**2 * energy(current_state)\n", + " for i in range(steps):\n", + " measurements[i] = measurement(state)\n", + " ...\n", + "\n", + " return measurements\n", + "```\n", + "\n", + "This could work but it limits how we can store measurements and what shape and type they can be. What if we want to store our measurements in a numpy array? Or what if your measurement itself is a vector or and object that can't easily be stored in a numpy array? We would have to think carefully about what functionality we want." + ] + }, + { + "cell_type": "markdown", + "id": "c7c9575f-2450-4298-a507-90f0c1b9b284", + "metadata": { + "tags": [] + }, + "source": [ + "### Use Inheritance\n", + "```python\n", + "# This class would define the basic functionality of performing MCMC\n", + "class MCMCSampler(object):\n", + " def run(self, initial_state, steps, T):\n", + " ...\n", + " for i in range(steps):\n", + " self.measurement(state)\n", + "\n", + " \n", + "# This class would inherit from it and just implement the measurement\n", + "class AverageColorSampler(MCMCSampler):\n", + " measurements = np.zeros(10)\n", + " index = 0\n", + " \n", + " def measurement(self, state):\n", + " self.measurements[self.index] = some_function(state)\n", + " self.index += 1\n", + " \n", + "color_sampler = AverageColorSampler(...)\n", + "measurements = color_sampler.run(...)\n", + "```\n", + "\n", + "This would definitely work but I personally am not a huge fan of object oriented programming so I'm gonna skip this option!" + ] + }, + { + "cell_type": "markdown", + "id": "7d05d25d-c9ba-406d-9977-0ca4aeb430a7", + "metadata": {}, + "source": [ + "## Use a generator\n", + "This is the approach I ended up settling on, we will use [python generator function](https://peps.python.org/pep-0255/) " + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "f73d6335-6514-45b1-9128-d72122d8b0b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]],\n", + "\n", + " [[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]],\n", + "\n", + " [[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]],\n", + "\n", + " ...,\n", + "\n", + " [[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]],\n", + "\n", + " [[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]],\n", + "\n", + " [[-9.86830992e+148, -9.86830992e+148, -9.86830992e+148, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " ...,\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000],\n", + " [ 1.00000000e+000, 1.00000000e+000, 1.00000000e+000, ...,\n", + " 1.00000000e+000, 1.00000000e+000, 1.00000000e+000]]])" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@jit(nopython=True, nogil=True)\n", + "def mcmc(initial_state, steps, T, energy=energy):\n", + " N, M = initial_state.shape\n", + " assert N == M\n", + "\n", + " current_state = initial_state.copy()\n", + " E = N**2 * energy(current_state)\n", + " for i in range(steps):\n", + " i, j = np.random.randint(N), np.random.randint(N)\n", + "\n", + " # modify the state a little, here we just flip a random pixel\n", + " current_state[i, j] *= -1\n", + " new_E = N**2 * energy(current_state)\n", + "\n", + " if (new_E < E) or np.exp(-(new_E - E) / T) > np.random.random():\n", + " E = new_E\n", + " else:\n", + " current_state[i, j] *= -1 # reject the change we made\n", + "\n", + " yield current_state # give the state out to the enclosing function but don't actually return\n", + "\n", + " return # this signals that we're done\n", + "\n", + "\n", + "initial_state = np.ones(shape=(50, 50))\n", + "np.array([s for s in mcmc(initial_state, steps=10, T=5)])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "193b778f-5913-48f1-9df6-304ab50ceb4e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:recode]", + "language": "python", + "name": "conda-env-recode-py" + }, + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/learning/02 Packaging it up.ipynb b/learning/03 Packaging it up.ipynb similarity index 100% rename from learning/02 Packaging it up.ipynb rename to learning/03 Packaging it up.ipynb diff --git a/learning/03 Testing.ipynb b/learning/04 Testing.ipynb similarity index 95% rename from learning/03 Testing.ipynb rename to learning/04 Testing.ipynb index 4d29c7e..d1ed6de 100644 --- a/learning/03 Testing.ipynb +++ b/learning/04 Testing.ipynb @@ -29,14 +29,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "id": "d4082e07-c51f-46ba-9a5e-bf45c2c319ba", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "\n" + "
\n" ], "text/plain": [ "" @@ -47,8 +47,8 @@ } ], "source": [ - "%%html\n", - "" + "%%html \n", + "
" ] }, { @@ -208,10 +208,19 @@ " return \" \".join([a, b, c / 2.0 + 3])" ] }, + { + "cell_type": "markdown", + "id": "0ba4802e-40e9-4cd5-8877-7a51ad2224b1", + "metadata": {}, + "source": [ + "## Testing Stochastic Code\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "2f53a760-c1b4-43bf-8774-54d2d9edc230", + "id": "38ce37fc-fd99-478b-9d34-6726af280bf0", "metadata": {}, "outputs": [], "source": [] diff --git a/learning/assets/matplotlibrc.json b/learning/assets/matplotlibrc.json index 5609242..50d4ab9 100644 --- a/learning/assets/matplotlibrc.json +++ b/learning/assets/matplotlibrc.json @@ -9,6 +9,6 @@ "patch.edgecolor": "#eeeeee", "axes.titlesize": "x-large", "svg.fonttype": "path", - "figure.dpi": 100, + "figure.dpi": 110, "figure.figsize": [5,5] }