Skip to content

Instantly share code, notes, and snippets.

@ogrisel
Last active June 30, 2023 10:38
Show Gist options
  • Save ogrisel/6a4304e1831051203a98118875ead2d4 to your computer and use it in GitHub Desktop.
Save ogrisel/6a4304e1831051203a98118875ead2d4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "2e839fa7-a2ec-4b10-af93-8d698977b110",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"backend = \"pytorch\"\n",
"noop_compile = lambda f: f\n",
"\n",
"if backend == \"jax\":\n",
" import jax\n",
" jax.config.update(\"jax_enable_x64\", True)\n",
" xp = jax.numpy\n",
" func_compile = jax.jit\n",
"elif backend == \"dask\":\n",
" import dask.array as xp\n",
" func_compile = noop_compile\n",
"elif backend == \"pytorch\":\n",
" import torch\n",
" import array_api_compat\n",
" xp = array_api_compat.get_namespace(torch.zeros(1))\n",
" func_compile = torch.compile\n",
"\n",
"\n",
"def compute_one_step(step_idx, data, params, rate=0.9):\n",
" print(f\"Computing step {step_idx}\")\n",
" return rate * xp.mean(data, axis=0) + (1 - rate) * params\n",
"\n",
"\n",
"def metric_a(data, params):\n",
" return xp.sum(xp.abs(data.mean(axis=0) - params))\n",
"\n",
"\n",
"def metric_b(data, params):\n",
" return xp.linalg.norm(params)\n",
"\n",
"\n",
"stopping_criterion = metric_a"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "268706dd-f08e-4db0-ba07-c0ac3fbca631",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[-0.1874, 0.0761, -0.9102, ..., -0.3720, 0.4877, -1.2558],\n",
" [ 0.5432, 0.6453, 0.7448, ..., 0.2203, 0.2694, -0.2880],\n",
" [ 1.1852, -0.3813, -0.4278, ..., -1.5407, 0.7995, 0.9147],\n",
" ...,\n",
" [-1.4059, -0.5850, 0.9484, ..., 1.8234, 0.5075, -0.5918],\n",
" [-0.0380, 0.5716, -0.3331, ..., 2.5488, 0.3956, 1.8654],\n",
" [ 1.3412, -0.9067, 0.1906, ..., 0.5824, -0.6630, 0.8663]],\n",
" dtype=torch.float64)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = xp.asarray(np.random.normal(size=(1000, 10)))\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c632c28c-de99-4e8b-86c8-34aee61a2b2f",
"metadata": {},
"outputs": [],
"source": [
"from collections import defaultdict\n",
"import pandas as pd\n",
"\n",
"\n",
"@func_compile\n",
"def iterative_solver(data, params, tol=1e-4, maxiter=1_000):\n",
" record = defaultdict(list)\n",
" for iter_idx in range(maxiter):\n",
" params = compute_one_step(iter_idx, data, params)\n",
" record[\"iter\"].append(iter_idx)\n",
" record[\"a\"].append(float(metric_a(data, params)))\n",
" record[\"b\"].append(float(metric_b(data, params)))\n",
"\n",
" if stopping_criterion(data, params) < tol: # calls bool() implicitly\n",
" break\n",
" \n",
" return params, pd.DataFrame(record)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2fe48eeb-b70f-47a9-bc7d-13787b348725",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Computing step 0\n",
"Computing step 1\n",
"Computing step 1\n",
"Computing step 1\n"
]
},
{
"data": {
"text/plain": [
"tensor([-0.0469, 0.0287, 0.0177, 0.0226, 0.0090, -0.0191, 0.0326, -0.0173,\n",
" -0.0005, 0.0344], dtype=torch.float64)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"init_params = xp.zeros(shape=data.shape[1])\n",
"params, record = iterative_solver(data, init_params)\n",
"params"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0ddde34f-5be2-4188-9ee9-208a210f2562",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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vRpvwtYQUMJjJIvFVx0CAOD3CCyXcs1/SENubgwoEX0JJwAAtDMCy6WMvd/XHQAAEPCCfN0AAADApRBYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6RFYAACA6bUosCxbtkzx8fEKCwtTUlKStmzZctH6TZs2KSkpSWFhYRo0aJBeeuklt5rTp09r+vTpiomJUVhYmBISEpSVldWS9gAAgJ/xOrCsXr1as2bN0sKFC5Wbm6vU1FRNnjxZBQUFHuvz8/M1ZcoUpaamKjc3VwsWLNDMmTO1Zs0aZ011dbVuueUWHTlyRH/+85+1f/9+vfzyy+rbt2/LtwwAAPgNi2EYhjcrjB07VqNHj9by5cudyxISEjR16lRlZma61c+dO1dr165VXl6ec1l6erp27dqlnJwcSdJLL72kJUuWaN++fbLZbM3qo6qqSlVVVc7HZWVliouLU2lpqSIiIrzZJAAA4CNlZWWKjIy85Oe3VyMs1dXV2rFjh9LS0lyWp6Wladu2bR7XycnJcaufNGmStm/frpqaGknS2rVrlZKSounTpysqKkqJiYl68sknZbfbL9hLZmamIiMjnT9xcXHebAoAAOhAvAosJSUlstvtioqKclkeFRWloqIij+sUFRV5rK+trVVJSYkk6fDhw/rzn/8su92urKwsPfbYY3rmmWf0xBNPXLCX+fPnq7S01Plz7NgxbzYFAAB0IMEtWclisbg8NgzDbdml6psudzgc6tOnj1asWCGr1aqkpCSdOHFCS5Ys0S9+8QuPrxkaGqrQ0NCWtA8AADoYrwJLr169ZLVa3UZTiouL3UZRGkRHR3usDw4OVs+ePSVJMTExstlsslqtzpqEhAQVFRWpurpaISEh3rQJAAD8jFenhEJCQpSUlKTs7GyX5dnZ2Ro3bpzHdVJSUtzq169fr+TkZOcE2+uuu04HDx6Uw+Fw1hw4cEAxMTGEFQAA4P1lzRkZGXrllVe0atUq5eXlafbs2SooKFB6erqkurkl9957r7M+PT1dR48eVUZGhvLy8rRq1SqtXLlSc+bMcdY8+OCDOnnypB555BEdOHBA69at05NPPqnp06e3wiYCAICOzus5LHfffbdOnjypxYsXq7CwUImJicrKytKAAQMkSYWFhS73ZImPj1dWVpZmz56tpUuXKjY2Vi+88ILuvPNOZ01cXJzWr1+v2bNna+TIkerbt68eeeQRzZ07txU2EQAAdHRe34fFrJp7HTcAADCPNrkPCwAAgC8QWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWAAAgOm1KLAsW7ZM8fHxCgsLU1JSkrZs2XLR+k2bNikpKUlhYWEaNGiQXnrppQvWvvnmm7JYLJo6dWpLWgMAAH7I68CyevVqzZo1SwsXLlRubq5SU1M1efJkFRQUeKzPz8/XlClTlJqaqtzcXC1YsEAzZ87UmjVr3GqPHj2qOXPmKDU11fstAQAAfstiGIbhzQpjx47V6NGjtXz5cueyhIQETZ06VZmZmW71c+fO1dq1a5WXl+dclp6erl27diknJ8e5zG636/rrr9ePfvQjbdmyRadPn9Zf/vKXC/ZRVVWlqqoq5+OysjLFxcWptLRUERER3mwSAADwkbKyMkVGRl7y89urEZbq6mrt2LFDaWlpLsvT0tK0bds2j+vk5OS41U+aNEnbt29XTU2Nc9nixYvVu3dv/eQnP2lWL5mZmYqMjHT+xMXFebMpAACgA/EqsJSUlMhutysqKspleVRUlIqKijyuU1RU5LG+trZWJSUlkqStW7dq5cqVevnll5vdy/z581VaWur8OXbsmDebAgAAOpDglqxksVhcHhuG4bbsUvUNy8vLy/WDH/xAL7/8snr16tXsHkJDQxUaGupF1wAAoKPyKrD06tVLVqvVbTSluLjYbRSlQXR0tMf64OBg9ezZU3v27NGRI0d06623Op93OBx1zQUHa//+/Ro8eLA3bQIAAD/j1SmhkJAQJSUlKTs722V5dna2xo0b53GdlJQUt/r169crOTlZNptNI0aM0KeffqqdO3c6f2677TbdcMMN2rlzJ3NTAACA96eEMjIydM899yg5OVkpKSlasWKFCgoKlJ6eLqlubsnx48f16quvSqq7IujFF19URkaGpk2bppycHK1cuVJvvPGGJCksLEyJiYku79GtWzdJclsOAAACk9eB5e6779bJkye1ePFiFRYWKjExUVlZWRowYIAkqbCw0OWeLPHx8crKytLs2bO1dOlSxcbG6oUXXtCdd97ZelsBAAD8mtf3YTGr5l7HDQAAzKNN7sMCAADgCwQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegQWAABgegSWSygur9RX5VW+bgMAgIBGYLmE32Tt0w1Pb9TSDQdVWWP3dTsAAAQkAstFVNXadajkrM5U1WrJe/t1w9Mb9dYnX8jhMHzdGgAAAYXAchGhwVa9/eA4/e6716hvt04qLK1Uxv/u0m1LP1DOoZO+bg8AgIBhMQzDL4YLysrKFBkZqdLSUkVERLT661fW2PXHrUe0bMNBlVfVSpJuTuijeZMTNKRP11Z/PwAAAkFzP78JLF46eaZKv/vn53r9owLZHYasQRb9x9j+euSmoerZNbTN3hcAAH9EYGljB4vP6Dfv7NM/8r6UJIWHBuuhG4boR9cNVJjN2ubvDwCAPyCwtJNth0r0ZFaePjteJknq262THv3mcN06MlZBQZZ26wMAgI6IwNKOHA5Df9l5XEve26/C0kpJ0tX9IrVgSoLGDurZrr0AANCREFh84Fy1Xau25mvZhoM6W113z5a0K6I0b/IIDerNxFwAAM7X3M/vFl3WvGzZMsXHxyssLExJSUnasmXLRes3bdqkpKQkhYWFadCgQXrppZdcnn/55ZeVmpqq7t27q3v37rr55pv18ccft6Q1n+oUYtX0G4Zo489v0H+M7a8gi7R+75dKe26z/nPtHp06W+3rFgEA6JC8DiyrV6/WrFmztHDhQuXm5io1NVWTJ09WQUGBx/r8/HxNmTJFqampys3N1YIFCzRz5kytWbPGWbNx40Z973vf04YNG5STk6P+/fsrLS1Nx48fb/mW+VDv8FA9ccdVem/WBN04oo9qHYb+a9sRXb9kg1ZsPsQdcwEA8JLXp4TGjh2r0aNHa/ny5c5lCQkJmjp1qjIzM93q586dq7Vr1yovL8+5LD09Xbt27VJOTo7H97Db7erevbtefPFF3Xvvvc3qywynhC5k68ESPb4uT3mFdRNz+3XvpEe/OUK3joyRxcLEXABA4GqTU0LV1dXasWOH0tLSXJanpaVp27ZtHtfJyclxq580aZK2b9+umpoaj+tUVFSopqZGPXr0uGAvVVVVKisrc/kxq+uG9NLfHx6vJXeNVFREqL74+pxmvpGrO5Zt0/Yjp3zdHgAApudVYCkpKZHdbldUVJTL8qioKBUVFXlcp6ioyGN9bW2tSkpKPK4zb9489e3bVzfffPMFe8nMzFRkZKTzJy4uzptNaXfWIIv+PTlOG+ZMVMYtw9Q5xKqdx07rrpdy9OBrO3T05FlftwgAgGm1aNLt+acxDMO46KkNT/WelkvSU089pTfeeENvvfWWwsLCLvia8+fPV2lpqfPn2LFj3myCz3QOCdbMm4Zq488n6ntj4hRkkd75rEg3P7tJi/+2V6crmJgLAMD5vAosvXr1ktVqdRtNKS4udhtFaRAdHe2xPjg4WD17ut6j5Omnn9aTTz6p9evXa+TIkRftJTQ0VBERES4/HUmf8DBlfnuk3nlkgq4f1ls1dkOrtuZrwlMb9MqWw6qqZWIuAAANvAosISEhSkpKUnZ2tsvy7OxsjRs3zuM6KSkpbvXr169XcnKybDabc9mSJUv061//Wu+++66Sk5O9aatDGx4drj/9eIxe/fEYjYgOV1llrR5fl6dbnt2sdbsL5Se3yQEA4LJ4fUooIyNDr7zyilatWqW8vDzNnj1bBQUFSk9Pl1R3qqbplT3p6ek6evSoMjIylJeXp1WrVmnlypWaM2eOs+app57SY489plWrVmngwIEqKipSUVGRzpw50wqb2DFMGNZb62am6rd3XqXe4aEqOFWh6f/zie56KUefFHzt6/YAAPCpFt3pdtmyZXrqqadUWFioxMREPffcc5owYYIk6Yc//KGOHDmijRs3Ous3bdqk2bNna8+ePYqNjdXcuXOdAUeSBg4cqKNHj7q9zy9/+Uv953/+Z7N6MvNlzd46W1WrFZsPa8XmwzpXf8+Wb42M0bxvjlBcj84+7g4AgNbDrfn9wJdllXpm/X79344vZBhSiDVI940boBk3DFVkZ9ulXwAAAJMjsPiRvMIyPZmVpy2f110G3q2zTTNvHKofXDtAIcEtutALAABTILD4GcMwtPHAV3pyXZ4+L66b2zOwZ2fNmzxCk66M5o65AIAOicDip2rtDv3v9i/0bPYBlZypkiSNGdhDC76VoGviuvm2OQAAvERg8XNnqmr1h02H9PKWw6qscUiSbrs6Vj+fNJyJuQCADoPAEiAKS8/p6fcO6K3c+om5wUH60XUD9dDEIYrsxMRcAIC5EVgCzGfHS/VkVp62HTopSere2aZZNw/T98f2l83KxFwAgDkRWAKQYRjasL9YT2bt08H6ibmDenXRvMkjdMsVUUzMBQCYDoElgNXaHXrzX8f0XPYBnTxb92WKY+N7aOG3EjSyXzffNgcAQBMEFqi8skYvbTqkV7bkq6q2bmLuHaP6as6k4erbrZOPuwMAgMDi63ZM5fjpc3r6vf16O/e4JCk0OEg/GR+vBycOVngYE3MBAL5DYIGbT78o1ePr9uqj/FOSpJ5dQjTrlmH63jfiFMzEXACADxBY4JFhGPpHXrEys/J0uOSsJGlw7y5aMCVBN47ow8RcAEC7IrDgomrsDr3xcYGe/8fnOlU/MXfc4J5aMCVBiX0jfdwdACBQEFjQLGWVNVq64aD+uPWIqmsdslikb4/qpzmThikmkom5AIC2RWCBV46dqtCS9/Zr7a4TkqQwW5CmpQ7SA9cPVtfQYB93BwDwVwQWtMjOY6f1xLq9+teRryVJvbqGKuOWYfpOcj8m5gIAWh2BBS1mGIbe2/OlfvNOno6crJAkDYvqqvlTEjRxWG8m5gIAWg2BBZetutah1z86qt/983OdrqiRJI0f0ksLpiToilj2MQDg8hFY0GpKK2q0dONB/dfWI6q2103MvWt0P82ZNFxREWG+bg8A0IERWNDqCk5W6Kn39unvuwslSZ1sVk2bMEgPTBikLkzMBQC0AIEFbeaTgq/1xLo87ThaNzG3T3iofpY2THclxckaxPwWAEDzEVjQpgzD0DufFek37+xTwam6ibkjosO1YEqCJgzr7ePuAAAdBYEF7aKq1q7/zjmq379/UKXn6ibmThjWWwunJGh4dLiPuwMAmB2BBe3qdEW1fv/+Qb2ac0Q1dkNBFuk7yXHKSBumPuFMzAUAeEZggU8cKTmrp97bp6xPiyRJnUOsSr9+sH6aGq/OIUzMBQC4IrDAp7YfOaXH1+Vp57HTkqSoiFDNSRuub4/ux8RcAIATgQU+ZxiG/r67UL99d5+++PqcJCkhJkILpyRo/NBePu4OAGAGBBaYRmWNXa/mHNHv3z+o8spaSdINw3trwZQEDY1iYi4ABDICC0zn1NlqvfDPz/Xah0dV66ibmPvdMf01++Zh6h0e6uv2AAA+QGCBaeWXnNVv3snTe3u+lCR1CbHqwYmD9ZPxg9QpxOrj7gAA7YnAAtP76PBJPZGVp91flEqSYiLDNCdtuO4Y1VdBTMwFgIBAYEGH4HAY+tvuE3rq3f06frpuYu6VsRFa+K0EjRvMxFwA8HcEFnQolTV2/XHrES3bcFDlVXUTc29O6KN5kxM0pE9XH3cHAGgrBBZ0SCfPVOl3//xcr39UILvDkDXIou+P6a9ZNw9Vz65MzAUAf0NgQYd26Kszyszap3/k1U3M7RoarIduGKwfXxevMBsTcwHAXxBY4Be2HSrRk1l5+ux4mSSpb7dO+vmk4brt6lgm5gKAHyCwwG84HIb+svO4lry3X4WllZKkkf0itXBKgsYO6unj7gAAl4PA4oHD4VB1dXU7d9Z+bDabrFb/PV1SWWPXyg/ytWzDQZ2ttkuS0q6I0rzJIzSoNxNzAaAjIrCcp7q6Wvn5+XI4HD7orv1069ZN0dHRslj893TJV+VVev4fB/TGxwVyGFJwkEU/uHaAZt40VD26hPi6PQCAFwgsTRiGoYKCAtXU1Cg2NlZBQUE+6rLtGIahiooKFRcXq1u3boqJifF1S23u8y/LlfnOPr2/r1iSFB4WrBk3DNF94wYyMRcAOggCSxM1NTU6ePCgYmNjFRkZ6aMO28fJkydVXFysYcOG+fXpoaa2HizR4+vylFdYNzG3X/dOevSbI3TryBi/HmkCAH/Q3MDif0MNHtjtdfMdQkL8/3RB586dJdWFtEBx3ZBe+vvD4/X0v1+t6IgwffH1Oc18I1dTl23T9iOnfN0eAKAVBERgaRAI/7cdCNvoiTXIoruS+mnDnIn62S3D1DnEql3HTuuul3L04Gs7dKTkrK9bBABchoAKLPB/nUKsevimodr484n63pg4BVmkdz4r0i3PbdLiv+3V6Qr/vUoMAPwZgQV+qU94mDK/PVLvPDJB1w/rrRq7oVVb8zXhqQ16ZcthVdXafd0iAMALBBb4teHR4frTj8fo1R+P0YjocJVV1urxdXm65dnNWre7UH4y5xwA/B6BBQFhwrDeWjczVU/dOVJ9wkNVcKpC0//nE925fJt2HP3a1+0BAC4hIAOLYRiqqK71yY+3/0f/7rvvavz48erWrZt69uypf/u3f9OhQ4faaM/4N2uQRd/5Rpw2zJmoR24aqk42qz4pOK07l2/T9P/5RAUnK3zdIgDgAgLiPiyVlZXKz89XfHy8wsLCVFFdqyt+8Z5P+ty7eJI6hwQ3u37NmjWyWCy66qqrdPbsWf3iF7/QkSNHtHPnTo83wDt/W3FhX5ZV6pn1+/V/O76QYUgh1iDdN26AZtwwVJGdbb5uDwACQnPvw9L8T074xJ133unyeOXKlerTp4/27t2rxMREH3XlH6IiwvTUXVfrR9fF68msPG35vEQvb8nX/+34QjNvHKofXDtAIcEBOQgJAKYTkIGlk82qvYsn+ey9vXHo0CEtWrRIH374oUpKSpzfhVRQUEBgaSUJMRF69cdjtOnAV3oyK08HvjyjxX/fq1dzjmje5BGadKV/fzcTAHQEARlYLBaLV6dlfOnWW29VXFycXn75ZcXGxsrhcCgxMdGvv3XaFywWiyYO76PxQ3rp/3Z8oWfWH9CRkxVKf+0TfWNgdy381hW6Jq6br9sEgIDFeLeJnTx5Unl5eXrsscd00003KSEhQV9/zRUtbSnYGqTvjemvjT+fqIdvHKIwW5D+deRrTV26VQ+/katjp5iYCwC+QGAxse7du6tnz55asWKFDh48qPfff18ZGRm+bisgdA0N1s/ShmvDnIm6K6mfLBbpb7tO6KZnNikzK0+l5wLnu5oAwAwILCYWFBSkN998Uzt27FBiYqJmz56tJUuW+LqtgBIT2UlP//vV+tuM8Ro3uKeq7Q79YfNhTVyyQf+1NV81doevWwSAgBCQlzX7s0Da1vZmGIY27C/Wk1n7dLD4jCRpUK8umjd5hG65IoqJuQDQAs29rJkRFqCZLBaLbhwRpXcfSdXjUxPVs0uIDpec1f3/vUPfXfGhdn9x2tctAoDfIrAAXgq2BukH1w7Qxp9P1PQbBis0OEgf5Z/SbS9u1aw3c3X89DlftwgAfofAArRQeJhNP580Qu/Pmahvj+orSfrLzhO64emN+u27+1ReycRcAGgtBBbgMvXt1knP3n2N/jZjvMbG91B1rUPLNx7SxCUb9d85R1TLxFwAuGwEFqCVXNUvUm/ef61evjdZg3p10cmz1Vr01z2a9Pxm/TPvS6+/+BIA0IjAArQii8WiW66I0nuzJ2jx7VeqR5cQHfrqrH7yp+36/ssf6bPjpb5uEQA6JAIL0AZs1iDdmzJQG38+UenXD1ZIcJByDp/UrS9+oIz/3akTTMwFAK90jC/UATqoiDCb5k0eof8Y219Pr9+vv+48obc+Oa51uwv109R4jYnvqfCwYIWHBqtrWLC6hgarS0iwgoK4pwsANEVgAdpBXI/O+t13R+lH18XriXV79a8jX2vphkNauuGQW63FInUNaQww4WHB6hpmqws1zseNf4eH2dS1PvCEh9Y/DgtWZ5uV4APAbxBYTGzixIm65ppr9Pzzz/u6FbSSa+K66X8fSNF7e77U6x8dVcmZap2pqtGZylqVV9aq1mHIMKTyqlqVV9Ve1ns1BJ+mAadrmK1xRKch5DSEIZcQFKyuoXXBp0uIlbv4AvA5AgvQziwWi76ZGK1vJka7LDcMQ1W1DpVX1upMVW19iKlRef3fZ6o8Pa6vq6rVmaoaldcHH/v5wecy5vpaLHVfBhneJOC4jug0hpvwi4wAdSb4ALgMBBbAJCwWi8JsVoXZrOodHtri12kafMoraxrDjzPg1C0rbxJ4GmrKGuqrzgs+9UHocoJPkEXqEhqsiCaBx3VEpy74NASe8wNSQw3BBwhMgRlYDEOqqfDNe9s61/0vazPV1tZqxowZeu2112S1WvXggw/q17/+Nf9g44JaM/hU1jhUXn/KqiHENI4A1Tj/Lm8yIuQc+Wny2+4w5GgafC5DUMOIT9Mg42lOT33giWgyAtQ1tP5xWLA62Qg+QEcSmIGlpkJ6MtY3773ghBTSpdnlf/rTn/STn/xEH330kbZv3677779fAwYM0LRp09qwSaAu+HQKsapTiFV9wlv+Ok2DT9MRnfNHgM5U1aqsSRhyC0hNgk9ZZV3t5WgafJwjPB5GdFx/u48AEXyA9tGiwLJs2TItWbJEhYWFuvLKK/X8888rNTX1gvWbNm1SRkaG9uzZo9jYWD366KNKT093qVmzZo0WLVqkQ4cOafDgwXriiSd0xx13tKQ9vxIXF6fnnntOFotFw4cP16effqrnnnuOwIIOozWDz7kae+OcHWeYqXEb0Wn8ff7oUF0QchhqteBjDbI4R3RcTm/VB5+IJmHIc0AKVnioTWG2IIIPcBFeB5bVq1dr1qxZWrZsma677jr94Q9/0OTJk7V3717179/frT4/P19TpkzRtGnT9Nprr2nr1q166KGH1Lt3b915552SpJycHN1999369a9/rTvuuENvv/22vvOd7+iDDz7Q2LFjL38rz2frXDfS4Qu2zl6VX3vttS7/iKWkpOiZZ56R3W6X1Wpt7e4A07JYLOocEqzOIcHqcxmv0zT4NI7o1AWfsqZzehomObtMgm4ShOqDj91hqPRcjUrPXd6XXTYEH/eRncYJzU0vc3cPSAQf+DeL4eUXnIwdO1ajR4/W8uXLncsSEhI0depUZWZmutXPnTtXa9euVV5ennNZenq6du3apZycHEnS3XffrbKyMr3zzjvOmm9+85vq3r273njjjWb1VVZWpsjISJWWlioiIsLlucrKSuXn5ys+Pl5hYWHebK5PTZw4UYMGDdKqVaucy/7617/qrrvuUmVlpcfA0lG3FehoDMNQRbXd44jO+SNA7vN/Gk6B1T3Xml8zFRxkkc0aJItFCrJYZFHdtDmLxaKg+t91yyz1NZJFjc9JUlCQ6zKLRc51GupdX7OxXs6a+vd3qW9cFlT/XhZP9U36Pn9ZUJN+gur/CDr/OQ/1je/XpD7IdV946sHl/erva9T4mq77oq6+cZvk1oOH+iAP+1ON9Wry36HpvvZU3/S/Q9N6t9c4v97lv7frMXJ+fe/wUIUGt+7/LF/s87spr0ZYqqurtWPHDs2bN89leVpamrZt2+ZxnZycHKWlpbksmzRpklauXKmamhrZbDbl5ORo9uzZbjUXu/9IVVWVqqqqnI/Lysq82ZQO48MPP3R7PHToUEZXAB+zWCzqEhqsLqHBirrwv7GX5Bp83Ed0ypuMALk+Pu/S9/rgU+swVOuwt96GAk289dA4je7f3Sfv7VVgKSkpkd1uV1RUlMvyqKgoFRUVeVynqKjIY31tba1KSkoUExNzwZoLvaYkZWZm6le/+pU37XdIx44dU0ZGhh544AF98skn+v3vf69nnnnG120BaCWuwaflo6IOR92prvLKWtXYHTIMyWEYMlQXihyGJNX9dj5nSIbqfzepb3jOY73zNV3r5fKa7vVNnzPq/3Y0/V33dm49XKheHnpwvl8zeji/Z4fLvnCtb9h3xiXrm76/IYejscZ1/9f/lud6h1G3L4xm1Z+3f+R5HzT+N3Xf7xeql4dlVh+ebmzRpNvzz48ahnHRc6ae6s9f7u1rzp8/XxkZGc7HZWVliouLu3TzHcy9996rc+fOacyYMbJarXr44Yd1//33+7otACYTFNQYfAB/5NWR3atXL1mtVreRj+LiYrcRkgbR0dEe64ODg9WzZ8+L1lzoNSUpNDRUoaEtv8dER7Bx40bn303nDAEAEGiCvCkOCQlRUlKSsrOzXZZnZ2dr3LhxHtdJSUlxq1+/fr2Sk5Nls9kuWnOh1wQAAIHF67HDjIwM3XPPPUpOTlZKSopWrFihgoIC531V5s+fr+PHj+vVV1+VVHdF0IsvvqiMjAxNmzZNOTk5WrlypcvVP4888ogmTJig3/72t7r99tv117/+Vf/4xz/0wQcftNJmAgCAjszrwHL33Xfr5MmTWrx4sQoLC5WYmKisrCwNGDBAklRYWKiCggJnfXx8vLKysjR79mwtXbpUsbGxeuGFF5z3YJGkcePG6c0339Rjjz2mRYsWafDgwVq9enXb3IMFAAB0OF7fh8Ws/PE+LC0RSNsKAOj4mnsfFq/msHR0fpLNLioQthEAEHgCIrA03GSturrax520vYqKum+hbpjQDACAPwiIC/aDg4PVuXNnffXVV7LZbAoK8r+cZhiGKioqVFxcrG7dunEnXACAXwmIwGKxWBQTE6P8/HwdPXrU1+20qW7duik6OtrXbQAA0KoCIrBIdfeQGTp0qF+fFrLZbIysAAD8UsAEFkkKCgriyhkAADog/5vMAQAA/A6BBQAAmB6BBQAAmJ7fzGFpuGFaWVmZjzsBAADN1fC5fakbn/pNYCkvL5ckxcXF+bgTAADgrfLyckVGRl7web/5LiGHw6ETJ04oPDxcFoul1V63rKxMcXFxOnbs2EW/4wDsK2+xv5qPfdV87KvmY181X1vuK8MwVF5ertjY2Ive2NVvRliCgoLUr1+/Nnv9iIgIDuhmYl95h/3VfOyr5mNfNR/7qvnaal9dbGSlAZNuAQCA6RFYAACA6RFYLiE0NFS//OUvFRoa6utWTI995R32V/Oxr5qPfdV87KvmM8O+8ptJtwAAwH8xwgIAAEyPwAIAAEyPwAIAAEyPwAIAAEyPwCJp2bJlio+PV1hYmJKSkrRly5aL1m/atElJSUkKCwvToEGD9NJLL7VTp77nzb7auHGjLBaL28++ffvasWPf2Lx5s2699VbFxsbKYrHoL3/5yyXXCdTjytt9FcjHVWZmpr7xjW8oPDxcffr00dSpU7V///5LrheIx1ZL9lWgHlvLly/XyJEjnTeFS0lJ0TvvvHPRdXxxTAV8YFm9erVmzZqlhQsXKjc3V6mpqZo8ebIKCgo81ufn52vKlClKTU1Vbm6uFixYoJkzZ2rNmjXt3Hn783ZfNdi/f78KCwudP0OHDm2njn3n7Nmzuvrqq/Xiiy82qz6Qjytv91WDQDyuNm3apOnTp+vDDz9Udna2amtrlZaWprNnz15wnUA9tlqyrxoE2rHVr18//eY3v9H27du1fft23Xjjjbr99tu1Z88ej/U+O6aMADdmzBgjPT3dZdmIESOMefPmeax/9NFHjREjRrgse+CBB4xrr722zXo0C2/31YYNGwxJxtdff90O3ZmXJOPtt9++aE0gH1dNNWdfcVw1Ki4uNiQZmzZtumANx1ad5uwrjq1G3bt3N1555RWPz/nqmAroEZbq6mrt2LFDaWlpLsvT0tK0bds2j+vk5OS41U+aNEnbt29XTU1Nm/Xqay3ZVw1GjRqlmJgY3XTTTdqwYUNbttlhBepxdTk4rqTS0lJJUo8ePS5Yw7FVpzn7qkEgH1t2u11vvvmmzp49q5SUFI81vjqmAjqwlJSUyG63KyoqymV5VFSUioqKPK5TVFTksb62tlYlJSVt1quvtWRfxcTEaMWKFVqzZo3eeustDR8+XDfddJM2b97cHi13KIF6XLUEx1UdwzCUkZGh8ePHKzEx8YJ1HFvN31eBfGx9+umn6tq1q0JDQ5Wenq63335bV1xxhcdaXx1TfvNtzZfDYrG4PDYMw23Zpeo9LfdH3uyr4cOHa/jw4c7HKSkpOnbsmJ5++mlNmDChTfvsiAL5uPIGx1WdGTNmaPfu3frggw8uWRvox1Zz91UgH1vDhw/Xzp07dfr0aa1Zs0b33XefNm3adMHQ4otjKqBHWHr16iWr1eo2QlBcXOyWHhtER0d7rA8ODlbPnj3brFdfa8m+8uTaa6/V559/3trtdXiBely1lkA7rh5++GGtXbtWGzZsUL9+/S5aG+jHljf7ypNAObZCQkI0ZMgQJScnKzMzU1dffbV+97vfeaz11TEV0IElJCRESUlJys7OdlmenZ2tcePGeVwnJSXFrX79+vVKTk6WzWZrs159rSX7ypPc3FzFxMS0dnsdXqAeV60lUI4rwzA0Y8YMvfXWW3r//fcVHx9/yXUC9dhqyb7yJFCOrfMZhqGqqiqPz/nsmGrTKb0dwJtvvmnYbDZj5cqVxt69e41Zs2YZXbp0MY4cOWIYhmHMmzfPuOeee5z1hw8fNjp37mzMnj3b2Lt3r7Fy5UrDZrMZf/7zn321Ce3G23313HPPGW+//bZx4MAB47PPPjPmzZtnSDLWrFnjq01oN+Xl5UZubq6Rm5trSDKeffZZIzc31zh69KhhGBxXTXm7rwL5uHrwwQeNyMhIY+PGjUZhYaHzp6KiwlnDsVWnJfsqUI+t+fPnG5s3bzby8/ON3bt3GwsWLDCCgoKM9evXG4ZhnmMq4AOLYRjG0qVLjQEDBhghISHG6NGjXS57u++++4zrr7/epX7jxo3GqFGjjJCQEGPgwIHG8uXL27lj3/FmX/32t781Bg8ebISFhRndu3c3xo8fb6xbt84HXbe/hssjz/+57777DMPguGrK230VyMeVp/0kyfjjH//orOHYqtOSfRWox9aPf/xj57/rvXv3Nm666SZnWDEM8xxTFsOonykDAABgUgE9hwUAAHQMBBYAAGB6BBYAAGB6BBYAAGB6BBYAAGB6BBYAAGB6BBYAAGB6BBYAAGB6BBYAPjNx4kTNmjXL120A6AC40y0Anzl16pRsNpvCw8M1cOBAzZo1iwADwKNgXzcAIHD16NGj1V+zurpaISEhrf66AHyLU0IAfKbhlNDEiRN19OhRzZ49WxaLRRaLxVmzbds2TZgwQZ06dVJcXJxmzpyps2fPOp8fOHCgHn/8cf3whz9UZGSkpk2b5otNAdDGCCwAfO6tt95Sv379tHjxYhUWFqqwsFCS9Omnn2rSpEn69re/rd27d2v16tX64IMPNGPGDJf1lyxZosTERO3YsUOLFi3yxSYAaGOcEgLgcz169JDValV4eLiio6Ody5csWaLvf//7znktQ4cO1QsvvKDrr79ey5cvV1hYmCTpxhtv1Jw5c3zROoB2QmABYFo7duzQwYMH9frrrzuXGYYhh8Oh/Px8JSQkSJKSk5N91SKAdkJgAWBaDodDDzzwgGbOnOn2XP/+/Z1/d+nSpT3bAuADBBYAphASEiK73e6ybPTo0dqzZ4+GDBnio64AmAWTbgGYwsCBA7V582YdP35cJSUlkqS5c+cqJydH06dP186dO/X5559r7dq1evjhh33cLYD2RmABYAqLFy/WkSNHNHjwYPXu3VuSNHLkSG3atEmff/65UlNTNWrUKC1atEgxMTE+7hZAe+NOtwAAwPQYYQEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKZHYAEAAKb3/1AV6/6cMGvGAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"record.plot(x=\"iter\", y=[\"a\", \"b\"]);"
]
}
],
"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.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment