{ "cells": [ { "cell_type": "markdown", "id": "95bce5b5", "metadata": {}, "source": [ "# Differentiation With JAX" ] }, { "cell_type": "markdown", "id": "df5aae26", "metadata": {}, "source": [ "This notebook shows a quick introduction on how to compute derivatives (see the IntroToAutodiff notebook for a much more comprehensive introduction)\n", "\n", "`jax` is designed as a drop in replacement for `numpy` so if you have `numpy` code you can make it differentiable easily by either\n", "\n", "1. `import jax.numpy as np`\n", "\n", "or if you don't like that much black magic and want to know whether you use `jax` or `numpy` you can to \n", "\n", "2. `import jax.numpy as jnp`\n", "\n", "but then you need to change all occurences of `np.foo` to `jnp.foo`\n", "\n", "I would recommend the latter as the aspiration to be a drop-in replacement works 99% of the time but there are always edge cases\n", "\n", "Let's try to define a complicated looking function:" ] }, { "cell_type": "code", "execution_count": 1, "id": "58388491", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/lukasheinrich/Code/iml_tutorial/_venv/lib/python3.9/site-packages/jax/_src/lib/__init__.py:33: UserWarning: JAX on Mac ARM machines is experimental and minimally tested. Please see https://github.com/google/jax/issues/5501 in the event of problems.\n", " warnings.warn(\"JAX on Mac ARM machines is experimental and minimally tested. \"\n" ] } ], "source": [ "import jax\n", "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "\n", "def func(x):\n", " return (3*x+jnp.sin(3*x))*jnp.exp(-x/2.)" ] }, { "cell_type": "markdown", "id": "d0d392e1", "metadata": {}, "source": [ "We can plot it as usual using `matplotlib`" ] }, { "cell_type": "code", "execution_count": 2, "id": "8bb5ef50", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xi = jnp.linspace(0,5)\n", "yi = [func(xx) for xx in xi]\n", "plt.plot(xi,yi)" ] }, { "cell_type": "markdown", "id": "38eb1ab9", "metadata": {}, "source": [ "In order to get gradients you simply call `jax.grad()` on the function\n", "\n", "Note: this works only for \"scalar\" functions $\\mathbb{R}^n \\to \\mathbb{R}$. If you want to have more general jacobian matrices you can use `jax.jacobian()`" ] }, { "cell_type": "code", "execution_count": 4, "id": "af3c1f06", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(2.1044855, dtype=float32, weak_type=True)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "func(2.0)" ] }, { "cell_type": "markdown", "id": "f4ee7f83", "metadata": {}, "source": [ "You can get the gradient at the same $x$ like so" ] }, { "cell_type": "code", "execution_count": 6, "id": "bd76dbb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DeviceArray(1.1110764, dtype=float32, weak_type=True)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jax.grad(func)(2.0)" ] }, { "cell_type": "markdown", "id": "b6c4205e", "metadata": {}, "source": [ "Often you are interested in both the gradient *and* the function value.. so there is a nice API for that as well" ] }, { "cell_type": "code", "execution_count": 7, "id": "d5abd122", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(DeviceArray(2.1044855, dtype=float32, weak_type=True),\n", " DeviceArray(1.1110764, dtype=float32, weak_type=True))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jax.value_and_grad(func)(2.0)" ] }, { "cell_type": "markdown", "id": "080c026e", "metadata": {}, "source": [ "We can now plot the function and its tangens very easily\n", "\n", "Note: the list comprehensions `[ .. for ... in ]` are python and thus slow.. check out `JaxParallelization.ipynb` to see how to `map` over multiple values in a much more efficient way." ] }, { "cell_type": "code", "execution_count": 8, "id": "225dbe10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xi = jnp.linspace(0,5)\n", "yi = jnp.array([func(xx) for xx in xi])\n", "gi = jnp.array([jax.grad(func)(xx) for xx in xi])\n", "plt.plot(xi,yi)\n", "plt.quiver(xi,yi,jnp.ones_like(gi),gi,units='xy',angles='xy', color = 'r')" ] }, { "cell_type": "markdown", "id": "ec167db2", "metadata": {}, "source": [ "## Higher Order Gradients\n", "\n", "\n", "`jax` allows you to compute higher order gradients without any issues by just re-wrapping the gradient function multiple types in `jax.grad(...)`\n", "\n", "Tip: try redefining `func` for a few functions and see if the gradients match your expectation" ] }, { "cell_type": "code", "execution_count": 10, "id": "f081fea6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD4CAYAAAAEhuazAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7zElEQVR4nO3dd5hU1f3H8feZur2yjd2dXZrSQVhBQFGKiIqAiFEJYktIjDEqSaz5JSYmpseYqCR2okYsgBQBBcQCAQTpIGUpW9nG9jrt/P6YAXYVpezMzu7O9/U8+8zMvXfu/Q6un71z7rnnKK01Qgghgosh0AUIIYRoexL+QggRhCT8hRAiCEn4CyFEEJLwF0KIIGQKdAFno0uXLjozMzPQZQghRIfyxRdflGmtE063rkOEf2ZmJlu2bAl0GUII0aEopXK+aZ00+wghRBCS8BdCiCAk4S+EEEFIwl8IIYKQhL8QQgQhCX8hhAhCEv5CCBGEOnX4V9bb+fvqA+wrqg50KUIIcc4Wbs3nnS15ftl3pw5/gOfWHuKtzf75xxNCCH/RWvP31QdZtK3AL/v3SfgrpWKUUu8qpfYppb5USo1QSsUppVYppQ56H2O92yql1D+UUtlKqZ1KqSG+qOF0YsIsjO+byJLthThcbn8dRgghfG5LTgW55fXcMCTNL/v31Zn/08BKrXVvYBDwJfAwsEZr3QtY430NcDXQy/szG5jroxpOa9pFaRyvs/PpgVJ/HkYIIXxq4dZ8Qs1GJvZP9sv+Wx3+SqloYDTwEoDW2q61rgSmAPO8m80DpnqfTwH+oz02AjFKqZTW1vFNLr8wgbhwCwu3+uerkxBC+Fqjw8Wynce4un8y4Vb/DMHmizP/bkAp8IpSaptS6kWlVDiQpLU+5t2mCEjyPk8FmjfC53uX+YXZaGDyoK6s2ltMVb3DX4cRQgifWbW3mJpGJzcM9U+TD/gm/E3AEGCu1voioI5TTTwAaM8s8ec0U7xSarZSaotSaktpaeuabKYPTcPucrNsV2Gr9iOEEG1h4dZ8UqJDuKR7vN+O4YvwzwfytdabvK/fxfPHoPhEc473scS7vgBIb/b+NO+yFrTWz2uts7TWWQkJpx2O+qz16xrFBUkR0vQjhGj3Smoa+fRgGVMvSsVoUH47TqvDX2tdBOQppS70LhoH7AWWALd5l90GLPY+XwLM8vb6uQSoatY85BdKKaYNSeOLnAqOlNX581BCCNEqS7YX4nJrbhjit9ZwwHe9fe4F3lBK7QQGA08CfwCuVEodBMZ7XwMsBw4D2cALwI98VMO3mjo4FYOCRVvz2+JwQghxXhZsLWBQWjQ9EyP9ehyfXEbWWm8Hsk6zatxpttXAPb447rlIjg5hVM8uLNxWwP3jL8Dgx69TQghxPvYWVvPlsWp+Pbmf34/V6e/wbe6GIWnkVzTw+dHyQJcihBBfs3BrPmaj4rpBXf1+rKAK/wn9kgi3GFkoTT9CiHbG6XLz3vZCxlyYSFy4xe/HC6rwD7OYuHpACst3FdFgdwW6HCGEOOmz7DLKapuY5qfhHL4qqMIfPE0/tU1OPtxbFOhShBDipIVbC4gJMzOmd+u6tp+toAv/4d3iSI0JZYH0+RdCtBPVjQ4+3FPE5EFdsZqMbXLMoAt/g0Fx/UWprDtYSnF1Y6DLEUIIlu88RpPT3WZNPhCE4Q8wbUgqbg3v+WmcbCGEOBcLtubTPSGcQWnRbXbMoAz/7gkRDM2I5c3Pc3G7z2nIISGE8KmDxTVsPlrBjUPTUart7j8KyvAHuPWSDI4er+ez7LJAlyKECGL/2ZCDxWjgO1lt1+QDQRz+Vw9IJj7cwmsbjga6FCFEkKppdLBwaz6TBqYQH2Ft02MHbfhbTUZuGWZjzb4S8srrA12OECIILdpWQJ3dxayRmW1+7KANf4AZw20o4I1NuYEuRQgRZLTW/GdDDgPTohmcHnP6jba9AVv/A9r31yaDOvy7xoRyZd8k3tqcS6ND7vgVQrSdDYePk11Sy62XZJx+g9pSWPkI7F7gl+MHdfgDzBqRSUW9g2U7/TqlgBBCtPDahhxiwszfPIjb6l+Box6u/jP4oRdQ0If/yB7x9EgIlwu/Qog2c6yqgQ/3FnNTVjoh5tPc0Zu7Eba/ASN/DAkX+KWGoA9/pRS3XpLBjvwqduRVBrocIUQQeHNTLm6tmXm6Jh+XE97/GUSlweif+62GoA9/gGlD0wizGPnPhpxAlyKE6OTsTjf//TyPMRcmkh4X9vUNtrwExbtg4pNgCfdbHRL+QFSImWlDUlm6s5DyOnugyxFCdGIr9xRRVtvErBGnOeuvKYaPfgs9xkKfyX6tQ8Lfa9aITOxON29vyQt0KUKITuw//ztKZnwYo3udZujmVb8ER4PfLvI2J+HvdUFSJMO7xfHahhxcMt6PEMIP9hZWsyWngpmXZHx9HvGj62HnfBj1E+jS0++1SPg3M2tEJgWVDazdVxLoUoQQndBrG48SYjZw49D0litcDlj+M4hOh8t+2ia1SPg3M6FfEklRVuZJt08hhI9V1Tt4b1shUwalEh1mbrny8xegZC9M/L1fL/I2J+HfjNloYNaITD47WMbugqpAlyOE6ETmbThKg8PF7aMyW66ozIO1T0LP8dB7UpvVI+H/FTMvySDSamLux4cCXYoQopOoa3Ly8vojjO+TSJ+UqFMrtIZl94N2wbV/9ftF3uYk/L8iOtTMrSMyWL77GNkltYEuRwjRCbz5eS6V9Q5+NOYrF3J3vAnZq2H84xCb2aY1Sfifxp2XdsNqMvCvT+TsXwjROk1OF89/epiRPeIZYos9taKmCFY+DOmXwMXfb/O6JPxPo0uElZsvtvHetgLyK2SsfyHE+Xv3i3xKapq4p/lZv9bw/k/B0QhTngFD20exz46olDIqpbYppZZ5X3dTSm1SSmUrpd5SSlm8y63e19ne9Zm+qsGXZo/ujlLw/KeHA12KEKKDcrrc/OuTQwxKj2Fkj/hTK/Ysgn3LYMyj0KVXQGrz5Z+b+4Avm73+I/CU1ronUAHc5V1+F1DhXf6Ud7t2p2tMKNMuSmP+5jxKahoDXY4QogNaurOQvPIGfjym56nJ2euOw/KfQ9eLYMSPA1abT8JfKZUGXAu86H2tgLHAu95N5gFTvc+neF/jXT9OteWU9efgh1f0wOly89K6I4EuRQjRwbjdmufWHuLCpEjG9U48tWLlQ9BYBVOeBaMpYPX56sz/78CDgNv7Oh6o1Fo7va/zgVTv81QgD8C7vsq7fQtKqdlKqS1KqS2lpaU+KvPcdOsSzrUDu/L6hhyq6h0BqUEI0TF9uLeYgyW1/GhMj1NDOexbDrvegdE/g6R+Aa2v1eGvlJoElGitv/BBPSdprZ/XWmdprbMSEk4zAFIb+dEVPaizu3j1f0cDVoMQomPRWvPcx9lkxIdx7YAUz8KGCnh/DiT2g0vnBLZAfHPmPwqYrJQ6CszH09zzNBCjlDrxnSYNKPA+LwDSAbzro4HjPqjDL/qkRDG+TyKv/O8IdU3OM79BCBH0PjtYxs78Kn54eQ9MRoOnd8/S+6CuFKY+CyZLoEtsffhrrR/RWqdprTOBm4GPtNbfBdYC072b3QYs9j5f4n2Nd/1HWvthanof+tGYnlTWO3jz89xAlyKE6ACeXZtNclQI04Z4W7u3vQ57F8PYX3gu9LYD/uxc+hAwRymVjadN/yXv8peAeO/yOcDDfqzBJ4bYYhnZI57nPz1Mo8MV6HKEEO3Y5qPlbDpSzvdHd8dqMsLxQ7DiIci8DEbeF+jyTvJp+GutP9ZaT/I+P6y1Hqa17qm1vlFr3eRd3uh93dO7vkN0pL9vXC9Kapp4eb30/BFCnJ7Wmt8v/5KESCu3DEsHpx0W3AVGM1z/74DczPVN2k8l7dzw7vGM75PI3LWHOF7bFOhyhBDt0MrdRWzNrWTOlRcQZjHB2t9B4TaY/E+ITj3zDtqQhP85ePjq3tQ7XPzzo+xAlyKEaGfsTjd/XLmPXokR3Dg0DY58CuufhiG3QV//zsd7PiT8z0HPxEhuujid1zfmcLSsLtDlCCHakTc/z+Xo8XoeuaY3pqZKWPgDiO/pmaClHZLwP0f3j++FxWTgTx/sC3QpQoh2orrRwdNrDjKiezxjLkiAJfd6unXe8GKbzcx1riT8z1FiZAizR3dn+a4ivsipCHQ5Qoh24F8fH6K8zs6j1/RBbXnJM2jbuF9C18GBLu0bSfifh+9f1p2ESCtPLv+Sdn6LghDCzworG3hp3RGmDO7KAL0fVj4CvSYEdNC2syHhfx7CrSYeGH8BX+RU8MGeokCXI4QIoL9+eACt4cFRsfD2LE+vnmnPt6tunafTvqtrx76TlUbPxAj+uHI/Dpf7zG8QQnQ6ewurWbgtnztHpJG6+kfQUAk3vQ6hsWd8b6BJ+J8nk9HAI1f35khZnQz7IESQ+v2KL4kKMfMAr0POerjuaUgeEOiyzoqEfyuM7Z3IJd3j+Pvqg1Q3ypDPQgSTTw+U8tnBMp7qm411y79g2GwYdFOgyzprnTr8tda8tvc1yhvL/bJ/pRSPXtOHino7f/1gv1+OIYRofxodLh5fsocrYkoYc+AJSB8OE37n8+PsLN3J2ty1Pt8vdPLwP1p9lKe+eIrrF1/Pmtw1fjnGwLQYbhuRyX825kjXTyGCxDMfZVNWVsJc81MoayTcOM+nwzTbXXb+sfUf3LriVp7Z/gxu7fvrip06/LtFd+OtSW+RFJbE/Wvv59HPHqWqqcrnx/nZVReSHBXCIwt3YnfKxV8hOrN9RdW88MkB3op/gdC6Ak/wR6X4bP/7y/dzy/u38MKuF5jSYwqvTnwVg/J9VHfq8AfoFduLN659gx8N+hErjqxg2uJprCtY59NjRFhNPDGlPweKa/n3J4d8um8hRPvhcmsefncnT1rn0afuc7jmL5Axwif7drqd/HvHv7n5/Zspbyzn2XHP8ptRvyHSEumT/X9Vpw9/ALPBzN2D7+b1a18nyhrF3avv5tcbfk2dw3fj84zvm8S1A1L450fZHCqt9dl+hRDtx2sbjjL82OvcoFfBpQ9A1h0+2e/hysPcutzTxHNlxpUsmryI0WmjfbLvbxIU4X9Cv/h+zJ80nzv638HCgwu5fvH1rC9Y77P9/2pyX0LMBh5ZuAu3W+78FaIzKaxsYOcHr/KI+U10v2kw9pet3qfD7eDFXS9y49IbKagt4K+X/5U/jf4TMSExrS/4DIIq/AGsRitzhs5h3sR5hJpC+eHqH/LYusd8ci0gMTKER6/pw+dHynl7S54PqhVCtAdaa16d/xa/V8/SlHIxaurcVt/B++XxL/nu+9/l6a1Pc0X6FSycspAJmRN8VPGZBV34nzA4cTDvXPcOswfOZvnh5Ux5bwqrcla1er83XZzO8G5xPLn8S0pqGn1QqRAi0D7esIkfHnuMxrAUrDPfAnPIee+rydXE01uf5pb3b6G0oZS/X/F3/nrFX+kS2sWHFZ9Z0IY/gMVo4d6L7uXNSW+SGJbInI/n8MDaByhrKDvvfSql+P20ATQ63fx6yV4fViuECITq48V0//B2TAYD4XcugvD4897XtpJtTF8ynRd3vch1Pa7jvSnvMS5jnA+rPXtBHf4n9I7rzX+v/S/3D7mfT/M/ZfJ7k3l7/9vn3be2e0IEPxnbk/d3HZOB34ToyJpqKX/xepJ1GaXXvYopoed57aaqqYrfbPgNt624DbvLzr+v/DdPjHqCaGu0jws+exL+XiaDibsG3MWCyQvoE9eHJzY+wawVszhQceC89jd7dA/6dY3ioQU7Kaxs8HG1Qgi/czRQ+sI00uq/ZPmFT9BjyLmfoWutTzYrLzi4gJl9Z7JoyiJGdh3ph4LPjYT/V2RGZ/LihBf53aW/I7c6l+8s/Q5/2/I36h3157Qfi8nAMzOG4HC6+cmb23DKyJ9CdBzOJupfn0F86ec8E/1TJt30g3PeRW51Lj9Y9QMe+uwhUsJTmH/tfB68+EHCzGF+KPjcSfifhlKKyT0ms2TqEqb0nMIre17h+sXX80neJ+e0n25dwnly2gC25FTw1Orz+wYhhGhjLieud+4kLOcjfqN+wPQ75mA2nn1U2l12nt/5PNcvvp6dZTt5dPijvH7N6/SJ7+PHos+dhP+3iAmJ4dcjf82rE18l1BTKjz/6MfeuuZe8mrPvxjllcCo3X5zOcx8f4tMDpX6sVgjRam4XvPdDjPuX8bhjFiNvfIC02LM/U19XsI5pS6bxz23/5Ir0K1gydQm39L4Fo8Hox6LPj4T/WRiaNJR3rnuHOUPnsKloE1Pfm8qz25+lwXl2bfm/uq4fvRIjeOCt7ZRUS/dPIdoltxuW3ge73uEPjptRl/yQCf2Sz+qt+TX5/OSjn3D36rsBmDt+Ln+94q8khiX6s+JWkfA/S2ajmTv638HSqUsZnzGef+34F1Pfm8qanDVnnMc31GLk2RlDqLM7uW/+dlxy968Q7YvWsPIh2PYa/+IG1iffysNX9z7j2xqdjTy3/TmmLp7KxmMbuX/I/SycvJBLUy9tg6Jbp9Xhr5RKV0qtVUrtVUrtUUrd510ep5RapZQ66H2M9S5XSql/KKWylVI7lVJDWltDW0oKT+KPo//IK1e9QrglnPs/vp8frPoB2RXZ3/q+XkmR/GZKfzYcPs4zH337tkKINuR2wZJ74fPneS90Gs/o7/DMjIuwmr65qUZrzeqc1UxdPJW5O+Yy1jaWpVOXcteAu7AYfTe0sz/54szfCfxUa90XuAS4RynVF3gYWKO17gWs8b4GuBro5f2ZDcz1QQ1tLis5i7cnvc3Dwx5md9lupi+dzm83/vZbJ465cWgaUwd35ek1B9hw6HgbViuEOC1nE7x7B2x7jXWpd3F/xQ384YaBZMSHf+Nb9hzfwx0f3MEDHz9AqCmUl696mT+N/hNJ4UltWHjrqTM1WZzzDpVaDDzj/blCa31MKZUCfKy1vlAp9W/v8ze92+8/sd037TMrK0tv2bLFp3X6UkVjBXN3zOXt/W8TZgpj9sDZzOgz47RnALVNTib/cx2VDQ4W3j2SzC7f/EsmhPAjex28NRMOfcTOfg8y+YvBzBhu48nrTz8Hb3FdMf/Y9g+WHlpKbEgs9wy+h2m9pmEymNq48LOnlPpCa5112nW+DH+lVCbwKdAfyNVax3iXK6BCax2jlFoG/EFrvc67bg3wkNZ6y1f2NRvPNwNsNtvQnJwcn9XpL4crD/OXLX/hs4LPSItIY07WHMbbxuP5+M22K63lhrn/IzrUzMIfjSIuvGN8TRSi02iohP9+B/I3kz38Sa7+LIOsjDjm3TkMi6llg0iDs4FXd7/KK3tewel2MrPvTL4/4Pt+G2ffl74t/H12wVcpFQEsAO7XWlc3X6c9f2HO6a+M1vp5rXWW1jorISHBV2X6VfeY7jw3/jn+Pf7fhJhCmPPxHGatmMXW4q0tt0uI4MXbsiisauT7/9lCo8MVoIqFCEK1JTBvEhRspfDKuVy/sTvduoTzr1uHtgh+p9vJuwfeZdLCSTy34zkuS72MJVOXMGfonA4R/Gfik/BXSpnxBP8bWuuF3sXF3uYevI8l3uUFQHqzt6d5l3UaI1NH8s517/DLEb+koLaA21bexr1r7uVgxcGT2wzNiOPvNw1ma24FD7y1Xcb/F6ItlB+GV66G44eomPo60z9JINRs5JU7hhEdagZOXcy9fvH1/HrDr0mJSGHexHn89Yq/khaZFuAP4Du+6O2jgJeAL7XWf2u2aglwm/f5bcDiZstneXv9XAJUfVt7f0dlMpi48YIbeX/a+9w35D62FG9h+tLp/GLdLzhW6/m41wxI4dGr+7BidxG/X/FlgCsWopM7ug5eGAv1x2m4eQEzPw6nssHBy7dfTGpMKACbizYzc/lMHvj4AQzKwNNjnua1q19jSFKH6pR4Vlrd5q+UuhT4DNgFnBjA5lFgE/A2YANygO9orcu9fyyeASYC9cAdX23v/6r2fsH3bFQ2VvLirhf5777/olDc1Psm7up/F3EhcTy+ZA/zNuTw68n9uG1kZqBLFaLz+WIevD8H4rrjvOlNvresnM8OlvHibVmMuTCRPWV7eGb7M6wrWEdiWCL3DL6HyT0mt+uLuWejzS74+ktnCP8TjtUe49ntz7L08FKsRis3976ZWX1u5+F3DvPRvmL+NXPoWd9VKIQ4A7cLPvwFbHwOeoxDT3+ZR1fk8ebnuTx5/QCG9Krnue3PsTZvLVGWKO4acBczes8gxHT+k7W0JxL+7dDRqqPM3TGXFUdWEGoK5aYLZ/DRpj4cOObi3zOHMqZ3+70tXIgOobEK3r0LslfB8LvRE57gieUHeXn9EWZcaqExYgWrclYRaY5kVr9ZzOwzkwhLRKCr9ikJ/3bsUOUh5u6YywdHPyDcFI6p7gqK87L4502XMrG/fAMQ4rwcPwTzZ8DxbLjmz7iH3MH/Ld7Nm9s207vPJvLtGwgzh3Fr31u5te+tRFmiAl2xX0j4dwD7y/czd8dc1uSuQWkr9vJL+OXou5mR1S/QpQnRsex8B5bdD0Yz3DgPV+Zofvj2e3xWNh9z5F5CTaF8t893ua3vbcSExAS6Wr+S8O9ADlQc4F/bX2BVzgdobWRYl6v53Zh7SYlICXRpQrRv9jpY8SBsex3SL4HpL7Gx7hgPrv4bFXo3FhXOHQNmMrPPzE4f+idI+HdA+48fZvaSP3NcbcCoYHLP67i93+30iOkR6NKEaH+K98I7t0PZAdyXzmFdr8t4Yc8rbC/dhtsZwaiEafxt4t2drk3/TCT8O6hGh4vvvbGKzRWLCI3fgkvbGZ02mtv73U5WUtbXho0QIuhoDVvnwYqHaLJG8f7IO5hXuonDVYex6Diqi0fx85GzmH3ZmYdn7owk/Dswu9PNffO3sfLLbC4euI8ivYaKpgr6xvfl9n63c2XGlR2+L7IQ56WmGJb/lMr97/NWxkDetGqON1XQI/oCqotGcSSnJ7+b6hmsLVhJ+HdwTpebP67cxwufHSGrWwSTRh5jQfYbHK0+Skp4Crf0voXre14fNO2YIshpDdv/S/aax5gfYmRxVCSN2sWlqZcyIv4Gnn7fTaPdzVM3De5Q98y47XYc+fnYc3Nx5OZiz83DnpeLOTGRlCeeOK99flv4yyljB2AyGnjs2r706xrNQwt2Urgsgbkz/0MFO5i3Zx5/++JvPLv9Wa7tfi239L6F3nHB+RVXdH7O44f5ZNls3mzIYVNCJBaDmWu6X8utfW7l8wNWHn9nD+lxYcz//lB6JbW/wddctXU48rzBnpuDIzcPe24u9rxcnMeKPH/YvAzh4ZhtNizp/vnmImf+Hczugipm/2cLx+vs/OGGAVx/URr7y/czf/983j/8Pg3OBoYkDuGW3rcwzjYOs9Ec6JKFaLWK+jIWrH2Et4vWc8xkJNkUwU0D7mTaBTcQborm8SV7ePPzPK64MIGnb77o5CBtbU1rjauy0nvmntvyLD43F9fxlpM4GWNjsdhsnpC32bDY0k8+N8bFtfq6njT7dDJltU3c88ZWNh0p565Lu/Hw1b0xGw1UNVXxXvZ7zN83n/zafOJC4pjacyo39LoBW1TwtnuKjsmt3Wwu2syC7c+zuvhzHAqGEcqMi+dwee/pmAwmiqsbufv1L9iaW8k9Y3ow58oLMRr82xFCu904S0q+1jzjyMnFnpeHu6amxfamlBQs6emYbelY0m1YMmwnA98Y4d/eRxL+nZDD5eZ373/Jq/87Sv/UKP48fRB9Ujx3Kbq1m3UF63j3wLt8mv8pLu1iWPIwpl8wnXG2cR1mjlERnMoaylicvZiF+98mt66QSJeb65rcTL/obnoNvxeUQmvN4u2FPL50D00ON3+5cRDXDvTdvTDa4cBx7Bj2nNxTzTN53qaavHx0U9OpjU0mLKmp3iaadCwZNszekDenpWGwWn1W17mS8O/EVuw6xv8t3k1Vg4N7x/bi7it6YDaeGqm7pL6E97LfY+HBhRTUFhBjjWFS90lM7jGZ3nG9pbuoaBccbgfrC9azOHsxH+etxaldDGm0M72ugSsH3knIZT8Dq+csuaS6kUcX7Wb1l8VcZIvhz9MH0TPx3M+g3Y2NOPK8oZ6T62mL9569OwoKwHVqkiUVEuI9e/c2z2TYMKene87gU1JQpvZ5+VTCv5Mrr7Pz+JI9LNlRSN+UKP5840D6dY1usY1bu9lYuJF3D77Lx3kf43A76BnTk8k9JnNt92tJDJOB5ETb0lqzt3wvSw8tZfnh5VQ0VRBnDOW6mhqmlZfQvfc0GPdLiEk/uf2ibQU8vmQPTU43P7/qQu4Y1e1bm3lc1dXYc/OaBfup5hlncXGLbQ1RUafa3dObt8FnYErogjL4bOLDNiPhHyRW7i7iF+/tprLezj1jenLPmJ5fm48UoKqpipVHVrLk8BJ2lu7EoAxcknIJk7pPYqxtLOFmmVRe+E9hbSErjqxg6aGlHKo6hNlgZkxENyYXHmBkaS7mtGEw8feQdiqziqoaeWzRLtbsKyErI5Y/TR9I94QIzwXW48dP23vGkZOLq7KyxbGNCV087e4nz949AW+x2TDGxLTtP0QbkPAPIhV1dn6zbC+LthWQGR/Gz666kGv6p2D4hrOjo1VHWXp4KcsOLaOwrhCr0cplqZdxVberGJ06mjBzWBt/AtEZFdUV8eHRD/ng6AfsLNsJwEUJg7jOGMuEvWuIriqA1KEw+kG44CrwNkfWNjl54eODvPfhNhJry7jNZiLLUo8zL+/kBVd3ff2pAxkMmJOTMWfYTl5cPdlUk5aGITy4Tmwk/IPQx/tL+MOKfewrqmFgWjQPT+zNyJ5dvnF7t3azo3QHK4+s5MOcDylrKCPUFMrotNFMzJzIqNRRhJpC2/ATiI6upL6E1Tmr+eDoB2wt2QpA77jeXJV2OVdVV5G+eR7UFoNtBHrEA9itvTxt8Dm5NObkkrNrP/VHc0ioPY7Z3az93Wz2tLefaIM/cZHVZsOSmoqySIeGEyT8g5TLrXlvWwF/W3WAgsoGRl+QwEMTL/za9YCvv8/F1pKtfHD0A1blrKK8sRyr0cqIriMYmz6Wy9MvJy4kro0+hegotNYcrjrMR7kfsTZvLbvKdgHQM6YnEzMnMsGUSsq6Rdi3rsJR6cRuSMeuU3GUVuM4dgzc7pP7ajRZKQiLpykphQsu6kNa/17eNngbpqQklNEYqI/ZoUj4B7lGh4vXN+bwzNpsKusdXDMgmTtHdWNoRuwZe/s43U6+KP6CtXlr+Sj3I47VHcOgDAxOGMxY21guS7uMblHdpNdQkHK4Hewo2cEn+Z/wUe5HHC/JIbkCLnamMdSRSrcaK9bDh7DnF+Cqc7V4rzEm5mTzjCEtjb1EsaAI/tcYSnJGCg9f04fLL0iQ361WkPAXAFQ1OHj+00O8tiGH6kYnA1KjuX1kJpMGpWA1nflMSmvNvvJ9J/8Q7K/YD0BqRCqjuo5iVOoohqcMlwvGnZjWmmM5e9i+bSU5ezdRc+QgccftpFRA1yojIQ3OFtubwjSWcDvm+FAsfS/GMuxazD37YrGlY4yKoqSmkTc25vLGplzKapvokRDOPWN6MnVw6jdepxJnT8JftFBvd7JoWwGvrj/KwZJaukRYmDE8g5nDbSRGnf3E1YW1hawrWMe6gnVsOraJemc9JoOJIYlDGNF1BBcnX0y/+H4y6mgHo51Ozw1Oubk48vKoPZzN8UO7acrJJaS4EovjVGa4DQp3UjzhmT0IS47DbCjBUr8LC/mYIxWGPhMg607oMRa8XSW11uwqqOLV9UdZurMQh0sztncit4/M5LJeXeRM34ck/MVpaa1Zn32cV9Yf4aP9JShgRI94Jg3sysR+ycSGn/2FM4fLwbaSbawrXMf6gvUcqDgAQJgpjCFJQxiWPIxhKcPoHdsbo0HaawPN3dTkubjavIvkiTtYCwrAeaqJxm6C4hgojTXiTk2iS6/+9Og7iow+w7CYKlCH18DexVC0E1DQ7TLoPx36XAdhp64NZZfUsGznMZbtPEZ2SS0RVhPTh6Zx28hMunWRb4v+IOEvzuhoWR0LtuazbOcxjpTVYTIoRvXswqSBKUzol3zOA2WVN5azuWgzm4s283nR5xypOgJAuDmcgV0GMjhxMIMTBjMgYQCRlvY3+mJn4KqtbTGo2MkbnXJzPTc4Nft/3x0WQnVCGPkxLg6F11IYoymNMxHXoy99LhjJsK7DGZQ4CKvTDoc/hoMfwsFVUHPMs4PUoZ7A73c9RJ0aZuFoWR3LdhaybOcx9hXVoBQMy4zjukFdmTK4K5EhMvCgP0n4i7OmtWZPYbX3DK2Q/IoGTAbF4PQYRvbswqge8Vxkiz3tzWPfprS+lM1Fm9laspUdpTs4UHEAt3ajUPSI6cGghEH0je9Lv/h+9IrtJeMPnQWtNa7y8pPNM1+9g9VVXt5ie2N8PIb0rtQlRFAcq8gOr2WLuZB9oRXUhEKoOYwBXQYwKGEQWUlZDE4cTJjLAXmbIXcD5G6EvE3gdoA1ytOU02sC9BwPkUkAVNbb2Xj4OOuzj7P+UBmHS+sAGJoRy6SBKVwzIIWkc2haFK0T1OH/2dsHKMur9XFFwaO2yUlFnZ2qBgd1didag9GgiAwxERVqJtJqIsxqwniO7bQu7aLOUUeto5Zaey11jjpc2nOxUKEINYUSZg4nzBRGqDmUUFMoJhWM1w402u7A3dSIbmxCNzXibmxCNzXhbmwEd/MeNAplsaBCrBisIbjNRuxmRaPRTa2yU+uux+46NSCZxWAlwhJBhDmCCEs4ocZQlLPRMxF6UzU0Vnueg+emK0s4hMRAaCyERAEKu8tNXZOTmkYn1af5HYkONRMXbsV6jicL4pQu6RFc9p0Lzuu9MpmLOG8RVhMRVhPpgNOtqW50UN3goKrBQe5xz52VSkGI2Ui4xUS41Ui41USo2dhigLmvMiojUZYooixR4G3ubXI1Ue+op85ZR72jnorGCsp06cn3mA0WQk0hhJpCCTGFEmIKIcQYgtnQwZsOtPaEedPXw103NYE+1f8dpVAWK4aQEEwREagQKy6zEbsJGgwuGtyNNDgbaHCW49Yu0IATrEYr4aZwEkITCDeHEWawYHLZwV4PDVVQVeh5fuJYBiNYIyHGBiFRaEskdjfU2V3UNzipq6yhtsmFw+XZ3qAUEVYTqTGhRIeaibCa5MJtOxew8FdKTQSeBozAi1rrP/jjOOf7F1OcWUlNI7sLqthdUM2ugir2FFRRWFUDds/6SKuJjC5hZMaH061LOBnx4aTHhpIcHUJiZAihlm+/8Ku1pqiuiOzK7JM/X1Zmc7jyMI2uxpPbhZpCSY9MxxZpwxZlIzUileTwZJLCkkgOTybKEhXwIHLX12PPy285wNiJtvhjx1qOIBkaevKuVVOfNOwp8VQlhFASa6QgrIn8hkJya3LJrc6lsLYQlz713riQOHrE9KBnhI2e1nh6GsPo4dREV+dC+WE4fgjKj0BDszHno+PQyf2xx/elPKo3hdYefOlK5Uh5E0fL6jhyvI688lIcLk8rgUFBr66R9EuNYUBqNP1To+nXNYowi5xLdiQBafZRShmBA8CVQD6wGbhFa733dNtLm3/HUVbbxJ7Cag6V1JJzvI4jx+s5WlZHfkU97q/8qkWGmEiKCiEpykpChJXoUDPRYRbPY6iZmFAzUaFmwixG74+JUIuRELOipP6YJwC9IZhXk0dOdQ75tfk43S37moeaQkkKSyIpLIm4kDjiQuM8jyFxxIbEEmuNJcISQaQ5knBLOOGm8PPqkeSqqvr67E3eNnhnaWnLjaMjoWsSjpR46pKiqOoSSmmckcJYTZGlgeNN5RTXFVNSX4xTt7w5KsIYQrolhgxTBOnKis2tsDld2BpqiKspRVUXohx1Ld7jViZqQ1OpDEmj1JJKoSGFHJLZaU/jy7pwSmrsNDndLd4TYjaQGR/u+ekSTmZ8GBckR9InOeqMf7hF+9Du2vyVUiOAx7XWV3lfPwKgtf796baX8O/47E43+RX1FFQ2UFLdRHFNo+exupHi6kbKaj3XFaobHZzNr6TZqLAYDVhMBsxGA2aDIspkJ85Qg9VYhsFwHG0ox2msxG6optFQQ71qoMHQRL2y02Rwfev+rW5FqDZg1gozCpMGsxti6yGhQhNfqYmtdBPrfYyrdBPa1HIfVeFQGqsojVEUxSjy4zQFcYriGKgL/fo3EaU1UW6Ic7mJc7lIcjlIcTpJdrpIdrpIcXmeR7ndnHi3G0UNYVTqSMp0JEU6lmId532MpZg4CnU8hToep/eLvtmoTv6BTYz0/PFNigohMSqExEjPc1tcGElR1oB/YxKt0x7b/FOBvGav84HhzTdQSs0GZgPYbDIFYUdnMRnonhBB94Rvn3TD7dbUNDqpanBQ2WCnrroCV1UBqvoYxroijHXFWBuKCGkoJcRRidVZRaizijB7DaYmx1nXU6eMlBqslJoslBuM1BqN1BgM1GkDznow1hiwVjsJr4LIaoiu1ERXg6XZIdwKKqPgeIwi/0JFeYyiIhqqYwzURgEmhUkrzIDFDbHaQFe3gZBGA9Z6A6HagFUbCXNbCHVbCNFWXMqCU1lwKRNNhlCaVCiNxjAOmEPZYwzFYQjBbo7CbonBYY7GaY3CbDJjMRmwmgyEWoyEmY30tJgY0OwbU0yY+WTgh1mMEuqi/V7w1Vo/DzwPnjP/AJcj/KmpBkoPQPkhDOWHifb+2I4fgobyr28fEg2RKRDVBcLSPb1PQuM8j2Fxnm6IlghP75STPxFgDgGjFbcLTIWFxOfkEJWXR3rzLpKFheBwAJ4mEGWxeEaQHNh8kg/vDE5du8oIkqLDClT4FwDpzV6neZeJzkxrqMqHol1QvNtzR2jRbqg40mwjBdFpENcN+k6B2EzP68hkT+BHpoDlzHMMuGrrPBdX9+W1mJ7PnpuD81hRixucDOHhmDNsWHv3JnLCBM9E27YMLLZ0zwiSHXAGJyHOJFDhvxnopZTqhif0bwZmBKgW4S8uBxzb6b1ByHuTUH3ZqfVx3SF5AAyeAYl9Ib6nJ+zNZ74JSGuNq7ISR06ON9RzW9zN6jp+vMX2xrg4LOnphGVlnZrkwzsHqzEuTppBRNAJSPhrrZ1KqR8DH+Dp6vmy1npPIGoRPuR2QeE2yF4NR9dB/hZwNnjWxWZCrys9wwAkD4Skvp5+5N9Cu904S0ux5+ScuoP1ZMjn4q5tdvOeUpiSk7GkpxM5dsxX5mC1YYw49wm+hejMAtbmr7VeDiwP1PGFj9SXw6GPPGO9ZK+G+uOAgpSBMPR2sA2H9EtajPfSnHY4PCNIfmVoAntuDo68fM9NTieYTJhTu2KxZRA9ePCpOVgzbJjT0jBYrW3ykYXoDNrtBV/RjtWWwJ5FsHsh5H/uuSs0LN4zxkvPKz1jvoTHn9zc3diI4+BBbx/4lhNtOwoLW97gFBLiucEpM5OIy0afPHO32GyYU1JQJvmVFcIX5P8kcXYaKmHfMtj1Dhz51BP4Sf1h9M+h1wRckT2x5xV4Lq5uWNAi4J3FxS12ZYiKwmKzETqgP1HXXuNpg7elY7ZlYEqUmZuEaAsS/uKbud2eppyt89AHPsRV78ROGvao63EY0rEfqsf+8Q4cOUtxVVa2eKsxoQuWdBvhI0a06D1jTk/HFBsbmM8jhDhJwl+cpF0unEVF2A/uxf6/d3HsXIe9rA57fQiOuiTcTS7ACWwAwybMKSmYbelEXnVVi+YZS1oahnCZnEOI9kzCP8houx17QUHLST5yPRdZHXm5aMepcXGUEcxJ6Zj79SEsM7NF7xlLaqrc4CREBybh3wl5RpDMa9lF0tuTxlFU5GnO8TKEhWFOisVqriCyRwXmGBOWQZdjGXsHpv6XoYwygJcQnZGEfwflqqw82Xum+fR89rxcXKVlLbY1xsRgzrAROmQI0Tabtw3ehsWRjXHHXFThZohKhZG/8NxwFRIVoE8lhGgrEv7tlNYaZ0kpjtycr8/BmpeHu7q6xfampCQs6elEjB7doveMxZaOMapZmLvdsG8pfPoTzzALMRlw3dMw6BYwST95IYKFhH8AaafTc4PTV4YmONEGrxtPTViC0Yg5NRVLejrRgwaevLnJku7pQWMIOYt5UQ9/Ah88BsW7IK4HTJ0LA24EYwefCUsIcc4k/P3M3dSEIz8fe07LM3dHbi72ggJwNrvAarViTk/DYssgfORIzBm2U+PQpKSgzOcZ0mXZ8OEv4MAKz7R8016A/jd4puoTQgQlCX8fcNXWnhxvpsUdrHl5OIu+MoJkRAQWmw1rnz5f6yJpSkz07QiS9eXwyZ9g8wtgCoXxj8Pwu89q4DQhROcm4X8WtNa4ystP3zyTm4uroqLF9sb4eCw2G+HDLj7V991m8wwwFhPj/ztY3S7Y/BKs/R00VcOQWTDmMYhI9O9xhRAdhoS/l3a7cRYXN5tcu2XIu+uazYmqFKaUZCzpNiLHj//KHaw2jBEBvMGp5EtY/GMo2ALdr4CrnoSkfoGrRwjRLgVV+GuHA0dBgbcP/Ffa4PPy0Hb7qY3NZiypqZht6YQNHXpyaAJLRoZnBMn2doOT0w7rnoJP/+zpqnnDS552fRknRwhxGp06/J0VFZQ+/fSpESSPHWs5gmRYGJb0dKzduxFxxeXNJvmwYU5J7jg3OBV8AYvvhZI90H86XP1HCO8S6KqEEO1Ypw5/g8VCzYqVmDMyCB00iOjJ17XoImns0qVjjyDpaIS1v4UNz0JEMtwyHy68OtBVCSE6gM4d/uHhXLBpY6DL8I+ybHj3ds+NWkNugwlPeCY2F0KIs9Cpw7/T2vEWLHsATBa45S24cGKgKxJCdDAS/h2JvQ6WPwjbXwfbSLjhRYhODXRVQogOSMK/oyjeA+/cAWUHPLNnXf4wGOU/nxDi/Eh6dAQ75sPS+zxt+rPe8/TfF0KIVpDwb8/cbljza1j/d8i8DKa/LHfpCiF8QsK/vWqqhYWzYf/7kHUnXP0nGX1TCOEzEv7tUWUuvHkLlOyFq/8Mw74vd+oKIXxKwr+9yfsc5s/wDNfw3Xeh57hAVySE6IR8OH6waLVd78Kr14I1Er63WoJfCOE3rQp/pdSflVL7lFI7lVKLlFIxzdY9opTKVkrtV0pd1Wz5RO+ybKXUw605fqfy+Quw4HuQNgy+twYSLgh0RUKITqy1Z/6rgP5a64HAAeARAKVUX+BmoB8wEXhOKWVUShmBZ4Grgb7ALd5tg5fW8OlfYPnP4IKJMHMBhMUFuiohRCfXqvDXWn+otT4xD+FGIM37fAowX2vdpLU+AmQDw7w/2Vrrw1prOzDfu21w0hpW/R989AQM+A7c9JrMsiWEaBO+bPO/E1jhfZ4K5DVbl+9d9k3Lv0YpNVsptUUptaW0tNSHZbYTbhcs/Qn8759w8ffh+n9LV04hRJs5Y28fpdRqIPk0qx7TWi/2bvMY4ATe8FVhWuvngecBsrKy9Bk271icdlg0G/Ysgst+BmN/IV05hRBt6ozhr7Ue/23rlVK3A5OAcVqfnKm8AEhvtlmadxnfsjw4OJvgrZlw8EO48gkY9ZNAVySECEKt7e0zEXgQmKy1rm+2aglws1LKqpTqBvQCPgc2A72UUt2UUhY8F4WXtKaGDsXlgHfv9AT/tX+T4BdCBExrb/J6BrACq7wzYm3UWv9Qa71HKfU2sBdPc9A9WmsXgFLqx8AHgBF4WWu9p5U1dAxuFyz6IexbBhP/CBffFeiKhBBBrFXhr7Xu+S3rfgf87jTLlwPLW3PcDsft9ozKuftdGPcruOSHga5ICBHk5A5ff9MaVj4E216D0Q/CZXMCXZEQQkj4+5XWsPpX8PnzMOLHMObRQFckhBCAhL9/ffInWP80ZN0FE34r3TmFEO2GhL+/fPEqfPwkDJoB1/xFgl8I0a5I+PtD9mpYNgd6jofJ/wSD/DMLIdoXSSVfK9oNb98OiX3hxldlknUhRLsk4e9L1YXw3+94xuOf8ZbnUQgh2iE5LfWVphpP8DdWwZ0rIfq049UJIUS7IOHvCy4nvHMHFO+FGW9D8oBAVySEEN9Kwr+1tIYVP4fsVTDp79DrW8fBE0KIdkHa/Ftr84uw5WUYdT9k3RHoaoQQ4qxI+LdG7iZY+bBn+sVxvwp0NUIIcdYk/M9XTTG8PQui0z2zcElffiFEByJt/ufD5YB3boemas+E66Exga5ICCHOiYT/+fjw/yD3f3DDS5DcP9DVCCHEOZO2inO1613YNBeG3w0Dpge6GiGEOC8S/ueieA8suRdsI2HCE4GuRgghzpuE/9lqqIT534WQaO+YPeZAVySEEOdN2vzPhtaw9CdQlQe3L4fIpEBXJIQQrSJn/mdj22uwdzGM/T+wDQ90NUII0WoS/mdSlg0rHoJuo2HkTwJdjRBC+ISE/7dx2mHBXWCyyo1cQohORdr8v83a38Gx7XDTGxDVNdDVCCGEz8ip7Dc5/Iln8vWht0OfSYGuRgghfErC/3Tqy2HRDyC+J1z1ZKCrEUIIn5Nmn6/S2nMjV12ZZypGS3igKxJCCJ/zyZm/UuqnSimtlOrifa2UUv9QSmUrpXYqpYY02/Y2pdRB789tvji+T22dB/uWwbhfQsqgQFcjhBB+0eozf6VUOjAByG22+Gqgl/dnODAXGK6UigN+BWQBGvhCKbVEa13R2jp8ojIPPnjM061zxI8DXY0QQviNL878nwIexBPmJ0wB/qM9NgIxSqkU4Cpglda63Bv4q4CJPqih9bSGpfd5Hif/U7p1CiE6tVYlnFJqClCgtd7xlVWpQF6z1/neZd+0/HT7nq2U2qKU2lJaWtqaMs/Ojjfh0BoY/zjEZvr/eEIIEUBnbPZRSq0Gkk+z6jHgUTxNPj6ntX4eeB4gKytLn2Hz1qkp8kzHaBsBF3/Pr4cSQoj24Izhr7Uef7rlSqkBQDdgh1IKIA3YqpQaBhQA6c02T/MuKwCu+Mryj8+jbt/RGpbNAWcTTH5GmnuEEEHhvJNOa71La52otc7UWmfiacIZorUuApYAs7y9fi4BqrTWx4APgAlKqVilVCyebw0ftP5jtMKehbD/fRjzKHTpGdBShBCirfirn/9y4BogG6gH7gDQWpcrpZ4ANnu3+43WutxPNZxZXRksfxC6DoFL7glYGUII0dZ8Fv7es/8TzzVw2jTVWr8MvOyr47bKioegsQqmPAtGud9NCBE8greBe99y2P0ujP45JPUNdDVCCNGmgjP8m2rg/TmQ2A8ufSDQ1QghRJsLzraOT/4INcfgptfBZAl0NUII0eaC78y/5EvYOBeGzIK0rEBXI4QQARFc4a81LP85WCJg3OOBrkYIIQImuJp9di+Ao5/BpKcgPD7Q1QghRMAEz5l/Y7VnxM6uF8GQ9jeStBBCtKXgOfP/5I9QWwy3/BcMxkBXI4QQARUcZ/7Fez0XeYfeBqlDA12NEEIEXOcPf61h+c8gJArG/SrQ1QghRLvQ+Zt9dr0DOevhuqchLC7Q1QghRLvQuc/8G6vgw194mnoumhXoaoQQot3o3Gf+jkZIuxgu+6mM0y+EEM107vCPTIKb3wh0FUII0e7I6bAQQgQhCX8hhAhCEv5CCBGEJPyFECIISfgLIUQQkvAXQoggJOEvhBBBSMJfCCGCkNJaB7qGM1JKlQI5ga7jPHQBygJdRBuTzxwc5DN3DBla64TTregQ4d9RKaW2aK2DaqJg+czBQT5zxyfNPkIIEYQk/IUQIghJ+PvX84EuIADkMwcH+cwdnLT5CyFEEJIzfyGECEIS/kIIEYQk/NuIUuqnSimtlOoS6Fr8TSn1Z6XUPqXUTqXUIqVUTKBr8gel1ESl1H6lVLZS6uFA1+NvSql0pdRapdRepdQepdR9ga6prSiljEqpbUqpZYGuxVck/NuAUiodmADkBrqWNrIK6K+1HggcAB4JcD0+p5QyAs8CVwN9gVuUUn0DW5XfOYGfaq37ApcA9wTBZz7hPuDLQBfhSxL+beMp4EEgKK6ua60/1Fo7vS83AmmBrMdPhgHZWuvDWms7MB+YEuCa/EprfUxrvdX7vAZPGKYGtir/U0qlAdcCLwa6Fl+S8PczpdQUoEBrvSPQtQTIncCKQBfhB6lAXrPX+QRBEJ6glMoELgI2BbiUtvB3PCdv7gDX4VOdewL3NqKUWg0kn2bVY8CjeJp8OpVv+8xa68XebR7D01TwRlvWJvxLKRUBLADu11pXB7oef1JKTQJKtNZfKKWuCHA5PiXh7wNa6/GnW66UGgB0A3YopcDT/LFVKTVMa13UhiX63Dd95hOUUrcDk4BxunPeTFIApDd7neZd1qkppcx4gv8NrfXCQNfTBkYBk5VS1wAhQJRS6nWt9cwA19VqcpNXG1JKHQWytNYdbWTAc6KUmgj8Dbhca10a6Hr8QSllwnMxexye0N8MzNBa7wloYX6kPGcw84ByrfX9AS6nzXnP/H+mtZ4U4FJ8Qtr8hT88A0QCq5RS25VS/wp0Qb7mvaD9Y+ADPBc+3+7Mwe81CrgVGOv977rde0YsOiA58xdCiCAkZ/5CCBGEJPyFECIISfgLIUQQkvAXQoggJOEvhBBBSMJfCCGCkIS/EEIEof8HxZT1fUp3wZAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def func(x):\n", "# return jnp.cos(x)\n", " return x**4\n", "\n", "xi = jnp.linspace(-5,5)\n", "yi = func(xi)\n", "g1 = jax.vmap(jax.grad(func))(xi)\n", "g2 = jax.vmap(jax.grad(jax.grad(func)))(xi)\n", "g3 = jax.vmap(jax.grad(jax.grad(jax.grad(func))))(xi)\n", "g4 = jax.vmap(jax.grad(jax.grad(jax.grad(jax.grad(func)))))(xi)\n", "\n", "\n", "plt.plot(xi,yi)\n", "plt.plot(xi,g1)\n", "plt.plot(xi,g2)\n", "plt.plot(xi,g3)\n", "plt.plot(xi,g4)" ] }, { "cell_type": "code", "execution_count": null, "id": "0b241e50", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.11" } }, "nbformat": 4, "nbformat_minor": 5 }