{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3 (ipykernel)", "language": "python" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "metadata": { "id": "nDwiVvwWi2-i", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.484507Z", "start_time": "2025-10-22T11:32:36.013055Z" } }, "source": [ "import pytensor\n", "import pytensor.tensor as pt\n", "\n", "from pytensor.compile.mode import get_default_mode" ], "outputs": [], "execution_count": 1 }, { "cell_type": "markdown", "source": [ "## Differentiating loops\n", "\n", "Let's write a trivial numerical loop" ], "metadata": { "id": "pr6926Q7i31E" } }, { "cell_type": "code", "source": [ "x0 = 0.95\n", "x = x0\n", "for i in range(4):\n", " x = x ** 2\n", "x4 = x\n", "x4" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Apjcgkkpi7iU", "outputId": "a50d1c34-4b76-4513-d6a6-143befe5f3ad", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.504316Z", "start_time": "2025-10-22T11:32:36.494302Z" } }, "outputs": [ { "data": { "text/plain": [ "0.44012666865176564" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 2 }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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)" ], "metadata": { "id": "Rr9_Zd92nvfc" } }, { "cell_type": "markdown", "source": [ "*Blue squares denote inputs, red outputs, and white, intermediate quantities*" ], "metadata": { "id": "iQ7MSCfSLq_F" } }, { "cell_type": "markdown", "source": [ "How does the final x4 change if we perturb ever so slightly x0. In other words, what is the derivative of the x4 with respect to x0?\n", "\n", "Analytically, this function is equivalent to `x4 = x0 ** 2 ** 4 == x0 ** 16`, so the derivative is `16 * (x0 ** 15)`" ], "metadata": { "id": "Um8OSdLtjXfg" } }, { "cell_type": "code", "source": [ "x0 ** 16" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uUlvMd5ijP-e", "outputId": "536fab0d-78ee-4d93-b154-73a77de999f7", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.550176Z", "start_time": "2025-10-22T11:32:36.545941Z" } }, "outputs": [ { "data": { "text/plain": [ "0.44012666865176536" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 3 }, { "cell_type": "code", "source": [ "16 * x0 ** 15" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "YYwYOTjOjxb1", "outputId": "a292f501-764c-433e-c70d-9b6d17c5dec2", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.601961Z", "start_time": "2025-10-22T11:32:36.597746Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556049" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 4 }, { "cell_type": "markdown", "source": [ "But we're interested in automatic differentiation, not symbolic differentiation. We want an algorithm that works regardless of the update expression in each step of the loop.\n", "\n", "And in particular we want to perform reverse-mode automatic differentiation, which is the most used format for machine learning.\n", "\n", "To get some intuition, we can unroll the loop and differentiate each step in reverse, accumulating the partial derivatives at each step. This is a generic application of the chain rule." ], "metadata": { "id": "CII-p2DlkAI2" } }, { "cell_type": "code", "source": [ "x1 = x0 ** 2\n", "x2 = x1 ** 2\n", "x3 = x2 ** 2\n", "x4 = x3 ** 2" ], "metadata": { "id": "U8Aq8zR2j84d", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.652939Z", "start_time": "2025-10-22T11:32:36.649935Z" } }, "outputs": [], "execution_count": 5 }, { "cell_type": "code", "source": [ "dout_dx4 = 1.0 # They're the same\n", "dout_dx3 = dout_dx4 * 2 * x3\n", "dout_dx2 = dout_dx3 * 2 * x2\n", "dout_dx1 = dout_dx2 * 2 * x1\n", "dout_dx0 = dout_dx1 * 2 * x0\n", "dout_dx0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XglvLv7akc77", "outputId": "052bb55e-2132-4aab-caac-206703e0bfc5", "ExecuteTime": { "end_time": "2025-10-22T11:32:36.703849Z", "start_time": "2025-10-22T11:32:36.699513Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556052" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 6 }, { "cell_type": "markdown", "source": [ "The general pattern is to differentiate the step function `x ** 2` and multiply (or dot in the case of multivariate gradients) with the gradient from the \"future\" step.\n", "\n", "Note that we reused the intermediate steps of the original loop. This is usually the case, so it may be useful if our looping constructs can store these results for the gradient calculation. Programmatically, our approach to differentiate this kind of loop looks something like:" ], "metadata": { "id": "CkBxu8Ebmk6L" } }, { "cell_type": "code", "source": [ "xtm1 = pt.scalar(\"xtm1\")\n", "xt = xtm1 ** 2\n", "\n", "dout_dxt = pt.scalar(\"dout_dxt\")\n", "dout_dxtm1 = pytensor.gradient.Lop(xt, wrt=xtm1, eval_points=dout_dxt)\n", "\n", "step_fn = pytensor.function([xtm1], xt)\n", "d_step_fn = pytensor.function([xtm1, dout_dxt], dout_dxtm1)" ], "metadata": { "id": "ISlEF5-wmiA6", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.269882Z", "start_time": "2025-10-22T11:32:36.748970Z" } }, "outputs": [], "execution_count": 7 }, { "cell_type": "code", "source": [ "xs = [x0]\n", "for i in range(4):\n", " xs.append(float(step_fn(xs[-1])))\n", "xs" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ek8jruKGmgiq", "outputId": "c52010ab-60a2-4dd5-f2e1-baffa173ee2c", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.283935Z", "start_time": "2025-10-22T11:32:37.278620Z" } }, "outputs": [ { "data": { "text/plain": [ "[0.95, 0.9025, 0.81450625, 0.6634204312890625, 0.44012666865176564]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 8 }, { "cell_type": "code", "source": [ "dout_dx4 = 1.0 # They are the same\n", "dout_dxt = dout_dx4\n", "for i in reversed(range(4)):\n", " dout_dxt = float(d_step_fn(xs[i], dout_dxt))\n", "dout_dx0 = dout_dxt\n", "dout_dx0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "k_lzDqHIknM9", "outputId": "498aba89-866e-4084-9edf-98be87c6ac5f", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.336706Z", "start_time": "2025-10-22T11:32:37.331907Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556052" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 9 }, { "cell_type": "markdown", "source": [ "Unsurprisingly, to differentiate a loop operation we just need another loop operation. If we are clever about how we represent it, we can reuse our regular automatic-differentiation machinery..." ], "metadata": { "id": "k-iRUPU9pgtH" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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)" ], "metadata": { "id": "aXvnsuFaTXV5" } }, { "cell_type": "markdown", "source": "*Blue squares denote inputs or gradient with respect to inputs, red squares outputs or output gradients, and white squares denote intermediate quantities. Washed out squares indicate variables not needed for the final computation*", "metadata": { "id": "Sv9S_IUxLvup" } }, { "cell_type": "markdown", "source": [ "This approach works, but it introduces a new loop structure. The original loop's state `x` depended only on its previous state `xtm1`. The gradient loop's state `dout_dxt` depends on both its previous state `dout_dxtm1` and an external sequence `xs[i]`.\n", "\n", "This difference becomes important for higher-order derivatives. If we differentiate this gradient loop again (for the second derivative), our differentiation machinery must handle loops that read from an external sequence.\n", "\n", "Our step function looks like `dout_dxt = 2 * xs[i] * dout_dxtm1`.\n", "\n", "The chain rule doesn't care about the semantics of the input variables, so let's rename them and focus on the essentials:\n", "- `z` for the loop state (the accumulating gradient, `dout_dxt`).\n", "- `y` for the input sequence (`xs`)." ], "metadata": { "id": "nbieh6-tTV0C" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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)" ], "metadata": { "id": "5XVhoTD8wtst" } }, { "cell_type": "markdown", "source": [ "Each step is a function of two variables, of the form `zt = 2 * y[tm1] * ztm1`\n", "\n", "Because we are applying the chain rule, we don't have to know anything about the relationship between each `y`. They are just a sequence of inputs to this specific loop. Accordingly, we draw no arrows between them in the diagram.\n", "\n", "To stay general, we need a way to compute the partial derivatives of the loop outcome with respect to each intermediate `y[tm1]`. Let's give it a more general name: `dout_dyt`.\n", "\n", "We can use the same strategy and reason about the unrolled loop (using our new abstract variable names)" ], "metadata": { "id": "6FoB2kgvwvRX" } }, { "cell_type": "code", "source": [ "y = xs[:-1][::-1]\n", "\n", "z0 = 1.0\n", "z1 = 2 * y[0] * z0\n", "z2 = 2 * y[1] * z1\n", "z3 = 2 * y[2] * z2\n", "z4 = 2 * y[3] * z3\n", "zT = z4\n", "zT" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QMYf9qOKtBGs", "outputId": "ae21d887-9d84-44b8-e1bc-48f31b93996d", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.391210Z", "start_time": "2025-10-22T11:32:37.386353Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556052" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 10 }, { "cell_type": "markdown", "source": [ "We need two quantities. First, the gradient of each intermediate step with respect to the sequence value read on that step.\n", "\n", "`zt = 2 * y[tm1] * ztm1`\n", "\n", "`dzt/dy[t] = 2 * ztm1`\n", "\n", "Again note that we can (and probably want to) reuse the intermediate steps `zt` from the loop we're differentiating. This is a common motif." ], "metadata": { "id": "p1VvOfFhwRLr" } }, { "cell_type": "code", "source": [ "dz4_dy3 = 2 * z3\n", "dz3_dy2 = 2 * z2\n", "dz2_dy1 = 2 * z1\n", "dz1_dy0 = 2 * z0" ], "metadata": { "id": "5i1TO65ywiLZ", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.439015Z", "start_time": "2025-10-22T11:32:37.436394Z" } }, "outputs": [], "execution_count": 11 }, { "cell_type": "markdown", "source": [ "And second, we need the the gradient of each step with respect to the previous step\n", "\n", "`dzt/dztm1 = 2 * y[tm1]`" ], "metadata": { "id": "FkGdLBflwkSp" } }, { "cell_type": "code", "source": [ "dout_dz4 = 1.0 # They're the same\n", "dz4_dz3 = 2 * y[3]\n", "dz3_dz2 = 2 * y[2]\n", "dz2_dz1 = 2 * y[1]\n", "dz1_dz0 = 2 * y[0]" ], "metadata": { "id": "PXscOKT1wPoN", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.507470Z", "start_time": "2025-10-22T11:32:37.504085Z" } }, "outputs": [], "execution_count": 12 }, { "cell_type": "markdown", "source": [ "By the chain rule, the gradient of the final `z` with respect to each indexed sequence is `dout_dyt = dout_dzt * dzt_dyt`.\n", "\n", "In the snippet below we don't accumulate the gradient `dout_dzt` to emphasize how this quantity is generated recursively. This is clearly wasteful!" ], "metadata": { "id": "s2IQmP_DxSSU" } }, { "cell_type": "code", "source": [ "dout_dy3 = dout_dz4 * dz4_dy3\n", "dout_dy2 = dout_dz4 * dz4_dz3 * dz3_dy2\n", "dout_dy1 = dout_dz4 * dz4_dz3 * dz3_dz2 * dz2_dy1\n", "dout_dy0 = dout_dz4 * dz4_dz3 * dz3_dz2 * dz2_dz1 * dz1_dy0\n", "(dout_dy3, dout_dy2, dout_dy1, dout_dy0)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HTq8uHODsqSC", "outputId": "004a54db-b6d9-44a2-ff3e-90ef4a8ace62", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.574931Z", "start_time": "2025-10-22T11:32:37.570384Z" } }, "outputs": [ { "data": { "text/plain": [ "(7.802799665848476, 8.21347333247208, 9.100801476423358, 11.1733967375)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 13 }, { "cell_type": "markdown", "source": [ "This partial derivative is less intuitive to verify analytically, so we'll compare with finite differences." ], "metadata": { "id": "23qaWquvwO32" } }, { "cell_type": "code", "source": [ "# Wrap the gradient loop in a function\n", "def foreach_loop(x0, ys):\n", " x = x0\n", " for y in ys:\n", " x = 2 * x * y\n", " return x\n", "\n", "# Confirm we get the same results\n", "ys = xs[:-1][::-1]\n", "\n", "foreach_loop(1.0, ys)" ], "metadata": { "id": "sp_apcKDwJqb", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "2f5c0a58-400f-40d9-89d0-556194502de1", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.634865Z", "start_time": "2025-10-22T11:32:37.630153Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556052" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 14 }, { "cell_type": "code", "source": [ "# Perform finite differences on each y[t]\n", "def finite_differences(ys, t, eps=1e-5):\n", " ysp, ysm = ys.copy(), ys.copy()\n", " ysp[t] += eps\n", " ysm[t] -= eps\n", " rp = foreach_loop(1.0, ysp)\n", " rm = foreach_loop(1.0, ysm)\n", " return (rp - rm) / (2 * eps)\n", "\n", "[finite_differences(ys, idx) for idx in reversed(range(4))]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XUF0rrd9pMRk", "outputId": "71c8fccd-d057-4213-f5a7-ef20f978a129", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.687418Z", "start_time": "2025-10-22T11:32:37.682248Z" } }, "outputs": [ { "data": { "text/plain": [ "[7.802799665812542, 8.213473332396859, 9.100801476336073, 11.173396737396144]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 15 }, { "cell_type": "markdown", "source": [ "The results match.\n", "\n", "With the risk of over-doing it, here is the graphical representation of our new reverse-mode autodiff loop. Note we generate two quantities as we iterate: the gradient with respect to each sequence and the previous state." ], "metadata": { "id": "KuHkEoJd1AFg" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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)" ], "metadata": { "id": "4hP6Upql05Xp" } }, { "cell_type": "markdown", "source": "Let's recall what our abstract variable names mean for our example:", "metadata": { "id": "Sbxzuz-v1de2" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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vRlNmn+HZi3aii5PJ7ApJUpX0NwC67cfwcpFM3H9ykVc9DsNB8eiaN2hK8ZMmIFiTi6iSySBnqf/WtOJowcynWfEr5PZlBJRhho1a4k/dhzB+jVL8MeapShStDgGDP0Vv06apTbmbX7FvwLRBwqaW2DijEWiyyAdtO+4doeXobxl8qwlmDxriegySMfUc2uKem5NRZehs3hNKREREREJx6aUiIiIiIRjU0pEREREwrEpJSIiIiLh2JQSERERkXBsSomIiIhIODalRERERCQcm1IiIiIiEo5NKREREREJx6aUiIiIiIRjU0pEREREwrEpJSIiIiLh2JQSERERkXBsSomIiIhIODalRERERCQcm1IiIiIiEo5NKREREREJx6aUiIiIiIRjU0pEREREwrEpJSIiIiLh2JQSERERkXBsSomIiIhIODalRERERCQcm1IiIiIiEs5IdAGU3ykglSlEF0E6i/kgTZgP0oT50DdsSkmoAsaG+OvEDdFlQC6Xw8BA/IkDR9uCokvQKcyHKuZDFfOhivlQxXyo0od8sCkloab0rSO6BADAs2fPUKJECUgkEtGl0AeYD9KE+SBNmA/9I751JyIiIqJ8j00pEREREQnHppSIiIiIhGNTSkRERETCsSklIiIiIuHYlBIRERGRcGxKiYiIiEg4NqVEREREJBybUiIiIiISjk0pEREREQnHppSIiIiIhGNTSkRERETCsSklIiIiIuHYlBIRERGRcGxKiYiIiEg4NqVEREREJBybUiIiIiISjk0pEREREQnHppSIiIiIhGNTSkRERETCsSklIiIiIuHYlBIRERGRcGxKiYiIiEg4NqVEREREJBybUiIiIiISjk0p5VvPnj1DVFQUFAqFclpsbCweP34stC7SDcwHacJ8kCbMx+cxEl0AkSjW1tb4999/YWFhAYlEgtjYWLx+/RqVKlUSXRrpAOaDNGE+SBPm4/OwKaV8y9LSEjY2NjA0NMSbN29gYWEBuVwOW1tb0aWRDmA+SBPmgzRhPj4PT99TvlaiRAkkJibCwsICiYmJcHZ2Fl0S6RDmgzRhPkgT5iP72JRSvmZpaQlTU1PI5XIAQOHChUWXRDqE+SBNmA/ShPnIPjallO+VKFECkZGR/BZLGWI+SBPmgzRhPrInV64plcrkubEavSGRSGBoIBFdhs6QSqVC11+wYEGUKFEC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)" ], "metadata": { "id": "_4PCrGns1hKA" } }, { "cell_type": "markdown", "source": [ "This gives us the partial second derivatives with respect to each intermediate step of the original forward loop (the fourth row of boxes). We now need to propagate them back to the initial point x0.\n", "\n", "This is also something slightly new. We have differentiated the final state of a loop with respect to the starting state, and we have differentiated the final state of a loop with respect to a sequence of values **consumed** in a loop. Now we need to differentiate a sequence of values **produced** in a loop with respect to the initial state.\n", "\n", "Let's look back at our first gradient loop scheme:" ], "metadata": { "id": "w5yY5tAy-XYN" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApcAAADlCAYAAAAGGdxyAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAudEVYdENyZWF0aW9uIFRpbWUAV2VkIDIyIE9jdCAyMDI1IDExOjE1OjQ0IEFNIENFU1SP4L3/AAAgAElEQVR4nO3dd1QUhxoF8MsuCIh0a7CiIRGescUSUQQ7ShRriAoKxl5I7AhGURQRW9QUu2hMMRpb7LGhEiVWYiEaQ9FAkCIgKHX3/YFiNrtuLLMzC9zfOTnnOTs78y3vApeZ2VkDpVKpBBERERGRAGRSD0BERERE5QfLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEgzLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEgzLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEoyhWDtSAiguVoi1uzJBZmAAmcxA6jH0glKpRHFxsdRj6BUDAwPI5XKpx9ALzIc65uMZ5kMd8/GMUqmEUsH+8U8GBgYwkOnu+KJo5TI5LRfLvr8Ei8rGYu1SrxUqFKhTzRyjejtJPYpeSEpKwuLFi2FtbS31KHqhsLAQderUwZgxY6QeRS8wH6qYD1XMhyrmQ1VBVhbuHjoAQ2P2DwCAUgHjajVQq4OLznYhWrkEgLo1reHevrGYu9RbaZm5iIlNlHoMveLg4ABfX1+px9ALSUlJOHr0qNRj6BXm4xnmQx3z8Qzzoa6yjQ2qN3lH6jH0QsHDh8j6O1mn++A1l0REREQkGJZLIiIiIhIMyyURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDAsl0REREQkGJZLIiIiIhIMyyURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDAsl0REREQkGJZLIiIiIhIMyyURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDDlplweP/ITHGoaont7J+Tn56k8lpaaglZvV8c79c3x5x+xks1I0jl79ixcXFwwdOhQFBQUqDyWkZEBDw8PdO3aFYmJiZLNSNJhPkgb5oO0+enoURi9YQenDi7Iy89XeSwlNRU1HJ1gYd8Qv//xh2Qziq3clMtO3TzQ32s44v74HSsXB6s8NnfmBGRlZmDGnDDYN3pbshlJOs7OzujZsycSExOxceNGlceWLVuG7OxsjBs3DnXr1pVsRpIO80HaMB+kjUfXrhju9QFu3bmD4PAlKo9NDJiFjMxMhH06G281aiTZjGIrN+USAALnL8MbdnWx8atluHopGgBwcO8POLJ/F9q7dsXg4WPVnrPj203w6u2Clg628Ortgh3fbpJgchLDxIkTUaNGDXz33Xe4ceMGAODEiROIjIxEq1at4Onp+dznRkVFISAgQMRpSWwvmw+FQoEtW7Zg4sSJcHd3h5eXFxYsWIDU1FSJXgHp0svmIyMjA6Ghofjwww/RrVs3DB8+HBs3bkReXt5z9kBl2dLgYNS1s8PyNWsQfekyAOCHvfuw68ABdO3YEWOGDdP6/A3btsH6TQfE3r4t0sS6Va7KZRVzCyz6bAMUCgVm+o/A38n3EBwwCZZWNli0YgMMDAxU1l8RNgezPhmJR7m58BzojUe5uZj1yUisWjpfstdAumNmZoaAgAAolUqEhoYiNTUVy5cvh4WFBQICAtTy8ZRSqcT27dtx584d0Wcm8bxMPgoLCxEUFIT169cjPz8f77//Pho1aoQjR47A19cXaWlpkr4WEt7L5CM3NxcfffQRjhw5ggYNGqB///6wsrLC5s2bMWvWLCiVSklfCwnPwtwc65cvh0KhwIhPPsG95GT4BwbCxsoK61csf+7vFwC4/eefmDJnLnJyc6FQKESdW1fKVbkEgLbt3TDUbzzu3L4Jzy6tkJGeinmLP0f1mm+orJeRnor1ny9B6/dcsOvwecxesAI/HjqHVm07YN2qxcjKzJDsNZRnUv9QbdGiBfr164eEhASMGDECmZmZmDJlCqpWraq2bkZGBs6dO4fZs2fj0qVLksxb0ZSVfBw/fhxnzpxBz549sWbNGowbNw4hISEIDg5GdnY2vvrqK8leQ3lWVvKxfft2pKWlISgoCAsXLsTo0aOxYsUK9OrVCxcuXMDly5clew2kO27tnTHO1xext2+jdbfuSE1Px+pFi/BGjRrPfU5RURF8JkxE7qNHos6qa+WuXALA1KCFqFu/ITLSU9HDoz/cew9UW+f7retQUJCPsR/PgtzQEABgaGSE0f4zkZf3GNu3bZBg8vItOzsbbdq0wbJly1BcXCzZHKNHj4adnR0yMzPh6uoKNzc3jetNmzYN06dPR2RkpOgzVkRlKR/nz58HAIwZM0bliISrqyvq1auHq1evijpzRVCW8nHjxg1YW1ujc+fOKsufrsuzIMIrLi7GsWPHcO/ePUnnWBg4Cw3r10dqejr6e/TCwN7va10/eMlS3LpzB4P79RNtRjGUy3KZlZmBzAfpAIAb167g8aNctXWif4lEpUrGaN3ORWV5W2dXGBoZITqKhUJoFhYWaNWqFT799FPUqVMHy5+cQhDbw4cPkZWVBQC4ffv2c6+BmjdvHiIiIhAREcEL9UVQlvIhl8vh5OQEKysrtccMDAyQm6v+M4deT1nKx/vvv49PPvlEbXl6esnvpdq1a4swacUil8thZ2eHU6dO4eDBg5KVzIzMTKRnlJz5vHLtutYjkmejo7F49WqsmD8f9evWEXFK3TOUegChKZVKzJjkh+ysTLRo3Q6XoqMQHjILny78TGW9uwlxsK1aHUZGlVSWV6pkDGubqribEKfzWYuLi5GSkqLz/eiT0aNHY/v27UhOTsb8+fMRHh6OadOmoWfPnqLsX6lUYuHChcjJyUGTJk3w22+/4auvvsLHH3+stq6dnV3p/zY2Nla7BYmuMR/6m4/AwECNz09ISEB8fDxat26t81mZD/3Nh4vLs4MWeXl5yMrKwu+//461a9eiXr16aN68uSjzFhYWirIffVGnTh1cu3YNpqamuHLlCmJiYvDOO+/AxtRUlP0rlUqM+PhjZGZno12rVoj69VfMWrAQny0IUVs3++FDDJswEb27d4f3oIGYs3ixKDOKpdyVy4h1K/HL6ePwHOSNuaGr0KtjU2zb9AW6e/RDm3YdS9fLzXmIajVqadyGlZUNHmZn6XzW+Ph4DPpsks73o28sLCyQlpaGBw8eAADmzp0LhUIBExMTne97x44duHjxIrp3747Jkydj2LBh2LVrFzp27CjaD/wXFR8fj0GDBkk9hujKaj7i4uIwdepUGBoawtfXV+ezMh9lIx8RERHYtm0bAMDGxgZLly4VZda8vDxcv35d5/vRN3K5HLm5uahSpQry8vJw5MgRuLVtC2MR9r1q/XocP30G3gMHYOXChWjm1glfbt6Mfr16oWO791TWnRgwC3n5+fgyvHyVyqfKVbn849ZNLF0QiGo1aiFw/jJUNquC+Uu+gp+XOwI+/gj7T16BaWUz4Mn1lc+jVCq1vrNLKA0bNsTiU6d0vh99cuXKFfTu3RsAUKVKFTg4OGDx4sV4++23sXv3bp3uOz4+HmvWrIGtrS0mTZoEU1NTTJs2DVOmTMGiRYsQEREhyg/9F9WwYUMsWbLkBdYsP8piPgoKCvDNN99g27ZtkMvlmDNnDpycnHQ6K5iPMpOPbt26oWHDhkhISMDu3bsxYsQIfPbZZ7C3t9fpvCYmJmjWrJlO96FvcnJycPfuXcjlcty/fx/Vq1dHv379YAog/Z5ub3B/89YtBC4MRa0a1bF03jxUMTPDl+GL0fPDwRg5eTIuHz8Gs8qVAQDf79mDb378EXu2bEFVGxudziWVcnPNZVFhIaaO90Z+fh7mLf4ClpbWAID2rl3R74NhuJcYh8XzZ5auX61aDWRnPtC4raysB6heU/NRTXo9gYGBSE1NRfPmzbF7925cvHhR7aJ3XSgqKsL8+fNRUFCAqVOnwtzcHADQqlUruLu7Izk5GV9++aXO5yDtylo+bt68CT8/P2zcuBHvvvsuNm/ejI4dO2rYAwmhrOUDABo0aIAuXbqUlsrs7GysW7dO5zNXRDdv3kR6ejpMTEzQrVs3uLq6arwuWmiFhYXwmTARefn5+DwsDNaWlgCArh07YtgHgxCXmIiZISWnxlNSUzFhxkyM9PZGzy66z65Uyk25/Cw8GDd+u4Le/Qejc3fVd2cFzFuCajVq4ZvNX+GX08cBAFWr10RGeiqKi4pU1i0sLEDmg/TnnjKnV/fgwQNYWlpi3759uHTpkii/FJ7auHEjbt++ja5du8LZ2VnlsQkTJsDW1rb0lxVJo6zl4+eff8a4ceNQUFCAZcuWITQ0FDVr1hRt5oqmrOQjLy8Phw4dws2bN9W2Y29vj5o1ayIuTvfX9Fc0RUVFkMvl8PT0FK1UPhW8ZCmuXLuGwf364f1u3VQeC587F7VqVMeaiC04fuYMEu7eQ2Z2NtZt3QqjN+xK/1u4ouR9IU3dOsHoDTvc+P130ebXhXJzWnzKrBBMmaV+0SwAWFpa4+zVuyrLWrZuh5M/H8ClC7+gVdsOpcsvnj+LwoICNH+3rc5nrmisra3xzTffSLLvUaNGYdSoURofMzc3x65du0SfiVSVpXzcvn0boaGhcHJyQlhYGMzMzESatOIqK/koLCzEokWL8N577yE0NFRt/ZycHNSvX1+n81ZEhoaGaNGihST7DgmYiZCAmRofs7a0ROI/7mt6LzkZsz72V1vvVNQvOBsdjZFDh6JaVVtUtbXV6cy6Vm7K5cvqO8gHK8LmYNNXy0vLpVKpxOa1n8HQyAj9PtD+UU1EVHF9//33KCoqwrRp01gsSYWRkRGaNm2K6OhoxMfHqxTJ/fv34+HDhxXuWkh6pnatWgiePl1t+ZzFi3E2OhoTRvjB8a23JJlNSBW2XFav+QbGTQ7CqvBgjBzyPlq3c8Evp4/jzMmjmBwwH7ZVq0s9IhHpqejoaJiYmGDr1q0aHzczM9N4n0OqGKZMmYJJkyZh1KhR6NSpE2xtbXHnzh1ERUWhXr168Pb2lnpEIp2qsOUSACZOmQ3bqtWwd+c3+HJFKN5ybIIFS9dg4JARUo9GRHoqLy8PmZmZAIAjR45oXMfGxoblsgKrW7cuVq5ciW3btuHmzZtITk5G7dq14e3tjaFDh+rVXSmIdKFCl0sAGDxsDAYPGyP1GKTnNmzgx4FSCRMTE34kKP2nunXrIiAgQOoxqIwInj5d4+nysqrcvFuciIiIiKTHcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEgzLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEgzLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYlksiIiIiEgzLJREREREJxlDc3SlRVKwUd5d6Sqng1+HflEolioqKpB5DLygUCqlH0DvMxzPMhzrm4xnmQ51SoYSSXxdApHyIVi6NDGXIzsnDzqOXxdqlRkVFRcjPz4eZmZmkcwDA2/WspR5BbxgZGSEtLQ3Lly+XdA59ykfjxo2lHkFvMB/qmI9nmA91zMczBnIZigoLkXTpktSj6I3KdnY63b6BUqmsUIfQoqOjsXr1amzZskXqUUgPMR+kDfNB2jAfRCV4zSURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDAsl0REREQkGJZLIiIiIhIMyyURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDAsl0REREQkGJZLIiIiIhIMyyURERERCYblkoiIiIgEw3JJRERERIJhuSQiIiIiwbBcEhEREZFgWC6JiIiISDAsl0REREQkGJZLIiIiIhJMhS+XBQUFUo9Aeoz5IG2YD9KG+aCKqkKUy+TkZLi5uWH79u2lyxITEzF48GB8+eWXks5G0mM+SBvmg7RhPojUGSiVSqXUQ4ihR48eiIqKgq2tLczNzZGeno7Hjx/j+PHjaNasmdTjkcSYD9KG+SBtmA8iVRWmXF6+fBnu7u5ISUkpXda7d2/s2bNH0rlIPzAfpA3zQdowH0SqKsRpcQBo3rw5WrduXfrvGjVqIDg4WNKZSH8wH6QN80HaMB9EqipMuQSAefPmoXr16gCANm3a8HQFqWA+SBvmg7RhPoieqVDlslmzZnj33XdhbW3NvypJDfNB2jAfpA3zQfSMaNdcKgEUFyvE2JVW165dw9dff41FixZJPQpkBgaQyQykHkMvKJVKFBcXSz2GXuXDwMAAcrlc6jH0AvOhjvl4hvlQx3z8g1IJRVGR1FPoFQOZDAY6zIdo5TIpLRfLvr8Ei8rGYuxO7xUqFKhTzRyjejtJPYpe+Ouvv7B48WJYW1tLPYpeKCwsRJ06dTBmzBipR9ELzIcq5kMV86GK+VCVk5iAc4EzYWJpJfUoekFRVAgL+0ZoNn2mzvZhqLMta1C3pjXc2zcWc5d6Ky0zFzGxiVKPoVccHBzg6+sr9Rh6ISkpCUePHpV6DL3CfDzDfKhjPp5hPtTZ2DeCk6en1GPohdz795Fw+ZJO91GhrrkkIiIiIt1iuSQiIiIiwbBcEhEREZFgWC6JiIiISDBlrlweO7QXDjUNMWfGeKlH0UipVML5ndo4uPcHqUepkM6cOQMXFxcsXbpU6lE0UiqV8PT0xIkTJ6QepUJiPkgb5oNIGGWuXOq7yxfOISvzAVw69ZB6FNJD169fx8OHD9GmTRupRyE9xHyQNswHlRUslwI7cmAX2rt2hVkVc6lHIT0UGRmJ1q1bo3LlylKPQnqI+SBtmA8qK1guBXZk/y5069VX6jFIT506dQouLi5Sj0F6ivkgbZgPKitYLgV089pV/J10F526eUg9Cumh27dv4/79+3B2dpZ6FNJDzAdpw3xQWSLqJ/S8jMgTh/FdxBrEXLkAuUyO5u+2hc/ISVKPpdWRA7vQ6j0XWFnbSj1KuXf+/Hns2bMHsbGxkMlkcHJywsCBA6UeS6vIyEg0a9YMFhYWUo9S7jEfpA3zQaRbelkuV4YH4/NlIVAqlTCtbIZq1Wvi4L4dOHZ4Hzz6ekk93nMd2b8Lg335Wa66tnHjRkRERECpVMLExAS2trY4efIkzp49iy5dukg93nNFRkbCkx8/pnPMB2nDfJBUch8/RreRo/GBew9MGjJY6nF0Su/K5eUL57B66XxUqmSMoJDlGDhkBORyOVJTkuE/+kPs/G6z1CNqFH/nFv64dQNde/SRepRy7fr169i8eTOMjIzg7+8PDw8PyGQypKenY86cOThw4IDUI2p09+5dxMfHo0OHDlKPUq4xH6QN80FS+unkKVy8cQMu77aUehSd07trLleEfQoAGOMfAC+fUZDL5QCAajVqYe3WvTC3sBRljvt/J8G7X+cXvl/l4QO70LRFa1Sv+YbOZ6vI1q9fDwDw9vZG7969IZOVRNjW1hZhYWEwMzMTZY60tDT4+/u/8P3mIiMj4ejoiKpVq+p8toqM+SBtmA+SStL9+wj4bKXUY4hG78rltasXAQA+H01Qe6yKuQX69B8iyhx5eY9xPuoUkv+6+0LrHz2wm+8SF0FsbCwAYMCAAWqPmZmZoVu3bqLMkZ+fj8uXLyMlJeWF1o+MjOS7PEXAfJA2zAeJ6VZCAlZ/8y18g2bDsY8nku7fl3ok0ehVuUxLTcHD7CxUq1ELFpZWGtdp6PC26HP9l7+T7+G3KxfQ1Z3Xw+hSRkYGcnNzYWtriypVqmhcp379+qLP9V9SU1MRGxvLXw46xnyQNswHie2HQ4cxdclSfHvgIPLyC6QeR1R6VS6NjIwAAAYGBs9dx8LSWuPyuwl/4uNRH6JT6zfx7ltVMdjTFT9+H6GyTnFxMRxqGmLhp1PUnj9twjA0a1hSaL9csRBd2r4FAFgUPB0ONQ2Rlvr8vzCPHtgNh8ZNUK9Boxd8pfQqDA1LLhHWlg9zc803r09KSsKcOXPwwQcfoGfPnpgwYQIOHjyoso5CoYCLiwtWrVql9vyQkBB0794dALBlyxZ8+OGHAIAvvvgCLi4uyMjIeO5MkZGRsLe3h52d3Qu+UnoVzAdpw3yQ2Ab26I4fli0t/c+1VSupRxKNXr2hx9LKBpZW1rj/dxIeZmdpvL4yPu4PtWXXYi7Bu19nKBQK9PDoD2sbW5w5eRQz/UfgesxlzF6w4qXmcH9/AKysbTFnxnj0+2AYurr3ee6RVPDG6aKxsLCAubk50tLSkJubq/H6qLt31S9j+P333+Hv7w+FQgFXV1dYWlri119/RWhoKG7dugV/f/+XmsPNzQ2WlpZYunQp3N3d0aFDh+f+UgJPaYmG+SBtmA8Sm0O9enCoV6/033tPnpR0HjHpVbkEgHeat8LpE0ewZf1qjJ8cqPJYYWEBdn2/Re05Cz+djKLCQuw8fB4ObzsBAIoKCzHOtz+2bfoCAwf74W2nd154hvoNHSB78kYih7ed0LlH7+eu+yAjDRfOn8HsBZ+9xKukV9W4cWNER0djx44dGDZsmMpjhYWFOHTokNpzVq1ahaKiIqxbtw4NGjQAABQVFSEwMBC7du1Cr1690KjRix91rlOnTukbARo0aID27ds/d92srCxcvXr1pX8B0athPkgb5oNIHHp1WhwAJk2bCzw5Nb396/VQKBQAgOysTHw8ejDuJcaprJ+WmoIL586g7wc+pcUSAAyNjDA5IAQKhQJHDuzS2bw/H9oLuzr14dD4fzrbBz3j5+cHPDm1tG/fvtJ85OTkIDg4GMnJySrrZ2RkICYmBj169Cj9xYAnp8hGjhwJhUKByMhInc175swZ1KpVC/b29jrbBz3DfJA2zAeROPSuXDZt0RoTpsxGYWEBgqaOQUsHW7h3aII2jjVw9MBujJ8cpLJ+/J+3AQCNnZqqbevNt51gaGhYuo4uHNm/C9179dPZ9kmVo6Mjhg8fjqKiIoSHh6Nnz57w9vaGh4cHIiMj1Y5G3Lt3DwDw5ptvqm3L3t4ecrm8dB1dOHXqFDp27Kiz7ZMq5oO0YT6IxKF35RIAJk2bg3Xb9qFz9/dhbm6JpL8S0bRFa6z9ei+8vEdqfI6mi7QNDAxgIJOhuKjoP/dZXFz80nPmPMxG1Olj6NqT7xIXk5+fH8LCwuDs7AwzMzOkpKTA0dERYWFh6N1b8yUMz7uIXyaTvdD/90+PcLyM3NxcXLx4kTc+FhnzQdowH0S6p3fXXD7l0qkHXDr10PjYrb+flcX69iV/Ud68flVtvTu3Y1FYUIAGjd5SWa7pGz0x/s5Lz1jF3ALXEx+99PPo9bVt2xZt27bV+Ng/T1PVrl0bAHD7tvrR64SEBBQWFqJOnToqy5VKpdq6f/3110vPaGZmhmPHjr308+j1MR+kDfNBpFt6eeTyZVStVgMtWrfDru+34M7tm6XLi4uKsDw0CDKZrPTIokwmg7GxCW5cu6yyjehfIvHblQsat69QvvxfnKQ/bGxs0KRJExw6dAgJCQmly4uLi7Fu3TrIZLLSd2IaGBigUqVKuHXrlso2rly5Unrz5X/T9IuEyg7mg7RhPohejd4euXwZQSErMLRvJwxwb4defQbBytoWp08exs1rVzFs5CQ4NWkOPPnm7+DWDT8f2osPPNqjU/f3kZKchB+2bYC5hSWK/nH6vIq5BWQyGQ7s+QGmppXRz2s4TE0rS/gq6VVNmjQJkyZNwujRo9GpUydYWloiOjoat2/fxoABA+Dg4AA8yUfr1q1x5swZjB07Fu3bt0dqaip++uknmJmZqZz+MjMzg0wmw4kTJ2BiYgJ3d3eYmJhI+CrpVTEfpA3zQfTyyvyRSwD43zstsPfYRbi4dcfZyGP4dssamFUxx+JVmxA4f5nKuguXr0N/r+G4lxiPpQsC8fXGz9G1pyd8Ppqosp6NbTWMmjgDyX/dxYqwOXj8KFfkV0VCeeutt7Bx40a0adMGFy5cwO7du2FqaorAwEBMmjRJZd2ZM2eiZ8+eSE5Oxpo1a/Djjz/CxcVF7ePirKysMGTIEKSkpGD9+vXIy8sT+VWRUJgP0ob5IHp5BkqRjssnpeVix6k4uLdvLMbuXkjOw2zk5+fBtmp10fedlpmLmNhEjO7DWxjhyTVJu3fvhq+vr9SjlMrNzUVBQQGsrTV/KpQuJSUl4ejRoxg7dqzo+9ZHzIcq5kMV86GK+VCVk5iAWxvWw8lT2jffjpwbjK179+ETH2+EfizdvUtz799HwuVLaD4z8AXWfjXl4rT4q6piboEq5hZSj0F6yszMTOOneBCB+aD/wHxQRVYuTosTERERkX6o0Ecu9VleXh4v8KbnYj5IG+aDtGE+pLFu7hysmztH6jFEwSOXeubs2bNwdnbGDz/8IPUopIeYD9KG+SBtmA8SC49c6omoqCgsWLAAN27cQFZWFnr00HwDeaqYmA/ShvkgbZgPEhvLpcSuXr2KoKAgXL9+HXFxcZDJZPD19YVCoUBKSorU44kmIyND6hH0EvNRgvnQjPkowXxoxnyUyGc+RMdyKbE+ffrg7t27pR9JaWVlhZiYGAwaNEjq0URlbGwMDw8PqcfQO8xHCeZDM+ajBPOhGfNRorqhHNPf0/xxn6QbLJcS+/333zFv3jysW7cOWVlZyMjIQMeOHfHjjz9KPZqont6njlQxHyWYD82YjxLMh2bMR4mn97kk8ZTLN/QcO7QXDjUNMWfGeKlH+U/GxsZYsGAB4uPjERQUhJo1a+LEiROIiYmRerRy68yZM3BxccHSpUulHuU/MR/iYz5IG+aD6L+Vy3JZFvgLtYEAABCqSURBVFWuXBmzZ8/Gn3/+iXHjxuHOnTtSj0R6hPkgbZgP0ob5ILHxtLieMTU1xYIFCyDSp3JSGcN8kDbMB2nDfJBYeORSTxkYGEg9Aukx5oO0YT5IG+aDdI3lkoiIiOgfqrZ3wb6Tp3S+n1sJCRg4eYrkcwitTJ8WjzxxGN9FrEHMlQuQy+Ro/m5b+IycJPVYpCfOnz+PPXv2IDY2FjKZDE5OThg4cKDUY5GeYD5IG+aDxLD/VCR6ubhIPYbgymy5XBkejM+XhUCpVMK0shmqVa+Jg/t24NjhffDo6yX1eCSxjRs3IiIiAkqlEiYmJrC1tcXJkydx9uxZdOnSRerxSGLMB2nDfJBYDpw+ja8XhUo9huDKZLm8fOEcVi+dj0qVjBEUshwDh4yAXC5Hakoy/Ed/iJ3fbZZ6RJLQ9evXsXnzZhgZGcHf3x8eHh6QyWRIT0/HnDlzcODAAalHJAkxH6QN80FieZCVjaLiYtSwtZV6FMGVyWsuV4R9CgAY4x8AL59RkMvlAIBqNWph7da9MLewfK3tX/r1F4wc8j5avV0dHq7NsCRkFooKCwWZnXRv/fqSm+V6e3ujd+/ekMlKYm5ra4uwsDCYmZkJsp/09HSMGjUK6enpgmyPxKHrfBw/fhwzZsxAnz594OnpialTp+L69euCzE66p8t8FBYWYtOmTfD19UW3bt3g5eWFhQsX4v79+4LNTy/v3NUYuPmNQPUOHdHe2wfHz0eLst9DZ8+gu7Oz5HPoQpksl9euXgQA+Hw0Qe2xKuYW6NN/yCtv+9Sxg/Du3xmxN2LQs89A1Kj1BtauXgw/L3fevqGMiI2NBQAMGDBA7TEzMzN069ZNkP3s3bsXsbGxKOQfHmWKLvOxbds2zJ07F3FxcXB1dUW7du1w7do1jBs3DufOnXutuUkcuszH7NmzsWnTJpiamsLT0xOOjo44evQoRo0ahaysrNeam15NbFwcuo4chRo2tvhmcRhGDhgAv9mf4lFe3mtv+/tDhzF71ernPr4/8jQ8OroIOsf1P+7A1rkD8gsKXnv+11HmTounpabgYXYWqtWoBQtLK43rNHR4+5W3v3zRbFhaWuOHA2dRs1ZtAMDShUFYs3IRTp88Ahe37q+8bdK9jIwM5ObmwtbWFlWqVNG4Tv369V95+48ePcKdO3dw+vRp/PDDD68xKUlBl/n4+++/sW7dOjRq1AirVq0qPcI1ZMgQfPTRRwgPD8fOnTtfa37SLV3m4/Lly4iKikLv3r0xderU0uVt27ZFSEgIduzYgREjRrzy7PRqlm/ZCof69fDN4kWlR6mrVK6MITNmvva2H2Rn4V6K5qPShUVFiP0zDv9r1EiwOfILCjA8MAi5jx+/9uyvq8wduTQyMgL+4z5dFpbWr7TtS9FRuPHbFQwY7FdaLAFg9MTpMDQywpb1q15puyQeQ8OSv5e05cPc3PyVt79hwwaMHz8e3333HYqLi195OyQNXeYjOjoaCoUCPj4+KqdO7ezs0KVLF6SmpiI5OfmVtk3i0GU+bty4AWg4Iurq6goDAwN+ao5Ert3+A92dnUsLHQD0aO+ssk5icjL6TJyEGi6uaNK3Hzb+uKv0MbtOXZD4j+/rwdNnYPPuPTh8NgrzvvwKe0+cgG/QbLX9nr54CR1atnjhOeL/SoKdW2fcuXsXePJGoCZ9++Fxfn7pOrNXrUarJv97za+IMMpcubS0soGllTXu/52Eh9maTyPEx/2h8u9bsdfhVLcyPhmjerr82tWLaGxnjOCAiQCA6F9K7iXVwU31tEcVcws0a9kGv/5ymqfG9ZyFhQXMzc2RlpaG3NxcjevcffLN+VRcXBw6d+6M4OBgleWxsbFwdXXF8uXLS5cNGTIEERERiIiIEOz0OolHl/koKipCvXr10OjJkYh/evoL43n7JP2gy3w0a9YMM2bMQK1atVTWy8jIgFKpRO3atUHik8vl+PefEsaVKkEuL/meVSqV8Jo6HY3t7fHHoQNYHzwXs1etRuSFi1q32925HT4dOwa93dywKWS+2uP7IyPh0bHjC89R3+4NzBw5AuNDFuLho0f4JCwca+fMgamxMQDg+PloRF25glkjP3rFr4Swyly5BIB3mrcCAGxZr34tQ2FhAXZ9v0VlmcPbTvCfPhf7d3+PI/t3la43Y5If6tZviOmfhgEA7ibEAQBq1rJT227NWrXx+FEu0tN44bW+a9y4MQBgx44dao8VFhbi0KFDKssaNGgAPz8/HDt2DJGRkaXrhYaGws7ODmPHji1d18bGBg0aNECDBg1gafl6bxwjaegqH/369cPWrVvVSkJBQQGioqJQpUoV1KlTR4evjISgq3w4OTmhV69eMDY2RnFxMdLT0xETE4N58+bBzMyMtziSiFOjhjgS9YvKgaPTFy+iuFgBPLnJ+R+JiZg3YTzMK1dGm3fegV+/vvjuXzl4WZEXLqocufyvOQBgvJcXHj1+jC4jPkIfN1e816wp8ORd5xMXhmLD/HmoZGj0WnMJpUyWy0nT5gIAvlyxENu/Xg+FouSLn52ViY9HD8a9xDi154wYOwXNWrbB3JkTkPkgHauXhiDuzu8IXx0BU9PKAIDcnIfAk6Oj/2b1ZNmj3BydvjZ6fX5+fgCALVu2YN++faX5yMnJQXBwsMZTkx9++CGcnJywbNkyZGdnIyIiAomJiQgKCoKJiYnor4F0R8x85ObmYsqUKUhJSYGPjw+MnxxlIP0lRj4uXryIvn37YsKECbhx4waCg4Ph4OAgwqujf/vYeyhu/vknhs4MwMlff8X3Bw9hzLwQmJuV9IKk+/dRq1o1VDJ6Vtrsa9fGXykpGrf3Imc3r/9xB2/Wq6uyzf+aA0/OgIz/0AtXf7+FMR8MKl0+YeFCTBj8Id56jfcTCK1MlsumLVpjwpTZKCwsQNDUMWjpYAv3Dk3QxrEGjh7YjfGTg9SeI5fLsXjlJuQ8zMZ43wFYt3oxxn4SWHoUFAAMjZ7f+JUoCQw/k1X/OTo6Yvjw4SgqKkJ4eDh69uwJb29veHh4IDIyEsOGDVN7jkwmw6xZs5Cbm4vAwEBs27YNPj4+pUcxqPwQKx/Hjh2Dj48PYmJiMGTIEHh58cMdygIx8tGoUSMEBwdj3LhxqFevHqZPn44jR46I8Oro396qXx9H163FX/fvY+DkKVix9WusDJgJ+ydnIN6oXh3JqakoLCoqfU5CUhJqVatW+u9ixbOji9df4NrZ/ZHqn8rzX3MAwOP8fMxfsxZd33sPgZ+tLF1+5tJlfBK2GCYt3kXdriWXa1m2bYev9/30yl+X11Xm3i3+1KRpc9CsZRt8G7EG12MuI+mvRDRt0Rpj/APQ2KkpPl8Wovac+g0dMHlWCBZ+OgWN/9cU4/wDVB6vWr0mACA764HaO9GzMh8AT+6lSfrPz88Pjo6O2LNnD27duoWUlBQ4OjrC29sbjRo1QkREhNpz6tSpg1GjRmHVqlV488034ePjI8nspHu6zEd6ejrCwsJw7tw52NvbY/bs2WjWrJkIr4qEouufHzY2NnBzcwMAeHp6wsfHBytXrkTnzp1L79tM4nmvWVOc3LRRZVl353bAkyORDevUQfAXXyJw9Chc/+MO1u38EdvCSj5Vx8rcHN/uP4DpI/xw8PQZ3IpPUNnOYw23Epru5/vScwDA3M+/QNum72DVrAC0GDgIe06cQB83NyQcPVy6zv30DNTt2g1Z56JgXKnSK309hFBmyyUAuHTqAZdOPTQ+duvvIo3L7yXGAwCS7t3Fg4y00kIJANWq1QAA3P87GbXrNlB5XmpKMiwsrWBiYirgKyBdatu2Ldq2bavxsafXRv3b01NeKSkpyMrKgo2N+iUSVD7oIh/x8fGYOHEi8vPz4e/vj759+6q8+5PKDqHzERkZCblcDmdn1Xcim5iYoEWLFjhw4ADS09NRvXp1QV8HvR4DAwN8t2QxJi5chPpdu6OajQ1CJk6Aa6uSs55Lpk5B6PoNWLxpE+rWqoXebq6lz3Vu3hxhGzZh6MyA1/6Ix/MxMfju4CFc3rEdpsbGWBkwE6PmzoNrq1awfM5ts6RUoX7qRUUew9YNqzHUdxzyHj/C7GljVR5v0brkmz7q9HGV5Y8fP8LlC+fQ7F3NP2iofLhw4QJ27tyJvn37Ii8vD+Hh4VKPRHrkv/KRl5eHadOmQS6XY+3atejfvz+LZQXyX/nYvn07QkJCNF6Tl5OTA5lMBisrzfduJmnVe+MN7F29EimRJ3Ft94/w7etZ+ph7h/aIjNiEzF+iEPPjTmxfugTDPfsAAJq8+SbiDh8U5LPD27zzDhKOHobNkzeSdn3vPcQdPqhWLKvb2iDv0gVJj1qiIpXL7KxMzPQfgWYt2yBowQpMmj4Hxw7vw54d20rXaf5uWzR8szF2frcZWVkPSpd/s+lLFBTkw2voSImmJ13LyclBaGgoHB0d4e/vDz8/P5w9e5bXQRHwgvk4duwYUlJS4Ofn91o36qey50Xy0bJlS+Tm5mL//v0qz42Li8O5c+fg6OiIShIXAiKhlOnT4i9j7swJeJCRhogdhyGTyeA3ZjIO7t2BkKCP0a5Dp9JrKWfNW4qxw/piaN/O8PAchIS4O9i1fQs6dnaHW9deUr8M0pFly5YhKysLy5cvh0wmg5eXF06ePInPPvsMLVu2hK2trdQjkoReJB/R0SWfAxwdHY2YmBiN2xk7diyzVA69SD68vLxw8eJFhIeHIyoqCg0aNEBqaipOnDgBmUym8qk9RGVdhThyeXDvD/hp13f4eEYwGjR8C3jy7vFFKzYgNzdH5fR4B7duWP/tftSsZYf1XyzDb1cuwHf0J/hi807IDStMF69QTpw4gZ9//hkfffQR6tatCzx59+fMmTPx+PFjLFmyROoRSUIvmo+n19tFRkbiyJEjGv/jTdTLnxfNh6mpKcLDwzFo0CA8ePAAO3bswLVr1+Dq6ootW7bA3t5e4ldCJJwK0Zbcew+Ee++BassdGv8PN+6qfwZnW2dXtHV2VVtO5ZObm1vpOzf/yd7eHsePH9f4HACYOHEiJk6cqOPpSGovmo+1a9eKPBnpg5f5+WFqaorx48eLOB2RNCrEkUsiIiIiEgfLJREREREJhuWSiIiIiATDcklEREREgmG5JCIiIiLBsFwSERERkWBYLomIiIhIMCyXRERERCQYkW+irkRRsVLcXeoppYJfh39TKpUoKiqSegy9oFAopB5B7zAfzzAf6piPZ5gPdUoooSwulnoMvaBQ6P7rIFq5NDKUITsnDzuPXhZrl3rv7XrWUo+gN4yMjJCWlobly5dLPYreaNy4sdQj6A3mQx3z8QzzoY75eEZmZIS8zExc3LpF6lH0RtWmzXS6fQOlUslDaEREREQkCF5zSURERESCYbkkIiIiIsGwXBIRERGRYFguiYiIiEgwLJdEREREJBiWSyIiIiISDMslEREREQmG5ZKIiIiIBMNySURERESCYbkkIiIiIsGwXBIRERGRYFguiYiIiEgwLJdEREREJBiWSyIiIiISDMslEREREQmG5ZKIiIiIBMNySURERESCYbkkIiIiIsGwXBIRERGRYFguiYiIiEgwLJdEREREJBiWSyIiIiISDMslEREREQmG5ZKIiIiIBMNySURERESCYbkkIiIiIsGwXBIRERGRYFguiYiIiEgwLJdEREREJBiWSyIiIiISzP8BVdNuTUN8on8AAAAASUVORK5CYII=)" ], "metadata": { "id": "Vdyc2Ge1W4B_" } }, { "cell_type": "markdown", "source": "We can re-express it as follows:", "metadata": { "id": "kflY59ASW89c" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,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80GqLFq0CAUFBWjWrBlcXFzQuXNn5OfnY9q0aWKXplZacxudTCaDlZUVevXqBSMjI9y7dw8NGzZE7dq1kZGRIXZ5JDK5XI7evXvDxsYGISEhaNCgAWrWrImkpCTI5XLo6GjVZzP6f5gPUoX5oNfZsWMHunfvjhYtWuCvv/5CWFgYjhw5AqlUChMT7XhEotY0nLq6uqhevTrw38W7L9na2sLW1lbEykgTeHt7F5tmYWFRdPqDtBvzQaowH6TKN998U2yar68vfH19RalHLPzYRVQCLXw8Lb0F5oNUYT6oNBKJRGvzwYaT6P+RSCRil0AajPkgVZgPUkWb88GGk4iIiIgExYaTiIiISE14Sp2IiIiIBMNrOImIiIiIBMKGk4iIiEgNeISTiJRo6wsCvRnmg1RhPqg0bDi1jEQigZ6e1jzznt6Srq6u2CWQBmM+SBXmg1R5+QU02kgrG06FQoGCggKxyyANJZfLxS6BNBjzQaowH6RKZGQkj3ASEREREQmBDScRERERCYoNJxEREREJig0nEREREQmKDScRERERCYoNJxEREREJig0nEREREQmKDScRERERCYoNJxEREREJig0nEREREQmKDScRERERCYoNJxEREREJig0nEREREQmKDScRERERCUpP3QPK5Ap1D1mMXFH4nybUIgGgoyMRuwyNIJPJxC4BACCXyyGXy0WvRyKRQEeHnwlfEvv38RLzoZnE/n28xHxoJnl+vtglAAD0JBIoCgpEr0cikUCip94WUKJQKNTWdcnkChy9/BgGBrrqGrJUubm5MDQ0FLcICaAnATo0dhO3Dg1x8OBBmJiYiF2GZmTjvzeuzp07i12GxmA+lDEfypgPZcyHssChA2FiZy92GcjPz4e+vr7YZUABoO3qtWodU+1HOA0MdNHYx0Xdw2okuVyBOw8SxS5DYxgZGaFt27Zil6Exzp49K3YJGoX5UMZ8KGM+lDEfyoxt7dBsTIDYZWiM4A3r1T4mj7cTERERkaDYcBIRERGRoNhwEhEREZGg2HASERERkaDYcBIRERGRoNhwEhEREZGg2HASERERkaDYcBIRERGRoNhwEhEREZGg2HASERERkaDU/tWWYgq5egm3blxFWmoyDPQNUMXDC238/GFn7yB2aSSyyMhIBAUFIT4+HgqFAs7Ozmjbti18fHzELo00APNBqjAf9KZG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)" ], "metadata": { "id": "j39bNhIMXYNE" } }, { "cell_type": "markdown", "source": [ "Where at each intermediate step we accumulate the total gradient coming from the next step (the horizontal ← arrow), which represents the effect this variable had in the subsequent iterations of the loop, and the partial gradient coming from it's direct use (the vertical ↑ arrow).\n", "\n", "It just so happened that in the first derivative example, the only \"external\" gradient contribution was at the very last step (`dout_dx4 = 1.0`).\n", "\n", "Now we have the reversed scenario. All but the last step have external contributions, the partial second derivatives with respect to each intermediate `x` of the original forward loop." ], "metadata": { "id": "zXBYGjxQXbZA" } }, { "cell_type": "markdown", "source": [ "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApwAAAFKCAYAAACwxI8KAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAAudEVYdENyZWF0aW9uIFRpbWUAV2VkIDIyIE9jdCAyMDI1IDExOjIwOjQ1IEFNIENFU1S98rJiAAAgAElEQVR4nOzdd3xN9/8H8NfN3iGCkCBGjZhNxBab2oRoSo0aNWqFL2rUjFF7j9pRFKWlqE0SM4jECCESYkQSmRIy7vj9EeJ3e+MQcu65SV7Px8PjUeec+/m8b/Ny875nylQqlQpERERERCLRk7oAIiIiIirY2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkajYcBIRERGRqNhwEhEREZGo2HASERERkagMtDGJXKHUxjT5hkwmg76eTOoydIYyM1PqEnSKTCaDzEAr/zTzBeZDHfOhjvlQx3yoUyoUUpegU2QAZPr6kswteirlCiX+t/o8bKxMxJ4qX1DJAAOZDFP7u0pdik5QZmbidL/eMC1mK3UpOkNmYIDGy1dJXYZOYD40MR/vMR+amI/3lAoFIvbtgb6xsdSl6AyZoRHKdeosydxa+RpkY2WC7zq4aGMqnSdXqLD/5A2py9AppsVs4TposNRl6ASVQoHrO3ykLkOnMB/vMR+amI/3mA9N+sbGcGjQUOoydIJKqcTzwEDJ5uc5nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJCo2nEREREQkKjacRERERCQqNpxEREREJKp833CeOXEYle0M0K5JdaSnp6mtexkbDdeqJVDL0RLhYfckq5Gk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)" ], "metadata": { "id": "Njk2MvnHXKH7" } }, { "cell_type": "code", "source": [ "dout_dx = [dout_dy3, dout_dy2, dout_dy1, dout_dy0, 0]\n", "for i in reversed(range(4)):\n", " dout_dx[i] += float(d_step_fn(xs[i], dout_dx[i+1]))\n", "dout_dx0 = dout_dx[0]\n", "dout_dx0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4CRAB76GXItK", "outputId": "8b091b76-2929-48ac-b8ce-c87e66546177", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.737068Z", "start_time": "2025-10-22T11:32:37.731833Z" } }, "outputs": [ { "data": { "text/plain": [ "117.04199498772715" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 16 }, { "cell_type": "markdown", "source": "This value we can check easily against the symbolic second derivative", "metadata": { "id": "ZbvAhvyWpvnE" } }, { "cell_type": "code", "source": [ "16 * 15 * x0 ** 14" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "V0BpI1BQW52n", "outputId": "3f55971f-bc34-4e1b-9765-50a1da664c8b", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.788679Z", "start_time": "2025-10-22T11:32:37.784973Z" } }, "outputs": [ { "data": { "text/plain": [ "117.0419949877271" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 17 }, { "cell_type": "markdown", "source": [ "### General strategy: A tape to accumulate partial derivatives as we iterate" ], "metadata": { "id": "Q0_7yyzVwtKX" } }, { "cell_type": "markdown", "source": "Maintaining a read/write tape of accumulated partials per step is the core of loop autodiff in PyTensor.", "metadata": { "id": "Od4o8rf9w3r0" } }, { "cell_type": "markdown", "source": "We can represent the first gradient loop with the same general approach. This time let's be smart and remember to store the intermediate values.", "metadata": { "id": "POuU-J8CqndT" } }, { "cell_type": "code", "source": [ "dout_dx = [0, 0, 0, 0, 1]\n", "for i in reversed(range(4)):\n", " dout_dx[i] += float(d_step_fn(xs[i], dout_dx[i+1]))\n", "dout_dx0 = dout_dx[0]\n", "dout_dx0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fkIPOh12B50T", "outputId": "876dec54-2f6d-4da2-a049-14b09165d1d4", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.843038Z", "start_time": "2025-10-22T11:32:37.838302Z" } }, "outputs": [ { "data": { "text/plain": [ "7.412659682556052" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 18 }, { "cell_type": "markdown", "source": [ "It can also be used for the second gradient loop. In our quick and dirty implementation above we computed 2 intermediate quantities separately `dout_dyt` and `dzt_dztm1`, and then combined them manually like this:" ], "metadata": { "id": "T8xFcmcDptiA" } }, { "cell_type": "code", "source": [ "dout_dy3 = dout_dz4 * dz4_dy3\n", "dout_dy2 = dout_dz4 * dz4_dz3 * dz3_dy2\n", "dout_dy1 = dout_dz4 * dz4_dz3 * dz3_dz2 * dz2_dy1\n", "dout_dy0 = dout_dz4 * dz4_dz3 * dz3_dz2 * dz2_dz1 * dz1_dy0\n", "(dout_dy3, dout_dy2, dout_dy1, dout_dy0)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qlN8UQlkp3nj", "outputId": "ee790d84-c292-490d-f5d6-ac45128fa14e", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.897019Z", "start_time": "2025-10-22T11:32:37.891867Z" } }, "outputs": [ { "data": { "text/plain": [ "(7.802799665848476, 8.21347333247208, 9.100801476423358, 11.1733967375)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 19 }, { "cell_type": "markdown", "source": [ "Now we'll do it all in a single pass, using our autodiff machinery" ], "metadata": { "id": "ys0__CJMv-Tt" } }, { "cell_type": "code", "source": [ "ztm1 = pt.scalar(\"ztm1\")\n", "ytm1 = pt.scalar(\"ytm1\")\n", "\n", "zt = 2 * ytm1 * ztm1\n", "\n", "dout_dzt = pt.scalar(\"dout_dzt\")\n", "dout_dztm1 = pytensor.gradient.Lop(zt, wrt=ztm1, eval_points=dout_dzt)\n", "dout_dytm1 = pytensor.gradient.Lop(zt, wrt=ytm1, eval_points=dout_dzt)\n", "\n", "d_dzt_step_fn = pytensor.function([ytm1, dout_dzt], dout_dztm1)\n", "d_dyt_step_fn = pytensor.function([ztm1, dout_dzt], dout_dytm1)" ], "metadata": { "id": "Y2KYE5X8cpwc", "ExecuteTime": { "end_time": "2025-10-22T11:32:37.971500Z", "start_time": "2025-10-22T11:32:37.943474Z" } }, "outputs": [], "execution_count": 20 }, { "cell_type": "code", "source": [ "# Inputs to our loop\n", "# z: the reversed forward steps consumed by the first auto-diff loop (reversed once more)\n", "z = y[::-1]\n", "# w: the intermediate steps produced by the first auto-diff loop (already reversed,\n", "# ignoring the last entry which isn't needed)\n", "w = dout_dx[1:]\n", "# partial derivatives of each intermediate step of the second auto-diff loop,\n", "# only first variable is connected to the cost\n", "dout_dzt = [1, 0, 0, 0, 0]\n", "# partial derivatives of the second auto-diff loop with respect to each read sequence\n", "dout_dyt = []\n", "for i in range(4):\n", " # Accumulate the partial derivative with respect to the previous step\n", " dout_dzt[i+1] = float(d_dzt_step_fn(z[i], dout_dzt[i]))\n", " # Output the partial derivative with respect to the read sequence\n", " dout_dyt.append(float(d_dyt_step_fn(w[i], dout_dzt[i])))\n", "dout_dyt\n", "[7.802799665848476, 8.21347333247208, 9.100801476423358, 11.1733967375]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "YPrlA67_qtkM", "outputId": "378daf76-17ec-4f74-bd2a-1da9e3a67e68", "ExecuteTime": { "end_time": "2025-10-22T11:32:38.008869Z", "start_time": "2025-10-22T11:32:38.002427Z" } }, "outputs": [ { "data": { "text/plain": [ "[7.802799665848476, 8.21347333247208, 9.100801476423358, 11.1733967375]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 21 }, { "cell_type": "markdown", "source": [ "Although not always needed, this approach is the most general. We've seen how it can be used to accumulate gradients where only the last state of the loop is connected to the cost, or where all but the last state are connected. In fact, we can have arbitrary dense/sparse/uneven connection between intermediate steps and the final function cost.\n", "\n", "The only thing we haven't discussed is how to explicitly differentiate over the operation of updating such a tape. We won't show it here, but the same tape procedure can be used for it, meaning we have a closed auto-diff system (i.e., we can keep doing higher order differentiation using the exesting procedures)" ], "metadata": { "id": "2_Oapol0yWyH" } }, { "cell_type": "markdown", "source": [ "## PyTensor Scan\n", "\n", "PyTensor uses Scan to represent symbolic loops. For reasons that are now clear, it automatically stores a tape of initial, intermediate results, and final results as iterates. It masks the initial results before returning the sequence.\n", "\n", "When a user is only interested in the final element (or any subset), they should index the returned sequence. Differentiating through this indexing operation creates a mask of zeros for the unused values, and the gradient for used ones. This is the very tape that will be updated by the reverse Scan.\n", "\n", "Use `dprint` on the function below to identify these elements and the four `Scan` instances derived in the notebook." ], "metadata": { "id": "ovGLkQK9woro" } }, { "cell_type": "code", "source": [ "x0 = pt.scalar(\"x0\")\n", "xs, _ = pytensor.scan(\n", " fn = lambda xtm1: xtm1 ** 2,\n", " outputs_info=[x0],\n", " n_steps=4,\n", " # for readability\n", " mode=get_default_mode().excluding(\"fusion\")\n", ")\n", "out = xs[-1]\n", "g = pt.grad(out, wrt=x0)\n", "h = pt.grad(g, wrt=x0)\n", "\n", "# for readability\n", "mode = get_default_mode().excluding(\"scan_pushout\")\n", "h_fn = pytensor.function([x0], h, mode=mode)\n", "# Uncomment line below\n", "# h_fn.dprint(print_shape=True)" ], "metadata": { "id": "xUim5ysDQLgp", "ExecuteTime": { "end_time": "2025-10-22T11:32:40.034337Z", "start_time": "2025-10-22T11:32:38.055710Z" } }, "outputs": [], "execution_count": 22 } ] }