{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "* This is a python jupyter notebook on the persisten homology with a python-binding package, dionysus. (incomplete version at this stage)\n", " + About dionysus : https://github.com/mrzv/dionysus\n", " + Version : 0.0\n", " + Last update : May 5, 2018\n", "\n", "* This is based on the tutorials in http://mrzv.org/software/dionysus2/\n", "\n", "I'm planning to write down some documenations on the persistent cohomology for beginners...
\n", "(either in Japanese or in English, which I've not decieded yet)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* You need the Boost C++ library\n", " + If you use Ubuntu, only you need to do is\n", " > sudo apt-get install libboost-all-dev\n", "* If you get an error message like \"version `GLIBCXX_3.4.20' not found\", you should update libgcc package\n", " > conda update libgcc\n", "* If you still have troubles, you may ask Google teacher." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Beginning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's try : import dionysus" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'2.0.5'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import dionysus\n", "dionysus.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### auxiliary functions to see the properties of objects" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def dir_(x):\n", " return [ s for s in dir(x) if s[0] != '_']\n", "def dir__(x):\n", " return [ (s, 'method') if callable(getattr(x, s)) else (s, 'non-method') for s in dir_(x) ]\n", "def info(x, show_value=True):\n", " print(type(x))\n", " print(dir__(x))\n", " if show_value:\n", " print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## - Simplex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### define a simplex\n", "* any data point is labeled by a integer\n", " + Hereafter we call it label of the vertex" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import Simplex" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[('boundary', 'method'), ('data', 'non-method'), ('dimension', 'method'), ('join', 'method')]\n" ] } ], "source": [ "# Let's define a 3-simplex from 4-points (0,1,2,3)\n", "n = 3\n", "s = Simplex(range(n+1))\n", "info(s, show_value=False)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n", "3.0\n" ] } ], "source": [ "# We can associate a real value to the simplex, later, which we can interpret as the radius at which it appears in the nerve\n", "print(s.data)\n", "s.data = 3.\n", "print(s.data)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "<0,1,1,2,2> 100" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Remark : we can also define the degenerate simplices\n", "Simplex([0,1,2,1,2], 100.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### get the label of the vertices ( data points ) of the simplex" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "\n" ] } ], "source": [ "for v in s:\n", " print(v)\n", "print(type(v))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### get the boudary facet of the simplex" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dim. = 3\n", "No. 0 : <1,2,3> 0\n", "No. 1 : <0,2,3> 0\n", "No. 2 : <0,1,3> 0\n", "No. 3 : <0,1,2> 0\n", "---\n", "\n", "[('boundary', 'method'), ('data', 'non-method'), ('dimension', 'method'), ('join', 'method')]\n", "<0,1,2> 0\n" ] } ], "source": [ "print(\"dim. = \", s.dimension())\n", "for i, v in enumerate(s.boundary()):\n", " print(\"No. {0} : {1}\".format(i, v))# i-th (n-1)-simplex, its value associated to the i-th boudary face\n", "print('---')\n", "info(v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### generate all faces whose dimensions are lower than a given value" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import closure" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[<0,2> 0,\n", " <0,1> 0,\n", " <1,3> 0,\n", " <0,3> 0,\n", " <1,2> 0,\n", " <2,3> 0,\n", " <0> 0,\n", " <1> 0,\n", " <2> 0,\n", " <3> 0]" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "closure([s], 1)# all the 1-faces and 0-faces" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[<0,2,3> 0,\n", " <0,1,3> 0,\n", " <0,2> 0,\n", " <0,1> 0,\n", " <1,3> 0,\n", " <0,3> 0,\n", " <1,2> 0,\n", " <2,3> 0,\n", " <1,2,3> 0,\n", " <0> 0,\n", " <1> 0,\n", " <2> 0,\n", " <3> 0,\n", " <0,1,2> 0]" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "closure([s], 2)# all the 2-faces, the 1-faces and 0-faces" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## - Filtration ::: under construction" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import Filtration" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## - Vietoris-Rips complexes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### generate data points and plot them" ] }, { "cell_type": "code", "execution_count": 215, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "\n", "num_data_points = 20\n", "dim_feature_space = 2\n", "\n", "np.random.seed(10)\n", "X = np.random.rand(num_data_points, dim_feature_space)" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import matplotlib.cm as cm" ] }, { "cell_type": "code", "execution_count": 216, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n4LckjDwAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.xlim([-0.05, 1.05])\n", "plt.ylim([-0.05, 1.05])\n", "plt.scatter(X[:,0], X[:,1], c=np.arange(len(X)), cmap=cm.tab20)\n", "plt.colorbar();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get the filtration of the VR complex as the sequence of the simplices" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import fill_rips" ] }, { "cell_type": "code", "execution_count": 237, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[('add', 'method'), ('append', 'method'), ('index', 'method'), ('sort', 'method')]\n", "Filtration with 43 simplices\n" ] } ], "source": [ "dim_of_allowed_complex = 2\n", "max_radius = 0.22\n", "\n", "f = fill_rips(X, dim_of_allowed_complex, max_radius)\n", "info(f)" ] }, { "cell_type": "code", "execution_count": 238, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No. 0 : <0> 0\n", "No. 1 : <1> 0\n", "No. 2 : <2> 0\n", "No. 3 : <3> 0\n", "No. 4 : <4> 0\n", "No. 5 : <5> 0\n", "No. 6 : <6> 0\n", "No. 7 : <7> 0\n", "No. 8 : <8> 0\n", "No. 9 : <9> 0\n", "No. 10 : <10> 0\n", "No. 11 : <11> 0\n", "No. 12 : <12> 0\n", "No. 13 : <13> 0\n", "No. 14 : <14> 0\n", "No. 15 : <15> 0\n", "No. 16 : <16> 0\n", "No. 17 : <17> 0\n", "No. 18 : <18> 0\n", "No. 19 : <19> 0\n", "No. 20 : <7,15> 0.0911795\n", "No. 21 : <2,10> 0.0936293\n", "No. 22 : <13,14> 0.0937617\n", "No. 23 : <3,18> 0.10823\n", "No. 24 : <6,19> 0.121911\n", "No. 25 : <7,9> 0.146531\n", "No. 26 : <1,14> 0.148711\n", "No. 27 : <7,14> 0.16263\n", "No. 28 : <14,15> 0.173995\n", "No. 29 : <7,14,15> 0.173995\n", "No. 30 : <13,15> 0.187649\n", "No. 31 : <13,14,15> 0.187649\n", "No. 32 : <8,16> 0.188886\n", "No. 33 : <12,13> 0.192908\n", "No. 34 : <3,11> 0.195414\n", "No. 35 : <3,19> 0.20217\n", "No. 36 : <1,5> 0.211024\n", "No. 37 : <18,19> 0.213223\n", "No. 38 : <3,18,19> 0.213223\n", "No. 39 : <2,12> 0.216758\n", "No. 40 : <7,13> 0.218737\n", "No. 41 : <7,13,14> 0.218737\n", "No. 42 : <7,13,15> 0.218737\n", "---\n", "\n", "[('boundary', 'method'), ('data', 'non-method'), ('dimension', 'method'), ('join', 'method')]\n", "<7,13,15> 0.218737\n" ] } ], "source": [ "for i, s in enumerate(f):\n", " print(\"No. {0} : {1}\".format(i, s))# simplex, radius at which the simplex appears in the complex\n", "print('---')\n", "info(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Show the complex ( faces <= dim.2 )" ] }, { "cell_type": "code", "execution_count": 239, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dim2simpleciesList = [[] for i in range(dim_feature_space + 1)]\n", "for s in f:\n", " dim2simpleciesList[s.dimension()].append(s)" ] }, { "cell_type": "code", "execution_count": 240, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.xlim([-0.05, 1.05])\n", "plt.ylim([-0.05, 1.05])\n", "\n", "ax = plt.subplot()\n", "for t in dim2simpleciesList[2]:\n", " tri = plt.Polygon([ X[v] for v in t], fc='g');\n", " ax.add_patch(tri)\n", "\n", "for e in dim2simpleciesList[1]:\n", " pt = np.array([X[v] for v in e]).T\n", " plt.plot(pt[0], pt[1], c='r')\n", "\n", "plt.scatter(X[:,0], X[:,1], c='b');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## - Persistent Homology" ] }, { "cell_type": "code", "execution_count": 251, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import homology_persistence" ] }, { "cell_type": "code", "execution_count": 252, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[('pair', 'method'), ('unpaired', 'non-method')]\n", "Reduced matrix with 43 columns\n" ] } ], "source": [ "hp = homology_persistence(f)\n", "info(hp)" ] }, { "cell_type": "code", "execution_count": 253, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No. 0 : \n", "No. 1 : \n", "No. 2 : \n", "No. 3 : \n", "No. 4 : \n", "No. 5 : \n", "No. 6 : \n", "No. 7 : \n", "No. 8 : \n", "No. 9 : \n", "No. 10 : \n", "No. 11 : \n", "No. 12 : \n", "No. 13 : \n", "No. 14 : \n", "No. 15 : \n", "No. 16 : \n", "No. 17 : \n", "No. 18 : \n", "No. 19 : \n", "No. 20 : 1*7 + 1*15\n", "No. 21 : 1*2 + 1*10\n", "No. 22 : 1*13 + 1*14\n", "No. 23 : 1*3 + 1*18\n", "No. 24 : 1*6 + 1*19\n", "No. 25 : 1*7 + 1*9\n", "No. 26 : 1*1 + 1*13\n", "No. 27 : 1*1 + 1*7\n", "No. 28 : \n", "No. 29 : 1*20 + 1*27 + 1*28\n", "No. 30 : \n", "No. 31 : 1*22 + 1*28 + 1*30\n", "No. 32 : 1*8 + 1*16\n", "No. 33 : 1*1 + 1*12\n", "No. 34 : 1*3 + 1*11\n", "No. 35 : 1*3 + 1*6\n", "No. 36 : 1*1 + 1*5\n", "No. 37 : \n", "No. 38 : 1*23 + 1*35 + 1*37\n", "No. 39 : 1*1 + 1*2\n", "No. 40 : \n", "No. 41 : 1*22 + 1*27 + 1*40\n", "No. 42 : \n", "---\n", "\n", "[]\n", "\n" ] } ], "source": [ "# Result\n", "for i, c in enumerate(hp):\n", " print(\"No. {0} : {1}\".format(i, c))\n", "print('---')\n", "info(c)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Persistent diagram" ] }, { "cell_type": "code", "execution_count": 260, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from dionysus import init_diagrams" ] }, { "cell_type": "code", "execution_count": 268, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dim = 0 : Diagram with 20 points\n", " (0,inf)\n", " (0,inf)\n", " (0,0.216758)\n", " (0,inf)\n", " (0,inf)\n", " (0,0.211024)\n", " (0,0.20217)\n", " (0,0.16263)\n", " (0,inf)\n", " (0,0.146531)\n", " (0,0.0936293)\n", " (0,0.195414)\n", " (0,0.192908)\n", " (0,0.148711)\n", " (0,0.0937617)\n", " (0,0.0911795)\n", " (0,0.188886)\n", " (0,inf)\n", " (0,0.10823)\n", " (0,0.121911)\n", "dim = 1 : Diagram with 0 points\n", "dim = 2 : Diagram with 1 points\n", " (0.218737,inf)\n", "---\n", "\n", "[('append', 'method')]\n", "Diagram with 1 points\n", "---\n", "\n", "[('birth', 'non-method'), ('data', 'non-method'), ('death', 'non-method')]\n", "(0.218737,inf)\n" ] } ], "source": [ "diag = init_diagrams(hp, f)\n", "\n", "for dim, dg in enumerate(diag):\n", " print(\"dim = {0} : {1}\".format(dim, dg))\n", " for d in dg:\n", " print(\" \",d)\n", "print('---')\n", "info(dg)\n", "print('---')\n", "info(d)" ] }, { "cell_type": "code", "execution_count": 264, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dim = 0\n", "dionysus.plot.plot_diagram(diag[dim], show = True)" ] }, { "cell_type": "code", "execution_count": 264, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dim = 0\n", "dionysus.plot.plot_bars(diag[dim], show = True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## - Draw the filtration process" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from collections import defaultdict\n", "def get_dim2simpleciesList(filt, radius, dim_feature_space):\n", " dim2simpleciesList_dic = defaultdict(lambda :[])# \n", " for s in f:\n", " if s.data <= radius:\n", " dim2simpleciesList_dic[s.dimension()].append(s)\n", " size = max(dim_feature_space, max(dim2simpleciesList_dic.keys()))\n", " dim2simpleciesList = [[] for i in range(size + 1)]\n", " for dim, simpleciesLict in dim2simpleciesList_dic.items():\n", " dim2simpleciesList[dim] = simpleciesLict\n", " return dim2simpleciesList" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def plot_abstract_complex(X, dim2simpleciesList, ax=None):\n", " #ax.set_xlim([-0.05, 1.05])\n", " #ax.set_ylim([-0.05, 1.05])\n", "\n", " if ax is None:\n", " ax = plt.subplot()\n", " for t in dim2simpleciesList[2]:\n", " tri = plt.Polygon([ X[v] for v in t], fc='g');\n", " ax.add_patch(tri)\n", "\n", " for e in dim2simpleciesList[1]:\n", " pt = np.array([X[v] for v in e]).T\n", " ax.plot(pt[0], pt[1], c='r')\n", "\n", " ax.scatter(X[:,0], X[:,1], c='b')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_transition_raidus_in_filtration(filt):\n", " transition_radius = list(set([s.data for s in f]))\n", " transition_radius.sort()\n", " return transition_radius" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_dim2BDarray(filt):\n", " hp = homology_persistence(filt)\n", " diag = init_diagrams(hp, filt)\n", " return [np.array([[d.birth, d.death] for d in dg]) for dg in diag], hp, diag" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def BDarray2homRank(BDarray, radius):\n", " if len(BDarray) == 0:\n", " return 0\n", " else:\n", " return np.sum(np.sum(BDarray <= radius, axis=1) == 1)\n", "\n", "def get_homology_rank(dim2BDarray, radius):\n", " return [(dim, BDarray2homRank(BDarray, radius)) for dim, BDarray in enumerate(dim2BDarray)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### generate data" ] }, { "cell_type": "code", "execution_count": 215, "metadata": { "collapsed": true }, "outputs": [], "source": [ "num_data_points = 20\n", "dim_feature_space = 2\n", "\n", "np.random.seed(10)\n", "X = np.random.rand(num_data_points, dim_feature_space)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get the VR complex" ] }, { "cell_type": "code", "execution_count": 437, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Filtration with 249 simplices\n" ] } ], "source": [ "dim_of_allowed_complex = 10\n", "max_radius = 0.4\n", "\n", "f = fill_rips(X, dim_of_allowed_complex, max_radius)\n", "print(f)\n", "\n", "dim2BDarray, hp, diag = get_dim2BDarray(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute the Betti numbers" ] }, { "cell_type": "code", "execution_count": 438, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#radius_list = np.linspace(0.0, max_radius, 200)\n", "tr = get_transition_raidus_in_filtration(f)\n", "radius_list = (np.array([0.0] + tr) + np.array(tr + [max_radius])) / 2.\n", "\n", "homology_rank_seq = np.array([np.array(get_homology_rank(dim2BDarray, r))[:,1] for r in radius_list])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot" ] }, { "cell_type": "code", "execution_count": 442, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(len(radius_list))\n", "ax = plt.subplot()\n", "ax.get_yaxis().set_major_locator(MaxNLocator(integer=True))\n", "ax.plot(radius_list, homology_rank_seq[:,0], c='b', label='0')\n", "ax.plot(radius_list, homology_rank_seq[:,1], c='r', label='1')\n", "ax.plot(radius_list, homology_rank_seq[:,2], c='g', label='2')\n", "ax.legend(loc='upper left');" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Create the animation\n", "* Warning : It takes a lot of time if you have many simplicies at last\n", "* You can reduce the radius list to reduce the plot output\n", " + Ex. : reduce by 1/10\n", " - radius_list = radius_list[::10]" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "from matplotlib.ticker import MaxNLocator" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "save_dir = ...\n", "os.makedirs(save_dir, exist_ok=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%time\n", "fig = plt.figure(figsize=(14,5))\n", "for i, r in enumerate(radius_list):\n", " if i % 5 != 0:\n", " continue\n", " print(\"{0}/{1}\".format(i, len(radius_list)), '\\r', end='')\n", " fig.clf()\n", " ax1 = fig.add_subplot(1,2,1)\n", "\n", " ax1.get_yaxis().set_major_locator(MaxNLocator(integer=True))\n", " ax1.set_ylim([0.,30.])\n", " ax1.plot(radius_list, homology_rank_seq[:,0], c='b', label='0')\n", " ax1.plot(radius_list, homology_rank_seq[:,1], c='r', label='1')\n", " ax1.plot(radius_list, homology_rank_seq[:,2], c='g', label='2')\n", " ax1.legend(loc='upper left')\n", " ax1.axvline(x=r, c='y')\n", "\n", " ax2 = fig.add_subplot(1,2,2)\n", " plot_abstract_complex(X, get_dim2simpleciesList(f, r, dim_feature_space), ax2)\n", "\n", " fig.savefig(os.path.join(save_dir, '{0:04d}.png'.format(i)), dpi=100)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import subprocess, os" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4 ms, sys: 44 ms, total: 48 ms\n", "Wall time: 1.98 s\n" ] } ], "source": [ "%%time\n", "output_dir = ...\n", "gif_name = \"anim.gif\"\n", "time_interval = 100\n", "\n", "target_frames = os.path.join(save_dir, \"*.png\")\n", "output_gifname = os.path.join(output_dir, gif_name)\n", "convert_command = \"convert -layers optimize -loop 0 -delay {2} {0} {1}\".format(target_frames, output_gifname, time_interval)\n", "result = subprocess.run(convert_command, shell=True)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "##### future improvements\n", "* Relative persistent homology\n", "* some materials related to more theoretical definitions of PH or PD..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Applied examples" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#import dionysus\n", "from dionysus import Simplex, Filtration\n", "from dionysus import closure, fill_rips, homology_persistence, init_diagrams\n", "from dionysus.plot import plot_diagram as dplot\n", "\n", "import os\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import matplotlib.cm as cm\n", "from matplotlib.ticker import MaxNLocator\n", "\n", "import seaborn as sns\n", "sns.set_style('whitegrid')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sample_points_from_image(grayscale_image, num_samples=None, ratio=None, threshold=128):\n", " assert grayscale_image.ndim == 2\n", " points = np.array(np.where(grayscale_image >= threshold)).T\n", " np.random.shuffle(points)\n", " if num_samples is not None:\n", " return points[:num_samples]\n", " elif ratio is not None:\n", " return points[:int(len(points) * ratio)]\n", "\n", "def get_1PD(x, num_samples=50, ratio=None, dim_of_allowed_complex=3, max_radius=15.0, threshold=128, dim_list=[1,2]):\n", " s = sample_points_from_image(x, num_samples=num_samples, ratio=ratio, threshold=threshold)\n", " f = fill_rips(s.astype(np.float32), dim_of_allowed_complex, max_radius)\n", " hp = homology_persistence(f)\n", " diag = init_diagrams(hp, f)\n", " return { dim : np.array([[d.birth, d.death] for d in diag[dim]]) for dim in dim_list }\n", "\n", "def drop_inf(bd_array):\n", " return bd_array[~(bd_array == np.inf).any(axis=1)]\n", "\n", "def plot_PDpoints_for_mnist(points, labels):\n", " upper = 1.1 * np.max(points[:,1])\n", " plt.xlim([0.0, upper])\n", " plt.ylim([0.0, upper])\n", " plt.scatter(points[:,0], points[:,1], c=labels, cmap=cm.tab10);\n", " plt.colorbar()\n", " plt.plot(np.arange(upper), np.arange(upper), c='black');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-1. Artificial example\n", "* Warning : It takes much computational cost. Be care of the memory size !" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def generate_rings(num_data_points, seed=0, a=0.1, s=1.0, c=[0., 0.]):\n", " np.random.seed(seed)\n", " theta = 4 * np.pi * np.random.rand(num_data_points)\n", " r = s * np.exp( 2 * a * np.random.rand(num_data_points) - a )\n", " return (r * np.array([np.cos(theta), np.sin(theta)])).T + np.array(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### generate data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "200 2\n" ] } ], "source": [ "X = np.concatenate([generate_rings(130, seed=5),\n", " generate_rings(25, seed=2, s=0.2, a=0.05, c=[1.2,0.]),\n", " generate_rings(45, seed=3, s=0.35, a=0.3, c=[0.95,0.65])])\n", "\n", "num_data_points, dim_feature_space = X.shape\n", "print(num_data_points, dim_feature_space)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.xlim([-1.5, 2.0])\n", "plt.ylim([-1.5, 1.5])\n", "plt.scatter(X[:,0], X[:,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get the VR complex" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Filtration with 5281300 simplices\n", "CPU times: user 16.5 s, sys: 272 ms, total: 16.8 s\n", "Wall time: 16.7 s\n" ] } ], "source": [ "%%time\n", "dim_of_allowed_complex = 4\n", "max_radius = 0.6\n", "\n", "f = fill_rips(X, dim_of_allowed_complex, max_radius)\n", "print(f)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 46.7 s, sys: 392 ms, total: 47.1 s\n", "Wall time: 47 s\n" ] } ], "source": [ "%%time\n", "dim2BDarray, hp, diag = get_dim2BDarray(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute and plot the Betti number transitions" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4.94 s, sys: 0 ns, total: 4.94 s\n", "Wall time: 4.94 s\n" ] } ], "source": [ "%%time\n", "radius_list = np.linspace(0.0, max_radius, 60)\n", "\n", "homology_rank_seq = np.array([np.array(get_homology_rank(dim2BDarray, r))[:,1] for r in radius_list])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "60\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUVNW59/HvAw20jI3YCM0QIBhliKK0U6JGcQghiUaM\nXpF49YWIr9fkSqJLo7lL4zIxZnBKNBrUvEkUMdEYpwjqNQ5oBG0EDYJTAomNKIOoDIIN/bx/7Gpp\nmqqu0zX0OVX8PmvVqq5Tu6qeQ8GP3fvss4+5OyIiUvo6xF2AiIgUhgJdRKRMKNBFRMqEAl1EpEwo\n0EVEyoQCXUSkTGQNdDOrNLPnzewlM3vFzC5Pbd/dzB4zszdS972LX66IiGRi2eahm5kB3dx9g5l1\nAp4BzgMmAu+5+1Vm9j2gt7tfVPSKRUQkraw9dA82pB52St0cOAH4XWr774CvFaVCERGJpCJKIzPr\nCCwAhgM3uvt8M9vT3VemmrwD7JnhtdOAaQDdunUbu88+++RfdZl67z1YtgxGjYLKyrirEZGkWLBg\nwRp3r87WLuuQyw6NzaqAPwPfBp5x96pmz61z91bH0Wtra72uri7y5+1qnnwSjjoKHn8cxo2LuxoR\nSQozW+DutdnatWmWi7u/DzwBjAfeNbP+qQ/rD6zKpVDZrqYm3L/9drx1iEhpijLLpTrVM8fMdgOO\nBV4FHgDOSDU7A7i/WEXuKvr3D/cKdBHJRZQx9P7A71Lj6B2AP7r7Q2b2HPBHM5sK/As4pYh17hJ6\n9Ag3BbqI5CJroLv7y8D+abavBY7Ot4CGhgbq6+vZvHlzvm9VNJWVlQwcOJBOnToV/bNqahToIpKb\nSLNciqm+vp4ePXowZMgQwpT3ZHF31q5dS319PUOHDi365ynQRSRXsZ/6v3nzZvr06ZPIMAcwM/r0\n6dNuv0Eo0EUkV7EHOpDYMG/SnvU1BbouJCUibZWIQJftampgyxZYty7uSkSk1CjQU+bMmcPee+/N\n8OHDueqqq2KrQ3PRRSRXCnRg27ZtnHvuucyePZslS5Ywa9YslixZEkstCnQRyZUCHXj++ecZPnw4\nw4YNo3Pnzpx66qncf38850kp0EUkV7FPW2xu+nRYtKiw7zlmDFx3XettVqxYwaBBgz55PHDgQObP\nn1/YQiLS2aIikiv10BNmt92gd28Fuoi0XaJ66Nl60sUyYMAA3nrrrU8e19fXM2DAgHiKQXPRRSQ3\n6qEDBx54IG+88QbLli3j448/5q677uL444+PrR4FuojkIlE99LhUVFRwww038MUvfpFt27YxZcoU\nRo0aFVs9NTXw6quxfbyIlCgFesqECROYMGFC3GUAIdBXroTGRuig36FEJKIo66EPMrMnzGyJmb1i\nZueltv/BzBalbsvNrMDzU3ZdNTWwdSusWRN3JSJSSqL00LcC57v7i2bWA1hgZo+5+380NTCzq4EP\nilXkrqb5XPS+feOtRURKR9YeuruvdPcXUz+vB5YCn0wBsbBy1SnArGIVuavRyUUikos2jdCa2RDC\nxS6an3VzOPCuu7+R4TXTzKzOzOpWr16da527FAW6iOQicqCbWXfgT8B0d/+w2VOTaKV37u4z3L3W\n3Wurq6tzr3QX0q9fuFegi0hbRJrlYmadCGE+093vbba9ApgIjC1Oebumzp2hulqBLiJtE2WWiwG3\nAUvd/ZoWTx8DvOru9cUorr1MmTKFvn37Mnr06LhL+YROLhKRtooy5PJ54HRgXLNpik0Ttk+lDA6G\nnnnmmcyZMyfuMnagQBeRtso65OLuzwBpr8Hm7mcWuqA4HHHEESxfvjzuMnZQU1P4lSdFpLwl60zR\nuNbPTaCaGnj33XCCUUWyviURSSidWJ5QNTXh1P9Vq+KuRERKRbL6fiXYky6W5nPRm34WEWmNeugJ\npZOLRKStFOjApEmTOPTQQ3nttdcYOHAgt912W9wlKdBFpM2SNeQSk1mzkjfzsm/fsHSuAl1EolIP\nPaEqKmDPPRXoIhKdAj3BdHKRiLSFAj3B+vdXoItIdAr0BOvTB957L+4qRKRUKNATrHdveP/9uKsQ\nkVKhQE+wqipYvz6c/i8iko0CHXjrrbc46qijGDlyJKNGjeL666+PuyQg9NABPtDVWkUkgijroQ8y\nsyfMbImZvWJm57V4/nwzczPbo3hlFldFRQVXX301S5YsYd68edx4440sWbIk7rKoqgr369bFW4eI\nlIYoPfStwPnuPhI4BDjXzEZCCHvgOODfxSux+Pr3788BBxwAQI8ePRgxYgQrVqyIuartPXQFuohE\nEWU99JXAytTP681sKTAAWAJcC1wI3F+IYqbPmc6idwq7fO6YfmO4bnz0Rb+WL1/OwoULOfjggwta\nRy6aeug6MCoiUbRpDN3MhgD7A/PN7ARghbu/lOU108yszszqVq9enXOh7WHDhg2cdNJJXHfddfTs\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(len(radius_list))\n", "ax = plt.subplot()\n", "ax.get_yaxis().set_major_locator(MaxNLocator(integer=True))\n", "#ax.set_yscale('log')\n", "ax.set_ylim([0,30])\n", "ax.plot(radius_list, homology_rank_seq[:,0], c='b', label='0')\n", "ax.plot(radius_list, homology_rank_seq[:,1], c='r', label='1')\n", "ax.plot(radius_list, homology_rank_seq[:,2], c='g', label='2')\n", "#ax.plot(radius_list, homology_rank_seq[:,3], c='y', label='3')\n", "ax.legend(loc='upper left');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-2. MNIST example\n", "* Not good example, however. I'll improve this part in the future and please inform me if you have any idea !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note:\n", "* 0, 6, 9 has single 1-cycle\n", " - the cycle in 0 may be greater than that of 6 or 9\n", "* 8 has the two 1-cycles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Load mnist" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# describe by yourself a MNIST loading line\n", "x_mnist = ...\n", "y_mnist = ...\n", "assert x_mnist.shape[1:] == (28, 28) and len(x_mnist) == len(y_mnist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### check : sampling from digit pixels" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "digit : 5\n", "# of sampled = 58\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# check mnist images and their pixel sampling examples\n", "i = 0\n", "print(\"digit : \", y_mnist[i])\n", "\n", "plt.figure(figsize=(8,4))\n", "plt.subplot(121)\n", "plt.imshow(x_mnist[i], cmap=cm.gray);\n", "\n", "s = sample_points_from_image(x_mnist[i], ratio=0.5, threshold=100)\n", "print(\"# of sampled = \", len(s))\n", "img = np.zeros(x_mnist[i].shape, np.uint8)\n", "img[s[:,0], s[:,1]] = 255\n", "plt.subplot(122)\n", "plt.imshow(img, cmap=cm.gray);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Compute the persistent diagram ( birth-death time of cycles )" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "completed\n", "CPU times: user 6min, sys: 1.13 s, total: 6min 2s\n", "Wall time: 6min 1s\n" ] } ], "source": [ "%%time\n", "num_samples = None\n", "ratio = 0.5\n", "threshold = 100\n", "\n", "np.random.seed(10)\n", "target = np.arange(100)\n", "bd_list = []\n", "for i, n in enumerate(target):\n", " print(\"{0}/{1}\".format(i, len(target)), '\\r', end='')\n", " bd_list.append(get_1PD(x_mnist[n], num_samples=num_samples, ratio=ratio, threshold=threshold))\n", "print('completed')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from collections import defaultdict\n", "\n", "points = []\n", "labels = []\n", "cycle_lifetimes = defaultdict(lambda :[])\n", "for label, bd in zip(y_mnist[target], bd_list):\n", " if len(bd[1]) != 0:\n", " cycle_lifetimes[label].append(bd[1][:,1] - bd[1][:,0])\n", " for pt in drop_inf(bd[1]):\n", " points.append(pt)\n", " labels.append(label)\n", " else:\n", " cycle_lifetimes[label].append([])\n", " \n", "points = np.array(points)\n", "labels = np.array(labels)\n", "cycle_lifetimes = { label : np.array(lt) for label, lt in cycle_lifetimes.items() }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Remove the noise cycles" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "delta = 2.\n", "robust_betti_numbers = defaultdict(lambda :[])\n", "for label, lt_for_each_digit in cycle_lifetimes.items():\n", " for lt_list in lt_for_each_digit:\n", " if len(lt_list) == 0:\n", " robust_betti_numbers[label].append(0)\n", " else:\n", " robust_betti_numbers[label].append(np.sum(lt_list > delta))\n", "\n", "robust_betti_numbers = { label : np.array(rbn) for label, rbn in robust_betti_numbers.items()}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Show the persistent diagrams at the same time\n", "* Notice that one sample can have several points in the PD below. Here we do not pay attentions to it." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbcAAAFOCAYAAAAFClM6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlAVGX////nbOwgi4iiIO6kpBaGYnabZlm5ZC5plma/\nrNtM886yzLrTSiv95ifLLE3NCjXLBQW709xTMzVciNxXVtn3YYCZOb8/NAyZQUFgWN6Pv+I61znz\nngnnxXXOda6jUhRFQQghhKhH1LYuQAghhKhqEm5CCCHqHQk3IYQQ9Y6EmxBCiHpHwk0IIUS9I+Em\nhBCi3tHaugAhhBDiZsxmMzNnzuTs2bPodDpmzZpFmzZtrPaXkZsQQohab8eOHeTm5rJmzRrmzJnD\nvHnzyu0v4SaEEKLWu3TpEp07dwbA39+fxMRETCaT1f4SbkIIIWq99u3bs2/fPkwmExcuXCAuLo7M\nzEyr/WvkmltUVFRNvIwQQogKCA4OrvJj/u9wFD6VHDbZ2dlx5513WtzWu3dvjhw5wlNPPUWHDh1o\n3bo15a0eWWMTSqrjQ6wpUVFRUr8N1eX663LtIPXbWnXWX12DDh81DMjRVGrfn9yKyt3+yiuvlPx3\nv3798PLystpXTksKIYSo9U6dOsWbb74JwK+//krHjh1Rq61HmNwKIIQQotZr3749iqIwfPhw7O3t\n+fjjj8vtL+EmhBCi1lOr1Xz00Ue33r8aaxFCCCFsQsJNCCFEvSPhJoQQot6RcBNCCFHvSLgJIYSo\ndyTchBBC1DsSbkIIIeodCTchhBD1joSbEEKIekfCTQghRL1zS+F25swZ+vXrx8qVK0u17927lw4d\nOlRLYUIIIURl3TTc9Ho977//PqGhoaXaCwsL+eqrr/D29q624oQQQojKuGm42dnZsXTpUpo0aVKq\nffHixYwePRo7O7tqK04IIYSojJuGm1arxcHBoVTbxYsXOXXqFI888ki1FSaEEA3VoUOHeOCBB/jz\nzz9tXUqdValH3nz44Ye8/fbbFdqnup76WlOkftuqy/XX5dpB6q9pW7du5b333qO4uJhhw4bVufpr\niwqHW3JyMhcuXOC1114DICUlhaeffrrMZJMbyaPebUfqt526XDtI/TXJbDbz7rvv8t577+Hq6sqG\nDRvw8fGptvrre2hWONx8fHzYvn17yc99+/a9abAJIYSwTq/X8+yzz/Ljjz/SqlUrIiMj6dSpU70P\noOp003CLiYlh7ty5JCQkoNVq2bp1KwsXLsTd3b0m6hNCiHotMTGRIUOGcPjwYXr16sWGDRtkFnoV\nuGm4BQUFERYWZnX7zp07q7QgcXNXsg2s2H+R5BwDTdzsGRcagK+Hk63LEkJU0JEjRxg8eDAJCQk8\n88wzLFmyBHt7e1uXVS9UakKJsJ2DF9J5de1x4jMLStp+ik5i3vAu3Nu2sQ0rE0JUxPr16xkzZgwG\ng4G5c+cybdo0VCqVrcuqN2T5rTrm0x1nSwUbQEKWgc92nLVRRUKIilAUhTlz5jB8+HDUajXh4eG8\n/vrrEmxVTEZudUhKroFjcVkWtx2LyyIhq4Dm7o41XJUQ4lYZDAbGjx/PqlWr8PPzIzIyki5duti6\nrHpJwk0IIWpAcnIyjz/+OAcOHKBHjx6Eh4fTtGlTW5dVb8lpyTqkiasDXf0sz1Lt6ucuozYhaqno\n6GhCQkI4cOAAo0ePZteuXRJs1UzCrY6Z8kA7WniUDrHm7g68/EA7G1UkhChPZGQkPXv2JDY2ltmz\nZ7Ny5coySxqKm8vPz2fSpEmMGTOGUaNGsXfv3nL7y2nJOqZ7ay/WTejJit8ukpJ99VaAZ+RWACFq\nHUVRmD9/Pq+//joODg6sXbuW4cOH27qsGrFKGVbJPX+0uiU8PJxWrVrx6quvkpyczDPPPMOWLVus\n9pdwq4OaNnLgzUfusHUZQggrioqKmDBhAitWrMDX15eIiIg6swxYbeXh4cHp06cByMnJwcPDo9z+\nEm5CCFGF0tLSGDp0KHv37iU4OJiIiAh8fX1tXVadN2DAADZs2MCDDz5ITk4OS5YsKbe/XHMTQogq\ncuLECUJCQti7dy/Dhw/n119/lWCrIps2bcLX15dt27bx7bff8t5775XbX8JNCCGqwJYtWwgNDeXi\nxYu88847/PDDDzg5ybXwqnLkyBF69eoFQGBgICkpKZhMJqv9JdyEEOI2KIrCZ599xoABAygsLGT1\n6tW8++67qNXy9VqVWrZsyfHjxwFISEjA2dkZjUZjtb9ccxNCiEoqLi5m8uTJLFmyBB8fHzZt2kT3\n7t1tXVa9NHLkSGbMmMHTTz+N0Whk1qxZ5faXcBNCiErIyMhgxIgR7Ny5ky5duhAREYG/v7+ty6q3\nnJ2d+fTTT2+5v4ybhRCigs6cOUOPHj3YuXMnjz32GPv27ZNgq2Uk3IQQogJ27NhB9+7dOXv2LG+8\n8QYbNmzAxcXF1mWJG0i4CSHELVq8eDH9+/dHr9fz7bff8tFHH8nEkVpKrrkJIcRNGI1Gpk6dysKF\nC2ncuDHh4eEl09JF7SThJoQQ5cjOzmbkyJFs3bqVTp06ERkZSatWrWxdlrgJGU8LIYQV58+fJzQ0\nlK1bt/Loo4/y22+/SbDVERJuQghhwZ49ewgJCeHkyZNMnTqViIgI3NzcbF2WuEUSbkIIcYPly5eX\nLNC7dOlS5s+fX+5qGKL2kXATQohrTCYTr732GuPHj8fV1ZVt27Yxfvx4W5clKkEmlAghBJCbm8vo\n0aPZvHkzgYGBREZG0rZtW1uXJSpJwk0I0eBdunSJQYMGERMTw0MPPcQPP/yAu7u7rcsSt0FOSwoh\nGrT9+/cTEhJCTEwMkyZN4qeffpJgqwck3IQQDVZYWBh9+/YlIyODRYsWsXDhQrRaOaFVH0i4CSEa\nHLPZzIwZMxg7diyOjo78/PPPTJw40dZliSokf6IIIRqU/Px8xowZQ3h4OG3btiUyMpLAwEBblyWq\nmISbEKLBiIuLY/DgwRw7dow+ffqwbt06PD09bV2WqAZyWlII0SAcOnSIkJAQjh07xvPPP8/WrVsl\n2OqxWwq3M2fO0K9fP1auXAlAUlIS48aN4+mnn2bcuHGkpqZWa5FCCHE71qxZQ+/evUlJSWHBggUs\nWbIEnU5n67JENbppuOn1et5//31CQ0NL2hYsWMATTzzBypUrefDBB1mxYkW1FimEEJWhKAqzZs3i\nySefRKfTsXnzZqZMmYJKpbJ1aaKa3fSam52dHUuXLmXp0qUlbTNnzsTe3h4ADw8P/vrrr+qrUAgh\nKqGgoIAZM2awbds2WrVqRWRkJJ06dbJ1WaKG3HTkptVqcXBwKNXm5OSERqPBZDKxevVqBg0aVG0F\nCiFERSUmJtK7d2+2bdtGr169OHjwoARbA1Pp2ZImk4nXX3+dHj16lDplaU1UVFRlX6pWkPptqy7X\nX5drh7pX/6lTp5g6dSopKSkMGjSIN998k9jYWGJjY21dWqXUtc+/tqh0uL355pu0bNmSSZMm3VL/\n4ODgyr6UzUVFRUn9NlSX66/LtUPdq3/Dhg288MILFBQUMG/ePPr06UO3bt1sXValVefnX52huffX\nMZXarypPAlbqVoCIiAh0Oh0vv/xy1VUihBCVpCgKH3zwAcOGDUOlUrFx40amTZsmE0casJuO3GJi\nYpg7dy4JCQlotVq2bt1Keno69vb2jBlzNZ3btGnDrFmzqrtWIYQow2AwMH78eFatWoWfnx+RkZF0\n6dLF1mUJG7tpuAUFBREWFlYTtQghRIUkJyfz+OOPc+DAAXr06EF4eDhNmza1dVmiGqxdu5aIiIiS\nn2NiYjh69KjV/rL8lhCiToqOjmbQoEHExsby1FNPsWzZsjIzu0X9MWLECEaMGAFcXW3m559/Lre/\nLL8lhKhzIiMjuffee4mNjWX27NmEhYVJsDUgixYtuulTHCTchBB1hqIofPzxxzz22GOYTCbWrVvH\nW2+9JRNHGpDo6GiaNWuGt7d3uf3ktGQtUWwys/L3y0RdzkSrVtG7vTdD7mou/2iFuKaoqIgJEyaw\nYsUKfH19iYiIqFO3KYiqsW7dOh5//PGb9pNwqwWKjGZeCPuD3aevL0C96Vgi+8+n8/+Gd5aAEw1e\nWloaw4YN49dff6Vbt25s2rQJX19fW5clbODgwYO8/fbbN+0npyVrgbADl0oFG4ACbDwaX6ZdiIbm\nxIkTdO/enV9//ZURI0awZ88eCbYGKjk5GWdnZ+zs7G7aV8KtFvjjcqbFdqMZdp9OqeFqhKg9tmzZ\nQmhoKBcuXGDmzJmsWbMGJycnW5clbCQ1NfWWn8EnpyVrAXU5Zx3VckpSNECKorBw4UJeeeUVdDod\n33//PaNGjbJ1WcLGgoKCWLZs2S31lZFbLRDaprHFdjutioeD5IZU0bAUFxczceJEpkyZgre3N3v2\n7JFgExUm4VYLPBniz8DOzUqN4Ow0Ksb0CKB7ay/bFSZEDcvIyODhhx9m8eLFdOnShcOHD9O9e3db\nlyXqIDktWQto1Co+G3UXjwQ1Zf+5NDRqFQ8HNePetpZHdELUR2fOnGHgwIGcPXuWIUOGEBYWhouL\ni63LEnWUhFstoVarGNDZlwGdZRaYaHh27NjB8OHDycrKYvr06cyZMwe1Wk4sicqT3x4hhE0tWbKE\n/v37o9fr+fbbb/nwww8l2MRtk5GbEMImjEYjr776Kp999hne3t6Eh4dz77332rosUU9IuAkhalx2\ndjYjR45k69atBAUFERkZSUBAgK3LEvWIjP2FEDXq/PnzhIaGsnXrVgYMGMD+/fsl2ESVk3ATQtSY\nX3/9le7du3Py5EmmTp3Kpk2bcHNzs3VZoh6ScBNC1Iivv/6afv36kZ2dzdKlS5k/fz4ajcbWZYl6\nSsJNCFGtTCYT06ZN47nnnsPV1ZVt27Yxfvx4W5cl6jmZUCKEqDa5ubmMHj2azZs3ExgYSGRkJG3b\ntrV1WaIBkHATQlSLS5cuMWjQIGJiYnjooYf44YcfcHd3t3VZooGQ05JCiCq3f/9+QkJCiImJYdKk\nSfz0008SbKJGSbgJIapUWFgYffv2JSMjg0WLFrFw4UK0WjlJJGqWhJsQokqYzWZmzJjB2LFjcXJy\nYsuWLUycONHWZYkGSv6cEkLctvz8fMaMGUN4eDht27Zl8+bNdOjQwdZliQZMwk0IcVvi4uIYPHgw\nx44do0+fPqxbtw5PT09blyUaOAk3IUSlHTp0iMcee4wrV67w/PPPs2jRInQ6na3LEjY23vBApfZL\nrsIa5JqbEKJS1qxZQ+/evUlJSeGTTz5hyZIlEmyi1pBwE0JUiKIozJw5kyeffBKdTkdkZCT/+c9/\nUKlUti5NiBJyWlIIccsKCgoYN24cP/74I61atSIyMpJOnTrZuiwhypBwqyBDsYlvfrvEXwnZOOg0\nPHxnUx4I9LF1WUJUu8TERIYMGcLhw4fp1asXGzZswNvb29ZlCWHRLZ2WPHPmDP369WPlypUAJCUl\nMWbMGEaPHs2UKVMoKiqq1iJri1xDMWOXH+Sjn08RGZ3E2qh4XgyLYt6WU7YuTYhqdeTIEUJCQjh8\n+DDPPPMM27dvl2ATtdpNw02v1/P+++8TGhpa0vbZZ58xevRoVq9eTcuWLVm3bl21FllbfL7zHIcu\nZZZqKzIphB24xLmUXNsUJUQ1W79+Pb169SIxMZG5c+eyYsUK7O3tbV2WaIAiIiIYPHgwQ4cOZffu\n3eX2vWm42dnZsXTpUpo0aVLSdvDgQR544OpUzz59+nDgwIHbq7iOOB6XZbE9t9BE5PGkGq5GiOql\nKArLly9n+PDhqNVqwsPDef3112XiiLCJzMxMFi1axOrVq1m8eDE7duwot/9Nr7lptdoy68IVFBRg\nZ2cHgJeXF6mpqbdRct2hVlv/R13OJiHqHIPBwPjx41m1ahV+fn5ERkbSpUsXW5clGrADBw4QGhqK\ni4sLLi4uvP/+++X2v+0JJYqi3FK/qKio230pm4qKiqKZzmBxm4udina6zFr9HmtzbbeiLtdf12pP\nT09n2rRpREdHExQUxMcff4zRaKxz7+NvdbXuv9X1+qtKfHw8BoOBCRMmkJOTw+TJk0tdLrtRpcLN\nyckJg8GAg4MDycnJpU5ZWhMcHFyZl6oVoqKiCA4OplNnEynf/cHes2kl25x0Gibc34ZHe7ezYYXl\n+7v+uqou11/Xao+Ojub5558nNjaW0aNH89JLL9GzZ09bl1Vpde3zv1F11l8XQzMrK4vPP/+cxMRE\nxo4dy65du6yeJq/UTdw9e/Zk69atAPzyyy/cd999la+2DnHQafh63D188HgQT3RrwdgeLfnuuRAm\n9a29wSbErYqIiKBnz57ExsYye/ZsVq5cKRNHRK3h5eXFXXfdhVarxd/fH2dnZzIyMqz2v+nILSYm\nhrlz55KQkIBWq2Xr1q18/PHHTJ8+nR9++AFfX1+GDBlSpW+iNtNp1Izu3pLR3VvauhQhqoSiKHz8\n8ce88cYbODg4sHbtWoYPH27rsoQopVevXkyfPp3nn3+e7Oxs9Ho9Hh4eVvvfNNyCgoIICwsr075i\nxYrbq1QIYXNFRUVMmDCBFStW4OvrS0RERJ0+jSfqLx8fH/r3788TTzwBwNtvv41abf3ko6xQIkQD\nlZaWxtChQ9m7dy/dunVj06ZN+Pr62rosIawaNWoUo0aNuqW+snCyEA3QiRMnCAkJYe/evYwYMYI9\ne/ZIsIl6RcJNiAZmy5YthIaGcvHiRd555x3WrFmDk5OTrcsSokrJaUkhGghFUVi4cCGvvPIKOp2O\n1atX8+STT9q6LCGqhYSbEA1AcXExkydPZsmSJfj4+LBp0ya6d+9u67KEqDYSbkLUcxkZGYwYMYKd\nO3fSpUsXIiMj8fPzs3VZQlQrueZWSdkFxRiKTbYuQ4hynTlzhh49erBz506GDBnCvn37JNhEgyAj\ntwra+tcVvt53kVNXcnHUqbmnlSdvD7gDHzdHW5cmRCk7duxg+PDhZGVl8eabbzJ79uxy7wsSoj6R\ncKuAgxfSeXNDNBn5xQBkF0Dk8SSuZBv44YXQcp8aIERNWrx4MZMmTUKj0fDtt98yduxYW5ckRI2S\nP+MqYPWh2JJg+6c/LmWyOTrRBhUJUZrRaOTll1/mxRdfxNPTk507d0qwiQZJRm4VkJBZYLFdAU4n\n59VsMTeRU1DEF7svEB2fhT4vlwdzzvHCv1qj08jfM/VVdnY2I0eOZOvWrQQFBREZGUlAQICtyxLC\nJiTcKsDb1c7qthYeDjVYSfnyC408u+IPomIzS9qObT3NsdgslowJltOn9dD58+cZNGgQJ0+eZMCA\nAaxevRo3NzdblyWEzcif8RUw5K4WOOs0Zdo7NnNl2N21Zwbasr0XSgXb37afTObnmCQbVCSq0549\newgJCeHkyZO8+uqrbNq0SYJNNHgSbhXQv1NTXn8kkHZNXACw16rp2caL+U90xU5bez7Kv5JyLLYr\nwO8XrD//SNQ9y5cv58EHHyQnJ4dly5bx8ccfo9GU/QNMiIZGTktW0DM9Axjd3Z/o+GzcHbW0aeJq\n65LKsC/ny81eV3tCWFSeyWTijTfeYP78+Xh6erJhwwZ69+5t67KEqDUk3CpBp1ET3NL6Q/Js7YE7\nmvC/PxMxKaXbXRy0DL2rhW2KElUmNzeX0aNHs3nzZgIDA9m8eTNt2rSxdVlC1CoSbvXQY119ORKb\nydo/4im4topKI0cdL/ZuTUdfuRZTl126dIlBgwYRExPDQw89xA8//IC7u7utyxKilB8uzq3Ufvfz\nbpXVIOFWD6lUKt57LIjhwS3YGnOFlJQrTB5wD/5ezrYuTdyG/fv38/jjj5OamsrkyZP5v//7P7Ra\n+ScshCXyL6Me69zCnc4t3ImKypdgq+PCwsIYP348JpOJL774ghdffNHWJQlRq8nsAiFqMbPZzIwZ\nMxg7dixOTk5s2bJFgk2IWyAjNyFqqfz8fMaMGUN4eDjt2rUjMjKSDh062LosIeoECTchaqG4uDgG\nDx7MsWPH6NOnD+vWrcPT09PWZQlRZ8hpSSFqmUOHDhESEsKxY8d44YUX2Lp1qwSbEBUk4SZELbJm\nzRp69+5NSkoKCxYsYPHixeh0OluXJUSdI+EmRC2gKAqzZs3iySefRKfTsXnzZqZMmYJKJYtcC1EZ\ncs1NCBsrKChg3Lhx/Pjjj7Rq1YrIyEg6depk67KEqFUOHjzIlClTaNeuHQDt27fnv//9r9X+Em42\noigKv6TlsDU9G7OicJ+HK4/7eKCWv9SrjDEzk4zvwihOTETr6YnHU6Oxa1G7lh9LTExkyJAhHD58\nmF69erFhwwa8vb1tXZYQtVJISAifffbZLfWVcLMBRVGYfiaeVYnpGK+1rbmSyc9p2SzpFIBGAu62\nFZw4QeKrr1F08WJJW85PP9H0vXdxvf9+2xX2D0eOHGHw4MEkJCQwbtw4Fi9ejL29va3LEqJekGtu\nNrA7I5fvk64H2982p2azMjHdJjXVN2kLPy8VbADGlBTSvvgSRVGs7FVzNmzYQK9evUhMTGTevHl8\n/fXXEmxC3MS5c+eYMGECTz75JPv37y+3r4SbDfySlkORle/X/Vm5NVtMPWTW69EfP25xmyEmBsOJ\nEzVc0XWKovDBBx8wbNgw1Go1GzduZNq0aTJxRIibCAgIYNKkSXz55ZfMnTuXt956i6KiIqv95bSk\nDZQ3bvhf9BXarz6Fv6cTS8cG08rbpcbqqjduNjKr5pGboigc3RbHxWMpZKblkbDvKHf09MXvzkaM\nHz+eVatW4efnR2RkJF26dKnWWoSoL3x8fHj00UcB8Pf3p3HjxiQnJ+Pn52exf6VGbvn5+UyaNIkx\nY8YwatQo9u7dW/mKG6B+jV2t/1WRbqDIZOZcah4DF+4jz3DjyUtxM2pnZ5zuvNPiNoeOHXHo2LFa\nX/9A+HkOhJ/jyoUcCnPMxJ3MZNNXvxF6Ty9WrVpFjx49OHTokASbEBUQERHB8uXLAUhNTSU9PR0f\nHx+r/SsVbuHh4bRq1YqwsDA+/fRT5syZU7lqG6gHPN14oplnmQ9fnVyAJkFf8nN+kYk3N0TXbHH1\nROOXJqJr2bJUm8bbG69//xuVuvrOxhcWGDl7OLnU8Dwh/TwfrJnAsZgonnrqKXbt2kXTpk2rrQYh\n6qO+ffty+PBhRo8ezcSJE5k1axZ2dnZW+1fqtKSHhwenT58GICcnBw+P2vtU6tpIpVIxv4Mf//Jw\nZWdGDpHHEylONaBJ0HPjlZeTV3JsUmNd59i5My3DviNz5UqKEhLRennhMWok9q1bV+vrJp3LIi+z\nsOTnPy/9xjc7P6CwuIAhvcazYvmX6OzlaoAQFeXi4sLixYtvuX+l/pUNGDCADRs28OCDD5KTk8OS\nJUsqc5gGTaVSMcTHgyE+HhyLPE9sRoHFfq4OsvRSZemaNKHJ1Kk1+ppuXg5odWqKi0zsiF7Lpt+/\nQqu147kHZ3J/j/5odZoarUeIhqpS4bZp0yZ8fX1Zvnw5p06dYsaMGWzYsKHcfaKioipVYG1RnfX3\naqZmdUbZdhUwvPXtv7Y628TZL35Dm2UGjYoibzV5QTrQ1J0ZenXp98fey8g3a+bz++ktNHLy4t8P\nz8bfuz0OjY0cOXrE1uVVWF367C2R+humSoXbkSNH6NWrFwCBgYGkpKRgMpnQaKz/VRocHFy5CmuB\nqKioaq0/OBiSvznErtOpmK9dq9GqVTwV4sdTD1ueGHGrjBkFxH0RhS7v74tACrpMM5640vjZTnVi\nCnp1f/5VKS0tjZe3TuH30/vx9+7AC/3fw9vLh5advHhg3B11buRWlz57S6T+8o9dn1Uq3Fq2bMnx\n48fp378/CQkJODs7lxts4uaWjwshKauAuVtO4ajTMGPAHVVySjJ3b8I/gu26wrOZFPyVjlNQ49t+\nDXHViRMnGDhwIBcvXmTEiBHMfvP/OBsdS48H7sSrhautyxOiQalUuI0cOZIZM2bw9NNPYzQamTVr\nVhWX1TA1c3dkwai7qvSYxal6yxsUKLqc06DDTVEUjGYjWrX2tkewW7ZsYeTIkeTk5DBz5kzeeecd\n1Go1ueZkCTYhbKBS4ebs7Mynn35a1bWIaqAuZ2aeyqFhztpTFIXvTnzHzxd/5kr+FbydvOnn348X\nOr9Q4ZBTFIWFCxfyyiuvoNPp+P777xk1alQ1VS6EuFUN89utAXHs5EXBiXRUN5yZVDeyw6VHw7zX\nannMcj4/+jkmxQRAuiGd0xmnKTAW8J/g/9zycYqLi5k8eTJLlizBx8eHTZs20b179+oqWwhRAbK2\nZD3nfLcP+R20qJ2vX7/TNnbAfWBrNM7Wb4Csr4xmIz9d+Kkk2P6moLD10lYKjJZvybhRRkYGDz/8\nMEuWLKFLly4cPnxYgk2IWkRGbg1A/p12tH08iILoNFQOGpy7NkGla5h/12QYMojLjbO4LT4vntic\nWDp4dij3GGfOnGHgwIGcPXuWIUOGEBYWhouLrAEqRG3SML/hGiBtI3tc72uOyz1NG2ywAbjZueHp\n4Glxm4e9Bz5O1teqA9ixYwfdu3fn7NmzTJ8+nfXr10uwCVELNdxvOdEgOWgd6NW8l8VtPX174u7g\nbnXfxYsX079/f/R6Pd9++y0ffvgh6mpcp1IIUXlyWlI0ONNDpmMwGvg1/leyi7Jx1bnS07cn74S+\nY7G/0Whk6tSpLFy4EG9vb8LDw7n33ntruGohREVIuIkGx05jxwf3fUBiXiIn0k/Q3rM9/q7+Fvtm\nZWUxcuRIfvnlF4KCgoiMjCQgIKBmCxaijnHwqNk1XS2RcBN1jqIoZHz7Lbm/bMOYkYGuRXM8hg7D\n7dFHKnQcXxdffF18rW4/f/48AwcO5NSpUwwYMIDVq1fj5uZ2u+ULIWqAhJuoc1IXLCB92XIwXZ3O\nX3zpEgVHjmIuNOD++ONV8hp79uxh6NChZGRkMHXqVObNmydLzAlRh8jV8EowGs0cvJDOueTc2z5W\nco6BhKwCFKXs+o+iLFNePtkRkSXB9jdFryfrx7VlPsdifTEZpzMwZBdyI4PRQGxOLPri0kuULV++\nvORxTkuQTZOWAAAgAElEQVSXLmX+/PkSbELUMTJyq6A3N0QTfjQBQ7EZgMYudiwY2ZVe7bwrdJxj\nsVl8/MtpjlzOxKiY6dzcnZf6tKFPYPlT0Ru6gqNHMCYlWdxWeOkSSkEBKicnzEYzJxcdQ5eUj4Oi\nkKFSYfCwJ/Dlu1HZq/jkyCfsuLyDxLxEfJx86O3Xm1eDX+XtN99m/vz5eHp6sn79eu6///6afYNC\niCohI7cK+HzHGb4/FFcSbABpeUW88F0UhiLjLR8nW1/EKz8eY9+5NPTFJoqMCn9czuSN9X9ytgpG\ng/WZrnlzVA4OFrdp3NxQ2dsDcGpJNG6JeTgBapUKB8A9s5DTC47w6dFP+favb4nPi8eMmSR9EquO\nraLL/V2YP38+gYGBHDx4UIJNiDpMwq0CVh20vLKFvtjEzMgTt3ycb367xMW0/DLtKbmFhP1+udL1\nNQT2rVvjdM89Frc5h4ai0mgwGc2o43MtLoLskGXg9zP7S7UVpRZxYc4Fzvx2hgf6PcCBAwdo27Zt\ntdQvhKgZEm4VkGMotrrtXEreLR8nKdtgdVtyjvVt4qpms2bi1L07aK+eVVc5OeH60EP4TH8DgMKs\nQuzMlq9h2qtUOGRdv36Wfzaf8++dpzC+EM8HPPl01ae4u1u/kVsIUTfINbcKcHPUkV9ksritbZNb\nX4Kpmbvl02oATd2sbxNX6Zo3x/+bFegPHKDw/HmcgoNx6NixZLu9uz1FahV2FvKtUFEwuJugCDL3\nZ5K4IhHFrNBsTDM6DupIS/eWNfhOhBDVRUZuFfB0dz+L7U46De8O6mhxmyXjQgNo1di5TLuPmz1j\nQuXL9VaoVCqce/bEc8yYUsEGoNGqMbdwtTgD1eDuQEjbUK6su0LC0gRUOhUBUwPwesCL3i1642In\n60QKUR9IuFXAS33b82SIH47/WHi4sYsdy57phoPdrQ+CGznZ8cnIrvRq2xgnOw32WjX3BHjw0dA7\nadtEntpcFQJf7Exuc1f0gFlRMABZHvY0H9+efR/sI21zGk7NnGg3sx3turdjVIdRTO8+3dZlCyGq\niJyWrKAPh3bm/cFBHInLxMvFnjbelftLv6ufOyvHdycl14DRpNCskUOFnwJdl0VHRxMdHU1ubi6N\nGjWiS5cudOrUqcqOr1ar6fjyXRTri8lLyMexiSOpOSn0eagPx44do0+fPqxcsxKTowkvBy+cdE5V\n9tpCCNuTcKsErVZNSCuvKjlWE9eGd43twIED7NixA6Px6u0TycnJXLx4EYPBQHBwcJW+ls5Jh0c7\ndw4dOsRjjz3GlStXeOGFF/j888/R6XQ3P4AQolYxGAwMHDiQiRMnMnToUKv95LSkqFEmk4kjR46U\nBNvfiouL+eOPPzCbzVb2rLw1a9bQu3dvUlJSWLBgAYsXL5ZgE6KO+vLLL2nUqNFN+0m4iRqVnp5O\namqqxW2pqank5d36LRU3YzabmTlzJk8++SQ6nY7NmzczZcqUBnX6V4j65Pz585w7d+6WFliQcBM1\nysnJCTs7O4vb7O3tsb+2wsjt0uv1PPnkk7z33nu0atWKAwcO8MgjFXtqgBCidpk7dy7Tp9/axC8J\nN1GjXFxcaNWqlcVtAQEBVRJuiYmJ9O7dmx9//JH77ruPQ4cOVelkFSFEzdu4cSNdu3bFz8/yLVk3\nkgklosY9+uijGAwGYmNjURQFtVpNy5YtefTRR2/72EeOHGHw4MEkJCQwbtw4Fi9eXGWjQSGE7eze\nvZu4uDh2797NlStXsLOzo2nTpvTs2dNifwm3ekwxGtEfPYbq4gWUu++uNdeaGjVqxLhx4zhz5gyp\nqak0bdqUNm3aYMrJIW/ffuxatsTOr0VJ/+JCM7En0mnk7Ugjb+tT9tevX8+YMWMwGAzMmzeP1157\nrda8ZyHE7VmwYEHJfy9cuJDmzZtbDTaQcKu3sjZuJH3FCopOn8FBrebS+g00+c8UnENDbV0acHWF\nkQ4dOtChQwcUs5mUDz8iZ8sWjCkpqJ2dcQrtQdNZ73JwVwYnfs8jKv84OnsNzTu402fMHTi5Xr9u\npygKH3zwAW+//TbOzs5s3LiRwYMH2/DdCSFsTcKtHtIfPUryR3MxZ2UBoDKbMRw/TuLb/6XV2rVo\nPT1sXGFpaYu+IOO770p+Nufnk7d9B3uM7TlNUEl7caGJS9Hp7Pz2JAMndQGu3vMyfvx4Vq1ahb+/\nP5GRkXTu3LnG34MQouZMnjz5pn1kQkk9lLV+Q0mw/ZMxIYGMVatsUFH5cnfssNiekGd5df6EM5mk\nxeeSnJxMnz59WLVqFaGhoRw6dEiCTQgBSLjVS6aMjHK2pddgJTenmM2Y0svWpABF2rKLSwMYi8zs\n332IkJAQfv/9d5566il27tyJj488xVwIcZWEWz2k821mdZudv38NVmKdoiic++MghyLXk+7rw43r\n96sAJ2O2xX1PJh3kqQmPERsby+zZswkLC8PBytO5hRANk1xzq4c8xo4lb9duihMSSrXb3xGIx6hR\nNqrqupy0VP73+ccknj6JYjajQoVn2+Z0vZiEven68lutvPVEG1WYiq9Gn6Io7Dj+I5sOLcXBwYF1\n69YxbNgwW70NIUQtVulwi4iIYNmyZWi1Wl5++eVbWg6lLlEUhQ1HE9h5MpkraRl0Tz3FC/e1xt3Z\n8uoaNSkn508SEr7HUHgFe3sfmjcfRSO3LiXb7f39aTZvLulffYXhzxiKFYVG99yD96tTUTs6VkkN\nxsxMMr5egeHMGdSOjrj26YPb4EG3NPV+54rFFFzIINjzQRw1LuiNuZzXHeN0R2e6xqWg9fDA5V/3\nEfjav3H7LYU/tp2lMM/E6t2f8Ovxn2jevDkRERHcfffdVfJehBD1T6XCLTMzk0WLFrF+/Xr0ej0L\nFy6sd+H2buQJwg5cwnTtfFlU0nl+PZvKN8+G0NjFdjcFp6Rs4/TptykqTitpS0vbTmCH92nS5OGS\nNufgYJyXLMFcUMDR48fp1KNHldVQnJJC3IQXKTxxoqQtd/t2Ck6coOmb5S+Nk5+Viel8Afc1GYbD\nP66p+Tq15c+Cvfh/sRwHTw9UGg0AQb2bc6X4JO/Oepd9x/fRrVs3Nm3ahK+vb5W9HyFE/VOpa24H\nDhwgNDQUFxcXmjRpwvvvv1/VddnUyaQc1v4RVxJsf4tJyGHRrnO2KYqro8nYuKWlgg2guDiDy7FL\nLT55Wu3oCFW8An7akq9KBRsARiPZ69dTeOFCufsW5OTQ1qFLqWADcNK60truTowaSoIN4MSJE4wb\nN459+/fxxBNPsGfPHgk2IcRNVSrc4uPjMRgMTJgwgdGjR3PgwIGqrsumtsRcIb/IZHFbTEI2CQVF\nLIlL4YekdIqq4REt1hQWXiE39y+L23JyYjAY4mukDsONwXaNOS+PnC1byt3XReeBh31Ti9s87Jvi\nqLn+8Neff/6Z0NBQEhISmDlzJt9//z1OTvJQUSHEzVX6mltWVhaff/45iYmJjB07ll27dpV7vSUq\nKqqyL1XjUpItP3ZFAc64K/T5/S9yuPpePz4Ty3P2Zu6pgceDmc05mM3WPmMNMTGnUKtTLG6tys/f\nvqAAjZVtiSkpxJbzWmq9GU9V2REmgKJWEX0iBrPu6jPYPvnkE7RaLbNnz+bhhx/m6NGjVVB9zatL\nv/uWSP22Vdfrt5VKhZuXlxd33XUXWq0Wf39/nJ2dycjIwMvL+tOpq/oJy9XJv52BbZf2kpZXVKrd\n1NyJlCbOpaatx5lVrMCRMV064Ky19pVfdY4dCyE9Y0+Zdg+Pe7j7rgct7hMVFVWln39K376knzpV\npl3TpAmdpkxB61H+Cij7DqwjIKPsPWnxXun06NaLSZMm8dVXX9G0aVM2btyIVqutU78//1TVn31N\nk/ptqzrrr87Q7Lv7pUrtp39+ZZXVUKnTkr169eL333/HbDaTmZmJXq/H4yZfaHWJt5sDLz/QDnen\n68MxtQo827ihWBg4XS4oIiyxZm6ObtPmdZyd25dqc3JqS9u202rk9QEaT/g3zvffD+rrvz4ad3e8\nX5p402BLL0jnS68fuGyXWKr9gn08n9mv5MH+D/LVV1/RtWtXDh06RPfu3avjLQgh6rlKjdx8fHzo\n378/TzzxBABvv/02anX9uh98bGgA/2rnzQ+H47ickMigHnfwZWEeKTn5FvtnGY01UperayD3dNtA\nfMJqDAXxODg0o0WLp9FoKn8tymg28lX0V/ye9DsFxgLau7fn2aBnaevR1mJ/tZ0dfl8sIveXX9BH\nHUHt6Ij78GFlbhDPvXyJU2++ARcvowKU1q1wfnsS0dpT/KfV/2NAxn14Gz24oksj3LCdc3MuUHil\nkCFDhhAWFoaLi4vF1xdCiJup9DW3UaNGMaoW3BBcnQIaO/PGI4FEReUTHNSM7afiOGQh3OxU0L1R\nzX0RazSOtPR/rsqO9+beN9ly6fpEkFMZpziaepTP+35Oa/fWFvdRqdW4Pfwwbg8/bHF7YVYmp0aN\nwiXzH6uMRB0j77nX6PByS04XXmZ94+0A5P2VR+yiWMx6M9OnT2fOnDn17o8lIUTNkm+QCnjBrzEB\nDmVv4u7j6cb9nq42qOj2/ZH8B7vidpVpj8uN47u/vrOwx605Oeud0sF2jUtGFmN3OWKnvvo5ZuzM\n4NL8SyhFChPnTuTDDz+UYBNC3Db5FqmADs6OLAsKYFgTdzo429PV1ZGX/Lz5Kiigzj4U82DSQQpN\nhRa3ncuu/D19Reet3+/WNNnA9G7TMYebSfwuEQdXB+aumsui1xdV+vWEEOKfZG3JCgpydWJRpwBb\nl1FlXO2sjzidrazKfytU5SzzlafWsOw/yzjxywmCgoKIjIwkICCg0q8lhBA3knArR1aRkVVJ6Zwz\nANn5BDe6+mV/+MyvnLn8CxqNMw8EP4d3oyaVOn5SXhIR5yMwKSYebvUwrRtZvr51I0UxkZwcSb7+\nIk6OAfj4DEKtrtz/yuHthvP9ye+Jzyt9A7gKFfe1uK/cfQ9l57E7PRcXjZqnmzfG7R+3QjQe8QS5\nMbPQmUvf03bBaOQ/h6M4Fx/PgAEDWL16NW5ubpWqXQghrJFws2JDcgZzzieRUFgMaNh47BwDvdwI\njp1DE+0+mmqLAfj1t/XYeUxkUI//r0LH/+avb/j6z6/JLMwEIOxEGMPbD+fVbq+Wu19BQTwxf/2H\nnJzrNzTHJ4TRseMnODu1rNibBJx0Trx+z+vM/2M+l3MvA+Cic+GRVo/w1B1PWdzHpCi8fDKWn1Kz\nMFwLr+UJabzTxpfHfK7eCtBqxBMc/W0/5u07sS++OpN0f1EhryUlkW0w8OqrrzJ37lw0muq/N1AI\n0fBIuFmQVWRk9vlEEguvT+8vMCvkpqykuf0u1P+4vOZun0lW5iJSswfe8gjuZPpJlhxfQl7x9ZVQ\n8orzWHliJV28u9CvZT+r+545O7tUsAHk5Bzn3NnZdOmy9BbfYWl9/PsQ6htKxPkIcotyud/vftq4\nt7Ha/4vYFNYnZ5ZqSygs5v3ziTzg5YbLtRHcXZ98Ss6FC1z4YiHhMX/x4c7dKIrCsmXLeO65qpvt\nKYQQN5IJJRasSkovFWx/68yxUsH2N3f7LHZE3XqwRJyPKBVsfzMqRnbE7rC6X3FxFllZhy1uy8w6\nTFFRmsVtt8JB68ATHZ7guTufKzfYAPZk5Fpsjy8sZtUNN7M7t2zJSjS8t3Ubrq6ubN++XYJNCFHt\nZORmQb7J8mLIdlieVQhgMulv+fjWZicCGIyGcl/D2uuYTHqMxnzs7Brfch2VZShnsei8f3x2ubm5\njB49ms2bNxMYGMjmzZtp06b84BRCiKogIzcL+nq54WhhiBaH5WtaRUYdbfysn0q8URfvLla3BXoG\nWt1mb98UF5cOFre5uATi6Oh3yzXcjjucHSy2O6lVPOh1dfblpUuX6NmzJ5s3b+ahhx7iwIEDEmxC\niBoj4WZBt0bODGriXqY92m44KYayj2tJLu5Bj8A+t3z8ga0Hcq/vvWXaOzfuzJiOY6zup1KpadHi\nGdRq5xvanfBrMQaVqnL/O81mM8kLwzg/9DnOD3ia2EnvUJiYarX/RP8mtHIo+xiEx5q409nNmf37\n9xMSEkJMTAyTJ0/mp59+wt297OcphBDVRU5LWrEg0J87nB3Yk5FLSnYO9zT15nFHHWePlX7Om8kM\nRcW3fkoSQKPW8GnfT1kavZQjKUcwm810atyJ5zs/j5Ou/DUitVpXVKrSMwzVag1abeVXSIn79wz0\neyPg2vMOis5Hcfn4H/ivWo6Df7My/Z3UGuxuWEVEBbhpNYSFhTF+/HhMJhNffPEFL774YqXrEkKI\nypJws0KtUvGivw8v+vtcfexEBz+WbhpNa9fSIxqNGnwdY/j9r4306DTE6vHyivTMi/mFo/kKapVC\niKuW1+58AXvt1WWozEUmcvfEkxofj0qtwr5NI1xCm6PSXD89qigKsbFfYTLllDq2yZTL5dhleHv3\nt7hSiqrITNbWSxQn5KHSqnFo74FzSFNUahV5v0ejP7AVKH0/min1IsnvLaDlsrlljvdpbDKn9aWv\nG5rNZha+O4vMVctxd3dn7dq19Ot366dqhRCiKkm4VYCz+YrFdkddITEXrIdbgbGA4b//wjFTQEnb\nwQz44/efWNtzEBqTirQVMRRdvB5ahpMZFF3OwXP0HSWBVVh4haycGCwt9JWd8ycGQ3yZ624mfTHu\newvJy4i7fuwT6RTF5eA5ogNZP0aClUksRRdOW2yPzi09UlUKCsj+8G0K9+2kcUBr9m35Hx06WL42\nKIQQlVFQUMD06dNJT0+nsLCQiRMn0qeP9ctBcs2tApoZLU+kAPDUW19u6tO/tpcKtr8dKGrJd2d3\nkbsvoVSw/a0gJp2Cv65PrVepdBQqlm96LkaDSlX2OljunnjsMso++Vp/PJXCC1mgK+cR4lZWPdH9\nY3RoSrlCxpRnKdy3E13Xe3ht408SbEKIKrdr1y6CgoJYuXIlCxYs4KOPPiq3v4RbBbhm3mGxXV3o\nSpe0x6zudzSv2PIGlZr9GTkUxZe95w0ABQrPXb9ZOl1x4wyWg+M0gSQrZR8UWpxo5dhGhYJTGTSe\n8DQ4NLLYxeHOrhbbe7hffbxP8ckYMiaOwXjuNI4DhxG4YAnP3SEzIoUQVe/RRx/l+eefByApKQkf\nH59y+0u4VYBP0mM4J98N5usjF3WRE14XBuNq52t1P5267Mjpb3ZqSl1Xu5FKo/5HXzWb1M8QS+mH\ngsbhx0b1WBwsPCrmZsd2aOWL+4hnwO6fMzBV2LUJpvkHr1nc7z8BPrQ7tIeMV8ZjzsrA9aVp+E97\nh1fb+tHYrpyRoBBC3KZRo0bx2muvMWPGjHL7yTW3CrBv7k7z45PJbRJFgccpVGY7GsXfh31BMxq9\n3Mrqfg95ubMz3ohZVfrj1lHI4838sdd6UhBtYXURnRrHrt4lPza209LcoyOz0j/kAbbSmBTSacx2\nHqanexN87MsGi31bdwynMsu0q5w0OAVf/cun2Vsv4vZIH9KXrcJcWIhzSDe8nhuGWlv2FKiiKHz4\n3nvse/ddHF1cGPz5Uu7s+wCjm3nSysn6aVshhKgKa9as4eTJk0ybNo2IiAirjxuTcKuAxmM7cuXj\nKNxSuuGW0q2k3aFzY+x9rU/Ff7ptH37LDOcnfQuKsb+6D3pGuF3hIf+hKH4KRZey0R9NAeO1UZ69\nBtf7mmPvV3rF/P+28WViYTH/y79+GjTQ2YH/tik7ZR/ApWdzrkTH4hhvgmuLh6gcNbj18UfX+Pp1\nQue7A3H+4v1y339BQQHjxo3jxx9/pFWrVkRGRtKpU6dy9xFCiKoQExODl5cXzZo144477sBkMpGR\nkYGXl5fF/hJuFaC209J0+j3kbo+l4FQGaq0at4db4tC67LWuUvup1SzuPoyd8VFEJF1Ao4InWrSj\ne9OeAKhUKjyHtcf5riYUnExHpb46YrNr5lLmWIEujvwU3J6ViWnEGYpo7mDHWN/GOGosn2FWqVXk\nhNjRol9rCs9modKocAr2Qedd/v10N0pMTGTIkCEcPnyY++67jw0bNtC4cfUv9SWEEAB//PEHCQkJ\nvPXWW6SlpaHX6/HwsP7dK+FWQWq1mkYPBdDooYAK79u3RTB9WwRb3W7f2h371jdfycNRo+Z5vwo8\nQ06lwrG9J47tPW99n384cuQIgwcPJiEhgWeffZYvv/wSe3v7Sh1LCCEqY9SoUbz11luMHj0ag8HA\nO++8g9rCPIO/SbiJcq1fv54xY8ZgMBiYN28er732mtVz3EIIUV0cHByYP3/+LfeX2ZKVUGQ2cygr\njzP51lfwt8SsmIlJi+Fk+kkURUFRFHJzT5CdfRxFsb7SflVQjEb0x45RePYs6QXFfB0dx++JWdb7\nKwpz5sxh+PDhqNVqNm7cyLRp0yTYhBB1gozcKmh5fCrfJqRxRl+IvUrFPY2cebetL51cy7+G9cvF\nX1j+13JOpp9EjZp+3s151N2IYrgEmHBx6UjLls/T1GdQldes2bmLC7PepejsWaYNepkTTv6YCwEN\nuDdxZvnIrgQ3vX461GAwMH78eFatWoW/vz+RkZF07ty5yusSQojqIiO3Cvg5NYs55xM5c21dxUJF\nYV9WHlNOxlFUzjPOzmSeYc6hOZxIP4GCgqO6mBDNKRTDOcAIKOTl/cWZM++RkxNTpTXn7duH3fff\nU3T2LB/0G8efmmvBBmCCrKR8nll1dfFmgOTkZPr27cuqVasIDQ3l0KFDEmxCiDpHwq0C1iVnojeX\nvSE7Jr+AH6+UvZfsb2tPryXDkFHy830uRrws3OtcXJxBYuKaKqn1b9kbN6HSX10LMsqrg8V1KXNT\nC1h0JI7o6GhCQkI4cOAATz31FDt37rzpKgBCCFEbSbhVQGqR0eq2OIP1p2v/M9gAXDXWVywpLEq3\nuq0yjGnXbw4vVCyfhVYBmzZuomfPnsTGxjJ79mzCwsJwcJCbsoUQdZNcc6uAFg46DmWXbVdh/enU\nAM2cm6FCoaujkfYOZprprJ/CdHSwvoxXZeh8fTGr1OQF9uFNoz0FqNiJkaNcfS6doijkHN7Azt3f\n4ODgwLp16xg2bFiV1iCEaFieeLNy0fJNFdYg4VYBw7xd2JocTz6lb64O0GQwuEkXq/s9GTgKh7SV\ndLArQH3tvKCiwI0TDx0cmtOixTNVWrPLoMGkZLWmuVt7ml/L1Eew4weK+MqYR/rWReTHbKd58+ZE\nRERw9913V+nrCyGELchpyQpIiF3EC8rn3KH8ibOSi4eSRqiyl5eM73A+46z1HXMPcId9bkmwwfVg\ns9e3wSW7G57uvel4x8c4OflbPsYNrhQWsS0tmyRDkdU++fl5/LzpLxq7tS/V7oCKPno9OT/+l/yY\n7XS9O5hDhw5JsAkh6g0ZuVWAkn+MbkTTjcPocUJLMXZcfZzNwcvraOdleZXqzIzfrB7TIc2fpqee\nQXvZCTtaQPkreWEwmZl2Oo4d6TlkGE14aDX08XJlfgf/UktwvTh/GdvSGvMhAWWOcTr1Iv/f+ulk\nZScxYsQIvvnmG5ycKrYclxBC1GYSbpXkROmnUaNYnyRiKrA+uoKr+xmv6MnafB6tt2OZxZL/6e2z\nCaxNvj4zM9NoYkNyFnYqNQvuuDrq+/L7tfyc6gOoy8yO3HX+d16KeJfconxe6DGAL9esKXcJGyGE\nqItuK9wMBgMDBw5k4sSJDB06tKpqqhUUReG7xHR2pueQkq+i+9kEvB2CIS+6TN98nAgOsD4JwzGl\nAzhuKbvBrMY5/c7rr6k3EbHlLJu6u9OzkQsv+DVB+49zmfkmEzszcngkO4ZBpm04aTLQmzz5n+YB\ndtndTa7RhKtWw3cnDcDVkVgMJnqgQ1EUvo5ax3s7F6FTa/l04AyGjOstwSaEqJduK9y+/PJLGjWy\n/BTnuu6NM/GEJaZfG1epORqfShddL/xZgxMFJf0UIJ9G3OEVaPVYbmn342K3jzyfKP65o1tST1xS\nS1/nKsgtZHt6LtvTc4nK0bM0KAD1tQt06UVGBiTvoI/jchS7q0/YbgSMLjqG75VnSS1qh6tWg950\n/Sa61RTRyaSwadvnrDoeibezJ18NeR//Jmr8hz10m5+SEELUTpUOt/Pnz3Pu3Dnuv//+KiyndojO\nzWfdlQxuPNF4Z9H6UsEGV28DcCOdXy+s51+tLY/ekrIK8U16iWzfveg9T6NSVDinBeGa3APVDScO\nEx2vj6R+Tsvmp9QsBjW5eiGuiU7D/eqfSoLtb4pdHr0Lf6KpbhIA7loD2aarz5crKMhl7MYPMcRG\n49ekDW8Me50OgS7c8fLoin4sQghRZ1T6nNTcuXOZPn16VdZSa2xJzbG4EkkAlyz2d6CIU4m/WD1e\nhlpBhRr3xN74xrxAs7+exy05tEywxTmq+N7/+qjLDOzPzC/52ZgRD06Wa8D5EqbUCwC81TcANSaK\n0+O5EjYVQ2w0ju16oHv6PZ5493EJNiFEvVepkdvGjRvp2rUrfn5+t7xPVFTUzTvVEukGAE2Z9uJy\nPq6iYrPV95iL9ZVN9GoTeo2ZE40cWN7GnmSn0q+blZZCVF4yAIohG7XZDrOm7PFUZh1nLsRCUi5e\nLq70zg/nu7BlmAv1NOoxjIA+jzElSCE2NpbY2Fir9dRWden350Z1uXaQ+m2trtdvK5UKt927dxMX\nF8fu3bu5cuUKdnZ2NG3alJ49e1rdJzjY+kM6axv/wmK2/HGa5BuW2/qLO+lM2Qkl2bgxoPN/aOXV\nyeLx9AUXKU6I58blJPVqeCsgnL8aFZHhPR5UpYPNWaPixTs70MXNuaTt0OaO5Or+KPMazkUdCX6o\nH3D1WmjYl4vQajR88sUi7rzzTu7rdd+tvPVaKSoqqk79/vxTXa4dpH5bq87663toVircFixYUPLf\nCxcupHnz5uUGW13jba9jWqtmfHQhkbTiq8tU6QCl8dOcS/8Tf+UEdtdGYzm4ku/6qNVgA7i3Z0u2\nnGwh26wAABshSURBVM+m7elcnK6tEpKrhfCmlzllvxO1AZzzO1Do0gvjtf8lbho1L/o1KRVsAO06\nv82J6FcwOF0sabPXt6T9nf/FaDTyyiuv8Pnnn+Pt7U14eDj33ntvvf8lFkKIG8l9blY87etFX09X\nViWlczExiWGBbejr6YbZvI7/nf6K2PTDqNR2/KvdeAKbdCv3WGq1mkef6Ur0iRTOHbsCahWtQ3wZ\n6emL8/nxmDHT168PxfZt+Tk1G60Khvt40s6l7HqVHv530qNpJBd/X46hIA57x+a0evB58goKGTBg\nAL/88gtBQUFERkYSEBBQTZ+OEELUbrcdbpMnT66KOmodxWTG+dcknjmfSX6WnkYJVyj+l5a8+PN0\n3hJAF30HFLUZDiVj/Lce7U1W+DAYUrBTL6Rxu2hATWZcTwoWh9DH3BWATFUmxfcupX/zXajQoJiD\nMbb6D1qtc5ljaewcafuvSSU/nzt3jkGDBnHq1CkGDBjA6tWrcXOzfiO4EELUdzJysyJjzSkK/rz6\n+BkdoD+SQs7Fs6iznNEo1xZONgPJ9iT8v720nNnf6rGMxjyio58nN+/qg0iLDI747JiCn05dMl/V\nE8jcdxfnukXg1uQyObnHyc09yV1dv0Gttv6/ac+ePQwdOpSMjAymTp3KvHnz0GjKToYRQoiGRJan\nsMBwPouCkxll2pV8M2oLz0RTFzhyZcteq8eLjf26JNgA9Pv+SxNd2QDy0KpxiHqt5OesrAMkXQm3\netzly5fTr18/cnJyWPr/t3fncVXV+R/HX3cDREF2FRdwG/0ZklkqistYpD/HMtRBGILGmazMUUez\nySULJ5eCtJ9rUuLyk9TUqyKKjkapoYFN+tMyx10MQUFZZJPlLr8/TMy4ly3xcvHzfDx6PLjnnO85\nn4PBm+853/M9q1axaNEiCTYhhEDCzaTSi3mgq/ycm1LXxOT2ChSUns43u7+ionP3fXYpdTW7rZPh\n/vtsBQWVR2fq9XqmTZvGuHHjcHR05IsvvmDcuHFm9ymEEI8auSxpgrKJmW+LQm++URUvrVb96r6Z\nDh1ga3Lbcu5/kalKdX/b/Px8QkNDSUhIoGvXruzatYtOnTqZP7gQQjyCpOdmQtPeLVG5VA4fnaYA\nY6VJucCInhbBfmb318LjeZTKe72+7PZ7KDUxA4rOaCSj+ZmKzxq1M609x1R8Tk1Nxd/fn4SEBIYM\nGUJycrIEmxBCmCDhZoLSVo3Tcx1Qu93rjinsVDR/3BeDcyHGX/SuDAodyl4G7FzNX2p0de1Pe+8J\naDRuALh3S+CkOosi/b2AKzEY+dFQgHv//wHA1taTjh3/gb19BwCOHDlC7969OXXqFBMnTiQhIQEn\nJ6cHet5CCNGQRUVFERwczOjRo9m/3/yUhyCXJc1q0s0Nu87OFB3PIu1CKp2GPI7G3R43upB76jT5\nh1JR2SloNWYAGodm1e7P23sCrVoFcT1zJwqFmlYDhpCVbuD7tT+i0BtpP6oTAY8puZ45E4VCg2er\nUajVdyY/jo2NZdy4cej1elasWMGECRPq+/SFEKJBSUlJ4fz582zevJnc3FxGjhzJkCHm32zyyISb\nwWBEZzBio655Z1WhUWHb041s/UX+y/3ec2zOPt2wadseta0ajd2vJ9Uyz9bWHQebkag0GjQaR1p7\ng+r1x9DpdLRpc6dX59Xu3sAQg8HA7Nmzef/993FycmLr1q0EBATU+HhCCNFY9OrVC19fXwAcHR25\nffs2er3e7AjxRh9u+bfLmJdwhpRLNyku09O1pQN/7d+ep7u2qLLdpSsXeTVuFllN0jEqddgfcyPY\nfSidirpxKfUUtxWFKFFhjxOB4YG07dyyyv1tWKQl7noTLv38aFtHg4JRBht8lRqUwNcGI9856Xjj\nnTvhVVhYSHh4OHFxcXTu3Jldu3bRpUuXB/RdEUII66JSqbD/ebIMrVbLwIEDq3z0qVGHm9Fo5G8b\n/o+kCzcrlh2+kM1/rhWw4sWe+HUwfZ9Mr9cTEj+J205pFcuKNUWsL/yMp7P64ai6+4LWcm5zHW3s\n50x8eyIaW9PfzqS4g3ycZU+66t49thsqIzdUZazEBnsUdFCBW76CdTGHeWaoFyNGjODEiRMMHjwY\nrVaLi4vLb/+GCCGElUtMTESr1bJmzZoqt2vUA0q+OptF8qWblZZnF5WxIeWK2XYfbPyIYoerlZbr\nNcWccTxbafktRR47Yszf3Pz8cB7pisqjIy9iZDulFZ8dVUoyv/qe3r17c+LECV555RX27dsnwSaE\nEEBSUhLR0dGsWrUKBweHKrdt1D23H67eQmcwve6n3GKz7U7mnEPhVDmMAMpwprT9T3jaX6PMoOFS\nfidc0hzIzc4yu79shQYbVSnDvBPp0PwKRiOcz+vIvtSnSfvFjCc7T3/Ju3veR2fUsXjxYiZPnoxC\noTC7XyGEeFQUFBQQFRXFunXrajRSvFGHm2dz809WOxjLza5rZefGf0wsb1bSmdA2P+HlmFGxzNft\nR47Y98Eu3cfs/pooi/l7jxi6ul6oWNbd/Qwdm1/m5om/YTAa+J/D61j8zTqa2NgTFxfHsGHDqj45\nIYR4hOzZs4fc3FymTJlSsSwyMhJPT0+T2zfqcHuy7CquFJLN/UP1lehpc/0HYLDJdo/lNCHRpQVK\nu8z7lg+2d8DL8eT9+1JAL/fjxGV04M8Emdzf0O5bcP9FsN3V3f00Zd6b+NuSNHafOUCb5q0IefE9\nCTYhhPiV4OBggoODa7x9ow63s98coZ+NgaPl7bhhbIYRJc0o4XeqG7Qtq3xP7a4j6WqKS4Jo4rEb\nQ7kzBoM9GrtU2nhcM7m9nbocZ7dMk+sA3J1STS7PydYRsWgbZy8U8UTr7gQHvsv05X+s1TkKIYSo\nrFGHm0ajwVWZxzCbs2Qb7LmNhlbKAtQKAyqd+XtZtujxMaaTf/U5rhjbANCEfMrdYs220Rmq+FYa\nKw9XPX+ulHfeuc7Nm3qe8h3C59vX0LFj65qfnBBCCLMadbg9HhzMF2vWYl9ehpvq/gEkeW28zbb7\n09BOzP6mmHTjvWfXbuHI6ewu+LhVHi2ZW+KIMrOD2f1lZvnSwvtL+DlPv/66kMgPblBWZiTwhQFs\n3/EvGTgihGg0frj8U53aHTM/dKHWGvWjAAl6NckdfCiyuTewRIeCi26enOj3jNl2e39IuS/Y7tp/\n5WlSrvWkTH/vb4K8UgcOXhnEwln/MLu/0Jc/xZjfDqPByIYNubz3zywUCnj3Hz3ZEfe1BJsQQjxg\njbrnllOu53zLdqS5eNAtIxW1QUe6kzvpzh70ND3SH4BinenMN6LkyI/9uJLVCWfnG+gNakqvebP8\n7RnV1tJ/2F78/Z/k+PHLeLjZERIWxpzIVXU9NSGEEFVo1OHWz6kptgoosbHjuHfX+9Z1bmr6fWoA\nXVo5sP9iGWXYVFrnrr7Jp1Pfr1UdmZmZjBw5kuPHT+Pn50dcXBwtWlQ9/ZcQQoi6a9SXJfs6OzDE\nrXml5W3tNLzSxt1suwlj36GH+lSl5Z5k8twTtRv08f33d2YcSU5O5sUXX+TAgQMSbEIIUc8adc8N\nYEU3L7wvX+dwbiFFej3dmjVhfFt3fBzszbZRaTSsnDqO2csWcqnMi1KjDa3VGQzzdSZo5NQaHzs+\nPp7Q0FCKioqYN28es2bNkvtrQgjxEDT6cLNRKnm7o+kn2Kvi6tqKlXMWAXDs2DGefPLJGrc1Go0s\nXLiQ6dOnY2dnh1arZfTo0bWuQQghRN00+nB72MrKyhg/fjxr166ldevWxMfH07NnT0uXJYQQjxQJ\ntwfo5s2bjBo1iqSkJJ566il27txpdt4zIYQQ9adRDyh5mE6fPk3v3r1JSkoiKCiIQ4cOSbAJIYSF\nWHXPrawsh6vpG9CV38LB4TFathyBQlF5qqtpy2fwg3dTjAoNTXOv8b/D59Dc2bna/UfMep2nc75B\npTPwmasn140v8GbUhErb7d27l5CQEPLz84mIiODdd99FqZS/G4QQwlKsNtyybiRy7tw/KS299/qZ\njGtb8e0ejUbjWLHsua1vcabbHyhU3Hn/j7KJjuH/1vKR2+P07tnb7P53v9GPoK9zUBXeGd3oorhC\nkc8yXpt8lU+WLgDuDBxZunQpb7zxBhqNhk2bNhESElIfpyuEEKIWrLJ7YTCUc/HiwvuCDSAv7ygX\nL35Y8Xnh/y7kvOvQimADMCjUXND04p30vWb3P33GNLwP3ws2AIVRQbMfIFj/LwDKy8sZP348U6ZM\nwcPDg0OHDkmwCSFEA2GVPbesrH9RXHze5Lq8vO8qvv7SMY9bCleT291q0tHs/p8tPIgq3/TzaE4/\nFZOTk0NQUBBfffUVPXr0ID4+nrZt29biDIQQQtQnqww3vb7Q7DqDseze16rK998q9oHG7DqVwWB2\n3ZVbZYT4+XH+/HkCAwOJjY2lWbNmZrcXQgjx8NU53KKiojh27Bg6nY7XXnuNIUOGPMi6quThMZzL\nqcs5/ENPvs3rRJHehla2+QS0TuLx7vdePdPmSi5n21xj+eoFtMnIQak3Uuhgyxd+T/P105Vn/b/r\nuHN3/tv2W5Sl9/fevikqYsrRdArLDMycOZN58+bJwBEhhGiA6hRuKSkpnD9/ns2bN5Obm8vIkSMf\narhpNI5s+nY4/8rqht54pwd2tgBOFXjysiaf7j+/E2j1pKWk9OuBY04Jip9fpuZcWsLovXuwLxsA\nfzC9/2nz1/NNhg9OKToUxjvtPs/NZf6NTFAqWb9+PeHh4fV+nkIIIeqmTuHWq1cvfH19AXB0dOT2\n7dvo9XpUVVwGfJD+ffoEh3PaVwTbXTdLXdh/IYfXf/688vWXGJRTWhFsd6n0MODYv6s8xjfuE/jd\nHzbifuUmi49nsiUrjyb2Tfhi/xf4+/s/yNMRQgjxgNXpmppKpcLe/s7Ew1qtloEDBz60YAPYdCCR\nW+WOJtell9x7fq3zhbOYm6a4aUFJlcd4M2oCA9/ZzZwCL7ZczsPHx4fTP56WYBNCCCvwmwaUJCYm\notVqWbNmTbXbHjt27Lcc6j5qoxEwYCqbbZS6imOVacyfnlGpqLKmtLQ0pk6dSmpqKv3792fevHlk\nZ2eTnZ39W8u3iAf5/bcEa67fmmsHqd/SrL1+S6lzuCUlJREdHU1MTAwODg7Vbl+bWfWr07nr70he\ntJW04srvRetgn1NxrHndeuF1eR9KE2/dvt7CkSFmajp06BAvv/wyOTk5TJs2jTFjxtC7t/kHvhu6\n2r7VoKGx5vqtuXaQ+i2tPutv7KFZp8uSBQUFREVF8cknn+Dk5FR9gwfMsakDz3XQ4WF3rxelRM9j\njqkseCm0YtnshYs57dMG4y+uTRoxUuSo5mtfP5P7Xr16NQEBAeTn5xMTE8PChQsf6iVXIYQQv12d\nem579uwhNzeXKVOmVCyLjIx8qBMFTw97leBrV1m0dRO3ddDOuQkzw15Do7l/kEnQ1i/455QJ9P3P\n/2FTruOSVzv+unYbT/1qf3q9nrfeeouPPvoIFxcXtm/fzqBBgx7a+QghhKjeuXPnmDBhAmPHjiUs\nLMzsdnUKt+DgYIKDg+tc3IPi3aoNyyb/o9rtIhZ/XPH1702sz8/PJzQ0lISEBLp27cru3bvp2NH8\nDCZCCCEevuLiYubOnUvfvn2r3faRfwI5NTUVf39/EhISGDJkCMnJyRJsQgjRANnY2LBq1So8PDyq\n3faRDrcjR47Qu3dvTp06xaRJk0hISLDIPUQhhBDVU6vV2NnZ1Wzbeq6l3i2dPok2Ta4Tl1rG+nU7\na9xu/fr1vPLKK+j1ej7++GNef/316hsJIYSwClYbbstnTmK8ej2T7AAjjPSC/HdccZxb9XNoBoOB\nt99+mw8++AAnJye2bt1KQEDAwylaCCHEQ2G1lyVfV69HrQKF4t5/DkodOe+4mW1TWFjI6NGj+eCD\nD+jcuTMpKSkSbEII0QhZZc8tZY4vfUzEskIBTopyk23S0tIYMWIEJ06cYPDgwWi1WlxcXOq5UiGE\nePR4l2ysU7tt1aw/deoUkZGRpKeno1ar2bdvH8uWLTM5VsIqw62bPh2FmeeqFSYmkzx69CgvvPAC\nmZmZvPrqqyxfvrzS83BCCCEaNh8fH2JjY2u0rVVelryscsNoYkotoNLyTZs2MWjQIG7cuMGSJUuI\njo6WYBNCiEbOKsPt8TlnTYab0QiFxjtdOoPBQEREBKGhodjY2LB7924mT56MwlTXTgghRKNileEG\nEKsbgl5/r6dmNEKJQclf0kZTXFzMn/70J9577z3at29PcnIyw4YNs2zBQgghHhqrvOcG8OcFWwHY\nOmcMbTnL14X9eWvRCpZlZDBo0CC+++47BgwYwPbt23FzMz+CUgghRONjteF2V9CcLQD4cecVDiNG\njCAjI4O//OUvrFy5EltbW8sWKIQQ4qGz2suSv6bVahkwYADXrl3jww8/ZPXq1RJsQgjxiLL6cDMa\njcyfP5+goCCUSiVxcXG8+eabMnBECCEeYVZ9WbKkpIRx48axYcMG2rVrx65du/D19bV0WUIIISzM\nasMtMzOTwMBAUlJS8PPzIy4ujhYtWli6LCGEEA2AVV6WPHnyJL169SIlJYUXX3yRAwcOSLAJIYSo\nYHXhFh8fj7+/P2lpacyfP5/Y2Ngav99HCCHEo8Fqws1oNPLhhx8SGBiIwWBAq9Uya9YsGTgihBCi\nEqu451ZaWsr48eNZt24drVu3Jj4+np49e1q6LCGEEA1Ugw+3GzduMHr0aJKSknjqqafYuXMnnp6e\nli5LCCFEA9agL0v++OOP9OnTh6SkJMaMGcOhQ4ck2IQQQlSrwYbb3r176devH5cvXyYiIoLPP/8c\ne3t7S5clhBDCCjS4y5JGo5GlS5fyxhtvoNFo2LRpEyEhIZYuSwghhBVpUOFWXl7OxIkT+fTTT2nZ\nsiVxcXH06dPH0mUJIYSwMg0m3HJycvjjH//IgQMH6NGjB/Hx8bRt29bSZQkhhLBCDeKe29mzZ+nT\npw8HDhwgMDCQw4cPS7AJIYSoM4uHW2JiIn5+fly4cIGZM2eybds2mjZtaumyhBBCWDGLXpZcuXIl\nkyZNQqVSsX79esLDwy1ZjhBCiEbCIuGm0+mYOnUqy5cvx93dnR07duDv72+JUoQQQjRCDz3c8vLy\nCA4OZv/+/fj4+LBr1y68vb0fdhlCCCEasTqH24IFCzh58iQKhYJZs2bV6CWhFy5c4Pnnn+fMmTMM\nHz6cjRs34ujoWNcShBBCPEJqkzt1GlDy7bffcuXKFTZv3sz8+fOZP39+tW0OHTpEnz59OHPmDNOm\nTWPnzp0SbEIIIWqktrlTp55bcnIyAQEBAHTs2JFbt25RWFhIs2bNzLa5u31MTAwvv/xyXQ4rhBDi\nEVXb3KlTz+3mzZs4OztXfHZxceHGjRtVtnF0dCQxMVGCTQghRK3VNnceyIASo9FY7Tb79+8H4Nix\nYw/ikA+dtdZ9l9RvOdZcO0j9lmZt9dvY2LAtqGWd29ZUdblTp3Dz8PDg5s2bFZ+zsrJwd3c3u/2T\nTz5Zl8MIIYSwMt27d6+X/dY2d+p0WdLf3599+/YBd9655uHhUeX9NiGEEOK3qG3u1Knn1rNnTx57\n7DFCQkJQKBRERETUrVohhBCiBmqbOwpjTW6YCSGEEFbE4hMnCyGEEA+ahJsQQohGp97DbcGCBQQH\nBxMSEsL3339f34d74KKioggODmb06NEVjzNYk5KSEgICAti+fbulS6m1+Ph4RowYwahRozh48KCl\ny6mVoqIiJk6cSHh4OCEhISQlJVm6pBo5d+4cAQEBfPbZZwBcu3aN8PBwQkND+fvf/05ZWZmFK6ya\nqfrHjh1LWFgYY8eOrfZ5XEv7df13JSUl0aVLFwtVZZ3qNdzqMk1XQ5KSksL58+fZvHkzMTExLFiw\nwNIl1drKlStp3ry5pcuotdzcXFasWMHGjRuJjo7myy+/tHRJtbJjxw7at29PbGwsS5YssYr/94uL\ni5k7dy59+/atWLZ06VJCQ0PZuHEjXl5eaLVaC1ZYNVP1L168mDFjxvDZZ5/x7LPPsnbtWgtWWDVT\n9QOUlpby6aefVjnsXVRWr+FmbroUa9GrVy+WLFkC3Jlh5fbt2+j1egtXVXMXL17kwoUL/P73v7d0\nKbWWnJxM3759adasGR4eHsydO9fSJdWKs7MzeXl5AOTn5983s0JDZWNjw6pVq/Dw8KhYdvToUZ55\n5hkABg8eTHJysqXKq5ap+iMiIhg6dChw/79JQ2SqfoDo6GhCQ0Nr9YCzqOdwq8s0XQ2JSqXC3t4e\nAK1Wy8CBA1GpVBauquYiIyOZMWOGpcuok6tXr1JSUsL48eMJDQ1t0L9UTRk+fDgZGRk8++yzhIWF\nMX36dEuXVC21Wo2dnd19y27fvl3xS9XV1bVB//yaqt/e3h6VSoVer2fjxo08//zzFqqueqbqv3z5\nMmfOnGHYsGEWqsp6PdT3uVnrUweJiYlotVrWrFlj6VJqLC4ujh49etC2bVtLl1JneXl5LF++nIyM\nDF566SUOHDiAQqGwdFk1snPnTjw9PVm9ejVnzpxh1qxZVnnf85es9edXr9fz1ltv4efnV+mSX0P3\n/vvvM3v2bEuXYZXqNdxqO11KQ5SUlER0dDQxMTE4ODhYupwaO3jwIGlpaRw8eJDr169jY2NDy5Yt\n6devn6VLqxFXV1eeeOIJ1Go17dq1o2nTpuTk5ODq6mrp0mrk+PHj9O/fH4CuXbuSlZWFXq+3qp4/\n3On5lJSUYGdnR2ZmZqVLZtZg5syZeHl5MXHiREuXUiuZmZlcunSJN998E7jz+zMsLKzSYBNhWr1e\nlrT2aboKCgqIiorik08+wcnJydLl1MrixYvZtm0bW7ZsISgoiAkTJlhNsAH079+flJQUDAYDubm5\nFBcXW8V9q7u8vLw4efIkAOnp6TRt2tTqgg2gX79+FT/D+/fvZ8CAARauqHbi4+PRaDRMnjzZ0qXU\nWosWLUhMTGTLli1s2bIFDw8PCbZaqNeem7VP07Vnzx5yc3OZMmVKxbLIyEg8PT0tWNWjoUWLFgwd\nOpQxY8YAMHv2bJRK63ksMzg4mFmzZhEWFoZOp2POnDmWLqlap06dIjIykvT0dNRqNfv27WPhwoXM\nmDGDzZs34+npSWBgoKXLNMtU/dnZ2dja2hIeHg7cGdjWUP8tTNW/bNkyq/vDuqGQ6beEEEI0Otbz\np7AQQghRQxJuQgghGh0JNyGEEI2OhJsQQohGR8JNCCFEoyPhJoQQotGRcBNCCNHoSLgJIYRodP4f\nIvrW9vrQ8/4AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_PDpoints_for_mnist(points, labels)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\naZ3/Bzsi4xPhYlPaAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "delta = 2.0\n", "robust = points[:,1] - points[:,0] > delta\n", "\n", "plot_PDpoints_for_mnist(points[robust], labels[robust])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Show the betti number distributions" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.violinplot(data=[robust_betti_numbers[l] for l in range(10)]);" ] } ], "metadata": { "kernelspec": { "display_name": "python3free", "language": "python", "name": "python3free" }, "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.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }