Skip to content

Instantly share code, notes, and snippets.

@adrn
Created September 26, 2024 21:27
Show Gist options
  • Save adrn/17c4d9f829ba5cb31f24849c2022e40a to your computer and use it in GitHub Desktop.
Save adrn/17c4d9f829ba5cb31f24849c2022e40a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3 (ipykernel)","language":"python"},"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.10.12"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from dataclasses import dataclass\nfrom functools import partial\nfrom typing import Callable\n\nimport jax\nimport jax.numpy as jnp\n\njax.config.update(\"jax_enable_x64\", True)\nimport diffrax\nimport matplotlib.pyplot as plt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:29.522209Z","iopub.execute_input":"2024-09-26T21:27:29.522420Z","iopub.status.idle":"2024-09-26T21:27:30.439956Z","shell.execute_reply.started":"2024-09-26T21:27:29.522394Z","shell.execute_reply":"2024-09-26T21:27:30.439660Z"}},"outputs":[],"execution_count":1},{"cell_type":"markdown","source":"First, an example of how JAX can be used to auto-differentiate a function.","metadata":{}},{"cell_type":"code","source":"def some_func(pars):\n return pars[\"a\"] ** 2\n\n\nsome_func({\"a\": 1.0})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.441024Z","iopub.execute_input":"2024-09-26T21:27:30.441162Z","iopub.status.idle":"2024-09-26T21:27:30.445024Z","shell.execute_reply.started":"2024-09-26T21:27:30.441152Z","shell.execute_reply":"2024-09-26T21:27:30.444757Z"}},"outputs":[{"execution_count":2,"output_type":"execute_result","data":{"text/plain":"1.0"},"metadata":{}}],"execution_count":2},{"cell_type":"code","source":"some_func_grad = jax.grad(some_func, argnums=0)\nsome_func_grad({\"a\": 1.0})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.445440Z","iopub.execute_input":"2024-09-26T21:27:30.445526Z","iopub.status.idle":"2024-09-26T21:27:30.530005Z","shell.execute_reply.started":"2024-09-26T21:27:30.445517Z","shell.execute_reply":"2024-09-26T21:27:30.529620Z"}},"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"{'a': Array(2., dtype=float64, weak_type=True)}"},"metadata":{}}],"execution_count":3},{"cell_type":"markdown","source":"Now we want to compute an orbit, or a trajectory, of a test particle in a gravitational potential. \n\nSee also the diffrax documentation here: https://docs.kidger.site/diffrax/usage/getting-started/","metadata":{}},{"cell_type":"code","source":"class PotentialHelper:\n def __init__(self, potential):\n self.potential = jax.jit(potential)\n self.potential_grad = jax.jit(jax.grad(self.potential, argnums=1))\n\n @partial(jax.jit, static_argnums=(0,))\n def w_dot(self, t, w):\n ndim = w.shape[0] // 2\n accel = -self.potential_grad(t, w[:ndim])\n return jnp.concatenate((w[ndim:], accel))\n\n @partial(jax.jit, static_argnums=(0,))\n def __call__(self, t, w, *args):\n return self.w_dot(t, w)\n\n\[email protected]\ndef constant_potential(t, x):\n return 0.0\n\n\nhelper = PotentialHelper(constant_potential)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.530852Z","iopub.execute_input":"2024-09-26T21:27:30.531003Z","iopub.status.idle":"2024-09-26T21:27:30.536114Z","shell.execute_reply.started":"2024-09-26T21:27:30.530992Z","shell.execute_reply":"2024-09-26T21:27:30.535661Z"}},"outputs":[],"execution_count":4},{"cell_type":"markdown","source":"Set up the ODE solver:","metadata":{}},{"cell_type":"code","source":"term = diffrax.ODETerm(helper)\nsolver = diffrax.Dopri5()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.536668Z","iopub.execute_input":"2024-09-26T21:27:30.536861Z","iopub.status.idle":"2024-09-26T21:27:30.540869Z","shell.execute_reply.started":"2024-09-26T21:27:30.536848Z","shell.execute_reply":"2024-09-26T21:27:30.540407Z"}},"outputs":[],"execution_count":5},{"cell_type":"markdown","source":"Tell diffrax how often to output the computed phase-space coordinates:","metadata":{}},{"cell_type":"code","source":"sol = diffrax.diffeqsolve(\n term,\n solver,\n t0=0.0,\n t1=10.0,\n dt0=0.1,\n y0=jnp.array([0.0, 0.0, 1.0, 0.0]),\n saveat=diffrax.SaveAt(ts=jnp.arange(0, 10, 1.0))\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.541458Z","iopub.execute_input":"2024-09-26T21:27:30.541568Z","iopub.status.idle":"2024-09-26T21:27:30.884211Z","shell.execute_reply.started":"2024-09-26T21:27:30.541557Z","shell.execute_reply":"2024-09-26T21:27:30.883853Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"sol.ts","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.885879Z","iopub.execute_input":"2024-09-26T21:27:30.886029Z","iopub.status.idle":"2024-09-26T21:27:30.889157Z","shell.execute_reply.started":"2024-09-26T21:27:30.886015Z","shell.execute_reply":"2024-09-26T21:27:30.888692Z"}},"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"Array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float64, weak_type=True)"},"metadata":{}}],"execution_count":7},{"cell_type":"code","source":"x, y, vz, vy = sol.ys.T\n\nfig, ax = plt.subplots()\nax.scatter(x, y, c=sol.ts)\nax.set(xlim=(-10, 10), ylim=(-10, 10))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-09-26T21:27:30.889600Z","iopub.execute_input":"2024-09-26T21:27:30.889700Z","iopub.status.idle":"2024-09-26T21:27:31.078722Z","shell.execute_reply.started":"2024-09-26T21:27:30.889689Z","shell.execute_reply":"2024-09-26T21:27:31.078203Z"}},"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"[(-10.0, 10.0), (-10.0, 10.0)]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x432 with 1 Axes>","image/png":"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qVatWum+++6rcCdzw4YN+uc//6m///3vbtc/ceKExo8fr5iYGG3btk15eXkKDQ1V69atFRcXp1tvvdWrgvCOHTs0ffp0tWzZUrt379b58+d1+eWXq127dhowYIBuuOGGGtXPycnR448/Ln9/f82ePVs+PqXPEH/mmWd08OBBzZw5U82bN6/Rui51drtdTz75pP7yl7+Uu23/9NNPmjJliiRp9OjRGjVqlNvrqM/b97p16/Tqq69qzJgxuu+++0q1nTx5UqNHj9Ytt9yil156ye3nuGfPHj311FPq06eP/vznP5dqy8/P1/3336+oqCjFx8d7xU7unj179P3331d4lOIvf/mL1q9fr4YNG+rdd991+xvsTz/9VNu2bVNhYaEOHToku92u8PBwdenSRYMGDVJkZGRtPA2jxMfHKzMzU+np6Tp69Kh8fHzUrFkzde/eXffcc0+NjkLU5XvHRDt27NDTTz+tsWPHqnPnzuW+p+12u9555x1169atzGtWFW/dvh0Oh3bv3q23335bKSkpGjVqVJVH4Op6H6GgoEBPPfWUUlNT9dlnn5WZ52LGjBlavXq1pk+frnbt2rld//eMOgJXm6xWq7p27Vprpxz+nsVi0fXXX6/rr7/e+bPiI4gFBQXKysqq9HYD5dm5c6cSEhLUqlWrck996tmzp2bNmqXZs2frpptucnsDPH78uObMmaPLLrtMPXr0KNPesWNHtWjRQosWLdItt9xSq4H3YvD399dzzz3n/IakPIcPH67RtzGBgYF66aWXqv34+iY8PNztU0RcNWfOHB07dkz//d//XeaDWZL69u2r119/XX/9618VHx9fJ2O4VGzevFmhoaEVfjFx8803q3nz5jp+/LgWLVqkIUOGVPo+qEh93L7z8vL09ttvy+FwqF+/fmXamzZtqpiYGK1du1YrV67UXXfd5XJtm82m+Ph4FRQUKC4urkx7QECAevbsqSVLluiLL76o1mRapklISFDv3r0rbB8yZIjWr1+vc+fOacGCBXrmmWfcXkdMTIwR96v1pF69etXoKFt56vK9Y7KePXtq6NChlfZp1KhRtfc1vGn7XrRokTZs2KDs7Gzl5eUpPT3d5cfW9T7C559/rj179mjQoEHlTlIYFxenZcuWKT4+Xh988EGNTyX2qklMLraoqCjNmDFDs2bN0ty5c92+/uTTTz+VJF13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"},"metadata":{"image/png":{"width":440,"height":440}}}],"execution_count":8},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment