{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "adaad863",
      "metadata": {
        "id": "adaad863"
      },
      "source": [
        "#  Gravity Model with Manual Friction Factors\n",
        "Students input zone count, productions, attractions, cost matrix, and direct F(cij) values."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "492f08b5",
      "metadata": {
        "id": "492f08b5"
      },
      "source": [
        "##  Enter Zone Count and Initial Data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "4ca41815",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000,
          "referenced_widgets": [
            "0e30e575509442149d855b09dfe67b38",
            "d4569574dc18494498456bffb2e77ac8",
            "8de061e10ea74b378a037fd552226b21",
            "9f290a889fd3414088f0b7ac5df32c1b",
            "06ba1a62798546da876f7d36d589b41b",
            "0042a69d84d74509bf1750b26abd7691",
            "83e66a2504f24336bbc9afa0d3e2148d",
            "5ad6f6714ec84176a8426a0c569b2a87",
            "1cd9efa6156e4162843141a33dc49622",
            "b489e586e70046be98b6b2bb4b178dce",
            "8748aec7975045c5a84d30b5694ff25a",
            "3e3f25a9f1824d2eb55e178c9ea66ac7",
            "8ae771f61ecd4cc09668b0412f40890a",
            "39b02d9f96fd456384cf33002b37a560",
            "dfa56645d4e14126aac16c6381ca1fbd",
            "f11c0ae0da1742308e21a5096b58bb87",
            "9e6519d18a62468a8abe80c1de5a9bbb",
            "47e83684a7c847838f634101cf3b7acd"
          ]
        },
        "id": "4ca41815",
        "outputId": "945227b4-4fbd-4b07-cee4-7982524d152c"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " Model Complete!\n"
          ]
        },
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "summary": "{\n  \"name\": \"start_button\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"To Zone 1\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 110.49165881036753,\n        \"min\": 42.9,\n        \"max\": 300.0,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          99.1,\n          300.0,\n          158.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"To Zone 2\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 70.54865933051693,\n        \"min\": 36.6,\n        \"max\": 200.0,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          92.7,\n          200.0,\n          70.7\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"To Zone 3\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 166.77447846318293,\n        \"min\": 158.2,\n        \"max\": 500.0,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          158.2,\n          500.0,\n          171.3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Row Total\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 339.1164991562634,\n        \"min\": 250.0,\n        \"max\": 1000.0,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          350.0,\n          1000.0,\n          400.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}",
              "type": "dataframe"
            },
            "text/html": [
              "\n",
              "  <div id=\"df-5fa36739-7ce4-4e68-acb4-96e861f18e52\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>To Zone 1</th>\n",
              "      <th>To Zone 2</th>\n",
              "      <th>To Zone 3</th>\n",
              "      <th>Row Total</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>From Zone 1</th>\n",
              "      <td>158.0</td>\n",
              "      <td>70.7</td>\n",
              "      <td>171.3</td>\n",
              "      <td>400.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>From Zone 2</th>\n",
              "      <td>99.1</td>\n",
              "      <td>92.7</td>\n",
              "      <td>158.2</td>\n",
              "      <td>350.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>From Zone 3</th>\n",
              "      <td>42.9</td>\n",
              "      <td>36.6</td>\n",
              "      <td>170.5</td>\n",
              "      <td>250.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>Column Total</th>\n",
              "      <td>300.0</td>\n",
              "      <td>200.0</td>\n",
              "      <td>500.0</td>\n",
              "      <td>1000.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5fa36739-7ce4-4e68-acb4-96e861f18e52')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-5fa36739-7ce4-4e68-acb4-96e861f18e52 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-5fa36739-7ce4-4e68-acb4-96e861f18e52');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-6eb51b4b-eb99-4c64-8dfd-02f6f864191d\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-6eb51b4b-eb99-4c64-8dfd-02f6f864191d')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-6eb51b4b-eb99-4c64-8dfd-02f6f864191d button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "text/plain": [
              "              To Zone 1  To Zone 2  To Zone 3  Row Total\n",
              "From Zone 1       158.0       70.7      171.3      400.0\n",
              "From Zone 2        99.1       92.7      158.2      350.0\n",
              "From Zone 3        42.9       36.6      170.5      250.0\n",
              "Column Total      300.0      200.0      500.0     1000.0"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Estimated Average Trip Length: 11.17\n",
            " Converged in 3 iterations\n"
          ]
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAGGCAYAAACNCg6xAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW+JJREFUeJzt3XucjHX/x/HX7HntkRx2l7VOlTNF3EuFLIpEOSw5J53oTiodfh2oRO5udBC3UuSQQw6VytlSSCLdlIQoxS7Snqzdnd25fn9MO7exi9mTa3bn/Xw85mHmO9d1zecz12777rqu+Y7FMAwDEREREbksL7MLEBERESkrFJxEREREXKTgJCIiIuIiBScRERERFyk4iYiIiLhIwUlERETERQpOIiIiIi5ScBIRERFxkYKTiIiIiIsUnEREyqlx48ZhsVjMLkOkXFFwEvEwhw8f5v7776dOnToEBAQQGhpK27Ztef311zl37pzZ5YkLhg4disVicdxCQ0Np1qwZ//73v8nKyiqR13j77beZM2dOiWxLpDzxMbsAEblyPvvsM/r06YO/vz+DBw+mcePGZGdn89VXX/HEE0/www8/MGvWLLPLFBf4+/vz7rvvApCcnMyyZct4/PHH2blzJ4sWLSr29t9++20qV67M0KFDi70tkfJEwUnEQxw5coR+/foRExPDxo0biYyMdDw3cuRIDh06xGeffWZihcWXmZmJn58fXl7l/2C6j48PAwcOdDx+6KGHaN26NYsXL2bKlClERUWZWJ1I+VX+/+siIgBMnjyZ9PR0Zs+e7RSa8tSrV49HHnnE8TgnJ4eXXnqJunXr4u/vT61atXjmmWfynQqqVasWt99+O1999RWtWrUiICCAOnXq8MEHHziW+fbbb7FYLMydOzff665ZswaLxcKqVascY3/88Qf33HMP1apVw9/fn0aNGvHee+85rZeQkIDFYmHRokU8++yzVK9enQoVKpCamgrA0qVLadiwIQEBATRu3JgVK1YwdOhQatWq5bQdm83GtGnTaNSoEQEBAVSrVo3777+fv/76q9B95klOTubRRx+lVq1a+Pv7U6NGDQYPHszp06cdy2RlZfHCCy9Qr149/P39iY6OZuzYsUU+1ebl5UX79u0BOHr06EWXc2W/1qpVix9++IHNmzc7TgfmbVvE4xki4hGqV69u1KlTx+XlhwwZYgBG7969jenTpxuDBw82AKNnz55Oy8XExBjXXnutUa1aNeOZZ54x3nrrLeP66683LBaLsW/fPsdyderUMbp27ZrvdYYNG2ZUrFjRyM7ONgzDMBITE40aNWoY0dHRxosvvmjMmDHDuOOOOwzAmDp1qmO9TZs2GYDRsGFDo3nz5saUKVOMiRMnGmfPnjVWrVplWCwWo2nTpsaUKVOM5557zqhYsaLRuHFjIyYmxun17733XsPHx8cYMWKEMXPmTOPJJ580goKCjBtuuMFRU2H6TEtLMxo3bmx4e3sbI0aMMGbMmGG89NJLxg033GB89913hmEYRm5urtG5c2ejQoUKxujRo43//Oc/xqhRowwfHx+jR48eLu2boKCgfON33nmnARg//fSTYRiG8cILLxgX/mfelf26YsUKo0aNGkb9+vWNefPmGfPmzTPWrl172bpEPIGCk4gHSElJMQCX/igbhmHs2bPHAIx7773Xafzxxx83AGPjxo2OsZiYGAMwtmzZ4hg7efKk4e/vbzz22GOOsaefftrw9fU1zpw54xjLysoywsPDjXvuuccxNnz4cCMyMtI4ffq002v369fPCAsLMzIyMgzD+F9wqlOnjmMsT5MmTYwaNWoYaWlpjrGEhAQDcApOX375pQEYCxYscFp/9erV+cZd7fP55583AGP58uXGhWw2m2EYhjFv3jzDy8vL+PLLL52enzlzpgEYW7duzbfu+fKC06lTp4xTp04Zhw4dMl555RVHWMxzYXAqzH5t1KiR0a5du0vWIeKJdKpOxAPknb4KCQlxafnPP/8cgDFjxjiNP/bYYwD5roVq2LAhN910k+NxlSpVuPbaa/nll18cY/Hx8VitVpYvX+4YW7t2LcnJycTHxwNgGAbLli2je/fuGIbB6dOnHbcuXbqQkpLC7t27nV57yJAhBAYGOh4fP36cvXv3MnjwYIKDgx3j7dq1o0mTJk7rLl26lLCwMDp16uT0Wi1atCA4OJhNmzYVus9ly5bRrFkz7rzzznzva97UAEuXLqVBgwbUr1/f6XVvueUWgHyvW5CzZ89SpUoVqlSpQr169XjmmWeIjY1lxYoVF12nsPtVRPLTxeEiHiA0NBSAtLQ0l5b/9ddf8fLyol69ek7jERERhIeH8+uvvzqN16xZM982Klas6HSdULNmzahfvz6LFy9m+PDhACxevJjK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brfeemtpt3FZhelzzpw5+XoICAhwWsZd9ycUrtf27dvn69VisdCtWzfHMu64T7ds2UL37t2JiorCYrGwcuXKy66TkJDA9ddfj7+/P/Xq1WPOnDn5lins731pK2yfy5cvp1OnTlSpUoXQ0FBiY2NZs2aN0zLjxo3Ltz/r169fil24prC9JiQkFPizm5iY6LRcWd+nBf3+WSwWGjVq5FjGHffpxIkTueGGGwgJCaFq1ar07NmTAwcOXHY9d/lbquBUSIsXL2bMmDG88MIL7N69m2bNmtGlSxdOnjxZ4PLbtm2jf//+DB8+nO+++46ePXvSs2dP9u3b51hm8uTJvPHGG8ycOZMdO3YQFBREly5dyMzMvFJt5VPYPhMSEujfvz+bNm1i+/btREdH07lzZ/744w+n5W699VZOnDjhuH344YdXop2LKmyfYJ987fwefv31V6fn3XF/QuF7Xb58uVOf+/btw9vbmz59+jgt52779OzZszRr1ozp06e7tPyRI0fo1q0bHTp0YM+ePYwePZp7773XKVQU5eektBW2zy1bttCpUyc+//xzdu3aRYcOHejevTvfffed03KNGjVy2p9fffVVaZRfKIXtNc+BAweceqlatarjufKwT19//XWn/o4dO0alSpXy/Y662z7dvHkzI0eO5Ouvv2bdunVYrVY6d+7M2bNnL7qOW/0tNaRQWrVqZYwcOdLxODc314iKijImTpxY4PJ9+/Y1unXr5jTWunVr4/777zcMwzBsNpsRERFh/Otf/3I8n5ycbPj7+xsffvhhKXTgmsL2eaGcnBwjJCTEmDt3rmNsyJAhRo8ePUq61GIpbJ/vv/++ERYWdtHtuev+NIzi79OpU6caISEhRnp6umPMHffp+QBjxYoVl1xm7NixRqNGjZzG4uPjjS5dujgeF/e9K22u9FmQhg0bGuPHj3c8fuGFF4xmzZqVXGGlwJVeN23aZADGX3/9ddFlyuM+XbFihWGxWIyjR486xsrCPj158qQBGJs3b77oMu70t1RHnAohOzubXbt2ERcX5xjz8vIiLi6O7du3F7jO9u3bnZYH6NKli2P5I0eOkJiY6LRMWFgYrVu3vug2S1tR+rxQRkYGVquVSpUqOY0nJCRQtWpVrr32Wh588EH+/PPPEq29MIraZ3p6OjExMURHR9OjRw9++OEHx3PuuD+hZPbp7Nmz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",
            "text/plain": [
              "<Figure size 600x400 with 1 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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",
            "text/plain": [
              "<Figure size 600x500 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import ipywidgets as widgets\n",
        "from IPython.display import display, clear_output\n",
        "\n",
        "# Function to safely collect matrix input\n",
        "def parse_matrix_input(text, expected_rows):\n",
        "    try:\n",
        "        rows = text.strip().split(\"\\n\")\n",
        "        if len(rows) != expected_rows:\n",
        "            raise ValueError(\"Row count does not match zone count.\")\n",
        "        matrix = [list(map(float, row.strip().split())) for row in rows]\n",
        "        return np.array(matrix)\n",
        "    except:\n",
        "        print(\" Invalid matrix input format.\")\n",
        "        return None\n",
        "\n",
        "zone_count = widgets.BoundedIntText(value=3, min=2, max=10, step=1, description='Number of Zones:')\n",
        "display(zone_count)\n",
        "\n",
        "# Production input\n",
        "prod_input = widgets.Textarea(\n",
        "    value=\"400 350 250\",\n",
        "    placeholder=\"Enter productions separated by space\",\n",
        "    description='Productions:',\n",
        "    layout=widgets.Layout(width='70%', height='50px')\n",
        ")\n",
        "display(prod_input)\n",
        "\n",
        "# Attraction input\n",
        "attr_input = widgets.Textarea(\n",
        "    value=\"300 200 500\",\n",
        "    placeholder=\"Enter attractions separated by space\",\n",
        "    description='Attractions:',\n",
        "    layout=widgets.Layout(width='70%', height='50px')\n",
        ")\n",
        "display(attr_input)\n",
        "\n",
        "# Skim matrix input\n",
        "skim_input = widgets.Textarea(\n",
        "    value=\"5 10 18\\n13 5 15\\n20 16 6\",\n",
        "    placeholder=\"Enter travel times as space-separated rows (one row per line)\",\n",
        "    description='Cost Matrix:',\n",
        "    layout=widgets.Layout(width='70%', height='100px')\n",
        ")\n",
        "display(skim_input)\n",
        "\n",
        "# Friction factor matrix input\n",
        "fij_input = widgets.Textarea(\n",
        "    value=\"1.30 0.85 0.65\\n0.95 1.30 0.70\\n0.60 0.75 1.10\",\n",
        "    placeholder=\"Enter friction factors F_ij as matrix (rows by line)\",\n",
        "    description='Friction Factors:',\n",
        "    layout=widgets.Layout(width='70%', height='100px')\n",
        ")\n",
        "display(fij_input)\n",
        "\n",
        "start_button = widgets.Button(description=\" Run Model\", button_style='success')\n",
        "display(start_button)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "42260a95",
      "metadata": {
        "id": "42260a95"
      },
      "source": [
        "##  Gravity Model Using Manual Friction Factors & Visualization"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "442fafa8",
      "metadata": {
        "id": "442fafa8"
      },
      "outputs": [],
      "source": [
        "def run_gravity_model(_):\n",
        "    n = zone_count.value\n",
        "    try:\n",
        "        P = np.array(list(map(float, prod_input.value.strip().split())))\n",
        "        A = np.array(list(map(float, attr_input.value.strip().split())))\n",
        "        C = parse_matrix_input(skim_input.value, n)\n",
        "        F = parse_matrix_input(fij_input.value, n)\n",
        "        if len(P) != n or len(A) != n or C is None or F is None or C.shape != (n, n) or F.shape != (n, n):\n",
        "            print(\" Check that all matrix dimensions match the zone count.\")\n",
        "            return\n",
        "    except:\n",
        "        print(\" Error parsing inputs. Check all values.\")\n",
        "        return\n",
        "\n",
        "    Tij = np.zeros((n, n))\n",
        "    row_errors = []\n",
        "    col_errors = []\n",
        "\n",
        "    for i in range(n):\n",
        "        denom = np.sum(F[i, :] * A)\n",
        "        for j in range(n):\n",
        "            Tij[i, j] = P[i] * (F[i, j] * A[j]) / denom\n",
        "\n",
        "    # Furness balancing\n",
        "    tolerance = 1e-4\n",
        "    max_iter = 100\n",
        "    for iteration in range(max_iter):\n",
        "        row_errors.append(np.abs(Tij.sum(axis=1) - P).sum())\n",
        "        col_errors.append(np.abs(Tij.sum(axis=0) - A).sum())\n",
        "\n",
        "        col_sums = Tij.sum(axis=0)\n",
        "        for j in range(n):\n",
        "            if col_sums[j] != 0:\n",
        "                Tij[:, j] *= A[j] / col_sums[j]\n",
        "\n",
        "        row_sums = Tij.sum(axis=1)\n",
        "        for i in range(n):\n",
        "            if row_sums[i] != 0:\n",
        "                Tij[i, :] *= P[i] / row_sums[i]\n",
        "\n",
        "        if np.allclose(Tij.sum(axis=0), A, rtol=tolerance) and np.allclose(Tij.sum(axis=1), P, rtol=tolerance):\n",
        "            print(f\" Converged in {iteration+1} iterations\")\n",
        "            break\n",
        "\n",
        "    Tij = Tij.round(1)\n",
        "    for i in range(n):\n",
        "        Tij[i, -1] += P[i] - Tij[i, :].sum()\n",
        "    for j in range(n):\n",
        "        Tij[-1, j] += A[j] - Tij[:, j].sum()\n",
        "\n",
        "    df = pd.DataFrame(\n",
        "        Tij.round(1),\n",
        "        index=[f\"From Zone {i+1}\" for i in range(n)],\n",
        "        columns=[f\"To Zone {j+1}\" for j in range(n)]\n",
        "    )\n",
        "    df[\"Row Total\"] = df.sum(axis=1)\n",
        "    df.loc[\"Column Total\"] = df.sum(axis=0)\n",
        "\n",
        "    clear_output(wait=True)\n",
        "    print(\" Model Complete!\")\n",
        "    display(df)\n",
        "\n",
        "    avg_trip_length = (Tij * C).sum() / Tij.sum()\n",
        "    print(f\"Estimated Average Trip Length: {avg_trip_length:.2f}\")\n",
        "    print(f\" Converged in {iteration+1} iterations\")\n",
        "    # Plot: Convergence\n",
        "    plt.figure(figsize=(6, 4))\n",
        "    plt.plot(row_errors, label='Row Error')\n",
        "    plt.plot(col_errors, label='Column Error')\n",
        "    plt.title(\"Convergence Plot\")\n",
        "    plt.xlabel(\"Iteration\")\n",
        "    plt.ylabel(\"Error\")\n",
        "    plt.legend()\n",
        "    plt.grid(True)\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "    # Plot: Heatmap\n",
        "    plt.figure(figsize=(6, 5))\n",
        "    sns.heatmap(Tij, annot=True, fmt=\".1f\", cmap=\"YlGnBu\")\n",
        "    plt.title(\"Trip Distribution Heatmap\")\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "start_button.on_click(run_gravity_model)"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "0042a69d84d74509bf1750b26abd7691": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "06ba1a62798546da876f7d36d589b41b": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": "50px",
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": "70%"
          }
        },
        "0e30e575509442149d855b09dfe67b38": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "BoundedIntTextModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "BoundedIntTextModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "IntTextView",
            "continuous_update": false,
            "description": "Number of Zones:",
            "description_tooltip": null,
            "disabled": false,
            "layout": "IPY_MODEL_d4569574dc18494498456bffb2e77ac8",
            "max": 10,
            "min": 2,
            "step": 1,
            "style": "IPY_MODEL_8de061e10ea74b378a037fd552226b21",
            "value": 3
          }
        },
        "1cd9efa6156e4162843141a33dc49622": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "39b02d9f96fd456384cf33002b37a560": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": "100px",
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": "70%"
          }
        },
        "3e3f25a9f1824d2eb55e178c9ea66ac7": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "47e83684a7c847838f634101cf3b7acd": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "ButtonStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ButtonStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "button_color": null,
            "font_weight": ""
          }
        },
        "5ad6f6714ec84176a8426a0c569b2a87": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": "50px",
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": "70%"
          }
        },
        "83e66a2504f24336bbc9afa0d3e2148d": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "TextareaModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "TextareaModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "TextareaView",
            "continuous_update": true,
            "description": "Attractions:",
            "description_tooltip": null,
            "disabled": false,
            "layout": "IPY_MODEL_5ad6f6714ec84176a8426a0c569b2a87",
            "placeholder": "Enter attractions separated by space",
            "rows": null,
            "style": "IPY_MODEL_1cd9efa6156e4162843141a33dc49622",
            "value": "300 200 500"
          }
        },
        "8748aec7975045c5a84d30b5694ff25a": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": "100px",
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": "70%"
          }
        },
        "8ae771f61ecd4cc09668b0412f40890a": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "TextareaModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "TextareaModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "TextareaView",
            "continuous_update": true,
            "description": "Friction Factors:",
            "description_tooltip": null,
            "disabled": false,
            "layout": "IPY_MODEL_39b02d9f96fd456384cf33002b37a560",
            "placeholder": "Enter friction factors F_ij as matrix (rows by line)",
            "rows": null,
            "style": "IPY_MODEL_dfa56645d4e14126aac16c6381ca1fbd",
            "value": "1.30 0.85 0.65\n0.95 1.30 0.70\n0.60 0.75 1.10"
          }
        },
        "8de061e10ea74b378a037fd552226b21": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "9e6519d18a62468a8abe80c1de5a9bbb": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "9f290a889fd3414088f0b7ac5df32c1b": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "TextareaModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "TextareaModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "TextareaView",
            "continuous_update": true,
            "description": "Productions:",
            "description_tooltip": null,
            "disabled": false,
            "layout": "IPY_MODEL_06ba1a62798546da876f7d36d589b41b",
            "placeholder": "Enter productions separated by space",
            "rows": null,
            "style": "IPY_MODEL_0042a69d84d74509bf1750b26abd7691",
            "value": "400 350 250"
          }
        },
        "b489e586e70046be98b6b2bb4b178dce": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "TextareaModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "TextareaModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "TextareaView",
            "continuous_update": true,
            "description": "Cost Matrix:",
            "description_tooltip": null,
            "disabled": false,
            "layout": "IPY_MODEL_8748aec7975045c5a84d30b5694ff25a",
            "placeholder": "Enter travel times as space-separated rows (one row per line)",
            "rows": null,
            "style": "IPY_MODEL_3e3f25a9f1824d2eb55e178c9ea66ac7",
            "value": "5 10 18\n13 5 15\n20 16 6"
          }
        },
        "d4569574dc18494498456bffb2e77ac8": {
          "model_module": "@jupyter-widgets/base",
          "model_module_version": "1.2.0",
          "model_name": "LayoutModel",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "dfa56645d4e14126aac16c6381ca1fbd": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "DescriptionStyleModel",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "f11c0ae0da1742308e21a5096b58bb87": {
          "model_module": "@jupyter-widgets/controls",
          "model_module_version": "1.5.0",
          "model_name": "ButtonModel",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ButtonModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ButtonView",
            "button_style": "success",
            "description": " Run Model",
            "disabled": false,
            "icon": "",
            "layout": "IPY_MODEL_9e6519d18a62468a8abe80c1de5a9bbb",
            "style": "IPY_MODEL_47e83684a7c847838f634101cf3b7acd",
            "tooltip": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
