01bae1f060
Adds Python bindings (behind feature='python-bindings') for graph,
risk_measures, topology, volterra, signatures.
Companion notebooks under examples/notebooks/:
- 05_graph.ipynb (Laplacians + spectral clustering)
- 06_risk_measures.ipynb (VaR / CVaR + simplex projection)
- 07_topology.ipynb (Vietoris-Rips + persistent homology)
- 08_volterra.ipynb (fractional ODE, Markovian lift, Volterra,
Fourier inversion)
- 09_signatures.ipynb (path / log / random / kernel signatures)
All notebooks executed end-to-end against analytic ground truth
(closed-form solutions, Mittag-Leffler, exp(-t), unit-circle homology,
identical-path signature kernel).
Built and validated via: maturin develop --release --features python-bindings.
Workflow generated by 5 parallel optimizRs subagents (.github/agents/).
390 lines
140 KiB
Plaintext
390 lines
140 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0a22bd06",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Graph Laplacians and Spectral Clustering\n",
|
|
"\n",
|
|
"Companion notebook for the `graph` module of `optimiz-rs`.\n",
|
|
"\n",
|
|
"Reference documentation: [graph_spectral.html](https://optimiz-r.readthedocs.io/en/latest/algorithms/graph_spectral.html)\n",
|
|
"\n",
|
|
"We demonstrate the four Python-exposed primitives:\n",
|
|
"\n",
|
|
"1. `combinatorial_laplacian_py`\n",
|
|
"2. `normalised_laplacian_py`\n",
|
|
"3. `random_walk_laplacian_py`\n",
|
|
"4. `spectral_cluster_py`\n",
|
|
"\n",
|
|
"Each is verified against an analytic ground truth."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "3e190cea",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-05-12T09:44:15.206941Z",
|
|
"iopub.status.busy": "2026-05-12T09:44:15.206599Z",
|
|
"iopub.status.idle": "2026-05-12T09:44:16.002530Z",
|
|
"shell.execute_reply": "2026-05-12T09:44:16.000885Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"from optimizr import _core as opt\n",
|
|
"\n",
|
|
"rng = np.random.default_rng(42)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "af83bd65",
|
|
"metadata": {},
|
|
"source": [
|
|
"## 1. Combinatorial Laplacian\n",
|
|
"\n",
|
|
"For a non-negative symmetric weight matrix $W \\in \\mathbb{R}^{n\\times n}$ with degree matrix $D = \\mathrm{diag}(W \\mathbf{1})$:\n",
|
|
"\n",
|
|
"$$\n",
|
|
"L \\;=\\; D - W .\n",
|
|
"$$\n",
|
|
"\n",
|
|
"It is symmetric positive semidefinite and $L \\mathbf{1} = 0$, so the constant vector lies in its kernel."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "c0ae98c1",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-05-12T09:44:16.006248Z",
|
|
"iopub.status.busy": "2026-05-12T09:44:16.005847Z",
|
|
"iopub.status.idle": "2026-05-12T09:44:16.362683Z",
|
|
"shell.execute_reply": "2026-05-12T09:44:16.361515Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"L =\n",
|
|
" [[ 2. -1. -1.]\n",
|
|
" [-1. 2. -1.]\n",
|
|
" [-1. -1. 2.]]\n",
|
|
"|| L @ 1 ||_inf = 0.0\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAE1CAYAAADprispAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8hUlEQVR4nO3de1zUVf4/8NcMyk0cFOWaKKB9BW+YmAqWQpJ4KaUty7ZdkLx0AUuxVFpXTLdltbyVt8wEu7CVplbqD0MUzURJlE1LSRCBiCEvAYLIZeb8/nD5rCO3zyDD5ePr+XicR82Z8/mcM8P4njPncz7nqIQQAkREpFjq1m4AERGZFgM9EZHCMdATESkcAz0RkcIx0BMRKRwDPRGRwjHQExEpHAM9EZHCMdATESkcA30jpk2bBhsbG1llVSoVlixZYtoGmVBycjJUKhWSk5ONPnbJkiVQqVTN36hm4u/vD39/f5Od383NDdOmTTPZ+RuzYsUKeHp6Qq/Xt2i9cXFxUKlUuHTpkpRn6vfaGFVVVXB1dcWGDRtauymtqs0F+qysLLzwwgvw8PCApaUlNBoNRo4cibVr16K8vLy1m9fqNmzYgLi4uNZuRpMZ88VJ8pSUlGD58uVYsGAB1Or//ZOeO3cuhgwZAjs7O1hbW8PLywtLlixBaWlpK7a2ZXXs2BGRkZF46623cPPmzdZuTqvp0NoNuN3evXsxZcoUWFhYICQkBAMGDEBlZSWOHj2K119/HT/99BM2b97c2s2sV3l5OTp0MO1bumHDBnTv3t0kvcdRo0ahvLwc5ubmzX5upcvIyDAIsi1p69atqK6uxrPPPmuQ/8MPP+Dhhx9GWFgYLC0tcfr0afzrX//CgQMHcOTIEZO199tvvzXJeZsqLCwMCxcuRHx8PJ5//vnWbk6raDOBPjs7G1OnTkWvXr1w8OBBODs7S8+Fh4cjMzMTe/fubcUWNs7S0rK1m9AkN2/ehLm5OdRqdbt9Da3NwsKi1eqOjY3FpEmTav3tjh49Wqts79698dprryE1NRUjRowwSXvaWkehS5cuGDt2LOLi4u7ZQN9mhm5WrFiB0tJSfPjhhwZBvkafPn3w6quvSo+rq6uxbNky9O7dGxYWFnBzc8Mbb7yBiooKg+Pc3Nzw2GOPITk5GUOHDoWVlRUGDhwojUPv3LkTAwcOhKWlJXx8fHD69Ok623fx4kUEBQWhU6dOcHFxwdKlS3Hnwp93jtHXjFtnZmZi2rRp6NKlC2xtbREWFoYbN24YHBsbG4tHHnkEDg4OsLCwQL9+/bBx48Zar+Wnn37C4cOHoVKpoFKpDMZCL168iClTpkg/1UeMGFHry7FmHP6zzz7DokWLcN9998Ha2holJSV1jtF/9913mDJlCnr27AkLCwu4urpi7ty5Jh1Gy8nJwcsvv4y+ffvCysoK3bp1w5QpUwzGgYH/jQ8fOXIEL7zwArp16waNRoOQkBD88ccfDdZRWVmJxYsXw8fHB7a2tujUqRMefvhhHDp0qFZZvV6PtWvXSp8Te3t7jBs3DidPnpTK3DlGf+3aNbz22msYOHAgbGxsoNFoMH78ePznP/8xOHfNe/7FF1/grbfeQo8ePWBpaYkxY8YgMzOz0fcqOzsbP/74IwIDAxstW9NOACgqKpJV/vz583j66adhb28PKysr9O3bF3/7298aPKauMfpff/0VwcHB6NSpExwcHDB37lzs37+/1uetvmsddZ2zoqIC0dHR6NOnj/TZnD9/fq0YAACPPvoojh49imvXrsl63UrTZnr033zzDTw8PODn5yer/IwZM7Bt2zY89dRTmDdvHk6cOIGYmBicO3cOu3btMiibmZmJP//5z3jhhRfwl7/8Be+88w4ef/xxbNq0CW+88QZefvllAEBMTAyefvrpWj/DdTodxo0bhxEjRmDFihVISEhAdHQ0qqursXTp0kbb+vTTT8Pd3R0xMTE4deoUtmzZAgcHByxfvlwqs3HjRvTv3x+TJk1Chw4d8M033+Dll1+GXq9HeHg4AGDNmjWYPXs2bGxspH9sjo6OAIDCwkL4+fnhxo0beOWVV9CtWzds27YNkyZNwo4dO/DEE08YtGnZsmUwNzfHa6+9hoqKinp7Ydu3b8eNGzfw0ksvoVu3bkhNTcV7772HX3/9Fdu3b2/0tTfFDz/8gGPHjmHq1Kno0aMHLl26hI0bN8Lf3x8///wzrK2tDcpHRESgS5cuWLJkCTIyMrBx40bk5ORIQbQuJSUl2LJlC5599lnMnDkT169fx4cffoigoCCkpqZi8ODBUtnp06cjLi4O48ePx4wZM1BdXY3vvvsOx48fx9ChQ+s8/8WLF7F7925MmTIF7u7uKCwsxPvvv4/Ro0fj559/houLi0H5f/3rX1Cr1XjttddQXFyMFStW4LnnnsOJEycafK+OHTsGABgyZEidz1dXV6OoqAiVlZU4e/YsFi1ahM6dO2PYsGENnhcAfvzxRzz88MPo2LEjZs2aBTc3N2RlZeGbb77BW2+91ejxNcrLyzFmzBjk5ubilVdegYuLCz7++GMcPHhQ9jnupNfrMWnSJBw9ehSzZs2Cl5cXzpw5g9WrV+OXX37B7t27Dcr7+PhACIFjx47hsccea3K97ZZoA4qLiwUAMXnyZFnl09PTBQAxY8YMg/zXXntNABAHDx6U8nr16iUAiGPHjkl5+/fvFwCElZWVyMnJkfLff/99AUAcOnRIygsNDRUAxOzZs6U8vV4vJk6cKMzNzcXly5elfAAiOjpaehwdHS0AiOeff96gnU888YTo1q2bQd6NGzdqvc6goCDh4eFhkNe/f38xevToWmXnzJkjAIjvvvtOyrt+/bpwd3cXbm5uQqfTCSGEOHTokAAgPDw8atVZ89ztr7+udsXExAiVSmXw3tW81saEhoaKTp06NVimrjpTUlIEAPHRRx9JebGxsQKA8PHxEZWVlVL+ihUrBADx1VdfSXmjR482eN+qq6tFRUWFQR1//PGHcHR0NPh7HTx4UAAQr7zySq026fV66f979eolQkNDpcc3b96U3vMa2dnZwsLCQixdulTKq3nPvby8DNqzdu1aAUCcOXOmVr23W7RokQAgrl+/XufzNe9bTerbt6/B37cho0aNEp07dzb4Owth+Lpr/gbZ2dlS3p3v9Zo1awQA8cUXX0h5ZWVlok+fPrU+b3e+j/Wd8+OPPxZqtdrg8y6EEJs2bRIAxPfff2+Q/9tvvwkAYvny5TJeufK0iaGbkpISAEDnzp1lld+3bx8AIDIy0iB/3rx5AFBruKJfv37w9fWVHg8fPhwA8Mgjj6Bnz5618i9evFirzoiICOn/VSoVIiIiUFlZiQMHDjTa3hdffNHg8cMPP4yrV69KrxsArKyspP8vLi7GlStXMHr0aFy8eBHFxcWN1rFv3z4MGzYMDz30kJRnY2ODWbNm4dKlS/j5558NyoeGhhrUWZ/by5SVleHKlSvw8/ODEKLeYa67dXudVVVVuHr1Kvr06YMuXbrg1KlTtcrPmjULHTt2lB6/9NJL6NChg/Q5qYuZmZn0K0av1+PatWuorq7G0KFDDer48ssvoVKpEB0dXescDU0ntbCwkH4V6nQ6XL16FTY2Nujbt2+dryEsLMzgV9XDDz8MoO7P4u2uXr2KDh061DuTqV+/fkhMTMTu3bsxf/58dOrUSdasm8uXL+PIkSN4/vnnDf6NAA2/7rrs27cPzs7OeOqpp6Q8a2trzJo1y6jz3G779u3w8vKCp6cnrly5IqVHHnkEAGoNwXXt2hUAcOXKlSbX2Z61iaEbjUYDALh+/bqs8jk5OVCr1ejTp49BvpOTE7p06YKcnByD/Ds/qLa2tgAAV1fXOvPvHN9Vq9Xw8PAwyPu///s/AKg1blyXO+uv+dD98ccf0mv//vvvER0djZSUlFrj98XFxVLb6pOTkyN9Ud3Oy8tLen7AgAFSvru7e6PtBoDc3FwsXrwYX3/9da33Rc4XUFOUl5cjJiYGsbGxyM/PN7gWUled999/v8FjGxsbODs7N/q32bZtG1auXInz58+jqqpKyr/9vcnKyoKLiwvs7OyMeg014/obNmxAdnY2dDqd9Fy3bt1qlW/oM3I3NBqNNH4/efJkxMfHY/LkyTh16hS8vb1RWVlZa9za3t5e+oK5/TPTVDk5OejTp0+tL4i+ffs2+ZwXLlzAuXPnYG9vX+fzv//+u8Hjms9QW77Xw5TaTKB3cXHB2bNnjTpO7h/NzMzMqHzRzLsrNlZPVlYWxowZA09PT6xatQqurq4wNzfHvn37sHr1apPcBCOnN6/T6fDoo4/i2rVrWLBgATw9PdGpUyfk5+dj2rRpJrs5Z/bs2YiNjcWcOXPg6+sLW1tbqFQqTJ06tdnq/OSTTzBt2jQEBwfj9ddfh4ODA8zMzBATE4OsrKy7Pv8///lP/P3vf8fzzz+PZcuWwc7ODmq1GnPmzKnzNTT1s9itWzdUV1fj+vXrsn4R/+lPf8Jf//pXfPbZZ/D29saxY8cQEBBgUCY7O7vR85hKff+mdTqdwXuk1+sxcOBArFq1qs7yd3biar4wu3fv3kwtbV/aRKAHgMceewybN29GSkqKwTBLXXr16gW9Xo8LFy5IPVbg1gXJoqIi9OrVq1nbptfrcfHiRakXDwC//PILgP/NYrgb33zzDSoqKvD1118b9OzqmgFS3z+EXr16ISMjo1b++fPnpeeNdebMGfzyyy/Ytm0bQkJCpPzExESjz2WMHTt2IDQ0FCtXrpTybt68We9MkQsXLhgEq9LSUhQUFGDChAkN1uHh4YGdO3cavKd3DtH07t0b+/fvx7Vr14zq1e/YsQMBAQH48MMPDfKLioqaNdh4enoCuBWcBw0a1Gj5iooK6PV66ZeRt7d3rb+nk5MTOnXqBABGd77q0qtXL5w9exZCCIP3uq7Pa9euXev8O+fk5Bj8qu7duzf+85//YMyYMbI6fDVfXrfHi3tJmxijByCNH86YMQOFhYW1ns/KysLatWsBQPoHvGbNGoMyNd/uEydObPb2rVu3Tvp/IQTWrVuHjh07YsyYMXd97pqeyp1DFLGxsbXKdurUqc5/CBMmTEBqaipSUlKkvLKyMmzevBlubm7o169fs7RLCCH9HUzFzMysVk/2vffeMxj+uN3mzZsNhl42btyI6upqjB8/vsE6AMPXduLECYP3DwCefPJJCCHw5ptv1jpHQ73tul7D9u3bkZ+fX+8xTVHTKbp9qidw6wvl9vekxpYtWwBAmi3UtWtXBAYGGqSaKaSjRo3C1q1bkZuba3AOY3/xTpgwAb/99ht27Ngh5d24caPOmx979+6N48ePo7KyUsrbs2cP8vLyDMo9/fTTyM/PxwcffFDrHOXl5SgrKzPIS0tLg0qlarQTqVRtpkffu3dvxMfH45lnnoGXl5fBnbHHjh3D9u3bpfm13t7eCA0NxebNm1FUVITRo0cjNTUV27ZtQ3BwcK2fonfL0tISCQkJCA0NxfDhw/H//t//w969e/HGG2/UO0ZojLFjx8Lc3ByPP/44XnjhBZSWluKDDz6Ag4MDCgoKDMr6+Phg48aN+Mc//oE+ffrAwcEBjzzyCBYuXIh///vfGD9+PF555RXY2dlh27ZtyM7OxpdfftmkuyA9PT2lG2zy8/Oh0Wjw5Zdf3vW4cVVVFf7xj3/Uyrezs8PLL7+Mxx57DB9//DFsbW3Rr18/pKSk4MCBA3WObQO35sSPGTNGmhq7YcMGPPTQQ5g0aVK9bXjsscewc+dOPPHEE5g4cSKys7OxadMm9OvXz+BiZUBAAP7617/i3XffxYULFzBu3Djo9Xp89913CAgIMLhIf+f5ly5dirCwMPj5+eHMmTP49NNPa13ruVseHh4YMGAADhw4YHAzUHJyMl555RU89dRTuP/++1FZWYnvvvsOO3fuxNChQ/GXv/yl0XO/++67eOihhzBkyBDMmjUL7u7uuHTpEvbu3Yv09HTZbZw5cybWrVuHkJAQpKWlwdnZGR9//HGtabLArWnTO3bswLhx4/D0008jKysLn3zyCXr37m1Q7q9//Su++OILvPjiizh06BBGjhwJnU6H8+fP44svvsD+/fsNpr4mJiZi5MiR9X6GFK/F5/k04pdffhEzZ84Ubm5uwtzcXHTu3FmMHDlSvPfee+LmzZtSuaqqKvHmm28Kd3d30bFjR+Hq6iqioqIMyghxa7rWxIkTa9UDQISHhxvkZWdnCwDi7bfflvJqpgNmZWWJsWPHCmtra+Ho6Ciio6NrTZ9DPdMrb5+CKUTdU9K+/vprMWjQIGFpaSnc3NzE8uXLxdatW2uV02q1YuLEiaJz584CgMGUs6ysLPHUU0+JLl26CEtLSzFs2DCxZ88eg7prpvNt37691ntS1/TKn3/+WQQGBgobGxvRvXt3MXPmTPGf//xHABCxsbG1Xmtjaqar1pV69+4thLg1zTEsLEx0795d2NjYiKCgIHH+/PlaU+9q3sfDhw+LWbNmia5duwobGxvx3HPPiatXrxrUe+f0PL1eL/75z3+KXr16CQsLC/HAAw+IPXv2iNDQUNGrVy+DY6urq8Xbb78tPD09hbm5ubC3txfjx48XaWlpUpm6plfOmzdPODs7CysrKzFy5EiRkpJSqx31/T1qPou3v8f1WbVqlbCxsTGYlpqZmSlCQkKEh4eHsLKyEpaWlqJ///4iOjpalJaWNnrOGmfPnhVPPPGE9Jnq27ev+Pvf/y49L2d6pRBC5OTkiEmTJglra2vRvXt38eqrr4qEhIRanzchhFi5cqW47777hIWFhRg5cqQ4efJkneesrKwUy5cvF/379xcWFhaia9euwsfHR7z55puiuLhYKldUVCTMzc3Fli1bZL9upWlzgZ5Irpog88MPP7R2U1pVUVGRsLOza3eBrK6OhSmsXr1aODs713l/xr2izYzRE1HT2NraYv78+Xj77bdbfJnitq6qqgqrVq3CokWLZM00U6o2M0ZPRE23YMECLFiwoLWb0eZ07Nix1sXkexF79ERECmeyQH/t2jU899xz0Gg06NKlC6ZPn97ordf+/v7Sqow16c7lA4hqTJs2DUKIehcWo7bN398fQog2sxtVU8TExODBBx9E586d4eDggODg4DrvD7jT9u3b4enpCUtLSwwcOLDB5Tqag8kC/XPPPYeffvoJiYmJ2LNnD44cOSJrbYuZM2eioKBASitWrDBVE4mI7srhw4cRHh6O48ePIzExEVVVVRg7dmytefy3O3bsGJ599llMnz4dp0+fRnBwMIKDg5vl5rT6qIRo5vv9AZw7dw79+vXDDz/8IPW2EhISMGHCBPz666+1lmit4e/vj8GDB9e6EaohFRUVButP1yxQ1a1bt3t2XQsipRBC4Pr163BxcWnyjlg3b940uAFLTp13xg4LCwtZm8tcvnwZDg4OOHz4MEaNGlVnmWeeeQZlZWXYs2ePlDdixAgMHjwYmzZtkt1Oo5hiKs+HH34ounTpYpBXVVUlzMzMxM6dO+s9bvTo0aJ79+6iW7duon///mLhwoWirKyswbpq5m8zMTEpN+Xl5TUpFpWXlwtrmBlVl42NTa282++PaciFCxcE0PDy0q6urmL16tUGeYsXLxaDBg1q0muUwySzbrRaLRwcHAzyOnToADs7O2i12nqP+/Of/4xevXrBxcUFP/74IxYsWICMjAzs3Lmz3mOioqIMlisuLi5Gz5498RzugzmvNTdZh4/+3dpNIEJleRm2vRAkewnzWsdXVuIGdAiRGQ8qocdHpfnIy8uTVpYF5G0VqdfrMWfOHIwcObLBVT+1Wq20YVANR0fHBmPj3TIq0C9cuNBgV6S6nDt3rsmNuX0Mf+DAgXB2dsaYMWOQlZVV6xboGvX9pDKHmoH+LnSwrnt9c6LWcLfDsFYqM5irGo8HZkIFiFsr6t4e6OUIDw/H2bNn69yrt7UZFejnzZtX536Ot/Pw8ICTk1Ot9aCrq6tx7do1ODk5ya6vZn31zMzMegM9EVFj1CrATMZ3hRq4NVhjpIiICGnSSY8ePRos6+TkVGvhxsLCQqNio7GMCvT29vayFvHy9fVFUVER0tLS4OPjAwA4ePAg9Hp9nZtj1Kdm4aS6NgsnIpLLTKWCmYxfBWYw7peDEAKzZ8/Grl27kJycLGtDH19fXyQlJWHOnDlSXmJioklX1jTJ2IaXlxfGjRuHmTNnIjU1Fd9//z0iIiIwdepUacZNfn4+PD09kZqaCuDWMsTLli1DWloaLl26hK+//hohISEYNWqUrHW2iYjqY6aSn4wRHh6OTz75BPHx8ejcuTO0Wi20Wi3Ky8ulMiEhIYiKipIev/rqq0hISJB2N1uyZAlOnjxZ70qozcFkg9iffvopPD09MWbMGEyYMAEPPfSQwfrTVVVVyMjIkLbNMzc3x4EDBzB27Fh4enpi3rx5ePLJJ/HNN9+YqolEdI+o6dHLScbYuHEjiouL4e/vD2dnZyl9/vnnUpnc3FyD5cb9/PwQHx+PzZs3w9vbGzt27MDu3bubZdvG+phkHn1rKikpga2tLcLgyouxd6HDjq9auwlEqLxRig9CHkJxcbHRF0eB/8WD183dYCHjYmyF0OPtyktNrq+t4qJmRKR4phqjby8Y6IlI8VSQN06tzDDPQE9E9wD26ImIFE7ujBoz0zelVTDQE5Hi3Qr0cnr0ysRAT0SKxx49EZHCcYyeiEjhjFrrRoEY6IlI8dijJyJSOHM1YC4jhusUtU7A/zDQE5HisUdPRKRwZpA564Y9eiKi9kkts0evvsudrNoqBnoiUjzZ8+iVGecZ6IlI+WSP0bNHT0TUPrFHT0SkcOzRExEpnFqlknWhlRdjiYjaKZWZCip140FcpdBAr9SlHYiIJGozlexkrCNHjuDxxx+Hi4sLVCoVdu/e3WD55ORkqFSqWkmr1Tbx1TWOPXoiUj4zNVRqGf1alfF3TJWVlcHb2xvPP/88/vSnP8k+LiMjw2ADcgcHB6PrlouBnogUT6VWQSWjt65qwhII48ePx/jx440+zsHBAV26dDH6uKbg0A0RKZ6xQzclJSUGqaKiotnbNHjwYDg7O+PRRx/F999/3+znvx0DPREpnkqtlp0AwNXVFba2tlKKiYlptrY4Oztj06ZN+PLLL/Hll1/C1dUV/v7+OHXqVLPVcScO3RCR4sm90Kr+79BNXl6ewfi5hYVFs7Wlb9++6Nu3r/TYz88PWVlZWL16NT7++ONmq+d2DPREpHgqM+PG6DUajUGgN7Vhw4bh6NGjJjs/Az0RKd6tQN/4SLUK+hZoTW3p6elwdnY22fkZ6IlI8YwdujFGaWkpMjMzpcfZ2dlIT0+HnZ0devbsiaioKOTn5+Ojjz4CAKxZswbu7u7o378/bt68iS1btuDgwYP49ttvja5bLgZ6IlI8lUrmnbF64wP9yZMnERAQID2OjIwEAISGhiIuLg4FBQXIzc2Vnq+srMS8efOQn58Pa2trDBo0CAcOHDA4R3Mz+ayb9evXw83NDZaWlhg+fDhSU1MbLL99+3Z4enrC0tISAwcOxL59+0zdRCJSODNzM9nJWP7+/hBC1EpxcXEAgLi4OCQnJ0vl58+fj8zMTJSXl+Pq1as4dOiQSYM8YOJA//nnnyMyMhLR0dE4deoUvL29ERQUhN9//73O8seOHcOzzz6L6dOn4/Tp0wgODkZwcDDOnj1rymYSkcLVXIyVk5TIpIF+1apVmDlzJsLCwtCvXz9s2rQJ1tbW2Lp1a53l165di3HjxuH111+Hl5cXli1bhiFDhmDdunWmbCYRKZzaTC07KZHJXlVlZSXS0tIQGBj4v8rUagQGBiIlJaXOY1JSUgzKA0BQUFC95QGgoqKi1l1sREQG5Pbm2aM3zpUrV6DT6eDo6GiQ7+joWO8qbVqt1qjyABATE2NwB5urq+vdN56IFEWtUkGtlpG4THHbFBUVheLiYinl5eW1dpOIqI1RmallJyUy2fTK7t27w8zMDIWFhQb5hYWFcHJyqvMYJycno8oDt25Nbs7bk4lIeWTPo2/C9Mr2wGRfX+bm5vDx8UFSUpKUp9frkZSUBF9f3zqP8fX1NSgPAImJifWWJyKS416fdWPSG6YiIyMRGhqKoUOHYtiwYVizZg3KysoQFhYGAAgJCcF9990nrQz36quvYvTo0Vi5ciUmTpyIzz77DCdPnsTmzZtN2UwiUji5wzIqPYdujPbMM8/g8uXLWLx4MbRaLQYPHoyEhATpgmtubi7Ut+364ufnh/j4eCxatAhvvPEG7r//fuzevRsDBgwwZTOJSOHUZpA5dNMCjWkFJl8CISIiAhEREXU+d/vdYjWmTJmCKVOmmLhVRHQvUallLoEgo0x7xLVuiEjx1Gp5N0OpdRy6ISJql2SvR8+LsURE7ZPsi7GcR09E1D7dvh9sY+WUiIGeiBRP7oJlSl3UjIGeiJRP7vIGDPRERO2TSi1zjJ5DN0RE7RPH6ImIFO7WrJvGtwlUmelaoDUtj4GeiBTvXp9eqcxXRUR0G7OOHWQnYx05cgSPP/44XFxcoFKpsHv37kaPSU5OxpAhQ2BhYYE+ffpIG4mbCgM9ESmeKTceKSsrg7e3N9avXy+rfHZ2NiZOnIiAgACkp6djzpw5mDFjBvbv32903XJx6IaIFE+lknkxVnWrzJ17Tze0wdH48eMxfvx42W3ZtGkT3N3dsXLlSgCAl5cXjh49itWrVyMoKEj2eYzBHj0RKZ6xPXpXV1eDvahr9sxoDikpKQgMDDTICwoKQkpKSrPVcSf26IlI8Yy9GJuXlweNRiPlN+d2pVqtVtqTo4ajoyNKSkpQXl4OKyurZqurBgM9ESmesUsgaDQag0Df3jHQE5Hi3dp4RM4NU6ZfptjJyQmFhYUGeYWFhdBoNCbpzQMM9ER0D2hL8+h9fX2xb98+g7zExET4+vqarE5ejCUixTPl9MrS0lKkp6cjPT0dwK3pk+np6cjNzQUAREVFISQkRCr/4osv4uLFi5g/fz7Onz+PDRs24IsvvsDcuXOb5bXWhT16IlI8Y6dXGuPkyZMICAiQHkdGRgIAQkNDERcXh4KCAinoA4C7uzv27t2LuXPnYu3atejRowe2bNlisqmVAAM9Ed0DVGZmUMta66bxMnfy9/eHEKLe5+u669Xf3x+nT582uq6mYqAnIsVrS2P0rYGBnogUj4GeiEjhuB49EZHCsUdPRKRwKrVK5laCpr9hqjUw0BOR4nHohohI4VRqM6jUMqZXyijTHjHQE5Hyqc1uJTnlFIiBnoiUT62+leSUUyCTv6r169fDzc0NlpaWGD58OFJTU+stGxcXB5VKZZAsLS1N3UQiUjhVR3PZSYlMGug///xzREZGIjo6GqdOnYK3tzeCgoLw+++/13uMRqNBQUGBlHJyckzZRCK6F6jV/xu+aTCxR2+0VatWYebMmQgLC0O/fv2wadMmWFtbY+vWrfUeo1Kp4OTkJKU7d2IhIjJWzawbOUmJTDZGX1lZibS0NERFRUl5arUagYGBDe6NWFpail69ekGv12PIkCH45z//if79+9dbvqKiAhUVFdLjmk19O3z0b3SwtmmGV3Jvqn5qcms3od3rsOOr1m4C1VDJvBirUubFWJN9fV25cgU6na7OvRG1Wm2dx/Tt2xdbt27FV199hU8++QR6vR5+fn749ddf660nJibGYBNfV1fXZn0dRKQAsoZtZH4ZtENt6neKr68vQkJCMHjwYIwePRo7d+6Evb093n///XqPiYqKQnFxsZTy8vJasMVE1B5w6MZEunfvDjMzszr3RnRycpJ1jo4dO+KBBx5AZmZmvWUsLCyadYd2IlKge3wevcm+vszNzeHj44OkpCQpT6/XIykpSfbeiDqdDmfOnIGzs7OpmklE94J7fNaNSW+YioyMRGhoKIYOHYphw4ZhzZo1KCsrQ1hYGAAgJCQE9913H2JiYgAAS5cuxYgRI9CnTx8UFRXh7bffRk5ODmbMmGHKZhKRwqnMzGTtHtWUHabaA5MG+meeeQaXL1/G4sWLodVqMXjwYCQkJEgXaHNzc6G+7Rv0jz/+wMyZM6HVatG1a1f4+Pjg2LFj6NevnymbSURKxztjTSsiIgI5OTmoqKjAiRMnMHz4cOm55ORkg/0UV69eLZXVarXYu3cvHnjgAVM3kYiUzsSzbtr6CgDK/PoiIrpNzeqVcpKx2sMKAAz0RKR8KvX/hm8aSirjQ2J7WAGAgZ6IFM/YHn1JSYlBuv3u+9vVrAAQGBgo5RmzAoCrqysmT56Mn376qXlf8B0Y6IlI+YycXunq6mpwx33NzMA7tdQKAHeL69ETkfIZOesmLy8PGo1Gym7OmzJ9fX0N7iXy8/ODl5cX3n//fSxbtqzZ6rkdAz0RKZ6x8+g1Go1BoK9PS60AcLc4dENEymei6ZXtZQUA9uiJSPlMuNZNe1gBgIGeiBRP7sqUTVm9sj2sAMBAT0TKp+4AmHWUV64JIiIiEBERUedzycnJBo9Xr16N1atXN6mepmKgJyLlU8m8GaoJN0y1Bwz0RKR4QqWGkBHE5ZRpjxjoiUj52KMnIlI4lepWklNOgRjoiUj57vH16BnoiUjxOEZPRKR0HKMnIlI4BnoiIoVjoCciUjahUskco+esGyKi9ok9eiIiheM8eiIihWOPnohI2TiPnohI6VQy74xloCciaqc4dENEpHAM9ERECsdAT0SkbLxhiohI6dRmt5Kccgpk0t8pR44cweOPPw4XFxeoVCrs3r270WOSk5MxZMgQWFhYoE+fPoiLizNlE4noXlAzdCMnNcH69evh5uYGS0tLDB8+HKmpqQ2W3759Ozw9PWFpaYmBAwdi3759TapXLpMG+rKyMnh7e2P9+vWyymdnZ2PixIkICAhAeno65syZgxkzZmD//v2mbCYRKVzNPHo5yViff/45IiMjER0djVOnTsHb2xtBQUH4/fff6yx/7NgxPPvss5g+fTpOnz6N4OBgBAcH4+zZs3f7MuulEkIIk5399opUKuzatQvBwcH1llmwYAH27t1r8IKnTp2KoqIiJCQk1HlMRUUFKioqpMclJSVwdXXFzI+Owtzaptnaf6+pfmpyazeh3euw46vWbkK7V3mjFB+EPITi4mJoNBqjjy8pKYGtrS0KtVpZx5eUlMDRyQl5eXkG5S0sLGBhYVHnMcOHD8eDDz6IdevWAQD0ej1cXV0xe/ZsLFy4sFb5Z555BmVlZdizZ4+UN2LECAwePBibNm0y9iXK0qYuMaekpCAwMNAgLygoCCkpKfUeExMTA1tbWym5urqauplE1M7cuhgrLwGAq6urQVyJiYmp87yVlZVIS0sziFtqtRqBgYH1xq2mxLm71aYuxmq1Wjg6OhrkOTo6oqSkBOXl5bCysqp1TFRUFCIjI6XHNT16IqIaQtxKcsoBqLNHX5crV65Ap9PVGbfOnz9f5zH1xTmtVtt4A5uoTQX6pmjoJxUREQDohYBeRqSvKaPRaJo0VNRWtalA7+TkhMLCQoO8wsJCaDSaOnvzRERyiP8mOeWM0b17d5iZmdUZt5ycnOo8pr44V1/55tCmxuh9fX2RlJRkkJeYmAhfX99WahERKYFeyE/GMDc3h4+Pj0Hc0uv1SEpKqjdutUacM2mgLy0tRXp6OtLT0wHcmj6Znp6O3NxcALfG10NCQqTyL774Ii5evIj58+fj/Pnz2LBhA7744gvMnTvXlM0kIoUTQshOxoqMjMQHH3yAbdu24dy5c3jppZdQVlaGsLAwAEBISAiioqKk8q+++ioSEhKwcuVKnD9/HkuWLMHJkycRERHRbK/3TiYdujl58iQCAgKkxzUXTUNDQxEXF4eCggIp6AOAu7s79u7di7lz52Lt2rXo0aMHtmzZgqCgIFM2k4gUTm5v3dgePXBruuTly5exePFiaLVaDB48GAkJCdIF19zcXKhvWyLZz88P8fHxWLRoEd544w3cf//92L17NwYMGGB85TK12Dz6llIzb5bz6O8O59HfPc6jv3vNNY8++9cCdJZx/PWSErj3cG5yfW1Vm7oYS0RkCqbs0bcHDPREpHhyx98VNsAhYaAnIsXT/zfJKadEDPREpHjG3hmrNAz0RKR4HKMnIlI4jtETESkcx+iJiBROQOYYvclb0joY6IlI8YxdvVJpGOiJSPF04laSU06JGOiJSPlkTq9U6tgNAz0RKZ4eAnoZUVxOmfaIgZ6IFI83TBERKRxvmCIiUjj26ImIFI5j9ERECscePRGRwvGGKSIihdPpbyU55ZRI3XgRIqL2raZHLyeZ0rVr1/Dcc89Bo9GgS5cumD59OkpLSxs8xt/fHyqVyiC9+OKLRtXLHj0RKZ5eCOjawNDNc889h4KCAiQmJqKqqgphYWGYNWsW4uPjGzxu5syZWLp0qfTY2traqHoZ6IlI8W7No5cT6E3XhnPnziEhIQE//PADhg4dCgB47733MGHCBLzzzjtwcXGp91hra2s4OTk1uW4O3RCR4tWM0ctJAFBSUmKQKioq7roNKSkp6NKlixTkASAwMBBqtRonTpxo8NhPP/0U3bt3x4ABAxAVFYUbN24YVTd79ESkeMbOunF1dTXIj46OxpIlS+6qDVqtFg4ODgZ5HTp0gJ2dHbRabb3H/fnPf0avXr3g4uKCH3/8EQsWLEBGRgZ27twpu24GeiJSPJ3MMfqaMnl5edBoNFK+hYVFvccsXLgQy5cvb/C8586dk9nS2mbNmiX9/8CBA+Hs7IwxY8YgKysLvXv3lnUOBnoiUjw9ZK5189//ajQag0DfkHnz5mHatGkNlvHw8ICTkxN+//13g/zq6mpcu3bNqPH34cOHAwAyMzMZ6ImIauj0AjoZkV5OmTvZ29vD3t6+0XK+vr4oKipCWloafHx8AAAHDx6EXq+Xgrcc6enpAABnZ2fZx/BiLBEpnpA5h16YcHqll5cXxo0bh5kzZyI1NRXff/89IiIiMHXqVGnGTX5+Pjw9PZGamgoAyMrKwrJly5CWloZLly7h66+/RkhICEaNGoVBgwbJrps9eiJSvLayleCnn36KiIgIjBkzBmq1Gk8++STeffdd6fmqqipkZGRIs2rMzc1x4MABrFmzBmVlZXB1dcWTTz6JRYsWGVWvSQP9kSNH8PbbbyMtLQ0FBQXYtWsXgoOD6y2fnJyMgICAWvkFBQV3NYeUiO5tVTo9qmSsbyCnzN2ws7Nr8OYoNzc3g18Vrq6uOHz48F3Xa9Khm7KyMnh7e2P9+vVGHZeRkYGCggIp3TkliYjIGG1lCYTWYtIe/fjx4zF+/Hijj3NwcECXLl2av0FEdE9qK0M3raVNXowdPHgwnJ2d8eijj+L7779vsGxFRUWtu9iIiG7HHn0b4uzsjE2bNmHo0KGoqKjAli1b4O/vjxMnTmDIkCF1HhMTE4M333yzhVuqfB12fNXaTWj3qp+a3NpNaPeq0Txj5nq9gF7G1Ek5ZdqjNhXo+/bti759+0qP/fz8kJWVhdWrV+Pjjz+u85ioqChERkZKj0tKSmrdvkxE9za9zKEbhcb5thXo6zJs2DAcPXq03uctLCwavD2ZiIg7TLVx6enpRt0BRkR0J2PXulEakwb60tJSZGZmSo+zs7ORnp4OOzs79OzZE1FRUcjPz8dHH30EAFizZg3c3d3Rv39/3Lx5E1u2bMHBgwfx7bffmrKZRKRwHKM3oZMnTxrcAFUzlh4aGoq4uDgUFBQgNzdXer6yshLz5s1Dfn4+rK2tMWjQIBw4cKDOm6iIiOTSQeb0SpO3pHWYNND7+/s3uHZEXFycweP58+dj/vz5pmwSEd2DOEZPRKRwHKMnIlI4vcxlijlGT0TUTplyPfr2gIGeiBSPgZ6ISOF0enlB3MSrFLcaBnoiUjz26ImIFI6BnohI4TjrhohI4XRCZo+e8+iJiNqnymo9VNWNX2mtlFGmPWqTO0wRETWnar2QnUzprbfegp+fH6ytrWVvlyqEwOLFi+Hs7AwrKysEBgbiwoULRtXLQE9EildzMVZOMqXKykpMmTIFL730kuxjVqxYgXfffRebNm3CiRMn0KlTJwQFBeHmzZuyz8GhGyJSPGMvxt6593RzbXBUs+3pnQs61kcIgTVr1mDRokWYPPnW1pQfffQRHB0dsXv3bkydOlXWedijJyLFq1nUTE4CAFdXV9ja2kopJiamVdqdnZ0NrVaLwMBAKc/W1hbDhw9HSkqK7POwR09EimfsPPq8vDxoNBopv7W2K9VqtQAAR0dHg3xHR0fpOTnYoycixTN2jF6j0RikhgL9woULoVKpGkznz59vqZdaJ/boiUjxTHln7Lx58zBt2rQGy3h4eBh9XgBwcnICABQWFhrsnV1YWIjBgwfLPg8DPREpnk7oodM3PkdeJ4yfR29vbw97e/umNKtR7u7ucHJyQlJSkhTYS0pKcOLECaNm7nDohogUTy9z2MbUSyDk5uYiPT0dubm50Ol0SE9PR3p6OkpLS6Uynp6e2LVrFwBApVJhzpw5+Mc//oGvv/4aZ86cQUhICFxcXBAcHCy7XvboiUjxdHoBdRtY1Gzx4sXYtm2b9PiBBx4AABw6dAj+/v4AgIyMDBQXF0tl5s+fj7KyMsyaNQtFRUV46KGHkJCQAEtLS9n1MtATkeJV6wGVjCBu6hUQ4uLiGp1DL+5Yb0elUmHp0qVYunRpk+tloCcixWsrPfrWwkBPRIrHQE9EpHAM9ERECseNR4iIFE6nF7IuxrJHT0TUTgkhIGQE8TtnvCgFAz0RKZ5e5s1QHLohImqnhBCyeuvs0RMRtVM6mXvG6rhnrPFiYmLw4IMPonPnznBwcEBwcDAyMjIaPW779u3w9PSEpaUlBg4ciH379pmymUSkcEIvPymRSQP94cOHER4ejuPHjyMxMRFVVVUYO3YsysrK6j3m2LFjePbZZzF9+nScPn0awcHBCA4OxtmzZ03ZVCJSsJqhGzlJiUw6dJOQkGDwOC4uDg4ODkhLS8OoUaPqPGbt2rUYN24cXn/9dQDAsmXLkJiYiHXr1mHTpk2mbC4RKdS9fjG2RZcprlmRzc7Ort4yKSkpBvsjAkBQUFC9+yNWVFSgpKTEIBER3U7oheykRC0W6PV6PebMmYORI0diwIAB9ZbTarVG7Y8YExNjsImvq6trs7abiBRAbpBnoL874eHhOHv2LD777LNmPW9UVBSKi4ullJeX16znJ6L2Ty+E7KRELTK9MiIiAnv27MGRI0fQo0ePBss6OTmhsLDQIK+wsFDaO/FOFhYWrbZDOxG1D/f6nbEm7dELIRAREYFdu3bh4MGDcHd3b/QYX19fJCUlGeQlJibC19fXVM0kIoW718foTdqjDw8PR3x8PL766it07txZGme3tbWFlZUVACAkJAT33XcfYmJiAACvvvoqRo8ejZUrV2LixIn47LPPcPLkSWzevNmUTSUiBdPL3GFKxv7h7ZJJe/QbN25EcXEx/P394ezsLKXPP/9cKpObm4uCggLpsZ+fH+Lj47F582Z4e3tjx44d2L17d4MXcImIGsJ59CYk501LTk6ulTdlyhRMmTLFBC0ionuR3LteTX1n7FtvvYW9e/ciPT0d5ubmKCoqavSYadOmGWwoDtyacn7nfUoN4Vo3RKR4epnr0Zv6hqnKykpMmTIFvr6++PDDD2UfN27cOMTGxkqPjZ2AwkBPRIon90KrqS/GvvnmmwBurRJgDAsLi3pnHsrRonfGEhG1BmNn3dx5t31FRUWrtj85ORkODg7o27cvXnrpJVy9etWo4xnoiUjxjL1hytXV1eCO+5pZga1h3Lhx+Oijj5CUlITly5fj8OHDGD9+PHQ6nexzcOiGiBTP2KGbvLw8aDQaKb+hMfGFCxdi+fLlDZ733Llz8PT0lNlaQ1OnTpX+f+DAgRg0aBB69+6N5ORkjBkzRtY5GOiJSPGMvTNWo9EYBPqGzJs3D9OmTWuwjIeHh6xzyeHh4YHu3bsjMzOTgZ6IqIaQuUxxUy7G2tvbw97evinNapJff/0VV69ehbOzs+xjOEZPRIrXVm6Yys3NRXp6OnJzc6HT6ZCeno709HSUlpZKZTw9PbFr1y4AQGlpKV5//XUcP34cly5dQlJSEiZPnow+ffogKChIdr3s0ROR4rWV6ZWLFy82uPnpgQceAAAcOnQI/v7+AICMjAxp7w4zMzP8+OOP2LZtG4qKiuDi4oKxY8di2bJlRs2lZ6AnIsXTVVdDqKsbLaevbrzM3YiLi2t0Dv3tvyqsrKywf//+u66XgZ6IFE/odRD6xqcjyinTHjHQE5HiCb1eZqBX5vKVDPREpHhCp4OQcYORnDLtEQM9ESmeEDKHbgQDPRFRu8QxeiIihWOgJyJSOAZ6IiKF46wbIiKF0+t1gIxAr2ePnoiofeLQDRGRwjHQExEpnU4HoZYRxHnDFBFR+ySEvDF63jBFRNROCb1eXqDnrBsiovZJyJx1wzF6IqJ26laPvvHeOnv0RETtFHv0REQKx0BPRKRwer0OKgZ6IiLl0ldXQSVUjZYTuqoWaE3LU5vy5DExMXjwwQfRuXNnODg4IDg4GBkZGQ0eExcXB5VKZZAsLS1N2UwiUriaO2PlJFO5dOkSpk+fDnd3d1hZWaF3796Ijo5GZWVlg8fdvHkT4eHh6NatG2xsbPDkk0+isLDQqLpNGugPHz6M8PBwHD9+HImJiaiqqsLYsWNRVlbW4HEajQYFBQVSysnJMWUziUjh2kKgP3/+PPR6Pd5//3389NNPWL16NTZt2oQ33nijwePmzp2Lb775Btu3b8fhw4fx22+/4U9/+pNRdZt06CYhIcHgcVxcHBwcHJCWloZRo0bVe5xKpYKTk5OsOioqKlBRUSE9Li4uBgBUljf8ZUJkatVQ5lS9llT53/dQCHFX5xFVN+UF8f8O3ZSUlBhkW1hYwMLC4q7aMG7cOIwbN0567OHhgYyMDGzcuBHvvPNOnccUFxfjww8/RHx8PB555BEAQGxsLLy8vHD8+HGMGDFCXuWiBV24cEEAEGfOnKm3TGxsrDAzMxM9e/YUPXr0EJMmTRJnz56tt3x0dLQAwMTEpOCUl5fXpJhTXl4unJycjKrLxsamVl50dHST6m/M3/72N+Hj41Pv80lJSQKA+OOPPwzye/bsKVatWiW7nha7GKvX6zFnzhyMHDkSAwYMqLdc3759sXXrVgwaNAjFxcV455134Ofnh59++gk9evSoVT4qKgqRkZEG9Vy7dg3dunWDStX4xZfWUFJSAldXV+Tl5UGj0bR2c9olvofNo62/j0IIXL9+HS4uLk063tLSEtnZ2Y2Og99Z552x425783XJzMzEe++9V29vHgC0Wi3Mzc3RpUsXg3xHR0dotVrZdbVYoA8PD8fZs2dx9OjRBsv5+vrC19dXeuzn5wcvLy+8//77WLZsWa3ydf2kuvNNaas0Gk2b/MfVnvA9bB5t+X20tbW9q+MtLS1NOqFj4cKFWL58eYNlzp07B09PT+lxfn4+xo0bhylTpmDmzJkma1uNFgn0ERER2LNnD44cOVJnr7whHTt2xAMPPIDMzEwTtY6IqOnmzZuHadOmNVjGw8ND+v/ffvsNAQEB8PPzw+bNmxs8zsnJCZWVlSgqKjLowBYWFsq+jgmYONALITB79mzs2rULycnJcHd3N/ocOp0OZ86cwYQJE0zQQiKiu2Nvbw97e3tZZfPz8xEQEAAfHx/ExsZCrW544qOPjw86duyIpKQkPPnkkwCAjIwM5ObmGox8NMak0yvDw8PxySefID4+Hp07d4ZWq4VWq0V5eblUJiQkBFFRUdLjpUuX4ttvv8XFixdx6tQp/OUvf0FOTg5mzJhhyqa2KAsLC0RHR5tk3O9ewfewefB9bDn5+fnw9/dHz5498c477+Dy5ctSTLy9jKenJ1JTUwHcGraaPn06IiMjcejQIaSlpSEsLAy+vr7yZ9wAMOmsG9RzVTs2NlYqM3r0aBEaGio9njNnjujZs6cwNzcXjo6OYsKECeLUqVOmbCYRkcnFxsbWGxNrZGdnCwDi0KFDUl55ebl4+eWXRdeuXYW1tbV44oknREFBgVF1q4S4ywmqRETUppl06IaIiFofAz0RkcIx0BMRKRwDPRGRwjHQt7D169fDzc0NlpaWGD58uDSNiuQ5cuQIHn/8cbi4uEClUmH37t2t3aR2pynLh1P7xkDfgj7//HNERkYiOjoap06dgre3N4KCgvD777+3dtPajbKyMnh7e2P9+vWt3ZR2q6nLh1P7xemVLWj48OF48MEHsW7dOgC3FmBzdXXF7NmzsXDhwlZuXfujUqmwa9cuBAcHt3ZT2rXLly/DwcEBhw8fbnD5cGq/2KNvIZWVlUhLS0NgYKCUp1arERgYiJSUlFZsGd3ravZwsLOza+WWkKkw0LeQK1euQKfTwdHR0SDf2OVGiZqT3OXDqX3j5uBE9zC5y4dT+8ZA30K6d+8OMzOzWpv6GrvcKFFzuZvlw6l94dBNCzE3N4ePjw+SkpKkPL1ej6SkJKOWGyW6W0IIREREYNeuXTh48GCTlg+n9oU9+hYUGRmJ0NBQDB06FMOGDcOaNWtQVlaGsLCw1m5au1FaWmqwCU12djbS09NhZ2eHnj17tmLL2o/w8HDEx8fjq6++kpYPB24tiWtlZdXKrSNT4PTKFrZu3Tq8/fbb0Gq1GDx4MN59910MHz68tZvVbiQnJyMgIKBWfmhoKOLi4lq+Qe1QfXspx8bGNrpTErVPDPRERArHMXoiIoVjoCciUjgGeiIihWOgJyJSOAZ6IiKFY6AnIlI4BnoiIoVjoCciUjgGeiIihWOgJyJSOAZ6IiKF+/8WYvTnguM+TAAAAABJRU5ErkJggg==",
|
|
"text/plain": [
|
|
"<Figure size 400x320 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Triangle graph (3-clique).\n",
|
|
"W3 = [\n",
|
|
" [0.0, 1.0, 1.0],\n",
|
|
" [1.0, 0.0, 1.0],\n",
|
|
" [1.0, 1.0, 0.0],\n",
|
|
"]\n",
|
|
"L = np.array(opt.combinatorial_laplacian_py(W3))\n",
|
|
"print('L =\\n', L)\n",
|
|
"\n",
|
|
"# Analytic check: L @ 1 = 0.\n",
|
|
"ones = np.ones(3)\n",
|
|
"err_kernel = float(np.max(np.abs(L @ ones)))\n",
|
|
"print('|| L @ 1 ||_inf =', err_kernel)\n",
|
|
"assert err_kernel < 1e-12\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots(figsize=(4, 3.2))\n",
|
|
"im = ax.imshow(L, cmap='RdBu_r', vmin=-2, vmax=2)\n",
|
|
"ax.set_title('Combinatorial Laplacian (3-clique)')\n",
|
|
"plt.colorbar(im, ax=ax)\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "13cb95ba",
|
|
"metadata": {},
|
|
"source": [
|
|
"## 2. Symmetric normalised Laplacian\n",
|
|
"\n",
|
|
"$$\n",
|
|
"L_{\\mathrm{sym}} \\;=\\; I - D^{-1/2} W D^{-1/2}.\n",
|
|
"$$\n",
|
|
"\n",
|
|
"Eigenvalues lie in $[0, 2]$ and the multiplicity of the zero eigenvalue equals the number of connected components."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "cc02bdc7",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-05-12T09:44:16.365813Z",
|
|
"iopub.status.busy": "2026-05-12T09:44:16.365536Z",
|
|
"iopub.status.idle": "2026-05-12T09:44:17.003051Z",
|
|
"shell.execute_reply": "2026-05-12T09:44:17.001539Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"eigenvalues = [4.4408921e-16 4.4408921e-16 1.5000000e+00 1.5000000e+00 1.5000000e+00\n",
|
|
" 1.5000000e+00]\n",
|
|
"number of zero eigenvalues = 2\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 800x320 with 3 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Two disconnected triangles -> two zero eigenvalues.\n",
|
|
"W6 = np.zeros((6, 6))\n",
|
|
"for (i, j) in [(0, 1), (1, 2), (0, 2), (3, 4), (4, 5), (3, 5)]:\n",
|
|
" W6[i, j] = 1.0\n",
|
|
" W6[j, i] = 1.0\n",
|
|
"Lsym = np.array(opt.normalised_laplacian_py(W6.tolist()))\n",
|
|
"eigvals = np.sort(np.linalg.eigvalsh(Lsym))\n",
|
|
"print('eigenvalues =', eigvals)\n",
|
|
"\n",
|
|
"# Two connected components -> exactly two near-zero eigenvalues.\n",
|
|
"n_zero = int(np.sum(np.abs(eigvals) < 1e-10))\n",
|
|
"print('number of zero eigenvalues =', n_zero)\n",
|
|
"assert n_zero == 2\n",
|
|
"\n",
|
|
"fig, axes = plt.subplots(1, 2, figsize=(8, 3.2))\n",
|
|
"im = axes[0].imshow(Lsym, cmap='RdBu_r', vmin=-1, vmax=1)\n",
|
|
"axes[0].set_title(r'$L_{\\mathrm{sym}}$ (2 disconnected triangles)')\n",
|
|
"plt.colorbar(im, ax=axes[0])\n",
|
|
"axes[1].plot(eigvals, 'o-')\n",
|
|
"axes[1].axhline(0.0, color='k', linewidth=0.5)\n",
|
|
"axes[1].set_xlabel('index')\n",
|
|
"axes[1].set_ylabel('eigenvalue')\n",
|
|
"axes[1].set_title('Spectrum of $L_{\\\\mathrm{sym}}$')\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "4ee010f7",
|
|
"metadata": {},
|
|
"source": [
|
|
"## 3. Random-walk Laplacian\n",
|
|
"\n",
|
|
"$$\n",
|
|
"L_{\\mathrm{rw}} \\;=\\; I - D^{-1} W.\n",
|
|
"$$\n",
|
|
"\n",
|
|
"The matrix $P = D^{-1} W$ is the row-stochastic transition matrix of the simple random walk on the graph. Hence $L_{\\mathrm{rw}} \\mathbf{1} = 0$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "249bb72a",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-05-12T09:44:17.006260Z",
|
|
"iopub.status.busy": "2026-05-12T09:44:17.005978Z",
|
|
"iopub.status.idle": "2026-05-12T09:44:17.298401Z",
|
|
"shell.execute_reply": "2026-05-12T09:44:17.297301Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"row sums of P = [1. 1. 1. 1. 1. 1.]\n",
|
|
"|| P @ 1 - 1 ||_inf = 0.0\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWkAAAE1CAYAAAAlNxHCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA6V0lEQVR4nO3df1xUVf4/8NfMIAMIM6j8GEhMUFdFUxOTMG1tYQXzY9L2C7MFyfCTQmVYKX1VLCv8Ua7rjxUrf+SWa5ul7vaDRArNFZUgVi009eMPUgdUghHQAWbu9w+WWUdg5s7AcIF5PR+P+9A5c+4977mDbw/nnnuuTBAEAURE1CHJpQ6AiIhaxiRNRNSBMUkTEXVgTNJERB0YkzQRUQfGJE1E1IExSRMRdWBM0kREHRiTNBFRB8YkTUTUgTFJExF1YE6VpJcvX45BgwbBaDQ6tJ3FixdDJpOZlW3ZsgUymQznzp1zaNvUvOa+k7bS0b5bR8aTmZmJPn36QK/Xt/mxqXmSJOkvvvgCMpkM27dvb7c2dTodli1bhnnz5kEub/jY+fn5SElJwZAhQ9C9e3f06dMHjz/+OH7++ed2i4v+6+DBg1i8eDEqKiqcsv3OYPr06aitrcWGDRukDsVpSJKk//3vfwMAhg0b1m5tbtq0CfX19Zg6daqpbNmyZfj0008RGRmJP//5z5g5cyb279+PkSNH4vjx423a/h//+EfcuHEDd955Z5setys5ePAgXnvtNUmTtD3tO9N36+bmhoSEBKxcuRJcQLN9SJKkjx49CqVSiYEDB7Zbm5s3b8ZDDz0ENzc3U1lqairOnz+P1atX45lnnsGCBQvw3Xffob6+HkuXLm3T9hUKBdzc3Bz2Kze1v+rqagDO990+/vjjOH/+PL799lupQ3EKkiXp0NBQKBSKdmnv7NmzOHr0KKKioszKx4wZA1dXV7OyAQMGYMiQISguLhZ17AMHDuCee+6Bm5sb+vXr1+KvgbePE16/fh1z5sxB3759oVQq4efnh9///vcoLCw02+/ixYuYMWMGAgMDoVQqERwcjFmzZqG2ttZU54cffsDEiROhUqng6emJyMhIHDp0yOw4jWOyp0+fxvTp0+Ht7Q21Wo3ExETU1NTYXffixYt4+umn4e/vD6VSiSFDhmDTpk3NngNLn2Xx4sV4+eWXAQDBwcGQyWRm58uWdsR+J7d/ZkvtN56Tn376CU8++SR69OiBsWPHAmj63Z4/fx6zZ8/GwIED4e7ujl69euGxxx5rdozYlnOdm5uLUaNGmX0usWPtYs6f2J/JsLAw9OzZE7t377baLrWeS3s3qNfr8fPPP+Opp55qtzYPHjwIABg5cqTVuoIgoLS0FEOGDLFa99ixY5gwYQJ8fX2xePFi1NfXIz09Hf7+/lb3ffbZZ7Fjxw6kpKQgNDQU165dw4EDB1BcXGyK89KlSxg9ejQqKiowc+ZMDBo0CBcvXsSOHTtQU1MDV1dX/Pjjjxg3bhxUKhVeeeUVdOvWDRs2bMD48eOxb98+hIeHm7X7+OOPIzg4GBkZGSgsLMT7778PPz8/LFu2rEmM1uqWlpbi3nvvhUwmQ0pKCnx9ffHVV19hxowZ0Ol0mDNnjulY1j7LH/7wB/z888/429/+hj/96U/w8fEBAPj6+trUjr3fiaX2b/XYY49hwIABeOutt1r8dT8/Px8HDx5EXFwcevfujXPnzmH9+vUYP348fvrpJ3h4eNh8rn/44QfExMQgICAAr732GgwGA15//fUm8TVH7PkT8zPZaOTIkfjXv/5ltW1qA0I7KygoEAAI77zzTru1uWDBAgGAcP36dat1//rXvwoAhI0bN1qtGxsbK7i5uQnnz583lf3000+CQqEQbj+1mzdvFgAIZ8+eFQRBENRqtZCcnGzx+PHx8YJcLhfy8/ObvGc0Gk0xuLq6CmfOnDG9d+nSJcHLy0u4//77TWXp6ekCAOHpp582O87DDz8s9OrVy6xMbN0ZM2YIAQEBwtWrV83qxcXFCWq1WqipqbHps6xYscLsHNnTji3fye1aal8Q/ntOpk6d2uS927/bW+NplJeXJwAQtm7d2uxxrZ3ryZMnCx4eHsLFixdNZadOnRJcXFys/qyJPX9ifiYbzZw5U3B3dxdVl1qn3Yc7jh49CqB9Lxpeu3YNLi4u8PT0tFjvxIkTSE5ORkREBBISEizWNRgM+PrrrxEbG4s+ffqYygcPHozo6GirMXl7e+Pw4cO4dOlSs+8bjUbs2rULkydPxqhRo5q8L5PJYDAYsGfPHsTGxiIkJMT0XkBAAJ588kkcOHAAOp3ObL9nn33W7PW4ceNw7dq1JvWs1RUEAZ9++ikmT54MQRBw9epV0xYdHY3KykrTr8liPktLbGmntd+JGLefk+a4u7ub/l5XV4dr166hf//+8Pb2bjJ00NJxbz3XBoMBe/fuRWxsLAIDA011+vfvj4kTJ1qMxZbzZ+1n8lY9evTAjRs3mgzJUNtr9yTdOLNj+PDh7d20RVqtFpMmTYJarcaOHTusjpdfuXIFN27cwIABA5q8J+aC6PLly3H8+HEEBQVh9OjRWLx4Mf7v//7P7Pg6nQ5Dhw61GENNTU2z7Q0ePBhGoxElJSVm5bcmL6DhHxsA/Prrr02OYanulStXUFFRgXfffRe+vr5mW2JiIgCgrKxM9Gex9Bltaac134kYwcHBVuvcuHEDixYtQlBQEJRKJXx8fODr64uKigpUVlY2u4+lc11WVoYbN26gf//+TfZrruxWtpw/az+TtxL+M9TjLBdLpdTuY9JHjx6FRqMRNZYGAPX19XBxaV2YvXr1Qn19Pa5fvw4vL68m71dWVmLixImoqKjAd999Z9ZbcZTHH38c48aNw86dO7Fnzx6sWLECy5Ytw2effWa1d9QaLf3nIzQzvmqpbuMNQU899VSLv3W0xW9L7dWOWLf2klvy3HPPYfPmzZgzZw4iIiKgVqshk8kQFxfX4o1UtnwvtrDl/NnyM/nrr7/Cw8ND1Pmg1mn3JH3s2DHcfffdFuvIZDKsWbMG77zzDnr37o34+Hh8++232LZtG+rq6uDt7Y158+Zh0aJF+Pnnn/HAAw/g4sWLLR5v0KBBABpmedz+D/rmzZuYPHkyfv75Z+zduxehoaGiPoevry/c3d1x6tSpJu+dPHlS1DECAgIwe/ZszJ49G2VlZRg5ciTefPNNTJw4Eb6+vlCpVBbna/v6+sLDw6PZ9k6cOAG5XI6goCBRsdjK19cXXl5eMBgMTWbNNFfX2mcBmu+V2dpOa76TtuoV7tixAwkJCXjnnXdMZTdv3rR7/refnx/c3Nxw+vTpJu81V3YrW84fYPln8lZnz57F4MGDbfsgZJd2He64fPkyrly5Iqrnk52djX//+9/Ys2cPxo0bh++++w4AUFhYCH9/fxw4cAAA8N1332HcuHEWjxUREQEA+P77783KDQYDnnjiCeTl5eGTTz4x1RNDoVAgOjoau3btwoULF0zlxcXF+Prrry3uazAYmvza6+fnh8DAQNPttnK5HLGxsfjnP//ZJG6goYelUCgwYcIE7N6922x6V2lpKbZt24axY8dCpVKJ/ky2UCgUeOSRR/Dpp582m3yvXLli+ruYzwIA3bt3BwCzZGZLO635Tlpq3x4KhaJJD3jNmjUwGAx2Hy8qKgq7du0yGy8+ffo0vvrqK6v7ijl/Yn4mb1VYWIgxY8bY83HIRu3ak268aHj69OlmbxaJj483DTXMnz/flGAGDRoEvV6Ps2fP4rvvvsP//u//YvXq1TAYDPjuu+9M81VbEhISgqFDh2Lv3r14+umnTeVz587FP/7xD0yePBnl5eX48MMPzfazNk3wtddeQ1ZWFsaNG4fZs2ejvr4ea9aswZAhQ0yftTnXr19H79698eijj2L48OHw9PTE3r17kZ+fb9b7euutt7Bnzx789re/xcyZMzF48GBcvnwZn3zyCQ4cOABvb2+88cYbyM7OxtixYzF79my4uLhgw4YN0Ov1WL58ucX4W2vp0qX49ttvER4ejqSkJISGhqK8vByFhYXYu3cvysvLbfosYWFhAID/9//+H+Li4tCtWzdMnjzZpnbs/U4AtNh+Y/IW63/+53/w17/+FWq1GqGhocjLy8PevXvRq1cvm45zq8WLF2PPnj247777MGvWLBgMBqxduxZDhw5FUVGRxX3FnD+xP5MAUFBQgPLyckyZMsXuz0M2aM+pJMuXLxcAtLhptVpBaOiCCBcuXDDb9+GHHxY++OAD4aGHHhLy8vKEmJgYIT8/XwgJCRGKioqstr1y5UrB09PTbHrUb3/7W4vxiLFv3z4hLCxMcHV1FUJCQoTMzEzTtKpb3TotSq/XCy+//LIwfPhwwcvLS+jevbswfPhw4S9/+UuT458/f16Ij48XfH19BaVSKYSEhAjJycmCXq831SksLBSio6MFT09PwcPDQ3jggQeEgwcPmh2nMaYrV660GJc9dUtLS4Xk5GQhKChI6Natm6DRaITIyEjh3XffteuzLFmyRLjjjjsEuVxu1pYt7Yj9TprTUvstnZPmzsuvv/4qJCYmCj4+PoKnp6cQHR0tnDhxQrjzzjuFhIQEs31tOdc5OTnC3XffLbi6ugr9+vUT3n//fWHu3LmCm5ub1X2tnT9bfibnzZsn9OnTxzR1khxLJggd7wZ8mUyGkpIS9O7d21T2pz/9CcePH0d2djbOnDmDFStWmK5al5eXmxZNakllZSVCQkKwfPlyzJgxw9EfgahdxMbG4scff2x2HN4R9Ho9+vbti/nz5+OFF15olzadXadZqnTcuHH45JNP0L9/f3Tr1g33338/MjMzMWbMGKsJGgDUajVeeeUVrFixwuFLlRI5wo0bN8xenzp1Cl9++SXGjx/fbjFs3rwZ3bp1EzVfnNpGp+lJGwwGeHt748UXX8Trr78OvV4Pb29vLFy4EK+++qqE0RK1j4CAAEyfPh0hISE4f/481q9fD71ejx9++KHZueHUNXTIJE1ETSUmJuLbb7+FVquFUqlEREQE3nrrLVFr0lDn1WmGO4ic3ebNm3Hu3DncvHkTlZWVyMrKYoK2YP/+/Zg8eTICAwMhk8mwa9cuq/vk5uZi5MiRUCqV6N+/P7Zs2dKkzrp169C3b1+4ubkhPDwcR44cafvgb8EkTURdUnV1NYYPH45169aJqn/27FlMmjQJDzzwAIqKijBnzhw888wzZnPsP/74Y6SmpiI9PR2FhYUYPnw4oqOjTbfWO0K7D3cYjUZcunQJXl5evO+fqJMSBAHXr19HYGCgqAv3zbl586bZuuhi2rw9ZyiVSiiVSqv7ymQy7Ny5E7GxsS3WmTdvHr744guzm37i4uJQUVGBrKwsAEB4eDjuuecerF27FkBDPgsKCsJzzz2H+fPni/4stmj328IvXbrksFuViah93X6BX6ybN2+il7snaiD+LkxPT09UVVWZlaWnp2Px4sU2t9+cvLy8JrfOR0dHm9bbrq2tRUFBAdLS0kzvy+VyREVFIS8vr01iaE67J+nGBY6m4Q64dtDRFpetf5M6hE7vjQmWV2ejzu369evoP2BAswuWiVFbW4saGBAvMg/UwoitVRdRUlJittSBmF60WFqttsnDIfz9/aHT6XDjxg38+uuvMBgMzdY5ceJEm8Vxu3ZP0o2/rrhC3nGTtIfldafJOketGUIdS2uHLN1lCrjKrOcBhSADhIafK2f72Wr3JE1E1EguAxQi8rwcaFiswYE0Gg1KS0vNykpLS6FSqeDu7g6FQgGFQtFsHY1G47C4OmZXloicgkImE705WkREBHJycszKsrOzTatjurq6IiwszKyO0WhETk6OTSto2oo9aSKSjEJkT9ryc5KaV1VVZbbe9tmzZ1FUVISePXuiT58+SEtLw8WLF7F161YADY8wW7t2LV555RU8/fTT+Oabb/D3v/8dX3zxhekYqampSEhIwKhRozB69GisWrUK1dXVpqfcOAKTNBFJRmwvWQHbe9Lff/89HnjgAdPr1NRUAEBCQgK2bNmCy5cvm607HhwcjC+++AIvvvgi/vznP6N37954//33zZ6P+cQTT+DKlStYtGgRtFotRowYgaysLKtPo2+Ndp8nrdPpoFarkYigjnvhcMduqUPo9N5+8DdSh0AOpNPp4K/RoLKy0q4LeY154GXXvlCKuHCoF4xYUXvO7vY6M/akiUgyjuxJdxVM0kQkGRnEzV5w3hTNJE1EEmJP2jomaSKSjCNnd3QVTNJEJJmGJC2mJ+28mKSJSDLsSVvHJE1EkuGYtHVM0kQkmW5yGVxFJGmDwCRNRNTuONxhnV23/LX3M76IqGtqTNJiNmdlc5KW4hlfRNQ1daRV8Doqm5P0ypUrkZSUhMTERISGhiIzMxMeHh7YtGlTs/X1ej10Op3ZRkQENAxjiOpJSx2ohGxK0o3P+Lr1OWDWnvGVkZEBtVpt2vh8QyJqJBfZi5azJy3O1atXW3zGl1arbXaftLQ0VFZWmraSkhL7oyWiLoVj0tY5fHaH2EeuE5HzET1P2ol70jYlaR8fH0me8UVEXZPoKXjOm6NtG+6Q6hlfRNQ1cXaHdTYPd0jxjC8i6prkIi8KOvOFQ5uTtBTP+CKirkmmkEEmt56AZU6cpO264zAlJQXnz5+HXq/H4cOHER4e3tZxEZETkCtkojd72HJ39Pjx4yGTyZpskyZNMtWZPn16k/djYmLsik0srt1BRNJRyCGTi+grymx/Xnbj3dGZmZkIDw/HqlWrEB0djZMnT8LPz69J/c8++wy1tbWm19euXcPw4cPx2GOPmdWLiYnB5s2bTa8dPXutYz6um4icgkwuaxjysLaJGBK5na13R/fs2RMajca0ZWdnw8PDo0mSViqVZvV69Ohh12cXi0maiCRj63DH7UtM6PX6Zo9rz93Rt9u4cSPi4uLQvXt3s/Lc3Fz4+flh4MCBmDVrFq5du2bnpxeHSZqIJCOTy0VvABAUFGS2zERGRkazx7Xn7uhbHTlyBMePH8czzzxjVh4TE4OtW7ciJycHy5Ytw759+zBx4kQYDAY7z4B1HJMmIskoXOVQKKz3FRWGhjHpkpISqFQqU7mjxoM3btyIu+66C6NHjzYrj4uLM/39rrvuwrBhw9CvXz/k5uYiMjLSIbGwJ01EkmkYc5aL2BqGO1QqldnWUpJuzd3R1dXV2L59O2bMmGE1/pCQEPj4+OD06dMiP7HtmKSJSDKOmoLXmrujP/nkE+j1ejz11FNW2/nll19w7do1BAQE2BSfLZikiUgyMlnDzA2rmx03s6SmpuK9997DBx98gOLiYsyaNcvs7uj4+HikpaU12W/jxo2IjY1Fr169zMqrqqrw8ssv49ChQzh37hxycnIwZcoU9O/fH9HR0fadABE4Jk1EkpEr5JCLGJOWC7b3J63dHX3hwgXIb5ujffLkSRw4cAB79uxpcjyFQoGjR4/igw8+QEVFBQIDAzFhwgQsWbLEoXOlmaSJSDKN86Ct1rPzaeEpKSlISUlp9r3c3NwmZQMHDoQgNH/jjLu7O77++mu74mgNJmkikoyjk3RXwCRNRJJx5HBHVyFZknbZ+je4eHhK1bxF9Y9OkToEq1x27JY6BKLWE9mTBnvSRETtTy6TQS5iXQ6uJ01EJIHGm1Ws1jNyuIOIqN2JvVFFbmRPmoio3Yme3cEkTUTU/jjcYR2TNBFJRq6AyOGOdgimg2KSJiLJNK7NIaaes2KSJiLJyOUib2YxcLiDiKjdyV0VkLsqrNeD8453MEkTkWRufTSWtXrOikmaiCQjeu0OEXW6KiZpIpKOyCl4YJImImp/MrnIedIc7iAian8ck7aOSZqIJNNwx6H12R0yhaEdoumYmKSJSDKibwt34jFpmz/5/v37MXnyZAQGBkImk2HXrl0OCIuInIFcLhe92WPdunXo27cv3NzcEB4ejiNHjrRYd8uWLQ1PL79lc3NzM6sjCAIWLVqEgIAAuLu7IyoqCqdOnbIrNrFs/uTV1dUYPnw41q1b54h4iMiJNPakxWy2+vjjj5Gamor09HQUFhZi+PDhiI6ORllZWYv7qFQqXL582bSdP3/e7P3ly5dj9erVyMzMxOHDh9G9e3dER0fj5s2bNscnls3DHRMnTsTEiRMdEQsRORlHDnesXLkSSUlJSExMBABkZmbiiy++wKZNmzB//vzm25HJoNFomn1PEASsWrUKCxYswJQpDY/Y27p1K/z9/bFr1y7ExcXZHKMYDh/o0ev10Ol0ZhsREQDIZHLTDA+Lm6whVd2eS/R6fbPHra2tRUFBAaKiokxlcrkcUVFRyMvLazGeqqoq3HnnnQgKCsKUKVPw448/mt47e/YstFqt2THVajXCw8MtHrO1HJ6kMzIyoFarTVtQUJCjmySiTsLW4Y6goCCzfJKRkdHsca9evQqDwQB/f3+zcn9/f2i12mb3GThwIDZt2oTdu3fjww8/hNFoxJgxY/DLL78AgGk/W47ZFhw+uyMtLQ2pqamm1zqdjomaiADYPtxRUlIClUplKlcqlW0WS0REBCIiIkyvx4wZg8GDB2PDhg1YsmRJm7VjK4cnaaVS2aYnkoi6DlvX7lCpVGZJuiU+Pj5QKBQoLS01Ky8tLW1xzPl23bp1w913343Tp08DgGm/0tJSBAQEmB1zxIgRoo5pD+edfEhEkmtY9F/MuLRti/67uroiLCwMOTk5pjKj0YicnByz3rIlBoMBx44dMyXk4OBgaDQas2PqdDocPnxY9DHtYXNPuqqqyvQ/C9AwmF5UVISePXuiT58+bRocEXVtjpzdkZqaioSEBIwaNQqjR4/GqlWrUF1dbZrtER8fjzvuuMM0rv3666/j3nvvRf/+/VFRUYEVK1bg/PnzeOaZZxpikMkwZ84cvPHGGxgwYACCg4OxcOFCBAYGIjY21ub4xLI5SX///fd44IEHTK8bx5sTEhKwZcuWNguMiLo+uYsL5N2spyF5ve23hT/xxBO4cuUKFi1aBK1WixEjRiArK8t04e/ChQtmN8n8+uuvSEpKglarRY8ePRAWFoaDBw8iNDTUVOeVV15BdXU1Zs6ciYqKCowdOxZZWVlNbnppSzJBEASHHb0ZOp0OarUaSVsPwNXDsz2bFq3+0SlSh2CVy47dUodg0dsP/kbqEMiBdDod/DUaVFZWihojbm5/tVqNc+/Mgcrd+jUr3Q09+s5dZXd7nRnX7iAiyXDtDuuYpIlIMkzS1jFJE5FkuJ60dUzSRCQZ9qStY5ImIsnI5DKRj8+ybZ50V8IkTUSS4XCHdUzSRCQZmVwBmVzE47NE1OmqmKSJSDpyRcMmpp6TYpImIunI5Q2bmHpOikmaiCQjUyhEPi2cPWkiovbH4Q6rmKSJSDpyucgkzeEOIqJ2xyl41jFJN6OjrzAHdIKV+mqKpY6AOgOZyOEOGYc7iIjaH8ekrWKSJiLJcLjDOiZpIpKOSzfAxVVEvXrHx9JBMUkTkWQ4T9o6Jmkikg7vOLSKSZqIpMMLh1Y5739PRCS5xlXwxGz2WLduHfr27Qs3NzeEh4fjyJEjLdZ97733MG7cOPTo0QM9evRAVFRUk/rTp0+HTCYz22JiYuyKTSwmaSKSjkz+3yEPS5vM9lT18ccfIzU1Fenp6SgsLMTw4cMRHR2NsrKyZuvn5uZi6tSp+Pbbb5GXl4egoCBMmDABFy9eNKsXExODy5cvm7a//e1vdn10sZikiUgytvakdTqd2abX61s89sqVK5GUlITExESEhoYiMzMTHh4e2LRpU7P1P/roI8yePRsjRozAoEGD8P7778NoNCInJ8esnlKphEajMW09evRouxPSDCZpIpJO49odVreGVBUUFAS1Wm3aMjIymj1sbW0tCgoKEBUVdUtTckRFRSEvL09UaDU1Nairq0PPnj3NynNzc+Hn54eBAwdi1qxZuHbtmp0fXhxeOCQi6dg4u6OkpAQqlcpUrFQqm61+9epVGAwG+Pv7m5X7+/vjxIkTokKbN28eAgMDzRJ9TEwM/vCHPyA4OBhnzpzBq6++iokTJyIvLw8KB00TZJImIsnYOk9apVKZJWlHWbp0KbZv347c3Fy4ubmZyuPi4kx/v+uuuzBs2DD069cPubm5iIyMdEgsHO4gIumIGuoQOU3vFj4+PlAoFCgtLTUrLy0thUajsbjv22+/jaVLl2LPnj0YNmyYxbohISHw8fHB6dOnbYrPFkzSRCQdByVpV1dXhIWFmV30a7wIGBER0eJ+y5cvx5IlS5CVlYVRo0ZZbeeXX37BtWvXEBAQYFN8tmCSJiLJNC6wJGazVWpqKt577z188MEHKC4uxqxZs1BdXY3ExEQAQHx8PNLS0kz1ly1bhoULF2LTpk3o27cvtFottFotqqqqAABVVVV4+eWXcejQIZw7dw45OTmYMmUK+vfvj+jo6LY5Ic3gmDQRSceB60k/8cQTuHLlChYtWgStVosRI0YgKyvLdDHxwoULkN+S/NevX4/a2lo8+uijZsdJT0/H4sWLoVAocPToUXzwwQeoqKhAYGAgJkyYgCVLlrR4AbMt2JSkMzIy8Nlnn+HEiRNwd3fHmDFjsGzZMgwcONBR8RFRVyaTibtRRSaz6/ApKSlISUlp9r3c3Fyz1+fOnbN4LHd3d3z99dd2xdEaNv0OsW/fPiQnJ+PQoUPIzs5GXV0dJkyYgOrqakfFR0RdmUwufnNSNvWks7KyzF5v2bIFfn5+KCgowP3339/sPnq93uyuIJ1OZ0eYRNQVCTI5BBEJWEydrqpVn7yyshIAmtyRc6uMjAyzO4SCgoJa0yQRdSUOmt3RldidpI1GI+bMmYP77rsPQ4cObbFeWloaKisrTVtJSYm9TRJRVyNmcSWxdyV2UXbP7khOTsbx48dx4MABi/WUSqVDr3wSUefF4Q7r7ErSKSkp+Pzzz7F//3707t27rWMiImch9qIgk7Q4giDgueeew86dO5Gbm4vg4GBHxUVEzoBJ2iqbknRycjK2bduG3bt3w8vLC1qtFgCgVqvh7u7ukACJqAtjkrbKpk++fv16VFZWYvz48QgICDBtH3/8saPiI6IuTJDJTOPSljf7bmbpCmwe7iAiajPsSVvFtTuISDoymbhbvtmTJiKSAHvSVjFJE5FkOE/aOiZpIpKOTOTdhEzSREQS4HCHVUzSRCQdJmmrmKSJSDpM0lYxSRORZBpvZhFTz1kxSRORdNiTtsp5PzkRSc/Bi/6vW7cOffv2hZubG8LDw3HkyBGL9T/55BMMGjQIbm5uuOuuu/Dll1+avS8IAhYtWoSAgAC4u7sjKioKp06dsis2sZikiUgy4tbtEDeX+nYff/wxUlNTkZ6ejsLCQgwfPhzR0dEoKytrtv7BgwcxdepUzJgxAz/88ANiY2MRGxuL48ePm+osX74cq1evRmZmJg4fPozu3bsjOjoaN2/etPscWCMT2nlBDp1OB7VajaStB+Dq4dmeTXcp9Y9OkToEi1bVFEsdAjmQTqeDv0aDyspKqFQqu/ZXq9Uo1WpF7d/YXklJiVl9Sw8VCQ8Pxz333IO1a9cCaHiaVFBQEJ577jnMnz+/Sf0nnngC1dXV+Pzzz01l9957L0aMGIHMzEwIgoDAwEDMnTsXL730EoCGRwj6+/tjy5YtiIuLs+kciCXZmPQbE/rb9eXSf3TwJDjHY7DUIVjksmO31CF0arU1VW1ynIYLh9YvCjbWuf0Zqenp6Vi8eHHT+GprUVBQgLS0NFOZXC5HVFQU8vLymm0jLy8PqampZmXR0dHYtWsXAODs2bPQarWIiooyva9WqxEeHo68vLyul6SJiAShYRNTD0CzPenmXL16FQaDAf7+/mbl/v7+OHHiRLP7aLXaZus3rpvf+KelOo7AJE1EkjEKAowisnRjHZVK5XS/gfPCIRFJRrBhs4WPjw8UCgVKS0vNyktLS6HRaJrdR6PRWKzf+Kctx2wLTNJEJBmjIH6zhaurK8LCwpCTk/PftoxG5OTkICIiotl9IiIizOoDQHZ2tql+cHAwNBqNWR2dTofDhw+3eMy2wOEOIpKMIAiinvhkzyS01NRUJCQkYNSoURg9ejRWrVqF6upqJCYmAgDi4+Nxxx13ICMjAwDwwgsv4Le//S3eeecdTJo0Cdu3b8f333+Pd999FwAgk8kwZ84cvPHGGxgwYACCg4OxcOFCBAYGIjY21ub4xGKSJiLJiO0l29qTBhqm1F25cgWLFi2CVqvFiBEjkJWVZbrwd+HCBchvWSZ1zJgx2LZtGxYsWIBXX30VAwYMwK5duzB06FBTnVdeeQXV1dWYOXMmKioqMHbsWGRlZcHNzc32AEWSbJ602PmR1DlxCl7XVltThffix7Z6nvTZXy7DS8T+13U6BPcOsLu9zow9aSKSjCN70l0FkzQRScaRY9JdBZM0EUnG+J9NTD1nxSRNRJKx9Y5DZ8QkTUSS4Zi0dUzSRCQZjklbxyRNRJIxADCIyL8Gh0fScTFJE5FkbF1gyRkxSRORZMQunuS8KdrGBZbWr1+PYcOGmZYLjIiIwFdffeWo2Iioi3PUAktdiU1Junfv3li6dCkKCgrw/fff43e/+x2mTJmCH3/80VHxEVFXJvx3Gp6lzZm70jYNd0yePNns9Ztvvon169fj0KFDGDJkSLP76PV66PV602udTmdHmETUFRkhwCgiA4up01XZvZ60wWDA9u3bUV1dbXEt1YyMDKjVatN2+zPKiMh5ielFi73hpauyOUkfO3YMnp6eUCqVePbZZ7Fz506Ehoa2WD8tLQ2VlZWmraSkpFUBE1HXwTFp62ye3TFw4EAUFRWhsrISO3bsQEJCAvbt29diorb0yHUicm68Ldw6m5O0q6sr+vfvDwAICwtDfn4+/vznP2PDhg1tHhwRdW0ck7au1fOkjUaj2YVBIiKx2JO2zqYknZaWhokTJ6JPnz64fv06tm3bhtzcXHz99deOio+IujDecWidTUm6rKwM8fHxuHz5MtRqNYYNG4avv/4av//97x0VHxF1YQZjwyamnrOyaXbHxo0bce7cOej1epSVlWHv3r1M0ERkt8aetJjNkcrLyzFt2jSoVCp4e3tjxowZqKqqslj/ueeew8CBA+Hu7o4+ffrg+eefR2VlpVk9mUzWZNu+fbtNsXHtDiKSjFEQYOgAwx3Tpk3D5cuXkZ2djbq6OiQmJmLmzJnYtm1bs/UvXbqES5cu4e2330ZoaCjOnz+PZ599FpcuXcKOHTvM6m7evBkxMTGm197e3jbFxiRNRJJpmAMtJkk7Lobi4mJkZWUhPz8fo0aNAgCsWbMGDz74IN5++20EBgY22Wfo0KH49NNPTa/79euHN998E0899RTq6+vh4vLf1Ort7Q2NRmN3fHbfcUhE1FqNY9JiNqBhWYlbt7aYWZaXlwdvb29TggaAqKgoyOVyHD58WPRxKisroVKpzBI0ACQnJ8PHxwejR4/Gpk2bbH6AAXvSRCSZOqMRdUbrVwUb69y+rER6ejoWL17cqhi0Wi38/PzMylxcXNCzZ09otVpRx7h69SqWLFmCmTNnmpW//vrr+N3vfgcPDw/s2bMHs2fPRlVVFZ5//nnR8TFJE5FkjBD5jMP//FlSUgKVSmUqt3Q38/z587Fs2TKLxy0uLhYRpWU6nQ6TJk1CaGhok/8wFi5caPr73XffjerqaqxYsYJJmog6B4NRgEFElm6s07iWvRhz587F9OnTLdYJCQmBRqNBWVmZWXl9fT3Ky8utjiVfv34dMTEx8PLyws6dO9GtWzeL9cPDw7FkyRLo9XrRy2UwSRORZASR0+vseRCtr68vfH19rdaLiIhARUUFCgoKEBYWBgD45ptvYDQaER4e3uJ+Op0O0dHRUCqV+Mc//gE3NzerbRUVFaFHjx42rWfEJE1EkjEIIh9E68DZHYMHD0ZMTAySkpKQmZmJuro6pKSkIC4uzjSz4+LFi4iMjMTWrVsxevRo6HQ6TJgwATU1Nfjwww9NFzKBhv8cFAoF/vnPf6K0tBT33nsv3NzckJ2djbfeegsvvfSSTfExSRORZDrKbeEfffQRUlJSEBkZCblcjkceeQSrV682vV9XV4eTJ0+ipqYGAFBYWGia+dG44Fyjs2fPom/fvujWrRvWrVuHF198EYIgoH///li5ciWSkpJsio1JmogkY+uYtKP07NmzxRtXAKBv375mQy7jx4+3OgQTExNjdhOLvZikiUgyHaUn3ZExSRORZDrCmHRHxyRNDuGyY7fUIVhU/+gUqUOwqqOfw7bAnrR1TNJEJBmjUYBRxHizmDpdFZM0EUnGKHK4w4lzNJM0EUmHwx3WMUkTkWQMIteTFlOnq2KSJiLJcEzaOiZpIpKMASKn4Dk8ko6LSZqIJMMxaeuYpIlIMhyTto5JmogkU1dvhKJexJNZRNTpqpikiUgyHWWBpY6MSZqIJNPwkFkxSbodgumgmKSJSDLsSVvHJE1EkmGSto5JmogkYxSZpHkzCxGRBAyCyJ40p+AREbU/DndYJ2/NzkuXLoVMJsOcOXPaKBwiciaNSVrM5kjl5eWYNm0aVCoVvL29MWPGDFRVVVncZ/z48ZDJZGbbs88+a1bnwoULmDRpEjw8PODn54eXX34Z9fX1NsVmd086Pz8fGzZswLBhw+w9BBE5uXqjAIWIBFzv4CQ9bdo0XL58GdnZ2airq0NiYiJmzpxp8eG0AJCUlITXX3/d9NrDw8P0d4PBgEmTJkGj0eDgwYO4fPky4uPj0a1bN7z11luiY7OrJ11VVYVp06bhvffeQ48ePew5BBFRh+hJFxcXIysrC++//z7Cw8MxduxYrFmzBtu3b8elS5cs7uvh4QGNRmPaVCqV6b09e/bgp59+wocffogRI0Zg4sSJWLJkCdatW4fa2lrR8dmVpJOTkzFp0iRERUVZravX66HT6cw2IiLgv7M7rG2NsztuzyV6vb7VMeTl5cHb2xujRo0ylUVFRUEul+Pw4cMW9/3oo4/g4+ODoUOHIi0tDTU1NWbHveuuu+Dv728qi46Ohk6nw48//ig6PpuHO7Zv347CwkLk5+eLqp+RkYHXXnvN1maIyAnYusBSUFCQWXl6ejoWL17cqhi0Wi38/PzMylxcXNCzZ09otdoW93vyySdx5513IjAwEEePHsW8efNw8uRJfPbZZ6bj3pqgAZheWzru7WxK0iUlJXjhhReQnZ0NNzc3UfukpaUhNTXV9Fqn0zU50UTknGyd3VFSUmI2pKBUKlvcZ/78+Vi2bJnF4xYXF4uMtKmZM2ea/n7XXXchICAAkZGROHPmDPr162f3cW9nU5IuKChAWVkZRo4caSozGAzYv38/1q5dC71eD4VCYbaPUqm0eCKJyHnZmqRVKpVZkrZk7ty5mD59usU6ISEh0Gg0KCsrMyuvr69HeXk5NBqNqLYAIDw8HABw+vRp9OvXDxqNBkeOHDGrU1paCgA2HdemJB0ZGYljx46ZlSUmJmLQoEGYN29ekwRNRGSJI+dJ+/r6wtfX12q9iIgIVFRUoKCgAGFhYQCAb775Bkaj0ZR4xSgqKgIABAQEmI775ptvoqyszDSckp2dDZVKhdDQUNHHtSlJe3l5YejQoWZl3bt3R69evZqUExFZYxCMMBitL3FnEBy3DN7gwYMRExODpKQkZGZmoq6uDikpKYiLi0NgYCAA4OLFi4iMjMTWrVsxevRonDlzBtu2bcODDz6IXr164ejRo3jxxRdx//33m6YlT5gwAaGhofjjH/+I5cuXQ6vVYsGCBUhOTrZpdIF3HBKRZOrqjUAHWPT/o48+QkpKCiIjIyGXy/HII49g9erV/22/rg4nT540zd5wdXXF3r17sWrVKlRXVyMoKAiPPPIIFixYYNpHoVDg888/x6xZsxAREYHu3bsjISHBbF61GK1O0rm5ua09BBE5qXojIBN1M4tj4+jZs6fFG1f69u0L4ZZZKEFBQdi3b5/V495555348ssvWxUbe9JEJBmDUYCca3dYxCRNRJJhkraOSZqIJMMkbR2TNBFJhov+W8ckTUSSMRgFURcO2ZMmIpKAIAgQRCRggU9mISJqf8ZbVrizVs9ZMUkTkWQEQRDVS2ZPmohIAoJR5HAHe9JERO2Pwx3WMUkTkWQEY8Mmpp6zYpImIslwTNo6JmkikgyHO6xjkian5LJjt9QhWFX/6BSpQ2hRPdpm/IEXDq1jkiYi6YhM0mCSJiJqfwajETCIeDKLiKe3dFVM0kQkGQ53WMckTUSSMYp8MosTd6SZpIlIOpyCZx2TNBFJhjezWCeXOgAicl6N86TFbI5UXl6OadOmQaVSwdvbGzNmzEBVVVWL9c+dOweZTNbs9sknn5jqNff+9u3bbYqNPWkikkxHuXA4bdo0XL58GdnZ2airq0NiYiJmzpzZ4hPEg4KCcPnyZbOyd999FytWrMDEiRPNyjdv3oyYmBjTa29vb5tiY5ImIsnYmqR1Op1ZuVKphFKpbFUMxcXFyMrKQn5+PkaNGgUAWLNmDR588EG8/fbbCAwMbLKPQqGARqMxK9u5cycef/xxeHp6mpV7e3s3qWsLDncQkWSMgiB6Axp6sGq12rRlZGS0Ooa8vDx4e3ubEjQAREVFQS6X4/Dhw6KOUVBQgKKiIsyYMaPJe8nJyfDx8cHo0aOxadMmmy+CsidNRJKxtSddUlIClUplKm9tLxoAtFot/Pz8zMpcXFzQs2dPaLVaUcfYuHEjBg8ejDFjxpiVv/766/jd734HDw8P7NmzB7Nnz0ZVVRWef/550fExSRORZGx9xqFKpTJL0pbMnz8fy5Yts1inuLhY1LEsuXHjBrZt24aFCxc2ee/WsrvvvhvV1dVYsWIFkzQRdQ6CyJkb9lw4nDt3LqZPn26xTkhICDQaDcrKyszK6+vrUV5eLmoseceOHaipqUF8fLzVuuHh4ViyZAn0er3o3wKYpIlIMo68mcXX1xe+vr5W60VERKCiogIFBQUICwsDAHzzzTcwGo0IDw+3uv/GjRvx0EMPiWqrqKgIPXr0sGmYhkmaiCTTEabgDR48GDExMUhKSkJmZibq6uqQkpKCuLg408yOixcvIjIyElu3bsXo0aNN+54+fRr79+/Hl19+2eS4//znP1FaWop7770Xbm5uyM7OxltvvYWXXnrJpviYpIlIMkajIGoZUkffzPLRRx8hJSUFkZGRkMvleOSRR7B69WrT+3V1dTh58iRqamrM9tu0aRN69+6NCRMmNDlmt27dsG7dOrz44osQBAH9+/fHypUrkZSUZFNsMsGG3yMWL16M1157zaxs4MCBOHHihOgGdTod1Go1SrVa0RcAqPN56cufpQ6h0+vIi/7XwojNKEFlZaVd/44b80DQHzdB7uphtb6xtgYlf33a7vY6M5t70kOGDMHevXv/ewAXdsaJyD6C0QDBaBBVz1nZnGFdXFxsuntGr9dDr9ebXt9+xxAROS9jXR0gqxVXz0nZfMfhqVOnEBgYiJCQEEybNg0XLlywWD8jI8PsDqGgoCC7gyWirkUQDKbetMVNcN6etE1JOjw8HFu2bEFWVhbWr1+Ps2fPYty4cbh+/XqL+6SlpaGystK0lZSUtDpoIuoaRCVokUMiXZVNwx23ru40bNgwhIeH484778Tf//73Zu9ZB9pmARQi6po4Jm1dq676eXt74ze/+Q1Onz7dVvEQkRNhkrauVavgVVVV4cyZMwgICGireIjIiQhGo8jhDud9NItNSfqll17Cvn37cO7cORw8eBAPP/wwFAoFpk6d6qj4iKgLMxoNojdnZdNwxy+//IKpU6fi2rVr8PX1xdixY3Ho0CFR96wTEd2Owx3W2ZSkbX02FxGRJUzS1vF2QSKSjsEAQS4iARuYpImI2p0gGAAxPWknvpmFSZqIJCMYjeKStBPP7mCSJiLJCEaRPWmOSRMRtb+GnrT1XjJ70kREEmBP2jomaSKSDJO0dUzSRCQZo9EAGZO0RUzSRCQZY30dZILMaj3BwEX/iYjaXUdZT/rNN9/EmDFj4OHhAW9vb3GxCwIWLVqEgIAAuLu7IyoqCqdOnTKrU15ejmnTpkGlUsHb2xszZsxAVVWVTbExSRORZDpKkq6trcVjjz2GWbNmid5n+fLlWL16NTIzM3H48GF0794d0dHRuHnzpqnOtGnT8OOPPyI7Oxuff/459u/fj5kzZ9oUW7sPdzQ+nNzS01yo86utsa23QE3Vo+NOO6v9T2yN/57tJdTdFJeA/zPccfszUtvqoSKvvfYaAGDLli2i6guCgFWrVmHBggWYMqXhqe5bt26Fv78/du3ahbi4OBQXFyMrKwv5+fkYNWoUAGDNmjV48MEH8fbbbyMwMFBccEI7KykpEQBw48atC2wlJSV25YEbN24IGo3GprY8PT2blKWnp7dpftq8ebOgVqut1jtz5owAQPjhhx/Myu+//37h+eefFwRBEDZu3Ch4e3ubvV9XVycoFArhs88+Ex1Tu/ekAwMDUVJSAi8vL8hk1i8YWKPT6RAUFISSkhKoVKo2iNC58Py1njOeQ0EQcP36dfG9wdu4ubnh7NmzqK21/qTwW9u8PWdI9Wg+rVYLAPD39zcr9/f3N72n1Wrh5+dn9r6Liwt69uxpqiNGuydpuVyO3r17t/lxVSqV0/wDcQSev9ZztnOoVqtbtb+bmxvc3NzaKJqm5s+fj2XLllmsU1xcjEGDBjkshrbAKXhE1CXNnTsX06dPt1gnJCTErmNrNBoAQGlpqdnjA0tLSzFixAhTnbKyMrP96uvrUV5ebtpfDCZpIuqSfH19HfbUqODgYGg0GuTk5JiSsk6nw+HDh00zRCIiIlBRUYGCggKEhYUBAL755hsYjUaEh4eLbqvTT8FTKpVIT0+XbGyqs+P5az2ew87vwoULKCoqwoULF2AwGFBUVISioiKzOc2DBg3Czp07AQAymQxz5szBG2+8gX/84x84duwY4uPjERgYiNjYWADA4MGDERMTg6SkJBw5cgT/+te/kJKSgri4ONvG8kVfYiQi6qISEhKanVHy7bffmuoAEDZv3mx6bTQahYULFwr+/v6CUqkUIiMjhZMnT5od99q1a8LUqVMFT09PQaVSCYmJicL169dtik32n8aJiKgD6vTDHUREXRmTNBFRB8YkTUTUgTFJExF1YJ06Sa9btw59+/aFm5sbwsPDceTIEalD6jQyMjJwzz33wMvLC35+foiNjcXJkyelDqvTWrp0qWlaFlFb6rRJ+uOPP0ZqairS09NRWFiI4cOHIzo6uskdPtS8ffv2ITk5GYcOHUJ2djbq6uowYcIEVFdXSx1ap5Ofn48NGzZg2LBhUodCXVCnnYIXHh6Oe+65B2vXrgUAGI1GBAUF4bnnnsP8+fMljq7zuXLlCvz8/LBv3z7cf//9UofTaVRVVWHkyJH4y1/+gjfeeAMjRozAqlWrpA6LupBO2ZOura1FQUEBoqKiTGVyuRxRUVHIy8uTMLLOq7KyEgDQs2dPiSPpXJKTkzFp0iSzn0WittQp1+64evUqDAZDs8sEnjhxQqKoOi+j0Yg5c+bgvvvuw9ChQ6UOp9PYvn07CgsLkZ+fL3Uo1IV1yiRNbSs5ORnHjx/HgQMHpA6l0ygpKcELL7yA7Oxshy63SdQpk7SPjw8UCgVKS0vNyktLS21aApCAlJQU07PXHLHOd1dVUFCAsrIyjBw50lRmMBiwf/9+rF27Fnq9HgqFQsIIqavolGPSrq6uCAsLQ05OjqnMaDQiJycHEREREkbWeQiCgJSUFOzcuRPffPMNgoODpQ6pU4mMjMSxY8dMq6UVFRVh1KhRmDZtGoqKipigqc10yp40AKSmpiIhIQGjRo3C6NGjsWrVKlRXVyMxMVHq0DqF5ORkbNu2Dbt374aXl5fpcT5qtRru7u4SR9fxeXl5NRm/7969O3r16sVxfWpTnTZJP/HEE7hy5QoWLVoErVaLESNGICsrq8nFRGre+vXrAQDjx483K9+8ebPVp1kQUfvptPOkiYicQacckyYichZM0kREHRiTNBFRB8YkTUTUgTFJExF1YEzSREQdGJM0EVEHxiRNRNSBMUkTEXVgTNJERB0YkzQRUQf2/wF9VUurmjE7fgAAAABJRU5ErkJggg==",
|
|
"text/plain": [
|
|
"<Figure size 400x320 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"Lrw = np.array(opt.random_walk_laplacian_py(W6.tolist()))\n",
|
|
"P = np.eye(6) - Lrw\n",
|
|
"row_sums = P.sum(axis=1)\n",
|
|
"print('row sums of P =', row_sums)\n",
|
|
"err_stochastic = float(np.max(np.abs(row_sums - 1.0)))\n",
|
|
"print('|| P @ 1 - 1 ||_inf =', err_stochastic)\n",
|
|
"assert err_stochastic < 1e-12\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots(figsize=(4, 3.2))\n",
|
|
"im = ax.imshow(Lrw, cmap='RdBu_r', vmin=-1, vmax=1)\n",
|
|
"ax.set_title(r'$L_{\\mathrm{rw}}$ (2 disconnected triangles)')\n",
|
|
"plt.colorbar(im, ax=ax)\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "baaf3fe7",
|
|
"metadata": {},
|
|
"source": [
|
|
"## 4. Spectral clustering (Ng--Jordan--Weiss)\n",
|
|
"\n",
|
|
"Given a similarity matrix $W$ and a target number of clusters $k$:\n",
|
|
"\n",
|
|
"1. Build $L_{\\mathrm{sym}} = I - D^{-1/2} W D^{-1/2}$.\n",
|
|
"2. Stack the $k$ eigenvectors of $L_{\\mathrm{sym}}$ associated with the smallest eigenvalues as columns of $U \\in \\mathbb{R}^{n \\times k}$.\n",
|
|
"3. Row-normalise $U$ and apply Lloyd's $k$-means with k-means++ seeding to its rows.\n",
|
|
"\n",
|
|
"We test on two well-separated 2D Gaussian blobs. Ground truth: cluster purity equals $1.0$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "ddbc3936",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-05-12T09:44:17.302450Z",
|
|
"iopub.status.busy": "2026-05-12T09:44:17.302058Z",
|
|
"iopub.status.idle": "2026-05-12T09:44:17.805918Z",
|
|
"shell.execute_reply": "2026-05-12T09:44:17.803760Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"first 6 eigenvalues = [-6.47704929e-16 6.07023906e-07 9.56672916e-01 9.57721212e-01\n",
|
|
" 9.82109668e-01 9.84579761e-01]\n",
|
|
"fiedler value = 6.070239058352574e-07\n",
|
|
"cluster purity = 1.0\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 900x360 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"n_per = 30\n",
|
|
"X1 = rng.normal(loc=[-3.0, 0.0], scale=0.35, size=(n_per, 2))\n",
|
|
"X2 = rng.normal(loc=[+3.0, 0.0], scale=0.35, size=(n_per, 2))\n",
|
|
"X = np.vstack([X1, X2])\n",
|
|
"y_true = np.array([0] * n_per + [1] * n_per)\n",
|
|
"n = X.shape[0]\n",
|
|
"\n",
|
|
"# Gaussian similarity, zero diagonal.\n",
|
|
"sigma = 1.0\n",
|
|
"D2 = np.sum((X[:, None, :] - X[None, :, :]) ** 2, axis=-1)\n",
|
|
"W = np.exp(-D2 / (2.0 * sigma ** 2))\n",
|
|
"np.fill_diagonal(W, 0.0)\n",
|
|
"\n",
|
|
"result = opt.spectral_cluster_py(W.tolist(), k=2, n_kmeans_iter=200, seed=7)\n",
|
|
"labels = np.array(result['labels'])\n",
|
|
"eigvals = np.array(result['eigenvalues'])\n",
|
|
"fiedler = result['fiedler_value']\n",
|
|
"print('first 6 eigenvalues =', eigvals[:6])\n",
|
|
"print('fiedler value =', fiedler)\n",
|
|
"\n",
|
|
"# Cluster purity (label-permutation invariant).\n",
|
|
"def purity(y_true, y_pred):\n",
|
|
" classes = np.unique(y_pred)\n",
|
|
" correct = 0\n",
|
|
" for c in classes:\n",
|
|
" mask = y_pred == c\n",
|
|
" if mask.any():\n",
|
|
" correct += int(np.bincount(y_true[mask]).max())\n",
|
|
" return correct / len(y_true)\n",
|
|
"\n",
|
|
"p = purity(y_true, labels)\n",
|
|
"print('cluster purity =', p)\n",
|
|
"assert p == 1.0\n",
|
|
"\n",
|
|
"fig, axes = plt.subplots(1, 2, figsize=(9, 3.6))\n",
|
|
"axes[0].scatter(X[:, 0], X[:, 1], c=labels, cmap='coolwarm', edgecolor='k')\n",
|
|
"axes[0].set_title('Spectral cluster labels')\n",
|
|
"axes[0].set_xlabel('x')\n",
|
|
"axes[0].set_ylabel('y')\n",
|
|
"axes[1].plot(eigvals[:10], 'o-')\n",
|
|
"axes[1].axhline(0.0, color='k', linewidth=0.5)\n",
|
|
"axes[1].set_xlabel('index')\n",
|
|
"axes[1].set_ylabel('eigenvalue')\n",
|
|
"axes[1].set_title(r'Smallest 10 eigenvalues of $L_{\\mathrm{sym}}$')\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "17d3fce2",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Summary\n",
|
|
"\n",
|
|
"Verified against analytic ground truth:\n",
|
|
"\n",
|
|
"- $L \\mathbf{1} = 0$ for the combinatorial Laplacian (3-clique) — error $< 10^{-12}$.\n",
|
|
"- For two disconnected triangles, $L_{\\mathrm{sym}}$ has exactly $2$ zero eigenvalues — error $< 10^{-10}$.\n",
|
|
"- $P = I - L_{\\mathrm{rw}}$ is row-stochastic, $P \\mathbf{1} = \\mathbf{1}$ — error $< 10^{-12}$.\n",
|
|
"- Spectral clustering recovers two well-separated Gaussian blobs with purity $= 1.0$ — error $= 0$."
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"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.11.13"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|