diff --git a/.gitignore b/.gitignore index 6a058df..b670a00 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ benchmarks/results/* src/ect/embed_graph.py src/ect/embed_cw.py +.conda* +.vscode/* + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/Extra_Notebooks/Figs_For_JOSS_Paper.ipynb b/Extra_Notebooks/Figs_For_JOSS_Paper.ipynb new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index a896676..7e2e497 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,16 @@ # `ect`: A python package for computing the Euler Characteristic Transform -Python computation tools for computing the Euler Characteristic Transform of embedded graphs. +Python computation tools for computing the Euler Characteristic Transform of embedded complexes. ## Description -Right now, the content includes stuff for doing ECT on graphs embedded in 2D. Eventually the goal is to get voxel versions, higher dimensional simplicial complexes, etc in here. +The package provides fast tools for computing the Euler Characteristic Transform (ECT) on embedded cell complexes in any ambient dimension. You build a complex (vertices, edges, and optional higher‑dimensional cells), choose a set of directions and thresholds, and compute either the exact ECT or its smoothed/differentiable variants. Results come back as NumPy arrays with metadata, plotting helpers, and distance utilities, making it straightforward to visualize transforms and compare shapes. The core is implemented with NumPy and Numba, with optional validation of geometric and structural constraints when constructing complexes. + +- `EmbeddedComplex`: convert point clouds into complexes with vertices, edges, and higher‑dimensional cells with embedded coordinates. +- `ECT`, `SECT`, `DECT` : ECT calculations along with the smooth and differentiable variants over sampled directions and transforms. +- `Directions`: uniform, random, or custom directions (angles in 2D; vectors in any dimension) +- Results as `ECTResult`: behaves like a NumPy array, with plotting and distance helpers +- Optional geometric/structural validation when building complexes For more information on the ECT, see: @@ -17,16 +23,12 @@ For more information on the ECT, see: - The documentation is available at: [munchlab.github.io/ect](https://munchlab.github.io/ect/) - A tutorial jupyter notebook can be found [here](https://munchlab.github.io/ect/notebooks/Tutorial-ECT_for_embedded_graphs.html) -### Dependencies - -- `networkx` -- `numpy` -- `matplotlib` -- `numba` ### Installing -The package can be installed using pip: +Requires Python 3.10+. + +Install from PyPI: ```{bash} pip install ect @@ -40,6 +42,28 @@ cd ect pip install . ``` +### Quickstart + +Compute an ECT for a simple embedded triangle and plot it. + +```python +from ect import ECT, EmbeddedComplex + +G = EmbeddedComplex() +G.add_node("a", [0.0, 0.0]) +G.add_node("b", [1.0, 0.0]) +G.add_node("c", [0.5, 0.8]) +G.add_edge("a", "b") +G.add_edge("b", "c") +G.add_edge("c", "a") + +ect = ECT(num_dirs=32, num_thresh=128) +result = ect.calculate(G) +result.plot() +``` + + + ## Authors This code was written by [Liz Munch](https://elizabethmunch.com/) along with her research group and collaborators. People who have contributed to `ect` include: diff --git a/paper/figures/CombineGraphExample.png b/paper/figures/CombineGraphExample.png new file mode 100644 index 0000000..7fd9bcd Binary files /dev/null and b/paper/figures/CombineGraphExample.png differ diff --git a/paper/figures/CombineGraphExample.svg b/paper/figures/CombineGraphExample.svg new file mode 100644 index 0000000..13304ff --- /dev/null +++ b/paper/figures/CombineGraphExample.svg @@ -0,0 +1,65 @@ + + + + diff --git a/paper/figures/Matisse_MDS.png b/paper/figures/Matisse_MDS.png new file mode 100644 index 0000000..f7ed64d Binary files /dev/null and b/paper/figures/Matisse_MDS.png differ diff --git a/paper/figures/example_ect.png b/paper/figures/example_ect.png new file mode 100644 index 0000000..91fcf19 Binary files /dev/null and b/paper/figures/example_ect.png differ diff --git a/paper/figures/example_graph.png b/paper/figures/example_graph.png new file mode 100644 index 0000000..e48a994 Binary files /dev/null and b/paper/figures/example_graph.png differ diff --git a/paper/figures/example_graph_7pi_over_4.png b/paper/figures/example_graph_7pi_over_4.png new file mode 100644 index 0000000..e0b9bd6 Binary files /dev/null and b/paper/figures/example_graph_7pi_over_4.png differ diff --git a/paper/figures/example_graph_pi_over_2.png b/paper/figures/example_graph_pi_over_2.png new file mode 100644 index 0000000..88c0bb9 Binary files /dev/null and b/paper/figures/example_graph_pi_over_2.png differ diff --git a/paper/figures/filtration.png b/paper/figures/filtration.png new file mode 100644 index 0000000..c0d0ac3 Binary files /dev/null and b/paper/figures/filtration.png differ diff --git a/paper/generating_figures.ipynb b/paper/generating_figures.ipynb new file mode 100644 index 0000000..84b033b --- /dev/null +++ b/paper/generating_figures.ipynb @@ -0,0 +1,338 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from ect import ECT, EmbeddedComplex #, EmbeddedGraph, EmbeddedCW #,create_example_graph\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import networkx as nx" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[34mExtra_Notebooks\u001b[m\u001b[m/ \u001b[34mbuild\u001b[m\u001b[m/ \u001b[34mect\u001b[m\u001b[m/ pyproject.toml\n", + "LICENSE \u001b[34mdata\u001b[m\u001b[m/ \u001b[34mect.egg-info\u001b[m\u001b[m/ \u001b[34msrc\u001b[m\u001b[m/\n", + "Makefile \u001b[34mdist\u001b[m\u001b[m/ \u001b[34mlogo\u001b[m\u001b[m/ \u001b[34mtests\u001b[m\u001b[m/\n", + "README.md \u001b[34mdoc_source\u001b[m\u001b[m/ make.bat\n", + "\u001b[34mbenchmarks\u001b[m\u001b[m/ \u001b[34mdocs\u001b[m\u001b[m/ \u001b[34mpaper\u001b[m\u001b[m/\n" + ] + } + ], + "source": [ + "ls .." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVkAAAGhCAYAAADLM8evAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQXtJREFUeJztnQt0VdW1/mcehAQCBAiB8AoQWlFRISlU1GGxUgsFlEKo3mtVLPUKBFQQK1orMu61ub2l2ooBfFDBV8HyEAmlVkTR1hcm0IIU+wcMQggkgfDKkzz+41vtSQ/H89hnn7POfsz5G+MMSLL32vM7a59v7zP3WnPFtba2tpIgCIKghXg9zQqCIAhATFYQBEEjYrKCIAgaEZMVBEHQiJisIAiCRsRkBUEQNCImKwiCoBExWUEQBI2IyQqCIGhETFYQBMGpJrts2TK6/PLLqXPnzuo1atQo2rJli85DCoIg2Io4nbULNm3aRAkJCfS1r32NcJhVq1bRL3/5S9q5cyddeumlug4rCILAw2T90a1bN2W006dPD7ltS0sLHT16lDp16kRxcXExiU8QBMEIsM6zZ89S7969KT4+cFIgkWJEc3Mz/f73v6eamhqVNvBHQ0ODenkoKyujSy65JFYhCoIghM3hw4epb9++1pns7t27lanW19dTamoqbdiwIaBxFhQU0KJFi77y+/3791NTUxP17NmTjh07pq4cuMNNT0+n06dPU0pKivo77nzx/zNnzlD37t2poqKibdsePXrQyZMn1V0xYsGdcVJSkjL9rl27UmVlZdu2OA72TUtLo7q6OpXywJUKFwDsf+LEibZtMzMzqby8XB0PVzW0CXAstHPq1ClDcScnJ6v9fePOyMhQx/OOu127dlRbW/uVuHv16kXHjx8PGrcnXt+427dvr+LAxRBx+Ysb72F1dTV16NCBzp8/r67k3nF/8cUXKjXkL27EkZiYqOLq0qULVVVV+Y0buqAPNDY2fiVuzz7B4sax0Z5v3B07dlRteseNb1be76EnbjxDQKyh4j548KD6gOE88o0b5wC28Y0b5yeO7x03zgfEGSxuEOycxc+I0RM3+h/vfaD3G214x40+xbFwzEDnLOJGzPg/3qtox53wr3MWcaMPfD9riAl95v1ZMxJ3NDyitLS07fzGcdD33/jGN9T2lqYL8CZ/+eWXSujatWvp+eefp+3bt/s1Wt87WbwR/fr1U/viDXcS6HB0DCdEMx846q720Qx/wsUhlD9pv5PFlWDw4MHq/7m5ubRjxw76zW9+Q88888xXtsVdCV5uwHN3wAnRzAeOutuZ1BzzcbK4Xfe+W3Ur+IrBDdHMB466a0xq1non+9BDD9G4ceOof//+Kofy6quv0rvvvktvvvkmuR3kjbghmvnAUXc3k5q13skiqXz77bfTRRddRNdff71KFcBgv/Od75DbgXZuiGY+cNRdYVJzzMfJhoPRxLIgCIJd/UlqF2gCY3y5IZr5wFF3mUnNYrKawJg+bohmPnDUnWlSs5isJjAgmhuimQ8cdR8zqVlMVhPcBmoD0cwHjrq7mtQsJqsJTA/lhmjmA0fdtSY1i8lqAvPduSGa+cBRd6JJzWKymghW+sytiGY+cNQdb1Izv3cqRqCKDzdEMx846q43qVlMVhMcJ0+IZj5w1N3ZpGYxWU2gfic3RDMfOOquMqlZptVqAm8rtyVzRDMfOOpu9dEs02otBtXTuSGa+cBR91GTmuVOVhNypecBR8121F1cXEwbizZT8c6dVFNbR3Hx8dTa0kIdO6RQ7vDhdNOE8WrRACvuZPkNdovhVa9Pnz7ECdHMB7voXrtuPT21dBllDMimnDHj6NYbb6XkDh3a/l5fW0ul+/ZQwdLnqKJ0Ad0zayblTZkcU81yJ6sJrP7glqV0jCKa+WC17srKSpoxew4lZ/ShCdNnUfuUfxtrIBrqaqloxVKqryij5U8vUQsnRqJZcrIWgw7ghmjmg5W6S0tLaeLkPBp18500ZfZ8QwYLsB22x37Y/9ChQzHRLCarCSydzA3RzAerdFdWVtItt91B0xYtpkGXXm6qDeyH/W/+4e1hDcsyq1lMVuOCkdwQzXywSveM2XMob+7DlNGnb0TtYH+0g/Z0axaT1URTUxNxQzTzwQrda9etVzlYs3ewvqCdpPRM1a5OzTK6QBMdvJ5wckE088EK3U8tXUYzf7U86DbNTU20bvlv6P3Nr1NCYiIlJCTQ4MuG0+0PPEIdO3f5yvYTf5xPT82fYWjEgVnNYrKaqK6uppSUFOKEaOZDrHUXFxerYVqhHnIt/en9dPZ0NRWs3kSpXdLU2NYP3yyis6dP+TVZtNcjK5tKSkooJydHi2YxWU306tWLuCGa+RBr3RuLNqtxsMEoP/QFffDmJnrmnR3KYAEmD1w1dmLQ/XLHjPtn+yFM1qxmyclqory8nLghmvkQa90lu3bRwIuHBt3m4N7dlJk1iDp37R5W2wOGDFUzxXRpFpPVhB1mw8Qa0cyHWOs+V1NreDxsuGCGGNrXpdmWJltYWEiXXHIJjRgxgpyKrEvPA46ardAdZ2BVgkGXXEblhw7S2eqTWto3q9mWJpufn0979+6lHTt2kFPJyMiwOoSYI5r5EGvdrQbGqGZmDaQrbxhPhY/cTzVnTv9zP/XgazMdO3wo4vbNaralybqBkyfDv5o6HdHMh1jrTu3YQRV7CUX+40/QgIsuoQU/GE/3ThhN947/Fv31L9up078ehPkD7aJ9XZpldIEmOnbsSNwQzXyIte6cYcNUNa0hOSODbpfYrh3dcs8D6mUUtItyiLo0y52sJs6fP0/cEM18iKXumpoa6pnenf68ydjMrHAp3rpF1ZvVpVnuZDVh4wqS2hDNfIiF7pqaGvrLX/5Cn376qTK4L/b8VZUrjOYoA6QKKg8dCDlGNhLNYrKa4FidSTTzQafuGh9z9Qyfyr/7LlUPFuUKo0XRikK6d9YsrZrFZDWB2pPc5rWLZj7o0F0TwFy/9a1v0eDBg9XsrXduvoUOfva3qBSJQTuNVeU0ZfL3tWqWlRE0gYo9iYm8rmGimQ/R1F1jwFy968mi4DbqwUZS7rDiyGFa+dgDVLRhHaWnp5vSLGt8Wczx48fZzQYSzXyIhu6aMMzVA5aMWf3SKrop7wf0w4f+m7KHXm7qDnbtkz+nNS+/aNhgI9EsJqsJjh880cyHSHTXmDBXb7DO1tjrr6Pf/eJR+lrulTTp7nsMr/G16flClSII5w42Us1isprAFDxuH0DRzAczumsiNFfQ3NxMr7/+usqNPvyTBzAflpbMn0npWYNUNS0Ue/G3Wi2GaVUdOqhWqzWag41WX0tOVhMcc3WimQ/h6K6Jgrl62LZtG73//vvKZGfNmtU2QQD1Zt/Y/AdVTQvFXlCLAFNlMZMLEw0wDtbIMK1gSE7WZmCBNm61RkUzH4zojqa5ekoN/vnPf1b/Hz9+/AUzsHJzc9XLjn0tJqsJp915RwPRzIdguqNtrt5pAnzxvvTSS1WVPqf0tZisJurr69mNnxTNvHXrMFcP27dvp4qKCnXMceOCr5Bgt74Wk9VEvIH6lG5DNPPUrdNcQ6UJnNDXYrKa4PgwRDTz0q3bXO2SJoi0r3meITGgFjUqU1OJE6KZBzBXPOHfuXOnNnO1U5og0r4Wk9VEWlrgIsFuRTS7G+8715aWFnWXqctc7ZQmiLSvxWQ1gTnW3Aapi2Z34i8tMGjQILryyiu1mKvd0gSR9rWYrCbc/sHzh2h2F7HIuTohTeBBptXaDI7TLUUzH3PVqbvcZmkCD2Y1i8lqIjMzk7ghmvncuerS3WzDNEGkmsVkNXHs2DHq3bs3cUI080kL6NK93YZpgkg1i8lqomvXrsQN0cwn56pDd7lN0wSRatZqsgUFBbR+/Xrat28fpaSk0FVXXUW/+MUv6KKLLiK3gxMYmjkhmvk80Iq27mYbpwki1azVZHHrn5+fTyNGjFBlwh5++GG64YYbaO/evba7SkWbpKQk4oZo5jNaINq6t9s4TRCpZq0m+8c//vGCn1euXEkZGRmq9uO1116r89CCINhgKJYb0gSREtOcLIrbgm7duvn9e0NDg3p5F8V1Kt46uCCa+ZhrtHQ3OyBNEKnmmJUQwjS8++67j66++moaOnRowBwuKo17Xv369WsrMXb06FHVBsaqAfzb2NiovmKcO3eOTp06RSdPnqS6ujr1FBDpCe9tcZLh95h/jO2qq6vVSYjF0fA3723R8Tge2jpx4oS6OJw9e1bN+MAb7b0tTg78i9/j77gw4IXjY3+jcSMuf3HjZ9+4sZ+/uHGcUHF74vWNG9the+wXKG4cD8fF8RGHb9x4PwPFDZ3YD7qhP1DcKIzseQ/9xe3ZJ1jc6D9/cSM+37h930NP3GjLSNxoB+env7gRi7+40ZZv3LibCxV3qHMWbaAt/IxvkcuWLaPdu3erODFD6z//8z9p7NixlJ2drbb1jRv/D/VZQ9x4T3C8aMT97rvvqmOiVuuoUaPazlkcy99nDbH5ftaMxB0Nj/A+vz3vt62Wn5k5cyZt2bJFfS3o27ev4TtZGK0Tl59x4yD1UIhmPmmBaOguLy+n5557Tpnn1KlTbX0X60+zrZafmT17NhUVFdF7770X0GA9q1Di5QacPnbSDKKZT841Ut3NDkoTRKpZq8niDZwzZw5t2LBBfS0YOHAgcQFfXexyhxMrRDOfB1qR6t7ugNEE0dKs1WQxfOvVV1+ljRs3UqdOnVS+A+AW22ljC8OFm9kA0cxntEAkussdOprAlgVikHgHo0ePvuD3L7zwAk2bNo3cjJ1ydbFCNLvfXCPV3ezANIGtC8TE6JmaLUlPTyduiGb3m2ukurc7ME0QqWapXaAJPHns0aMHcUI0u99cI9Fd7tA0QaR9LSarieTkZOKGaHa/uZrV3ezgNEGkfS0mqwkMiuaGaHa/uZrVvd3BaYJI+1pMVhOYTcIN0ex+czWju9zhaYJI+1pMVhO4YnNDNLvfXMPV3eyCNEGkfS0mqwnMe3b7WGBfRLP7zTVc3dtdkCaI9PwWk9VEz549iRui2f3mGo5ut6QJIj2/xWQ1gdlt3Abmi2b3m6tR3W5KE0R6fovJaoKb2QDR7H5zNdrXbkoT2HpaLWdkiilfzW42VyN97bY0ga2n1XIGy+xwg7tmDuYaqq/dmCaI9PwWk9UEKqtzexDEVXNqaiobcw3V125ME0R6fovJagIfPG7YUTMW7dxYtJmKd+6kmto6iouPp9aWFurYIYVyhw+nmyaMp9zcXFNt4851586dVFJSwsZcg/W1W9MEkZ7fYrKawNpCbjvJnKR57br19NTSZZQxIJtyxoyjW2+8lZK9BpPX19ZS6b49VLD0OaooXUD3zJpJeVMmG2rbOy2QmJioDJaLuQbqazenCSI9v8VkNcGxzKMdNGOBvRmz51ByRh+a+avl1D7F/ywdGO6QnJHq1VBXSxtWLKXfvfYaLX96ScBKS/5yrliSBIuDcjHXQH3t5jRBpOe3mKwmpCJV7CktLaVbbruD8uY+TIMuvdzwfjDiKbPn08HP/kYTJ+fRmpdfpKysLEMPtGCydrl7t6qv3Z4m8CBVuGxYe5LbXH4rNeMOFgY7bdFiyugTeLHOYMCYsf/NP7ydijasU1MoQz3QwgB1t5qKkb7mkCaI9PwWk9VE9+7diRtWakaKAHewZg3WA/ZHOz/4j1tpzHXfCvlAi2M/e+vmkCaItK/FZDWBE4/bwHyrNOMhF3Kw4aQIgoF2umRl0+49e+j6b3876AMtjv3s0R0fH88iTRBpX8e12uFpRZDbc6xse/r0aercubPV4Qg25drrvxP0IdeMb4+kdklJ1K59snrI1W/w12nSj/NpSM6IgG1iu9/M+RF9+N67rB5oGQVpgmeffVYZD9IEeXl5xI0zBv0pPqZRMQJT8LhhhWaMg8UwrUAG62Hek8vpiY1bqfBPH9DoST+gx+++jf7x15KA26O9Pl+/WI2DDQbHfgZbt25lkyaItK/FZDXBbeaTVZox0QDjYMPhyhu+Rzfcchu98dvlQbfLHTNOtR8Mjv2M0QSffPIJmzRBpH0tJquJqqoq4oYVmkt27aKBFw8Ne7+vX55Dh/d/HnSbAUOGqpliweDWz57RBJj95PbRBNHqazFZTSBXww0rNJ+rqQ2ZKvCHkUcRmLCA9oPBrZ89owkAlzRBpH1tS5MtLCxUV8gRIwI/mLA7dXV1xA0rNKMWgRn2795F/b42JOL2OfWz96SDa6+9lk2aINK+tqXJ5ufn0969e2nHjh3kVDC8hRtWaEaxl3D55O0/0purX6Qb77w74va59LPvpIPs7GziRrzJvpZxsppA4RBuWKE5tWMHVezFu/iLP56YO6NtCFff7K/RT595ib5+RU7QfdAu2g8Gl372nXRg45Gf2jDb1zzOEAuoxQfUhqX/3KY5Z9gwVU0LhV4CsXzbP5+EhwvaRTlE7v3srzYBDNftuqPV1zy+61hAWloaccMKzagHW7J1i5a2i7duUe1z7udAtQncrtsfZjWLyWosWMINKzSj4HZF6QGVBogmSBVUHjpAOTk5rPs5UG0Ct+v2h1nNYrKa4Dif3SrNKLhdtGJpVNssWlFI986axbqfg5UwdLPuQJjVLCarCY7TLa3SjBUN6ivKVD3YaIB2GqvKacrk77Pt51AlDN2qOxgyrdZmZGZmEjes1IwVDdY++XOqKDsSUTsVRw6rdtAe534OVcLQrbqDYVazmKwmUMyZG1ZqxpIxq19aRSsX/nOFAzNgv5WPPaBWRkhPT2fbz0ZWOnCj7lCY1SxDuDTRrVs34obVmgcMGECb1q9VBbxLevSmiT/ONzTlFg/NNj1fqFIEWBHBqMHaQXO0MbrSgdt0G8GsZjFZTZw7d87yNa84asYd7bo1q1Uh7yXzZ1J61iBVTQvFXvytVothWlWHDqqHZ0ZysHbUHE2MrnTgNt1GMKtZTFYTSUlJxA07acbDMLxQb/aNzX+gV1avpC+PHFG1CLqmpVGn1I5qosFP8/8r5DAtp2iOlHAWRHSTbqOY1SwmK7gajKPFq7GxkQoKCtTvHnroIZYmEQxOCyLGGnnwpYmGhgbihmh2LuEuiOgW3eFgVrOYrCY4rkkmmt2fJnCT7nAxq1lMVhMnTpwgbohmPmkCp+s2g1nNYrKakMHaPHC65nDTBG7RbQaZjGAzjh49StwQze5PE7hBt1nMahaT1YQU0OCBUzVHOprAqbojQQrE2AwpoMEDp2o2myZwuu5IkAIxNiOcqZluQTS7P03gZN2RYlazmKwmTp8+TdwQzXwmHThNdzQwq1lMVhMpKSnEDdHs/jSBU3VHA7OaxWQ10WJiqWqnI5rdnyZwou5oYVazmKwmmpqaiBuimU9tAqfojiZmNWs12ffee48mTpxIvXv3pri4ONXJXMDXMW6IZvenCZymO5qY1azVZGtqauiKK66gwsJC4sapU6eIG6LZ/WkCJ+mONmY1ay11iCtmNK6aTiQjI4O4IZr5lDC0u24dmNUcb7dSYmfOnLng5VRkDSQe2F1ztNMETtGtA7OabWWyKKrcpUuXtle/fv3U7+vr69W8YTzd88y6wL8oxIwTCMtC4Fb+5MmTVFdXp94MJKm9tz1//rz6fW1trdquurpapTOOHz+u/ua9La7+OB7aQuUdjI87e/YsVVZWqguB97a4Q8C/+D3+7rk4tG/fXu1vNG7E5S9u/OwbN/bzFzeOEypuT7y+cWM7bI/9AsWN4+G4OD7i8I3bg7+4oRP7QTf0B4q7qqqq7T30F7dnn2Bxo/9848a2KNSNYTiIxRO373voiRttGYkbzxpwfvqLG7H4ixtt+caNr/T+4sb7jfMU73eocxZteMd98OBB2rVrFyUkJNC1116r0gTe77dv3Ph/qM8a4kbbeB+jHfcJr3MWx/L3WUNsvp81I3FHwyO8z29P3EaIa0XkMQAn44YNG2jSpEkBt8Gb510YF28gjBZvvNPqV6IjuM3vtrNmXSsj2FUzTODZZ59VBoMUwdSpU6Pavl1168RXM/wJN4Oh/MlWy8/g7g8vNyA5Kx7YVbN3muB73/seG906cUVO1k3g6wY3RLN7RxM4QbduzGrWeieLPMj+/fvbfv7iiy9Ujgjrl/fv35/cTGpqKnFDNNtrNAHSBLoWRLSb7lhgVrPWO9lPP/2Uhg8frl5g3rx56v+PPvoouR3kALkhmt2fJrCr7lhgVrPWO9nRo0erK6ogCO5IEwjhIzlZTUTr6bWTEM3uTxPYTXcsMatZTFZjPpobotn9aQK76Y4lZjWLyWoCD/e4IZr5pAnsoDvWmNUsJqsJ3FVwQzS7P01gF91WYFazmKwmuM2GAaLZ/WkCu+i2Almt1mbIap48sFKzlaMJpK+NIyariV69ehE3RLP70wQepK+NIyarCclZ8cAqzValCTxIXxtHTFYTaWlpxA3RzGfSgfS1ccRkNYGaldwQze5PE3iQvjaOmKwm4uP5vbWi2f1pAg/S18bh907FCFSj54Zodn+awIP0tXFsVbTbbV8tOnXqRJwQzfZIExQXF9PGos1UvHMn1dTWUVx8PLW2tFDHDimUO3w43TRhPOXm5kYUj/S1ccRkNSEPBngQK81G0gRr162np5Yuo4wB2ZQzZhzdeuOtlNyhQ9vf62trqXTfHipY+hxVlC6ge2bNpLwpk03FI31tHDFZTWChN26zYkSzNWkCxDBj9hxKzuhDM3+1nNqn/NtYvYHhDskZqV4NdbW0YcVS+t1rr9Hyp5dQjx49wopJ+to4kpPVBLcTEIjm2KcJSktLaeLkPBp18500Zfb8gAbrC7bD9tgP+x86dCisuKSvjSMmqwmZdsgD3ZqDpQlwZ3XLbXfQtEWLadCll5tqH/th/5t/eLtaWtso0tfGEZPVRGZmJnFDNMc2TYAUQd7chymjT9+IjoP90Q7aM4r0tXHEZDVx7Ngx4oZojl2aAA+5kIM1ewfrC9pJSs9U7RpB+to48uBLE1LUmAe6NIcaTYBRBHjIFYwZ3x5J7ZKSKCk5Wf2cPfQKmvU/vwq4/cQf59NT82cYGnEgfW0cMVmNS1Uk/+vk5oJojk2aAONgMUzLyEOueU8up4EXDzV0XLTXIyubSkpKKCcnJ+i20tfGkXSBJmShOR5EW7ORSQeYaIBxsDrIHTNOtR8K6WvjiMkKgo0wMumgZNcuw3enT8ydQfdPGqNeH7+1JeT2A4YMVTPFhOgh6QJNNDY2EjdEc2xqE5yrqTU8HjacdIFnwgLaD4X0tcPvZAsLC9XXpBEjRpBTSU1NJW6I5tjUJkAtAp0YaV/62uEmm5+fT3v37qUdO3aQUzl58iRxQzTHpoQhir3oxEj70tcON1k3IGsg8SAamsMtYZjasYMq9qIDtIv2QyF9bRwxWU3gg8MN0RyblQ5yhg1T1bRCsXzbJ2HlYwHaRTnEUEhfG0dMVhNSQIMHkWo2s9IB6sGWbA09UsAMxVu3qPZDIX1tHDFZTUgBDR5EotnsSgcouF1RekCVK4x2qqDy0IGQExGA9LVxxGQ1EW59TjcgmmO3ICIKbhetWErRpGhFId07a5ahbaWvjSMmq4lTp04RN0Rz7BZERH2B+ooyOvjZ3ygaoJ3GqnKaMvn7hraXvjaOmKwmUlJSiBuiObYLImJFg7VP/pwqyo5QJFQcOazaQXtGkb42jpisJvB1kBuiWX+awPfr6+qXVtHKhfNN39Fiv5WPPUBrXn6R0tPTDe8nfW0cmVariRbNA8btiGjWnybwZcCAAbRp/VpVcLukR29VrtDIlFs8NNv0fKFKERRtWBeWwQLpa+OIyWpCvk7xIBzN0UoT+LujXbdmtSq4vWT+TErPGqSqaaHYi7/VajFMq+rQQfXwzGgO1hfpa+OIyWpMknM7EUVzbNIEwR6G4YV6s29s/gO9snolfXnkiKpF0DUtjTqldlQTDX6a/1+GhmkFQ/raOGKymsjIyCBuiObYpQlCjaPFC1WjCgoK1O8eeuihqNaAlb42jjz40oSsgcQDI5p1pQmsRPraOGKympBphzwIpTkWaQIrkL42jpisJmTaIQ9CaY5lmiCWSF8bR0xWE5Kz4kEwzW5ME3iQvjaOmKwmpKgxb81uTRN4kL42jpisJmR5Dt6a3Zom8CB9bRwxWU3IQnN8Nbs5TeBB+to4YrKCEEXcniYQwkdMVhPRHPjtFESz+9MEHqSvjSMmq4lz584RN7hr5pAm8MC9r8NBTFYT3bp1I25w1swtTcC5r8NFTFYT+MrIDc6auaQJPHDua1uabGFhoap7mZycTN/85jfpk08+Ibcj0w75aOaUJuDe17Y02TVr1tC8efNo4cKFVFJSQldccQV997vfdf2VUKYd8uDw4cOs0gSc+7rMrtNqn3jiCbrrrrvozjvvVCfg8uXL1Veq3/72t+RmevXqRdzgqPkf//gHqzQB577uZVJzvO7BuyggPGbMmH8fMD5e/fzhhx9+ZfuGhgY6c+bMBS+n4vY7dX9w04w0we7du1mlCbj2tW1zslVVVeqpa8+ePS/4PX72V5sRBYa7dOnS9urXr5/6fX19PR09elStseO5Zce/MHEIx9AKVC3H3OK6ujrVdlNT0wXbnj9/Xv2+trZWbVddXU01NTV0/Phx9TfvbREzjoe2Tpw4QadPn6azZ89SZWWluhB4b4uvifgXv8ffPRcHxIr9jcaNuPzFjZ9948Z+/uLGcULF7YnXN25sh+2xX6C4cTwcF8dHHL5xo58CxQ2d2A+6oT9Q3DhnPO+hv7g9+wSLG/3nGze2xThHVLZHLJ64fd9DT9xoK1jcnjRBQkKC+oaG4iG+cSMWf3GjLd+4Ydj+4sb7jfMU73eocxZt+MaNqaCIEX/zfb/RX97vN/4f6rOGuD1LY0c77hNe5yyO5e+zhth8P2tG4o6GR3if3564jRDXisg1AdFIFn/wwQc0atSott//5Cc/UU9jP/744wu2x5uHlwe8gTBavPGdO3cmJ4ETpnv37sQJO2uO9ioB27Zto/fff18N6/nRj35ky7tYnSsj2LmvdeGrGf6Em8FQ/qR1+RmsgImrKK4E3uBnf/mN9u3bq5cbSEzkt7IPF83eowmuueYaWxqsbrj0dTQ0a00X4MqJtYbefvvttt/hdh4/e9/ZuhHknrnBQbPvpIPBgwcTRzj0dbQ0a3+nMHzrueeeo1WrVtHf//53mjlzpspzYLSBm0HehxscNPtOOuCg2R8cddeZ1Kz9nv/mm29WSepHH31UJZWHDRtGf/zjH7/yMMxtIFfDDbdr9jfpgOPXZg59HU3NMbnnnz17Nh06dEg91MLDLsz6cjt44skNN2sOVJvAzZqDwVF3lUnN/BIrMUKmHbqLQLUJ3Kw5GBx197HrtFquyLRD9xCsNoFbNYeCo+4yu06r5Urv3r2JG27UHKqEoRs1G4Gj7t4mNYvJasLobBA34UbNoUoYulGzETjqLjepWUxWE9xmw7hRs5EShm7TbBSOurub1CwmqwknF7cxi5s0G13pwE2aw4Gj7jMmNYvJasIt04O5aja60oGbNIcDR93tTWoWkxUEHziudCDoQ0xWYwUkbrhBc7gLIrpBsxk46m40qVlMVhOo48kNN2gOd0FEN2g2A0fdqSY1i8lqAkV/ueF0zWbSBE7XbBaOuk+a1CwmqwlZA8ndaQI3aI4Ejrp7mdTMs4RQjO6KuM3vtqNmrDG3sWgz7SguoSNlZRQXH0/b/vwBpXbsQLnDh9NNE8armsfhpgnsrDkWcNRdblKzmKwmuJ2AdtO8dt16emrpMsoYkE05Y8bRbTfeSskdOrT9vb62lkr37aGCpc/R0f3zKatvbxry9a+HPZrATppjCUfdfUxqFpPVWEyC24loB82oXTxj9hxKzuhDM3+1nNqn/NtYvYHhDskZqV4NdbX0+8InaOu722nWrFmO02wFHHWXmdQsJquJHj16EDes1lxaWkq33HYH5c19mAZdernh/WDEP5z/CB387G80cXIerXn5RcrKynKEZqvgqLuHSc3y4EsTnmWTOWGlZtzBwmCnLVoclsF6g/2w/80/vN1wgWaO/cxV9ymTmsVkNYEHKNywUjNSBLiDzejTN6J2sD/aQXtG4NjPXHV3MKlZTFYTTU1NxA2rNOMhF3KwZu9gfUE7SemZqt1QcOxnrrqbTGqWnKwmsPQ5N6zSjFEEeMgViBnfHkntkpIoKTmZzjc20sCLh9LM/158wWgDXyb+OJ+emj+D8qZMDnpsjv3MVXeLSc1yJ6uJlJQU4oYVmjEOFsO0Ao0i8DDvyeX0q9e30q+L3qXac2fpnQ1rgm6P9npkZVNJSUnQ7Tj2M1fdKSY1i8lq4vTp08QNKzRjogHGwRql6XwjNdTVUWrn0Ms7544Zp9oPBsd+5qr7tEnNYrKaSE9PJ25Yoblk1y719T8UT8ydQfdPGkPTrxlG8fHxdNW4G0PuM2DIUCreuTPoNhz7mavudJOaxWQ1cfz4ceKGFZrP1dSGTBV4pwtWfriHevTpSy8tfjzkPsjZov1gcOxnrrqPm9RsS5MtLCxUBTpGjBhBToXbbBirNKMWQTgkJCbSlTeMp51/ficq7XPsZ666+5jUbEuTzc/Pp71799KOHTvIqci69LGh1cQT3z0f/Zn6DMyOSvsc+5mr7jKTmmUIlyYyMjKIG1ZoRjUtFHsJNhzLk5PFEC6UNOzRuy/d/dj/hmwb7aL9YHDsZ666M0xqFpPVxIkTJ9jV3LRCc86wYaqaFgq9BGL5tk9MtY12UQ4xGBz7mavuEyY12zJd4AY6d+5M3LBCM+rBlmzdoqXt4q1bVPvB4NjPXHV3NqlZTFYT9fX1xA0rNKPgdkXpAVWuMJogVVB56ADl5OQE345hP3PVXW9Ss5isJuLi4ogbVmm+Z9ZMKlqxNKptFq0opHsN1Jbl2M9cdceZ1Cwmq4mkpCTihlWaUV+g9thhOrDnb1FpD3VlG6vKacrk74fclmM/c9WdZFKzmKwmzp07R9ywSnNtbS1dNXIEPb/wAaooOxJRWxVHDtOKxx6k//2f/za0Pcd+5qr7nEnNYrKa6NatG3HDCs0w2BdffFH9O+XGCbTiZ3PVnagZsN9v5v0Xjb3+Otq0aRNVV1eH3IdjP3PV3c2kZjFZTWDlU27EWrPHYDHdEYsfzps3j/7w+gb6cM0LtHbJLw0/DMN22P6j11bSlo2vU3Z2Np05c4ZWrlwZ0mg59jNX3RUmNce1YqF5m4ITvUuXLqr6DcchI4Jxg502bdoFBTxQcHvJsuWUnjVIVdNCsRd/q9VimFbVoYPq4ZknB3v27FlatWqVGheJ8w5td+3alZxGY2MjFRQUqP8/9NBDLPOodvAnMVlNyGqe1hmsb73ZNzb/QVXTQrEX1CLAVFnM5MJEA4yD9TdMy6jR2rmfdZqsnXXrwlezUX+SGV+a4DYbJlaawzFYzzhavMKlU6dOdMcdd7QZLVIH/oyWYz9z1d3LpGbJyWpCSsFZb7CR4jHa7t27B8zRcuxnrrqPu6nUoRtwYg7PzppjbbBGjZZjP3PV3dWkZjFZjabADV2arTJYI0bLsZ+56q41qVlMVhOJifzS3To0W22woYyWYz8DjroTTWoWk9UE1pHiRrQ128Vggxktx5lPQM5v4/B7p2KEVClyl8EGMto33njD0MwwtyHnt3HEZDXhtHG9dtJsV4P1Z7Se4V3cjFbOb+OIyWqiqqqKuBENzXY3WF+jzczMNDwF103I+W0cMVlNcJsNEw3NTjFYb6P9wQ9+EHQcrVuR89s4YrKakNU83W2wHmCuoSYsuBE5v40jJquJ3r17EzfManaqwXo0G5kZ5jbk/DaOmKwmjh49Stwwo9nJBuutmZvRyvltA5N9/PHH6aqrrqIOHTpQWloaccNJRmGVZqcbLPCOl5PROq2frNQcr7PM2tSpU2nmzJnEEXzIuBGOZjcYrD/NXIxWzm8bmOyiRYto7ty5dNlllxFH2rdvT9wwqtktBhtIMwejlfPbOJKTFWKKmww2GByMVnCgyTY0NKgT0vvlVJAu4UYozW402GCa3Wy0cn5rMtkFCxZQXFxc0Ne+ffvILFgqA8s5eF79+vVrmzOMJ3stLS1tY9XwL0RjcTMU6Th16hSdPHmS6urq6NixY9TU1HTBtufPn1e/xwcd2+Fkr6mpUR94/M172+bmZnU8tIVpk1heAsuRVFZWqguB97ZYvQf/4vf4u+figJ+xv9G4EZe/uPGzb9zYz1/cOE6ouD3x+saN7bA99gsUN46H4+L4iMM3brQRKG78/5VXXlE/w3zGjx+vDNY3bsyq8byH/uL2tB8sbvSfv7jR375x+76HnrjRFrZD/0Av+gv95vt+4284P/3FjVhSU1Np7NixymhRYAQXmYMHD34l7vLy8pBxhzpn0YZv3Dh+QkKC+pvveeIbN/4f6rOGuNE2jh/tuL3PWRzL32cNsfl+1ozEHQ2P8D6/PXEbIaw1viAMb0QwBg0adMFaQrh633fffUpgKPDm4eUBbyCM1olrfKHDuY0lDKTZjXew4fazFYsz6lzjS85v0rPGV48ePdRLZ2LZLQl1WQPJ/QYbTj8bXTPMKcj5bYOc7Jdffkm7du1S/+LWGv/Hi0v9TaNfJdys2e0GG24/uylHK+e3DUz20UcfpeHDh9PChQuVseL/eH366afEAe4FNDgYrJl+dovRcj+/bWGyOHmQ7vV9jR49mjjAuYAGF4M1289uMFrO57ejh3C5CZ25aztr5mSwkfSz042W6/ltBjFZTRgZTeE2MPyFk8FG2s9ONlqO5/cpk5rFZDWBwjicwB3sm2++ycpgo9HPTjVabud3JJrFZDWBgc5c8KQIYA6cDDZa/exEo+V0fkeqWUxWE5h5wgHvHCyu9JwMNpr97DSj5XJ+R0OzmKwmkpOTye34PuSaNGkSK4ONdj87yWg5nN/R0iwmqwknF7cxgr9RBImJYU0gdAXR7menGK3bz29H1JPljpvv6AIN03Kz5kDo0OwEo5W+No6YrCZgQG4k2DhYt2oOhi7Ndjda6WvjiMlqwo3TDkNNNHCj5lDo1Gxno5W+No6YrCbcNu3QyEwut2k2gm7NdjVa6WvjiMlqomfPnuQWjE6VdZNmo8RCsx2NVvraOGEV7Y41Rovi2nWKqRtqboZTi8AtmsMhlpqNFv4uLi6mjUWbaUdxCR0pK6O4+HjqmpZGqR07UO7w4XTThPGUm5sbUSzS12TYn8RkNZqT06cehlvsxQ2awyXWmoMZ7dp16+mppcsoY0A25YwZRwOGDKVkr9jqa2updN8eKtm6hSpKD9A9s2ZS3pTJpuKQviYxWavBGkHdunUjp2KmmpbTNZvBCs2+RjthwgRa8MjPKDmjD02YPovap4Q2v4a6WipasZTqK8po+dNLwq4wJX1Nhv1JcrKawKKSTsVsuUInazaLFZq9c7SHDh2iG6dMpVE330lTZs83ZLAA22F77Ddxcp5qJxykr40jJquJdu3akROJpB6sUzVHglWaPSv+vvnOu3Tvr5+jQZdebqod7Ddt0WK6+Ye3q1VfjSJ9bRwxWU1gKWGnEWnBbSdqjhQrNc9f8BBNX/gLyujTN6J2sH/e3Idpxuw5hveRvjaOmKwmnJavisaKBk7THA2s0oyHXMjBmr2D9QXtJKVnqnaNIH1tHDFZTVRUVJBTiNaSMU7SHC2s0oxRBHjIFYwZ3x5Jc8ZeQ/dPGtP2OvT53wNuP/HH+fTUsmWGji99bRx+ZZNihFOmHUZzTS6naI4mVmjGOFgM0zLykGvek8tp4MVDDbWL9npkZVNJSQnl5OQE3Vb62jhyJ8t42mG0Fz10guZoY4VmTDTAOFgd5I4Zp9oPhfS1ceROVhOZmZlkZ3SsKmt3zTqwQnPJrl106023Gtr2ibkzKMmr2PTPV2+i9skpAbfHBIZXX1sVsl3pa+OIyWqcgte7d2+yI7qW7bazZl1YoflcTa3h8bDhpAsAZoih/VBIXzs8XVBYWEiXXHIJjRgxgpyKvznlbjZYO2vWiRWaUYvA6valrx1usvn5+bR3717asWMHORWYGSeD9bTPDSs0t2pexNBI+9LXxpF0gSbstt6VboO1o+ZYYIVmVNNCsRfv4i9Gc7LTFiyiy668OuD2aBfth0L62jj83qkYEa/5K53dDNZummOFFZpzhg1T1bSG5IwMut3ybZ+E3TbaRTnEUEhfG4ffOxUj6uvriZPB2klzLLFCM+rBolyhDoq3blHth0L62jhispqwQ2nGWBqsXTTHGis0o+A26sGiXGE0Qaqg8tCBkBMRgPS1ccRkNRFORSM3GKwdNFuBVZpRcBv1YKNJ0YpCundW8Km6HqSvjSMmqwkrxxBaYbCA27hJKzVjRQMU3D742d+i0h7aaawqpymTv29oe+lr44jJauLo0aOsDNZKzVZipWasaLD2yZ9TRdmRiNqpOHJYtYP2jCJ9bRwxWU1YcaW30mCB3N3EFiwZs/qlVbRy4XzTd7TYb+VjD9Cal18M61yRvjaOmKwmYn2lt9pggdzdxJ4BAwbQpvVr6cM1L9DaJb80/DAM22H7j15bSUUb1lFWVpajdFuBWc2ykKImGhoaqH379mwMNtaa7YKdNKPg9pJlyyk9a5CqphVotVoM06o6dFA9PDOag7Wz7ljhq1lWq7WYysrKsFcAdbLBxlKznbCjZtSbfWPzH6h4505V7AW1CDBVFjO5MNEA42CNDNNymm7d+Go26k8y40sTyV5TGTkYbKw02w07asY4Wry46daNWc2Sk9VEi+YiHnYz2FhotiMcNXPV3WJSs5isJpqamlgZrG7NdoWjZq66m0xqFpPVRAcDFZLcZLA6NdsZjpq56u5gUrOYrCaqq6tZGawuzXaHo2auuqtNahaT1USvXr2i2p7dDVaHZifAUTNX3b1MahaT1UR5eTkrg422ZqfAUTNX3eUmNcs4WZvjFIMVBG6cMehPcieriWisS+80g42GZqfBUTNX3WUmNYvJaiIjI4OVwUZDsxPhqJmr7gyTmsVkNXHy5ElWBhupZqfCUTNX3SdNahaT1QTMkZPBRqLZyXDUzFV3R5OaxWQ1cf78eVYGa1az0+Gomavu8yY1azPZ0tJSmj59Og0cOJBSUlIoOzubFi5cSI2NjcSBcAdtON1ggY0HqmiDo2auultNatZWhWvfvn2qoMIzzzxDgwcPpj179tBdd91FNTU1tHjxYnI74VTscYPBAqnMxAeOupNNatZmsmPHjlUvD4MGDaLPP/+cli1bxsJkMYbOyFxntxhsOJrdBEfNXHWfMak5pjlZDNrt1q0bccCIUbrJYIGTYzcLR81cdaeb1Bwzk92/fz8tWbKE7r777qDLO+Bq4f1yKjBOTgZrRLMb4aiZq+7jJjWHbbILFiyguLi4oC/kY31nSiB1MHXqVJWXDURBQYGapuZ59evXT/2+vr5eLWKGHK9n1gX+xUO0iooKOnfuHJ06dUqNY6urq6Njx46p2o/e2+LJIH4Pc8N2qKiD/DDeOPzNe9vm5mZ1PLR14sQJdQd+9uxZtfwELgTe2yIZjn/xe/zdc3HAWkDY31/caG/16tUqBtzZT548WX0N8Rc3fvaNG3r9xY3jhIrbE69v3NgO22O/QHHjeDgujo84EA/i8sTt3d++caN/sB/6C/0WKO6qqqq299Bf3J59gsWN/vMXN/rbN27f99ATN9oyEjfOd5yf/uJGLP7iRlu+cWNefKi4Q52zaMM7bhwj2PvtGzf+H+qzhjbRNh5mRzvuE17nLI7l77OG2Hw/a0bijoZHeJ/fnri11C6AOLwZwUD+NSkpSf0fwkePHk1XXnklrVy5kuLjA/s63jy8POANhNE6sXYBOqJPnz4s7mBDaXYzHDVz1V3mo9kWCykiqOuuu06tN/Tyyy9TQkICmwIxuEomJiayMdhAmt0OR81cdTf5aLa8QAwMFnew/fv3V6MJcAeMW3G8OICvMJwM1p9mDnDUzFV3lUnN2i5Fb731lnrYhVffvn3ZDWT2vrJxMFjgtG8b0YCjZq66O5vUrO1OFkYCM/X34gAS8ZwM1lszJzhq5qq73qRmqV2gCTzg42SwINhDTbfCUTNX3fEmNfPKXMcQDPnAMC0uBgu4PQjhqpmr7kSTmvldjmIA7mA3bdrEymA9urnBUTNX3bUmNfO7HGnGkyLAk0hOBgvS0tKIGxw1c9WdZlKz3MlGEe8cLIyVk8ECDNPjBkfNXHVXmtQsJhslfB9y5eXlsTJYwG0GEFfNXHX3MalZTDYK+BtF4D09mAuygikfOOouM6lZcrIREmiYFgpVcCMzM5O4wVEzV92ZJjXLnWwEBBsHy2X6sDeimQ8cdR8zqVlM1iShJhp07dqVuCGa+cBRd1eTmsVkTWBkJhfqUHJDNPOBo+4ak5rFZMPE6FRZTz1dTohmPnDUnWRSM9sHX8XFxbSxaDMV79xJNbV1FBcfT60tLdSxQwrlDh9ON00Yr+rgesOtFoEgCJHDzmTXrltPTy1dRhkDsilnzDi69cZbKdlrBcr62loq3beHCpY+RxWlC+ieWTMpb8rksA2W4xAu0cwHjrobTGrWujJCpERzZQTM1pgxew4lZ/ShCdNnUfuU0Ev7NtTVUtGKpVR77DBdNXKEMlqjd7DoEKzzxQnRzAeOuht8NFu+MoKdKC0tpYmT82jUzXfSlNnzDRkswHbY/qpbptPzq15Si7IZTRFI5XgecNTMVXeVSc2uv5PFHSwMdtqixZTR58IVGsKhouwIrfjZXNqy8XVDJou3FSuZckI084Gj7lYfzXIn+y+QIsib+3BEBguw/833/0y1ZwSs0ssN0cwHjrqPmtQc7/aHXMjBDrr08qi0h3aS0jNVu6GQAho84KiZq+4+UiDmq2AUAR5yBaPu3Dm6NWcwFf50nqE2J/44n55atizkdlJAgwccNXPVXWZSc7ybx8FimFaoh1x/2bKRBl1yOX381haqMzCjA+31yMqmkpKSoNtxHD8rmvnAUXe6Sc2uNVlMNMA42FC8vXY1Tborny75xjeV4Rohd8w41X4wkBTnhmjmA0fdZ0xqdq3JluzaRQMvHhp0m8P7/0FVx47SsGtG0/V5/0Hb1v7OUNsDhgxVM8WCkZycTNwQzXzgqDvZpGbXmuy5mtqQqYK31/6ORt+URwkJCZRz7fV0vOwwHTnw/0K2jRliaD8YHOvJimY+cNTdYlKzLafVFhYWqldzc7PpNlCLIBhN58/T9jfWUmJiO3q/aIP6XWNdHb299lW648GFkbff1ETcEM184Ki7yaRmW5psfn6+enkG+5oBxV6CsWPbn6hnvyz63zVFbb/DXeyjt0+hW+c9TInt2kXUfgeveghcEM184Ki7g0nNrk0XpHbsoIq9BOLtdb+jayd8/4Lf9c3+GnXr2Ys+feetoG2jXbQfjOrqauKGaOYDR93VJjXb8k42GuQMG6aqaQ3JGen37488+7Lf3y9e/6eQbaNdlEMMRs+ePYkbopkPHHX3NKnZtXeyqAdbsnWLlraLt25R7QdD1kDiAUfNXHUfkzW+LgQFtytKD6hyhdEEqYLKQwcoJycn6HYy7ZAHHDVz1d1HptV+FRTcRj3YaFK0opDunRV8qi6QaYc84KiZq+4ymVb7VbCiQX1FGR387G9RaQ/tNFaV05TJFz4w80dGRgZxQzTzgaPuDJOaXW2yYPnTS2jtkz9X9WAjoeLIYdUO2jPCyZMniRuimQ8cdZ80qdn1JtujRw9a/dIqWrlwvuk7Wuy38rEHaM3LLxouEpGamkrcEM184Kg71aRm15ssGDBgAG1av5Y+XPMCrV3yS8MPw7Adtv/otZVUtGEdZWVlGT4mlqrhhmjmA0fdjSY1u3acrL872nVrVquC20vmz6T0rEGqmhaKvfhbrRbDtKoOHVQPz4zkYH2x8ao+2hDNfOCou9WkZtev8RWs3uwbm/+gqmmh2AtqEWCqLGZyYaIBxsGGGqYVDKxsy23qoWjmA0fdtT6ajfoTmztZf+No8dIFOoDbSSia+cBR9xmTmlnkZK2ge/fuxA3RzAeOurub1Cwmq4mKigrihmjmA0fdFSY1s83JCoIgxMKf5E5WEzLtkAccNXPVXSbTau2FlILjAUfNXHX3lFKH9qKqqoq4IZr5wFF3lUnNYrKaMLtsjpMRzXzgqLuLSc1ispqoq6sjbohmPnDUXWdSs5isJuJDrGbrRkQzHzjqjjepmd87FSMSE/lNphPNfOCoO9GkZjFZjfOcuSGa+cBRd61JzWKymkhLSyNuiGY+cNSdZlKzmKwmKisriRuimQ8cdVea1KzVZG+88Ubq378/JScnU2ZmJt1222109OhR4oCs5skDjpq56u5jx9Vqr7vuOnrttdfo888/p3Xr1tGBAwcoLy+POCDTDnnAUTNX3WUmNce0QMwbb7xBkyZNooaGBmrXrp2rC8S0tLSwG+YimvnAUXeLj2bbFYjBSo+vvPIKXXXVVQENFuaLwL1fTuXYsWPEDdHMB466j5nUrH2w24MPPkhPP/20Gv5w5ZVXUlFRUcBtCwoKaNGiRX4TzuXl5apAA4T27t1b5XaxciyuIikpKdTU1KSuNPg/zBkFdlH/0bMt1viC0Xfq1Inq6+spLi6OkpKSqKamhrp27aqO4dkWx8G+eJqIWR4JCQnqCoaLAPY/ceJE27bINSM2HO/s2bOqTYB2jx8/TqdOnTIUN/LW2N83bqz1juN5x42LFN5P37h79eqljhksbk+8vnG3b99exdHc3Kzi8hc33sPq6mpVHf78+fNqzSPvuDG3Gyt6+osbcWCcIeLC1R/b+osbujwXYSxc5xu3Z59gcePYaM837o4dO6o2vePu1q3bBe+hJ27cmSDWUHFjW/wd/e0bN843bOMbN85PHN87bpwPiDNY3CDYOYufEaMnbvQ/3vtA7zfa8I4bfYpj4ZiBzlnEjZjRLtqIdtwJ/zpn0T76wPezhpjQZ96fNSNxR8MjvM9vHOfgwYPq+CGTAa1h8uCDD6LFoK+///3vbdtXVla2fv75561/+tOfWq+++urW733ve60tLS1+266vr289ffp022vv3r0hjyUveclLXmTh6/Dhw0E9M+ycLK46uLoEY9CgQW1XGW+OHDlC/fr1ow8++IBGjRoV8li46uCqgSsLripmGDFiBO3YsYNiCa6S0Hn48GFLcsmiOTZw1Gy17hE20gzrxB017oSD5afDThfglhovM8A0Ab6+GgGB9+3blyIBXz+semiG41pxbNEcWzhqtkp3gs00G6nMpS0n+/HHH6srzjXXXKPyGRi+9bOf/Yyys7MN3cVGi/z8fOKGaOaBaHYG2oZw7d69m+69917661//qhLHSFqPHTuWHnnkEdcPZHby0DOziGYemrnqPhOBZm13spdddhlt27aNOIIn3gsXLlT/ckE084Gj7vYRaLb1arWCIAhOh9eUDUEQhBgjJisIgqARMVlBEASNiMkKgiBoRExWM6WlpTR9+nQaOHCgmjONccJ4SumZ0+1WHn/8cVUMCHUO3FpFv7CwkAYMGKDm83/zm9+kTz75hNzMe++9RxMnTlQznDAD8/XXXyc3U1BQoGaYYcYpalqggiDKtoaLmKxm9u3bp2a6PfPMM/TZZ5/Rk08+ScuXL6eHH36Y3AwuIlOnTqWZM2eSG1mzZg3NmzdPXTBLSkroiiuuoO9+97uq4IhbwXh36MTFhQPbt29Xkx8++ugjeuutt1QhmhtuuEG9D2ERboEYIXL+7//+r3XgwIGtHHjhhRdau3Tp0uo2Ro4c2Zqfn9/2c3Nzc2vv3r1bCwoKWjkA69iwYUMrJyoqKpTu7du3h7Wf3MlaAGaNoFyb4Ny79OLiYhozZswFdTbw84cffmhpbILezy0I97MrJhtj9u/fT0uWLKG7777b6lAEk6CuKGqqoqaoN55apoL7aGlpofvuu4+uvvpqGjp0aFj7ismaZMGCBSr5H+yFfKzvGkGo34Bc5V133UUcNAuCG0Buds+ePbR69Wr7rYzgVu6//36aNm1ayLq6HlAXFwtL4on7s88+Sxw0uxVU20fJPawG4A1+xqoDgruYPXu2WtEFoyvMlF4VkzVJOHV1cQcLg83NzaUXXnjBsQvQRVJL2E2gID368u2331bDejxfJ/EzPpCCO2htbaU5c+bQhg0b6N1331XDMM0gJqsZGOzo0aMpKyuLFi9erFaW8ODmu54vv/xSrZeEf5G/3LVrl/r94MGD1TpJTgfDt+644w76xje+QSNHjqRf//rXamjPnXfeSW7l3Llz6pmChy+++EL1Kx4E9e/fn9yYInj11Vdp48aNaqysJ9+OkocY824YbeMdhLYhTIHWBnIzd9xxh1/N77zzTqtbWLJkSWv//v1bk5KS1JCujz76qNXNoO/89Sn62o1QgM8tPtPhIKUOBUEQNOLM5KAgCIJDEJMVBEHQiJisIAiCRsRkBUEQNCImKwiCoBExWUEQBI2IyQqCIGhETFYQBEEjYrKCIAgaEZMVBEHQiJisIAiCRsRkBUEQSB//H0IwzndqeOCzAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Construct an example graph \n", + "# Note that this is the same graph that is returned by:\n", + "# G = create_example_graph()\n", + "\n", + "G = EmbeddedComplex()\n", + "\n", + "G.add_node('A', (1, 2))\n", + "G.add_node('B', (3, 4))\n", + "G.add_node('C', (5, 7))\n", + "G.add_node('D', (3, 6))\n", + "G.add_node('E', (4, 3))\n", + "G.add_node('F', (4, 5))\n", + "\n", + "G.add_edge('A', 'B')\n", + "G.add_edge('B', 'C')\n", + "G.add_edge('B', 'D')\n", + "G.add_edge('B', 'E')\n", + "G.add_edge('C', 'D')\n", + "G.add_edge('E', 'F')\n", + "\n", + "G.center_coordinates()\n", + "\n", + "G.plot()\n", + "plt.savefig('figures/example_graph.png', bbox_inches='tight', dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'paper/figures/example_graph_7pi_over_4.png'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mFileNotFoundError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m G.plot(color_nodes_theta=\u001b[32m7\u001b[39m*np.pi/\u001b[32m4\u001b[39m)\n\u001b[32m 2\u001b[39m plt.title(\u001b[33m'\u001b[39m\u001b[33mColoring nodes with $g_\u001b[39m\u001b[33m\\\u001b[39m\u001b[33momega$ for $\u001b[39m\u001b[38;5;130;01m\\\\\u001b[39;00m\u001b[33mtheta = 7\u001b[39m\u001b[33m\\\u001b[39m\u001b[33mpi/4$\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[43mplt\u001b[49m\u001b[43m.\u001b[49m\u001b[43msavefig\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mpaper/figures/example_graph_7pi_over_4.png\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbbox_inches\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mtight\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m300\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/pyplot.py:1251\u001b[39m, in \u001b[36msavefig\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 1248\u001b[39m fig = gcf()\n\u001b[32m 1249\u001b[39m \u001b[38;5;66;03m# savefig default implementation has no return, so mypy is unhappy\u001b[39;00m\n\u001b[32m 1250\u001b[39m \u001b[38;5;66;03m# presumably this is here because subclasses can return?\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1251\u001b[39m res = \u001b[43mfig\u001b[49m\u001b[43m.\u001b[49m\u001b[43msavefig\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore[func-returns-value]\u001b[39;00m\n\u001b[32m 1252\u001b[39m fig.canvas.draw_idle() \u001b[38;5;66;03m# Need this if 'transparent=True', to reset colors.\u001b[39;00m\n\u001b[32m 1253\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m res\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/figure.py:3490\u001b[39m, in \u001b[36mFigure.savefig\u001b[39m\u001b[34m(self, fname, transparent, **kwargs)\u001b[39m\n\u001b[32m 3488\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m ax \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.axes:\n\u001b[32m 3489\u001b[39m _recursively_make_axes_transparent(stack, ax)\n\u001b[32m-> \u001b[39m\u001b[32m3490\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcanvas\u001b[49m\u001b[43m.\u001b[49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/backend_bases.py:2186\u001b[39m, in \u001b[36mFigureCanvasBase.print_figure\u001b[39m\u001b[34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[39m\n\u001b[32m 2182\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 2183\u001b[39m \u001b[38;5;66;03m# _get_renderer may change the figure dpi (as vector formats\u001b[39;00m\n\u001b[32m 2184\u001b[39m \u001b[38;5;66;03m# force the figure dpi to 72), so we need to set it again here.\u001b[39;00m\n\u001b[32m 2185\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m cbook._setattr_cm(\u001b[38;5;28mself\u001b[39m.figure, dpi=dpi):\n\u001b[32m-> \u001b[39m\u001b[32m2186\u001b[39m result = \u001b[43mprint_method\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2187\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2188\u001b[39m \u001b[43m \u001b[49m\u001b[43mfacecolor\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfacecolor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2189\u001b[39m \u001b[43m \u001b[49m\u001b[43medgecolor\u001b[49m\u001b[43m=\u001b[49m\u001b[43medgecolor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2190\u001b[39m \u001b[43m \u001b[49m\u001b[43morientation\u001b[49m\u001b[43m=\u001b[49m\u001b[43morientation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2191\u001b[39m \u001b[43m \u001b[49m\u001b[43mbbox_inches_restore\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_bbox_inches_restore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2192\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2193\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 2194\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;129;01mand\u001b[39;00m restore_bbox:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/backend_bases.py:2042\u001b[39m, in \u001b[36mFigureCanvasBase._switch_canvas_and_return_print_method..\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 2038\u001b[39m optional_kws = { \u001b[38;5;66;03m# Passed by print_figure for other renderers.\u001b[39;00m\n\u001b[32m 2039\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mdpi\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mfacecolor\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33medgecolor\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33morientation\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2040\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mbbox_inches_restore\u001b[39m\u001b[33m\"\u001b[39m}\n\u001b[32m 2041\u001b[39m skip = optional_kws - {*inspect.signature(meth).parameters}\n\u001b[32m-> \u001b[39m\u001b[32m2042\u001b[39m print_method = functools.wraps(meth)(\u001b[38;5;28;01mlambda\u001b[39;00m *args, **kwargs: \u001b[43mmeth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2043\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43m{\u001b[49m\u001b[43mk\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mskip\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[32m 2044\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# Let third-parties do as they see fit.\u001b[39;00m\n\u001b[32m 2045\u001b[39m print_method = meth\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/backends/backend_agg.py:481\u001b[39m, in \u001b[36mFigureCanvasAgg.print_png\u001b[39m\u001b[34m(self, filename_or_obj, metadata, pil_kwargs)\u001b[39m\n\u001b[32m 434\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mprint_png\u001b[39m(\u001b[38;5;28mself\u001b[39m, filename_or_obj, *, metadata=\u001b[38;5;28;01mNone\u001b[39;00m, pil_kwargs=\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m 435\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 436\u001b[39m \u001b[33;03m Write the figure to a PNG file.\u001b[39;00m\n\u001b[32m 437\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 479\u001b[39m \u001b[33;03m *metadata*, including the default 'Software' key.\u001b[39;00m\n\u001b[32m 480\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m481\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_print_pil\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mpng\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpil_kwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/backends/backend_agg.py:430\u001b[39m, in \u001b[36mFigureCanvasAgg._print_pil\u001b[39m\u001b[34m(self, filename_or_obj, fmt, pil_kwargs, metadata)\u001b[39m\n\u001b[32m 425\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 426\u001b[39m \u001b[33;03mDraw the canvas, then save it using `.image.imsave` (to which\u001b[39;00m\n\u001b[32m 427\u001b[39m \u001b[33;03m*pil_kwargs* and *metadata* are forwarded).\u001b[39;00m\n\u001b[32m 428\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 429\u001b[39m FigureCanvasAgg.draw(\u001b[38;5;28mself\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m430\u001b[39m \u001b[43mmpl\u001b[49m\u001b[43m.\u001b[49m\u001b[43mimage\u001b[49m\u001b[43m.\u001b[49m\u001b[43mimsave\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 431\u001b[39m \u001b[43m \u001b[49m\u001b[43mfilename_or_obj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mbuffer_rgba\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m=\u001b[49m\u001b[43mfmt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morigin\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mupper\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 432\u001b[39m \u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfigure\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmetadata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpil_kwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpil_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/matplotlib/image.py:1657\u001b[39m, in \u001b[36mimsave\u001b[39m\u001b[34m(fname, arr, vmin, vmax, cmap, format, origin, dpi, metadata, pil_kwargs)\u001b[39m\n\u001b[32m 1655\u001b[39m pil_kwargs.setdefault(\u001b[33m\"\u001b[39m\u001b[33mformat\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28mformat\u001b[39m)\n\u001b[32m 1656\u001b[39m pil_kwargs.setdefault(\u001b[33m\"\u001b[39m\u001b[33mdpi\u001b[39m\u001b[33m\"\u001b[39m, (dpi, dpi))\n\u001b[32m-> \u001b[39m\u001b[32m1657\u001b[39m \u001b[43mimage\u001b[49m\u001b[43m.\u001b[49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mpil_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Library/CloudStorage/Dropbox/Math/Code/ect/.conda-ect-3-11/lib/python3.11/site-packages/PIL/Image.py:2583\u001b[39m, in \u001b[36mImage.save\u001b[39m\u001b[34m(self, fp, format, **params)\u001b[39m\n\u001b[32m 2581\u001b[39m fp = builtins.open(filename, \u001b[33m\"\u001b[39m\u001b[33mr+b\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 2582\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2583\u001b[39m fp = \u001b[43mbuiltins\u001b[49m\u001b[43m.\u001b[49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mw+b\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 2584\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 2585\u001b[39m fp = cast(IO[\u001b[38;5;28mbytes\u001b[39m], fp)\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: 'paper/figures/example_graph_7pi_over_4.png'" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G.plot(color_nodes_theta=7*np.pi/4)\n", + "plt.title('Coloring nodes with $g_\\omega$ for $\\\\theta = 7\\pi/4$')\n", + "plt.savefig('paper/figures/example_graph_7pi_over_4.png', bbox_inches='tight', dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcAAAAG1CAYAAABuyiQBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAa4pJREFUeJztnQd8FNX2x096gAAhEBJQOiqKSO9KeaCAjSLF9kRFLA98IjwVEcGGPGzwnoKIoNi7qFiwoBTpRRRpinTpLRBIz/4/v+ub/DfLlpnNzk455+tnJNncmbm/vTNz5p577rkxHo/HQ4IgCILAjFirKyAIgiAIViAGUBAEQWCJGEBBEASBJWIABUEQBJaIARQEQRBYIgZQEARBYIkYQEEQBIElYgAFQRAElogBFARBEFgiBlAQBEFgiRhAQRAEgSViAH2YPXs2xcTE0I4dOxxxXLvxyCOPKJ12x0h7aJoOHz5MdmfVqlXUoUMHqlChgqrzunXrLKlHYWEhTZgwgerVq0fly5enzp0702+//WZJXQTB1Qbwjz/+oDvuuIPq169PycnJVKlSJerYsSP95z//oZycHKurJziEpUuXKmN3/PhxciIFBQU0YMAAOnr0KE2ePJneeOMNqlOnTtTrUVRURP369VN1uO2225Qh3LhxI1111VXKMNqF4uJiSk9Pp6eeekq9OAwfPpwaN26sXh5q165NAwcOFKPtcuLJ4XzxxRfqpk9KSqKbbrqJLrzwQsrPz6cff/yR7rvvPtqwYQPNmDHD6mrS3//+d7r22mtVPQWyZXvAAD766KN08803U2pqKjnxRXDnzp308ssvK8NjFc888wzNnz+fVq5cqQwKyMjIoBtuuIEWLFhA3bt3JzuA+qFXf8UVV9D48eNpyZIl6lly0UUX0f79++mFF16gFi1a0PLly9VzRXAfjjaA27dvVw8xvOV+//33VKNGjZK/DRs2jLZu3aoMpJWcOnVKvVHGxcWpTbAHbmyPgwcPqn8jaby161cvWVlZ9OSTT9KIESNKjB+AWxb8/PPPtjGAX375pXp2oJ4jR46kt99+mxITE0v+PmjQIGrSpAn9+9//pjfffNPSugrm4GgXKFwX2dnZNGvWrFLGT6Nhw4Z0zz33lPz+008/Ua9evZSLNCUlhbp166be7vSgZ19trAjunuuvv56qVKlCF198ccAxJ608DLXW66hcuTLdcsstdPr06VLHxptzq1atlIu3QYMG9NJLL+kebzNyHiPfEXrZrVu3LlUnf/z555906623ql4Aelx44Lzyyiulypw8eVI9NOvWravKVK9enS699FJau3ZtQF2//PKL0vXZZ5+VfLZmzRr1Gd7cvYGmtm3blvzu2x74juAxABi3wt982wuu0VDfXzBee+011bsoV64ctWzZkpYtW6bcbE2bNqWygnphnA2gF4O6d+nSJWLXr17eeust1Za33357qc8TEhLUv/ibWfzjH/8oabdAm3d74uUYvT/NQHsbP3DOOeeoa3XTpk2m1VmwFkf3AOfOnavG/bS3y2DAFXrJJZeoB8D999+vbkg8sPGQWLhwYamHY1n3xQMINw/ehPWsN4yHIB66EydOVA/8mTNnKgMwadKkkodXz549lZGHiw5jLI899pgavzBCqPMY0bl+/Xq67LLLVB3w4MTYDtxIMHLeHDhwgNq1a6cePhhjQfmvvvqKhgwZQidOnFBGD9x555304YcfqjIXXHABHTlyRBlYPHx8jZkG3FIwRosWLaKrr75afbZ48WKKjY1VPQ0cH1ow1gP3pu9D2RuMWWG855133lFjV9WqVVOfe3/Hob6/YGCfMWPGUN++fenuu+9WwSmoMwwpvp+ygjHws846S11z//znP9WLidYWZl+/3nz88ceq/dBr9A4a2r17t/o3UG8S45foPeohLS1NtbEv11xzjXoB2rVrFz399NMln+O6xEva2LFj1QsWgIsT9xXuo0BAO65f756s4DI8DiUrKwt3pqd37966yvfp08eTmJjo+eOPP0o+27t3r6dixYqeTp06lXz26quvquNu377d8L7jx49X+1533XVnnN/fcbXyt956a6myffv29VStWrXk96uuuspTvnx5z59//lny2e+//+6Jj49X+4dC73n06tTKJicne3bu3Fny2caNGz1xcXGl6jRkyBBPjRo1PIcPHy61/7XXXuupXLmy5/Tp0+p3/Dxs2DCPUa644gpPmzZtSn7v16+f2lCPr776Sn22du1aVadPP/00aHs8/fTTZ3xm5PsLxJo1a1R9HnzwwVKf47vBcSdOnOiJBD/88IM63gcffFDq80hcv3ooLCz0VKhQQR0j0OZbN9+669l828ebZs2aeXr16lXqs9TUVM/tt99e6rNZs2Z5ypUrV3L9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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G.plot(color_nodes_theta=2*np.pi/4)\n", + "plt.title('Coloring nodes with $g_\\omega$ for $\\\\theta = \\pi/2$')\n", + "plt.savefig('figures/example_graph_pi_over_2.png', bbox_inches='tight', dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(3.2015621187164243)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "G.get_bounding_radius()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ECTResult([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],\n", + " dtype=int32)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "myect = ECT(num_dirs = 100, num_thresh=100)\n", + "myect.bound_radius = 1.2 * G.get_bounding_radius()\n", + "\n", + "myect.calculate(G, np.pi/2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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asqUKTUar779v//3/+Tr66vmzZtX2vfee++pefPm+tnPfuaGygDXIxABJjV37ly99957mjZtmj799FOFhIQ47D9x4oQ+/vhj+1vpa9u/Jry9vTVixAitX79eX331lT1M5Ofna+XKlRo8eHCllYqaslqtkqSzZ8/a2xYtWqS2bdva331XXl6uV155RQEBAdXej8fZ1xDVtytXrig3N1dt2rRRmzZtJH13qjI4ONih37/+9S/99a9/1ahRoyq9U+7ChQv6+9//rokTJ8rf37/eagfqE4EIaKT+9re/6csvv6zUPmjQIHXu3FldunTRypUrNX78eP3oRz9yuPP0jh07tHbtWoeVjNr2r6n58+dry5YtGjx4sH71q1+pSZMmWrJkiUpKSrRgwYI6z99qtWrAgAH6xz/+oWeffVZXr17Vpk2blJiYqAULFqhXr17KyMhQdna20tLSFBgYWOU4zr6GyFneeOMNXb582R74NmzYoNOnT0uSHnvsMft8du/ereHDhys5OVkvvPCCJGn8+PHy8/PToEGD1LZtWx05ckRvvfWW/P399fLLL1d6rtWrV+vatWucLkPjZgBoVFasWGFIqnZbsWKFQ////Oc/xvTp041OnToZPj4+RosWLYy77rrLeP31142rV69WGr+2/b/vs88+MyQZa9eudWjfv3+/ER8fbzRv3tzw9/c3hg8fbuzYsaPS8cnJyYYk48KFCzX6t/j888+NO+64w7BarcYdd9xh7Ny507h8+bJx9913G76+vsZtt91mLFu2rEZjeZqOHTtW+3+ck5Nj73f93zw5OdnetnjxYmPgwIFGUFCQ0aRJEyMsLMz4xS9+YRw7dqzK57rzzjuNtm3bGteuXXPxrAD3sRjGTe5qBgAA0Mg1nFuqAgAAuAiBCAAAmB6BCAAAmB6BCAAAmB6BCAAAmB6BCAAAmB43ZqyBiooKnT17Vi1atHDJJ08DAADnMwxDhYWFCg8Pr3QH9h8iENXA2bNn6/x5SgAAwL1OnTql9u3b37APgagGWrRoIem7f9C6fq4SAACoXzabTREREfbf4zdCIKqB66fJAgICCEQAADQwNbnchYuqAQCA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6RGIAACA6XlUIEpJSdGAAQPUokULtW3bVgkJCTp6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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "myect.plotECC(G, -np.pi/2)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAHRCAYAAABesXJ6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGQUlEQVR4nO3deXxU1f3/8fckmIQtAQSyQICwL5KkBYmhWKFGA1o01gW1laWI1hJ/xWAptEpwjQoKLhRcgIhWQb4VcA3aaKRWFkVRwYJAwURIAlhISCwBM/f3h2bkkkAyzCT33pnX8/G4j3rPnHvm3JlM58M5n3PGZRiGIQAAABsIsboDAAAANQhMAACAbRCYAAAA2yAwAQAAtkFgAgAAbIPABAAA2AaBCQAAsA0CEwAAYBsEJgAAwDYITAAb+e677zRt2jTFx8crJCREGRkZVncpaOXm5srlcumjjz6yuitAUCEwQUCp+TI51bF+/XpT/aNHj2ru3LlKSUlRVFSUIiIi1Lt3b2VmZurLL7/Unj17TtveiceePXt87v/ixYs1e/ZsXXXVVXr22Wd12223nbLu8OHDdc455/j8nP7ywQcfaNasWTp8+LBX1/3zn//UNddco06dOiksLExRUVFKSUnR3XffrdLS0sbpLADbamZ1B4DGcPfddyshIaFWec+ePT3/ffDgQY0cOVKbNm3SL3/5S11//fVq1aqVtm/frmXLlumpp57SoUOH9Nxzz5naePjhh/X1119r7ty5pvIOHTr43O933nlHnTp1qtW2E3zwwQe66667NH78eLVp06ZB18ycOVP33HOPunfvrvHjx6t79+46evSoNm3apIcffljPPvusdu3a1bgdB2ArBCYISKNGjdLgwYNPW2f8+PH65JNP9H//93+68sorTY/dc889+stf/qKWLVvqN7/5jemxZcuW6dChQ7XK/WH//v0N/lJ3uuXLl+uee+7RNddco+eee05hYWGmx+fOnVtvgGYYho4eParmzZs3ZlcBNCGmchCUNmzYoNdff10TJ06sFZRIUnh4uObMmeO356usrNTUqVMVHx+v8PBw9enTR3PmzFHNj3vXTBm9++672rp1q2d6qKCgwKvncblcyszM1KpVq3TOOecoPDxcAwYMUF5enqnerFmz5HK5tG3bNl1zzTWKjIzU2WefrT/84Q86evSop15Nv3Jzc+t8rlmzZnna++Mf/yhJSkhIaND01syZM9W+fXstWrSoVlAiSVFRUZ72a3Tr1k2//OUvtWbNGg0ePFjNmzfXk08+KUlasmSJfvGLX6hjx44KDw9X//79tWDBglrt1rTx1ltvKTk5WREREerfv79efvnlOvtZVVWlrKwsdejQQS1bttQVV1yhAwcOnPK+APiGERMEpLKyMh08eNBU5nK5dPbZZ0uSXnnlFUnSDTfc0Oh9MQxDl112md59911NnDhRycnJWrNmjf74xz9q7969mjt3rjp06KDnnntO9913nyoqKpSTkyNJ6tevn9fP9/777+vll1/W73//e7Vu3VqPPfaYrrzyShUWFnruv8Y111yjbt26KScnR+vXr9djjz2mQ4cOaenSpV49569+9St9+eWXevHFFzV37ly1b99e0qmnt7788kt9+eWXuvHGG9WqVSuvnmv79u267rrrdPPNN2vSpEnq06ePJGnBggUaMGCALrvsMjVr1kyvvvqqfv/738vtdmvy5MmmNnbs2KExY8bod7/7ncaNG6clS5bo6quvVl5eni666CJT3VtvvVVt27ZVdna29uzZo3nz5ikzM1PLly/3qt8AGsgAAsiSJUsMSXUe4eHhnnpXXHGFIck4dOiQ189x6aWXGl27dm1w/VWrVhmSjHvvvddUftVVVxkul8vYuXOnp+yCCy4wBgwY0KB266oryQgLCzO1+emnnxqSjMcff9xTlp2dbUgyLrvsMtP1v//97w1JxqeffmoYhmHs3r3bkGQsWbKk1vNLMrKzsz3ns2fPNiQZu3fvrrfvq1evNiQZ8+bNM5W73W7jwIEDpuP48eOex7t27WpIMvLy8mq1+e2339YqS09PN7p3724qq2nj73//u6esrKzMiI2NNX7yk594ymr+ltLS0gy32+0pv+2224zQ0FDj8OHD9d4nAO8xlYOANH/+fL399tum48033/Q8Xl5eLklq3bp1o/fljTfeUGhoqP7f//t/pvKpU6fKMAxTv/whLS1NPXr08JwnJiYqMjJS//nPf2rVPXkk4dZbb/X0uTHVvP4nj5aUlZWpQ4cOpmPz5s2mOgkJCUpPT6/V5ol5JjUjZhdccIH+85//qKyszFQ3Li5OV1xxhec8MjJSY8eO1SeffKKSkhJT3Ztuukkul8tzfv7556u6ulpfffWVdzcNoEGYykFAGjJkyGmTXyMjIyVJR44cafRk06+++kpxcXG1gqCaaRp/f8F16dKlVlnbtm116NChWuW9evUynffo0UMhISF+Wfp8OjWvRUVFham8VatWevvttyVJb731lmbPnl3r2rpWW0nSv/71L2VnZ2vdunX69ttvTY+VlZUpKirKc96zZ09TsCFJvXv3lvR9Xk1MTIyn/OTXs23btpJU5+sJwHcEJghKffv2lSR9/vnnOv/88y3ujX+FhobWWW78kGh7Oid/WZ98XqO6utr7jp2g5vXfsmWLqbxZs2ZKS0uTJH399dd1XlvXCpxdu3bpwgsvVN++ffXII48oPj5eYWFheuONNzR37ly53e4z7qsvrycA7zGVg6A0evRoSdLzzz/f6M/VtWtX7du3T0eOHDGVb9u2zfO4VXbs2GE637lzp9xut7p16ybpx9GBkzdNq2uU51RBTF369OmjXr16adWqVaqsrPSu03V49dVXVVVVpVdeeUU333yzLrnkEqWlpZ1yGfHOnTtrBRZffvmlJHnuHYA1CEwQlFJTUzVy5Eg988wzWrVqVa3Hjx07pttvv90vz3XJJZeourpaTzzxhKl87ty5crlcGjVqlF+e50zMnz/fdP74449LkqdPkZGRat++vdauXWuq99e//rVWWy1btpRUO4g5lVmzZungwYOaNGmSjh8/Xutxb0YkakY1TrymrKxMS5YsqbP+vn37tHLlSs95eXm5li5dquTkZNM0DoCmx1QOAtKbb77pGZE40dChQ9W9e3dJ0tKlS3XxxRfrV7/6lUaPHq0LL7xQLVu21I4dO7Rs2TIVFxf7ZS+T0aNHa8SIEfrLX/6iPXv2KCkpSW+99ZZWr16tKVOmmBJVm9ru3bt12WWXaeTIkVq3bp2ef/55XX/99UpKSvLUufHGG/XAAw/oxhtv1ODBg7V27VrP6MKJBg0aJEn6y1/+omuvvVZnnXWWRo8e7QlYTnb99ddry5YtysnJ0caNG3XttdcqISFBlZWV2rJli1588UW1bt3aM2pzOhdffLHCwsI0evRo3XzzzaqoqNDTTz+tjh07qri4uFb93r17a+LEifrwww8VHR2txYsXq7S09JSBDIAmZOWSIMDfTrdcWHUse/3222+NOXPmGOeee67RqlUrIywszOjVq5dx6623mpbcnsjb5cKGYRhHjhwxbrvtNiMuLs4466yzjF69ehmzZ882LUM1DP8sF548eXKtul27djXGjRvnOa9ZLvzFF18YV111ldG6dWujbdu2RmZmpvG///3PdO23335rTJw40YiKijJat25tXHPNNcb+/ftrLRc2DMO45557jE6dOhkhISENXjpcUFBgXHXVVUZsbKxx1llnGZGRkcbgwYON7Oxso7i4uNZ9XHrppXW288orrxiJiYlGRESE0a1bN+PBBx80Fi9eXKsfNW2sWbPGSExMNMLDw42+ffsaK1asMLVX87f04YcfmsrfffddQ5Lx7rvv1ntvALznMgwyuIBgM2vWLN111106cOCAZzO0YNGtWzedc845eu2116zuCoA6kGMCAABsg8AEAADYBoEJAACwDQITIAjNmjVLhmEEXX6J9P3OruSXINjl5OTo3HPPVevWrdWxY0dlZGRo+/bt9V63YsUK9e3bVxERERo4cGCtn68wDEMzZ85UbGysmjdvrrS0tFr7JdWHwAQAgCDz3nvvafLkyVq/fr3efvttHT9+XBdffPFpNzz84IMPdN1112nixIn65JNPlJGRoYyMDNMOzg899JAee+wxLVy4UBs2bFDLli2Vnp6uo0ePNrhvrMoBACDIHThwQB07dtR7772nn//853XWGTNmjCorK00jjuedd56Sk5O1cOFCGYahuLg4TZ061bNBZVlZmaKjo5Wbm6trr722QX0Jqg3W3G639u3bp9atW3u1fTYAIPgYhqEjR44oLi5OISGNM8Fw9OhRHTt2zC9tGYZR67stPDxc4eHh9V5b8wvc7dq1O2WddevWKSsry1SWnp7u2T179+7dKikp8fzelSRFRUUpJSVF69atIzCpy759+xQfH291NwAADlJUVKTOnTv7vd2jR48qoWsrlez37Ucxa7Rq1arWL3ZnZ2dr1qxZp73O7XZrypQp+tnPfqZzzjnnlPVKSkoUHR1tKouOjlZJSYnn8ZqyU9VpiKAKTGp+an2YLlEznWVxbwAAdvadjut9veH57vC3Y8eOqWR/tXZv6qrI1r6NyJQfcSth0FcqKipSZGSkp7whoyWTJ0/Wli1b9P777/vUB38JqsCkZoirmc5SMxeBCQDgNH7IwGzsqf/I1iE+ByaetiIjTYFJfTIzM/Xaa69p7dq19Y4KxcTEqLS01FRWWlrq+eHLmv8tLS1VbGysqU5ycnKD+8SqHAAALFRtuP1yeMMwDGVmZmrlypV65513lJCQUO81qampys/PN5W9/fbbSk1NlSQlJCQoJibGVKe8vFwbNmzw1GmIoBoxAQDAbtwy5JZvC2S9vX7y5Ml64YUXtHr1arVu3dqTAxIVFaXmzZtLksaOHatOnTopJydHkvSHP/xBF1xwgR5++GFdeumlWrZsmT766CM99dRTkr4fWZoyZYruvfde9erVSwkJCbrzzjsVFxenjIyMBveNwAQAgCCzYMECSdLw4cNN5UuWLNH48eMlSYWFhabVSEOHDtULL7ygO+64Q3/+85/Vq1cvrVq1ypQwO23aNFVWVuqmm27S4cOHNWzYMOXl5SkiIqLBfQuqfUzKy8sVFRWl4bqcHBMAwGl9ZxxXgVarrKzMq7yNhqr5Ttq3vbNfkl/j+nzdaH1tSoyYAABgoWrDULWPYwS+Xm8nBCYAAFjIihwTO2NVDgAAsA1GTAAAsJBbhqoZMfEgMAEAwEJM5ZgxlQMAAGyDERMAACzEqhwzAhMAACzk/uHwtY1AwVQOAACwDUZMAACwULUfVuX4er2dEJgAAGChauP7w9c2AgVTOQAAwDYYMQEAwEIkv5oRmAAAYCG3XKqWy+c2AgWBCQAAFnIb3x++thEoyDEBAAC2wYgJAAAWqvbDVI6v19sJgQkAABYiMDFjKgcAANgGIyYAAFjIbbjkNnxclePj9XZCYAIAgIWYyjFjKgcAANgGIyYAAFioWiGq9nGcoNpPfbEDAhMAACxk+CHHxAigHBOmcgAAgG0wYgIAgIVIfjUjMHGQXfPOa7S2e0xZ32htAwBOrdoIUbXhY45JAP1WDoEJAAAWcsslt4+ZFW4FTmRCjgkAALANRkwAALAQOSZmBCY20pg5JN4+NzknANA0/JNjwlROk1uwYIESExMVGRmpyMhIpaam6s0337S6WwAAwI8cM2LSuXNnPfDAA+rVq5cMw9Czzz6ryy+/XJ988okGDBhgdfcAADgj3ye/+vgjfkzlNL3Ro0ebzu+77z4tWLBA69evd2xgYuXUTX3q6xtTPQDgH24/bEkfSKtyHBOYnKi6ulorVqxQZWWlUlNTT1mvqqpKVVVVnvPy8vKm6B4AADhDjskxkaTPP/9crVq1Unh4uH73u99p5cqV6t+//ynr5+TkKCoqynPEx8c3YW8BAKhfTfKrr4c31q5dq9GjRysuLk4ul0urVq06bf3x48fL5XLVOk6csZg1a1atx/v27ev16+GowKRPnz7avHmzNmzYoFtuuUXjxo3TF198ccr6M2bMUFlZmecoKipqwt4CAFA/t0L8cnijsrJSSUlJmj9/foPqP/rooyouLvYcRUVFateuna6++mpTvQEDBpjqvf/++171S3LYVE5YWJh69uwpSRo0aJA+/PBDPfroo3ryySfrrB8eHq7w8PCm7OJp2TmnxFssLwYA5xo1apRGjRrV4Po1Mw81Vq1apUOHDmnChAmmes2aNVNMTIxPfXPUiMnJ3G63KYcEAACnqTZcfjmk73MpTzwa6zty0aJFSktLU9euXU3lO3bsUFxcnLp3765f//rXKiws9LptxwQmM2bM0Nq1a7Vnzx59/vnnmjFjhgoKCvTrX//a6q4BAHDGqn9YlePrIUnx8fGm3MqcnBy/93ffvn168803deONN5rKU1JSlJubq7y8PC1YsEC7d+/W+eefryNHjnjVvmOmcvbv36+xY8equLhYUVFRSkxM1Jo1a3TRRRdZ3TUAAM6Y2wiR28edX90/7PxaVFSkyMhIT3ljpDM8++yzatOmjTIyMkzlJ04NJSYmKiUlRV27dtVLL72kiRMnNrh9xwQmixYtsroLXguknBIAgP3V7I7eWAzD0OLFi3XDDTcoLCzstHXbtGmj3r17a+fOnV49h2OmcgAACET+nMppbO+995527tzZoBGQiooK7dq1S7GxsV49h2NGTAAACERuyZO86ksb3qioqDCNZOzevVubN29Wu3bt1KVLF82YMUN79+7V0qVLTdctWrRIKSkpOuecc2q1efvtt2v06NHq2rWr9u3bp+zsbIWGhuq6667zqm8EJgAABJmPPvpII0aM8JxnZWVJksaNG6fc3FwVFxfXWlFTVlamv//973r00UfrbPPrr7/Wddddp2+++UYdOnTQsGHDtH79enXo0MGrvhGY+FEw55SwrwkAnJkz2SCtrja8MXz4cBnGqX9fJzc3t1ZZVFSUvv3221Nes2zZMq/6cCoEJgAAWOhMtpSvq41AETh3AgAAHI8REzQKpnYAoGHccsktX5NffbveTghMAACwEFM5ZoFzJwAAwPEYMQEAwEL+2CCtqTZYawoEJj4I5uXB3iLnBADq5jZccvu6wZqP19sJgQkAABZy+2HExNd9UOwkcO4EAAA4HiMmAABYyG2EyO3jqhpfr7cTAhMvkFMCAPC3arlU7eM+JL5ebyeBE2IBAADHY8QEAAALMZVjRmACS7B8GAC+Vy3fp2Kq/dMVWwicEAsAADgeIyYAAFiIqRwzAhMAACzEj/iZEZjUgyXCTYOcEwCARGACAIClDLnk9jH51QigfUwITAAAsBBTOWYEJgAAWIhfFzYjMDkJOSUAAFiHwAQAAAtVK0TVPm4r5uv1dkJgAgCAhZjKMSMwgS2xfBgAghOBCQAAFnIrRG4fp2J8vd5OCEwAALBQteFStY9TMb5ebyeBE2IBAADHC/oRE5YHAwCsRPKrWdAHJgAAWMnww68LGwG082vg3AkAAHA8RkwAALBQtVyq9vFH+Hy93k4cE5jk5OTo5Zdf1rZt29S8eXMNHTpUDz74oPr06WN119AE2NcEQKByG77niLgNP3XGBhwzlfPee+9p8uTJWr9+vd5++20dP35cF198sSorK63uGgAAZ8z9Q46Jr0egcMyISV5enuk8NzdXHTt21KZNm/Tzn//col4BAAB/cmyIVVZWJklq167dKetUVVWpvLzcdEjS7gfP1a5557FUGABgUvPdsGveedr94LlN8pxuufxyeGPt2rUaPXq04uLi5HK5tGrVqtPWLygokMvlqnWUlJSY6s2fP1/dunVTRESEUlJStHHjRm9fDmcGJm63W1OmTNHPfvYznXPOOaesl5OTo6ioKM8RHx/fhL0EAKB+NTu/+np4o7KyUklJSZo/f75X123fvl3FxcWeo2PHjp7Hli9frqysLGVnZ+vjjz9WUlKS0tPTtX//fq+ew5GByeTJk7VlyxYtW7bstPVmzJihsrIyz1FUVNREPQQAwL5GjRqle++9V1dccYVX13Xs2FExMTGeIyTkxzDikUce0aRJkzRhwgT1799fCxcuVIsWLbR48WKvnsNxgUlmZqZee+01vfvuu+rcufNp64aHhysyMtJ0AABgJ/5Mfj05faGqqsqvfU1OTlZsbKwuuugi/etf//KUHzt2TJs2bVJaWpqnLCQkRGlpaVq3bp1Xz+GY5FfDMHTrrbdq5cqVKigoUEJCgtVdgoVYPgwgULjlhy3pf8gxOTllITs7W7NmzfKpbUmKjY3VwoULNXjwYFVVVemZZ57R8OHDtWHDBv30pz/VwYMHVV1drejoaNN10dHR2rZtm1fP5ZjAZPLkyXrhhRe0evVqtW7d2pNwExUVpebNm1vcOwAArFdUVGSaHQgPD/dLu3369DHtGzZ06FDt2rVLc+fO1XPPPeeX56jhmMBkwYIFkqThw4ebypcsWaLx48c3fYcAAPAD4wxW1dTVhqQmTVsYMmSI3n//fUlS+/btFRoaqtLSUlOd0tJSxcTEeNWuY3JMDMOo8yAoAQA4Wc2vC/t6NLXNmzcrNjZWkhQWFqZBgwYpPz//x/tyu5Wfn6/U1FSv2nXMiAkAAP4WrPtZVVRUaOfOnZ7z3bt3a/PmzWrXrp26dOmiGTNmaO/evVq6dKkkad68eUpISNCAAQN09OhRPfPMM3rnnXf01ltvedrIysrSuHHjNHjwYA0ZMkTz5s1TZWWlJkyY4FXfCEwAALCQP7aU9/b6jz76SCNGjPCcZ2VlSZLGjRun3NxcFRcXq7Cw0PP4sWPHNHXqVO3du1ctWrRQYmKi/vGPf5jaGDNmjA4cOKCZM2eqpKREycnJysvLq5UQWx8CEwAALOSPqRhvrx8+fLgM49S//Jebm2s6nzZtmqZNm1Zvu5mZmcrMzPSqLycjMAEAwEJnsqV8XW0ECgITBAT2NQFOzco8Cj6L8BaBCQAAFrJiKsfOCEwAALAQgYkZgQkAOJydl7zW17emnuqx82uF7xGYAABgIUZMzAhMAACwEIGJmWO2pAcAAIGPERMAsLlAzouwWw6KFQz5vg/JqbdKcx4CEwAALMRUjhlTOQAAwDYYMQEAwEKMmJgRmCAgnThvHQxz1AgsgZxT4q1g+LkJAhMzAhMAACxEYGJGjgkAALANRkwAwGJM3TSct1M7TnhtDcMlw8cRD1+vtxMCEwAALOSWy+d9THy93k6YygEAALbBiAkAABYi+dWMwAQBLxiWG8L+nJDr4ESB8Pkmx8SMqRwAAGAbjJgAAGAhpnLMCEwAALAQUzlmBCYIOoEwJw37I6fEGmv2fWo67/kS74PTEJgAAGAhww9TOYyYAAAAvzAkGYbvbQQKAhMEvfqG3JnqQUMwdWNPO6950nTe86WbLerJqbnlkoudXz1YLgwAAGyDERMAACzEqhwzAhMAACzkNlxysY+JB4EJUA+WFwP2dXIOibf17ZhzEuwITAAAsJBh+GFVTgAtyyEwAQDAQuSYmLEqBwAA2IajRkzWrl2r2bNna9OmTSouLtbKlSuVkZFhdbcQZMg5gcS+JYHCDjknjJiYOWrEpLKyUklJSZo/f77VXQEAwC9qfl3Y18Mba9eu1ejRoxUXFyeXy6VVq1adtv7LL7+siy66SB06dFBkZKRSU1O1Zs0aU51Zs2bJ5XKZjr59+3r7cjhrxGTUqFEaNWqU1d0AAMBvrEh+rfmH/m9/+1v96le/qrf+2rVrddFFF+n+++9XmzZttGTJEo0ePVobNmzQT37yE0+9AQMG6B//+IfnvFkz78MMRwUm3qqqqlJVVZXnvLy83MLeAABgD97+Q3/evHmm8/vvv1+rV6/Wq6++agpMmjVrppiYGJ/6FtCBSU5Oju666y6ru4EAR85JcCCnBI3l+xETX3NMvv/fk/8BHh4ervDwcJ/arovb7daRI0fUrl07U/mOHTsUFxeniIgIpaamKicnR126dPGqbUflmHhrxowZKisr8xxFRUVWdwkAAJOa5FdfD0mKj49XVFSU58jJyWmUPs+ZM0cVFRW65pprPGUpKSnKzc1VXl6eFixYoN27d+v888/XkSNHvGo7oEdMGitSBADAjoqKihQZGek5b4zvwBdeeEF33XWXVq9erY4dO3rKT5waSkxMVEpKirp27aqXXnpJEydObHD7AR2YAFZgaicwMHVjT95uQX8yO25Bb/xw+NqGJEVGRpoCE39btmyZbrzxRq1YsUJpaWmnrdumTRv17t1bO3fu9Oo5HDWVU1FRoc2bN2vz5s2SpN27d2vz5s0qLCy0tmMAAJwhf07lNKYXX3xREyZM0IsvvqhLL7203voVFRXatWuXYmNjvXoeR42YfPTRRxoxYoTnPCsrS5I0btw45ebmWtQrAACcpaKiwjSSUfMP/Xbt2qlLly6aMWOG9u7dq6VLl0r6fvpm3LhxevTRR5WSkqKSkhJJUvPmzRUVFSVJuv322zV69Gh17dpV+/btU3Z2tkJDQ3Xdddd51TdHBSbDhw+XEUi/VAQAgD/nchqovn/oFxcXm2YjnnrqKX333XeaPHmyJk+e7Ck/cWDg66+/1nXXXadvvvlGHTp00LBhw7R+/Xp16NDBq745KjABnIicE2cgpyQw2DGHpF7+mIrx8vr6/qF/8ixEQUFBvW0uW7bMqz6ciqNyTAAAQGBjxAQAAAtZsSW9nRGYAABgIX5d2IzABGhi5JwADXfyviWOzCGpj+HyOkekzjYCBDkmAADANhgxAQDAQuSYmBGYABZjascaLA92hoCcujmZBfuY2BlTOQAAwDYYMQEAwEKsyjEjMAEAwGoBNBXjKwITwGbIOWkc5JQ4w8l/77xvwYfABAAACzGVY0ZgAgCAlViVY8KqHAAAYBuMmAA2R87JmSE3wZ7q+/sNzvfN9cPhaxuBgcAEAAArMZVjQmACAICVCExMCEwAhzlxqJtpHf85+Vdsg5k/t4HnbxTeIjABAMBKhuv7w9c2AgSBCQAAFuLXhc1YLgwAAGyDERPAwVhK/KM1+z49qeTkczSUr/k26XFJfupJkCD51YTABAAAK5FjYsJUDgAAsA1GTAAAsJDL+P7wtY1AQWACBJBAyzmpnTcCOzp535Od+xqeo+LPPVMcixwTE6ZyAACAbTBiAgCAlUh+NSEwAdBkmJoJDPVNv5z4eH1Lj71dmhyQUz9M5ZgQmAAAYCUCExNyTAAAgG0wYgIAgJUYMTEhMAECWGMvHyZnJDjYKa8jIHNSSH41YSoHAADYBiMmAABYiJ1fzQhMAACwEjkmJo4LTObPn6/Zs2erpKRESUlJevzxxzVkyBCruwU4grc5J+SQBIfGzMOotV29lzkivqrv+RyRg9II1q5dq9mzZ2vTpk0qLi7WypUrlZGRcdprCgoKlJWVpa1btyo+Pl533HGHxo8fb6rjj+9or3NMqqur9eSTTyorK0uPPPKI8vPz9c0333jbzBlZvny5srKylJ2drY8//lhJSUlKT0/X/v37m+T5AQAIBJWVlUpKStL8+fMbVH/37t269NJLNWLECG3evFlTpkzRjTfeqDVr1njq+Os72uvA5NZbb9XMmTNVWlqq6dOn65JLLlHHjh3VpUsXXXbZZd4255VHHnlEkyZN0oQJE9S/f38tXLhQLVq00OLFixv1eQEAaCwu/ZhncsaHl885atQo3XvvvbriiisaVH/hwoVKSEjQww8/rH79+ikzM1NXXXWV5s6d66njr+9orwOTl19+WUuXLtXf/vY3hYeH66OPPtKjjz6qo0ePqmvXrt4212DHjh3Tpk2blJaW5ikLCQlRWlqa1q1bV+c1VVVVKi8vNx0AAASqk7/zqqqq/NLuunXrTN+/kpSenu75/j2T7+hT8TrHpKKiQv3795cknXXWWWrWrJkyMzN1/Phx7du3z9vmGuzgwYOqrq5WdHS0qTw6Olrbtm2r85qcnBzdddddjdYnwGlqzbdfY00/YK1gzauoy8mfCUteGz/uYxIfH28qzs7O1qxZs3xrW1JJSUmd37/l5eX63//+p0OHDnn9HX0qXo+YdO/e3ROAdOrUSXv37pUkjR49Ws8//7y3zTWqGTNmqKyszHMUFRVZ3SUAAMwMPx2SioqKTN97M2bMaNJb8QevA5Nf/epXevPNNyVJF1xwgWfu6IsvvtD//vc///buBO3bt1doaKhKS0tN5aWlpYqJianzmvDwcEVGRpoOAABsxY+BycnfeeHh4X7pYkxMTJ3fv5GRkWrevPkZfUefitdTOScOCU2bNk3nnnuuOnTooPLyck2cONHb5hosLCxMgwYNUn5+vmdJk9vtVn5+vjIzMxvteQEnaeqlmHAGpm5OjdemYVJTU/XGG2+Yyt5++22lpqZK8u93tE/7mHTp0kVbt27Vq6++qrPPPlujR4/2pbl6ZWVlady4cRo8eLCGDBmiefPmqbKyUhMmTGjU5wUAoLFYsfNrRUWFdu7c6TnfvXu3Nm/erHbt2qlLly6aMWOG9u7dq6VLl0qSfve73+mJJ57QtGnT9Nvf/lbvvPOOXnrpJb3++uueNvz1He3zBmvt27dvssBgzJgxOnDggGbOnKmSkhIlJycrLy+vVrINAACOYcHOrx999JFGjBjhOc/KypIkjRs3Trm5uSouLlZhYaHn8YSEBL3++uu67bbb9Oijj6pz58565plnlJ6e7qnjr+9ox+38mpmZydQNAAA+GD58uAzj1NFMbm5undd88sknp23XH9/RjgtMgGBD3gi8Zee8Cau3qLfla8Nv5ZgQmAAAYCF+XdjM6+XCAAAAjYUREwAArOTHnV8DAYEJ0MTIGYG/2TJvAg1HjokJUzkAAMA2GDEBAMBCJL+aEZgATczq5ZJwvkCaumnsz4MjXiumckwITAAAsJIfRkwCKTAhxwQAANgGIyYAAFiJqRwTApMA4u3crCPmXpuAr3PavI5obPyNNZwjXysCExOmcgAAgG0wYgIAgIVYLmzGiAkAALANRkyCGPtnnBlHzmHD1vibOnO8doGHwAQAACuR/GpCYAIAgIXIMTEjMAkgbHXuTLxvwYkpiLrV93ngdQt8BCYAAFgtgEY8fEVgAgCAlcgxMSEwAQDAQuSYmBGYBDByF/yDOW34A39HZ4bXLfgQmAAAYCWmckwITAAAsBBTOWZsSQ8AAGyDEZMgQs4J0HjIhfCPHlPWm853zTvPop40IaZyTAhMAACwEoGJCVM5AADANhgxAQDAQiS/mhGYADZDLpAzkFPiHyfnlNT3eEDmnDCVY8JUDgAAsA1GTAAAsBIjJiYEJkHsxKFopgt+xBA9JP4OGkt9UzfBiBwTMwITAACsxIiJCTkmAAAEofnz56tbt26KiIhQSkqKNm7ceMq6w4cPl8vlqnVceumlnjrjx4+v9fjIkSO97pdjApP77rtPQ4cOVYsWLdSmTRuruwMAgF/UTOX4enhj+fLlysrKUnZ2tj7++GMlJSUpPT1d+/fvr7P+yy+/rOLiYs+xZcsWhYaG6uqrrzbVGzlypKneiy++6PXr4ZipnGPHjunqq69WamqqFi1aZHV3Ag5LVO2L96ZxkEPSNPydUxKQy4ctmMp55JFHNGnSJE2YMEGStHDhQr3++utavHixpk+fXqt+u3btTOfLli1TixYtagUm4eHhiomJ8a4zJ3HMiMldd92l2267TQMHDrS6KwAA2FJ5ebnpqKqqqlXn2LFj2rRpk9LS0jxlISEhSktL07p16xr0PIsWLdK1116rli1bmsoLCgrUsWNH9enTR7fccou++eYbr+/BMYHJmaiqqqr1JgEAYCuGnw5J8fHxioqK8hw5OTm1nu7gwYOqrq5WdHS0qTw6OlolJSX1dnfjxo3asmWLbrzxRlP5yJEjtXTpUuXn5+vBBx/Ue++9p1GjRqm6urrBL4XkoKmcM5GTk6O77rrL6m4AAHBKrh8OX9uQpKKiIkVGRnrKw8PDfWy5tkWLFmngwIEaMmSIqfzaa6/1/PfAgQOVmJioHj16qKCgQBdeeGGD27c0MJk+fboefPDB09b597//rb59+55R+zNmzFBWVpbnvLy8XPHx8WfUVrAJpryGYM41qO/enfy+B/P7ajX2KrFOZGSkKTCpS/v27RUaGqrS0lJTeWlpab35IZWVlVq2bJnuvvvuevvSvXt3tW/fXjt37nROYDJ16lSNHz/+tHW6d+9+xu2Hh4c3SrQIAIDfNHHya1hYmAYNGqT8/HxlZGRIktxut/Lz85WZmXnaa1esWKGqqir95je/qfd5vv76a33zzTeKjY1teOdkcWDSoUMHdejQwcouAABgKSt2fs3KytK4ceM0ePBgDRkyRPPmzVNlZaVnlc7YsWPVqVOnWjkqixYtUkZGhs4++2xTeUVFhe666y5deeWViomJ0a5duzRt2jT17NlT6enpXvXNMTkmhYWF+u9//6vCwkJVV1dr8+bNkqSePXuqVatW1nYuCATT1E4g83Z6g+kQNARTN84zZswYHThwQDNnzlRJSYmSk5OVl5fnSYgtLCxUSIh5fcz27dv1/vvv66233qrVXmhoqD777DM9++yzOnz4sOLi4nTxxRfrnnvu8XrmwjGBycyZM/Xss896zn/yk59Ikt59910NHz7col4BAOAji7akz8zMPOXUTUFBQa2yPn36yDDqfqLmzZtrzZo13neiDo5ZLpybmyvDMGodBCUAAMfzw1LhQOGYERMAAAIRvy5sRmACOMyJeR/15fqQI4LGYKeckoDcoj7IEZgAAGAli3JM7IrABAAACzGVY+aY5FcAABD4GDHBGXHyviaBnHcRyPeGpmOnHJKgwFSOCYEJAAAWYirHjKkcAABgG4yYwC+cPLXjZOlxSeaCeZZ0Aw4XSFM3jlw+zFSOCYEJAABWIjAxYSoHAADYBiMmAABYiORXMwITNIr6lq02ZQ5KoC2hDaR8AFiDvyGbYSrHhMAEAAALuQxDLsO3yMLX6+2EHBMAAGAbjJgAAGAlpnJMCExgCfY9aThv8gEcuYcD0Iic8Jkg+dWMqRwAAGAbjJgAAGAlpnJMCEwAALAQUzlmBCawBX/nnDh57xL2mIC/8TcFJyEwAQDASkzlmBCYAABgIaZyzAhMYEt22tLe3xhWB4BTIzABAMBKTOWYEJgAAGCxQJqK8RWBCQAAVjKM7w9f2wgQBCZwJDsvB7ZTDokTtuMGmhKfCfsjMAEAwEKsyjEjMAEAwEokv5rwI34AAMA2GDFBQLBTXgdgNT4PzuJyf3/42kagIDABAMBKTOWYMJUDAABsg8AECCI9pqw3HUCws8NnomZVjq+Ht+bPn69u3bopIiJCKSkp2rhx4ynr5ubmyuVymY6IiAhTHcMwNHPmTMXGxqp58+ZKS0vTjh07vO4XgQkAAFaq2WDN18MLy5cvV1ZWlrKzs/Xxxx8rKSlJ6enp2r9//ymviYyMVHFxsef46quvTI8/9NBDeuyxx7Rw4UJt2LBBLVu2VHp6uo4ePepV3whMAAAIMo888ogmTZqkCRMmqH///lq4cKFatGihxYsXn/Ial8ulmJgYzxEdHe15zDAMzZs3T3fccYcuv/xyJSYmaunSpdq3b59WrVrlVd8cEZjs2bNHEydOVEJCgpo3b64ePXooOztbx44ds7prAAD4xJ9TOeXl5aajqqqq1vMdO3ZMmzZtUlpamqcsJCREaWlpWrdu3Sn7WVFRoa5duyo+Pl6XX365tm7d6nls9+7dKikpMbUZFRWllJSU07ZZF0esytm2bZvcbreefPJJ9ezZU1u2bNGkSZNUWVmpOXPmWN09WID8COBHfB4czo+rcuLj403F2dnZmjVrlqns4MGDqq6uNo14SFJ0dLS2bdtWZ/N9+vTR4sWLlZiYqLKyMs2ZM0dDhw7V1q1b1blzZ5WUlHjaOLnNmscayhGByciRIzVy5EjPeffu3bV9+3YtWLCAwAQA4Gj+3JK+qKhIkZGRnvLw8HDfGv5BamqqUlNTPedDhw5Vv3799OSTT+qee+7xy3PUcERgUpeysjK1a9futHWqqqpMw1jl5eWN3S0AACwTGRlpCkzq0r59e4WGhqq0tNRUXlpaqpiYmAY9z1lnnaWf/OQn2rlzpyR5ristLVVsbKypzeTkZC/uwCE5JifbuXOnHn/8cd188+l/YTYnJ0dRUVGe4+QhLgAALNfEq3LCwsI0aNAg5efne8rcbrfy8/NNoyKnU11drc8//9wThCQkJCgmJsbUZnl5uTZs2NDgNmtYOmIyffp0Pfjgg6et8+9//1t9+/b1nO/du1cjR47U1VdfrUmTJp322hkzZigrK8tzXl5ervj4eCX86UM1c50liZ+8RnDjJ+ABsxM/E98Zx/XVaer6ixW/LpyVlaVx48Zp8ODBGjJkiObNm6fKykpNmDBBkjR27Fh16tRJOTk5kqS7775b5513nnr27KnDhw9r9uzZ+uqrr3TjjTd+//wul6ZMmaJ7771XvXr1UkJCgu68807FxcUpIyPDq75ZGphMnTpV48ePP22d7t27e/573759GjFihIYOHaqnnnqq3vbDw8P9Nr8GAECgGDNmjA4cOKCZM2eqpKREycnJysvL8ySvFhYWKiTkx0mVQ4cOadKkSSopKVHbtm01aNAgffDBB+rfv7+nzrRp01RZWambbrpJhw8f1rBhw5SXl1drI7b6uAzDy11ZLLJ3716NGDFCgwYN0vPPP6/Q0FCv2ygvL1dUVJSG63JGTByOVQiNg8+DM/F5aBzfGcdVoNUqKyurN2/jTNR8J6WOvFvNzvLuy/tk3x0/qnV5Mxutr03JEcmve/fu1fDhw9W1a1fNmTNHBw4c8DzW0EQdOBv/xwv8iM9DYLFiKsfOHBGYvP3229q5c6d27typzp07mx5zyIAPAABoAEesyhk/frwMw6jzAADA0dyGf44A4YgREwAAApYfd34NBEEfmLBcEvgRnwcAVgv6wAQAACu55IfkV7/0xB4ITAAAsJKXO7eeso0AQWACAICFWC5sRmACW2KfBuBHfB4QTAhMAACwEqtyTAhMAACwkMsw5PIxR8TX6+2EwOQkLJcEfsTnAUBTIzABAMBK7h8OX9sIEAQmAABYiKkcM0f8Vg4AAAgOjJjU48Q5dubXGw/LIZ2BnJOmwechyLAqx4TABAAAK7HzqwlTOQAAwDYYMQEAwEJsSW9GYAJLMIcO/IjPQ5BjKseEwAQAAAu53N8fvrYRKMgxAQAAtsGICQAAVmIqx4TAxAvs4QCY8ZkA/IB9TEyYygEAALbBiAkAABbit3LMCEx8wDB2w7EcMjjwmWg4PhPwIMfEhKkcAABgG4yYAABgJUOSr/uQBM6ACYEJAABWIsfEjMAEjYL5c8CMzwTQMAQmAABYyZAfkl/90hNbIDABAMBKrMoxITABAMBKbkkuP7QRIAhM/CiY93Bg/hx14TMBwFvsYwIAgIVqVuX4enhr/vz56tatmyIiIpSSkqKNGzeesu7TTz+t888/X23btlXbtm2VlpZWq/748ePlcrlMx8iRI73uF4EJAABWqskx8fXwwvLly5WVlaXs7Gx9/PHHSkpKUnp6uvbv319n/YKCAl133XV69913tW7dOsXHx+viiy/W3r17TfVGjhyp4uJiz/Hiiy96/XIwldOIgnkYG6gLnwnAHh555BFNmjRJEyZMkCQtXLhQr7/+uhYvXqzp06fXqv+3v/3NdP7MM8/o73//u/Lz8zV27FhPeXh4uGJiYnzqGyMmAABYyY8jJuXl5aajqqqq1tMdO3ZMmzZtUlpamqcsJCREaWlpWrduXYO6/O233+r48eNq166dqbygoEAdO3ZUnz59dMstt+ibb77x+uVwTGBy2WWXqUuXLoqIiFBsbKxuuOEG7du3z+puAQDgGz8GJvHx8YqKivIcOTk5tZ7u4MGDqq6uVnR0tKk8OjpaJSUlDeryn/70J8XFxZmCm5EjR2rp0qXKz8/Xgw8+qPfee0+jRo1SdXW1Vy+HY6ZyRowYoT//+c+KjY3V3r17dfvtt+uqq67SBx98YHXXAACwhaKiIkVGRnrOw8PD/f4cDzzwgJYtW6aCggJFRER4yq+99lrPfw8cOFCJiYnq0aOHCgoKdOGFFza4fccEJrfddpvnv7t27arp06crIyNDx48f11lnnWVhzxoukObXWQoJf+AzAciv+5hERkaaApO6tG/fXqGhoSotLTWVl5aW1psfMmfOHD3wwAP6xz/+ocTExNPW7d69u9q3b6+dO3d6FZg4ZirnRP/973/1t7/9TUOHDj1tUFJVVVVrvg0AADtp6uXCYWFhGjRokPLz8z1lbrdb+fn5Sk1NPeV1Dz30kO655x7l5eVp8ODB9T7P119/rW+++UaxsbEN7pvksMDkT3/6k1q2bKmzzz5bhYWFWr169Wnr5+TkmOba4uPjm6inAADYV1ZWlp5++mk9++yz+ve//61bbrlFlZWVnlU6Y8eO1YwZMzz1H3zwQd15551avHixunXrppKSEpWUlKiiokKSVFFRoT/+8Y9av3699uzZo/z8fF1++eXq2bOn0tPTveqbpYHJ9OnTa23GcvKxbds2T/0//vGP+uSTT/TWW28pNDRUY8eOlXGaKHHGjBkqKyvzHEVFRU1xWwAANJwF+5iMGTNGc+bM0cyZM5WcnKzNmzcrLy/PkxBbWFio4uJiT/0FCxbo2LFjuuqqqxQbG+s55syZI0kKDQ3VZ599pssuu0y9e/fWxIkTNWjQIP3zn//0Os/FZZzum72RHThwoN6lRN27d1dYWFit8q+//lrx8fH64IMPTjv0dKLy8nJFRUVpuC5XM5f98lLsNL/OfDnsgM8ErPSdcVwFWq2ysrJ68zbORM13UlqPKWoW6luS6nfVVfrHrnmN1temZGnya4cOHdShQ4czutbt/j7Tp6412gAAOAa/LmziiFU5GzZs0Icffqhhw4apbdu22rVrl+6880716NGjwaMlAADA/hwRmLRo0UIvv/yysrOzVVlZqdjYWI0cOVJ33HFHo6zRtkp9Q8WNOazNMDXs6HR/l409zcNnAk3HDyMmYsSkSQ0cOFDvvPOO1d0AAMD/mMoxcdRyYQAAENgcMWICAEDAchvyeSrGHTgjJgQmDsKcN/AjPg8IGIb7+8PXNgIEUzkAAMA2GDEBAMBKJL+aEJgAAGAlckxMmMoBAAC2wYgJAABWYirHhMAEAAArGfJDYOKXntgCgQkAAFZixMSEHBMAAGAbjJgAAGAlt1uSjxukuQNngzUCEwAArMRUjglTOQAAwDYYMQEAwEqMmJgQmAAAYCV2fjVhKgcAANgGIyYAAFjIMNwyDN9W1fh6vZ0QmAAAYCXD8H0qJoByTJjKAQAAtsGICQAAVjL8kPwaQCMmBCYAAFjJ7ZZcPuaIkGMCAAD8ghETE3JMAACAbTBiAgCAhQy3W4aPUzksFwYAAP7BVI4JUzkAAMA2GDEBAMBKbkNyMWJSg8AEAAArGYYkX5cLB05gwlQOAACwDUZMAACwkOE2ZPg4lWMwYgIAAPzCcPvn8NL8+fPVrVs3RUREKCUlRRs3bjxt/RUrVqhv376KiIjQwIED9cYbb5hvwzA0c+ZMxcbGqnnz5kpLS9OOHTu87heBCQAAFjLchl8ObyxfvlxZWVnKzs7Wxx9/rKSkJKWnp2v//v111v/ggw903XXXaeLEifrkk0+UkZGhjIwMbdmyxVPnoYce0mOPPaaFCxdqw4YNatmypdLT03X06FGv+uYyAmn8px7l5eWKiorScF2uZq6zrO4OAMDGvjOOq0CrVVZWpsjISL+37/lOcl3h83fSd8ZxFRgrG9zXlJQUnXvuuXriiSckSW63W/Hx8br11ls1ffr0WvXHjBmjyspKvfbaa56y8847T8nJyVq4cKEMw1BcXJymTp2q22+/XZJUVlam6Oho5ebm6tprr23wvQRVjklNDPadjvu8lw0AILB9p+OSGj9/4zujyucf4avpa3l5uak8PDxc4eHhprJjx45p06ZNmjFjhqcsJCREaWlpWrduXZ3tr1u3TllZWaay9PR0rVq1SpK0e/dulZSUKC0tzfN4VFSUUlJStG7dOgKTUzly5Igk6X29UU9NAAC+d+TIEUVFRfm93bCwMMXExOj9Ev98J7Vq1Urx8fGmsuzsbM2aNctUdvDgQVVXVys6OtpUHh0drW3bttXZdklJSZ31S0pKPI/XlJ2qTkMFVWASFxenoqIiGYahLl26qKioqFGG55pCeXm54uPjuQeLcQ/2wD3YRyDcR809FBYWyuVyKS4urlGeJyIiQrt379axY8f80p5hGHK5XKayk0dLnCCoApOQkBB17tzZM9QVGRnp2A9ODe7BHrgHe+Ae7CMQ7iMqKqrR7yEiIkIRERGN+hwna9++vUJDQ1VaWmoqLy0tVUxMTJ3XxMTEnLZ+zf+WlpYqNjbWVCc5Odmr/rEqBwCAIBIWFqZBgwYpPz/fU+Z2u5Wfn6/U1NQ6r0lNTTXVl6S3337bUz8hIUExMTGmOuXl5dqwYcMp2zyVoBoxAQAAUlZWlsaNG6fBgwdryJAhmjdvniorKzVhwgRJ0tixY9WpUyfl5ORIkv7whz/oggsu0MMPP6xLL71Uy5Yt00cffaSnnnpKkuRyuTRlyhTde++96tWrlxISEnTnnXcqLi5OGRkZXvUtKAOT8PBwZWdnO3LurQb3YA/cgz1wD/YRCPcRCPdQnzFjxujAgQOaOXOmSkpKlJycrLy8PE/yamFhoUJCfpxUGTp0qF544QXdcccd+vOf/6xevXpp1apVOuecczx1pk2bpsrKSt100006fPiwhg0bpry8PK+nqoJqHxMAAGBv5JgAAADbIDABAAC2QWACAABsg8AEAADYBoEJAACwjaALTObPn69u3bopIiJCKSkp2rhxo9Vd8sq2bdt09tlnq0ePHkpOTlarVq00bNgwq7vlFafew+HDhzV48GAlJyfrnHPO0dNPP211l4JWt27dlJiYqOTkZI0YMcLq7ngtEP6Wtm/fruTkZM/RvHlzzw+6OUFOTo7OPfdctW7dWh07dlRGRoa2b99udbcgSUYQWbZsmREWFmYsXrzY2Lp1qzFp0iSjTZs2RmlpqdVd88qoUaOMzz77zDAMw+jdu7dRUVFhcY+858R7+O6774zKykrDMAyjoqLC6Natm3Hw4EGLexWcunbtahw5csTqbpyxQPtbOnLkiHH22Wc74nNcIz093ViyZImxZcsWY/PmzcYll1xidOnSxVH3EKiCasTkkUce0aRJkzRhwgT1799fCxcuVIsWLbR48WKru+aV7du3q0+fPvr2229VXV2tli1bWt0lrznxHkJDQ9WiRQtJUlVVlQzDkGEYjh0B6tevn1wuV53HE088YXX3vOak9yHQ/pZeeeUVXXjhhWrZsqVj7iEvL0/jx4/XgAEDlJSUpNzcXBUWFmrTpk2SAu/z4SjWxkVNp6qqyggNDTVWrlxpKh87dqxx2WWXWdOpM1BeXm7069fPMAzD2Lhxo/HLX/7S4h55z8n3cOjQISMxMdFo3ry58cQTT3jKnTgCtHXrVkOSkZ+fbxQXFxt79uwxQkJCjBUrVhhHjx61unun1a1bN+OnP/2pMXjwYOP555/3lDvpfQikv6XLL7/c+Pvf/+45d+I97Nixw5BkfP7554ZhOPvz4XRBM2Jy8OBBVVdXe7bbrREdHa2SkhKLeuW9L774Qv3795ck/fvf/1bv3r0t7pH3nHwPbdq00aeffqrdu3frhRde8PzaphNHgEpLS9WsWTP97Gc/U0xMjA4ePCi3263zzz/f9ltxv//++9q0aZNeeeUV3X///frss88kOet9CJS/pfLycn3wwQe65JJLPGVOuwe3260pU6boZz/7mWeLdSd/PpwuaAKTQLF161YNGDBAktSyZUu99dZb+uabbyzulXcC4R6io6OVlJSkf/7znzpy5IjCw8MVFhamrVu3ql+/flZ3r0E+//xz9e7d2/N/sp9++qk6duxYK3i3o06dOkmSYmNjdckll+jjjz927Pvg9L+l1atX6+KLL/b8HooT72Hy5MnasmWLli1b5ilz8ufD6YLmR/zat2+v0NBQz79KapSWliomJsaiXnnvt7/9ree/r7zySl155ZUW9ubMOPUeSktL1aJFC7Vu3VplZWVau3atbrnlFseOAH322WcaOHCg5/zTTz81ndtVZWWl3G63WrdurYqKCr3zzju65pprHPU+BNLf0ksvvaSbbrrJc+60e8jMzNRrr72mtWvXqnPnzp5yp34+AkHQjJiEhYVp0KBBys/P95S53W7l5+crNTXVwp7BKb766iudf/75SkpK0vnnn69bb71VAwcOdOwI0GeffabExETP+aeffmo6t6vS0lINGzZMSUlJOu+88zR27Fide+65jnofAuVvqaysTBs3blR6erqnzCn3YBiGMjMztXLlSr3zzjtKSEgwPe7Uz0dAsDrJpSktW7bMCA8PN3Jzc40vvvjCuOmmm4w2bdoYJSUlVnetwSSd9nCCQLgHp6uurjZatGhhvPrqq56yzp07G48++qiFvQKazi233GJERUUZBQUFRnFxsef49ttv+XxYLOi+BR5//HGjS5cuRlhYmDFkyBBj/fr1VnfpjFRWVhpdunQxpk6danVXvFZYWGhccMEFRr9+/YyBAwcaL730ktVdCjpffvmlIcn46quvPGWjRo0y2rRpY7z//vsW9gxoGqf6h9GSJUv4fFjMZRiG0XTjM/CXv/zlL9q5c6fi4+M1Z84cq7vjleLiYpWWlio5OVklJSUaNGiQvvzyS9tn7rtcrjO6jo+YfwXC+8A9AKcWNDkmgWTHjh3atm2bRo0aZXVXzkhsbKySk5MlSTExMWrfvr3++9//WtupBjB+2ATrxKOyslJdunTR1KlT63yc/xP2v0B4H07sV2FhoS644AL169dPAwcO1EsvveS4e3Dq+wB7IjBxoNtvv105OTlWd8MvNm3apOrqasXHx1vdlTNy33336bzzzrO6G0HPye9Ds2bNNG/ePH3xxRd66623NGXKFFVWVlrdrTPi5PcB9kFg4jCrV69W7969bb8EryH++9//auzYsXrqqaes7soZcfrIVaBw+vvg1BHEkzn9fYB9EJg4zPr167Vs2TJ169ZNt99+u55++mndfffdVnfLa1VVVcrIyND06dM1dOhQq7tzRgJp5MrJAul9cPIIYiC9D7AWgYnD5OTkqKioSHv27NGcOXM0adIkzZw50+puecUwDI0fP16/+MUvdMMNN1jdnTMSSCNXThZI74OTRxAD6X2A9YJm51fYx7/+9S8tX75ciYmJWrVqlSTpueeec9SuijUjVytWrFBFRYWOHz+uyMhIxwWJThco74PTRxAD5X2APbBcGPBRbm6utmzZ4rhl24HGqe+DYRi6/vrr1adPH82aNcvq7vjMqe8D7IOpHACwUM0I4qpVq5ScnKzk5GR9/vnnVncLsAwjJgAAwDYYMQEAALZBYAIAAGyDwAQAANgGgQkAALANAhMAAGAbBCYAAMA2CEwAAIBtEJgAAADbIDABAAC2QWACAABsg8AEAADYBoEJAACwDQITIEjdcsstGjZsWJ2Pde7cWQ888EAT9wgApGZWdwBA09u6daueeuop/fOf/6zz8X79+mnz5s1N2ykAECMmQFCaPXu2zj33XA0dOrTOx9u1a6eSkpIm7hUAEJgAQee7777Tyy+/rCuvvNJTdvPNN2vRokWe8yNHjqh58+ZWdA9AkCMwAYLMrl27dOTIEQ0cOFCS5Ha7tWLFCrVu3dpT57PPPlP//v2t6iKAIEZgAgSZw4cPS5JatWolSVqzZo0OHTqkiIgISdL69eu1d+9eXXHFFVZ1EUAQI/kVCDJdu3aVy+XSiy++qJYtW+r222/XpZdeqtWrVys+Pl6/+93vlJaWdsoVOwDQmFyGYRhWdwJA08rJydEDDzyg5s2b6/7779egQYN0+eWX6+DBgxo9erT++te/qm3btlZ3E0AQIjABAAC2QY4JAACwDQITAABgGwQmAADANghMAACAbRCYAAAA2yAwAQAAtkFgAgAAbIPABAAA2AaBCQAAsA0CEwAAYBsEJgAAwDb+P5K22kfiiQXJAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "myect.calculateECT(G)\n", + "\n", + "M = myect.get_ECT()\n", + "\n", + "# We can use the built in command to plot the matrix. Unlike the plotECC function, this command does not calculate the ECT when called so it must have been run earlier. An equivalent command is myect.plotECT()\n", + "myect.plot('ECT')\n", + "\n", + "plt.savefig('paper/figures/example_ect.png', bbox_inches='tight', dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CW Complex version" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "loop of ufunc does not support argument 0 of type Axes which has no callable cos method", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;31mAttributeError\u001b[0m: 'Axes' object has no attribute 'cos'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[16], line 13\u001b[0m\n\u001b[1;32m 10\u001b[0m K\u001b[38;5;241m.\u001b[39madd_face([\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mA\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mC\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mD\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# K.set_centered_coordinates()\u001b[39;00m\n\u001b[0;32m---> 13\u001b[0m K\u001b[38;5;241m.\u001b[39mplot()\n", + "File \u001b[0;32m~/Library/CloudStorage/Dropbox/Math/Code/ect/ect/ect/embed_cw.py:174\u001b[0m, in \u001b[0;36mEmbeddedCW.plot\u001b[0;34m(self, bounding_circle, color_nodes_theta, ax, **kwargs)\u001b[0m\n\u001b[1;32m 171\u001b[0m fig \u001b[38;5;241m=\u001b[39m ax\u001b[38;5;241m.\u001b[39mget_figure()\n\u001b[1;32m 173\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mplot_faces(\u001b[38;5;241m0\u001b[39m, facecolor\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlightblue\u001b[39m\u001b[38;5;124m'\u001b[39m, ax\u001b[38;5;241m=\u001b[39max)\n\u001b[0;32m--> 174\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mplot(bounding_circle, color_nodes_theta, ax)\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ax\n", + "File \u001b[0;32m~/Library/CloudStorage/Dropbox/Math/Code/ect/ect/ect/embed_graph.py:482\u001b[0m, in \u001b[0;36mEmbeddedGraph.plot\u001b[0;34m(self, bounding_circle, bounding_center_type, color_nodes_theta, ax, with_labels, **kwargs)\u001b[0m\n\u001b[1;32m 480\u001b[0m nx\u001b[38;5;241m.\u001b[39mdraw(\u001b[38;5;28mself\u001b[39m, pos, with_labels\u001b[38;5;241m=\u001b[39mwith_labels, ax\u001b[38;5;241m=\u001b[39max, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 481\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 482\u001b[0m g \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mg_omega(color_nodes_theta)\n\u001b[1;32m 483\u001b[0m color_map \u001b[38;5;241m=\u001b[39m [g[v] \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnodes]\n\u001b[1;32m 484\u001b[0m \u001b[38;5;66;03m# Some weird plotting to make the colorbar work.\u001b[39;00m\n", + "File \u001b[0;32m~/Library/CloudStorage/Dropbox/Math/Code/ect/ect/ect/embed_graph.py:347\u001b[0m, in \u001b[0;36mEmbeddedGraph.g_omega\u001b[0;34m(self, theta)\u001b[0m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mg_omega\u001b[39m(\u001b[38;5;28mself\u001b[39m, theta):\n\u001b[1;32m 333\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 334\u001b[0m \u001b[38;5;124;03m Function to compute the function :math:`g_\\omega(v)` for all vertices :math:`v` in the graph in the direction of :math:`\\\\theta \\in [0,2\\pi]` . This function is defined by :math:`g_\\omega(v) = \\langle \\\\texttt{pos}(v), \\omega \\\\rangle` .\u001b[39;00m\n\u001b[1;32m 335\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 344\u001b[0m \n\u001b[1;32m 345\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 347\u001b[0m omega \u001b[38;5;241m=\u001b[39m (np\u001b[38;5;241m.\u001b[39mcos(theta), np\u001b[38;5;241m.\u001b[39msin(theta))\n\u001b[1;32m 349\u001b[0m g \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 350\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnodes:\n", + "\u001b[0;31mTypeError\u001b[0m: loop of ufunc does not support argument 0 of type Axes which has no callable cos method" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAdSklEQVR4nO3df2zddb348Vfb0VOIa5nZXdvN3ltB+aHAhpvrLUgIN702QqbE3NiA2XYXflx013DX3Csbg1VE110Cu0ukuDCZ+Ie4KRnEuGVc7HUxSG8WtzVBGSM4cLtCyxavPbtFV9Z+vn8Yyreug56y9s3pHo/k/OGH9+dzXn3bcJ58ek5bkmVZFgAAiZSmHgAAOLOJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASGpa6gHGYmhoKF599dWYPn16lJSUpB4HABiDLMvi2LFjMXv27CgtPfX9j6KIkVdffTXq6upSjwEAjMPhw4fjQx/60Cn/eVHEyPTp0yPiz19MZWVl4mkAgLHI5/NRV1c3/Dp+KkURI2/9aKayslKMAECRebe3WHgDKwCQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkFTBMfLzn/88Fi1aFLNnz46SkpJ48skn3/WcXbt2xSc+8YnI5XLxkY98JB599NFxjAoATEUFx0h/f3/MnTs3Ojo6xrT+5Zdfjuuuuy6uueaa6O7ujn/5l3+Jm2++OZ566qmChwUApp6C/zbNZz7zmfjMZz4z5vUbN26MD3/4w/HAAw9ERMTFF18czzzzTPzHf/xHNDc3F/r0AMAUM+HvGenq6oqmpqYRx5qbm6Orq+uU5xw/fjzy+fyIBwAwNU34X+3t6emJ6urqEceqq6sjn8/HH//4xzj77LNPOqe9vT3uueeeiR4tIiK2HXhtUp4HAN6vPn9hbdLnf19+mmbVqlXR19c3/Dh8+HDqkQCACTLhd0Zqamqit7d3xLHe3t6orKwc9a5IREQul4tcLjfRowEA7wMTfmeksbExOjs7Rxx7+umno7GxcaKfGgAoAgXHyP/93/9Fd3d3dHd3R8SfP7rb3d0dhw4diog//4hlyZIlw+tvu+22OHjwYHz1q1+NF154IR566KH44Q9/GCtWrDg9XwEAUNQKjpFf/vKXcfnll8fll18eERGtra1x+eWXx5o1ayIi4rXXXhsOk4iID3/4w7F9+/Z4+umnY+7cufHAAw/Ed77zHR/rBQAiIqIky7Is9RDvJp/PR1VVVfT19UVlZeVpvbZP0wBwppuoT9OM9fX7fflpGgDgzCFGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQ1rhjp6OiI+vr6qKioiIaGhti9e/c7rt+wYUNceOGFcfbZZ0ddXV2sWLEi/vSnP41rYABgaik4RrZu3Rqtra3R1tYWe/fujblz50Zzc3O8/vrro65/7LHHYuXKldHW1hb79++PRx55JLZu3Rp33nnnex4eACh+BcfI+vXr45Zbbolly5bFxz72sdi4cWOcc845sXnz5lHXP/vss3HllVfGjTfeGPX19fHpT386brjhhne9mwIAnBkKipGBgYHYs2dPNDU1vX2B0tJoamqKrq6uUc+54oorYs+ePcPxcfDgwdixY0dce+21p3ye48ePRz6fH/EAAKamaYUsPnr0aAwODkZ1dfWI49XV1fHCCy+Mes6NN94YR48ejU996lORZVmcOHEibrvttnf8MU17e3vcc889hYwGABSpCf80za5du2Lt2rXx0EMPxd69e2Pbtm2xffv2uPfee095zqpVq6Kvr2/4cfjw4YkeEwBIpKA7IzNnzoyysrLo7e0dcby3tzdqampGPefuu++OxYsXx8033xwREZdeemn09/fHrbfeGqtXr47S0pN7KJfLRS6XK2Q0AKBIFXRnpLy8PObPnx+dnZ3Dx4aGhqKzszMaGxtHPeeNN944KTjKysoiIiLLskLnBQCmmILujEREtLa2xtKlS2PBggWxcOHC2LBhQ/T398eyZcsiImLJkiUxZ86caG9vj4iIRYsWxfr16+Pyyy+PhoaGeOmll+Luu++ORYsWDUcJAHDmKjhGWlpa4siRI7FmzZro6emJefPmxc6dO4ff1Hro0KERd0LuuuuuKCkpibvuuit+97vfxV/91V/FokWL4pvf/Obp+yoAgKJVkhXBz0ry+XxUVVVFX19fVFZWntZrbzvw2mm9HgAUm89fWDsh1x3r67e/TQMAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgqXHFSEdHR9TX10dFRUU0NDTE7t2733H9H/7wh1i+fHnU1tZGLpeLCy64IHbs2DGugQGAqWVaoSds3bo1WltbY+PGjdHQ0BAbNmyI5ubmOHDgQMyaNeuk9QMDA/H3f//3MWvWrHj88cdjzpw58dvf/jbOPffc0zE/AFDkCo6R9evXxy233BLLli2LiIiNGzfG9u3bY/PmzbFy5cqT1m/evDl+//vfx7PPPhtnnXVWRETU19e/t6kBgCmjoB/TDAwMxJ49e6KpqentC5SWRlNTU3R1dY16zo9//ONobGyM5cuXR3V1dVxyySWxdu3aGBwcPOXzHD9+PPL5/IgHADA1FRQjR48ejcHBwaiurh5xvLq6Onp6ekY95+DBg/H444/H4OBg7NixI+6+++544IEH4hvf+MYpn6e9vT2qqqqGH3V1dYWMCQAUkQn/NM3Q0FDMmjUrHn744Zg/f360tLTE6tWrY+PGjac8Z9WqVdHX1zf8OHz48ESPCQAkUtB7RmbOnBllZWXR29s74nhvb2/U1NSMek5tbW2cddZZUVZWNnzs4osvjp6enhgYGIjy8vKTzsnlcpHL5QoZDQAoUgXdGSkvL4/58+dHZ2fn8LGhoaHo7OyMxsbGUc+58sor46WXXoqhoaHhYy+++GLU1taOGiIAwJml4B/TtLa2xqZNm+J73/te7N+/P770pS9Ff3//8KdrlixZEqtWrRpe/6UvfSl+//vfx+233x4vvvhibN++PdauXRvLly8/fV8FAFC0Cv5ob0tLSxw5ciTWrFkTPT09MW/evNi5c+fwm1oPHToUpaVvN05dXV089dRTsWLFirjssstizpw5cfvtt8cdd9xx+r4KAKBolWRZlqUe4t3k8/moqqqKvr6+qKysPK3X3nbgtdN6PQAoNp+/sHZCrjvW129/mwYASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUmIEAEhKjAAASYkRACApMQIAJCVGAICkxAgAkJQYAQCSEiMAQFJiBABISowAAEmJEQAgKTECACQlRgCApMQIAJCUGAEAkhIjAEBSYgQASEqMAABJiREAICkxAgAkJUYAgKTECACQlBgBAJISIwBAUuOKkY6Ojqivr4+KiopoaGiI3bt3j+m8LVu2RElJSVx//fXjeVoAYAoqOEa2bt0ara2t0dbWFnv37o25c+dGc3NzvP766+943iuvvBL/+q//GlddddW4hwUApp6CY2T9+vVxyy23xLJly+JjH/tYbNy4Mc4555zYvHnzKc8ZHByML37xi3HPPffEeeed954GBgCmloJiZGBgIPbs2RNNTU1vX6C0NJqamqKrq+uU533961+PWbNmxU033TSm5zl+/Hjk8/kRDwBgaiooRo4ePRqDg4NRXV094nh1dXX09PSMes4zzzwTjzzySGzatGnMz9Pe3h5VVVXDj7q6ukLGBACKyIR+mubYsWOxePHi2LRpU8ycOXPM561atSr6+vqGH4cPH57AKQGAlKYVsnjmzJlRVlYWvb29I4739vZGTU3NSet/85vfxCuvvBKLFi0aPjY0NPTnJ542LQ4cOBDnn3/+SeflcrnI5XKFjAYAFKmC7oyUl5fH/Pnzo7Ozc/jY0NBQdHZ2RmNj40nrL7roonjuueeiu7t7+PHZz342rrnmmuju7vbjFwCgsDsjERGtra2xdOnSWLBgQSxcuDA2bNgQ/f39sWzZsoiIWLJkScyZ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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "K = EmbeddedCW()\n", + "\n", + "K.add_node('A', 0,0)\n", + "K.add_node('B', 1,0)\n", + "K.add_node('C', 1,1)\n", + "K.add_node('D', 0,1)\n", + "\n", + "K.add_edges_from((('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'A')))\n", + "\n", + "K.add_face(['A', 'B', 'C', 'D'])\n", + "\n", + "# K.set_centered_coordinates()\n", + "K.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".conda-ect-3-11", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/paper/paper.bib b/paper/paper.bib new file mode 100644 index 0000000..58a78cb --- /dev/null +++ b/paper/paper.bib @@ -0,0 +1,173 @@ +@book{Dey2021, + author = {Dey, Tamal K. and Wang, Yusu}, + publisher = {Cambridge University Press}, + title = {Computational Topology for Data Analysis}, + year = {2021}, + file = {:MathTextbooks/DeyWang-CTDAbook.pdf:PDF} +} + +@article{Munch2017, + author = {Elizabeth Munch}, + journal = {Journal of Learning Analytics}, + title = {A User's Guide to Topological Data Analysis}, + year = {2017}, + number = {2}, + volume = {4}, + abstract = {Topological data analysis (TDA) is a collection of powerful tools that can quantify shape and structure in data in order to answer questions from the data's domain. This is done by representing some aspect of the structure of the data in a simplified topological signature. In this article, we introduce two of the most commonly used topological signatures. First, the persistence diagram represents loops and holes in the space by considering connectivity of the data points for a continuum of values rather than a single fixed value. The second topological signature, the mapper graph, returns a 1-dimensional structure representing the shape of the data, and is particularly good for exploration and visualization of the data. While these techniques are based on very sophisticated mathematics, the current ubiquity of available software means that these tools are more accessible than ever to be applied to data by researchers in education and learning, as well as all domain scientists.}, + creationdate = {2018-05-30T00:00:00}, + doi = {10.18608/jla.2017.42.6} +} + +@book{Hatcher, + author = {Allen Hatcher}, + publisher = {Cambridge University Press}, + title = {Algebraic Topology}, + year = {2002}, + creationdate = {2011-05-23T00:00:00}, + file = {Hatcher - algebraic topology.pdf:MathTextbooks/Hatcher - algebraic topology.pdf:PDF}, + groups = {Classic Textbooks}, + owner = {liz} +} + +@article{Munch2025, + author = {Munch, Elizabeth}, + journal = {The American Mathematical Monthly}, + title = {An Invitation to the Euler Characteristic Transform}, + year = {2025}, + number = {1}, + pages = {15--25}, + volume = {132}, + abstract = {The Euler characteristic transform (ECT) is a simple to define yet powerful representation of shape. The idea is to encode an embedded shape using sub-level sets of a a function defined based on a given direction, and then returning the Euler characteristics of these sublevel sets. Because the ECT has been shown to be injective on the space of embedded simplicial complexes, it has been used for applications spanning a range of disciplines, including plant morphology and protein structural analysis. In this survey article, we present a comprehensive overview of the Euler characteristic transform, highlighting the main idea on a simple leaf example, and surveying its its key concepts, theoretical foundations, and available applications.}, + archiveprefix = {arXiv}, + comment = {The work of EM is funded in part by the National Science Foundation through CCF-1907591, CCF-2106578, CCF-2142713, IOS-2310355, IOS-2310356, and IOS-2310357.}, + copyright = {arXiv.org perpetual, non-exclusive license}, + doi = {10.1080/00029890.2024.2409616}, + eprint = {2310.10395}, + file = {:Munch2023 - An Invitation to the Euler Characteristic Transform.pdf:PDF}, + image = {Munch2023.png}, + keywords = {Computational Geometry (cs.CG),FOS: Computer and information sciences,journal}, + primaryclass = {cs.CG}, + publisher = {Taylor \& Francis} +} + +@article{Turner2014, + author = {K. Turner and S. Mukherjee and D. M. Boyer}, + journal = {Information and Inference}, + title = {Persistent homology transform for modeling shapes and surfaces}, + year = {2014}, + month = {Dec}, + number = {4}, + pages = {310--344}, + volume = {3}, + comment = {Requested copy from the MSU Library, 3/22/18}, + creationdate = {2018-03-22T00:00:00}, + doi = {10.1093/imaiai/iau011}, + file = {:Persistence/Turner2014a_Published.pdf:PDF;:Persistence/Turner2014a.pdf:PDF;:Persistence/Turner2014a_ErikSlides.pdf:PDF}, + priority = {prio1}, + publisher = {Oxford University Press ({OUP})}, + readstatus = {read} +} + +@article{Crawford2019, + author = {Lorin Crawford and Anthea Monod and Andrew X. Chen and Sayan Mukherjee and Ra{\'{u}}l Rabad{\'{a}}n}, + journal = {Journal of the American Statistical Association}, + title = {Predicting Clinical Outcomes in Glioblastoma: An Application of Topological and Functional Data Analysis}, + year = {2019}, + month = {Oct}, + number = {531}, + pages = {1139--1150}, + volume = {115}, + doi = {10.1080/01621459.2019.1671198}, + file = {:DirectionalTransform/Crawford2019.pdf:PDF}, + publisher = {Informa {UK} Limited} +} + +@article{Meng2022, + author = {Meng, Kun and Wang, Jinyu and Crawford, Lorin and Eloyan, Ani}, + journal = {arXiv:2204.12699}, + title = {Randomness and Statistical Inference of Shapes via the Smooth {E}uler Characteristic Transform}, + year = {2022}, + month = {Apr}, + abstract = {In this paper, we provide the foundations for deriving the distributional properties of the smooth Euler characteristic transform. Motivated by functional data analysis, we propose two algorithms for testing hypotheses on random shapes based on these foundations. Simulation studies are provided to support our mathematical derivations and show the performance of our hypothesis testing framework. We apply our proposed algorithms to analyze a data set of mandibular molars from four genera of primates to test for shape differences and interpret the corresponding results from the morphology viewpoint. Our discussions connect the following fields: algebraic and computational topology, probability theory and stochastic processes, Sobolev spaces and functional analysis, statistical inference, morphology, and medical imaging.}, + archiveprefix = {arXiv}, + copyright = {arXiv.org perpetual, non-exclusive license}, + doi = {10.48550/ARXIV.2204.12699}, + eprint = {2204.12699}, + file = {:Meng2022 - Randomness and Statistical Inference of Shapes Via the Smooth Euler Characteristic Transform.pdf:PDF:http\://arxiv.org/pdf/2204.12699v2;:DirectionalTransform/Meng2022.pdf:PDF}, + keywords = {Methodology (stat.ME), FOS: Computer and information sciences}, + primaryclass = {stat.ME}, + publisher = {arXiv} +} + +@book{Mardia1999, + author = {Mardia, Kanti V. and Jupp, Peter E.}, + publisher = {Wiley}, + title = {Directional Statistics}, + year = {1999}, + isbn = {9780470316979}, + month = jan, + doi = {10.1002/9780470316979}, + issn = {1940-6347}, + journal = {Wiley Series in Probability and Statistics} +} + +@article{Wasserman2018, + author = {Larry Wasserman}, + journal = {Annual Review of Statistics and Its Application}, + title = {Topological Data Analysis}, + year = {2018}, + month = {mar}, + number = {1}, + pages = {501--532}, + volume = {5}, + creationdate = {2018-04-12T00:00:00}, + doi = {10.1146/annurev-statistics-031017-100045}, + file = {:Persistence/PersistenceSurveys/Wasserman2018.pdf:PDF}, + keywords = {survey, statistics, persistence}, + priority = {prio1}, + publisher = {Annual Reviews} +} + +@book{Ghrist2014, + title = {Elementary Applied Topology}, + year = {2014}, + author = {Robert Ghrist}, + keywords = {textbook, survey} +} + +@book{Goodman2018, + editor = {Jacob E. Goodman and Joseph O'Rourke and Csaba D. Tóth}, + publisher = {CRC Press}, + title = {Handbook of discrete and computational geometry}, + year = {2018}, + address = {Boca Raton}, + edition = {Third edition}, + isbn = {9781351645911}, + series = {Discrete mathematics and its applications}, + pagetotal = {11928}, + ppn_gvk = {1007357088} +} + +@inproceedings{Roell2024, + author = {Ernst R{\"o}ell and Bastian Rieck}, + booktitle = {The Twelfth International Conference on Learning Representations}, + title = {Differentiable Euler Characteristic Transforms for Shape Classification}, + year = {2024}, + url = {https://openreview.net/forum?id=MO632iPq3I} +} + +@article{Rieck2024, + author = {Rieck, Bastian}, + title = {Topology meets Machine Learning: An Introduction using the Euler Characteristic Transform}, + year = {2024}, + month = oct, + abstract = {This overview article makes the case for how topological concepts can enrich research in machine learning. Using the Euler Characteristic Transform (ECT), a geometrical-topological invariant, as a running example, I present different use cases that result in more efficient models for analyzing point clouds, graphs, and meshes. Moreover, I outline a vision for how topological concepts could be used in the future, comprising (1) the learning of functions on topological spaces, (2) the building of hybrid models that imbue neural networks with knowledge about the topological information in data, and (3) the analysis of qualitative properties of neural networks. With current research already addressing some of these aspects, this article thus serves as an introduction and invitation to this nascent area of research.}, + archiveprefix = {arXiv}, + copyright = {arXiv.org perpetual, non-exclusive license}, + doi = {10.48550/ARXIV.2410.17760}, + eprint = {2410.17760}, + file = {:Rieck2024 - Topology Meets Machine Learning_ an Introduction Using the Euler Characteristic Transform.pdf:PDF:http\://arxiv.org/pdf/2410.17760v1;:TOREVIEW/Notices/241007-Rieck-v1.pdf:PDF}, + keywords = {Machine Learning (cs.LG), Algebraic Topology (math.AT), FOS: Computer and information sciences, FOS: Mathematics, 55N31, 62R40, 68T09}, + primaryclass = {cs.LG}, + publisher = {arXiv} +} diff --git a/paper/paper.md b/paper/paper.md new file mode 100644 index 0000000..ae0cef2 --- /dev/null +++ b/paper/paper.md @@ -0,0 +1,107 @@ +--- +title: 'ect: A Python Package for the Euler Characteristic Transform' +tags: + - Python + - Topological Data Analysis + - Euler Characteristic +authors: + - name: Yemeen Ayub + corresponding: true + affiliation: 1 + orcid: 0009-0009-6667-0991 + - name: Elizabeth Munch + affiliation: 1 + orcid: 0000-0002-9459-9493 + - name: Sarah McGuire + affiliation: 2 + orcid: 0000-0003-4020-0536 + - name: Daniel H. Chitwood + affiliation: 1 + orcid: 0000-0003-4875-1447 + +affiliations: + - name: Michigan State University, East Lansing, MI, USA + index: 1 + - name: Pacific Northwest National Lab (PNNL), USA + index: 2 +date: Oct 2025 +bibliography: paper.bib + +# Optional fields if submitting to a AAS journal too, see this blog post: +# https://blog.joss.theoj.org/2018/12/a-new-collaboration-with-aas-publishings +# aas-doi: 10.3847/xxxxx <- update this with the DOI from AAS once you know it. +# aas-journal: Astrophysical Journal <- The name of the AAS journal. +--- + +# Summary + +The field of Topological Data Analysis [@Dey2021;@Wasserman2018;@Ghrist2014;@Munch2017] encodes the shape of data in quantifiable representations of the information, sometimes called "topological signatures" or "topological summaries". The goal is to ensure that these summaries are robust to noise and useful in practice. In many methods, richer representations bring higher computation cost, creating a tension between robustness and speed. The Euler Characteristic Transform (ECT) [@Turner2014;@Munch2025;@Rieck2024] has gained popularity for encoding the information of embedded shapes in $\mathbb{R}^d$--such as graphs, simplicial complexes, and meshes--because it strikes this balance by providing a complete topological summary, yet is typically much faster to compute than its widely used cousin, the Persistent Homology Transform [@Turner2014]. + +The `ect` Python package offers a fast and well-documented implementation of ECT for inputs in any embedding dimension and with a wide range of complex types. With a few lines of code, users can generate ECT features by sampling directions, computing Euler characteristic curves, and vectorizing them for downstream tasks such as classification or regression. The package includes practical options for direction sampling, normalization, and visualizing various versions of the ECT. These options allow for smooth integration into other scientific package such as `Numpy`, `Scipy`, and `PyTorch`. By lowering the barrier to computing the ECT on embedded complexes, `ect` makes these topological summaries accessible to a wider range of practitioners and domain scientists. + +## The Euler Characteristic Transform + +The Euler characteristic is a standard construction from algebraic topology (See e.g. [@Hatcher]). +In its simplest form, for a given polyhedron $K$, it is defined as the alternating sum $\chi(K) = v_K-e_K+f_K$ where $v_K$, $e_K$, and $f_K$ stand for the counts of the numbers of vertices, edges, and faces in $K$, respectively. +The ECT extends this idea to encode the changing Euler characteristic for sublevel sets of an input space in different directions. +We give a high level introduction of the ECT here as defined in [@Turner2014], and direct the reader to [@Munch2025;@Rieck2024] for full survey articles specifically on the subject. + + +To start, we have input `ect.EmbeddedComplex`, which is a polyhedral complex $K$ (See [@Goodman2018] Ch. 17.4) which is a collection of convex polytopes in $\mathbb{R}^n$ closed under the face relation. While we note the code can handle shapes in any dimension, we will give an exposition focusing on the case of a straight-line graph embedding like the example given in \autoref{fig:example_graph} embedded in $\mathbb{R}^2$. + +For a choice of direction $\omega \in \mathbb{S}^{n-1}$, we induce a function on the vertex set given by $g_\omega(v) = \langle f(v), \omega\rangle$, the dot product of the embedding coordinates of the vertex with the unit vector $\omega \in \mathbb{R}^n$. +Some examples are shown for the embedded graph in \autoref{fig:example_graph}. +The ECT for the embedded graph is given by +$$ +\begin{matrix} +\text{ECT}(G): & \mathbb{S}^1 \times \mathbb{R} & \to & \mathbb{Z}\\ +& (\omega,a) & \mapsto & \chi(g_\omega^{-1}(-\infty,a]). +\end{matrix} +$$ +After discretizing, the example embedded graph has an ECT matrix as shown in the bottom row of \autoref{fig:example_graph}. + +![(Top row) An example of an embedded graph with two choices of function $f_\omega$ drawn as the coloring on the nodes. (Bottom) The ECT matrix of the graph shown.\label{fig:example_graph}](figures/CombineGraphExample.png) + + + + + + +# Statement of Need + +Despite the ECT's mathematical power, there has been a notable absence of efficient, user-friendly, continuously maintained Python packages that can handle the computational demands of modern research datasets. The ECT package addressed this by leveraging Numba's just-in-time compilation to achieve significant speedups over naive Python implementations, making it practical to compute ECTs for large-scale datasets. This performance is then complimented by the many utility functions for visualizing and comparing different Euler Characteristic Tranforms such as the ECT, SECT, and the DECT. + + + +# Acknowledgements + +This material is based in part upon work supported in part by the National Science Foundation through grants +CCF-1907591, +CCF-2106578, +and CCF-2142713. +This work was also supported by US National Science Foundation Plant Genome Research Program awards (IOS-2310355, IOS-2310356, and IOS-2310357). + +# References