{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0e827775",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# Fully Augmented $n$-link  Pendulum Benchmark Comparison\n",
    "In this notebook we use the $n$-link pendulum example to compare the performance of **kdFlex's** default SOA-base $O(N)$ dynamics algorithm with the conventional $O(N^{3}$) methods for a *fully augmented (FA)* model. This notebook is similar to the $n$-link pendulum but is designed for benchmarking **kdFlex**'s simulation performance. \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 simulations for each model\n",
    "- Benchmark simulation runtimes\n",
    "\n",
    "![](../resources/nb_images/results_plot.png)\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
   },
   "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",
    "from Karana.Core import discard, allReady\n",
    "from Karana.Frame import FrameContainer\n",
    "from Karana.Integrators import IntegratorType\n",
    "import Karana.Core as kc\n",
    "import Karana.Math as km\n",
    "import Karana.Frame as kf\n",
    "import Karana.Dynamics as kd\n",
    "import Karana.Scene as ks\n",
    "from Karana.Dynamics import (\n",
    "    Multibody,\n",
    "    PhysicalBody,\n",
    "    PhysicalBody,\n",
    "    HingeType,\n",
    "    StatePropagator,\n",
    "    TimedEvent,\n",
    "    MMSolverType,\n",
    "    PhysicalBodyParams,\n",
    ")\n",
    "from Karana.Math import SpatialInertia, HomTran\n",
    "from Karana.Models import Gravity, UniformGravity, OutputUpdateType"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9bde08ea",
   "metadata": {
    "collapsed": 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
   },
   "outputs": [],
   "source": [
    "def createMbody(fc: 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 = 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 = PhysicalBodyParams(\n",
    "        SpatialInertia(2.0, np.zeros(3), np.diag([3, 2, 1])),\n",
    "        [np.array([0.0, 1.0, 0.0])],\n",
    "        HomTran(np.array([0, 0, 0.5])),\n",
    "        HomTran(np.array([0, 0, -0.5])),\n",
    "    )\n",
    "    PhysicalBody.addSerialChain(\n",
    "        \"link\",\n",
    "        n_links,\n",
    "        cast(PhysicalBody, mb.virtualRoot()),\n",
    "        htype=HingeType.REVOLUTE,\n",
    "        params=params,\n",
    "    )\n",
    "\n",
    "    # finalize and verify the multibody\n",
    "    mb.ensureHealthy()\n",
    "    mb.resetData()\n",
    "    assert allReady()\n",
    "\n",
    "    return mb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22ed4ff4",
   "metadata": {
    "collapsed": 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
   },
   "outputs": [],
   "source": [
    "def cleanup():\n",
    "    \"\"\"Cleanup the simulation.\"\"\"\n",
    "    global integrator, bd1\n",
    "    del integrator, bd1\n",
    "\n",
    "    discard(sp)\n",
    "    gc.collect()\n",
    "\n",
    "    discard(mb)\n",
    "    discard(fc)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b3a5ba0",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## Run simulations for each model\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": 4,
   "id": "057ac878",
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of links: 3\n",
      "Time to run: 0.5312042236328125, derivs=800, simtype=MinCoord\n",
      "Number of links: 5\n",
      "Time to run: 0.8555688858032227, derivs=800, simtype=MinCoord\n",
      "Number of links: 8\n",
      "Time to run: 1.3696057796478271, derivs=800, simtype=MinCoord\n",
      "Number of links: 10\n",
      "Time to run: 1.7147438526153564, derivs=800, simtype=MinCoord\n",
      "Number of links: 13\n",
      "Time to run: 2.202927827835083, derivs=800, simtype=MinCoord\n",
      "Number of links: 16\n",
      "Time to run: 2.7338907718658447, derivs=800, simtype=MinCoord\n",
      "Number of links: 20\n",
      "Time to run: 3.440138101577759, derivs=800, simtype=MinCoord\n",
      "Number of links: 25\n",
      "Time to run: 4.15083384513855, derivs=800, simtype=MinCoord\n",
      "Number of links: 3\n",
      "Time to run: 3.1776249408721924, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 5\n",
      "Time to run: 5.857543230056763, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 8\n",
      "Time to run: 11.539303064346313, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 10\n",
      "Time to run: 17.039833784103394, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 13\n",
      "Time to run: 26.927199602127075, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 16\n",
      "Time to run: 38.98977971076965, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 20\n",
      "Time to run: 62.018266677856445, derivs=800, simtype=fullyAugmented\n",
      "Number of links: 25\n",
      "Time to run: 101.60065293312073, derivs=800, simtype=fullyAugmented\n"
     ]
    }
   ],
   "source": [
    "# Number of links we will run at\n",
    "\n",
    "n_links_list = [3, 5, 8, 10, 13, 16, 20, 25]\n",
    "\n",
    "sim_types = [\"MinCoord\", \"fullyAugmented\"]\n",
    "\n",
    "for sim in sim_types:\n",
    "    runtimes = []\n",
    "    deriv_calls = []\n",
    "\n",
    "    for n_links in n_links_list:\n",
    "        # initialization\n",
    "        fc = FrameContainer(\"root\")\n",
    "        mb = createMbody(fc, n_links)\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",
    "        # Switching to fully augmented model\n",
    "        if sim == \"fullyAugmented\":\n",
    "            mb.toFullyAugmentedModel()\n",
    "\n",
    "        # Set up state propagator and select integrator type: rk4 or cvode\n",
    "        stype = (\n",
    "            MMSolverType.TREE_DYNAMICS\n",
    "            if sim == \"MinCoord\"\n",
    "            else MMSolverType.TREE_AUGMENTED_DYNAMICS\n",
    "        )\n",
    "        sp = StatePropagator(mb, IntegratorType.RK4, None, None, stype)\n",
    "        integrator = sp.getIntegrator()\n",
    "\n",
    "        # add a gravitational model to the state propagator\n",
    "        ug = Gravity(\"grav_model\", sp, UniformGravity(\"uniform_gravity\"), mb)\n",
    "        ug.getGravityInterface().setGravity(np.array([0, 0, -9.81]), 0.0, OutputUpdateType.PRE_HOP)\n",
    "        del ug\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 = TimedEvent(\"hop_size\", h, lambda _: None, False)\n",
    "        t.period = h\n",
    "        sp.registerTimedEvent(t)\n",
    "        del t\n",
    "\n",
    "        # Keeping track of runtime when advancing simulation\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",
    "\n",
    "        # General output\n",
    "        print(f\"Number of links: {n_links}\")\n",
    "        print(f\"Time to run: {run_time}, derivs={derivs}, simtype={sim}\")\n",
    "\n",
    "        # Cleanup\n",
    "        cleanup()\n",
    "\n",
    "    if sim == \"fullyAugmented\":\n",
    "        runtimesFA = runtimes\n",
    "    else:\n",
    "        runtimesMinCoord = runtimes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acda6c0b",
   "metadata": {
    "collapsed": 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 absolute coordinate model is compared to **kdFlex**'s minimal coordinate tree dynamics simulation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fa835d56",
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "runtimes = runtimesMinCoord\n",
    "\n",
    "normalized_times = np.array(runtimes) / np.array(n_links_list)\n",
    "normalized_times_FA = np.array(runtimesFA) / np.array(n_links_list)\n",
    "\n",
    "run_data_MinCoord_df = pd.DataFrame(\n",
    "    {\n",
    "        \"NLinks\": n_links_list,\n",
    "        \"RunTimes\": runtimes,\n",
    "        \"NormalizedTimes\": normalized_times,\n",
    "    }\n",
    ")\n",
    "run_data_MinCoord_df[\"sim_type\"] = \"MinCoord Dynamics\"\n",
    "\n",
    "run_data_FA_df = pd.DataFrame(\n",
    "    {\n",
    "        \"NLinks\": n_links_list,\n",
    "        \"RunTimes\": runtimesFA,\n",
    "        \"NormalizedTimes\": normalized_times_FA,\n",
    "    }\n",
    ")\n",
    "run_data_FA_df[\"sim_type\"] = \"Fully Augmented\"\n",
    "\n",
    "run_data = pd.concat([run_data_MinCoord_df, run_data_FA_df], ignore_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e9b4fa49",
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/vnd.plotly.v1+json": {
       "config": {
        "plotlyServerURL": "https://plot.ly"
       },
       "data": [
        {
         "hovertemplate": "sim_type=MinCoord Dynamics<br>Number of Bodies=%{x}<br>Time per Body=%{y}<extra></extra>",
         "legendgroup": "MinCoord Dynamics",
         "line": {
          "color": "#636efa",
          "dash": "solid"
         },
         "marker": {
          "symbol": "circle"
         },
         "mode": "lines",
         "name": "MinCoord Dynamics",
         "orientation": "v",
         "showlegend": true,
         "type": "scatter",
         "x": {
          "bdata": "AwUICg0QFBk=",
          "dtype": "i1"
         },
         "xaxis": "x",
         "y": {
          "bdata": "AAAAAKD/4D8AAAAA0mDrPwAAAMDn6fU/AAAAQJdv+z8AAACgmJ8BQAAAACAC3wVAAAAAIGeFC0AAAAAwdJoQQA==",
          "dtype": "f8"
         },
         "yaxis": "y"
        },
        {
         "hovertemplate": "sim_type=Fully Augmented<br>Number of Bodies=%{x}<br>Time per Body=%{y}<extra></extra>",
         "legendgroup": "Fully Augmented",
         "line": {
          "color": "#EF553B",
          "dash": "solid"
         },
         "marker": {
          "symbol": "circle"
         },
         "mode": "lines",
         "name": "Fully Augmented",
         "orientation": "v",
         "showlegend": true,
         "type": "scatter",
         "x": {
          "bdata": "AwUICg0QFBk=",
          "dtype": "i1"
         },
         "xaxis": "x",
         "y": {
          "bdata": "AAAAoMZrCUAAAADQH24XQAAAAIgfFCdAAAAAjDIKMUAAAAD0XO06QAAAABqxfkNAAAAAkFYCT0AAAAAZcWZZQA==",
          "dtype": "f8"
         },
         "yaxis": "y"
        }
       ],
       "layout": {
        "legend": {
         "title": {
          "text": "sim_type"
         },
         "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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AiTgKIFEI1QcBeTqevZubXH1/dkeCZAACZAACZAACZAACZAACZAACZCA8wQoVJxnaFcLFCp24WJhEiABEiABEiABEiABEiABEiABEtCSAIVKPIeFQiWegfN2JEACJEACJEACJEACJEACJEACJGACAQoVE6CySRIgARIgARIgARIgARIgARIgARIgAWsToFCxdnw5OhIgARIgARIgARIgARIgARIgARIgARMIUKiYAJVNkgAJkAAJkAAJkAAJkAAJkAAJkAAJWJsAhYq148vRkQAJkAAJkAAJkAAJkAAJkAAJkAAJmECAQsUEqGySBEiABEiABEiABEiABEiABEiABEjA2gQoVKwdX46OBEiABEiABEiABEiABEiABEiABEjABAIUKiZAZZMkQAIkQAIkQAIkQAIkQAIkQAIkQALWJkChYu34cnQkQAIkQAIkQAIkQAIkQAIkQAIkQAImEKBQMQEqmyQBEiABEiABEiABEiABEiABEiABErA2AQoVa8eXoyMBEiABEiABEiABEiABEiABEiABEjCBAIWKCVDZJAmQAAmQAAmQAAmQAAmQAAmQAAmQgLUJUKhYO74cHQmQAAmQAAmQAAmQAAmQAAmQAAmQgAkEKFRMgMomSYAESIAESIAESIAESIAESIAESIAErE2AQsXa8eXoSIAESIAESIAESIAESIAESIAESIAETCBAoWICVDZJAiRAAiRAAiRAAiRAAiRAAiRAAiRgbQIUKtaOL0dHAiRAAiRAAiRAAiRAAiRAAiRAAiRgAgEKFROgskkSIAESIAESIAESIAESIAESIAESIAFrE6BQsXZ8OToSIAESIAESIAESIAESIAESIAESIAETCFComACVTZIACZAACZAACZAACZAACZAACZAACVibAIWKtePL0ZEACZAACZAACZAACZAACZAACZAACZhAgELFBKhskgRIgARIgARIgARIgARIgARIgARIwNoEKFSsHV+OjgRIgARIgARIgARIgARIgARIgARIwAQCFComQGWTJEACJEACJEACJEACJEACJEACJEAC1iZAoWLt+HJ0JEACJEACJEACJEACJEACJEACJEACJhCgUDEBKpskARIgARIgARIgARIgARIgARIgARKwNgEKFWvHl6MjARIgARIgARIgARIgARIgARIgARIwgQCFiglQ2SQJkAAJkAAJkAAJkAAJkAAJkAAJkIC1CVCoWDu+HB0JkAAJkAAJkAAJkAAJkAAJkAAJkIAJBChUTIDKJkmABEiABEiABEiABEiABEiABEiABKxNgELF2vHl6EiABEiABEiABEiABEiABEiABEiABEwgQKFiAlQ2SQIkQAIkQAIkQAIkQAIkQAIkQAIkYG0CFCrWji9HRwIkQAIkQAIkQAIkQAIkQAIkQAIkYAIBChUToLJJEiABEiABEiABEiABEiABEiABEiABaxOgULF2fDk6EiABEiABEiABEiABEiABEiABEiABEwhQqJgAlU2SAAmQAAmQAAmQAAmQAAmQAAmQAAlYmwCFirXjy9GRAAmQAAmQAAmQAAmQAAmQAAmQAAmYQIBCxQSobJIESIAESIAESIAESIAESIAESIAESMDaBChUrB1fjo4ESIAESIAESIAESIAESIAESIAESMAEAhQqJkBlkyRAAiRAAiRAAiRAAiRAAiRAAiRAAtYmQKFi7fhydCRAAiRAAiRAAiRAAiRAAiRAAiRAAiYQoFAxASqbJAESIAESIAESIAESIAESIAESIAESsDYBChVrx5ejIwESIAESIAESIAESIAESIAESIAESMIEAhYoJUNkkCZAACZAACZAACZAACZAACZAACZCAtQlQqFg7vhwdCZAACZAACZAACZAACZAACZAACZCACQQoVEyAyiZJgARIgARIgARIgARIgARIgARIgASsTYBCxdrx5ehIgARIgARIgARIgARIgARIgARIgARMIEChYgJUNkkCJEACJEACJEACJEACJEACJEACJGBtAhQqTsb3n9v+TrbA6u4mkCqZD8LCw/HIP8TdXeH9EymBTGmT4Ob9QISFhSdSAtYYduZ0SXHjrr94n1hjPLqNIqV4V0O8qx/yXR1jaPx8PJEiqQ9uPwjULXSm9cfH2xNpkvuo96dVriS+Xkjm54U7D4MS3JDSpvRFQGAo/INCte67ju9qL08PZEjth+t3A9zOLp2I4xMRxwAn4pg1fVK3j4MdIIH4IkCh4iRpChUnAWpQnUJFgyAk8i5QqFhjAuj4Id0aZCNGQaESezQpVKwx2ylUzI+jju9qChXz4847kIBZBChUnCRLoeIkQA2qU6hoEIRE3gUKFWtMAB0/pFuDLIWKkThSqBihpH8ZChXzY6Tju5pCxfy48w4kYBYBChUnyVKoOAlQ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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create scatter plot\n",
    "fig = px.line(\n",
    "    run_data,\n",
    "    x=\"NLinks\",\n",
    "    y=\"NormalizedTimes\",\n",
    "    color=\"sim_type\",\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": "572c1541",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## Summary\n",
    "By running simulations using Minimal Coordinate Dynamics and Fully Augmented systems, you can see how the performance compares and scales.\n",
    "\n",
    "## Further Readings\n",
    "[Benchmark the n-link pendulum](../example_rigid_timing/notebook.ipynb)  \n",
    "[Simulate collisions with a n-link pendulum](../example_procedural_collision/notebook.ipynb) "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "argv": [
    "python",
    "-m",
    "ipykernel_launcher",
    "-f",
    "{connection_file}"
   ],
   "display_name": "Python 3 (ipykernel)",
   "env": null,
   "interrupt_mode": "signal",
   "kernel_protocol_version": "5.5",
   "language": "python",
   "metadata": {
    "debugger": true
   },
   "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
}
