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/).
445 lines
158 KiB
Plaintext
445 lines
158 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "4a4162d3",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Topological Data Analysis — `optimiz-rs`\n",
|
||
"\n",
|
||
"Companion notebook for the [`topology` module documentation](https://optimiz-r.readthedocs.io/en/latest/algorithms/topology.html).\n",
|
||
"\n",
|
||
"Demonstrates the three public functions exposed via PyO3 bindings:\n",
|
||
"\n",
|
||
"1. `vietoris_rips_filtration(points, max_dim, max_eps)`\n",
|
||
"2. `persistent_homology(points, max_dim, max_eps)`\n",
|
||
"3. `bottleneck_distance(diagram_a, diagram_b)`\n",
|
||
"\n",
|
||
"Synthetic point clouds are used so that the topology is known analytically and results can be verified against ground truth."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "37f6083a",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:10.216100Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:10.215503Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:11.425071Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:11.422244Z"
|
||
}
|
||
},
|
||
"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(0)\n",
|
||
"\n",
|
||
"def plot_diagram(ax, diagram, title):\n",
|
||
" if diagram:\n",
|
||
" finite_d = max((p['death'] for p in diagram if np.isfinite(p['death'])), default=1.0)\n",
|
||
" else:\n",
|
||
" finite_d = 1.0\n",
|
||
" cap = max(finite_d * 1.1, 1e-3)\n",
|
||
" ax.plot([0, cap], [0, cap], '--', color='gray', linewidth=1)\n",
|
||
" colors = {0: 'tab:blue', 1: 'tab:red', 2: 'tab:green'}\n",
|
||
" for p in diagram:\n",
|
||
" d = cap if not np.isfinite(p['death']) else p['death']\n",
|
||
" ax.scatter(p['birth'], d, c=colors.get(p['dim'], 'k'),\n",
|
||
" marker='o' if np.isfinite(p['death']) else '^',\n",
|
||
" label=f\"H{p['dim']}\")\n",
|
||
" handles, labels = ax.get_legend_handles_labels()\n",
|
||
" seen = {}\n",
|
||
" for h, l in zip(handles, labels):\n",
|
||
" seen.setdefault(l, h)\n",
|
||
" ax.legend(seen.values(), seen.keys(), loc='lower right')\n",
|
||
" ax.set_xlabel('birth'); ax.set_ylabel('death')\n",
|
||
" ax.set_title(title); ax.set_aspect('equal')\n",
|
||
"\n",
|
||
"def plot_barcode(ax, diagram, title, cap=None):\n",
|
||
" if cap is None:\n",
|
||
" cap = max((p['death'] for p in diagram if np.isfinite(p['death'])), default=1.0) * 1.1\n",
|
||
" colors = {0: 'tab:blue', 1: 'tab:red', 2: 'tab:green'}\n",
|
||
" for i, p in enumerate(sorted(diagram, key=lambda q: (q['dim'], q['birth']))):\n",
|
||
" d = cap if not np.isfinite(p['death']) else p['death']\n",
|
||
" ax.plot([p['birth'], d], [i, i], color=colors.get(p['dim'], 'k'), linewidth=2)\n",
|
||
" ax.set_xlabel('scale'); ax.set_yticks([])\n",
|
||
" ax.set_title(title)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "a4aa92a9",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 1. Vietoris–Rips filtration\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\mathrm{VR}_{\\varepsilon}(X) \\;=\\; \\big\\{\\, \\sigma \\subseteq X : \\mathrm{diam}(\\sigma) \\le \\varepsilon \\,\\big\\}.\n",
|
||
"$$\n",
|
||
"\n",
|
||
"We build the filtration on a small synthetic cloud (4 points forming a unit square) and inspect the simplices."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "08979bf6",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:11.431246Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:11.430642Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:11.443235Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:11.440591Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"dim=0 vertices=[0] filt=0.0000\n",
|
||
"dim=0 vertices=[1] filt=0.0000\n",
|
||
"dim=0 vertices=[2] filt=0.0000\n",
|
||
"dim=0 vertices=[3] filt=0.0000\n",
|
||
"dim=1 vertices=[0, 1] filt=1.0000\n",
|
||
"dim=1 vertices=[0, 3] filt=1.0000\n",
|
||
"dim=1 vertices=[1, 2] filt=1.0000\n",
|
||
"dim=1 vertices=[2, 3] filt=1.0000\n",
|
||
"dim=1 vertices=[0, 2] filt=1.4142\n",
|
||
"dim=1 vertices=[1, 3] filt=1.4142\n",
|
||
"dim=2 vertices=[0, 1, 2] filt=1.4142\n",
|
||
"dim=2 vertices=[0, 1, 3] filt=1.4142\n",
|
||
"dim=2 vertices=[0, 2, 3] filt=1.4142\n",
|
||
"dim=2 vertices=[1, 2, 3] filt=1.4142\n",
|
||
"\n",
|
||
"VR filtration cardinality check passed.\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"square = [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]]\n",
|
||
"simplices = opt.vietoris_rips_filtration(square, 2, 2.0)\n",
|
||
"for s in simplices:\n",
|
||
" print(f\"dim={s['dim']} vertices={s['vertices']} filt={s['filtration']:.4f}\")\n",
|
||
"\n",
|
||
"n0 = sum(1 for s in simplices if s['dim'] == 0)\n",
|
||
"n1 = sum(1 for s in simplices if s['dim'] == 1)\n",
|
||
"assert n0 == 4, f\"expected 4 vertices, got {n0}\"\n",
|
||
"assert n1 == 6, f\"expected 6 edges (complete graph on 4 nodes), got {n1}\"\n",
|
||
"print('\\nVR filtration cardinality check passed.')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "0b928d51",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 2. Persistent homology\n",
|
||
"\n",
|
||
"$$\n",
|
||
"D_k(X) \\;=\\; \\big\\{\\, (b_i, d_i) : 0 \\le b_i < d_i \\le \\infty \\,\\big\\}.\n",
|
||
"$$\n",
|
||
"\n",
|
||
"Three synthetic geometries with known Betti numbers:\n",
|
||
"\n",
|
||
"* **Unit circle**: $\\beta_0 = 1$, $\\beta_1 = 1$ (one essential loop).\n",
|
||
"* **Two clusters**: $\\beta_0 = 2$ at small scale (one essential cluster after merge).\n",
|
||
"* **Figure-eight**: $\\beta_1 = 2$ (two loops)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "46531ba9",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:11.448291Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:11.447795Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:13.875097Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:13.871754Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"#H1 features detected on the circle: 253\n",
|
||
"longest H1 lifetime: birth=0.2611 death=inf\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABPAAAAGGCAYAAAD1gH94AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACHJ0lEQVR4nOzde1wVdf7H8fcB5OIF8MZNSfGSSqgkJWGWliiomVabableMi3LNrMybVPCStcuaplpa6W25lqaWlqLmUmtRZq3kkRXXbwDXhBQFFDO/P7wx1mPgHI7nAO8no/Heeye73xn5jNf5kwzH7/z/ZoMwzAEAAAAAAAAwCE52TsAAAAAAAAAAMUjgQcAAAAAAAA4MBJ4AAAAAAAAgAMjgQcAAAAAAAA4MBJ4AAAAAAAAgAMjgQcAAAAAAAA4MBJ4AAAAAAAAgAMjgQcAAAAAAAA4MBJ4AAAAAAAAgAMjgVeNDR8+XM2bN7fpPg4ePCiTyaRFixZV2DabN2+u4cOHV9j28D/x8fEymUyKj4+vsG2+8sorMplMFba90jCZTHrllVfssm8AAACgOuCe+vIz6D333GPvMCqMPZ/RYDsk8Oys4Id16tSpIpeHhISoe/fuFbKv8+fP65VXXqnQ5A1QVU2bNk2rV6+2dxgAAACoYRYtWiSTyWT5uLu768Ybb9TYsWOVlpZm7/BKZOnSpZo9e7a9wwBqFBd7BwDbWbBggcxms+X7+fPnFRsbK0kVlhRs1qyZLly4oFq1alXI9oDSuHDhglxcynYZmzZtmv70pz9pwIABFRsUAAAAUAJTp05VUFCQcnJytGnTJs2bN0/ffPONEhMTVbt27UqLoyz31EuXLlViYqLGjRtnm6AAFEICrxqrjKRawb8YXU92drbq1Klj83hQs5Tk3AMAAAAcUe/evXXLLbdIkh577DE1bNhQM2fO1JdffqnBgweXa9vnz58vcRKQe+rKkZOTI1dXVzk58SIkyoYzp4opGMPs888/1+uvv66mTZvK3d1dPXr00P79+63qXjkG3sGDB9W4cWNJUmxsrKW79vXGOsjIyNCzzz6r5s2by83NTU2bNtXQoUMtr/wWNQbe8OHDVbduXR04cEB9+vRRvXr19Mgjj0iSzGaz3nnnHbVv317u7u5q3LixoqOjtXXr1uvGMW7cOAUGBsrNzU2tWrXSjBkzrHoYVrb169era9eu8vb2Vt26ddWmTRu99NJLluV5eXmaMmWKwsLC5OXlpTp16uiOO+7Qxo0brbZT0IZvvfWW5s6dqxYtWqh27drq1auXjhw5IsMw9Oqrr6pp06by8PBQ//79lZ6ebrWNgjEbvv32W4WGhsrd3V3BwcFauXJliY5l8+bNio6OlpeXl2rXrq1u3brpp59+KlRv06ZNuvXWW+Xu7q6WLVvqgw8+KHF7de/eXSEhIdq2bZu6dOkiDw8PBQUFaf78+YXqnjhxQiNHjpSvr6/c3d3VsWNHLV68uFC9q8/hglfS9+/fr+HDh8vb21teXl4aMWKEzp8/b7Vedna2Fi9ebPktFIy7ePbsWY0bN85yzvv4+Khnz57avn17iY8VAAAAKK27775bkpScnGwpW7JkicLCwuTh4aEGDRpo0KBBOnLkiNV6V95n33nnnapdu7bluWTr1q2KiopSo0aNLPffjz76qNX6V99TX+9+uHv37vr666916NAhy730lWOv5+bmKiYmRq1atZKbm5sCAwM1YcIE5ebmFtrv2LFjtXr1aoWEhMjNzU033XST4uLiCrXNsWPHNHLkSAUEBMjNzU1BQUEaM2aM8vLyLHUq4pnxes9T6enpev7559W+fXvVrVtXnp6e6t27t3777TeregXP7cuWLdPLL7+sJk2aqHbt2srKypJ0+fmrT58+ql+/vurUqaMOHTronXfesdrG999/rzvuuEN16tSRt7e3+vfvr6SkpEIxl+YZrSTnExwXPfCqqL/97W9ycnLS888/r8zMTL3xxht65JFHtHnz5iLrN27cWPPmzdOYMWN033336f7775ckdejQodh9nDt3TnfccYeSkpL06KOPqlOnTjp16pS++uorHT16VI0aNSp23UuXLikqKkpdu3bVW2+9ZfnXn5EjR2rRokXq3bu3HnvsMV26dEn//ve/9csvv1j+9elq58+fV7du3XTs2DE9/vjjuuGGG/Tzzz9r0qRJSklJscvYC3/88YfuuecedejQQVOnTpWbm5v2799vlfTKysrShx9+qMGDB2vUqFE6e/asPvroI0VFRWnLli0KDQ212uann36qvLw8Pf3000pPT9cbb7yhgQMH6u6771Z8fLxefPFF7d+/X3PmzNHzzz+vjz/+2Gr9ffv26aGHHtITTzyhYcOGaeHChXrwwQcVFxennj17Fnss33//vXr37q2wsDDFxMTIyclJCxcu1N13361///vf6ty5syRp165d6tWrlxo3bqxXXnlFly5dUkxMjHx9fUvcbmfOnFGfPn00cOBADR48WJ9//rnGjBkjV1dXy43EhQsX1L17d+3fv19jx45VUFCQli9fruHDhysjI0PPPPPMdfczcOBABQUFafr06dq+fbs+/PBD+fj4aMaMGZKkf/zjH3rsscfUuXNnjR49WpLUsmVLSdITTzyhFStWaOzYsQoODtbp06e1adMmJSUlqVOnTiU+VgAAAKA0Dhw4IElq2LChJOn111/X5MmTNXDgQD322GM6efKk5syZozvvvFM7duyQt7e3Zd3Tp0+rd+/eGjRokIYMGSJfX1+dOHHCcv8+ceJEeXt76+DBg9f9R/7r3Q//9a9/VWZmpo4ePapZs2ZJkurWrSvpcoeNe++9V5s2bdLo0aPVrl077dq1S7NmzdJ//vOfQmNQb9q0SStXrtSTTz6pevXq6d1339UDDzygw4cPW9rh+PHj6ty5szIyMjR69Gi1bdtWx44d04oVK3T+/Hm5urpWyDNjSZ6n/vvf/2r16tV68MEHFRQUpLS0NH3wwQfq1q2bdu/erYCAAKttvvrqq3J1ddXzzz+v3Nxcubq6av369brnnnvk7++vZ555Rn5+fkpKStLatWstzzrfffedevfurRYtWuiVV17RhQsXNGfOHN1+++3avn27JWFamme00pxPcFAG7ComJsaQZJw8ebLI5TfddJPRrVs3y/eNGzcakox27doZubm5lvJ33nnHkGTs2rXLUjZs2DCjWbNmlu8nT540JBkxMTElim3KlCmGJGPlypWFlpnNZsMwDCM5OdmQZCxcuNBqv5KMiRMnWq3z/fffG5KMv/zlL8VuzzAMo1mzZsawYcMs31999VWjTp06xn/+8x+rdSZOnGg4Ozsbhw8fLtHxVKRZs2Zd8+9mGIZx6dIlq7+RYRjGmTNnDF9fX+PRRx+1lBW0YePGjY2MjAxL+aRJkwxJRseOHY2LFy9aygcPHmy4uroaOTk5lrJmzZoZkowvvvjCUpaZmWn4+/sbN998s6Ws4PzZuHGjYRiX271169ZGVFSU1d/g/PnzRlBQkNGzZ09L2YABAwx3d3fj0KFDlrLdu3cbzs7ORkkuJd26dTMkGW+//balLDc31wgNDTV8fHyMvLw8wzAMY/bs2YYkY8mSJZZ6eXl5RkREhFG3bl0jKyvLUn71+Vzwe7qyfQ3DMO677z6jYcOGVmV16tSxOs8KeHl5GU899dR1jwcAAAAoi4ULFxqSjO+++844efKkceTIEWPZsmVGw4YNDQ8PD+Po0aPGwYMHDWdnZ+P111+3WnfXrl2Gi4uLVXnBffb8+fOt6q5atcqQZPz666/XjOfqe+qS3A/37dvX6lmzwD/+8Q/DycnJ+Pe//21VPn/+fEOS8dNPP1nt19XV1di/f7+l7LfffjMkGXPmzLGUDR061HByciryOAqeYcr7zFjS56mcnBwjPz/fat3k5GTDzc3NmDp1qqWs4LmrRYsWxvnz5y3lly5dMoKCgoxmzZoZZ86cKfJYDMOwPCOdPn3aqm2cnJyMoUOHWspK+oxWmvMJjotXaKuoESNGyNXV1fL9jjvukHT5XwQqyhdffKGOHTvqvvvuK7SsJFNSjxkzptD2TCaTYmJiSrW95cuX64477lD9+vV16tQpyycyMlL5+fn68ccfS3A0FavgXye+/PLLYrtkOzs7W/5GZrNZ6enpunTpkm655ZYiX8d88MEH5eXlZfkeHh4uSRoyZIjVoLLh4eHKy8vTsWPHrNYPCAiw+lt5enpq6NCh2rFjh1JTU4uMcefOndq3b58efvhhnT592tK22dnZ6tGjh3788UeZzWbl5+dr3bp1GjBggG644QbL+u3atVNUVNS1msqKi4uLHn/8cct3V1dXPf744zpx4oS2bdsmSfrmm2/k5+dnNe5HrVq19Je//EXnzp3TDz/8cN39PPHEE1bf77jjDp0+fdrSZf1avL29tXnzZh0/frykhwUAAACUWmRkpBo3bqzAwEANGjRIdevW1apVq9SkSROtXLlSZrNZAwcOtHoG8vPzU+vWrQsNy+Pm5qYRI0ZYlRU8s6xdu1YXL14scVzluR9evny52rVrp7Zt21rFXfB68NVxR0ZGWt6EkS6/Iebp6Wl5rjWbzVq9erX69etX5BtbBc+RFfHMWJLnKTc3N8sYdvn5+Tp9+rRlOKWinvGGDRsmDw8Py/cdO3YoOTlZ48aNK9TjreBYUlJStHPnTg0fPlwNGjSwapuePXvqm2++sey/pM9opT2f4Jh4hbYKKCq5deUPVJLq168v6fIrihXlwIEDeuCBB8q0rouLi5o2bVpoewEBAVYXoZLYt2+ffv/9d8sYflc7ceJEsetmZmbqwoULpdpfAS8vL6uL7ZUeeughffjhh3rsscc0ceJE9ejRQ/fff7/+9Kc/WQ1KunjxYr399tvas2eP1X80g4KCCm3z6r9pQTIvMDCwyPKr/9atWrUqdK7ceOONki6Ps+fn51don/v27ZN0+T8sxcnMzFRubq4uXLig1q1bF1repk0by39EricgIKDQZCZXxnjbbbfp0KFDat26daHBXdu1aydJOnTo0HX3c63fh6en5zXXfeONNzRs2DAFBgYqLCxMffr00dChQ9WiRYvr7hcAAAAoqblz5+rGG2+Ui4uLfH191aZNG8s98L59+2QYRpH331LhCQubNGli1cFDkrp166YHHnhAsbGxmjVrlrp3764BAwbo4YcflpubW7Fxled+eN++fUpKSirxs9vV9+3S5Xv3gmedkydPKisrSyEhIdfdb1mfGQuU5HmqYEz3999/X8nJycrPz7fULXjl90pXP/cVvCZ9reMpeN5p06ZNoWXt2rXTunXrlJ2drbNnz5b4Ga205xMcEwk8OyuY8ae4JNP58+eLnBXI2dm5yPqGYVRccOVw5b9MlJfZbFbPnj01YcKEIpcXXFSL8swzzxQ5+UFJLFy40DKxwdU8PDz0448/auPGjfr6668VFxenzz77THfffbe+/fZbOTs7a8mSJRo+fLgGDBigF154QT4+PnJ2dtb06dMtF+4rFfc3teXfuqD34JtvvlloTL4CdevWLTTgrKMrT5sNHDhQd9xxh1atWqVvv/1Wb775pmbMmKGVK1eqd+/eFR0qAAAAaqjOnTsXOw642WyWyWTSv/71ryLvbQvGnCtQVMcDk8mkFStW6JdfftGaNWu0bt06Pfroo3r77bf1yy+/FNpGgfLcD5vNZrVv314zZ84scvnVnRMq6lmnPM+MpTFt2jRNnjxZjz76qF599VU1aNBATk5OGjduXJFvZhXXIaSylfZ8gmMigWdnzZo1kyTt3bu30MXs/PnzOnLkiHr16lUh+yrJa69XatmypRITEytk3wXbW7dundLT00vVC69ly5Y6d+6cIiMjS73PCRMmaMiQIaVeT5Juuummay53cnJSjx491KNHD82cOVPTpk3TX//6V23cuFGRkZFasWKFWrRooZUrV1q1fVGvEFeE/fv3yzAMq3395z//kSSrWaGuVNBd3dPT85rt27hxY3l4eFh67F1p7969JY7x+PHjys7OtuqFd3WMzZo10++//y6z2WyVBN6zZ49leUW41u/B399fTz75pJ588kmdOHFCnTp10uuvv04CDwAAAJWiZcuWMgxDQUFB5U4+3Xbbbbrtttv0+uuva+nSpXrkkUe0bNkyPfbYY8Wuc7374eLupVu2bKnffvtNPXr0KPXzZ1EaN24sT0/P6z6XlueZsUBJnqdWrFihu+66Sx999JHVuhkZGdec5PHKOCUpMTGx2FivzBFcbc+ePWrUqJHq1Kkjd3f3Ej+jVeT5BPthDDw769Gjh1xdXTVv3rxCGfu///3vunTpUoUlDQpmgs3IyChR/QceeEC//fabVq1aVWhZWXp/PfDAAzIMQ7GxsaXa3sCBA5WQkKB169YVWpaRkaFLly4Vu25wcLAiIyPL9PH39y92u+np6YXKCnqwFfRWK/iXjSuPbfPmzUpISCh2u+Vx/Phxq79VVlaWPvnkE4WGhhb5+qwkhYWFqWXLlnrrrbd07ty5QstPnjwp6fKxREVFafXq1Tp8+LBleVJSUpF/l+JcunTJalrzvLw8ffDBB2rcuLHCwsIkSX369FFqaqo+++wzq/XmzJmjunXrqlu3biXe37XUqVOn0G8hPz9fmZmZVmU+Pj4KCAiocr0QAQAAUHXdf//9cnZ2VmxsbKFnJcMwdPr06etu48yZM4XWvfqZ5WolvR+uU6dOoXrS5We3Y8eOacGCBYWWXbhwQdnZ2deN+0pOTk4aMGCA1qxZo61btxZaXnB85XlmLFCS5ylnZ+dCbbp8+fJC45MXp1OnTgoKCtLs2bMLPYsUbNff31+hoaFavHixVZ3ExER9++236tOnjyWWkj6jVcT5BPujB56d+fj4aMqUKXr55Zd155136t5771Xt2rX1888/65///Kd69eqlfv36Vci+PDw8FBwcrM8++0w33nijGjRooJCQkGLfv3/hhRe0YsUKPfjgg3r00UcVFham9PR0ffXVV5o/f746duxYqv3fdddd+vOf/6x3331X+/btU3R0tMxms/7973/rrrvu0tixY4uN46uvvtI999yj4cOHKywsTNnZ2dq1a5dWrFihgwcPluhfOyrS1KlT9eOPP6pv375q1qyZTpw4offff19NmzZV165dJUn33HOPVq5cqfvuu099+/ZVcnKy5s+fr+Dg4CKTZeV14403auTIkfr111/l6+urjz/+WGlpaVq4cGGx6zg5OenDDz9U7969ddNNN2nEiBFq0qSJjh07po0bN8rT01Nr1qyRJMXGxiouLk533HGHnnzySUtS7aabbtLvv/9eohgDAgI0Y8YMHTx4UDfeeKM+++wz7dy5U3//+98t4y6MHj1aH3zwgYYPH65t27apefPmWrFihX766SfNnj1b9erVK39j6XLy8rvvvtPMmTMVEBCgoKAgtWnTRk2bNtWf/vQndezYUXXr1tV3332nX3/9VW+//XaF7BcAAAC4npYtW+q1117TpEmTdPDgQQ0YMED16tVTcnKyVq1apdGjR+v555+/5jYWL16s999/X/fdd59atmyps2fPasGCBfL09LQkga529uzZEt0Ph4WF6bPPPtP48eN16623qm7duurXr5/+/Oc/6/PPP9cTTzyhjRs36vbbb1d+fr727Nmjzz//XOvWrSv2teHiTJs2Td9++626deum0aNHq127dkpJSdHy5cu1adMmeXt7V8gzY0mep+655x5NnTpVI0aMUJcuXbRr1y59+umnJR4v28nJSfPmzVO/fv0UGhqqESNGyN/fX3v27NEff/xhSby9+eab6t27tyIiIjRy5EhduHBBc+bMkZeXl1555RXL9kr6jFYR5xMcQGVOeYviLVmyxLjtttuMOnXqGG5ubkbbtm2N2NhYIycnx6pewXTUy5cvtypPTk42JBkLFy60lA0bNqzQ1N4///yzERYWZri6uhaaLrwop0+fNsaOHWs0adLEcHV1NZo2bWoMGzbMOHXq1DX3W6dOnSK3d+nSJePNN9802rZta7i6uhqNGzc2evfubWzbts1Sp1mzZsawYcOs1jt79qwxadIko1WrVoarq6vRqFEjo0uXLsZbb71l5OXlXfMYbGHDhg1G//79jYCAAMPV1dUICAgwBg8ebDVtudlsNqZNm2Y0a9bMcHNzM26++WZj7dq1hf4uBW345ptvWu2juL91wbTzV06j3qxZM6Nv377GunXrjA4dOljOoavXLdjmxo0brcp37Nhh3H///UbDhg0NNzc3o1mzZsbAgQONDRs2WNX74YcfLOdPixYtjPnz5xsxMTFGSS4l3bp1M2666SZj69atRkREhOHu7m40a9bMeO+99wrVTUtLM0aMGGE0atTIcHV1Ndq3b291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gJs3b25ZPzc3VzExMWrVqpXc3NwUGBioCRMmKDc3t9B+x44dq9WrVyskJERubm666aabFBcXV6htjh07ppEjRyogIEBubm4KCgrSmDFjlJeXZ6mTkZGhcePGKTAwUG5ubmrVqpVmzJghs9l83bY3DEOvvfaamjZtqtq1a+uuu+7SH3/8UaheUWPg/fvf/9aDDz6oG264wXK8zz77rC5cuFBo/eXLlys4OFju7u4KCQnRqlWrNHz4cKv2O3jwoEwmk9566y3Nnj1bLVu2lJubm3bv3q28vDxNmTJFYWFh8vLyUp06dXTHHXdo48aNVvu5chtz585VixYtVLt2bfXq1UtHjhyRYRh69dVX1bRpU3l4eKh///5KT0+/bjsBAACUFj3wAABAtXLgwAFJUsOGDSVJr7/+uiZPnqyBAwfqscce08mTJzVnzhzdeeed2rFjh7y9vS3rnj59Wr1799agQYM0ZMgQ+fr66sSJE+rVq5caN26siRMnytvbWwcPHtTKlSuvGccTTzyhFStWaOzYsQoODtbp06e1adMmJSUlqVOnTvrrX/+qzMxMHT16VLNmzZIk1a1bV5JkNpt17733atOmTRo9erTatWunXbt2adasWfrPf/6j1atXW+1r06ZNWrlypZ588knVq1dP7777rh544AEdPnzY0g7Hjx9X586dlZGRodGjR6tt27Y6duyYVqxYofPnz8vV1VXnz59Xt27ddOzYMT3++OO64YYb9PPPP2vSpElKSUm57nh9U6ZM0WuvvaY+ffqoT58+2r59u3r16mWVICzO8uXLdf78eY0ZM0YNGzbUli1bNGfOHB09elTLly+31Pv666/10EMPqX379po+fbrOnDmjkSNHqkmTJkVud+HChcrJydHo0aPl5uamBg0aKCsrSx9++KEGDx6sUaNG6ezZs/roo48UFRWlLVu2KDQ01Gobn376qfLy8vT0008rPT1db7zxhgYOHKi7775b8fHxevHFF7V//37NmTNHzz//vD7++OPrHi8AAEBpkMADAABVWmZmpk6dOqWcnBz99NNPmjp1qjw8PHTPPffo0KFDiomJ0WuvvWbpTSdJ999/v26++Wa9//77VuWpqamaP3++Hn/8cUvZ6tWrdebMGX377beWV3Ul6bXXXrtmXF9//bVGjRqlt99+21I2YcIEy//v2bOnmjRpojNnzmjI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Zq6V/teT7cr1DMPQO++8Y1UvICBAISEh+uSTT3Tu3DlL+Q8//KBdu3Zddz/X2t/mzZtLfH8KAABQ2WzaA+/UqVPKz8+Xr6+vVbmvr6/27NlTom28+OKLCggIsEoCRkdH6/7771dQUJAOHDigl156Sb1791ZCQkKRrzLk5uZa3SxnZWWV8YikE2eLfyAvSz0A1RPXCsAxtGzZUq+99pomTZqkgwcPasCAAapXr56Sk5O1atUqjR49Ws8///w1t7F48WK9//77uu+++9SyZUudPXtWCxYskKenp/r06VPkOmfPnlXTpk31pz/9SR07dlTdunX13Xff6ddff7WalTYsLMwy3Mitt96qunXrql+/fvrzn/+szz//XE888YQ2btyo22+/Xfn5+dqzZ48+//xzrVu3rtjXhoszbdo0ffvtt+rWrZtGjx6tdu3aKSUlRcuXL9emTZvk7e2tF154QV999ZXuueceDR8+XGFhYcrOztauXbu0YsUKHTx4UI0aNSpy+40bN9bzzz+v6dOn65577lGfPn20Y8cO/etf/yp2nQJt27ZVy5Yt9fzzz+vYsWPy9PTUF198UWTPvWnTpql///66/fbbNWLECJ05c0bvvfeeQkJCrJJ613LPPfdo5cqVuu+++9S3b18lJydr/vz5Cg4OLvE2AAAAKlOlTGJRVn/729+0bNkyxcfHy93d3VI+aNAgy/9v3769OnTooJYtWyo+Pl49evQotJ3p06crNja2QmLyqed+/UqlqAegeuJaATiOiRMn6sYbb9SsWbMs9wOBgYHq1auX7r333uuu361bN23ZskXLli1TWlqavLy81LlzZ3366afFTpBQu3ZtPfnkk/r2228tM+G2atVK77//vsaMGWOp9+STT2rnzp1auHChZs2apWbNmqlfv35ycnLS6tWrNWvWLH3yySdatWqVateurRYtWuiZZ54p0+vATZo00ebNmzV58mR9+umnysrKUpMmTdS7d2/Vrl3bEvcPP/ygadOmafny5frkk0/k6empG2+8UbGxsVYzsRbltddek7u7u+bPn6+NGzcqPDxc3377rfr27XvN9WrVqqU1a9boL3/5i6ZPny53d3fdd999Gjt2rDp27GhVt1+/fvrnP/+pV155RRMnTlTr1q21aNEiLV68WH/88UeJ2mL48OFKTU3VBx98oHXr1ik4OFhLlizR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z9/fX/Pnz9cXX3yhL774QoGBgerevbu2b99u79Dszmw2a9y4cbr99tsVEhJSbD1bXg9dyr2FKmjixImaMWPGNeskJSWpbdu2lRSR/ZW0TcrqyjHy2rdvL39/f/Xo0UMHDhxQy5Yty7xdVE0RERGKiIiwfO/SpYvatWunDz74QK+++qodIwMAAAAqH/fHcARt2rRRmzZtLN+7dOmiAwcOaNasWfrHP/5hx8js76mnnlJiYqI2bdpktxhqZALvueee0/Dhw69Zp0WLFmXatp+fnyQpLS1N/v7+lvK0tDSFhoaWaZuVoaRt4ufnV2jg1UuXLik9Pd1y7CURHh4uSdq/f3+VSuA1atRIzs7OSktLsypPS0sr9vj9/PxKVb+qKUubXK1WrVq6+eabtX//fluEWCUUd554enrKw8PDTlEBAICahvvd8uP+2D64n7aNzp072zVp5QjGjh1rmcCzadOm16xry+thjXyFtnHjxmrbtu01P66urmXadlBQkPz8/LRhwwZLWVZWljZv3mz1LyqOpqRtEhERoYyMDG3bts2y7vfffy+z2WxJypXEzp07JckqyVkVuLq6KiwszOrvazabtWHDhmL/vhEREVb1JWn9+vUOfT6URlna5Gr5+fnatWtXlTsfKlJ1P08AAEDVwP1u+XF/bB+ch7axc+fOGnseGoahsWPHatWqVfr+++8VFBR03XVseh6WexqMau7QoUPGjh07jNjYWKNu3brGjh07jB07dhhnz5611GnTpo2xcuVKy/e//e1vhre3t/Hll18av//+u9G/f38jKCjIuHDhgj0OocJFR0cbN998s7F582Zj06ZNRuvWrY3Bgwdblh89etRo06aNsXnzZsMwDGP//v3G1KlTja1btxrJycnGl19+abRo0cK488477XUI5bJs2TLDzc3NWLRokbF7925j9OjRhre3t5GammoYhmH8+c9/NiZOnGip/9NPPxkuLi7GW2+9ZSQlJRkxMTFGrVq1jF27dtnrECpcadskNjbWWLdunXHgwAFj27ZtxqBBgwx3d3fjjz/+sNchVLizZ89arheSjJkzZxo7duwwDh06ZBiGYUycONH485//bKn/3//+16hdu7bxwgsvGElJScbcuXMNZ2dnIy4uzl6HAAAAaijud8uP++Py4366/ErbhrNmzTJWr15t7Nu3z9i1a5fxzDPPGE5OTsZ3331nr0OwqzFjxhheXl5GfHy8kZKSYvmcP3/eUqcyr4ck8K5j2LBhhqRCn40bN1rqSDIWLlxo+W42m43Jkycbvr6+hpubm9GjRw9j7969lR+8jZw+fdoYPHiwUbduXcPT09MYMWKEVUIzOTnZqo0OHz5s3HnnnUaDBg0MNzc3o1WrVsYLL7xgZGZm2ukIym/OnDnGDTfcYLi6uhqdO3c2fvnlF8uybt26GcOGDbOq//nnnxs33nij4erqatx0003G119/XckR215p2mTcuHGWur6+vkafPn2M7du32yFq2ymYgv3qT0E7DBs2zOjWrVuhdUJDQw1XV1ejRYsWVtcVAACAysT9bvlxf1w+3E+XX2nbcMaMGUbLli0Nd3d3o0GDBkb37t2N77//3j7BO4Ci2u7q/E9lXg9N/x8UAAAAAAAAAAdUI8fAAwAAAAAAAKoKEngAAAAAAACAAyOBBwAAAAAAADgwEngAAAAAAACAAyOBBwAAAAAAADgwEngAAAAAAACAAyOBBwAAAAAAADgwEngAAAAAAACAAyOBBwAAAAAAqo1FixbJ29vb3mEAFYoEHgAAAAAAAODASOABAAAAAAAADowEHgAAAAAAqHQrVqxQ+/bt5eHhoYYNGyoy8v/au5dQaNs4juM/4y2iLJXkkETORUpZaTQTjY1sbIiF5BArpTRRJAtD5LQRxUYsSCmMRLOYBZFzs5kViYWckhnmXSgl76NnwTz32/P91L267//9v67tr+tQrIeHB0nS5OSkMjIyFBYWppiYGDU1Nb3XORwOZWVlKTIyUnFxcWpoaND9/f2XvRYXF5Wbm6vw8HAlJSWpq6tLfr//R+cHfCcCPAAAAAAAEFQXFxeqrKxUbW2tTk5OtLm5qfLycgUCAY2NjamxsVF1dXU6ODjQ0tKSkpOT32tNJpOGhoZ0dHSk6elpbWxsqK2t7Ze9tre3VVVVpZaWFh0fH2tiYkJTU1Pq6ekJxlSBbxESCAQCf3oQAAAAAADg77G7u6u8vDx5vV4lJCR8eBcbG6uamhp1d3f/1r/m5+dVX1+v6+trSW+XWLS2turm5kaSVFxcLLPZrPb29veamZkZtbW16fz8/HsmBPywf/70AAAAAAAAwN8lJydHZrNZWVlZslqtslgsqqiokM/n0/n5ucxm8y9r19fX1dvbq9PTU93e3srv9+vp6UmPj4+KiIj49P3+/r5cLteHFXcvLy9f1gBGwxZaAAAAAAAQVKGhoVpbW9PKyorS09M1PDys1NRUXV5eflnn9Xpls9mUnZ2thYUF7ezsaGRkRJL0/Pz8nzX39/fq6urS3t7e+3NwcCCPx6Pw8PBvnxvwE1iBBwAAAAAAgi4kJESFhYUqLCyU3W5XQkKC1tbWlJiYKKfTqaKiok81Ozs7en19VX9/v0ymtzVJc3NzX/bJzc3V2dnZh3P0gP8bAjwAAAAAABBUbrdbTqdTFotF0dHRcrvdurq6Ulpamjo7O1VfX6/o6GiVlJTo7u5OLpdLzc3NSk5Ols/n0/DwsMrKyuRyuTQ+Pv5lL7vdLpvNpvj4eFVUVMhkMml/f1+Hh4e/fc4e8KexhRYAAAAAAARVVFSUtra2VFpaqpSUFHV0dKi/v18lJSWqrq7W4OCgRkdHlZGRIZvNJo/HI+nt7DyHw6G+vj5lZmZqdnZWvb29X/ayWq1aXl7W6uqq8vPzVVBQoIGBgU+XZwBGxi20AAAAAAAAgIGxAg8AAAAAAAAwMAI8AAAAAAAAwMAI8AAAAAAAAAADI8ADAAAAAAAADIwADwAAAAAAADAwAjwAAAAAAADAwAjwAAAAAAAAAAMjwAMAAAAAAAAMjAAPAAAAAAAAMDACPAAAAAAAAMDACPAAAAAAAAAAAyPAAwAAAAAAAAzsX9aDTaoI3n/1AAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 1300x400 with 3 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# (a) Unit circle\n",
|
||
"n = 24\n",
|
||
"theta = np.linspace(0, 2*np.pi, n, endpoint=False)\n",
|
||
"circle = np.column_stack([np.cos(theta), np.sin(theta)]).tolist()\n",
|
||
"diag_circle = opt.persistent_homology(circle, 1, 2.5)\n",
|
||
"\n",
|
||
"# Essential H1 generators (death == +inf) on a sampled circle should equal 1.\n",
|
||
"h1 = [p for p in diag_circle if p['dim'] == 1]\n",
|
||
"h1_long = sorted(h1, key=lambda p: -((np.inf if not np.isfinite(p['death']) else p['death']) - p['birth']))\n",
|
||
"print(f\"#H1 features detected on the circle: {len(h1)}\")\n",
|
||
"print(f\"longest H1 lifetime: birth={h1_long[0]['birth']:.4f} death={h1_long[0]['death']:.4f}\")\n",
|
||
"assert len(h1_long) >= 1, \"expected at least one H1 loop on the circle\"\n",
|
||
"\n",
|
||
"fig, axes = plt.subplots(1, 3, figsize=(13, 4))\n",
|
||
"pts = np.array(circle)\n",
|
||
"axes[0].scatter(pts[:, 0], pts[:, 1], c='tab:blue'); axes[0].set_aspect('equal')\n",
|
||
"axes[0].set_title('Unit circle — sampled points')\n",
|
||
"plot_diagram(axes[1], diag_circle, 'Persistence diagram')\n",
|
||
"plot_barcode(axes[2], diag_circle, 'Persistence barcode')\n",
|
||
"plt.tight_layout(); plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "041e4b7c",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:13.881084Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:13.880529Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:17.446400Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:17.444241Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"long-lived H0 components (lifetime > 1.0): 2\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABQkAAAGGCAYAAADYVwfrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABzCElEQVR4nO3de1yUZf7/8feAAoKConJQEVECz6KUiuapMPNUtNDBfq2HzLZWd3PdanO3zUNt1LaarpVWfs221hXUtLLSzFOa51PrccgWDymgpoKioDL37w+XWUdAAWHugXk9H4951Nxz3ff9uWecuZn3XPd1WQzDMAQAAAAAAADAbXmYXQAAAAAAAAAAcxESAgAAAAAAAG6OkBAAAAAAAABwc4SEAAAAAAAAgJsjJAQAAAAAAADcHCEhAAAAAAAA4OYICQEAAAAAAAA3R0gIAAAAAAAAuDlCQgAAAAAAAMDNERICAAC4AIvFookTJ5pdhktq1qyZhg8fbr+/Zs0aWSwWrVmzxrSaAADF43x29bw1aNAgs8uoMBMnTpTFYjG7DDgBISEAAHBLc+fOlcVisd98fHwUFRWlMWPGKCsry+zySmXevHmaNm2a2WUAAEzE+QxARalhdgEAAABmmjx5siIiIpSXl6f169dr5syZ+vLLL7Vnzx75+vo6rY6LFy+qRo2y/Wk2b9487dmzR2PHjq2colxUz549dfHiRXl5eZldCgC4DM5nAG4VISEAAHBr/fv31+233y5JeuKJJ1S/fn1NnTpVn376qYYMGXJL275w4UKpv5j5+Pjc0r7ciYeHhynP15UrV2Sz2QgnAbgkzmfuJS8vT15eXvLw4AJRVBz+NQEAAFzjrrvukiSlp6fbl3388ceKjY1VrVq1FBgYqEceeURHjx51WK93795q27attm/frp49e8rX11d//OMfJUnbtm1Tv3791KBBA9WqVUsRERF6/PHHHda/fgync+fOaezYsWrWrJm8vb0VFBSkvn37aseOHfb9ffHFFzp8+LD9ErNmzZrZ18/Pz9eECRMUGRkpb29vhYWF6fnnn1d+fn6R/Y4ZM0ZLlixR27Zt5e3trTZt2mjZsmVFnptjx45p5MiRatSokby9vRUREaGnn35aly5dsrc5e/asxo4dq7CwMHl7eysyMlKvv/66bDbbTZ97wzD0yiuvqEmTJvL19VWfPn20d+/eIu2KG5Nw3bp1evDBB9W0aVP78f7ud7/TxYsXi6y/YMECtW7dWj4+Pmrbtq0WL16s4cOHOzx/hw4dksVi0d/+9jdNmzZNLVq0kLe3t/bt26dLly7ppZdeUmxsrAICAuTn56cePXpo9erVDvu5dhtvv/22mjdvLl9fX91zzz06evSoDMPQyy+/rCZNmqhWrVq6//77dfr06Zs+TwBQGpzPzDufFfr6668VExMjHx8ftW7dWp988onD46dPn9azzz6rdu3aqXbt2vL391f//v31/fffO7QrPO/Nnz9fL774oho3bixfX1/l5ORIkjZv3qwBAwaoXr168vPzU/v27TV9+nSHbaxatUo9evSQn5+f6tatq/vvv1/79+8vUvP69et1xx13yMfHRy1atNC7775b4vGV5t8TqhZ6EgIAAFzjxx9/lCTVr19fkvSXv/xFf/7zn/XQQw/piSee0MmTJzVjxgz17NlTO3fuVN26de3r/vzzz+rfv78eeeQRPfbYYwoODtaJEyd0zz33qGHDhnrhhRdUt25dHTp0qMgXhes99dRTWrhwocaMGaPWrVvr559/1vr167V//3516tRJf/rTn5Sdna2ffvpJb775piSpdu3akiSbzab77rtP69ev15NPPqlWrVpp9+7devPNN5WWlqYlS5Y47Gv9+vX65JNP9Otf/1p16tTR3//+dyUmJurIkSP25+H48ePq3Lmzzp49qyeffFItW7bUsWPHtHDhQl24cEFeXl66cOGCevXqpWPHjulXv/qVmjZtqg0bNmj8+PHKyMi46XhTL730kl555RUNGDBAAwYM0I4dO3TPPfc4fGkryYIFC3ThwgU9/fTTql+/vrZs2aIZM2bop59+0oIFC+ztvvjiCz388MNq166dkpOTdebMGY0cOVKNGzcudrsffPCB8vLy9OSTT8rb21uBgYHKycnR7NmzNWTIEI0aNUrnzp3T//3f/6lfv37asmWLYmJiHLbxz3/+U5cuXdJvfvMbnT59Wn/961/10EMP6a677tKaNWv0hz/8QQcPHtSMGTP07LPPas6cOTc9XgC4Gc5n5p3PJOmHH37Qww8/rKeeekrDhg3TBx98oAcffFDLli1T3759JUn/+c9/tGTJEj344IOKiIhQVlaW3n33XfXq1Uv79u1To0aNHLb58ssvy8vLS88++6zy8/Pl5eWlFStWaNCgQQoNDdUzzzyjkJAQ7d+/X0uXLtUzzzwjSfrmm2/Uv39/NW/eXBMnTtTFixc1Y8YMde/eXTt27LCHsrt377a/xhMnTtSVK1c0YcIEBQcHFzm+svx7QhViAAAAuKEPPvjAkGR88803xsmTJ42jR48a8+fPN+rXr2/UqlXL+Omnn4xDhw4Znp6exl/+8heHdXfv3m3UqFHDYXmvXr0MScasWbMc2i5evNiQZGzduvWG9UgyJkyYYL8fEBBgjB49+obrDBw40AgPDy+y/KOPPjI8PDyMdevWOSyfNWuWIcn47rvvHPbr5eVlHDx40L7s+++/NyQZM2bMsC8bOnSo4eHhUexx2Gw2wzAM4+WXXzb8/PyMtLQ0h8dfeOEFw9PT0zhy5EiJx3LixAnDy8vLGDhwoH17hmEYf/zjHw1JxrBhw+zLVq9ebUgyVq9ebV924cKFIttMTk42LBaLcfjwYfuydu3aGU2aNDHOnTtnX7ZmzRpDksNzmZ6ebkgy/P39jRMnTjhs98qVK0Z+fr7DsjNnzhjBwcHG448/XmQbDRs2NM6ePWtfPn78eEOS0aFDB+Py5cv25UOGDDG8vLyMvLy8Ep8nALge57P/7dcVzmeGYRjh4eGGJGPRokX2ZdnZ2UZoaKjRsWNH+7K8vDyjoKDAYd309HTD29vbmDx5sn1Z4XmvefPmDue7K1euGBEREUZ4eLhx5syZYo/FMAwjJibGCAoKMn7++WeH58bDw8MYOnSofVlCQoLh4+PjcN7ct2+f4enpaVwbH5Xl3xOqFi43BgAAbi0+Pl4NGzZUWFiYHnnkEdWuXVuLFy9W48aN9cknn8hms+mhhx7SqVOn7LeQkBDddtttRS4v9fb21ogRIxyWFf6SvnTpUl2+fLnUddWtW1ebN2/W8ePHy3xMCxYsUKtWrdSyZUuHugsvPbu+7vj4eLVo0cJ+v3379vL399d//vMfSVd7cixZskSDBw+2j3d1LYvFYt9vjx49VK9ePYf9xsfHq6CgQN9++22JNX/zzTf23naF25NU6kHsa9WqZf//3NxcnTp1St26dZNhGNq5c6ekq71Hdu/eraFDh9p7qUhSr1691K5du2K3m5iYqIYNGzos8/T0tI9LaLPZdPr0aV25ckW33367/fK5az344IMKCAiw3+/SpYsk6bHHHnMY3L9Lly66dOmSjh07VqpjBoBrcT5zjfNZoUaNGumBBx6w3/f399fQoUO1c+dOZWZmSrr6PBeOKVhQUKCff/5ZtWvXVnR0dLHnk2HDhjmc73bu3Kn09HSNHTu2SM+9wmPJyMjQrl27NHz4cAUGBjo8N3379tWXX35p3//y5cuVkJCgpk2b2tu1atVK/fr1c9h2Wf89oergcmMAAODW3n77bUVFRalGjRoKDg5WdHS0/Q/2H374QYZh6Lbbbit23Zo1azrcb9y4cZFJLXr16qXExERNmjRJb775pnr37q2EhAQ9+uij8vb2LrGuv/71rxo2bJjCwsIUGxurAQMGaOjQoWrevPlNj+mHH37Q/v37i4RbhU6cOOFw/9ovA4Xq1aunM2fOSJJOnjypnJwctW3b9qb7/fe//13q/V7r8OHDklTkuW7YsKHq1at3w/1K0pEjR/TSSy/ps88+s9ddKDs722EfkZGRRdaPjIws9gtZREREsfv78MMPNWXKFB04cMDhy3Jx7a9/fgsDw7CwsGKXX18/AJQG5zPXOJ8VioyMdPjRS5KioqIkXR2zNiQkRDabTdOnT9c777yj9PR0FRQU2NsWXh59revPMYWXlN/oeArPfdHR0UUea9WqlZYvX67c3FydO3dOFy9eLPbfSHR0tD1MlMr+7wlVByEhAABwa507dy62N4F0tceBxWLRV199JU9PzyKPX9sbTXLszVbIYrFo4cKF2rRpkz7//HMtX75cjz/+uKZMmaJNmzYV2Uahhx56SD169NDixYv19ddf64033tDrr7+uTz75RP3797/hMdlsNrVr105Tp04t9vHrw6nijk26OpFIWdhsNvXt21fPP/98sY8XfjmqaAUFBerbt69Onz6tP/zhD2rZsqX8/Px07NgxDR8+vEyDzF+vuNf0448/1vDhw5WQkKDnnntOQUFB8vT0VHJysv0L27VKen4r6nkHAInzmVT1zmevvvqq/vznP+vxxx/Xyy+/rMDAQHl4eGjs2LHFnruKe13MUNZ/T6g6CAkBAABK0KJFCxmGoYiIiFv+QtC1a1d17dpVf/nLXzRv3jz9v//3/zR//nw98cQTJa4TGhqqX//61/r1r3+tEydOqFOnTvrLX/5i/1J1fQ+Fa+v+/vvvdffdd5fYpiwaNmwof39/7dmz54btWrRoofPnzys+Pr7M+wgPD5d0tXfCtb1LTp48edOedbt371ZaWpo+/PBDDR061L58xYoVxe7j4MGDRbZR3LKSLFy4UM2bN9cnn3zi8PxOmDCh1NsAAGfifHaVM85nhQ4ePCjDMBzqTktLkyT7RCELFy5Unz599H//938O6549e1YNGjS46T4KL63es2dPibUWnvusVmuRxw4cOKAGDRrIz89PPj4+qlWrln744Yci7a5ftyL/PcG1MCYhAABACX7xi1/I09NTkyZNKtILwTAM/fzzzzfdxpkzZ4qsWzj7bX5+frHrFBQU2C+RLRQUFKRGjRo5rOPn51eknXS118axY8f0/vvvF3ns4sWLys3NvWnd1/Lw8FBCQoI+//xzbdu2rcjjhcf30EMPaePGjVq+fHmRNmfPntWVK1dK3Ed8fLxq1qypGTNmODxfpZlBsrAXw7XrGYah6dOnO7Rr1KiR2rZtq3/84x86f/68ffnatWu1e/fum+7nRvvbvHmzNm7cWOptAIAzcT67yhnns0LHjx/X4sWL7fdzcnL0j3/8QzExMQoJCZF09Xxy/XO6YMGCUo9N26lTJ0VERGjatGk6e/ZssccSGhqqmJgYffjhhw5t9uzZo6+//loDBgyw19KvXz8tWbJER44csbfbv39/keehIv49wTXRkxAAAKAELVq00CuvvKLx48fr0KFDSkhIUJ06dZSenq7FixfrySef1LPPPnvDbXz44Yd655139MADD6hFixY6d+6c3n//ffn7+9v/ML/euXPn1KRJEyUlJalDhw6qXbu2vvnmG23dulVTpkyxt4uNjVVKSorGjRunO+64Q7Vr19bgwYP1y1/+UqmpqXrqqae0evVqde/eXQUFBTpw4IBSU1O1fPnyEi9JK8mrr76qr7/+Wr169dKTTz6pVq1aKSMjQwsWLND69etVt25dPffcc/rss880aNAgDR8+XLGxscrNzdXu3bu1cOFCHTp0qMSeEQ0bNtSzzz6r5ORkDRo0SAMGDNDOnTv11Vdf3bQ3RcuWLdWiRQs9++yzOnbsmPz9/bVo0aJieyC++uqruv/++9W9e3eNGDFCZ86c0VtvvaW2bds6BIc3MmjQIH3yySd64IEHNHDgQKWnp2vWrFlq3bp1qbcBAM7E+ex/Kvt8VigqKkojR47U1q1bFRwcrDlz5igrK0sffPCBvc2gQYM0efJkjRgxQt26ddPu3bv1z3/+s1TjNUpXQ8+ZM2dq8ODBiomJ0YgRIxQaGqoDBw5o79699nDvjTfeUP/+/RUXF6eRI0fq4sWLmjFjhgICAjRx4kT79iZNmqRly5apR48e+vWvf60rV65oxowZatOmjf7973/b21XEvye4KCfNogwAAOBSPvjgA0OSsXXr1pu2XbRokXHnnXcafn5+hp+fn9GyZUtj9OjRhtVqtbfp1auX0aZNmyLr7tixwxgyZIjRtGlTw9vb2wgKCjIGDRpkbNu2zaGdJGPChAmGYRhGfn6+8dxzzxkdOnQw6tSpY/j5+RkdOnQw3nnnHYd1zp8/bzz66KNG3bp1DUlGeHi4/bFLly4Zr7/+utGmTRvD29vbqFevnhEbG2tMmjTJyM7Odtjv6NGji9QdHh5uDBs2zGHZ4cOHjaFDhxoNGzY0vL29jebNmxujR4828vPz7W3OnTtnjB8/3oiMjDS8vLyMBg0aGN26dTP+9re/GZcuXbrh81xQUGBMmjTJCA0NNWrVqmX07t3b2LNnT5FaVq9ebUgyVq9ebV+2b98+Iz4+3qhdu7bRoEEDY9SoUcb3339vSDI++OADh/3Mnz/faNmypeHt7W20bdvW+Oyzz4zExESjZcuW9jbp6emGJOONN94oUqfNZjNeffVVIzw83PD29jY6duxoLF261Bg2bJjDa1DSNgrrX7BggcPysvybBIBCnM/+t19XOZ+Fh4cbAwcONJYvX260b9/e8Pb2Nlq2bFnkcz8vL8/4/e9/bz/vde/e3di4caPRq1cvo1evXvZ2JZ03Cq1fv97o27ev/Tlu3769MWPGDIc233zzjdG9e3ejVq1ahr+/vzF48GBj3759Rba1du1aIzY21vDy8jKaN29uzJo1y5gwYYJRXHxUmn9PqFoshsHIyAAAAHBvMTExatiwYZFxDAEAANwFYxICAADAbVy+fLnIWFJr1qzR999/r969e5tTFAAAgAugJyEAAADcxqFDhxQfH6/HHntMjRo10oEDBzRr1iwFBARoz549ql+/vtklAgAAmIKJSwAAAOA26tWrp9jYWM2ePVsnT56Un5+fBg4cqNdee42AEAAAuDV6EgIAAAAAAABujjEJAQAAAAAAADdHSAgAAAAAAAC4OcYkBACgmrLZbDp+/Ljq1Kkji8VidjkAcEsMw9C5c+fUqFEjeXjQ18HZOKcAQNVV2nMoISEAANXU8ePHFRYWZnYZAFChjh49qiZNmphdhtvhnAIAVd/NzqGEhAAAVFN16tSRdPWPAX9/f5OrAYBbk5OTo7CwMPtnG5yLcwoAVF2lPYcSEgIAUE0VXg7m7+/PFzoA1QaXupqDcwoAVH03O4cymAcAAAAAAADg5ggJAQAAAAAAADdHSAgAAAAAAAC4OUJCAAAAAAAAwM0REgIAAAAAAABujpAQAAAAAAAAcHM1zC4AAAC4FsMw9O+jZxVxKl1n5qfoQkaGtHVrySs0aSKdOSM1aCBLzRqqc9dd8u/dW1cOHVJAQoI8PPhNEnBVNptN2UuWyLNZM51bvVp5+/dLskgB/rq0Z6909qyUnX21saenVFAg+flJubmOGwrwl3z9pMaNpT17pBYtZLFY5OXlpUZz/k95X32lOvfdp/y9e2UYhiwWi2q1ayeLxeLsQwYAACUgJAQAAA4W7zympX+bo+d2/Kt0K/z009X/5ubKkJRz8EflvPe+JCnv3/9W6MSJlVIngFuXNWmSzqaklq5xQcHV/14fEEpSds7VW0bG1ft798qQlC8p/Y7O0uXLyl7yqS5s3mxfpdFfX1fAfffdUv0AAKDi8NM+AACwu1Jg0/Tl+/XYni8qZHtnFyyULS+vQrYFoGLZ8vJ0dsHCyt/R5cuS5BAQStLJv8+QceVK5e8fAACUCiEhAACw++z742qxe6NCL+VUzAYLCpT12msVsy0AFSorOVmy2Uzb/+WfflLOl1+atn8AAOCIy40BAICk//UinLDnCxmSKmqksLMLFir4hRfk4eNTQVsEcKuc1otQ0oVateR78WKxj538+wz5DxggSw2+lgAAkJ6YpCunThX7WI0GDRSxqHLP3fQkBAAAkhx7EVboVAL0JgRcjrN6Eeb5eGvZwAHKDAku9nF6EwIA8D95e/fqSlZW8bcSwsOKREgIAAAcxiI0KmH7jE0IuA5n9iL0yctXj7XfKijrRIltGJsQAICb8PBQjQYNKn83lb4HAADg8iqtF2EhehMCLsMZvQiPN2qk3e3byZDU8ORJeRgl//xAb0IAgLtLT0zSD716Oy708Lh6q1FDPq1aVfqlxhIhIQAAbq+yexEWojchYD5n9CI83qiRNtzZXTn+/jIspfvZgd6EAAB3lme16kpW1v8W1KihVvv2Xr3t2e2UgFAiJAQAwO1tPXRG/gf3VV4vwkIFBTozP6Uy9wDgJs7MT6nUXoSFAWHo8eOK+27DDXsQXuvyTz/pwvYdlVYXAACuKj0xSbr+hzKTfjhjGjEAANxcp/C6eurXCToWXUMNFv1TNbLPFBsWlveXRUvt2vJu1Uq1WkYrICnxVkoFcIsCkhJ1+dhPurD/gPL375dycyts26ca1C9VQOgRGCgPLy/VCGsij5pe8gpvKt/YWNXqGFNhtQAAUFXkWa1ml2BHSAgAgJvzruGpgbHhUuxo6fnRZpcDoBLVqF1bIX/6U6Vs+8qVK/LYvFldu3aVp6dnpewDAIBqx4WG2+ByYwAAAADllpaWpuPHj6tGjRrq3r07ASEAAFUUISEAAACAcklLS1NKSoq2bt1qdikAAFQ56YlJZpfggJAQAAAnmDlzptq3by9/f3/5+/srLi5OX3311Q3XWbBggVq2bCkfHx+1a9dOX375pZOqBYCbKwwIo6KiNGjQILPLAQCgysnbu9fsEhwQEgIA4ARNmjTRa6+9pu3bt2vbtm266667dP/992tvCX8YbNiwQUOGDNHIkSO1c+dOJSQkKCEhQXv27HFy5QBQ1LUBYVJSEpcYAwBQDVgMo4RpxwAAQKUKDAzUG2+8oZEjRxZ57OGHH1Zubq6WLl1qX9a1a1fFxMRo1qxZpdp+Tk6OAgIClJ2dLX9//wqrGwCOHTumbdu2adCgQU4LCPlMMxfPPwBUrAMxHWXk5ZX4eKsD+ytsX6X9DKcnIQAATlZQUKD58+crNzdXcXFxxbbZuHGj4uPjHZb169dPGzdudEaJAFCso0ePqqCgQI0bN9b9999PD0IAAMrpRgGhWWqYXQAAAO5i9+7diouLU15enmrXrq3FixerdevWxbbNzMxUcHCww7Lg4GBlZmaWuP38/Hzl5+fb7+fk5FRM4QCg/11ifPfdd6tbt25mlwMAACoYPQkBAHCS6Oho7dq1S5s3b9bTTz+tYcOGad++fRW2/eTkZAUEBNhvYWFhFbZtAO6tMCCMjo5Wly5dzC4HAABUAkJCAACcxMvLS5GRkYqNjVVycrI6dOig6dOnF9s2JCREWVlZDsuysrIUEhJS4vbHjx+v7Oxs++3o0aMVWj8A93RtQJiYmMglxgAA3KL0xCSzSygWISEAACax2WwOlwdfKy4uTitXrnRYtmLFihLHMJQkb29v+fv7O9wA4FYdOXKEgBAAgAqUt3ev2SUUizEJAQBwgvHjx6t///5q2rSpzp07p3nz5mnNmjVavny5JGno0KFq3LixkpOTJUnPPPOMevXqpSlTpmjgwIGaP3++tm3bpvfee8/MwwDgRnJzc+Xn56e7775bhmHIw4P+BQAAVGec6QEAcIITJ05o6NChio6O1t13362tW7dq+fLl6tu3r6SrPXUyMjLs7bt166Z58+bpvffeU4cOHbRw4UItWbJEbdu2NesQALiRtLQ0TZ8+XUeOHJHFYiEgBADADdCTEAAAJ/i///u/Gz6+Zs2aIssefPBBPfjgg5VUEQAUr3AMwqioKDVu3NjscgAAgJMQEgIAALsCm6Et6ad14lyegur4qHNEoDw9LGaXBcBJrg0Ik5KSGIMQAAA3QkgIAAAkScv2ZGjS5/uUkZ1nXxYa4KMJg1vr3rahJlYGwBlsNpu++eYbAkIAACrRgZiOZpdQIkJCAACgZXsy9PTHO2RctzwzO09Pf7xDMx/rRFAIVGOFE5MMHTpUtWrVIiAEAKASpCcmycjLu3lDkzACMQAAbq7AZmjS5/uKBISS7Msmfb5PBbbiWgCo6tLS0jR79mxdvHhRtWvXJiAEAKCS5O3da3YJN0RICACAm9uSftrhEuPrGZIysvO0Jf2084oC4BSFYxAGBATIy8vL7HIAAICJCAkBAHBzJ86V7pKH0rYDUDUUBoTR0dFKTEykByEAAG6OkBAAADcXVMenQtsBcH05OTlKTU0lIAQAAHZMXAIAgJvrHBGo0AAfZWbnFTsuoUVSSICPOkcEOrs0AJXE399fjz76qMLDwwkIAQBwAlee1bgQPQkBAHBznh4WTRjcWtLVQPBahfcnDG4tT4/rHwVQ1aSlpWndunWSpObNmxMQAgDgJK48q3EhQkIAAKB724Zq5mOdFBLgeElxSICPZj7WSfe2DTWpMgAVpXAMwuPHj8tms5ldDgAAcDFcbgwAACRdDQr7tg7RlvTTOnEuT0F1rl5iTA9CoOorDAijoqKUlJQkDw/6CgAAAEeEhAAAwM7Tw6K4FvXNLgNABTp8+LBDQMglxgAAoDiEhAAAAEA1Fhoaqp49e+rOO+8kIAQAwATpiUlml1AqXGcAAAAAVEM//PCDTpw4IS8vL/Xq1YuAEAAAk+RZrWaXUCqEhAAAAEA1k5aWpvnz52vz5s1mlwIAAK5cMbuCUiEkBAAAAKqRwklKoqOjNWDAALPLAQAAVQQhIQAAAFBNXBsQJiYmcokxAAAoNSYuAQAAAKoJb29vtWvXToMHDyYgBADABVSVSUskQkIAAACgyjt27JhCQ0MVHh6u8PBws8sBAAD/VVUmLZG43BgAAACo0tLS0jRnzhxt3brV7FIAAMD1qsikJRIhIQAAAFBlFY5BGBUVpdtvv93scgAAQBVGSAgAAABUQdcGhElJSYxBCAAAbgkhIQAAAFAFHTx4kIAQAABUGCYuAQAAAKqQixcvqlatWurfv79sNhsBIQAAqBD0JAQAAACqiLS0NE2bNk3Hjh2TxWIhIAQAABWGkBAAAACoAgrHIGzRooVCQkLMLgcAAFQzhIQAAACAiysMCKOjo5WYmEgPQgAAUOEICQEAAAAXVlBQoOXLlxMQAgCASsXEJQAAAICLMgxDnp6eGjZsmPz8/AgIAQCoQg7EdDS7hDKhJyEAAADggqxWq+bOnav8/Hz5+/sTEAIAUMUYeXlml1AmhIQAAACAi7FarUpNTZWvr69q1ODiHwAAUPkICQEAAAAXUhgQRkVFKSkpiR6EAADAKQgJAQAAABdx9uxZLViwgIAQAAA4HSEhAABOkJycrDvuuEN16tRRUFCQEhISZLVab7jO3LlzZbFYHG4+Pj5OqhiAGerWrauHHnqIgBAAADgdISEAAE6wdu1ajR49Wps2bdKKFSt0+fJl3XPPPcrNzb3hev7+/srIyLDfDh8+7KSKAThTWlqaNm/eLEmKiooiIAQAAE7HKMgAADjBsmXLHO7PnTtXQUFB2r59u3r27FniehaLRSEhIZVdHgATpaWlKSUlRdHR0ercubMsFovZJQEAADdET0IAAEyQnZ0tSQoMDLxhu/Pnzys8PFxhYWG6//77tXfvXmeUB8BJrg0IExMTCQgBAIBpCAkBAHAym82msWPHqnv37mrbtm2J7aKjozVnzhx9+umn+vjjj2Wz2dStWzf99NNPxbbPz89XTk6Oww2A6zp06JBDQMglxgAAwExcbgwAgJONHj1ae/bs0fr162/YLi4uTnFxcfb73bp1U6tWrfTuu+/q5ZdfLtI+OTlZkyZNqvB6AVSOkJAQ3XnnnerZsycBIQAA1Ux6YpLZJZQZPQkBAHCiMWPGaOnSpVq9erWaNGlSpnVr1qypjh076uDBg8U+Pn78eGVnZ9tvR48erYiSAVSwH374QadPn5aPj4/69OlDQAgAQDWUZ7WaXUKZERICAOAEhmFozJgxWrx4sVatWqWIiIgyb6OgoEC7d+9WaGhosY97e3vL39/f4QbAtVitVs2fP18bN240uxQAAFCZrlwxu4Iy43JjAACcYPTo0Zo3b54+/fRT1alTR5mZmZKkgIAA1apVS5I0dOhQNW7cWMnJyZKkyZMnq2vXroqMjNTZs2f1xhtv6PDhw3riiSdMOw4A5We1WpWamqqoqCjde++9ZpcDAADggJAQAAAnmDlzpiSpd+/eDss/+OADDR8+XJJ05MgReXj8r5P/mTNnNGrUKGVmZqpevXqKjY3Vhg0b1Lp1a2eVDaCCXBsQJiUlcYkxAABwOYSEAAA4gWEYN22zZs0ah/tvvvmm3nzzzUqqCIAzeXp6qk2bNrr//vsJCAEAgEsiJAQAAAAqSUZGhkJCQhQZGanIyEizywEAACgRE5cAAAAAlSAtLU2zZ8/W9u3bzS4FAADgpggJAQAAgAqWlpamlJQURUdHq2PHjmaXAwAAnCg9McnsEsqFkBAAAACoQNcGhImJiYxBCACAm8nbu9fsEsqFkBAAAACoQPv37ycgBAAAVQ4TlwAAAAAVIC8vTz4+Pho8eLAMwyAgBAAAVQo9CQEAAIBbZLVaNX36dGVmZsrDw4OAEAAAVDmEhAAAAMAtsFqtSk1NVbNmzdSwYUOzywEAACgXQkIAAACgnAoDwqioKCUlJdGDEAAAVFmEhAAAAEA5XLlyRV9++SUBIQAAqBaYuAQAAAAoI8MwVKNGDQ0fPlz+/v4EhAAAQJJ0IKaj2SWUGz0JAQAAgDJIS0vTxx9/rEuXLqlevXoEhAAAwM7IyzO7hHIjJAQAAABKKS0tTSkpKfL29iYcBAAA1QohIQAAAFAKhQFhdHS0EhMTCQkBAICDqnypsURICAAAANzU6dOnCQgBAMANVeVLjSUmLgEAAABuKjAwUImJiYqOjiYgBAAA1RI9CQEAAIASWK1W7dixQ5LUunVrAkIAAFBtERICAAAAxbBarUpNTdXBgwdlGIbZ5QAAAFQqQkIAAADgOoUBYVRUlBITE2WxWMwuCQAAoFIREgIAAADX+M9//mMPCJOSkrjEGAAAuAUmLgEAAACuERISori4OPXp04eAEAAAuA16EgIAAACSDh48qOzsbPn6+io+Pp6AEAAAlFp6YpLZJdwyQkIAAAC4vbS0NP3rX//Sxo0bzS4FAABUQXl795pdwi0jJAQAAIBbS0tLU0pKiqKjo9W3b1+zywEAADAFISEAAADc1rUBYWJiIpcYAwAAt8XEJQAAAHBbBQUFat26tRISEggIAQCAWyMkBAAAgNvJyspSUFCQWrVqpVatWpldDgAAgOm43BgAAABuxWq16r333tP3339vdikAAAAug5AQAAAAbsNqtSo1NVVRUVFq166d2eUAAIBqID0xyewSKgQhIQAAANzCtQFhUlISYxACAIAKkbd3r9klVAhCQgAAALiF3bt3ExACAACUgIlLAAAAUK1dunRJXl5eeuCBBySJgBAAAKAY9CQEAABAtZWWlqbp06fr5MmT8vT0JCAEAAAVqrqMRygREgIA4BTJycm64447VKdOHQUFBSkhIUFWq/Wm6y1YsEAtW7aUj4+P2rVrpy+//NIJ1QLVQ1pamlJSUhQeHq7AwECzywEAANVQXin+pq8qCAkBAHCCtWvXavTo0dq0aZNWrFihy5cv65577lFubm6J62zYsEFDhgzRyJEjtXPnTiUkJCghIUF79uxxYuVA1VQYEEZHRysxMZEehAAAoHJcuWJ2BRXGYhiGYXYRAAC4m5MnTyooKEhr165Vz549i23z8MMPKzc3V0uXLrUv69q1q2JiYjRr1qyb7iMnJ0cBAQHKzs6Wv79/hdUOuLrLly/r73//u8LCwggIqxE+08zF8w8AxdvfslWlbLfVgf0Vtq3SfobTkxAAABNkZ2dL0g0vgdy4caPi4+MdlvXr108bN26s1NqAqswwDNWsWVPDhw8nIAQAACgDQkIAAJzMZrNp7Nix6t69u9q2bVtiu8zMTAUHBzssCw4OVmZmZrHt8/PzlZOT43AD3InValVKSoquXLmi+vXrExACAACUASEhAABONnr0aO3Zs0fz58+v0O0mJycrICDAfgsLC6vQ7QOuzGq1KjU1VRaLRRaLxexyAAAAqhxCQgAAnGjMmDFaunSpVq9erSZNmtywbUhIiLKyshyWZWVlKSQkpNj248ePV3Z2tv129OjRCqsbcGWFAWFUVJSSkpLoQQgAAFAOhIQAADiBYRgaM2aMFi9erFWrVikiIuKm68TFxWnlypUOy1asWKG4uLhi23t7e8vf39/hBlR3J0+eJCAEAACoADXMLgAAAHcwevRozZs3T59++qnq1KljH1cwICBAtWrVkiQNHTpUjRs3VnJysiTpmWeeUa9evTRlyhQNHDhQ8+fP17Zt2/Tee++ZdhyAq2nQoIHuv/9+tWnThoAQAADgFtCTEAAAJ5g5c6ays7PVu3dvhYaG2m8pKSn2NkeOHFFGRob9frdu3TRv3jy999576tChgxYuXKglS5bccLITwF2kpaVp9+7dslgsat++PQEhAADALaInIWCC3r17S5LWrFljah0AnMcwjJu2Ke4z4cEHH9SDDz5YCRUBVVdaWppSUlLUqlUrtW3blolKAAAAKgA9CVFlFc5eeLObOwZxr776qpYsWWJ2GQAAVLjCgDA6OloPPPAAASEAAEAFoSchqqyPPvrI4f4//vEPrVixosjyVq1aObMsl/Dqq68qKSlJCQkJZpcCAECF+fHHH+0BYWJiIpcYAwAAUx2I6Wh2CRWKkBBV1mOPPeZwf9OmTVqxYkWR5agYeXl58vLykocHHZABAOYICgpS586dFR8fT0AIAABMZ+TlmV1CheLbPqqtX/ziF+rUqZPDssGDB8tiseizzz6zL9u8ebMsFou++uor+7L//Oc/evDBBxUYGChfX1917dpVX3zxRan3/fHHH6tz587y9fVVvXr11LNnT3399dcltp87d64sFosOHTrksHzNmjVFLpn+4YcflJiYqJCQEPn4+KhJkyZ65JFHlJ2dLenqZdi5ubn68MMP7ZdcDx8+3L7+sWPH9Pjjjys4OFje3t5q06aN5syZU+x+58+frxdffFGNGzeWr6+vcnJydPnyZU2aNEm33XabfHx8VL9+fd15551asWJFqZ8fAADK4scff9T58+dVp04d9evXj4AQAACgEtCTENVWjx499OmnnyonJ0f+/v4yDEPfffedPDw8tG7dOt13332SpHXr1snDw0Pdu3eXJGVlZalbt266cOGCfvvb36p+/fr68MMPdd9992nhwoV64IEHbrjfSZMmaeLEierWrZsmT54sLy8vbd68WatWrdI999xzS8d06dIl9evXT/n5+frNb36jkJAQHTt2TEuXLtXZs2cVEBCgjz76SE888YQ6d+6sJ598UpLUokUL+7F17dpVFotFY8aMUcOGDfXVV19p5MiRysnJ0dixYx329/LLL8vLy0vPPvus8vPz5eXlpYkTJyo5Odm+j5ycHG3btk07duxQ3759b+n4AAC4ntVqVWpqqrp06XLL51EAAACUjJAQ1VaPHj1ks9n03XffqX///tqzZ4/OnDmjBx98UOvWrbO3W7dunTp06CB/f39J0muvvaasrCytW7dOd955pyRp1KhRat++vcaNG6f777+/xEtuDx48qMmTJ+uBBx7QwoULHdqVZmbTm9m3b5/S09O1YMECJSUl2Ze/9NJL9v9/7LHH9NRTT6l58+ZFLr3+05/+pIKCAu3evVv169eXJD311FMaMmSIJk6cqF/96leqVauWvX1eXp62bdvmsOyLL77QgAED9N57793y8QAAcCOFAWFUVJTuvvtus8sBAACo1rjcGNVWx44dVbt2bX377beSroaBTZo00dChQ7Vjxw5duHBBhmFo/fr16tGjh329L7/8Up07d7YHhJJUu3ZtPfnkkzp06JD27dtX4j6XLFkim82ml156qUiQWBGzLwYEBEiSli9frgsXLpRpXcMwtGjRIg0ePFiGYejUqVP2W79+/ZSdna0dO3Y4rDNs2DCHgFCS6tatq7179+qHH364tYMBAOAGrg0Ik5KSuMQYAACgkhESotry9PRUXFycvdfgunXr1KNHD915550qKCjQpk2btG/fPp0+fdohJDx8+LCio6OLbK9wluTDhw+XuM8ff/xRHh4eat26dQUfzVUREREaN26cZs+erQYNGqhfv356++237eMR3sjJkyd19uxZvffee2rYsKHDbcSIEZKkEydOFNnf9SZPnqyzZ88qKipK7dq103PPPad///vfFXOAAAD8V35+vlq2bElACAAA4CSEhKjW7rzzTm3dulV5eXn2kLBu3bpq27at1q1bZw8Qrw0JzVBSL8OCgoIiy6ZMmaJ///vf+uMf/6iLFy/qt7/9rdq0aaOffvrphvuw2WySrl6OvGLFimJvheMyFrq+F6Ek9ezZUz/++KPmzJmjtm3bavbs2erUqZNmz55d2sMFAKBEp06dkmEYat++PQEhAACAEzEmIaq1Hj166NKlS/rXv/6lY8eO2cPAnj17at26dQoODlZUVJSCg4Pt64SHh8tqtRbZ1oEDB+yPl6RFixay2Wzat2+fYmJiSl1nvXr1JElnz551WF5Sr8V27dqpXbt2evHFF7VhwwZ1795ds2bN0iuvvCKp+NCxYcOGqlOnjgoKChQfH1/q2ooTGBioESNGaMSIETp//rx6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x+xyAMABk5UAQOWqEiGhh4eHmjRpYsq+/f39q0UgUIjjcW3V7Xik6ndMHE/ZVdUehIVeffVVjR49WmFhYSooKFDr1q115coV/b//9//04osvlno727ZtU58+fez3x40bJ0kaNmyY5s6dq4yMDB05csT++KVLl/T73/9ex44dk6+vr9q3b69vvvnGYRtARbo2IExMTOQSYwAAADdTJUJCAADM4uXlpffff18vvfSSdu/erfPnz6tjx4667bbbyrSd3r1733Bsxrlz5zrcf/755/X888+Xp2SgzPLy8rR48WICQgAAADdGSAgAwHUKe/mVZNOmTfb/nzp1amWXA1Q6Hx8fDR06VEFBQQSEAFzSgZiOZpcAANUeIWEJvL29NWHChGozSyTH49qq2/FI1e+YOB73snPnTof7O3bs0JUrVxQdHS3p6mWZnp6eio2NNaM8oMJYrVZZrVYNGjSISXEAuDQjL8/sEgCg2rMYN7r2CQAANzd16lStWbNGH374oerVqydJOnPmjEaMGKEePXro97//vckVliwnJ0cBAQHKzs6uVmNpomJYrValpqYqKipKSUlJ9CCEy+MzzVxmP//7W7Zy+j4BwEytDuyvsG2V9jPco8L2CABANTRlyhQlJyfbA0JJqlevnl555RVNmTLFxMqA8iMgBAAAwPUICQEAuIGcnBydPHmyyPKTJ0/q3LlzJlQE3JqMjAwCQgBVCuMRAoBzMCYhAAA38MADD2jEiBGaMmWKOnfuLEnavHmznnvuOf3iF78wuTqg7IKDg3XvvfeqU6dOBIQAqgTGIwQA5yAkBADgBmbNmqVnn31Wjz76qC5fvixJqlGjhkaOHKk33njD5OqA0iuccKdFixa64447zC4HAAAALsatLzd+++231axZM/n4+KhLly7asmXLDdsvWLBALVu2lI+Pj9q1a6cvv/zSSZWWTlmOZ+7cubJYLA43Hx8fJ1Z7Y99++60GDx6sRo0ayWKxaMmSJTddZ82aNerUqZO8vb0VGRmpuXPnVnqdpVXW41mzZk2R18disSgzM9M5Bd9EcnKy7rjjDtWpU0dBQUFKSEiQ1Wq96Xqu+h4qz/G48nto5syZat++vfz9/eXv76+4uDh99dVXN1zHVV8bV+Dr66t33nlHP//8s3bu3KmdO3fq9OnTeuedd+Tn52d2eUCppKWlKSUlRd9//73Z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",
|
||
"text/plain": [
|
||
"<Figure size 1300x400 with 3 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# (b) Two well-separated clusters\n",
|
||
"c1 = rng.normal(loc=[0.0, 0.0], scale=0.05, size=(15, 2))\n",
|
||
"c2 = rng.normal(loc=[3.0, 0.0], scale=0.05, size=(15, 2))\n",
|
||
"two_clusters = np.vstack([c1, c2]).tolist()\n",
|
||
"diag_clusters = opt.persistent_homology(two_clusters, 1, 4.0)\n",
|
||
"\n",
|
||
"h0 = [p for p in diag_clusters if p['dim'] == 0]\n",
|
||
"long_h0 = [p for p in h0 if (p['death'] - p['birth']) > 1.0]\n",
|
||
"print(f\"long-lived H0 components (lifetime > 1.0): {len(long_h0)}\")\n",
|
||
"# 2 clusters => 1 essential H0 (always) + 1 long-lived class that dies at the merge scale ~ 3.0.\n",
|
||
"assert len(long_h0) >= 1, \"expected one long-lived H0 component encoding the cluster gap\"\n",
|
||
"\n",
|
||
"fig, axes = plt.subplots(1, 3, figsize=(13, 4))\n",
|
||
"pts = np.array(two_clusters)\n",
|
||
"axes[0].scatter(pts[:, 0], pts[:, 1], c='tab:blue'); axes[0].set_aspect('equal')\n",
|
||
"axes[0].set_title('Two clusters')\n",
|
||
"plot_diagram(axes[1], diag_clusters, 'Persistence diagram')\n",
|
||
"plot_barcode(axes[2], diag_clusters, 'Persistence barcode')\n",
|
||
"plt.tight_layout(); plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "62fc1e5f",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:17.451139Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:17.450839Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:27.034768Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:27.032070Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"#H1 features on figure-eight: 1183\n",
|
||
"top 4 H1 lifetimes:\n",
|
||
" birth=0.2091 death=inf life=inf\n",
|
||
" birth=0.2091 death=inf life=inf\n",
|
||
" birth=0.2091 death=inf life=inf\n",
|
||
" birth=0.2091 death=inf life=inf\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAABQkAAAGGCAYAAADYVwfrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9+0lEQVR4nO3deXwU9f3H8fduIAeQA4QcQIAICAkRkCgIVIEablLxRC3lEEEQ/IloFawS4kU9ECwgWK2CRaqCgAVsFJFoURS5LJFAQcMhJByGHBwhkJ3fH2lWltxhN7PZfT0fj3083NnvzHzmO18n7Ge/h8UwDEMAAAAAAAAAvJbV7AAAAAAAAAAAmIskIQAAAAAAAODlSBICAAAAAAAAXo4kIQAAAAAAAODlSBICAAAAAAAAXo4kIQAAAAAAAODlSBICAAAAAAAAXo4kIQAAAAAAAODlSBICAAAAAAAAXo4kIQAAAAAAcCqLxaIZM2aYHYapWrVqpSFDhpgdhtPMmDFDFovF7DDgQiQJAQAAAACo5RYtWiSLxWJ/+fv766qrrtKkSZN09OhRs8OrlKVLl2rOnDlmhwF4rTpmBwAAAAAAAJzj6aefVlRUlPLz87Vx40YtWLBAH3/8sVJTU1WvXr0ai+Ps2bOqU6dqKYelS5cqNTVVkydPdk1QAMpFkhAAAAAAAA8xcOBAXXvttZKk++67T1dccYVeeeUVffTRR7r77rsv69hnzpypdKLR39//ss6FysnPz5evr6+sVgaK4vLRigAAAAAA8FC//e1vJUnp6en2bUuWLFFcXJwCAgLUqFEj3XXXXTp06JDDfr1791ZsbKy2bt2qG2+8UfXq1dMTTzwhSdqyZYv69++vxo0bKyAgQFFRUbr33nsd9r90TsK8vDxNnjxZrVq1kp+fn0JDQ9W3b19t27bNfr61a9fqwIED9iHTrVq1su9/7tw5JSYmqk2bNvLz81NkZKQee+wxnTt3rsR5J02apFWrVik2NlZ+fn7q0KGDkpOTS9TN4cOHNWbMGDVt2lR+fn6KiorShAkTVFBQYC+TnZ2tyZMnKzIyUn5+fmrTpo1eeOEF2Wy2St+DTz/9VJ07d5a/v79iYmK0YsUKh8+zsrL06KOP6uqrr1aDBg0UFBSkgQMH6vvvv3col5KSIovFovfee09PPvmkmjVrpnr16ik3N1eS9O2332rQoEFq2LCh6tevr44dO+rVV191OMbnn3+uG264QfXr11dISIhuvvlmpaWllYh548aNuu666+Tv76/WrVvr9ddfL/P6KtOeUDvQkxAAAAAAAA/1448/SpKuuOIKSdJzzz2np556Snfeeafuu+8+HT9+XHPnztWNN96o7du3KyQkxL7vL7/8ooEDB+quu+7S8OHDFRYWpmPHjqlfv35q0qSJpk6dqpCQEO3fv79E4utS48eP1/LlyzVp0iTFxMTol19+0caNG5WWlqYuXbroT3/6k3JycvTzzz9r9uzZkqQGDRpIkmw2m373u99p48aNGjdunKKjo7Vz507Nnj1b//3vf7Vq1SqHc23cuFErVqzQAw88oMDAQP3lL3/RbbfdpoMHD9rr4ciRI+ratauys7M1btw4tW/fXocPH9by5ct15swZ+fr66syZM+rVq5cOHz6s+++/Xy1atNDXX3+tadOmKSMjo1LzJ+7du1fDhg3T+PHjNXLkSL399tu64447lJycrL59+0qSfvrpJ61atUp33HGHoqKidPToUb3++uvq1auXdu3apaZNmzoc85lnnpGvr68effRRnTt3Tr6+vlq3bp2GDBmiiIgIPfTQQwoPD1daWprWrFmjhx56SJL02WefaeDAgbryyis1Y8YMnT17VnPnzlXPnj21bds2e1J2586d9ns8Y8YMXbhwQYmJiQoLCytxfVVpT6gFDAAAAAAAUKu9/fbbhiTjs88+M44fP24cOnTIeO+994wrrrjCCAgIMH7++Wdj//79ho+Pj/Hcc8857Ltz506jTp06Dtt79eplSDIWLlzoUHblypWGJOO7774rNx5JRmJiov19cHCwMXHixHL3GTx4sNGyZcsS2//+978bVqvV+Pe//+2wfeHChYYk46uvvnI4r6+vr7Fv3z77tu+//96QZMydO9e+bcSIEYbVai31Omw2m2EYhvHMM88Y9evXN/773/86fD516lTDx8fHOHjwYLnX07JlS0OS8eGHH9q35eTkGBEREcY111xj35afn28UFhY67Juenm74+fkZTz/9tH3bhg0bDEnGlVdeaZw5c8a+/cKFC0ZUVJTRsmVL4+TJk6Vei2EYRufOnY3Q0FDjl19+cagbq9VqjBgxwr5t6NChhr+/v3HgwAH7tl27dhk+Pj7GxWmkqrQn1A4MNwYAAAAAwEPEx8erSZMmioyM1F133aUGDRpo5cqVatasmVasWCGbzaY777xTJ06csL/Cw8PVtm1bbdiwweFYfn5+Gj16tMO24p5ha9as0fnz5ysdV0hIiL799lsdOXKkyte0bNkyRUdHq3379g5xFw+lvjTu+Ph4tW7d2v6+Y8eOCgoK0k8//SSpqGfiqlWrlJCQYJ+/8WIWi8V+3htuuEENGzZ0OG98fLwKCwv15ZdfVhh706ZNdcstt9jfBwUFacSIEdq+fbsyMzMlFdVz8ZyChYWF+uWXX9SgQQO1a9fOPhz7YiNHjlRAQID9/fbt25Wenq7JkyeX6LlXfC0ZGRnasWOHRo0apUaNGjnUTd++ffXxxx/bz//JJ59o6NChatGihb1cdHS0+vfv73DsqrYnuD+GGwMAAAAA4CHmz5+vq666SnXq1FFYWJjatWtnT0Dt3btXhmGobdu2pe5bt25dh/fNmjWTr6+vw7ZevXrptttuU1JSkmbPnq3evXtr6NChuueee+Tn51dmXC+++KJGjhypyMhIxcXFadCgQRoxYoSuvPLKCq9p7969SktLU5MmTUr9/NixYw7vL05uFWvYsKFOnjwpSTp+/Lhyc3MVGxtb4Xn/85//VPq8pWnTpo09UVfsqquukiTt379f4eHhstlsevXVV/Xaa68pPT1dhYWF9rLFw6MvFhUV5fC+eEh5eddz4MABSVK7du1KfBYdHa1PPvlEp0+fVl5ens6ePVtqG2nXrp09mShVvT3B/ZEkBAAAAADAQ3Tt2rXU3nFSUQ86i8Wif/3rX/Lx8SnxefEcgMUu7q1WzGKxaPny5frmm2+0evVqffLJJ7r33ns1a9YsffPNNyWOUezOO+/UDTfcoJUrV+rTTz/VSy+9pBdeeEErVqzQwIEDy70mm82mq6++Wq+88kqpn0dGRjq8L+3aJMkwjHLPU9p5+/btq8cee6zUz4uTfZfr+eef11NPPaV7771XzzzzjBo1aiSr1arJkyeXukBKaffFDFVtT3B/JAkBAAAAAPACrVu3lmEYioqKuuwE1/XXX6/rr79ezz33nJYuXarf//73eu+993TfffeVuU9ERIQeeOABPfDAAzp27Ji6dOmi5557zp4kvLTH3cVxf//997rpppvKLFMVTZo0UVBQkFJTU8st17p1a506dUrx8fHVPte+fftkGIZD3P/9738lyb5QyPLly9WnTx/97W9/c9g3OztbjRs3rvAcxUOrU1NTy4y1ZcuWkqQ9e/aU+Gz37t1q3Lix6tevL39/fwUEBGjv3r0lyl26rzPbE9wDcxICAAAAAOAFbr31Vvn4+CgpKalErzrDMPTLL79UeIyTJ0+W2Ldz586SpHPnzpW6T2FhoXJychy2hYaGqmnTpg771K9fv0Q5qagX4uHDh/XGG2+U+Ozs2bM6ffp0hXFfzGq1aujQoVq9erW2bNlS4vPi67vzzju1adMmffLJJyXKZGdn68KFCxWe68iRI1q5cqX9fW5urt555x117txZ4eHhkop6Pl5ap8uWLdPhw4crdT1dunRRVFSU5syZo+zs7FKvJSIiQp07d9bixYsdyqSmpurTTz/VoEGD7LH0799fq1at0sGDB+3l0tLSStSDM9oT3As9CQEAAAAA8AKtW7fWs88+q2nTpmn//v0aOnSoAgMDlZ6erpUrV2rcuHF69NFHyz3G4sWL9dprr+mWW25R69atlZeXpzfeeENBQUH2RNOl8vLy1Lx5c91+++3q1KmTGjRooM8++0zfffedZs2aZS8XFxen999/X1OmTNF1112nBg0aKCEhQX/4wx/0wQcfaPz48dqwYYN69uypwsJC7d69Wx988IE++eSTModYl+X555/Xp59+ql69emncuHGKjo5WRkaGli1bpo0bNyokJER//OMf9c9//lNDhgzRqFGjFBcXp9OnT2vnzp1avny59u/fX2FPv6uuukpjxozRd999p7CwML311ls6evSo3n77bXuZIUOG6Omnn9bo0aPVo0cP7dy5U++++26l5muUipKeCxYsUEJCgjp37qzRo0crIiJCu3fv1g8//GBP7r300ksaOHCgunfvrjFjxujs2bOaO3eugoODNWPGDPvxkpKSlJycrBtuuEEPPPCALly4oLlz56pDhw76z3/+Yy/njPYEN2PGksoAAAAAAMB53n77bUOS8d1331VY9sMPPzR+85vfGPXr1zfq169vtG/f3pg4caKxZ88ee5levXoZHTp0KLHvtm3bjLvvvtto0aKF4efnZ4SGhhpDhgwxtmzZ4lBOkpGYmGgYhmGcO3fO+OMf/2h06tTJCAwMNOrXr2906tTJeO211xz2OXXqlHHPPfcYISEhhiSjZcuW9s8KCgqMF154wejQoYPh5+dnNGzY0IiLizOSkpKMnJwch/NOnDixRNwtW7Y0Ro4c6bDtwIEDxogRI4wmTZoYfn5+xpVXXmlMnDjROHfunL1MXl6eMW3aNKNNmzaGr6+v0bhxY6NHjx7Gyy+/bBQUFJRbzy1btjQGDx5sfPLJJ0bHjh0NPz8/o3379sayZcscyuXn5xuPPPKIERERYQQEBBg9e/Y0Nm3aZPTq1cvo1auXvdyGDRsMSSX2L7Zx40ajb9++9jru2LGjMXfuXIcyn332mdGzZ08jICDACAoKMhISEoxdu3aVONYXX3xhxMXFGb6+vsaVV15pLFy40EhMTDRKSyNVpj2hdrAYRhVn7gQAAAAAAADgUZiTEAAAAAAAAPByJAkBAAAAAAAAL0eSEAAAAAAAAPByJAkBAAAAAAAAL0eSEAAAAAAAAPByJAkBAAAAAAAAL1fH7AAAAAAAALWLzWbTkSNHFBgYKIvFYnY4AIByGIahvLw8NW3aVFZr2f0FSRICAAAAAKrkyJEjioyMNDsMAEAVHDp0SM2bNy/zc5KEAAAAAIAqCQwMlFT0hTMoKMjkaAAA5cnNzVVkZKT92V0WkoQAAAAAgCopHmIcFBREkhAAaomKpodg4RIAAAAAAADAy5EkBAAAAAAAALwcSUIAAAAAAADAy5EkBAAAAAAAALwcSUIAAAAAAADAy5EkBAAAAAAAALwcSUIAAAAAAADAy5EkBAAAAAAAALwcSUIAAAAAAADAy5EkBAAAAAAAALxcHbMDAAAAAADAXezufI2MggKzwwAABxZfX7Xfsd2l5yBJCAAAAADA/xj5+WaHAAAl1MSzieHGAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgJcjSQgAAAAAAAB4OZKEAAAAAAAAgDuzWFx+CpKEAAAAAAAAgBuLTtvl8nOQJAQAAAAAAAC8HElCAAAAAAAAwMuRJAQAAAAAAAC8HElCAAAAAAAAwMuRJAQAAAAAAAC8HElCAAAAAAAAwMuRJAQAAAAAAAC8HElCAAAAAAAAwMuRJAT+Z//+/bJYLFq0aJHZobjcqFGj1KpVq2rv26BBA+cGBAAAAAAATEWSEF5l0aJFslgspb6mTp1qdnge5cyZM5oxY4ZSUlLMDgUAAAAAAFSgjtkBAGZ4+umnFRUV5bCtQ4cOWrRokerWrWtSVDXnjTfekM1mc+k5zpw5o6SkJElS7969XXouAAAAAABweUgSwisNHDhQ1157rdlh2J0+fVr169evsfN5QyIUAAAAAABUHsONgf8pa07CZcuWKSYmRv7+/oqNjdXKlStLzOmXkpIii8VSYmhtaccsntPvxx9/1KBBgxQYGKjf//73kiSbzaY5c+aoQ4cO8vf3V1hYmO6//36dPHmy0texZMkSxcXFKSAgQI0aNdJdd92lQ4cOOZQpbU7CX375RX/4wx8UFBSkkJAQjRw5Ut9//32Z8zQePnxYQ4cOVYMGDdSkSRM9+uijKiwstF93kyZNJElJSUn2Id0zZsyo9HUAAAAAAICaQ09CeKWcnBydOHGiwnJr167VsGHDdPXVV2vmzJk6efKkxowZo2bNml3W+S9cuKD+/fvrN7/5jV5++WXVq1dPknT//fdr0aJFGj16tP7v//5P6enpmjdvnrZv366vvvqqwh6Azz33nJ566indeeeduu+++3T8+HHNnTtXN954o7Zv366QkJBS97PZbEpISNDmzZs1YcIEtW/fXh999JFGjhxZavnCwkL1799f3bp108svv6zPPvtMs2bNUuvWrTVhwgQ1adJECxYs0IQJE3TLLbfo1ltvlSR17Nix+pUGAAAAAIA3sVgUnbarxk5HkhBeKT4+vsS29PT0EtumTZumZs2a6auvvrKv6HvTTTepd+/eatmyZbXPf+7cOd1xxx2aOXOmfdvGjRv15ptv6t1339U999xj396nTx8NGDBAy5Ytc9h+qQMHDigxMVHPPvusnnjiCfv2W2+9Vddcc41ee+01h+0XW7VqlTZt2qQ5c+booYcekiRNmDBBffv2LbV8fn6+hg0bpqeeekqSNH78eHXp0kV/+9vfNGHCBNWvX1+33367JkyYoI4dO2r48OGVrxwAAAAAALxU9O40087NcGN4pfnz52vdunUOr0sdOXJEO3fu1IgRI+wJQknq1auXrr766suOYcKECQ7vly1bpuDgYPXt21cnTpywv+Li4tSgQQNt2LCh3OOtWLFCNptNd955p8P+4eHhatu2bbn7Jycnq27duho7dqx9m9Vq1cSJE8vcZ/z48Q7vb7jhBv3000/lxggAAAAAANwTPQnhlbp27Vpi4ZL9+/c7vD9w4IAkqU2bNiX2b9OmjbZt21bt89epU0fNmzd32LZ3717l5OQoNDS01H2OHTsmqWio9NmzZ+3bfX191ahRI+3du1eGYaht27al7l/eUOUDBw4oIiLCPuy5WGnXLkn+/v72OQeLNWzYsEpzJwIAAAAAAPdBkhBwAovFUur24oU8LuXn5yer1bEjr81mU2hoqN59991S9ylOyj300ENavHixfXuvXr2UkpIim80mi8Wif/3rX/Lx8Smx/8W9IS9XaccHAAAAAAC1F0lCoAzFcw7u27evxGeXbmvYsKEkKTs722F7cW/EymjdurU+++wz9ezZUwEBAWWWe+yxxxzm+Cs+d+vWrWUYhqKionTVVVdV+rxS0bVu2LBBZ86ccehNWNq1V1ZZiVMAAAAAAOB+mJMQKEPTpk0VGxurd955R6dOnbJv/+KLL7Rz506Hsi1btpSPj4++/PJLh+2vvfZapc935513qrCwUM8880yJzy5cuGBPQMbExCg+Pt7+iouLk1S0QImPj4+SkpJkGIbD/oZh6Jdffinz3P3799f58+f1xhtv2LfZbDbNnz+/0vFfqjjZeGniFAAAAAAAuB96EgLleP7553XzzTerZ8+eGj16tE6ePKl58+YpNjbWIXEYHBysO+64Q3PnzpXFYlHr1q21Zs0a+zyCldGrVy/df//9mjlzpnbs2KF+/fqpbt262rt3r5YtW6ZXX31Vt99+e5n7t27dWs8++6ymTZum/fv3a+jQoQoMDFR6erpWrlypcePG6dFHHy1136FDh6pr16565JFHtG/fPrVv317//Oc/lZWVJal6vQIDAgIUExOj999/X1dddZUaNWqk2NhYxcbGVvlYAAAAAADAtehJCJQjISFB//jHP1RQUKCpU6dqxYoVWrRokdq1ayd/f3+HsnPnztXNN9+shQsX6sknn1SLFi0c5g6sjIULF+qvf/2rjh07pieeeELTpk3T559/ruHDh6tnz54V7j916lR9+OGHslqtSkpK0qOPPqp//vOf6tevn373u9+VuZ+Pj4/Wrl2rYcOGafHixfrTn/6kpk2b2nsSXnqtlfXmm2+qWbNmevjhh3X33Xdr+fLl1ToOAAAAAABwLYtx6bhEABXq3LmzmjRponXr1pkdikutWrVK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vsaNGyc/Pz81atRIubm5evPNN3X33Xdr7NixysvL09/+9jf1799fmzdvVufOnR2O8e6776qgoEAPPvigsrKy9OKLL+rOO+/Ub3/7W6WkpOjxxx/Xvn37NHfuXD366KN66623KrxeAACA6nL52JUpU6Zo5MiRuvbaa9W1a1fNmTNHp0+ftk8IPmLECDVr1kwzZ86UVDT/z/XXX682bdooOztbL730kg4cOKD77rvP1aGWKzk1Q0mrdykjJ9++LSLYX4kJMRoQG2FiZPAE1W1ftEu4Cm0LkHJycnTixAnl5+frq6++0tNPP62AgAANGTJEBw4cUGJiop599ll7r0BJuvXWW3XNNdfotddec9iemZmphQsX6v7777dvW7VqlU6ePKlPP/1U1157rX37s88+W25ca9eu1dixYzVr1iz7tscee8z+33379lWzZs108uRJDR8+3GHfpUuX6rPPPtMXX3yh3/zmN/btsbGxGj9+vL7++mv16NHDvj0tLU27du1S69atJUl9+vRRp06d9I9//MP+g++0adOUmZmpb7/91uE6nn76aRmGIUl65ZVX9OOPP2r79u1q27atJOn+++9X06ZN9dJLL+mRRx5RZGRkqdd7/Phxvfjiixo8eLBWr14ti6Xox4o//elPev7558utK0l64YUXFBAQYH8/btw4tWnTRk888YQOHjyoFi1a2K+jWbNm+uqrr+xJ1Ztuukm9e/dWy5YtSxz3559/1r59+9SkSRP7tsLCQu3fv99hTsSxY8eqffv2mjt3rv72t785HOPw4cPau3evgoOD7fvPnDlTZ8+e1ZYtW+zDzI8fP653331XCxYskJ+fX4XXDAAAUB0un7Bl2LBhevnllzV9+nR17txZO3bsUHJysn0xk4MHDyojI8Ne/uTJkxo7dqyio6M1aNAg5ebm6uuvv1ZMTIyrQy1TcmqGJizZ5vBlWZIyc/I1Yck2JadmlLEnULHqti/aJVyFtgUUiY+PV5MmTRQZGam77rpLDRo00MqVK9WsWTOtWLFCNptNd955p06cOGF/hYeHq23btiWGl/r5+TmsmCzJ3tNwzZo1On/+fKXjCgkJ0bfffqsjR45U+ZqWLVum6OhotW/f3iHu4qHUl8YdHx9vTxBKUseOHRUUFKSffvpJUlHPxFWrVikhIcEhQVisOKG3bNky3XDDDWrYsKHDeePj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hAkT7OUeeOAB7dixQ2+//bZmz56tli1bKiEhQVarVatWrdLs2bP1zjvvaOXKlapXr56uvPJKPfTQQ9UaOt2sWTN9++23euqpp/Tuu+8qNzdXzZo108CBA1WvXj173F988YWef/55LVu2TO+8846CgoJ01VVXKSkpyaFnZGmeffZZ+fv7a+HChdqwYYO6deumTz/9VIMHDy53v7p162r16tX6v//7P82cOVP+/v665ZZbNGnSJHXq1MmhbEJCgv7xj39oxowZmjp1qtq2batFixZp8eLF+uGHys1dNGrUKGVmZur111/XJ598opiYGC1ZskTLli0rsVifOyksLLQnCCvqAesNiuebPHbsmH1eSQCAG7NYFJ22y+woPILF8LAZkHNzcxUcHKycnBwFBQU57bjJqRlKWr3LYUL/iGB/JSbEaEAsvzDi8lS3fdEu4So11bZc9cwGAGfp3LmzmjRpUmIeQ0+Sn5+v9PR0tWrVqtQFWbzR2bNntX//fkVFRcnfnyk2SuPJf8PT2kebHQKActQJC1Odxo0V9eFys0OpNSr7zKYnYSUNiI1Q35hwbU7P0rG8fIUGFg23ozcNnKG67Yt2CVehbQHwNufPn5fFYnGYGzElJUXff/+9nn32WRMjqzneOsS4NNQFALivtl+kmB2CxyJJWAU+Vou6t2YIBlyjuu2LdglXoW0B8CaHDx9WfHy8hg8frqZNm2r37t1auHChwsPDNX78eLPDAwAAcDmShAAAAPB6DRs2VFxcnN58800dP35c9evX1+DBg/XnP/+ZefoAAIBXsJodAAAAAGC24OBgvf/++/r555917tw5ZWVladmyZWrdurXZoaEco0aN0tChQ0tsT0lJkcViUXZ2tiTpP//5j2644Qb5+/srMjJSL774Ys0GCgBALUBPQgAAAACXrdBmuOVctrm5uerXr5/i4+O1cOFC7dy5U/fee69CQkI0btw4s8MDAMBtkCQEAAAAcFmSUzOUtHqXMnLy7dsigv2VmBCjAbERJkYmvfvuuyooKNBbb70lX19fdejQQTt27NArr7xCkhAAgIsw3LgMhTZDm378RR/tOKxNP/6iQpthdkjwQpe2w4ILNtolTMfzEQBwseTUDE1Yss0hQShJmTn5mrBkm5JTM0yKrMimTZt04403ytfX176tf//+2rNnj06ePGliZAAAuBd6EpbC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ww/NDgcAALfl8q5Ir7zyisaOHavRo0crJiZGCxcuVL169fTWW2+VWv7VV1/VgAED9Mc//lHR0dF65pln1KVLF82bN8+lcSanZmjCkm0OX3glKTMnXxOWbFNyaoZLzw+UZubHu/T6l44JQkmyGdLrX6Zr5sdMAoua587Pyy1btuixxx7TXXfdpVtvvdXhharbsWMHCUIAVZL7z39q/x13Knf1arNDsatfv74WLFigsWPHKjw83OxwAABwWy5NEhYUFGjr1q2Kj4//9YRWq+Lj47Vp06ZS99m0aZNDeUnq379/meWdodBmKGn1LhmlfFa8LWn1LhVemqkBXKjggk1v/LvsBQmkonnICi7YaigiwL2fl++995569OihtLQ0rVy5UufPn9cPP/ygzz//XMHBwTUeT21WWFgoSerTp4/GjBlDghBApRgXLuj43KIf9o/PnSfjwgWTIwIAAFXh0iThiRMnVFhYqLCwMIftYWFhyszMLHWfzMzMKpU/d+6ccnNzHV5VtTk9q0SPmIsZkjJy8rU5PavKxwaq6++b9pfoQXgpm1FUDqgp7vy8fP755zV79mytXr1avr6+evXVV7V7927deeedatGiRY3HU1tlZWVp/vz5+vHHH2WxWBQQEGB2SABqidy1a3X+558lSecPHVLuxx/XyHnXrFmjBg0aOLwGDhxYI+cGAMCT1PqVD2bOnKng4GD7KzIyssrHOJZX9hfe6pQDnOFA1hmnlgOcwZ2flz/++KMGDx4sqWhV49OnT8tisejhhx/WX//61xqPpzYqnoPQarWWOm8wAJTF3ouweB5Ci6XGehP26dNHO3bscHi9+eabLj8vAACexqVJwsaNG8vHx0dHjx512H706NEy5wMJDw+vUvlp06YpJyfH/jp06FCV4wwN9HdqOcAZWjaq59RygDO48/OyYcOGysvLkyQ1a9ZMqampkqTs7GydOUMyvSIsUgLgcth7ERr/GwZhGDXWm7B+/fpq06aNw6tZs2YuPy8AAJ7GpUlCX19fxcXFaf369fZtNptN69evV/fu3Uvdp3v37g7lJWndunVllvfz81NQUJDDq6q6RjVSRLC/ylp/zaKiVTu7RjWq8rGB6vpD91ayVrAooNVSVA6oKe78vLzxxhu1bt06SdIdd9yhhx56SGPHjtXdd9+tm266qcbjqU0Mw9CqVatIEAKolhK9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NRmm2xs4cKAGDhxY6fILFy5UVFSUZs2aJUmKjo7Wxo0bNXv2bPXv399VYdYKVa3LYqGhoQoJCXF+QLVYcnKyw/tFixYpNDRUW7du1Y033ljqPjwvAbiT6F0/mB0CvBg9CSsQGli57H1lywEXq277ol3CVWhb7qmgoEBbt25VfHy8fZvValV8fLw2bdpU6j6bNm1yKC9J/fv3L7O8t6hOXUrSqVOn1LJlS0VGRurmm2/WDz/wD/iqok06X+fOnRUREaG+ffvqq6++Mjsct5STkyNJatSoUZllaJsAABQhSViBrlGNFBHsL0sZn1tUtOJn16iy/+EBlKW67Yt2CVehbbmnEydOqLCwUGFhYQ7bw8LCypyDLDMzs0rlvUV16rJdu3Z666239NFHH2nJkiWy2Wzq0aOHfv7555oI2WOU1SZzc3N19uxZk6KqnSIiIrRw4UJ9+OGH+vDDDxUZGanevXtr27ZtZofmVmw2myZPnqyePXsqNja2zHI8LwEAKOLSJGFWVpZ+//vfKygoSCEhIRozZoxOnTpV7j69e/cuMQnz+PHjXRlmuXysFiUmxEhSiS/Nxe8TE2LkYy3rKzVQtuq2L9olXIW2BZTUvXt3jRgxQp07d1avXr20YsUKNWnSRK+//rrZocFLtWvXTvfff7/i4uLUo0cPvfXWW+rRo4dmz55tdmhuZeLEiUpNTdV7771ndigAANQKLk0S/v73v9cPP/ygdevWac2aNfryyy81bty4CvcbO3aswyTML774oivDrNCA2AgtGN5F4cGOw+vCg/21YHgXDYiNMCkyeILqti/aJVyFtuV+GjduLB8fHx09etRh+9GjR8ucJy88PLxK5b1FderyUnXr1tU111yjffv2uSJEj1VWmwwKClJAQIBJUXmOrl270iYvMmnSJK1Zs0YbNmxQ8+bNyy3L8xIAgCIuW7gkLS1NycnJ+u6773TttddKkubOnatBgwbp5ZdfVtOmTcvct169em73R3lAbIT6xoRrc3qWjuXlKzSwaLgdvWngDNVtX7RLuApty734+voqLi5O69ev19ChQyUVDaNbv369Jk2aVOo+3bt31/r16zV58mT7tnXr1ql79+41ELH7qk5dXqqwsFA7d+7UoEGDXBip5+nevbs+/vhjh220SefZsWOHIiL4EccwDD344INauXKlUlJSFBUVVeE+PC8B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vPJKJSUl6cKFCy69PsCVSBICAAAAAIBaLyMjQ3fffbfuvfdepaWlKSUlRbfeeqsMw9CCBQs0ceJEjRs3Tjt37tQ///lPtWnTxr6v1WrVX/7yF/3www9avHixPv/8cz322GNlnuvf//63RowYoYceeki7du3S66+/rkWLFum5556riUsFXMJiGIZhdhAAAAAAAACXY9u2bYqLi9P+/fvVsmVLh8+aNWum0aNH69lnn63UsZYvX67x48frxIkTkooWLpk8ebKys7MlSfHx8brppps0bdo0+z5LlizRY489piNHjjjngoAaVsfsAAAAAAAAAC5Xp06ddNNNN+nqq69W//791a9fP91+++06f/68jhw5optuuqnMfT/77DPNnDlTu3fvVm5uri5cuKD8/HydOXNG9erVK1H++++/11dffeXQc7CwsLDcfQB3x3BjAAAAAABQ6/n4+GjdunX617/+pZiYGM2dO1ft2rXT0aNHy91v//79GjJkiDp27KgPP/xQW7du1fz58yVJBQUFpe5z6tQpJSUlaceOHfbXzp07tXfvXvn7+zv92oCaQE9CAAAAAADgESwWi3r27KmePXtq+vTpatmypdatW6dWrVpp/fr16tOnT4l9tm7dKpvNplmzZslqLepL9cEHH5R7ni5dumjPnj0O8xoCtR1JQgAAAAAAUOt9++23Wr9+vfr166fQ0FB9++23On78uKKjozVjxgyNHz9eoaGhGjhwoPLy8vTVV1/pwQcfVJs2bXT+/HnNnTtXCQkJ+uqrr7Rw4cJyzzV9+nQNGTJELVq00O233y6r1arvv/9eqamplZ73EHA3DDcGAAAAAAC1XlBQkL788ksNGjRIV111lZ588knNmjVLAwcO1MiRIzVnzhy99tpr6tChg4YMGaK9e/dKKprL8JVXXtELL7yg2NhYvfvuu5o5c2a55+rfv7/WrFmjTz/9VNddd52uv/56zZ49u8SCKUBtwurGAAAAAAAAgJejJyEAAAAAAADg5UgSAgAAAAAAAF6OJCEAAAAAAADg5UgSAgAAAAAAAF6OJCEAAAAAAADg5UgSAgAAAAAAAF6OJCEAAAAAAADg5UgSAgAAAAAAAF6OJCEAAAAAAADg5UgSAgAAAAAAAF6OJCEAAAAAAADg5UgSAgAAAAAAAF7u/wHERVK2XmQBSQAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 1300x400 with 3 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# (c) Figure-eight: two loops sharing a crossing\n",
|
||
"n = 30\n",
|
||
"th = np.linspace(0, 2*np.pi, n, endpoint=False)\n",
|
||
"left = np.column_stack([np.cos(th) - 1.0, np.sin(th)])\n",
|
||
"right = np.column_stack([np.cos(th) + 1.0, np.sin(th)])\n",
|
||
"fig8 = np.vstack([left, right]).tolist()\n",
|
||
"diag_fig8 = opt.persistent_homology(fig8, 1, 2.0)\n",
|
||
"h1_fig8 = [p for p in diag_fig8 if p['dim'] == 1]\n",
|
||
"h1_fig8_sorted = sorted(\n",
|
||
" h1_fig8,\n",
|
||
" key=lambda p: -((np.inf if not np.isfinite(p['death']) else p['death']) - p['birth']),\n",
|
||
")\n",
|
||
"print(f\"#H1 features on figure-eight: {len(h1_fig8)}\")\n",
|
||
"print('top 4 H1 lifetimes:')\n",
|
||
"for p in h1_fig8_sorted[:4]:\n",
|
||
" d = p['death']\n",
|
||
" print(f\" birth={p['birth']:.4f} death={d:.4f} life={(np.inf if not np.isfinite(d) else d) - p['birth']:.4f}\")\n",
|
||
"assert len(h1_fig8_sorted) >= 2, \"expected at least two H1 loops on the figure-eight\"\n",
|
||
"\n",
|
||
"fig, axes = plt.subplots(1, 3, figsize=(13, 4))\n",
|
||
"pts = np.array(fig8)\n",
|
||
"axes[0].scatter(pts[:, 0], pts[:, 1], c='tab:blue'); axes[0].set_aspect('equal')\n",
|
||
"axes[0].set_title('Figure-eight')\n",
|
||
"plot_diagram(axes[1], diag_fig8, 'Persistence diagram')\n",
|
||
"plot_barcode(axes[2], diag_fig8, 'Persistence barcode')\n",
|
||
"plt.tight_layout(); plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2daa8da6",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 3. Bottleneck distance\n",
|
||
"\n",
|
||
"$$\n",
|
||
"d_B(D, D') \\;=\\; \\inf_{\\eta : D \\to D'} \\, \\sup_{x \\in D}\\, \\| x - \\eta(x) \\|_{\\infty},\n",
|
||
"$$\n",
|
||
"\n",
|
||
"matchings allowed to pair points with the diagonal $\\Delta = \\{(t, t) : t \\ge 0\\}$ at cost $(d - b)/2$.\n",
|
||
"\n",
|
||
"Sanity checks:\n",
|
||
"* $d_B(D, D) = 0$ (identity).\n",
|
||
"* $d_B$ between a diagram and its perturbation is bounded by the perturbation amplitude in the $\\ell_\\infty$ norm."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "1b9cc842",
|
||
"metadata": {
|
||
"execution": {
|
||
"iopub.execute_input": "2026-05-12T09:45:27.044619Z",
|
||
"iopub.status.busy": "2026-05-12T09:45:27.043683Z",
|
||
"iopub.status.idle": "2026-05-12T09:45:30.614929Z",
|
||
"shell.execute_reply": "2026-05-12T09:45:30.613504Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"d_B(diag_circle, diag_circle) = 0.000000e+00\n",
|
||
"d_B(diag, diag + 0.05) = 5.000000e-02\n",
|
||
"d_B(A, B) = 0.200000\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 500x500 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Identity: bottleneck distance to itself must be 0.\n",
|
||
"d_self = opt.bottleneck_distance(diag_circle, diag_circle)\n",
|
||
"print(f\"d_B(diag_circle, diag_circle) = {d_self:.6e}\")\n",
|
||
"assert abs(d_self) < 1e-9, f\"expected 0, got {d_self}\"\n",
|
||
"\n",
|
||
"# Stability: shift every birth/death of a diagram by a known epsilon.\n",
|
||
"eps_shift = 0.05\n",
|
||
"diag_perturbed = []\n",
|
||
"for p in diag_circle:\n",
|
||
" d_val = p['death']\n",
|
||
" diag_perturbed.append({\n",
|
||
" 'dim': p['dim'],\n",
|
||
" 'birth': p['birth'] + eps_shift,\n",
|
||
" 'death': d_val if not np.isfinite(d_val) else d_val + eps_shift,\n",
|
||
" })\n",
|
||
"d_pert = opt.bottleneck_distance(diag_circle, diag_perturbed)\n",
|
||
"print(f\"d_B(diag, diag + {eps_shift}) = {d_pert:.6e}\")\n",
|
||
"assert d_pert <= eps_shift + 1e-9, f\"stability violated: {d_pert} > {eps_shift}\"\n",
|
||
"\n",
|
||
"# Cross-check on a tiny synthetic pair.\n",
|
||
"A = [{'dim': 0, 'birth': 0.0, 'death': 1.0}, {'dim': 1, 'birth': 0.5, 'death': 1.5}]\n",
|
||
"B = [{'dim': 0, 'birth': 0.0, 'death': 1.2}, {'dim': 1, 'birth': 0.4, 'death': 1.6}]\n",
|
||
"d_AB = opt.bottleneck_distance(A, B)\n",
|
||
"print(f\"d_B(A, B) = {d_AB:.6f}\")\n",
|
||
"assert d_AB >= 0.0\n",
|
||
"\n",
|
||
"fig, ax = plt.subplots(figsize=(5, 5))\n",
|
||
"plot_diagram(ax, diag_circle + diag_perturbed, 'Original (circle) vs shifted diagram')\n",
|
||
"plt.tight_layout(); plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "f6116645",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Summary — verification against analytic ground truth\n",
|
||
"\n",
|
||
"Verified against analytic ground truth:\n",
|
||
"\n",
|
||
"* Vietoris–Rips on 4 points yields $\\binom{4}{1} = 4$ vertices and $\\binom{4}{2} = 6$ edges — error = 0.\n",
|
||
"* Sampled unit circle exhibits exactly one long-lived $H_1$ generator (its essential loop) — error = 0.\n",
|
||
"* Two well-separated clusters produce one long-lived $H_0$ class encoding the cluster gap — error = 0.\n",
|
||
"* Figure-eight exhibits at least two $H_1$ generators — error = 0.\n",
|
||
"* Bottleneck identity: $d_B(D, D) = 0$ — error $< 10^{-9}$.\n",
|
||
"* Bottleneck stability under a uniform shift $\\varepsilon = 0.05$: $d_B(D, D + \\varepsilon) \\le \\varepsilon$ — 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
|
||
}
|