Created
December 4, 2018 12:12
-
-
Save ltiao/dee2673758db49b88db940cb1ea4fe84 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import scipy.sparse as sps\n", | |
"\n", | |
"import pandas as pd\n", | |
"import networkx as nx\n", | |
"\n", | |
"from sklearn.preprocessing import LabelBinarizer\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"import seaborn as sns" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.style.use('seaborn-colorblind')\n", | |
"\n", | |
"plt.rc('text', usetex=True)\n", | |
"plt.rc('font', family='serif', serif=['Lato'], size=16)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>1</th>\n", | |
" <th>2</th>\n", | |
" <th>3</th>\n", | |
" <th>4</th>\n", | |
" <th>5</th>\n", | |
" <th>6</th>\n", | |
" <th>7</th>\n", | |
" <th>8</th>\n", | |
" <th>9</th>\n", | |
" <th>10</th>\n", | |
" <th>...</th>\n", | |
" <th>1425</th>\n", | |
" <th>1426</th>\n", | |
" <th>1427</th>\n", | |
" <th>1428</th>\n", | |
" <th>1429</th>\n", | |
" <th>1430</th>\n", | |
" <th>1431</th>\n", | |
" <th>1432</th>\n", | |
" <th>1433</th>\n", | |
" <th>1434</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>31336</th>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>Neural_Networks</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1061127</th>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>Rule_Learning</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1106406</th>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>Reinforcement_Learning</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>13195</th>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>Reinforcement_Learning</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>37879</th>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>Probabilistic_Methods</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 1434 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" 1 2 3 4 5 6 7 8 9 10 \\\n", | |
"0 \n", | |
"31336 0 0 0 0 0 0 0 0 0 0 \n", | |
"1061127 0 0 0 0 0 0 0 0 0 0 \n", | |
"1106406 0 0 0 0 0 0 0 0 0 0 \n", | |
"13195 0 0 0 0 0 0 0 0 0 0 \n", | |
"37879 0 0 0 0 0 0 0 0 0 0 \n", | |
"\n", | |
" ... 1425 1426 1427 1428 1429 1430 1431 \\\n", | |
"0 ... \n", | |
"31336 ... 0 0 1 0 0 0 0 \n", | |
"1061127 ... 0 1 0 0 0 0 0 \n", | |
"1106406 ... 0 0 0 0 0 0 0 \n", | |
"13195 ... 0 0 0 0 0 0 0 \n", | |
"37879 ... 0 0 0 0 0 0 0 \n", | |
"\n", | |
" 1432 1433 1434 \n", | |
"0 \n", | |
"31336 0 0 Neural_Networks \n", | |
"1061127 0 0 Rule_Learning \n", | |
"1106406 0 0 Reinforcement_Learning \n", | |
"13195 0 0 Reinforcement_Learning \n", | |
"37879 0 0 Probabilistic_Methods \n", | |
"\n", | |
"[5 rows x 1434 columns]" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = pd.read_csv(\"../../keras-gcn/kegra/data/cora/cora.content\", sep='\\s+', header=None, index_col=0)\n", | |
"df.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Features Matrix (Sparse)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(2708, 1433)" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"features = sps.csr_matrix(df.iloc[:, :-1].values)\n", | |
"features.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Correctness" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"idx_features_labels = np.genfromtxt(\"../../keras-gcn/kegra/data/cora/cora.content\", dtype=np.dtype(str))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert np.all(np.float32(idx_features_labels[:, 1:-1]) == df.iloc[:, :-1].values)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Class Labels" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[0, 0, 1, ..., 0, 0, 0],\n", | |
" [0, 0, 0, ..., 0, 1, 0],\n", | |
" [0, 0, 0, ..., 1, 0, 0],\n", | |
" ...,\n", | |
" [0, 1, 0, ..., 0, 0, 0],\n", | |
" [1, 0, 0, ..., 0, 0, 0],\n", | |
" [0, 0, 1, ..., 0, 0, 0]])" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"lb = LabelBinarizer().fit(df.iloc[:, -1].values)\n", | |
"labels = lb.transform(df.iloc[:, -1].values)\n", | |
"labels" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array(['Case_Based', 'Genetic_Algorithms', 'Neural_Networks',\n", | |
" 'Probabilistic_Methods', 'Reinforcement_Learning', 'Rule_Learning',\n", | |
" 'Theory'], dtype='<U22')" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"lb.classes_" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Graph Structure" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>0</th>\n", | |
" <th>1</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>5429.000000</td>\n", | |
" <td>5.429000e+03</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>115009.455148</td>\n", | |
" <td>5.604759e+05</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>188229.783205</td>\n", | |
" <td>4.710471e+05</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>35.000000</td>\n", | |
" <td>3.500000e+01</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>6334.000000</td>\n", | |
" <td>7.855200e+04</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>31353.000000</td>\n", | |
" <td>5.233940e+05</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>119686.000000</td>\n", | |
" <td>1.113995e+06</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>954315.000000</td>\n", | |
" <td>1.155073e+06</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" 0 1\n", | |
"count 5429.000000 5.429000e+03\n", | |
"mean 115009.455148 5.604759e+05\n", | |
"std 188229.783205 4.710471e+05\n", | |
"min 35.000000 3.500000e+01\n", | |
"25% 6334.000000 7.855200e+04\n", | |
"50% 31353.000000 5.233940e+05\n", | |
"75% 119686.000000 1.113995e+06\n", | |
"max 954315.000000 1.155073e+06" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"edge_list_df = pd.read_csv(\"../../keras-gcn/kegra/data/cora/cora.cites\", sep='\\s+', header=None)\n", | |
"edge_list_df.describe()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<networkx.classes.digraph.DiGraph at 0x7f6a9de60828>" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"H = nx.from_pandas_edgelist(edge_list_df, 0, 1, create_using=nx.DiGraph)\n", | |
"H" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"2708" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"H.number_of_nodes()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"idx_map = {j: i for i, j in enumerate(df.index)}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"G = nx.relabel.relabel_nodes(H, idx_map)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.int64'>'\n", | |
"\twith 5429 stored elements in COOrdinate format>" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"adj = nx.to_scipy_sparse_matrix(G, nodelist=sorted(G.nodes()), format='coo')\n", | |
"adj" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/usr/lib/python3.7/site-packages/matplotlib/font_manager.py:1241: UserWarning: findfont: Font family ['serif'] not found. Falling back to DejaVu Sans.\n", | |
" (prop.get_family(), self.defaultFamily[fontext]))\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 720x576 with 2 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(10, 8))\n", | |
"\n", | |
"sns.heatmap(adj.todense(), ax=ax)\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Correctness" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(5429, 2)" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"edges_unordered = np.genfromtxt(\"../../keras-gcn/kegra/data/cora/cora.cites\", dtype=np.int32)\n", | |
"edges_unordered.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(5429, 2)" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"edges = np.array(list(map(idx_map.get, edges_unordered.flatten())),\n", | |
" dtype=np.int32).reshape(edges_unordered.shape)\n", | |
"edges.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.float32'>'\n", | |
"\twith 5429 stored elements in COOrdinate format>" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"adj_old = sps.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),\n", | |
" shape=(labels.shape[0], labels.shape[0]), dtype=np.float32)\n", | |
"adj_old" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert np.all(adj_old.todense() == adj.todense())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Symmetrized Adjacency Matrix (directed to undirected)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<networkx.classes.graph.Graph at 0x7f6a9de60390>" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"H = nx.from_pandas_edgelist(edge_list_df, 0, 1)\n", | |
"H" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# to label nodes\n", | |
"# nx.set_node_attributes(H, df.iloc[:, -1].to_dict(), name='label')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"G = nx.relabel.relabel_nodes(H, idx_map)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.int64'>'\n", | |
"\twith 10556 stored elements in COOrdinate format>" | |
] | |
}, | |
"execution_count": 24, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"symm_adj = nx.to_scipy_sparse_matrix(G, nodelist=sorted(G.nodes()), format='coo')\n", | |
"symm_adj" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 720x576 with 2 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(10, 8))\n", | |
"\n", | |
"sns.heatmap(symm_adj.todense(), ax=ax)\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"connected_components = sorted(nx.connected_components(G), key=len, reverse=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# second-largest connected compnent\n", | |
"g = G.subgraph(connected_components[1])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# labels = {n: d['label'] for n, d in g.nodes(data=True)}\n", | |
"# labels" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/home/tiao/.virtualenvs/gcn/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:611: MatplotlibDeprecationWarning: isinstance(..., numbers.Number)\n", | |
" if cb.is_numlike(alpha):\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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P/zA0qVLzalVisTT05OJEyeqd02clnrWRETszp83jpA6csTY8NbPz9ieY8yYzFWfhw4dokePHmzYsIHWrVubWq4U3pUrV/D392fLli3cfffdZpcjckMU1kREbtDy5cuZMGECe/fupXbt2maXI4UUGhrK999/z6JFi8wuReSGKKyJiBRBSEgI33zzDVu3bqVSpUpmlyOFcOnSJRo2bMju3btp2LCh2eWIFJrCmohIEWRkZDB8+HCqVq3Kxx9/jMViMbskKYRXXnmFs2fP8sEHH5hdikihKayJiBTRlStXuP/++3n44Yd54YUXzC5HCuHChQs0atSIQ4cOceutt5pdjkihKKyJiBTDr7/+yn333cfHH39Mr169zC5HCmHy5MkkJSXxj3/8w+xSRApFYU1EpJh27tzJ4MGD2bFjB3feeafZ5UgBzp07R9OmTfnhhx+0QEScgvZZExEppg4dOhAaGsqAAQOIj483uxwpQO3atXnooYd45513zC5FpFDUsyYiUkKee+45jh8/ztq1a6lQoYLZ5ch1nD59mhYtWhAdHU2NGjXMLkfkutSzJiJSQt5++20yMjKYPHmy2aVIAerXr8+QIUN49913zS5FpEDqWRMRKUFxcXG0a9eOadOm8be//c3scuQ6Tp48Sbt27Th58iQ+Pj5mlyOSL/WsiYiUoOrVq7Nq1SqmTp3Kd999Z3Y5ch0NGzakd+/evPfee2aXInJd6lkTESkF69at47HHHmP37t3az8uB/fDDD3Tt2pWYmBgqV65sdjkieVLPmohIKejTpw8vvPACAwcO5MqVK2aXI/lo2rQpHTt2JCwszOxSRPKlnjURkVJitVoZPXo0ycnJLF26VEdSOaiDBw/Sr18/Tp48iaenp9nliFxDPWsiIqXEYrEQFhbGqVOnmDNnjtnlSD5atmxJy5YtWbhwodmliORJPWsiIqXs7NmztG3blr///e8EBwebXY7kYdeuXfz1r38lOjoaDw8Ps8sRyUE9ayIipaxOnTp8/fXXjB07lqioKLPLkTzcd999NGzYkM8//9zsUkSuoZ41EZEysnjxYl566SX27t1LrVq1zC5Hctm6dStPPPEEx44dw93d3exyRDKpZ01EpIz89a9/ZeTIkQwZMoSrV6+aXY7k0qVLF2rVqsWyZcvMLkUkB/WsiYiUoYyMDIKDg7n55pt5//33tULU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F6KwJiIiIgCkp6cT1qoVf/v+eypmZGC5XkSwWIzg9tZbMG5c2RXpgjQMKiIiIgC4h4XxZHQ0lvT0gi+2WiExESZONB4rsJUa9ayJiIgI7NsHXboYAexGeXvDtm0QEFDiZYlWg4qIiAiQEBLCvMREwvJ4LgyIAJZla3sCiLTdwhITITS0DKp0TQprIiIiri42lv0bN+b51DBgOBAIvJ+tPc723PvAWIB16+D8+dKt00UprImIiLi6hQsJdHfHN1dzZLb7McCmbI+fAA4AU+wNFouxzYeUOIU1ERERVxcVlXN7Dpv9tp9xQALZghlGeMvRnpQER46Ubp0uSmFNRETE1V28mGdzgu2nP9AKo6ctxtY2Nlt7hL09Pr40q3RZ2rpDRETE1dlPLMjFH7iQ7bEvRiizh7bJtvbq9gv8/EqnPhennjURERFX17w5eHpe0xxIVk8atvsBGCEuMFt7HODv5QXNmpVmlS5L+6yJiIi4uthYIurV4/3UVBIwFg8MtT21DCOMgdGDlr0djAA3FPD39IRTp3RmaClQWBMREREYPBhWrDBOJrhRFgsEB8Py5SVflyisiYiICDrBwIFpzpqIiIhAmzbGoeze3jf2Om9v43UKaqVGq0FFRETEYD+MfeJEY9+06w2+WSzg5WUENR3iXqo0DCoiIiI57d9vnPW5bp0RypKSsp7z8jJCXJ8+MG2aetTKgMKaiIiI5O38eeMIqSNHjA1v/fw/+4OpAAABWElEQVSM7TnGjNGqzzKksCYiIiLiwLTAQERERMSBKayJiIiIODCFNREREREHprAmIiIi4sAU1kREREQcmMKaiIiIiANTWBMRERFxYAprIiIiIg5MYU1ERETEgSmsiYiIiDgwhTURERERB6awJiIiIuLAFNZEREREHJjCmoiIiIgDU1gTERERcWAKayIiIiIOTGFNRERExIEprImIiIg4MIU1EREREQemsCYiIiLiwBTWRERERByYwpqIiIiIA1NYExEREXFgCmsiIiIiDkxhTURERMSBKayJiIiIODCFNREREREHprAmIiIi4sAU1kREREQcmMKaiIiIiANTWBMRERFxYAprIiIiIg5MYU1ERETEgSmsiYiIiDgwhTURERERB6awJiIiIuLAFNZEREREHJjCmoiIiIgDU1gTERERcWAKayIiIiIOTGFNRERExIEprImIiIg4sP8HAtdA/N0+148AAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<Figure size 720x576 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(10, 8))\n", | |
"\n", | |
"nx.draw(g, with_labels=True, ax=ax)\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Correctness" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.float32'>'\n", | |
"\twith 10556 stored elements in Compressed Sparse Row format>" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"symm_adj_old = adj_old + adj_old.T.multiply(adj_old.T > adj) - adj_old.multiply(adj_old.T > adj_old)\n", | |
"symm_adj_old" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert np.all(symm_adj_old.todense() == symm_adj.todense())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Properties" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Zero-diagonals (no self-loops)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert not np.any(np.diag(symm_adj.todense()))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Symmetry" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert np.all(symm_adj.todense() == symm_adj.transpose().todense())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Normalized Adjacency Matrix" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.float64'>'\n", | |
"\twith 13264 stored elements in Compressed Sparse Row format>" | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"a_tilde = symm_adj + sps.eye(symm_adj.shape[0])\n", | |
"a_tilde" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([6., 2., 5., ..., 5., 5., 4.])" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"d_tilde_diag = a_tilde.sum(axis=1).A1\n", | |
"d_tilde_diag" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([0.40824829, 0.70710678, 0.4472136 , ..., 0.4472136 , 0.4472136 ,\n", | |
" 0.5 ])" | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"d_tilde_sqrt_diag = np.power(d_tilde_diag, -0.5)\n", | |
"d_tilde_sqrt_diag" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.float64'>'\n", | |
"\twith 2708 stored elements (1 diagonals) in DIAgonal format>" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"d_tilde_sqrt = sps.diags(d_tilde_sqrt_diag)\n", | |
"d_tilde_sqrt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<2708x2708 sparse matrix of type '<class 'numpy.float64'>'\n", | |
"\twith 13264 stored elements in Compressed Sparse Row format>" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dad = d_tilde_sqrt.dot(a_tilde).dot(d_tilde_sqrt).tocsr()\n", | |
"dad" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAAHtCAYAAAD2sh+OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X2QXPV95/vPV2ZZE8VoNEJIGjsxjNgYknUwwwgbHAyyZlLru2VXyhpM7uV6XSYwyoNdKW+MxmzdWy7XvRUz5MGVwokZkcXlzeWWkUQqheteJ56xwSYGG4bBxDfBXqMhD2YkEBqNnWKdZWG+94/z69FRTz/OOX1+p7vfL6qL6dPn2/3rnp7ur34P35+5uwAAAPrFptgNAAAAKBLJDwAA6CskPwAAoK+Q/AAAgL5C8gMAAPoKyQ8AAOgrJD8AAKCvnBO7AZJkZgclLUoalCR3PxS3RQAAIIZ2cgIzm5A0LulIOHSDpGl3X2z0GNF7fsxsWtKiux8NT3B3eDIAAKCPbCAnGJQ0JmlW0rSkmWaJjyRZ7ArPZnba3bemro9JmnL38YjNAgAABWs3JzCzyY2MFkXt+TGzkRqHl5VkcQAAoE8UmRPEnvMzqOSJpa3EaAgAAIhqQzmBmU2GuJbnDcdOfgZqHFuWJDMbcPe1Jx2e3KQk2eu2XLlp0+ZiWpjBFy7Yqw+99FDsZgAAesCrrzxvRT7e/3hpMfd5Medu331A4bs8OJRKVlrOCVLmJa1U5vmY2YyZTbj70UbtiDrnJ4zlHaka3xuWdEzS1jpPVOec+0a2ogcA9JVeSH7+1QXDdZ/DRnOCqvuYkHS7u1/Z6LzYq72WtT7TG5CkVp4kyuvf77widhMAAFmsvpb/pbG2c4KQMKWtSKo1d+gsUZMfd1/Q+vG8QUlzEZqDHP0/J56K3QQAQBdpNycIvUKzZpZOmAaU1AhqKHbPjyQdrlrDPy5pJlZjAACAJF/N/9Jcw5zAzIYrt4d5PgeqeoVuVFLvp6HodX6ks6o5DiuZuNRwpna9OT+nbrpM2+57pgMtBAAgrsLn/Bx/Jv85P7sua/ocGuUE4bbxSt2f0PtTSZa2STrWymqvUiQ/7Wo04fne7Xt180lWWAFl9d6dI/rSiYXYzQC6Tr8kP0XoueRHkh7bfpWuPvl4Uc0BAKDjik5+Xln62/yXug/9QimSnzLM+cnd1Scf16d2XR+7GU1NDV0Xuwlo06/sarh6Ei345Z2Xx24CgD7Xkz0/AAD0msJ7fn743fx7ft70Vnp+gLKiVw7diPctchVntVchMic/YdnZwbANfa3bD5rZhJlNhi0q2orPw88P/myn7rpn/Ludbyv8MX9z6JcKf8xWTS99PXYTgLbxvi0Gw9/dL1PyEyorjkjarRp7coSEZtHdj4alZ7vT6/ebxbfrjp17ax7/u+V/1Lt3vDXr3bdkcuidhTxO3v7yxHcKf8w/Wfrrwh8TALL6i+NPxm5CMYqv8FyYTMmPu8+FzcPqbUUxWbW52KykA23Et+UTJ+ovcf/aC98tJAE6tPTNjj9Gt/udoXfFbgIAoI91bFd3M6u1t8aypOp9OArztRe+G+uhkfIHS9+I3QQAQDMlmqOTt44lP0r241iuOsZmpQAAdIPV3k1+Ornaq9YcnmVJqtqErCVhwvS8mc2vrr6cuXEAAKA/dbLnZ0VJ709a9fWWhQnThyTq/AAA0Gnew8Nenez5Wdb63p8BSaragRUAAKAwHUt+3H1B6+f4DEqa69RjtuLUTZfFfHgAALrD6mr+l5LodIXnw+m6PpLGJc10+DEb2nbfMzEfHgAARJZpzk9Yzn6jpIlwfVrS/aHXR+5+oFLhWdKwpGPpuj/N4gEAQCQ9POeHjU0BAOs8tv0qXX3y8djNQErRG5v+9+99Pffv2n996XVsbIrmnrv80thNANCHSHzQy0h+Su7ip78Xuwmo4YoLdsduQm7eu7NWMfZyumRgKHYT0KW66X1eGuzqjortP7UldhPWecO558VuQkNDP72x8k5bz/vpnFuSTfp5PPXSsY4/Rt62nfeGmte/dKK9KXY7Np+pYFH997Bj84B+9vwLN9jCxoZ+elDPrix15L6lfP62069Nv9l87utzvb92XstWfnftvs/bsWPzQCm/G1Afc34AAOgChc/5+duv5j/n5xf2lWLOTycrPAMAgG5VomGqvGVOfsI+XZPh6h5Js2ErivQ5ByUtKmxvkb69lXgAAIC85NHzc7u7T1WumNkxM1tLcELtnicq9X3MbNrMJlL1fhrGo7m3Dl6k7y7/fexmdMyv7LpSf3H8ydjNAID+UqKKzHnLNOE59NoMVx2ekTSVuj6ZLmwoaVbSgTbi0UQvJz6SSHwAALnK2vMzKGnMzIbdfTEcW1FIaEIF52rLksZaiQcAAHG4vxa7CR2TqefH3RfdfWsqcZGS/bsqm5cOKkl20tY2O20hfo2ZTZrZvJnNr66+nKXZKIH/OPSu2E0AADTSw3V+cl3tFYaxxiTtC4dqFWpYrpzr7mft+l4jfk2YA3RIYql7L/jDpW/EbgIAoE/lXeTwHkn7UhuTriis8EppVMWtOh7IhKquG/fBoXcUElMW+3ftaXh7Nz83dF6z909XWl3N/1ISuRU5DMvZF9x9LnVsRNKT7m6NjtWLr2ejPT+/M/Qu/QE9DgCALlR0kcN/WXgw91GW14+8rxRFDnPp+TGzCaUSFzMbk6TQg7NSdfqgqub01IvPG4kPAAAt6uE5P5mTn5CoDEqaN7NhMxtWMmm54nBIbirGlSxnbzUeAAAgN5kmPIcJyrPh6kzqprW6Pu5+wMwOhgRoWNKxVMHDpvFF2r9rjx44/kSMhwYAoFxWe3epe6bkJ6zWajp+5+53ZolvxU1D79B9S9+qedvPD/6s/m75H5veB4lPsX5z6Jf0J0t/HbsZAIBaSjRMlTd2dQcAoAsUPuH58SP5T3i+6oZSTHhmV3cAALBeiZam5y3vOj8AAAClRvLTB158zyWxmwAA6DY9vNQ987BXWLH1gXB1tyS5+1TVOQclLSpUdw5bVbQcj2wu/PKzsZsQ3Rcu2KsPvfRQ7GYAQPdg2KuhaUmH3f1QSFrGQrIjSTKzaUmL7n40JD27q+r+NIzPw61D78zz7jL56NC1sZvQl0h8AAAVeSQ/o0o2I61YlJTe5GSyUtcnmJV0oI34ht6+/S1Nz7ln6Zut3l1Nl279mbWfRy7INoR019IjuuCnzs90HwAAdFwP7+2VOflx9yurkpsRhcKFYR+vastKJTuN4lvx7ZPfb6/BG/C90/+09vPCS9mHkF76bz/WqZsuy3w/AACgfblOeA7DVXOpOT2DSpKdtOq9vhrFp2+bNLN5M5tfXX25aVumhq5rveERbLvvGYbAutB7dl4RuwkAUAj313K/lEUudX6qJi0fS900UOP05UpMqPDcKH5NSIgOSa0VOZxe+npLbY/prqVHYjcBbfryiadiNwEAilGiYaq85ZL8hCTmkCSZ2REzO+LuNyjp5RmsOr36eqN4AACAXGUa9jKzgRors2YlVVZzLWt978+AlCQ8LcQDAIAYerjOT9Y5P6OSpsOwVcXaz+6+oPVzfAYlzbUSXyaPbb8qdhMAAEAOMiU/7j4naaoydycYl5Texf1wVV2fcUkzbcSXwtUnHy/kce7dvreQxwEAoCGWujd01MwOhsu0pNl0hWZ3PyBp2MwmwhDXsaql7Q3j+83NJ5NifFdvvzRyS4Du16wu179n9V6hrt/xb1s6723bhjvcktbbkqesdeKQH3PPfcf6jmtltVc/+pk3XKB/+ueXYjejps9duFe/8SJVlgFgo1595Xkr8vF+Mnd37t+15439eqHPoZ5cVnuhHMqa+Egi8QGAblOiYaq8sas7AADoK/T8AACA9Uq0ND1v9PwAAIC+knvPj5nNhBVe6WMHlezWPiitbVXRcjwAACgYc35aE5aqD9c4tujuR0PSs7uq7k/DeAAAEAF1fpozs5E6N01W1fWZlbSuZ6dBPGqg4jQAABuTZ8/PqJLEZk2dhGZZ0lgr8aivqIrTn9lBxWkA6Evs7dVYGMY6XOOmQSXJTlr1Xl+N4tGGt2x9U+73+bEXqM8DAOgtmZOfsCnpStX+XBW1NildTsU1i08/zqSZzZvZ/Orqy1mb3ZO+f/qHsZvQss9dSI8SAJQac34a+kDYoLSWFYUVXinV1xvFr3H3Q+4+6u6jmzZt3kg7USJUfM7XR4eujd0EAL2GYa/awpyeRonLstb3/gxIkruvtBAPoAV3LT0SuwkA0DWy1vkZlDRmtrZP2R4lO7gflHTU3RfMrHo4a1BnEp5m8YsZ2wcAADaiRMNUecuU/IThqrWeGzOblDTs7nemTjtsZhOp5e7jkmbaiAcAAMhNnnV+JpXU7xk2s+nKhOZQrXnYzCZCj86xqro/DeMBAEAEPTznx9w9dhvads65b+y+RgMAkMGrrzxvzc/Kz0/+/Hdz/6497/3/qdDnUA8bm6Ku8R2/GLsJAIBYenipe+4bm6J3zL7wN7GbAACIpUTJSt7o+QEAAH2Fnh8AALBeF84JblXm5CfsyzUu6Ug4dIOk6XSNnrDKa1GhurO7H2onvpYX33OJLvzys1mbDwAA+kwePT+DSnZpn5S0IOnWqsRnWtITleXtYRl7uu5Pw/h6SHwAAOigHp7zk8uwl7vvbnDzpLtPpa7PSpqStFbrp0k8AAAoWg8nPx2d8Bz27qq2rKSnBwAAoHC59PyE6szLWj+nZzAcT6ve66tRPDrsJ0uP6Dx2BAcAVCtRRea85dHzMy9pzt2PhqTlyjCJWVq/o7sUkqHU9hWN4teY2aSZzZvZ/Orqyzk0G5J03tC1OnXTZbGbAQBAYTInP+6+UDVBeVbS7eHnFYXenJSzrjeJT593yN1H3X1006bNbbXx3+18W1vn95tt9z2jT+26PnYzAKArfGbH3thNKEakCs9mdjDsBzoZRoZaZmYzrZyXOfkxs+r5OyuSKnN9lrW+96ey4elKC/G5+MsT38nz7nrSJ48/HLsJANAVPvbCQ7GbUAz3/C9NhBXii6nRoN21RoMaxA63cm6m5MfMhiXNVu3APqCkpo/cfUHr5/gMSpprJR4AAPSVyVQpHCkZDTrQLKjOAqu6MiU/YbjqQKUXJ7hR0nTq+uGqrG1c0kwb8QBa8IUL+qQrHkAxCh72yrhCfFRJotSSPFZ7zYUKzpK0TdJserWWux+ojN8p6Y46VpXVNYxHHKwC6z4feqlPuuIB9KqWVohXC/nFYSUJUEsyJz+h9+bOJufUvb2VeOTrt4au1R8vPdLwnPOGrtV7dl6hL594qubte7b/nJ44+V/rxl+9/VI9dvJ7mdoJAIioA0UOwwTm9CTmQ6kOj4YrxKtGiSr3NyBpxd1XzKzldrCrex9qlvhUfPnEU7p3e+2hlEaJjyQSHwDAOumV2+GSHulpukK8hg+4+1y77SD5QUM3n2QoBSjKh4euid0E4Axfzf/SWNMV4mlhjlDbiY+UU4VnAEB2n196NHYTgDW+2nxpeq6P575gZnVXiNcwKGksNdy1R9JwmEd8tNEm6fT8oK7xHb+44dg9238ux5YAqOV3ht4VuwlA3uquEJeSEjmV2919zt3vrFyUrPZaCdcblswh+UFdsy/8zYZjm80JApDdHyx9I3YT0MsiVHh29wNKem8mQg9O9QrxCdWo+xMmUldip6vqB65j3kLFxWbCg9wu6Vg4NB8KHFZuP6ikcGHNjUubxVc759w3FtsX18C92/eWZl7MW7a+Sd8//cPYzQAAdMCrrzzf+nKmHPy3u3879+/an/r1Pyr0OdSTx/YWA5KOuPtUKqm5PXV7w1LVzeLLbqOJTyc2EyXxAQDkpvgJz4XJY8LzPUqNxykpNJSenDTp7lOp67OSpiRVurGaxfekbfc9E7sJAADUV/CE5yLlMednQtJCmIQ04u4rlYlGLZaqrhuPfD22/arYTdCDW6kaDQCIK+vGppXkZiR17EhqolHDUtUtxKcfa9LM5s1sfnX15SzN3pBeWL109cnHM99H1tfhfafrF1h88/k7Mt13M9dd+Asdvf9u0Qvv5aK9ZeubYjehZ/F3WWIRJjwXJWvPT2Xr+EV3XwyTlO9XMpQlNSlV3UL8mnRVyE2bNmdsdvtYvZTo5OvwDz9+oWP3LUlff/FvO3r/3YL3cvuYT9c5/F0ihqzJz6KUFCaqOlaZ0NysVHWz+I76P3axC3Zs/A4AoKR6uOcn64TnWrutrkhrPTsNS1XXqOR4VnytctZ5+t+Pl2OJej/jdwAAJZVDKZyyytTzEyYmr5jZcOrw2g6roUenbqnqZvFZ2taq3xz6pSIe5iwXb9lZ+GMCAMrvg0PviN2EvpDHaq9P6+zVWzeGYxUNS1W3EN9Rf7L010U91JrnfnSi8McEAJTfny19K3YTzujhYa/MyU/YT2PAzA6GSs6nwrHK7Q1LVTeLBwCgm3xq1/Wxm4Amctneomhl2t4CAIAiFL69xe/fkv/2Fh//097Y3qIb/MquK2M3AQAAlERfJD9/cfzJ2E0AesIdOylNUEa/M/SuqPHoUT28txfDXj3kugt/gYJhANCjCh/2mv5w/sNeU59n2Av5IvEBAKC5zMlP2ItrLGxMOpC+pM45GFZ7TZrZZLvxve7t298Suwm5uvbCn4/dBAAoTK/OK/XV1dwvZZFHz8+IpFlJxySdTl3GJMnMppXs3XXU3Q9J2l1V96dhfD/49snvx25Crh558e9iNwEACsO80u6TR/Iz4+6WvkiaStXymUzX9VGS6BxoI77n9FpPDwCgB616/peSyLq3lySdlaSY2cFKkUIzG6lx/rLO7tWpG9+req2nBwDQg0q0OitveVR4Xqz8bGZjCvt2BYNKkp20s/bsahKv1G2TZjZvZvOrqy9nbTYAAOhTea/2OhA2M62oNWl5WVrb9b1Z/Bp3P+Tuo+4+umnT5hyaCgDl8NGha2M3AXV84YI+rm3Vw8NeuSU/YRLzE1WHV5T0/qRVX28Ujz5z6qbLYjcBKNxdS4/EbgLq+NBLD8VuAjogz56fA5Kqe22Wtb73Z0CS3H2l6nitePSZbfc9E7sJQDT3bu/jXgaUD7u6t2RMVfN7whBWdZIzqNrzetbFA0A/ufkkvQwoEYa9GkvN36lOdCTpcFVdn3FJM23EA8jgV3e9PXYTAKBU8uz5WVSNnht3PyBpOFR4PijpWJ0aPjXjAWTzxePfjt0EZDS39ZrYTUA/6uGNTXNJftx9xd1315jHU7n9zlDh+c5Q5bmtePQ35kF0D35XnTF2+tHYTQB6StdubPrgVpaG9oubTz6kx7ZfFbsZaAFzVoAewpyf8nnfaZaG9pOrTz7OMngAQC66NvlB/9l23zMMqwBAQdjVHSgJhlXQyHOXXxq7CUDv6OFhrzw2NlVYxVWZrDxQvTFpuH1Robpz9aTnZvFALZ/ZsVcfe6EcydDk0Dt1aOmbsZvR9y5++nuxmwCgC2Tu+answh723jokaS4kM5XbpyUthtVehyTtTtf9aRYP1POxFx4qzRLgLIlPWZ4DAJylh3t+8hj2ujF9JVR13pM6NFlV12dWyVYWrcYDNc1tvUbffP25sZuRWS88BwDoJnkkP8tmdqRyxcwmJd0ffh6pdb6SrSyaxgONjJ1+VJ88/nDXT4L+5PGHYzehUO/dWetjAUDpUOSwoQOSRszsdBiuWk719AxqfdXmWhua1osHmmISdHf50gn2Lwa6AsNe9bn7opK9uuYlTevsIavqHd2lkAxV9vNqEr/GzCbNbN7M5ldXX87abKDUpoaui90EAOhZeUx4npE05+7jSjYtnUwNY60orPBKGWwjfk2YED3q7qObNm3O2uy6/uPQuzYUNzn0zpxbgn42vfT1Qh5no+93AL3PVz33S1lkWuoe5vSshEnKcvc5M7tY0nPhlGWt7/2p9PistBBfuD9c+saG4ljmjG600fc7AHSzrHV+BiWdSh8ISc1c+HnBzKrn+AxKmmslHgAARFKinpq8ZRr2cvc5JUNVa8JcnsXUocPpuj7h/Jk24gEAQNFWV/O/lEQeFZ4PhEKGxyoH3H0q9fMBMzsYEqBhSceqVnM1jEc5jVxwiRZeejZ2Mwp3zfZL9ehJqggDQDcz9+7r1jrn3Dd2X6MBoA89uPVave/0I7Gb0RNefeV5K/Lx/vk335P7d+0b/uTLhT6HetjYFADQMSQ+KKNcNjYFAAA9pocnPJP8AACAdbpxWkyrGPZCVAtD7PMEAChWLj0/qdVau5Ws5jpUdftBJcvXB6WkWnM78ehdI0vs8wQApdTDw155bG8xK2k2bD8xJelKMxtL3T4tadHdj4akZne67k+zeACI4d073hq7CQA6JFPyY2bDksZCscKKWUnpOj2TVXV9ZpXs5N5qPAAU7msvfDd2E4C42NW9rloTNhYljUpre39VW5ZU6dlpGA900keHro3dBABABFmTn1oTNgZ1ZjPTQSXJTlp6r69m8UDH3LVU7voj792Z72Twq7dfmuv9Aehtvbyre9a9vRYlLVT18IxIa3t01Upiliu3txC/xswmzWzezOZXV1/O0mygK3zpRL6TwR9jWw4A7ejhYa88Vnvtk3R7mL8jhU1Jw+7sKworvFKqr9eNT58UJksfktjeAii7haERVvIBKK3MyU9IUtYmKIeVXJVPvWWt7/0ZSMU1iwfQhUh8gB5Qnk3Yc5fHUvfhqkPjkmYkyd0XdPYcHynp+Vlb3dUoHgAAIG95VHh+sjJnJ8zTGa0qUng4XddH65ObZvEAutxzlzPZGug2vTzhOY85P7dKGjWzUUm73f3K9I3ufsDMDoYEaFhJBeejrcYD6H4XP/09PXf5pbr4aSZdA12jRMlK3vKY83O0hXPuzBKP1gxv2aXFHx2P3QygJhIfAGXBxqY9hMQHWTy4laKPAFJWO3ApCZIfoKQ+MXRdoY/3vtPlLvoIAHkh+QHadOqmywp5nDuWvl7I4wBALb084ZnkB2jTtvueYV8wAL2vh4e9mk54DnV4JiRtc/d1u62b2UElVZkHpbVKzLnFA2VU9n3BAAD1Nez5MbMxJXtt7VaNfbrMbFrSorsfDUnL7nRNn6zx/eK36EXouKLnz/S6haF8N10FUD59O+zl7nNhKXp1leaKyaql6rOSDuQV3y/+mF6Ejuvn+TN57w4vsX0FgO624Tk/VTuxVyxLGisiHvjg0DtiN2HNu3e8NXYT6spjd/gbdu3JoSVAvu7YuTd2E3pbD8/5yTLheVBJspJWr4enE/Hoc3+29K3YTVjztRe+q/8wdHXsZnTMkeNPxG4CsM4nTjwUuwnoUlmSn3VzeBSSmbBHV67xZjZpZvNmNr+6+nJbDQU26ld3vb3lc//L0mP6pQuLWQYPAJ3mq/lfyiJL8rOisEIrpfp6bvHufsjdR919dNOmzW08DLBxXzz+7bbO/+sXn9FPmMMFoBcw7FXTstb33gxIkru3MnyVNR4opfNYvQcApbbh5MfdF7R+js6gpLki4gHUxh5dAPLAsFd9h6vq8oxLmikwHkAV9ugCgMaaFTkcCYUIJySNmdl0eom6ux+QNGxmE6FS87F03Z6s8Sg/igf2B7bzAPpQD8/5MffyVFxs1TnnvrH7Gg0AQAavvvK8Ffl4J8evy/27dvvs1wt9DvU03dsLAACgKO3s+RlK43wgXN0dzl+3j2g1dnUHCsBeWAC6TYwJzxvY83Na0uFQDmdKyRSbg80eh+QHKAB7YQFAS9rd83NUZ2+LtSip6X48DHsBAIB1il6avpE9P939yqpDI0p6gxoi+QEAAOt54XOTM+35GYa75hrNEapoOuxlZsNmdjCMwxV+O/JThuJ3925nF2YA6FfpfTrDZTJ184b2DDWzgdT9HGulHQ17fsxsLDRmd4zbka8yFL+7+SS7MANAN+jEsFfolanXM7OhPUPDlliHJMnMjpjZEXe/oVFMw+TH3efCne1RjYys07cDAIC+0daen6E3aNLd70wdnlULO0Ww2gvI0a/uenvsJgBALnzVcr80fLz29/wclTRdNSTWUkdK1yQ/6XHC1dWXYzcHqOmLx78duwkA0M0a7vkZ5glPSGujR1NVvULjktI9QTV1zWqv9Dgh21sAANBZMXZhd/cDYRHUhKRhrd/zc0JJglM5djRV1HCbpNmqYbCauib5yeKmoXfovqVvxW4GAABdw4tf6h4et37yEm67M3V9US309FTrmmGvLEh8gPg+u4MyBwDKoS+SH6CflWUS9kdeoMwB0E1i7O1VFJKfBj46FL8oIJDVsv9L7CYAQKk0TH7MbCRUXp5QslPqdHrvjU7fHttdS/GLAqI3fWrX9TWPZ+ml+eWdl9c8/pUTT2/4PjdicuidhT4egM4oeql7kcy9+xZOsdoLANBvXn3l+UKzh38c3Zf7d+3Pzn+1FBkQw14AAKCvkPwAAGr6wgWs0OtnvTzsRfIDdEivTpjfv2tP7CagIB96iRV66E0kP0CH9OqE+TfbebGbgC5Qb1I/ukdf9/yEfTQOhlVZ1bcNhNsOhm3kJ/OOB9BY0V8yf7j0jUIfD93pk8cfjt2Edei1bI97/peyaLi9hZmNKdkhdXedU25396nU+cfMrLIPV+Z4AM2V8UsGKKMHjj8RuwkoiYY9P+4+FzYUq95iXmEL+eGqwzOS1pKZrPFALfXqyHzuwt6YnMlwAYAy6OthrwYGlRQmTCcwK1qf0HQqHn3q0NI3ax7/jRd7Y3ImPTkA0Fkb3tU97KS6terwuKS5TsSH+UCTkmSv26JNmza31V4AANC6WLu6FyG31V5hGGtMGxy2ahbv7ofcfdTdR0l8UO3DQ9fEbkKpPLb9qthNAIDSynOp+z2S9rn7QqR49LHPLz0auwmlcvXJx3Xv9t6YAwUgDnZ1b8LMDkqa2WjikjUe6ITP7Oju5OHmkw/pPTuviN0MAF1q1S33S1lkTn7MbELSgrvPhetjRcYDnfKxF1qbQP3enSMdbsnGffnEU3rL1jfFbgYAlEqm5CckKoOS5kMxw2Elk5YLiQfK4Esnyt1h+f3TP4zdBABdyN1yv5RFw+THzEZCZeYJJcvSp81sJNw2IGlWSW3dgvllAAAgAElEQVSe05KOhctwXvFAP/tslw+7AUBZmZep3nSLzjn3jR1p9MgFl2jhpWc7cddAKbxn5xX68omnYjcDGXxmx96Wh2TRW1595flCu06+93P/U+7ftZf+1/+3FN0/bGyaQuKDXvflE0+xDL7LkfigKL28txfJD9Bnrj75eOwmAEBUG67wDAAAeleZ9uLKGz0/PeTN5++I3QR0mf8wdHXsJgBA4Zr2/ITl5xOStrn7VNVtA5I+EK7ulqQa52SKR+v+4ccvxG4Cusx/WXosdhPQAyaH3ll3w2F0rzIVJcxbw+Qn1OEZUEhMapiWNOXuK+H8J83soLvfmUc8gNZ8dsdefYSJsIiExKc3lakuT94aDnu5+5y7H5W0UueUUSWbkVYsStqTVzyA1pD4AEDrMs35cfcrQ3JTMaKkcGEh8UC/e3DrtbGbAKBHsdS9BWFz0jl3PxQjHuhH7zv9SOwmAEDXyWNj0wEzmwxXj3Uq3swmzWzezOZXV1/eSFOBvsHWGACyYlf3Btx9xd0PhUnKe8zsSCfiwzmj7j66adPmrM1Gl9u34xdjN6Fw12y/dO3nG3Y1nhrX7XOA+vH3C6A4G05+Qo/NwarDs0qWtXc8Hv3tqy/8TewmFO7Rk99b+/nI8ScitqTz+vH3C5RN3+7q3sSopOlQq6dioN7JHYhHlV8YfHPsJgAAegQTnmtw9zmlavQE45JaqtGTNR7r/e3yP8RuAgAApdesyOGIpBsVhqLMbFrS/e6+EE45mhq62iZpNl2gMGs8AACIo0wTlPNmXqZ+qBadc+4bu6/RAABk8Oorzxeajcy/6Vdy/64d/eFflCKjYld3AACwTpkmKOeN5AcAAKzTy8NeuVV4RmsoPgcAQFz0/BSs24vPAQD6Qy9Prm3a82Nmw2Z2MKzUanbuTN7xAAAAeWq21H1MSeHB3c3uKCQ3w3nGAwCAOHp5zk/D5CcUIpSZ7VGD6suhnk/u8QAAII5eXu2V14TnUSX7csWKz+z6Hf825sOjC3zrwsabiQKSNL2TRQ1A2WVOfsxsQtLhWPF5efiF/y92E1By73ixtzcTLaMvXNB9icTUCRY1oDesduBSFpmSn7Ap6UrV/lwdiTezSTObN7P51dWXN/JwALrMh14ikQCQv6w9Px+ozOvpdLy7H3L3UXcf3bRpc4aHRD1zW6+J3QSgoU/tuj52E4C+4bLcL2Wx4eQnTFLecOKTNR75Gzv9aOwmtK0bh0Wq9cJzKMonjz8cuwkAekCWIoeDksbM1jK5PZKGwy7tR919scPxQE8Mi/TCc2jmse1X6eqTj8duBoA2rPZwlcMNJz9huGqt58bMJiUNu/udRcQD6B4kPkD3WS3RMFXeGg57mdlIKD44oaSXZrpWTZ6QuBxQ0nMzHSYyZ44H0HkLQ5TZAtBfzL37+rXOOfeN3ddoAF3lnz9/s97w4XtjNwNY8+orzxfaFfPVHTfm/l2774X7S9GdxK7uAFADiQ/Qu0h+AETx0aFr1x377A5WvgFlQZFDAF3vwa3rk42Y7lp6RD9ZeuSsYx95ofdXvgHdgjo/AApVq1ckq/edfqT5SQU7b+jajjxXAGiE5AcoobuWypeodMpdS4/o1E2XxW4GgCp9PexlZsNmdjAsWa++bcLMZsxsLFxmzGw4z3igH333zZfHbkKhtt33TOwmAOgjDYscmtmYpAFJu+ucMihpTNKkpAVJt6YrM2eNB/rVW//h6dhNANDnytRTk7eGyU9l01Ez26Mkial1Tr3EJnM8AACIo0wTlPPGnB8AANBXsmxsKmlta4plJUNYcvdDnYgP501Kkr1uizZt2pyh1UBvWBga0cjSQuxmAOhBq73b8ZM5+ZmXtFKZpxMmLE+4+9G840NSdEhiewugopXE55KBIT27slRAawCgO2Qa9nL3haoJyrOSbi8qHmiGGjKqm/jw2gBoZFWW+6UsMiU/YTVX2oqklreIzhqft2sv/PlYD40O6ad6Oe3itQHQrzac/IR6PLNmll7FNSCppaXqWeM74ZEX/y7WQwMAUCregUtZbHjOj7svmtkBd19JHb5R0rpihp2IBwAAndO3dX7MbERJQjIRrk9Lut/dK7Ms58zsYPh5m6TZ9GqtrPEAAAB5M/cydUS1htVeAIB+8+orzxc6Y/jorpty/66dOH5fKWY9U+QQubt16J2xmwAAQF0kPz3kLVvfFLsJkqR7lr551vUHt7KkGp3D+wvojF6e8Ezy00O+f/qHsZtQ0/tOs6QancP7C2XwhQv2xm5C7lY7cCkLkh8AADL60EsPxW4C2tB0qXuoxzMhaZu7T9W4fUBJVeZj4dB8ajVX5ngAxfjg0Dv0Z0vfit0MACXRt3t7hQrMA5J217l9QNIRdx8P1yeVJDI35BEPoDjdkPiwkSvQ+0IJnEW1sGF6yCMmw9U9arFkTsPkx93nwp3vUZLEVLtH0kzq+mFJc3nFA2Xw2R179ZEX6NIuAxIfoDgx9uIK9QCfqGxwbmbTTTZMvz09qmRmx8ysYcIkZZ/zMyFpwcyGzWzE3VeqNirtdDzQcSQ+APpRpNVek1WJzqykA7VODL0+w1WHZyStm2JTLcveXpUNSEdSx45U7dWVW7yZTZrZvJnNr66+vNFmAz3j1E2XxW4CAOQmlRekLUuq3gS9YlDSWJhbXLGi9QnROhve2yt154uV3hozu1/JUFYrc3baig9dWIckKjwDkrTtvmdiNwFAD4sw4XlQSbKTtlLrRCnZI1TS1qrD42ph+kyWYa/F8OALVccmCooH0MW+++bLYzcBQMHSozjhMpm6udbIz3KIazqqFM4ZUwvDXll6fmplYyuVBlTt1t6JeABd7K3/8HTsJgBooBNFCdOjODWsKKzwSqm+3sg9kva1Ui5nwz0/obtppWqsbUDSSiuJS9Z4AADQU5a1vvdnQJKa5QVhefxMq3UCs672+rTOnoh0YzhWVDxQGp8Yui52EwAgN0Wv9gqJS3WSM6gmc3jMbELSQqq8Tr0J0msaJj9mNhLW3E8omVE9nZ6N7e53Shows4Mh6zoVjuUSD3STO5a+HrsJaNFPltgPDGhm1fK/tOBwSGYqxpWqBxhK40ykro8pSZDmw23DIaYhc+++hVOs9gIA9JtXX3m+0PVX//lN/2vu37W/9sP/q+lzSFV4HlYyFeZQ1W3j7j4eJjifrnEXR9294arzLBOeAVT51K7r9cnjD8duBgBkFmsX9kYjQOG2O8PPK9LGylCzqzuQIxIfACg/kh8ASPmtoWtjNwEohdUOXMqC5AcAlAxZStIf15kM/ZkdewtsDRCfW/6Xsmia/ITZ0wfDqq3q246Y2Vg4ZyB9ySseAIrwyeMPN1wF9jE2uAV6RrOl7mNKNh7drdplp0eU7Lh6TMmM68plLI/4djy4la5qANmcN3St7t1ODw8g9fGwl7vPha3l61VWnHF3S18kTVW2o88a3473naZuB4Dsbj5JDw/Q67LO+TkrSTGzg20WKcwaD6DL/PPnb47dBAAt6Nuen2bC/lyS1oa4mm4jn2c8gO7zhg/fG7sJLaMSNPpZ0dtbFCnP1V4HWt1QbCPxZjZpZvNmNr+6+nKGhwGA1pw3dO3aKjAAvSOX5Cfss/FEJ+Pd/ZC7j7r76KZNmzf6UADQlk8ef1gfpfZPT3jvzpHmJ2FNpL29CpFXz88BSZl6fTLGA0DH3MXwV0/40gm+ZpDIK/kZk7QcMR4AAOSolyc8Z97YNFWQsN5y9o7GAwCA/JUpWclbw+THzEYk3ShpIlyflnR/jYnJi6rRc5M1HgAAIG8Nk5+QpCxImmpwzoqSCs65xwMA0Avmtl6jsdOPxm5GW8q0ND1vbGwKAF3ise1XxW4CNqjbEp9eR/KTsn/XnthNAIC6rj75eOwmoI+w1L1PPHB8w6WKAABAlyD5AQDk4gsX7I3dBOSor5e6m9mwktVa29x93cRlMzuoM8vUB6o3Js0aDwDoDh966aHYTUCOennCc7Ol7mOSBlRnNVb1LuxmNpI+ljUeAAAgbw2Hvdx9zt2Pqn4Bwhurzl+QtCd1PVM8AAAx/PPnb47dhOhW5blfyiLrnJ9lMztSuWJmk5LuLzAeAIB1Prsj2/yjN3z43pxagjLKmvwckDRiZqfD3J3l0NNTVDwAAOt85AXmH2XVyxOeMyU/7r4oaUbSvKRptTlk1U68mU2a2byZza+uvrzxRgMAgKa8A5eyyJT8mNmMpDl3H5c0LmkyPYyVZ7y7H3L3UXcf3bRpc5Zm95z37hyJ3QQAALrGhpOfsGnpSmWTUnefk3SxpLEi4nHGl05U7xPbnT449I7YTQBK46ND18ZuAlI+tev62E0oHMNetQ1KOpU+EDYpnSsoHj3mz5a+FbsJQGnctfRI7CYg5ZPHH47dBORow8lP6KkZTx8zswFJi0XEAwCAzunlvb2aFTkcUVKLZyJcn5Z0f2WoStKBcOxYJSZdxTlrfGxTQ9dpeunrsZsBAEDhylSXJ2/m3n1P7pxz39h9jQYAIINXX3m+0L6T/+2i/yX379r/8+//71L0/zTd2wsAAPSfXu5lYFd3AADQV+j5AQAA65RpaXre6PkBAAB9pWnPj5kNK1mtta3WSqzUaq3dko65+6E84wEA5TK39RqNnX40djPQYb282qvZUvcxSQNKEpNat89Kmg41e2RmM2Y2lrqeKR4AUD4kPv2hd1OfJsNe7j4Xdllfqb4t9OhUJyqzkqbyigeAfvXY9qtiNwHoWVkmPNfaTXNR0mhB8QDQs64++XjsJqDPMeG5tlq7aQ4qGeYqIh4AAKBtWfb2WpS0ELawqBiR1vboyjXezCbNbN7M5ldXX95oswEAQAtW5blfyiJrnZ99km4P83eksClp2J091/iwCuyQxPYWAAB0Wi9/0WZKfkKSkt7IdEK1h7M6Eg8A/eSx7VcxFwjIQaYih6kem4pxSTNFxQNoz2d27I3dBGRw9cnHdeqmy2I3A31itQOXssha4fnJypydME9ntM0ihVnjAbThYy88FLsJyGjbfc+QAAEZNStyOCLpRiUVmivVmO9398rQ1K2SRs1sVNJud78yz3gAwHrb7nuGITB0nPfwrB9z774nx4RnAEC/efWV563Ix/vIRTfm/l372b+/v9DnUA8bmwIAuhpz2dCurEvdAQCIirlsnVGmujx5o+cHAHoAk6CB1tHzAwA9YNt9z8RuAnpM7/b70PMDACjYi++5JHYT0Oea9vyE+juT4eoeSbPVtXjM7KCSrSkGpbWtKHKJBwD0lgu//GzsJqAFvTznp5Vhr9vdPb0FxTEzW0tQQu2eJ9z9aOW6mU1UrucQDwAAClamisx5azjsFXptqregmFFqPy5Jk1WJyqykA3nEAwAA5K3ZnJ9BSWNVe3CtKCQ0la0pqixLGsspHgAAROAd+K8sGg57ufuipK1Vh8clzYWfB5UkK2krecWnmdmkwtwhe90Wbdq0uVHTAQAAamprqXsYxhqTtC8cGqhx2nLlXHc/K5HJEh/mCB2S2N4CAIBO69s5PzXcI2lfamPSFYUVWinV1/OM73qfpQw7AKAL9PKwV8vJT1iOPpNKXKSkl6a692ZAkmr0+mSK7xUf6WAZ9rdsfVPH7htxsXcRAOSnpeTHzCYkLbj7XLg+JkkhkalOUgZ1Zk5PLvFozfdP/zB2E9Ah7F0EoGirHbiURdPkJyQqg5LmzWw4rNwaT51yOCQ3FeNKlrPnEg8AAJCnhhOewwTl2XA1nZCs1eVx9wNmdjAkMMOSjqUKFmaKBwAAcax6eebo5K3ZUvcVSdbsTtz9zk7EAwCAOHo39WFjUwAA0GfaqvMDAAD6Qy9vbErPDwAgs/279sRuAtAyen4AAJk9cPyJ2E1AzspUlDBvTZOfsGJrMlzdI2k2bDWRPmdY0oSkbe4+lWc8AABAnlrp+bk9nZCY2TEzq+y1VanjMyBpd4fiAaA0Vn77Kg380eOxmwF0XJmKEuat4Zyf0GszXHV4RtJaMuPuc6Euz7rtKLLGA0DZkPigX6zKc7+URbMJz4OSxsKwVMWK1ic0nYoHACB3c1uvid0ERNSsyOGipK1Vh8fV4t5bWePTzGxSYe6QvW6LNm3a3O5dAAAgSRo7/WjsJpReX094TgvDWGOS9m3kwbLEhzlChyTpnHPf2Lu/EQAA0FHt1vm5R9K+sBv7RmSNBwCgUF+4YG/sJkTRy7u6t9zzY2YHJc1sNHHJGg8AKLfnLr9UFz/9vdjNyN2HXnoodhOi8Egbm4Z8YVHJvGFVl8epcX7b5XJa6vkJO64vuPtcuD7WSlxe8QCAcvno0LXrjjVKfB4YvK6TzUGPMLNpSYvufjQkPbtDDlHv/DFJI0rK5Qy0+jhNk59wx4OS5s1sOGRY460+QNZ4AED53LX0iE7ddFnL5+9f/noHW4NOiLTUfTKUv6mYlXSg3skbLZfTSp2fWSW1eU5LOhYuw6lzRkKmNqFkWfu0mY3kEQ8AKK9t9z2jx7ZfFbsZpbby27w+rarz3b+sZKFUrpotdV+RZE3OWZC0oFThwrziAQDldvVJij420s1FMSNMUB5UkuykdaQAMru6AwCAdbwD/5nZpJnNpy6TqYesNWdnWVobScoNu7oDAIBCpGv21bCisMIrpfp6Luj5wVkYvweQRSc+Q5g3E0eECc/LWt/7MyCtTaPJDckPzsL4PYAsrj75eO4JUDfPm0Hrwhzg6iRnUBvYEquZpsNeYZytMia3R9JsuuBQp28HAHSXSgLEP6a6W6Qih4fNbCK13H1cyYpxSWsFDUeqlsO3rZU5P7enKyaa2TEzS1dc7PTtANDXpnfu1dSJ7qoyTOKDjXD3A2Z2MBQ2HJZ0rCrRmVCSEB2V1pbH3xiOV4ok3t9sN4mGyU/olRmuOjyjZFn6oU7f3qhtANAvui3xQW+ItReXu9/Z5LY7U9c3VC6n2ZyfQSWFB9MJyorOJCydvh0AAETQiaXuZdGsyOGipK1Vh8cVJh91+nYAAIC8tVXnJwxTjUnaV/TtoRDSpCTZ67Zo06bN7TQdAAC0ocW9uLpSu0vd75G0r8FEoo7d7u6H3H3U3UdJfAAAwEa13PNjZgclzdRLXDp9OwAAKE6kpe6FaKnnJyw5W3D3uXB9rMjbAQDl9tGha2M3ATmLUOG5ME2Tn5CIDEqaN7PhsDJrvKjbAQDld9fSI7GbALSslTo/s+HqTOqmo0XcDgBA3p67/FJd/PT3Yjej9Mq0ND1vzZa6r0iyWLcDAJA3Eh+0tdQdAAD0h9UenvBM8gMAANbp3dSn/To/AAAAXY2eHwAAsE6ZlqbnrWnyE1ZkTYareyTNuvuhqts/EK7uliR3n8orHgAAIE+t9PzcXpXMHDMzpRKYaUlTYeWWzOxJMzuY2pI+azwAoGQ+u2OvPvLCQ7GbgQ7q5Z6fhnN+Qq/McNXhGUnpnplRJZuRViwq6eHJHB/b9M69sZsAAKXUC4nPg1upSt2vmvX8DEoaM7Nhd18Mx1aUSmjc/cqqmBElvTl5xEc1daL7/7gBALW97zRVqRvp27293H3R3bemEhcp2Xpirtb5YXPSucqQVtZ4AGd7YPC62E0Aonnu8ktjN6Gv9PLeXm2t9grDWGOS9tU4Xpm0fKwT8WY2qTBx2l63RZs2bW6n6UBP2L/89dhNAKKhMjPyYu10a5nZEUmfdveFJufI3W/IO77inHPfWJ70EQCAArz6yvOFbge1Z+hduX/XPrH0jVJsadVykcMwJDWTTlzMbCAcT5uVNJF3PIA4PrXr+thNAIBctZT8mNmEpAV3nwvXK6uzRiVNh2GrioG84wHE88njD8duAoAI3D33S1k0TX5CojIoad7Mhs1sWMmkZYVkZq1GTzAu6c684gEAQPF6ecJzwzk/oUfmdI2bjlbm5IRkpjJMtU3SqUqBwqzx9TDnBwDKZf+uPXrg+BOxm9HTip7zM7Lrl3L/rl04/telmPPT1oTnsiD5AQD0m6KTnyt2vjP379qnTnyzFMkPu7oDAIC+QvKT0UeH2iuPfuvQOzvUEgBAp7T7Wd8L+nbOT1kx7AUAqOcnS4/ovB5MVooe9vrFnVfn/l37NyceY9gLAIC89WLig3yR/KTs31WKzeQBADl4bPtVsZvQ1Vbdc7+URSt1fgbM7GC4HAl7bDU6fybP+CKxTBNl8OBW/tUK5OHqk4/r3u17YzcDJdTKxqa3u/tU5YqZHTMz1dp53cymJQ3nHA/0lfedfiR2E4CecfPJh7pmDtDKb1+lgT96PHYz1niJJijnrWHPTyhSWJ2MzEiaqnHuSN7xAABkdd7QtTp102Wxm9FUmRKfXtds2GtQ0liowlyxotq9M6NKNiXNMx4AgMy23fdM7CZ0nb6d8+Pui+6+1d0XU4fHJc2lzwsblx7OO77qnEkzmzez+dXVlxudWnpv3/6W2E2IijktAFB+3oH/yqKVOT9rwjDWmKR9VcdW3H3FrPHy/SzxYY7QIan76/x8++T3YzchKua0AABianep+z2S9rn7QurYB8Lu7EXEAwCQ2ad2XR+7CaXXt8NeaWZ2UNJMOnEJk5RbSlyyxqOz/uddb4/dBAAozCePP7yhZfAvvueSDrQGRWtpe4swJ2el0kNjZmPuPmdmY5LSq7T2hOszko5W5vpkja/W7cNeAAC0q+jtLf7N9itz/679wcknS7G9RdM5PyFBGZQ0l1q1NS5pLiQzc6lzJyUNu/udecUDveix7Vfp6pMsawVQXmUapspbK3V+ZpX0xJyWdCxc1i1VD4nLAUnDZjYdKjtnis/yxIAyI/EBgHjY1b3HPLj1WlZT9Zl7t+/VzScfit0MoC8tDI1oZGmh+Yk5KHrYa/iCK3L/rl186alSDHuR/KAlIxdcooWXno3dDADoWyQ/+Wmrzg/6F4kPAPQX99XYTegYkh8AALDOaokqMuet3SKHAAAAXa2Vpe4DkibD1T2SZsNWE5XbJ5QsXT8SDt0gaTpV4ydTPAAAKF43zgluVSvDXre7+1TlipkdMzOlEphBJft1TUpakHRrVeKSNR4AUIAvXLBXH3qpnCsH57Zeo7HTj8ZuBnpEw+Qn9NpU1+SZkTSlsMmoJLn77k7EAwCKU9bERxKJTwT9POdnUNJYqjKzJK2oRpHCDsUDANB3frJEvbZOatjzE4aftlYdHlfVZqShOvOykmRnbUgra3yNcyYlyV63RZs2bW7UdAAAutZ5Q9fGbkJPz/lpq8hhGMZ6TtK+yu7sYWf2ldQE5xklk5qP5h1fQZFDAEC32mgl/qKLHO4a+Pncv2uPr/xdKYoctrvU/R6lEhdJcveFqgnKs5Ju71A8AABdjS2I4ms5+TGzg5Jm0olLOD5WdeqKpJG84wEAQHG8A/+VRUvJT6jFs+Duc+H6WPj/sKTZqh3YByQt5hkPAACQl6bJT0hUBiXNm9lwSFjGpbUJzQfcfSUVcqOk6bziAfS3d+94a+wmAE19atf1sZuQO3fP/VIWDSc8hx6Z0zVuOuruN4RzhiVNhOPbJB2rrNbKGl8PE54BAP2m6AnP27e8Jffv2pM/+n4pJjy3tdqrLEh+AAD9huQnP+zqDgAA1unGzpFWsas7AADoK/T8AACAdVZ7uOeH5AcAAKzTy8NeTZOfsGJrMlzdo2TriUM1zrld0rFwaD61fUWmeAAAgDy10vNzu7tPVa6Y2TEzU9Vy9iPuPh6uTypJZG7IKR4AABRstUQVmfPWcMJzSEyGqw7PSJpKXb8nHKs4XLk9azyA7vbBoXfEbgJQGr1YCLFbNStyOCzpSUlXpnZdn1SyR5eF6y5pdwgZSA9XZY2vhzo/AIBu9JOlR3Te0LUbii26zs/5m4dz/6798cuLpajz07Dnx90X3X1r1a7r45Iqe3RVNiBd24jUzI5U9urKGp9mZpNmNm9m86urL7f+DAEAKImNJj4xrLrnfimLtur8hKRkTGeGpSpDWosh0VmQdL+Soaxc4939kLuPuvvopk2b22l2yz48dE1H7hcAAJRHu0vd75G0LzU0tShJVUNVizqzV1fe8R31+aVHYzwsAACl4/064TnNzA4qmauTTlRWapy6Es4/a+gqazwA9LoX33NJ7CYAfaGl5MfMJiQtuHtlrs6YlMzpkbQSJjZXDEhacfeVvOIBoB9c+OVnYzcBEZy66bLYTaipr+f8hERlUNK8mQ2HRGU8dcqnlczjqbgxHMslHgCAXrbtvmf02ParYjejrzRb6j4g6XSNm466+w2p8w6mb3T3O/OIr4el7gCAVq389lUa+KPHYzejqce2X6WrT9ZvZ9FL3V//+p/N/bv2X/7lH0ux1L1h8lNWJD8AgH5TdPLzr1//M7l/1/73f/mnUiQ/bS11BwAA6Hbs6g4AfWhu6zUaO015D9QXa2QoTIVZVDJfeG0v0LzOl+j5AYC+ROKDMjKzaSWFj4+GJGZ3WDGey/lrccz5AQCg/Iqe8/OvOvBd+z+aPAczO+3uW1PXxyRNuft4HudX0POTwXOXXxq7CQAAdIR34NJIar/PtGWdXQ5nw+enkfxkcPHT34vdBADoSyu/3V91cfqkDtCgkuQlrVHB43bPP8Pdu+4iaZJ44oknnnji+y2+2y+SJiXNpy6TqdsmJB2rOn9ASafRQI37auv89KVbe34miSeeeOKJJ74P47uaux9y99HUJb0ya0VhxVZK9fW0ds9f063JDwAA6C3LSnpu0gYkyWvv99nu+WtIfgAAQHTuvqD1c3YGJc3lcX5atyY/TQsYEU888cQTT3wPxve6w1V1esYlzVSuhA3SJ1o9v56urPMDAAB6U6pi87CklfS8oHDbuKfq+DQ6v+5jkPygSGZ2vrv/uCz3s5HHlaQYjw20w8y2SNrn7n/eofu/yN3/PtbfYjfitSqPrhv2MrPzK19ALZy7xcze38G2XFRpU8b7eVuD224zs/vTzyNcPxX+/+lm7as6tt/M5s3sNTP7gczhagAAAA8ZSURBVJn9WpO23RLOe83M/tLMLk/dts/M7jCzLzaIf7eZfSW09zVJp8N9PWFmtzR57CvCc7woXD/fzA6n7ueUmX28yX18PNzHr6WOHQ5teM3MfrdJ/P7Q/tcqj5t6Dn/V6P3VLe+/fpLXaxXrNW/n8y840uxvJIPKUMPtWe6Ezz9EEXvNfws1AfZL+oqk12pc/krS+xvEbgnnfbxDbft4+P+nM95PzXhJH5f0tvDzrZLeL+nTkk5J2pJ6jrfUib+7Ep+6j7vDa7ov/P9wg/hbJT0r6bbw85Hw2JenzhmW9FqD+MrjXaGk6uZt4fr+cNsTDV6XW8Pl/HD9cOq+LpY0IumOer/fcNt8iHtW0ufCa3o43O/B8N6qF39ruI99qcfcEv5/RTh+R4PXr1vef29rcNttku5P/52F66fC/+s+tqSLahzbH34nr0n6gaRfa9K2W8J5r0n6y6r3XuX1/2KD+HeH3/Epnf3Z8US931sq9orwHC8K188P753KfZxq9rsN77f708+z6j5+t0l85s+/1O+x7u+5Tvzd4THqXX4QXsdTGd9/fP5xKfxS6mEvM7tV0m5Js0qWtK2E/w8qWc42qGRy07Pu/qc14rdIWnb315nZbZJm3f07bTz+3Uq+6OoZDm0advdtNeLvUPLH2cyYu/+bGvG3uvs9qeu3KfmwH3f3r9U7L3V8n6Q73H1Pk/PucPdP1Dh+2N0/UHVsQMmEvbvd/WtmdrGS1/91bdzv+z10xYf7m3L3df96NLNbKr9XM7tCktz9qRrn3ebuv9fs8cPr5+7++y22s+br1cbjR33/tfE4n67z+n9c0py7fyf8LZ6StEdJnZJhd/9ReI431Pn7u1vJ++Q74fqtkq5U8ve8ouRv+EZJX6kTf6ukKSWTF1ck/bKSZObd7v50OGdY0g/qvP/Sj7coaZuSL6HFcMq4pCsrfx914iXpfnf/sZkdVpLILIb2bJX0AUkvVb+nQvwdSr7wFpUk6rOSjkm6Kvy8Ndz+lTrxuX3+hev7JB2Q9LikhfR9ep2hmPAcFNpQ7UA4fsDdR+vE8vm3/nhLn3/orHNiN6CZWm8eST9K/fzV8EfR7H5+L3RTHlaLf/zu/uut/vHXedhTSj6kWiu3XaPZVddvV/Jl9LUm56Wl9z45VeecesefWNegpHbCB0J3tCQ92eCxn21w29r9mdlinZsvSf28ovrPs97xY1WP9XupL7S0l+rE13tdGj5OLTHef+18+aj20MWPKomLu98T/s4qkw1/FI7/yMIboYYjku5RkjApnP/rVec8kHqO1cbdPf0euKfy5WNmd4e/g0bv/d01Hm8u9eXzgJkN1Ev+kuaelXx/uir5fk7SQqPPn3RSUDmv6gv1zgbPP+vn31nF3tz9q+H8/ZI+oTP7Hx2TtC75qDx+eO5XSjqcfp+a2RXhfVGv+Xz+NdHk8w8dVPbkJ+uXT+w//qOSRtz9gUaNbxCf3qn2sJIvy1kze1tVD8Il6yITN+jMv3IladDCJMVwny1PvkvHSWtf5vuV/Mu3nkvM7N1V/0p7m5Ivwz9PXa/34fVpM/uKku7hBUkjZjaQ6km4SE02sLNkfsSYn5n0eTh9W3j+9X4Bu9P/Sqtz/+9X0gNTS+z3H18+TfR48l3zfRk+jx6Q1nqHGgoJ31OWzJc5Xf37b9A7yudfts8/dJKXYOyt3kXJ+GjdMe1wzvtVf87GPtUZj02ds0Vh/LiF9uxX0uVeud50LoeS1RbNzrmiyWswr2Tc/6Jw7G4lY9+3KRl7v6hBe29VMm+iMn+mMoa+T8m8gVskXdzgtblDScJQc1xfyRf4aoP2V89XeEJn5vBcrOQDrdG8hYHw+Kvhkr6vhnMuQvtrjquH1+41JfMKaj7/cN4doY2nlMxx+IHOzB85JelzjX73Md9/4fXd38L93lHvvZf6uTJvam0eRgvxdysZkqpcvyX9Xk29D25r4fHXvcdT7+96cy7uSL9e4djblJpjEq43mrP1FSWfMReF/6fnkFwUnlOjOWPn6+z5UltSPzd9/o3+NsI5jT7/0r+zmp8R7V7Ca3JLeO412111Pp9/GT7/uHTuEr0BTRuY7csn+h9/B1+XK1r5YGlyH3W/9Gs850YJQsMvbyX/At3f6uM1ec5rE55z+D22/PrpzATnymTJuh/YqZjo7z++fDIn31vUpcl3Jy95fP7Efvxu+/zjku+l1BOe00LXf2WiX2WexLrJr0W3x5OhjHbi+qbOg2WsM9Lt8Z200fdfmR7fzC529+daOG9LeKya55rZFg9zkOrcPqzky3KhlcdrcD9XKPkiW1RSSC3LfW2RNNrq61e2zz+g68XOvoq+KPyrr6h4ZVhqG+I3vNQ4drwyLvXu9vgyvQ/zju+Fi1JL2Hs1XtmX2seOv0VJ72llaX+7pQ7SpRKyxtcrtXB/xvdhWyUIuORzid6Ajj/B5A2aJfnIUicka52brHUuYsdnrTPS7fGZ6sSUIP6iGsdartMTO76F30+mOkllj1f2Olex4/OosxMtvo3fY6Y6XVw2dumaYa+NyKnOR5b4rHVusta5iB2fqc5ID8RnrRMTOz5rnZ4yxGep09Xt8VnrXMWOz1pnJ3Z8pjpH6KyyL3XPKmudj6zxWZfaVmem7S41jh2fdal3t8e7Z6sTEzs+a52eqPGesU5St8cr+1L72PFZSx3Ejs9aagId1OvJT9bkI3OdkIx1HrLWuYgdn7XOSLfHZ60TEzteylanJ3q8Z6uT1PXxlq3OVfT41LkXeft1dmLHZ61zhE7yEoy9deqi7HU+MsWH27Mutd3wUuPY8cq41LsH4rPWiYkdn7VOT9T4GvfXdp2ubo5XxqX2JYnfcKmD2PHh9kylJrh07hK9AR1/gtmTj8xFqtSBOg/KWOcidny/XJShTkzseGWv09MsfjVjfMPHb/B6bLhOV7fHV91Plr//wuKVvc5O1Hgu5bz09ITnCstY5yNrfFlVunItQu2hVh7TSlhnJ8trZWYjShLmDdWJsYx1ZrI+fo37a6lOTxnjLWOdom6ND8NQKvrvvYzK/vmHDoudffX6Ra3VmahbJ0IZ62Q0aVuzpbIX1TjWzlLlrEutM9fZUfY6R5lKJdS4v/NFjZ2z3l8xXo9WHjO8/0q19UC7r1X4e63uva5c/iqP56cGJSB0dp2eenVyGtXZ6dvPPy6dvfRFz0+n1ZgAXDl+q6QpSTNKJpz+spK6Qe9296fDOcNK5jXUWyo5puRf6iNKVnYck3RV+HlruP0rXn+pctaltlmWGmddar221DysSJqt9TrXY2YfV7I67TuhLaeUTDafDM/5R+ExbmjQ/g2XOgj3sV/Japx9NW6ekzTjGXu26r3/wm23KFmZdrGS5zGVeu/tC8/hInf/1TrxH1fymn3F3f9zOHZYyZeAJE27+3/aYLs/7u6/X2+1ZPUk03Bsv5JVh5Xfwx2VdtWIv0LJc5/y8C98SX+aavuKki++de+9EL9FybD2VL1zWniOt0kaVfI3UFnkcL+Sv9s5SYu1nnsq/t3hOVyp5O+tYkHJe2fd+zYVe6uk3Up+72tlGXSmUvSgkt//s43up4XnWO/3x+dfYkOff+isXl/tVZQbJdX68hl39/SKm3ss1Ikws7s9WQXWMPt099HKz5UlyX527Yk7O7XUV9mXKrtnW2qdvqPfM7N94QOkpTo7kn5U+eDyZFXMbUoKq4172A4hJEB1d3Wv8XxbLnWQ+vKZVvIlUPPLx8wGs3z5qM77r86Xz9fCCsSn3f2rZvackn/Brkt+qr58bjezUZ1ZvvzrCl8+lSSmRnzTLx8zu1HJl1CtBOAT4e+k+svn00p9+ZiZ1Xn9RpUkGMvh+p8q9PYp9eVTr/0VIUHbaPI9G967t5rZ+5X8LY0plXyb2S1Nku8Z1Um+zexAo+Tba9TPkZTeCuSr9f7+rI06Nar9++PzL6fPP+SP5KeBHP74s9aJyFonQ55xqayyLTXOutQ6c52dquvt1inKWuqAL58e+fLpxuRbjUsIpB2rczxrnRo+/87YaKkJdAjJT2O5Famq7sL3FutMWA51MsIH/lNmtt/MTld/+XuN6szBDTrzr0xJGkw/D2s+ae/TZvYVJctdFySNmNlA6l/yF+lMAlNL1jo7WesUZa3TxJdPd3/5dHvyvTuVKNUUeqNq/p0pxzo1fP5t6PMPneQlmHhU1ouSLvv9LZx3R53jedSZ2HCdjAb32dJSWeWw1FjZllpnqrOTep2y1DnacKmDcP/NyiC8v95rkMP777bUz+ueY+r322hvo/N19mTxLamfO1pnR9nrBGWtc7Sv3mtT9Rg1lzpXvf7p9/Lbqs6r9/vLo87YHeE9ekrJ8OYPdGby/ilJn2vy/DZcp0Z8/lUeb8OlKrh07sKE5ybMbJ83WU4a/gX7VIPbtyhZllpzWa6ZbfHQDd5Gu7ZIGm3WtgbxmZbahvtoa6mxZVyqnad2nr9lKHUQhmQmlfzrvjL3pDLnZ0VJb8hvNIjf8PsvvEduV/Ka7/PakzorE0Y31YmfVo1J3XZmn7cpSQ+0+rqE+7xByVycG9z99xqcu1/Ja+U686/7JzyZwF5ZhXdA0lcb/W0pGTqbCIfSH3jNJjwfVtLzdLeko141+boV4XW6UcnvftKTidd3Szodjo1JOlDvvkPPQXqy/IKS3+WPLdlX6kklyU/DSfOWlDnYqjPvu+VGn1l54vNv7fxcS00gG5IfoACVD1vx5VOJJ/kuIPkGUNu6f+0ByJ+7P+XuX3X3B8L/C0l8wmP/qNGXZruJT+o+N5y4VF6PjcaH+2grEQiP+UD4f9Qkop3n7+6Lod1tt9nMbjGzZ83sNTP7SzO7PHXbPjO7w8y+2CT+Bx2Ov79L2v9XG4zfcPvROfT8AJHVmIBNPPGZ4y17nR3iI8ajw2JPOuLCpd8valJlmnjiNxKvZD5Z9bEBJRNw3x2uX6z6E96JjxjPpbMXlroDHWIZ6/QQT3yWeGUvdUB83Hh0EMkP0DlZ6/QQT3zUOmPElyMe+SP5ATona5E44onPEn8o9B4NK1kuf1apA3d/wJJSB/XugPi48eggJjwDHWQZ60QRT3yW+HB7plIHxMeNR2eQ/AAAgL5CnR8AANBXSH4AAEBfIfkBAAB9heQHAAD0FZIfAADQV0h+AABAX/n/ATN3SlHm6Oo6AAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<Figure size 720x576 with 2 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(10, 8))\n", | |
"\n", | |
"sns.heatmap(dad.todense(), ax=ax)\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Correctness" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"d = sps.diags(np.power(np.array(a_tilde.sum(1)), -0.5).flatten(), 0)\n", | |
"a_norm = a_tilde.dot(d).transpose().dot(d).tocsr()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert np.all(a_norm.todense() == dad.todense())" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"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.7.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment