{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0e827775",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "# $n$-link Pendulum Benchmark Comparison\n",
    "\n",
    "In this notebook we benchmark the n-link pendulum example. This notebook is similar to the $n$-link pendulum but is designed for benchmarking **kdFlex**'s simulation performance and demonstrating how **kdFlex**'s multibody simulation performance scales.\n",
    "\n",
    "Requirements:\n",
    "- [n-link Pendulum](../example_n_link_pendulum/notebook.ipynb)\n",
    "\n",
    "In this tutorial we will:\n",
    "- Define a method to create the multibody\n",
    "- Run the simulation with increasing number of links\n",
    "- Benchmark simulation runtimes\n",
    "\n",
    "![](../resources/nb_images/results_plot_SOA.png)\n",
    "\n",
    "\n",
    " For a more in-depth descriptions of **kdflex** concepts see [usage](usage_page)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b7e2551c",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import gc\n",
    "import numpy as np\n",
    "import time\n",
    "from typing import cast\n",
    "import pandas as pd\n",
    "import plotly.express as px\n",
    "\n",
    "import Karana.Core as kc\n",
    "import Karana.Math as km\n",
    "import Karana.Integrators as ki\n",
    "import Karana.Frame as kf\n",
    "import Karana.Dynamics as kd\n",
    "import Karana.Models as kmdl"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9bde08ea",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "## Define a Method to Create the Multibody\n",
    "\n",
    "Define a method that procedurally creates a n-link multibody for use when we run simulations with increasing number of links. This is the same as in the [n-link Pendulum](../example_n_link_pendulum/notebook.ipynb) \n",
    "\n",
    "See [Multibody](treembody_sec) or [Frames](frames_layer_sec) for more information relating to this step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a5b75454",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "def createMbody(fc: kf.FrameContainer, n_links: int):\n",
    "    \"\"\"Create the multibody.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    n_links : int\n",
    "        The number of pendulum links to use.\n",
    "    \"\"\"\n",
    "    mb = kd.Multibody(\"mb\", fc)\n",
    "\n",
    "    # Here, we use the addSerialChain method to add multiple instances of the same body\n",
    "    # connected in a chain. We add n instances of the pendulum link with the following parameters:\n",
    "    params = kd.PhysicalBodyParams(\n",
    "        km.SpatialInertia(2.0, np.zeros(3), np.diag([3, 2, 1])),\n",
    "        [np.array([0.0, 1.0, 0.0])],\n",
    "        km.HomTran(np.array([0, 0, 0.5])),\n",
    "        km.HomTran(np.array([0, 0, -0.5])),\n",
    "    )\n",
    "    kd.PhysicalBody.addSerialChain(\n",
    "        \"link\",\n",
    "        n_links,\n",
    "        cast(kd.PhysicalBody, mb.virtualRoot()),\n",
    "        htype=kd.HingeType.REVOLUTE,\n",
    "        params=params,\n",
    "    )\n",
    "\n",
    "    # finalize and verify the multibody\n",
    "    mb.ensureHealthy()\n",
    "    mb.resetData()\n",
    "    assert kc.allReady()\n",
    "\n",
    "    return mb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22ed4ff4",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "Because we run multiple simulations, we write a method ahead of time to cleanup everything whenever the simulation ends. This requires us to delete local variables and discard our containers and scene."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "37f15d6e",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "def cleanup():\n",
    "    \"\"\"Cleanup the simulation.\"\"\"\n",
    "    global integrator, bd1\n",
    "    del integrator, bd1\n",
    "    kc.discard(sp)\n",
    "\n",
    "    gc.collect()\n",
    "\n",
    "    kc.discard(mb)\n",
    "    kc.discard(fc)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b3a5ba0",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "## Run the Simulation With Increasing Number of Links\n",
    "\n",
    "Below is the run loop for each simulation. It loops through each sim with an increasing number of links and collects the time it takes to complete."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "057ac878",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of links: 3\n",
      "Time to run: 0.5467288494110107, derivs=800\n",
      "Number of links: 4\n",
      "Time to run: 0.7317540645599365, derivs=800\n",
      "Number of links: 5\n",
      "Time to run: 0.9253365993499756, derivs=800\n",
      "Number of links: 7\n",
      "Time to run: 1.257965326309204, derivs=800\n",
      "Number of links: 8\n",
      "Time to run: 1.4570167064666748, derivs=800\n",
      "Number of links: 10\n",
      "Time to run: 1.7869832515716553, derivs=800\n",
      "Number of links: 13\n",
      "Time to run: 2.430913209915161, derivs=800\n",
      "Number of links: 16\n",
      "Time to run: 2.9342973232269287, derivs=800\n",
      "Number of links: 20\n",
      "Time to run: 3.652416467666626, derivs=800\n",
      "Number of links: 25\n",
      "Time to run: 4.744343280792236, derivs=800\n",
      "Number of links: 30\n",
      "Time to run: 5.59398341178894, derivs=800\n",
      "Number of links: 40\n",
      "Time to run: 7.155922174453735, derivs=800\n",
      "Number of links: 50\n",
      "Time to run: 8.69689679145813, derivs=800\n",
      "Number of links: 70\n",
      "Time to run: 12.202042818069458, derivs=800\n",
      "Number of links: 95\n",
      "Time to run: 16.73291850090027, derivs=800\n"
     ]
    }
   ],
   "source": [
    "# Number of links we will run at\n",
    "n_links_list = [3, 4, 5, 7, 8, 10, 13, 16, 20, 25, 30, 40, 50, 70, 95]\n",
    "\n",
    "runtimes = []\n",
    "deriv_calls = []\n",
    "\n",
    "for n_links in n_links_list:\n",
    "    # initialization\n",
    "    fc = kf.FrameContainer(\"root\")\n",
    "    mb = createMbody(fc, n_links)\n",
    "\n",
    "    # Set up state propagator and select integrator type: rk4 or cvode\n",
    "    sp = kd.StatePropagator(mb, integrator_type=ki.IntegratorType.RK4)\n",
    "    integrator = sp.getIntegrator()\n",
    "\n",
    "    # add a gravitational model to the state propagator\n",
    "    ug = kmdl.Gravity(\"grav_model\", sp, kmdl.UniformGravity(\"uniform_gravity\"), mb)\n",
    "    ug.getGravityInterface().setGravity(np.array([0, 0, -9.81]), 0.0, kmdl.OutputUpdateType.PRE_HOP)\n",
    "    del ug\n",
    "\n",
    "    # Modify the initial multibody state. Here we will set the first pendulum to 0.5 radians.\n",
    "    bd1 = mb.getBody(\"link_0\")\n",
    "    bd1.parentHinge().subhinge(0).setQ([0.5])\n",
    "    bd1.parentHinge().subhinge(0).setU([0.0])\n",
    "\n",
    "    # Initialize integrator state\n",
    "    t_init = np.timedelta64(0, \"ns\")\n",
    "    x_init = sp.assembleState()\n",
    "    sp.setTime(t_init)\n",
    "    sp.setState(x_init)\n",
    "\n",
    "    # register the timed event\n",
    "    h = np.timedelta64(int(1e7), \"ns\")\n",
    "    t = kd.TimedEvent(\"hop_size\", h, lambda _: None, False)\n",
    "    t.period = h\n",
    "    sp.registerTimedEvent(t)\n",
    "    del t\n",
    "\n",
    "    print(f\"Number of links: {n_links}\")\n",
    "    start_time = time.time()\n",
    "    sp.advanceTo(2.0)\n",
    "    end_time = time.time()\n",
    "    run_time = end_time - start_time\n",
    "    runtimes.append(run_time)\n",
    "    derivs = sp.counters().derivs\n",
    "    deriv_calls.append(derivs)\n",
    "    print(f\"Time to run: {run_time}, derivs={derivs}\")\n",
    "\n",
    "    # Cleanup\n",
    "    cleanup()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acda6c0b",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "## Benchmark Simulation Runtimes\n",
    "\n",
    "Below the benchmark results are plotted for normalized simulation run times with respect to the number of links. This is the time the simulation takes to run divided by the number of bodies. The Fully Augmented model is compared to the normal simulation style."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e9b4fa49",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.plotly.v1+json": {
       "config": {
        "plotlyServerURL": "https://plot.ly"
       },
       "data": [
        {
         "hovertemplate": "Number of Bodies=%{x}<br>Time per Body=%{y}<extra></extra>",
         "legendgroup": "",
         "marker": {
          "color": "#636efa",
          "symbol": "circle"
         },
         "mode": "markers",
         "name": "",
         "orientation": "v",
         "showlegend": false,
         "type": "scatter",
         "x": {
          "bdata": "AwQFBwgKDRAUGR4oMkZf",
          "dtype": "i1"
         },
         "xaxis": "x",
         "y": {
          "bdata": "q6qqqrxTxz8AAACAh2rHPzMzMzNJsMc/JUmSJLcAxz8AAADA8E/HPzMzMzOW38Y/sRM7sWXvxz8AAADgcHnHPwAAAIAeYMc/CtejcIFKyD8iIiIiH97HP2ZmZqYh5sY/j8L1KJlDxj9YfMVX80/GP+LU77mfi8Y/",
          "dtype": "f8"
         },
         "yaxis": "y"
        }
       ],
       "layout": {
        "legend": {
         "tracegroupgap": 0
        },
        "template": {
         "data": {
          "bar": [
           {
            "error_x": {
             "color": "#2a3f5f"
            },
            "error_y": {
             "color": "#2a3f5f"
            },
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "bar"
           }
          ],
          "barpolar": [
           {
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "barpolar"
           }
          ],
          "carpet": [
           {
            "aaxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "baxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "type": "carpet"
           }
          ],
          "choropleth": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "choropleth"
           }
          ],
          "contour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "contour"
           }
          ],
          "contourcarpet": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "contourcarpet"
           }
          ],
          "heatmap": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "heatmap"
           }
          ],
          "histogram": [
           {
            "marker": {
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "histogram"
           }
          ],
          "histogram2d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2d"
           }
          ],
          "histogram2dcontour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2dcontour"
           }
          ],
          "mesh3d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "mesh3d"
           }
          ],
          "parcoords": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "parcoords"
           }
          ],
          "pie": [
           {
            "automargin": true,
            "type": "pie"
           }
          ],
          "scatter": [
           {
            "fillpattern": {
             "fillmode": "overlay",
             "size": 10,
             "solidity": 0.2
            },
            "type": "scatter"
           }
          ],
          "scatter3d": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatter3d"
           }
          ],
          "scattercarpet": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattercarpet"
           }
          ],
          "scattergeo": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergeo"
           }
          ],
          "scattergl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergl"
           }
          ],
          "scattermap": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattermap"
           }
          ],
          "scattermapbox": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattermapbox"
           }
          ],
          "scatterpolar": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolar"
           }
          ],
          "scatterpolargl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolargl"
           }
          ],
          "scatterternary": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterternary"
           }
          ],
          "surface": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "surface"
           }
          ],
          "table": [
           {
            "cells": {
             "fill": {
              "color": "#EBF0F8"
             },
             "line": {
              "color": "white"
             }
            },
            "header": {
             "fill": {
              "color": "#C8D4E3"
             },
             "line": {
              "color": "white"
             }
            },
            "type": "table"
           }
          ]
         },
         "layout": {
          "annotationdefaults": {
           "arrowcolor": "#2a3f5f",
           "arrowhead": 0,
           "arrowwidth": 1
          },
          "autotypenumbers": "strict",
          "coloraxis": {
           "colorbar": {
            "outlinewidth": 0,
            "ticks": ""
           }
          },
          "colorscale": {
           "diverging": [
            [
             0,
             "#8e0152"
            ],
            [
             0.1,
             "#c51b7d"
            ],
            [
             0.2,
             "#de77ae"
            ],
            [
             0.3,
             "#f1b6da"
            ],
            [
             0.4,
             "#fde0ef"
            ],
            [
             0.5,
             "#f7f7f7"
            ],
            [
             0.6,
             "#e6f5d0"
            ],
            [
             0.7,
             "#b8e186"
            ],
            [
             0.8,
             "#7fbc41"
            ],
            [
             0.9,
             "#4d9221"
            ],
            [
             1,
             "#276419"
            ]
           ],
           "sequential": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ],
           "sequentialminus": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ]
          },
          "colorway": [
           "#636efa",
           "#EF553B",
           "#00cc96",
           "#ab63fa",
           "#FFA15A",
           "#19d3f3",
           "#FF6692",
           "#B6E880",
           "#FF97FF",
           "#FECB52"
          ],
          "font": {
           "color": "#2a3f5f"
          },
          "geo": {
           "bgcolor": "white",
           "lakecolor": "white",
           "landcolor": "#E5ECF6",
           "showlakes": true,
           "showland": true,
           "subunitcolor": "white"
          },
          "hoverlabel": {
           "align": "left"
          },
          "hovermode": "closest",
          "mapbox": {
           "style": "light"
          },
          "paper_bgcolor": "white",
          "plot_bgcolor": "#E5ECF6",
          "polar": {
           "angularaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "radialaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "scene": {
           "xaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "yaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "zaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           }
          },
          "shapedefaults": {
           "line": {
            "color": "#2a3f5f"
           }
          },
          "ternary": {
           "aaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "baxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "caxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "title": {
           "x": 0.05
          },
          "xaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          },
          "yaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          }
         }
        },
        "title": {
         "text": "Computational Time vs Number of Bodies"
        },
        "xaxis": {
         "anchor": "y",
         "domain": [
          0,
          1
         ],
         "title": {
          "text": "Number of Bodies"
         },
         "type": "log"
        },
        "yaxis": {
         "anchor": "x",
         "domain": [
          0,
          1
         ],
         "title": {
          "text": "Time per Body"
         }
        }
       }
      },
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "normalized_times = np.array(runtimes) / np.array(n_links_list)\n",
    "\n",
    "run_data_df = pd.DataFrame(\n",
    "    {\n",
    "        \"NLinks\": n_links_list,\n",
    "        \"RunTimes\": runtimes,\n",
    "        \"NormalizedTimes\": normalized_times,\n",
    "    }\n",
    ")\n",
    "\n",
    "# Create scatter plot\n",
    "fig = px.scatter(\n",
    "    run_data_df,\n",
    "    x=\"NLinks\",\n",
    "    y=\"NormalizedTimes\",\n",
    "    title=\"Computational Time vs Number of Bodies\",\n",
    "    labels={\"NLinks\": \"Number of Bodies\", \"NormalizedTimes\": \"Time per Body\"},\n",
    "    log_x=True,\n",
    ")\n",
    "\n",
    "# Show plot if not running in a test environment\n",
    "if not os.getenv(\"DTEST_RUNNING\", False):\n",
    "    fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef93cb34",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "## Summary\n",
    "\n",
    "Awesome! By running multiple simulations with a varying number of links, you can see that the runtime scales linearly with the number of links.\n",
    "\n",
    "## Further Readings\n",
    "[Benchmark the n-link pendulum against conventional methods](../example_fully_augmented_benchmark/notebook.ipynb)  \n",
    "[Simulate collisions with a n-link pendulum](../example_procedural_collision/notebook.ipynb) "
   ]
  }
 ],
 "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.12.3"
  },
  "name": "notebook.ipynb"
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
