{
"cells": [
{
"cell_type": "markdown",
"id": "5fc0e085",
"metadata": {},
"source": [
"# Implicit gradients through the iLQR solver\n",
"\n",
"Often the optimal trajectory is just one component of a larger model.\n",
"Examples are learning the dynamics or cost parameters $\\theta$ from data (inverse optimal control), or using a planner as a layer in a neural network, as in iLQR-VAE (Schimel et al., 2022). Training such a model needs $\\partial \\tau^\\star(\\theta) / \\partial\\theta$, where $\\tau^\\star = (x^\\star, u^\\star)$ is the solution.\n",
"\n",
"There are two ways to get these gradients:\n",
"\n",
"- **Direct:** backpropagate through every iteration of the solver. This is exact for the unrolled computation, but memory grows with the number of iterations, and the gradient depends on the solver's path as well as its solution.\n",
"- **Implicit:** differentiate the optimality (KKT) conditions at the solution, as OptNet (Amos and Kolter, 2017) does for quadratic programs. By the implicit function theorem, the vector–Jacobian product is the solution of another LQR problem built from the Hessian of the Lagrangian. Its cost is about one extra LQR solve, independent of the number of solver iterations.\n",
"\n",
"`diffilqrax.diff_ilqr.dilqr` implements the implicit approach as a `jax.custom_vjp`. It returns $\\tau^\\star = [x_t, u_t]$, an array of shape `(T+1, n+m)` whose last row of $u$ is padded with zeros. You can call `jax.grad` on it like any other JAX function."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "7f4944a4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-14T22:40:31.332647Z",
"iopub.status.busy": "2026-10-14T22:40:31.332347Z",
"iopub.status.idle": "2026-10-14T22:40:31.965086Z",
"shell.execute_reply": "2026-10-14T22:40:31.964319Z"
}
},
"outputs": [],
"source": [
"import jax\n",
"import jax.numpy as jnp\n",
"import jax.random as jr\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from diffilqrax.diff_ilqr import dilqr\n",
"from diffilqrax.ilqr import ilqr_solver\n",
"from diffilqrax.typs import System, ModelDims, iLQRParams, Theta\n",
"\n",
"jax.config.update(\"jax_enable_x64\", True)"
]
},
{
"cell_type": "markdown",
"id": "a6f503a2",
"metadata": {},
"source": [
"## The problem\n",
"\n",
"A small recurrent network $x_{t+1} = U_h \\tanh(x_t) + W_h \\tanh(u_t)$ must track a sine target under a learnable state cost $Q$. The parameters are $\\theta = (U_h, W_h, Q)$."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f3b4f8a1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-14T22:40:31.968990Z",
"iopub.status.busy": "2026-10-14T22:40:31.968626Z",
"iopub.status.idle": "2026-10-14T22:40:32.904089Z",
"shell.execute_reply": "2026-10-14T22:40:32.903187Z"
}
},
"outputs": [],
"source": [
"dims = ModelDims(n=6, m=2, horizon=60, dt=0.1)\n",
"k1, k2, k3 = jr.split(jr.PRNGKey(0), 3)\n",
"L = 0.5 * jr.normal(k3, (dims.n, dims.n)) / jnp.sqrt(dims.n)\n",
"theta = Theta(\n",
" Uh=0.5 * jr.normal(k1, (dims.n, dims.n)) / jnp.sqrt(dims.n),\n",
" Wh=0.5 * jr.normal(k2, (dims.n, dims.m)) / jnp.sqrt(dims.n),\n",
" sigma=jnp.zeros(dims.n),\n",
" Q=L @ L.T + 0.1 * jnp.eye(dims.n),\n",
")\n",
"params = iLQRParams(x0=jnp.zeros(dims.n), theta=theta)\n",
"\n",
"\n",
"def cost(t, x, u, theta):\n",
" err = x - jnp.sin(t / 5.0)\n",
" return err @ theta.Q @ err + jnp.sum(u**2)\n",
"\n",
"\n",
"def costf(x, theta):\n",
" return jnp.sum(x**2)\n",
"\n",
"\n",
"def dynamics(t, x, u, theta):\n",
" return theta.Uh @ jnp.tanh(x) + theta.Wh @ jnp.tanh(u)\n",
"\n",
"\n",
"model = System(cost, costf, dynamics, dims)\n",
"Us_init = jnp.zeros((dims.horizon, dims.m))\n",
"solver_kwargs = dict(max_iter=100, kkt_tol=1e-10)"
]
},
{
"cell_type": "markdown",
"id": "dcff0ce7",
"metadata": {},
"source": [
"## A loss on the optimal trajectory\n",
"\n",
"As an example outer objective, take the squared norm of the optimal trajectory,\n",
"$\\mathcal{L}(\\theta) = \\lVert x^\\star(\\theta)\\rVert^2 + \\lVert u^\\star(\\theta)\\rVert^2$. We\n",
"compare three gradients:\n",
"\n",
"1. **implicit**: `dilqr` with the exact Lagrangian Hessian (the default, `exact_hessian=True`);\n",
"2. **direct**: `jax.grad` through every iteration of `ilqr_solver`;\n",
"3. **Gauss–Newton implicit**: `dilqr(..., exact_hessian=False)`, which drops the dynamics\n",
" curvature $\\lambda^\\top \\nabla^2 f$. It is cheaper, but exact only for linear dynamics."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "57de73e0",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-14T22:40:32.907559Z",
"iopub.status.busy": "2026-10-14T22:40:32.907312Z",
"iopub.status.idle": "2026-10-14T22:40:54.699349Z",
"shell.execute_reply": "2026-10-14T22:40:54.698606Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loss: implicit 4.68615848, direct 4.68615848\n"
]
}
],
"source": [
"def implicit_loss(theta, exact_hessian=True):\n",
" tau = dilqr(model, iLQRParams(params.x0, theta), Us_init, exact_hessian=exact_hessian, **solver_kwargs)\n",
" return jnp.sum(tau**2)\n",
"\n",
"\n",
"def direct_loss(theta):\n",
" (Xs, Us, _), _, _ = ilqr_solver(model, iLQRParams(params.x0, theta), Us_init, **solver_kwargs)\n",
" return jnp.sum(Xs**2) + jnp.sum(Us**2)\n",
"\n",
"\n",
"val_imp, g_imp = jax.value_and_grad(implicit_loss)(theta)\n",
"val_dir, g_dir = jax.value_and_grad(direct_loss)(theta)\n",
"g_gn = jax.grad(lambda th: implicit_loss(th, exact_hessian=False))(theta)\n",
"print(f\"loss: implicit {float(val_imp):.8f}, direct {float(val_dir):.8f}\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "224b1d4f",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-14T22:40:54.702751Z",
"iopub.status.busy": "2026-10-14T22:40:54.702546Z",
"iopub.status.idle": "2026-10-14T22:40:55.598123Z",
"shell.execute_reply": "2026-10-14T22:40:55.597352Z"
},
"tags": [
"thumbnail"
]
},
"outputs": [
{
"data": {
"image/png": "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Bwezbdu2E45t3br1jK/31VdfMXDgwEJt9evXJzk5maysrNNev379+hQUFPDnn3+ecGz79u04nU7q169/xrlERCoqb+vHwV1cMU2TRYsWsXbtWnr06OE51r17d3Jycvjqq6/YsWOHtmAWEcG7+vKQkBD69u3LTz/9dNIp9h999BF5eXlceeWVZ5xNKi8VV6RCs9vtXHDBBcyfP589e/Z42jdv3sy33357Rtfav38/v/32W6HhhwADBw6koKCAV155xdPmdDp58cUXT7jGgAEDAHjppZdOODZz5sxC54iIiPf143BsDZXnnnsOh8NRaORKXFwctWvX5plnnil0rohIZeZtfflDDz2EaZqMGDGCnJycQsd27tzJvffeS2xsLMOHDz+jbFK5abcgqfCmTJnCN998Q8+ePbntttsoKCjgxRdfpFWrVicMB9y+fTuPP/74Cddo3749Bw4cICgo6IQVxy+55BJ69OjB/fffz65du2jZsiWffPIJGRkZJ1wnPj6e0aNH83//939s27aN888/H4DvvvuOBQsWMHr06FOuXC4iUhl5Uz8O7vVSYmNjWb58OXFxccTExBQ63r17d+bNm4dhGIVGtYiIVGbe1Jefc845/Oc//2HcuHG0bduWESNGULt2bbZs2cIbb7yBzWZj/vz5RERElOrPQCo2FVekwmvbti3ffvst48eP55FHHqFu3bpMmTKF5OTkEzryrVu38vDDD59wjVGjRpGRkUHv3r09ixYeZbPZ+Pzzzxk3bhxz5szBMAwuvfRSnn32Wdq3b3/CtV577TXatGnD22+/zaRJkwD3QlsvvPACY8eOLcV3LiJSMXhbPw7uG/MPPvig0KiVo3r06MG8efNo3rw51atXP4t3LiJScXhbX37nnXfSoUMHZsyYwfPPP8+hQ4cwTZPo6GjWr19PrVq1SvcHIBWeYWrlNJHTKigooHr16kybNo3bbrvN6jgiInKG1I+LiPi+su7Lp06dyiOPPMKDDz5Y5MgZkVPRyBWRYkhNTeXuu+9m8ODBVkcREZESUD8uIuL7yrovf/jhh9m3bx9PPPEE9erV46abbiqT7yMVk0auiIiIiIiIiIicBe0WJCIiIiIiIiJyFlRcERERERERERE5CyquiIiIiIiIiIicBRVXRERERERERETOQqXaLcjlcrFv3z6qVq2KYRhWxxEROSOmaXL48GFiYmKw2Sp3bVz9uYj4usrSp6u/FhFfV9z+ulIVV/bt20dsbKzVMUREzkpSUhJ169a1Ooal1J+LSEXh7X36X3/9xX333cfXX39NdnY2jRs3ZtasWSQkJBTr9eqvRaSiOF1/XamKK1WrVgXcP5SwsDCL04iInJnMzExiY2M9fVllpv5cRHydL/TpaWlp9OjRg969e/P1118TFRXFtm3biIyMLPY11F+LiK8rbn9dqYorR4cihoWFqXMXEZ+lYdXqz0Wk4vDmPv3pp58mNjaWWbNmedoaNGhwRtdQfy0iFcXp+uuKO8FTRERERERK7PPPPychIYErr7yS6Oho2rdvzxtvvHHK1+Tl5ZGZmVnoISJSGVSqkSun4nQ6cTgcVscQ8fD398dut1sdQ0RERCqpHTt28MorrzB+/HgeeOABVq1axZ133klAQAA33HBDka+ZNm0aU6ZMKeekIiLWM0zTNK0OUV4yMzMJDw8nIyOj0LDErKws9u7dSyX6UYgPMAyDunXrEhoaanUU8RIn68MqI/0sRMTX+UI/FhAQQEJCAsuWLfO03XnnnaxatYrly5cX+Zq8vDzy8vI8z4+uVeDN71NE5FSK219X+pErTqeTvXv3EhISQlRUlFfPe5XKwzRNDh48yN69e2nSpIlGsIiIiEi5q127Ni1btizU1qJFC+bNm3fS1wQGBhIYGFjW0UREvE6lL644HA5M0yQqKorg4GCr44h4REVFsWvXLhwOh4orIiIiUu569OjB1q1bC7X98ccf1K9f36JEIiLeSwva/kMjVsTb6O+kiIiIWOnuu+9mxYoVPPnkk2zfvp3333+f119/nbFjx1odTUTE66i4IiIiIiIiJ+jUqROffvopH3zwAa1bt2bq1Kk8//zzXHfddVZHExHxOiqueCmHw8GUKVNo3rw5rVq1on379lx22WWsW7fO6mjs2rULwzAYNWqUpy0rK6tUR1o8//zzpKSklNr1APbt20fPnj1L9Zq7du0iIiLC8zw+Pp7Dhw+f8jWjR49m8eLFAMyfP58VK1aUaiYRERGR0nLxxRezYcMGcnNz2bx5M2PGjLE6koiIV1JxxUvdeOONrF27luXLl7Np0ybWrl3L7bfffsK8V6uEhITw9ddfk5iYWCbXL4viSkxMDD///HOpXvPf1q1bR9WqVU95zptvvknv3r0BFVcqq4MHD550lwUREfEts2fPJj8/3+oYIiJyGl988UWZXl/FlbPhyIHlM2HBRPdXR06pXHbbtm18+umnvP3220RGRnra+/Xrx9VXXw3Ahg0bOOecc+jQoQMtW7bk8ccf95z36KOPMm7cOM/zl156iREjRgCwYsUKOnbsSHx8PK1bt+aVV14B3P/gb9myJfHx8bRp04aVK1eeMqO/vz+TJk1i0qRJJ30PF110EZ06daJt27a89NJLALz++uvcdNNNACQmJmIYBgsXLgTgscce8zz27dvH1VdfTXx8POvWrSMrK4uRI0fSunVrWrduzZQpUzzfq1evXkyYMIGePXvSqFEjbrnlliIz/XuUiWEYPPHEE3Tp0oW4uDjmz5/PtGnTSEhIoEmTJixZsqTQ6yZMmEDbtm1p1aoVixYtKvJ7GIZBeno6AJs3b+aCCy6gbdu2tG3blldffdWTd/78+SxYsIDPP/+c6dOnEx8fz5tvvnnKn7n4PtM0tYC2iEgF06tXL7Zv3251DBEROQnTNAFo2bIlmZmZZfZ9Kv1uQSXmyIG3+sP+jWDYwXTC+rkwaiH4n90/mtauXUvjxo2pVq3aSc+Ji4vj+++/JzAwkJycHLp3706/fv3o2rXrKa89bdo0JkyYwNChQwFIS0sD4J577mHLli3Url0bh8NBXl7eaXPecsstPP/88yxdupR27dp52p1OJ0OHDmXOnDk0b96c7OxsunbtSpcuXejXrx9PPfUUAN999x3dunVj0aJF9O/fn++++46nn36a7t278/bbb/Phhx8SHx8PwH333UdeXh6///47OTk5nHPOOTRv3txTbPrzzz9ZvHgxDoeDli1bsnz5crp163ba9xAaGsrKlSv5/vvvGTRoEC+99BKrV6/m448/ZuLEiaxatQqAjIwMWrRowYwZM1ixYgWXXnopf/7550mvW1BQwKBBg5gyZYrnZ/33338XOmfgwIFceumlxMfHFyqGScVkmiY33XQTzZs355577vH83RYREd9zdJHXDz/8kLi4OKvjiIjIScyfP59XXnmFzz//nEaNGpXp99LIlZJa/ba7sGK6wOVwf92/0d1eyv7880/i4+Np1qwZN954IwA5OTmMHj2aNm3a0LVrV3bv3l2s9Vh69+7N1KlTeeyxx/jll188I2P69u3L8OHD+b//+z927txJaGjoaa/l7+/P1KlTue+++wq1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atTI6igiUgouvPDCQguZNmzYkK1bt/LKK68wY8YMC5PJ2UrPzmfix+tJSsuhTlV/nh3akbfeektrY4mcJRVXxHIul4vLL7+c5oEHadl4GIlR9bDjxImNlsZuhtkXuU80nRAZZ2lWERE5xuVyMXXqVK6//noaNGjAM888Y3UkESlDGRkZVKtW7ZTn5OXlkZeX53memZlZ1rHkDKRn59N12vfkOlxk/f4di3/7kp//mM6vky8iIkTTvUTOhqYFieVsNhsXXHABfbt3YF7gFB70e4/r7N+7pwIFPEqQzQmGDWq1gYSRVscVEZF/ZGRk8P777/PLL79YHUVEytj27dt58cUXufnmm0953rRp0wgPD/c8YmNjyymhFMfEj9eT63ABEFC7CUENE8jDj4kfr7c4mYjv08gVscymTZtYv3491157LWPHjgVHDrz1O6P3fwuG3T1SJbQWNLsQqjd2F1b8g62OLSJS6e3bt4/g4GAiIyNZv349QUFBVkcSkWK6//77efrpp095zubNm2nevLnn+V9//cWFF17IlVdeyZgxY0752kmTJhXa/S0zM1MFFi+ya38aGSs+Jqzz5QRExREQFQdAUlqOtcFEKgAVV8Qys2fPZvHixVx11VX4+fm5CyejFsLqt91rq0TGqaAiIuJlXC4XAwcOpHXr1syZM0eFFREfc8899zBixIhTntOwYUPPn/ft20fv3r3p3r07r7/++mmvHxgYSGBg4NnGlDISlLmHjBX/I7hBBwJqHlsjKzZS99siZ0vFFSl3+/fvp2bNmkybNo2cnBx3YeUo/2DoNta6cCIiclKmaWKz2Xjttdf0SbSIj4qKiiIqKqpY5/7111/07t2bjh07MmvWLGw2rSjgq/bv3090dDTvjruETlmBOIIiAROAIPKZflE9awOKVAAqrkiZynU4mbNiN0mp2cRWC8F/13LuvP02NmzYQL169ahatarVEUVEpBheeukl1q5dy5tvvkmXLl2sjiMiZeyvv/6iV69e1K9fnxkzZnDw4EHPsVq1almYTM7UgQMHaNmyJU899RRjQn9gVdgSJhbcQpIZRaxxkOl+rxLxXS8Y+oHVUUV8moorUmZyHU6GvLKMxORM7IaB0zRpWq0G055+Rp94ioj4mGrVqlGtWjVM08QwDKvjiEgZ++6779i+fTvbt2+nbt26hY6ZpmlRKimJ6Oho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Fzo1L168WDz77LNCCCHWrFkjQkJCdO5ftWqVACDq6+t1xsPCwkRqamoXR4mIbA3znHlORJaBec28JuPrZdJODhGAq1evoqWlBZGRkdqxfv36YdiwYV0+NiIiQuf2xYsXcerUKW2nHADa29tx9+5d3L59G0VFRRg4cCAee+wxg2q+c+eO9nTBRzFq1Cjtv319fQEAtbW1CAgIAAAEBgbC09NTu80333wDf39/+Pv7a8dCQkLQt29ffPPNNxg7duxDn+/KlSu4ffs2fvrTn+qMt7S0ICwsTPscP/waAMATTzzR6f6USiVu377d1TSJyMYwz5nnRGQZmNfMazI+NlfIovTp00fndlNTE15//XU8+eSTHbZ1dHSEUqnskef18PBAfX29ztj9N9YSQmjHHvQmXw4ODtp/S5IEADqXV/v/8zJUU1MTACAvLw8DBgzQuU+hUHR7f3V1dTq/fIiIDMU81w/znIjkxrzWD/Oa2Fwhkxs8eDAcHBxw9uxZbee4vr4eZWVliI6O7ta+xowZg9LSUgwZMqTT+0eNGoV///vfKCsr67R73rt3b7S3t3f5PGFhYaiurkZ9fT3c3d0BQBt2VVVV2m70D99cyxDBwcGoqKhARUWFtnt+6dIl3LhxAyEhIV0+PiQkBAqFAmq1+oHHNDg4GIcOHdIZO3PmTIft7t69i6tXr2rnSER0H/O8a8xzIjIHzOuuMa/JUGyukMk5Oztj8eLFSE5ORv/+/eHl5YW1a9c+0iXWNmzYgJkzZyIgIABPPfUU7OzscPHiRRQXF2Pjxo2Ijo7GxIkTMWfOHPz+97/HkCFDcPnyZUiShGnTpmHQoEFoampCfn4+QkND4eTk1Onl58LCwuDh4YFTp05h5syZAO6dqvf4449j8+bNUKlUqK2txbp16ww+PgAQExODkSNHYt68edi+fTva2trwq1/9CtHR0R1OzeyMi4sLXn31VaxYsQIajQYTJkxAQ0MDTp06BVdXVyxYsADLli3D1q1bkZycjCVLluDChQvYu3dvh32dOXMGCoXigacsEpHtYp53jXlOROaAed015jUZilcLIllkZmbixz/+MeLi4hATE4MJEyYgPDy82/uJjY1Fbm4ujhw5grFjx+Lxxx/Htm3bEBgYqN0mJycHY8eOxbPPPouQkBC89tpr2m55VFQUli1bhmeeeQaenp7IyMjo9Hns7e0RHx+Pffv26Yy//fbbaGtrQ3h4OJKSkrBx48Zuz6EzkiTh4MGDcHd3x8SJExETE4OgoCDs379f73389re/xfr165Geno7g4GBMmzYNeXl5UKlUAO69C3lOTg4+/vhjhIaGIisrC2lpaR328/7772PevHmd/tIjImKePxzznIjMBfP64ZjXZChJ/PAFa0T0QNXV1fjRj36EwsJCnV8e1uz777/HsGHDcP78ee0vBSIiS8c8Z54TkWVgXjOvLQnPXCHSk4+PD9566y2o1Wq5SzGZ8vJy/PGPf2SwE5FVYZ4TEVkG5jVZEp65QkRERERERERkAJ65QkRERERERERkADZXiIiIiIiIiIgMwOYKEREREREREZEB2FwhIiIiIiIiIjIAmytERERERERERAZgc4WIiIiIiIiIyABsrhARERERERERGYDNFSIiIiIiIiIiA7C5QkRERERERERkgP8FXRrdRctvujEAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"names = [\"Uh\", \"Wh\", \"Q\"]\n",
"fig, axes = plt.subplots(1, 3, figsize=(11, 3.4), layout=\"constrained\")\n",
"for ax, name in zip(axes, names):\n",
" d = getattr(g_dir, name).ravel()\n",
" ax.scatter(d, getattr(g_gn, name).ravel(), s=12, c=\"C1\", label=\"Gauss–Newton implicit\")\n",
" ax.scatter(d, getattr(g_imp, name).ravel(), s=12, c=\"C0\", label=\"exact implicit\")\n",
" lim = jnp.abs(d).max() * 1.1\n",
" ax.plot([-lim, lim], [-lim, lim], \"k:\", lw=1)\n",
" ax.set(title=f\"dL/d{name}\", xlabel=\"direct (unrolled)\", ylabel=\"implicit\")\n",
"axes[0].legend(fontsize=8);"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "eb9a3932",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-14T22:40:55.601121Z",
"iopub.status.busy": "2026-10-14T22:40:55.600906Z",
"iopub.status.idle": "2026-10-14T22:40:55.750560Z",
"shell.execute_reply": "2026-10-14T22:40:55.749916Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Uh exact implicit vs direct: 1.0e-10 Gauss–Newton vs direct: 1.3e-01\n",
"Wh exact implicit vs direct: 9.5e-11 Gauss–Newton vs direct: 1.4e-01\n",
"Q exact implicit vs direct: 4.9e-11 Gauss–Newton vs direct: 1.4e-01\n"
]
}
],
"source": [
"def rel_err(a, b):\n",
" return float(jnp.linalg.norm(a - b) / jnp.linalg.norm(b))\n",
"\n",
"for name in names:\n",
" print(f\"{name:3s} exact implicit vs direct: {rel_err(getattr(g_imp, name), getattr(g_dir, name)):.1e} \"\n",
" f\"Gauss–Newton vs direct: {rel_err(getattr(g_gn, name), getattr(g_dir, name)):.1e}\")"
]
},
{
"cell_type": "markdown",
"id": "f734d68f",
"metadata": {},
"source": [
"The exact implicit gradient matches backpropagation through the converged solver to about $10^{-10}$ relative error, the level of the solver tolerance, without storing the solver's iterations. The Gauss–Newton variant is visibly biased here because the dynamics are non-linear. For linear dynamics the two coincide.\n",
"\n",
"## How to adapt\n",
"\n",
"- **Learnable parameters:** anything inside `params.theta` (any pytree), and `params.x0`, receives gradients. Put whatever you want to learn there and read it in `cost`, `costf` and `dynamics`.\n",
"- **Outer loss:** `dilqr` returns `tau` of shape `(T+1, n+m)`. Slice `tau[:, :n]` for states and `tau[:-1, n:]` for inputs, and build any differentiable loss on them, for example a fit to observed trajectories.\n",
"- **Converge tightly:** implicit gradients assume the KKT conditions hold, so keep `kkt_tol` small (float64 is enabled by default).\n",
"- **LQR problems:** use `diffilqrax.diff_lqr.dlqr` with `LQRParams`. For long horizons on a GPU, use the parallel versions `diffilqrax.parallel_dilqr.pdilqr` and `diffilqrax.parallel_dlqr.pdlqr`."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}