Files
graph_recognition_w_attn/test.ipynb

539 lines
582 KiB
Plaintext
Raw Normal View History

2025-07-25 00:52:58 -04:00
{
"cells": [
{
"cell_type": "code",
2025-07-25 21:50:20 -04:00
"execution_count": 1,
2025-07-25 00:52:58 -04:00
"id": "c883f5e2",
"metadata": {},
"outputs": [],
"source": [
2025-07-25 21:50:20 -04:00
"import jax\n",
"import jax.numpy as jnp\n",
"from consensus import *"
2025-07-25 00:52:58 -04:00
]
},
{
"cell_type": "code",
2025-07-25 21:50:20 -04:00
"execution_count": 2,
"id": "e3c2fa64",
2025-07-25 00:52:58 -04:00
"metadata": {},
"outputs": [],
"source": [
2025-07-25 21:50:20 -04:00
"key = jax.random.PRNGKey(0)\n",
"config = ConsensusConfig()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "04880fb1",
"metadata": {},
"outputs": [],
"source": [
"key, subkey = jax.random.split(key)\n",
"\n",
"adj_mat = generate_random_adjacency_matrix(subkey, config)\n",
"\n",
"key, subkey = jax.random.split(key)\n",
"\n",
"\n",
"initial_state = generate_random_agent_states(subkey, config)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "acc686b9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([[1.4142135],\n",
" [1.4142135],\n",
" [1.7320508],\n",
" [1.7320508],\n",
" [1.7320508]], dtype=float32)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.linalg.norm(adj_mat, axis=1, keepdims=True, )"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2685d249",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([[-0.79141927, -0.31202483, -0.73786545, 0.6202612 , -0.6111777 ],\n",
" [ 0.27104306, 0.65300965, -0.09737301, -0.7656326 , 0.05701613],\n",
" [-0.9213977 , -0.69550824, 0.69740653, -0.00249243, 0.01338029],\n",
" ...,\n",
" [ 0.934633 , -0.4459145 , 0.7428684 , -0.5317199 , 0.9887655 ],\n",
" [ 0.5390346 , -0.48631144, 0.1265409 , -0.08987975, -0.11147618],\n",
" [-0.900332 , -0.08470678, 0.72673416, -0.75884247, 0.8060036 ]], dtype=float32)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"initial_state"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "01d95cba",
"metadata": {},
"outputs": [],
"source": [
"out = run_consensus_sim(adj_mat, initial_state, config)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "23b2ac73",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-07-26 20:07:01 -04:00
"100%|██████████| 500/500 [00:01<00:00, 359.94it/s]\n"
2025-07-25 21:50:20 -04:00
]
}
],
"source": [
"outputs = []\n",
"from tqdm import tqdm\n",
"\n",
"for i in tqdm(range(config.num_sims)):\n",
" key, subkey = jax.random.split(key)\n",
"\n",
" adj_mat = generate_random_adjacency_matrix(subkey, config)\n",
"\n",
" key, subkey = jax.random.split(key)\n",
"\n",
" initial_state = generate_random_agent_states(subkey, config)\n",
"\n",
" trajectories = run_consensus_sim(adj_mat, initial_state, config)\n",
"\n",
" outputs.append(trajectories)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ff65a64f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"500"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(outputs)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "9db9c2b7",
"metadata": {},
"outputs": [],
"source": [
"x = outputs[1]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "6584c0b2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([[[-1.66636720e-01, 5.12272954e-01, -7.18595386e-01,\n",
" -6.62203312e-01, 5.40143251e-01],\n",
" [-1.74384415e-01, 4.56314355e-01, -6.64573908e-01,\n",
" -6.39672816e-01, 5.08012652e-01],\n",
" [-1.80595487e-01, 4.05365229e-01, -6.15751922e-01,\n",
" -6.18524671e-01, 4.76983011e-01],\n",
" ...,\n",
" [-1.59010112e-01, -1.50679022e-01, -1.53786018e-01,\n",
" -1.67208239e-01, -1.54014796e-01],\n",
" [-1.58967257e-01, -1.50819257e-01, -1.53847516e-01,\n",
" -1.66839033e-01, -1.54245734e-01],\n",
" [-1.58922747e-01, -1.50957853e-01, -1.53907120e-01,\n",
" -1.66481182e-01, -1.54461235e-01]],\n",
"\n",
" [[-2.95487672e-01, 2.00281173e-01, 7.41982460e-01,\n",
" -6.08857512e-01, -5.24303138e-01],\n",
" [-2.84227967e-01, 2.24914923e-01, 6.94133639e-01,\n",
" -5.94611228e-01, -5.13903916e-01],\n",
" [-2.74258196e-01, 2.46254981e-01, 6.50272310e-01,\n",
" -5.80505908e-01, -5.03451347e-01],\n",
" ...,\n",
" [-9.05691609e-02, 2.46822182e-02, -1.64113492e-02,\n",
" -1.15323864e-01, -1.14397414e-01],\n",
" [-8.99871886e-02, 2.28142999e-02, -1.74129177e-02,\n",
" -1.14197671e-01, -1.13313831e-01],\n",
" [-8.94182399e-02, 2.09857989e-02, -1.83918513e-02,\n",
" -1.13096178e-01, -1.12253852e-01]],\n",
"\n",
" [[-1.30383307e-02, 1.71294942e-01, -8.86316597e-01,\n",
" 7.38471627e-01, -6.40124202e-01],\n",
" [-3.00604030e-02, 1.23224229e-01, -8.27797651e-01,\n",
" 7.04303384e-01, -6.11620843e-01],\n",
" [-4.47233506e-02, 8.00035298e-02, -7.74794400e-01,\n",
" 6.70914054e-01, -5.85195124e-01],\n",
" ...,\n",
" [-1.57231078e-01, -1.98106706e-01, -1.83590323e-01,\n",
" -1.40955046e-01, -1.56092867e-01],\n",
" [-1.57435969e-01, -1.97447628e-01, -1.83227822e-01,\n",
" -1.41696304e-01, -1.56145990e-01],\n",
" [-1.57636106e-01, -1.96798533e-01, -1.82872400e-01,\n",
" -1.42414570e-01, -1.56205371e-01]],\n",
"\n",
" ...,\n",
"\n",
" [[-1.63649127e-01, -8.41130137e-01, -7.75687933e-01,\n",
" -6.17362916e-01, -1.62886351e-01],\n",
" [-1.87853858e-01, -8.38172257e-01, -7.59123802e-01,\n",
" -5.96733749e-01, -1.62921131e-01],\n",
" [-2.09566846e-01, -8.34595501e-01, -7.44206071e-01,\n",
" -5.78146398e-01, -1.64056927e-01],\n",
" ...,\n",
" [-4.63634402e-01, -5.26826859e-01, -5.04092157e-01,\n",
" -4.52905446e-01, -4.47922230e-01],\n",
" [-4.63949651e-01, -5.25786340e-01, -5.03538966e-01,\n",
" -4.53391463e-01, -4.48639333e-01],\n",
" [-4.64258403e-01, -5.24773777e-01, -5.02999008e-01,\n",
" -4.53866601e-01, -4.49335635e-01]],\n",
"\n",
" [[ 8.49014282e-01, -4.23134297e-01, -1.02596506e-01,\n",
" -7.79161379e-02, -7.49398649e-01],\n",
" [ 7.69991755e-01, -4.08562779e-01, -8.34711716e-02,\n",
" -3.57792526e-02, -6.76743805e-01],\n",
" [ 6.99401498e-01, -3.93781751e-01, -6.74583837e-02,\n",
" 8.48539814e-04, -6.10982418e-01],\n",
" ...,\n",
" [ 5.44091836e-02, 1.56357903e-02, 2.96502374e-02,\n",
" 6.60664737e-02, 5.86968251e-02],\n",
" [ 5.42080291e-02, 1.62729044e-02, 2.99752634e-02,\n",
" 6.55355603e-02, 5.85015714e-02],\n",
" [ 5.40123284e-02, 1.68951005e-02, 3.02929282e-02,\n",
" 6.50210083e-02, 5.83060347e-02]],\n",
"\n",
" [[ 3.28030080e-01, 1.59404784e-01, 1.12652399e-01,\n",
" 4.21188235e-01, -5.76944411e-01],\n",
" [ 3.04681659e-01, 1.57281369e-01, 1.20595314e-01,\n",
" 4.16955978e-01, -5.35814166e-01],\n",
" [ 2.83952415e-01, 1.55611798e-01, 1.27279893e-01,\n",
" 4.11854506e-01, -4.97601837e-01],\n",
" ...,\n",
" [ 1.25164792e-01, 1.34655759e-01, 1.31267741e-01,\n",
" 1.28612176e-01, 1.17667601e-01],\n",
" [ 1.25210837e-01, 1.34499282e-01, 1.31179631e-01,\n",
" 1.28455788e-01, 1.18006803e-01],\n",
" [ 1.25256866e-01, 1.34351477e-01, 1.31099537e-01,\n",
" 1.28308088e-01, 1.18334584e-01]]], dtype=float32)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "620a7701",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(500, 100, 5)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x.shape"
]
},
{
"cell_type": "code",
2025-07-26 20:07:01 -04:00
"execution_count": 12,
2025-07-25 21:50:20 -04:00
"id": "b094224e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAHPCAYAAAB+5v83AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAs9JJREFUeJzs3Xd8FGX+wPHPzJb0TYMUQk0goTcpRhARRUEQLDSxoKAop56CnIodz/4TPQErooIeKqeigggGRbGhKEgREEyoCRDS69aZ3x+bLFlSCGGTEPi+77U3M88888wzTzbmyzPPPKPouq4jhBBCCCF8Qm3sCgghhBBCnEkkuBJCCCGE8CEJroQQQgghfEiCKyGEEEIIH5LgSgghhBDChyS4EkIIIYTwIQmuhBBCCCF8SIIrIYQQQggfkuBKCCGEEMKHJLgSQjR5119/Pddff32jnPuTTz4hKSmJgwcP+qzMgwcPkpSUxCeffOKzMk8HTf267r//foYMGdLY1RBNgLGxKyBEU7J//37efPNNfvzxRzIzMzGZTCQmJjJ8+HDGjx+Pv79/Y1dRNCHLly8nOzubG2+8sbGr4nE61qm2jhw5wtKlS7n44ovp1KlTY1dHnMUkuBKilr799lvuuusuzGYzo0ePJjExEYfDwe+//87//d//8ffff/Pvf/+7sat5Vlq4cGFjV6FOVqxYwe7duysFMnFxcWzZsgWjseH/E11dnXyhvq8rMzOT+fPnExcXVy/B1b///W/kdbyiNiS4EqIWDhw4wPTp02nRogWLFi0iKirKs+/aa69l3759fPvtt41XwbOc2Wxu7Cr4lKIo+Pn5NXY1Tshms2EymVDV2o0waSrXdbySkhICAwMxmUyNXRXRRMiYKyFq4c0336SkpIQnn3zSK7Aq16ZNGyZNmuTZdjqdvPzyy1x88cV07dqVIUOG8MILL2C3272OGzJkCLfeeiu//fYbY8aMoVu3blx00UV8+umnXvkcDgfz58/nkksuoVu3bvTv359rrrmGH3/80Stfamoq//znP+nXrx/dunXjqquu4uuvv/bKUz5G6Pfff+fpp5/m3HPPpWfPntx+++3k5OR45d26dStTpkyhf//+dO/enSFDhjBr1izP/l9++YWkpCR++eUXr+OqGltz9OhRZs2axaBBg+jatSsDBw5k2rRpJxyrVJvjjh9zVV6vlStXMn/+fM4//3x69erFP//5TwoLC7Hb7Tz55JMkJyfTq1cvZs2a5fWzqWlsUFJSEvPmzauxzmvWrGHq1KkMHDiQrl27cvHFF/Pyyy/jcrm86vztt9+Snp5OUlISSUlJnvE81Z3/559/ZuLEifTs2ZM+ffowbdo0UlNTvfLMmzePpKQk9u3bx/3330+fPn0455xzmDVrFqWlpTXWu6Y6lbfpF198wYsvvsj5559Pjx49KCoqIi8vj2effZbLL7+cXr160bt3b26++WZ27tzpVX5111Wb7y1AQUEBTz31FEOGDKFr164MGjSIe++9l5ycHH755RfGjBkDwKxZszz1r3iuL7/8kquuuoru3bvTv39/Zs6cyZEjR7zOcf/999OrVy/279/PLbfcQq9evZg5c6Zn3/FjrjRN45133mHEiBF069aN8847j0ceeYT8/HyvfCf6XRJnFum5EqIW1q5dS6tWrejdu3et8j/00EMsW7aMSy+9lJtuuoktW7bw+uuvk5qayssvv+yVd9++fdx1112MGTOGK6+8ko8//pj777+fLl260KFDBwDmz5/P66+/ztixY+nevTtFRUVs27aNP//8kwEDBgCwe/durrnmGqKjo7nlllsIDAzkyy+/5Pbbb2fevHkMHTrU67xPPPEEFouFO+64g/T0dBYtWsTjjz/Of/7zHwCys7OZMmUK4eHhTJ06FYvFwsGDB0lJSalTG9555538/fffXHfddcTFxZGTk8OPP/7IoUOHaNmypc+PA3jjjTfw9/dn6tSp7Nu3j/feew+j0YiiKBQUFHDHHXewefNmPvnkE+Li4rjjjjvqdG3HW7ZsGYGBgdx0000EBgayfv165s6dS1FREffddx8At912G4WFhRw+fNjzRzYoKKjaMn/66SduueUWWrZsyR133IHVauW9997jmmuu4ZNPPqnUFnfffTctW7ZkxowZbN++nf/9739ERETwr3/9q9pz1KZOr7zyCiaTiSlTpmC32zGZTPz999+sWbOGYcOG0bJlS7Kysvjwww+57rrr+OKLL4iOjq72nLX93hYXF3PttdeSmprK1VdfTefOncnNzeWbb77hyJEjJCQk8M9//pO5c+cyfvx4zjnnHADP7+wnn3zCrFmz6NatGzNmzCA7O5vFixezceNGPv30UywWi6dOTqeTKVOmcM4553DffffVOJbykUceYdmyZVx11VVcf/31HDx4kP/+979s376d999/H5PJ5PPfJdEE6EKIGhUWFuqJiYn6tGnTapV/x44demJiov7ggw96pT/zzDN6YmKi/vPPP3vSLrzwQj0xMVHfsGGDJy07O1vv2rWr/swzz3jSRo0apU+dOrXG806aNEkfOXKkbrPZPGmapunjx4/XL7nkEk/axx9/rCcmJuo33nijrmmaJ/2pp57SO3XqpBcUFOi6ruspKSl6YmKivmXLlmrPuX79ej0xMVFfv369V/qBAwf0xMRE/eOPP9Z1Xdfz8/P1xMRE/c0336zxGo5X2+Ouu+46/brrrqtUr5EjR+p2u92TPmPGDD0pKUm/+eabvY4fP368fuGFF1Zb/4oSExP1uXPnerbL2/PAgQOetNLS0krHPfzww3qPHj28fj5Tp071Om9N5x89erSenJys5+bmetJ27Nihd+zYUb/33ns9aXPnztUTExP1WbNmeZV5++236/369at0ruNVV6fyNr3ooosqXZ/NZtNdLlela+jatas+f/78Gq+rtt/bl156SU9MTNS/+uqrSnUr/x5v2bKlyp+b3W7Xk5OT9ZEjR+pWq9WTvnbtWj0xMVF/6aWXPGn33XefnpiYqD///POVznPfffd5tc2GDRv0xMRE/fPPP/fKt27dOq/02vwuiTOL3BYU4gSKioqAmnsVKvruu+8AuOmmm7zSJ0+e7LW/XPv27enTp49nOyIignbt2nHgwAFPmsViYffu3ezdu7fKc+bl5bF+/XqGDx9OUVEROTk55OTkkJuby8CBA9m7d2+l2x/jxo1DURTPdp8+fXC5XKSnpwMQEhICuAfyOxyOWl17dfz9/TGZTPz666+VbpfUx3HlRo8e7TVOpnv37ui6ztVXX+2Vr3v37hw6dAin03nS56hKxZ6O8p9Hnz59KC0tJS0t7aTLy8zMZMeOHVx55ZWEhYV50jt27Mh5551X6TsFMGHCBK/tPn36kJeX5/k+19UVV1xRqSfHbDZ7xl25XC5yc3MJDAykXbt2bN++vdqyTuZ7+9VXX9GxY8dKPbCA1/e4Ktu2bSM7O5trrrnGa8zX4MGDiY+Pr3K85DXXXFNjmQCrVq0iJCSEAQMGeOqek5NDly5dCAwM9Nwu9+Xvkmga5LagECcQHBwMuG9L1EZ6ejqqqtK6dWuv9ObNm2OxWDzBS7nY2NhKZYSGhnoFE//85z/5xz/+waWXXkpiYiIDBw5k9OjRdOzYEXBPEaHrOi+99BIvvfRSlfXKzs72uj3TokULr/3lt0UKCgoA6NevH5deeinz58/nnXfeoV+/flx88cVcfvnlJz2A3Gw2M3PmTJ599lkGDBhAjx49GDx4MFdccQXNmzf3+XHVXWP5H7nj2zwkJARN0ygsLCQ8PPykrq0qu3fv5j//+Q/r16+vFMwUFhaedHkZGRkAtGvXrtK+hIQEfvjhB8+g63LV/Xzz8/M93+m6qOpWrKZpLF68mCVLlnDw4EGvsWUVg8Hjncz3dv/+/VxyySV1qnNN7RcfH8/vv//ulWY0GomJiTlhufv27aOwsJDk5OQq92dnZwO+/V0STYMEV0KcQHBwMFFRUezevfukjjvRv6bLGQyGE+bp27cvKSkpfP311/z444989NFHLFq0iNmzZzN27Fg0TQPcvWPnn39
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAHPCAYAAAB+5v83AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAukpJREFUeJzs3Xd4VFXCx/HvnT6ZyUx6IdQAoUqTYgQRUQQExUITdXFBcVk7VnRVdLGsr2UFLIioqCvKqqgogkGxoSgqK6ggkVATID0zSabf+/5xJ0OGFEJI53yeZ547c9ucOZmQH+ece66kKIqCIAiCIAiC0CA0zV0AQRAEQRCEtkSEK0EQBEEQhAYkwpUgCIIgCEIDEuFKEARBEAShAYlwJQiCIAiC0IBEuBIEQRAEQWhAIlwJgiAIgiA0IBGuBEEQBEEQGpAIV4IgCIIgCA1IhCtBEFq9q666iquuuqpZ3vu9996jR48eHDx4sMHOefDgQXr06MF7773XYOdsCVr757r77rsZPXp0cxdDaAV0zV0AQWhN9u/fz0svvcSmTZvIzc1Fr9eTlpbG+PHjmTZtGiaTqbmLKLQia9asoaCggKuvvrq5ixLSEstUV0eOHGHVqlWcd9559OrVq7mLI5zCRLgShDr64osvuPnmmzEYDEyaNIm0tDR8Ph8//fQT//d//8eff/7JP//5z+Yu5ilp+fLlzV2Eevnoo4/IzMysEmRSUlLYtm0bOl3T/xNdU5kaQmN/rtzcXJYsWUJKSkqjhKt//vOfiNvxCnUhwpUg1MGBAwe49dZbadeuHStWrCAhISG07YorrmDfvn188cUXzVfAU5zBYGjuIjQoSZIwGo3NXYzj8ng86PV6NJq6jTBpLZ/rWOXl5URERKDX65u7KEIrIcZcCUIdvPTSS5SXl/Pwww+HBasKnTp1YubMmaHXfr+fZ599lvPOO4++ffsyevRonnrqKbxeb9hxo0eP5rrrruPHH39k8uTJnHbaaZx77rm8//77Yfv5fD6WLFnC+eefz2mnncawYcO4/PLL2bRpU9h+u3fv5qabbmLo0KGcdtppXHrppXz22Wdh+1SMEfrpp5949NFHOeOMMxgwYADXX389hYWFYftu376d2bNnM2zYMPr168fo0aOZP39+aPv3339Pjx49+P7778OOq25sTV5eHvPnz2fkyJH07duXESNGMHfu3OOOVarLcceOuaoo19q1a1myZAlnnXUWAwcO5KabbsLpdOL1enn44YdJT09n4MCBzJ8/P+xnU9vYoB49erB48eJay7xhwwbmzJnDiBEj6Nu3L+eddx7PPvssgUAgrMxffPEF2dnZ9OjRgx49eoTG89T0/t999x0zZsxgwIABDB48mLlz57J79+6wfRYvXkyPHj3Yt28fd999N4MHD+b0009n/vz5uFyuWstdW5kq6vTjjz/m6aef5qyzzqJ///6UlpZSXFzMv/71Ly688EIGDhzIoEGDuOaaa9i5c2fY+Wv6XHX53gI4HA4eeeQRRo8eTd++fRk5ciR33nknhYWFfP/990yePBmA+fPnh8pf+b0++eQTLr30Uvr168ewYcO4/fbbOXLkSNh73H333QwcOJD9+/dz7bXXMnDgQG6//fbQtmPHXMmyzKuvvsqECRM47bTTOPPMM7n//vspKSkJ2+94v0tC2yJargShDjZu3EiHDh0YNGhQnfb/xz/+werVqxk7dix//etf2bZtG0uXLmX37t08++yzYfvu27ePm2++mcmTJ3PJJZfw7rvvcvfdd9OnTx+6d+8OwJIlS1i6dClTpkyhX79+lJaW8uuvv/Lbb78xfPhwADIzM7n88stJTEzk2muvJSIigk8++YTrr7+exYsXM2bMmLD3XbhwITabjRtuuIHs7GxWrFjBQw89xL///W8ACgoKmD17NtHR0cyZMwebzcbBgwfJyMioVx3eeOON/Pnnn1x55ZWkpKRQWFjIpk2bOHToEO3bt2/w4wBefPFFTCYTc+bMYd++fbzxxhvodDokScLhcHDDDTfwyy+/8N5775GSksINN9xQr892rNWrVxMREcFf//pXIiIi2Lx5M4sWLaK0tJS77roLgL/97W84nU4OHz4c+iNrsVhqPOe3337LtddeS/v27bnhhhtwu9288cYbXH755bz33ntV6uKWW26hffv2zJs3j99//53//ve/xMTEcMcdd9T4HnUp03PPPYder2f27Nl4vV70ej1//vknGzZsYNy4cbRv3578/HzefvttrrzySj7++GMSExNrfM+6fm/Lysq44oor2L17N5dddhm9e/emqKiIzz//nCNHjtC1a1duuukmFi1axLRp0zj99NMBQr+z7733HvPnz+e0005j3rx5FBQU8Nprr/Hzzz/z/vvvY7PZQmXy+/3Mnj2b008/nbvuuqvWsZT3338/q1ev5tJLL+Wqq67i4MGD/Oc//+H3339n5cqV6PX6Bv9dEloBRRCEWjmdTiUtLU2ZO3dunfbfsWOHkpaWptx7771h6x977DElLS1N+e6770LrzjnnHCUtLU3ZsmVLaF1BQYHSt29f5bHHHgutu+iii5Q5c+bU+r4zZ85UJk6cqHg8ntA6WZaVadOmKeeff35o3bvvvqukpaUpV199tSLLcmj9I488ovTq1UtxOByKoihKRkaGkpaWpmzbtq3G99y8ebOSlpambN68OWz9gQMHlLS0NOXdd99VFEVRSkpKlLS0NOWll16q9TMcq67HXXnllcqVV15ZpVwTJ05UvF5vaP28efOUHj16KNdcc03Y8dOmTVPOOeecGstfWVpamrJo0aLQ64r6PHDgQGidy+Wqctx9992n9O/fP+znM2fOnLD3re39J02apKSnpytFRUWhdTt27FB69uyp3HnnnaF1ixYtUtLS0pT58+eHnfP6669Xhg4dWuW9jlVTmSrq9Nxzz63y+TwejxIIBKp8hr59+ypLliyp9XPV9Xv7zDPPKGlpacqnn35apWwV3+Nt27ZV+3Pzer1Kenq6MnHiRMXtdofWb9y4UUlLS1OeeeaZ0Lq77rpLSUtLU5544okq73PXXXeF1c2WLVuUtLQ05cMPPwzb76uvvgpbX5ffJaFtEd2CgnAcpaWlQO2tCpV9+eWXAPz1r38NWz9r1qyw7RW6devG4MGDQ69jYmLo0qULBw4cCK2z2WxkZmayd+/eat+zuLiYzZs3M378eEpLSyksLKSwsJCioiJGjBjB3r17q3R/TJ06FUmSQq8HDx5MIBAgOzsbgMjISEAdyO/z+er02WtiMpnQ6/X88MMPVbpLGuO4CpMmTQobJ9OvXz8UReGyyy4L269fv34cOnQIv99/wu9RncotHRU/j8GDB+NyucjKyjrh8+Xm5rJjxw4uueQSoqKiQut79uzJmWeeWeU7BTB9+vSw14MHD6a4uDj0fa6viy++uEpLjsFgCI27CgQCFBUVERERQZcuXfj9999rPNeJfG8//fRTevbsWaUFFgj7Hlfn119/paCggMsvvzxszNeoUaNITU2tdrzk5ZdfXus5AdatW0dkZCTDhw8Plb2wsJA+ffoQERER6i5vyN8loXUQ3YKCcBxWqxVQuyXqIjs7G41GQ8eOHcPWx8fHY7PZQuGlQnJycpVz2O32sDBx00038fe//52xY8eSlpbGiBEjmDRpEj179gTUKSIUReGZZ57hmWeeqbZcBQUFYd0z7dq1C9te0S3icDgAGDp0KGPHjmXJkiW8+uqrDB06lPPOO48LL7zwhAeQGwwGbr/9dv71r38xfPhw+vfvz6hRo7j44ouJj49v8ONq+owVf+SOrfPIyEhkWcbpdBIdHX1Cn606mZmZ/Pvf/2bz5s1VwozT6Tzh8+Xk5ADQpUuXKtu6du3KN998Exp0XaGmn29JSUnoO10f1XXFyrLMa6+9xptvvsnBgwfDxpZVDoPHOpHv7f79+zn//PPrVeba6i81NZWffvopbJ1OpyMpKem45923bx9Op5P09PRqtxcUFAAN+7sktA4iXAnCcVitVhISEsjMzDyh4473v+kKWq32uPsMGTKEjIwMPvvsMzZt2sQ
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAHPCAYAAAB+5v83AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuwhJREFUeJzs3Xd8FEX/wPHP7tXkkksjCSHUIAm9FwOIiKAgCI8IiFhAUBCxgVgQC/hY0J9YAAsiIKigPCooiGBQFAsgKgoqKBJqgJB6l3Z9f3/c5ciRQgjJXRLm/Xrda29nZ2dnJ5fLN7Ozs5KiKAqCIAiCIAhCtZADXQFBEARBEIT6RARXgiAIgiAI1UgEV4IgCIIgCNVIBFeCIAiCIAjVSARXgiAIgiAI1UgEV4IgCIIgCNVIBFeCIAiCIAjVSARXgiAIgiAI1UgEV4IgCIIgCNVIBFeCINR5t9xyC7fccktAjv3JJ5+QlJTE8ePHq63M48ePk5SUxCeffFJtZdYGdf28HnnkEQYMGBDoagh1gDrQFRCEuuTo0aO8/fbb/PDDD5w+fRqNRkNiYiJDhgzhhhtuQK/XB7qKQh2yfv16srKymDBhQqCr4lUb61RZ6enprFmzhoEDB9KmTZtAV0e4iIngShAq6ZtvvuG+++5Dq9UyYsQIEhMTsdvt/PLLL/zf//0f//77L//9738DXc2L0tKlSwNdhSrZsGEDBw4cKBXIxMfHs2fPHtRq/39Fl1en6lDT53X69GkWLVpEfHx8jQRX//3vfxGP4xUqQwRXglAJx44dY/r06TRq1IgVK1YQExPj3XbTTTdx5MgRvvnmm8BV8CKn1WoDXYVqJUkSOp0u0NU4J6vVikajQZYrN8KkrpzX2QoLCwkODkaj0QS6KkIdIcZcCUIlvP322xQWFvLMM8/4BFbFmjVrxvjx473rDoeD1157jYEDB9K+fXsGDBjASy+9hM1m89lvwIABTJkyhZ9//plRo0bRoUMHrrzyStatW+eTz263s2jRIq666io6dOhAr169uPHGG/nhhx988h08eJB7772Xnj170qFDB0aOHMlXX33lk6d4jNAvv/zCc889x6WXXkrnzp2ZNm0a2dnZPnn37t3LpEmT6NWrFx07dmTAgAHMmjXLu33nzp0kJSWxc+dOn/3KGluTkZHBrFmz6NevH+3bt6dv375MnTr1nGOVKrPf2WOuiuu1ceNGFi1axGWXXUaXLl249957ycvLw2az8cwzz5CcnEyXLl2YNWuWz8+morFBSUlJLFy4sMI6b9myhcmTJ9O3b1/at2/PwIEDee2113A6nT51/uabb0hLSyMpKYmkpCTveJ7yjr99+3bGjRtH586d6d69O1OnTuXgwYM+eRYuXEhSUhJHjhzhkUceoXv37nTr1o1Zs2ZRVFRUYb0rqlNxm37++ee8/PLLXHbZZXTq1In8/Hxyc3N5/vnnufbaa+nSpQtdu3bl9ttvZ//+/T7ll3delfncApjNZp599lkGDBhA+/bt6devHw899BDZ2dns3LmTUaNGATBr1ixv/Use64svvmDkyJF07NiRXr16MXPmTNLT032O8cgjj9ClSxeOHj3KHXfcQZcuXZg5c6Z329ljrlwuF++88w5Dhw6lQ4cO9O7dmyeeeAKTyeST71y/S0L9InquBKEStm7dSpMmTejatWul8j/22GOsXbuWq6++mttuu409e/awePFiDh48yGuvveaT98iRI9x3332MGjWK6667jo8//phHHnmEdu3a0apVKwAWLVrE4sWLGT16NB07diQ/P58//viDP//8kz59+gBw4MABbrzxRmJjY7njjjsIDg7miy++YNq0aSxcuJBBgwb5HPfpp5/GaDRy9913k5aWxooVK3jqqad45ZVXAMjKymLSpElEREQwefJkjEYjx48fJyUlpUpteM899/Dvv/9y8803Ex8fT3Z2Nj/88AMnT56kcePG1b4fwFtvvYVer2fy5MkcOXKE9957D7VajSRJmM1m7r77bn7//Xc++eQT4uPjufvuu6t0bmdbu3YtwcHB3HbbbQQHB7Njxw4WLFhAfn4+Dz/8MAB33nkneXl5nDp1yvtH1mAwlFvmjz/+yB133EHjxo25++67sVgsvPfee9x444188sknpdri/vvvp3HjxsyYMYO//vqL//3vf0RGRvLggw+We4zK1On1119Ho9EwadIkbDYbGo2Gf//9ly1btjB48GAaN25MZmYmH374ITfffDOff/45sbGx5R6zsp/bgoICbrrpJg4ePMj1119P27ZtycnJ4euvvyY9PZ2WLVty7733smDBAm644Qa6desG4P2d/eSTT5g1axYdOnRgxowZZGVlsXLlSn799VfWrVuH0Wj01snhcDBp0iS6devGww8/XOFYyieeeIK1a9cycuRIbrnlFo4fP87777/PX3/9xerVq9FoNNX+uyTUAYogCBXKy8tTEhMTlalTp1Yq/759+5TExERl9uzZPunz5s1TEhMTle3bt3vTrrjiCiUxMVHZtWuXNy0rK0tp3769Mm/ePG/a8OHDlcmTJ1d43PHjxyvDhg1TrFarN83lcik33HCDctVVV3nTPv74YyUxMVGZMGGC4nK5vOnPPvus0qZNG8VsNiuKoigpKSlKYmKismfPnnKPuWPHDiUxMVHZsWOHT/qxY8eUxMRE5eOPP1YURVFMJpOSmJiovP322xWew9kqu9/NN9+s3HzzzaXqNWzYMMVms3nTZ8yYoSQlJSm33367z/433HCDcsUVV5Rb/5ISExOVBQsWeNeL2/PYsWPetKKiolL7Pf7440qnTp18fj6TJ0/2OW5Fxx8xYoSSnJys5OTkeNP27duntG7dWnnooYe8aQsWLFASExOVWbNm+ZQ5bdo0pWfPnqWOdbby6lTcpldeeWWp87NarYrT6Sx1Du3bt1cWLVpU4XlV9nP76quvKomJicqXX35Zqm7Fn+M9e/aU+XOz2WxKcnKyMmzYMMVisXjTt27dqiQmJiqvvvqqN+3hhx9WEhMTlRdffLHUcR5++GGfttm1a5eSmJiofPbZZz75tm3b5pNemd8loX4RlwUF4Rzy8/OBinsVSvr2228BuO2223zSJ06c6LO92CWXXEL37t2965GRkbRo0YJjx45504xGIwcOHODw4cNlHjM3N5cdO3YwZMgQ8vPzyc7OJjs7m5ycHPr27cvhw4dLXf4YM2YMkiR517t3747T6SQtLQ2A0NBQwD2Q3263V+rcy6PX69FoNPz000+lLpfUxH7FRowY4TNOpmPHjiiKwvXXX++Tr2PHjpw8eRKHw3HexyhLyZ6O4p9H9+7dKSoqIjU19bzLO336NPv27eO6664jPDzcm966dWt69+5d6jMFMHbsWJ/17t27k5ub6/08V9V//vOfUj05Wq3WO+7K6XSSk5NDcHAwLVq04K+//iq3rPP53H755Ze0bt26VA8s4PM5Lssff/xBVlYWN954o8+Yr/79+5OQkFDmeMkbb7yxwjIBNm3aRGhoKH369PHWPTs7m3bt2hEcHOy9XF6dv0tC3SAuCwrCOYSEhADuyxKVkZaWhizLNG3a1Cc9Ojoao9HoDV6KxcXFlSojLCzMJ5i49957ueuuu7j66qtJTEykb9++jBgxgtatWwPuKSIUReHVV1/l1VdfLbNeWVlZPpdnGjVq5LO9+LKI2WwGoGfPnlx99dUsWrSId955h549ezJw4ECuvfba8x5ArtVqmTlzJs8//zx9+vShU6dO9O/fn//85z9ER0dX+37lnWPxH7mz2zw0NBSXy0VeXh4RERHndW5lOXDgAK+88go7duwoFczk5eWdd3knTpwAoEWLFqW2tWzZku+//9476LpYeT9fk8nk/UxXRVmXYl0uFytXrmTVqlUcP37cZ2xZyWDwbOfzuT169ChXXXVVlepcUfslJCTwyy+/+KSp1WoaNmx4znKPHDlCXl4eycnJZW7PysoCqvd3SagbRHAlCOcQEhJCTEwMBw4cOK/9zvXfdDGVSnXOPD169CAlJYWvvvqKH374gY8++ogVK1Ywd+5cRo8ejcv
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAHPCAYAAAB+5v83AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAq6RJREFUeJzs3Xd8FNXawPHfbEvfVJJAAoQEQq9SjCAiiIIgKE3EgoLi5VpBrw29otf+igVQUQRFvRau2EAEg2JDUVCkKAgmlJBQ0vtmy8z7xyZLlhRCSHaT8Hw/n3V3zpyZeeYkcR/OnDmjaJqmIYQQQgghGoTO2wEIIYQQQrQkklwJIYQQQjQgSa6EEEIIIRqQJFdCCCGEEA1IkishhBBCiAYkyZUQQgghRAOS5EoIIYQQogFJciWEEEII0YAkuRJCCCGEaECSXAkhmr1rr72Wa6+91ivH/uijj+jcuTOHDx9usH0ePnyYzp0789FHHzXYPpuC5n5e9913H8OHD/d2GKIZMHg7ACGak0OHDvH666+zadMmjh8/jtFoJDExkdGjR3PllVfi6+vr7RBFM7J69Wqys7O5/vrrvR2KS1OMqa6OHTvGypUrueiii+jatau3wxFnMUmuhKijb775hjvuuAOTycT48eNJTEzEZrPx66+/8n//93/8/fff/Oc///F2mGelZcuWeTuEelmzZg379u2rksjExMSwY8cODAbP/y+6ppgaQmOf1/Hjx1m8eDExMTGNklz95z//QR7HK+pCkish6iAtLY05c+bQpk0bVqxYQWRkpGvd1VdfzcGDB/nmm2+8F+BZzmQyeTuEBqUoCj4+Pt4O45TKysowGo3odHUbYdJczutkJSUl+Pv7YzQavR2KaCZkzJUQdfD6669TUlLC448/7pZYVWjfvj3Tp093Ldvtdl566SUuuugievTowfDhw3nuueewWq1u2w0fPpybb76ZrVu3MmnSJHr27MmIESP45JNP3OrZbDYWL17MxRdfTM+ePRk0aBBXXXUVmzZtcquXkpLC7bffzsCBA+nZsycTJkzgq6++cqtTMUbo119/5cknn+Tcc8+lT58+3HLLLeTk5LjV3blzJzNnzmTQoEH06tWL4cOHc//997vW//zzz3Tu3Jmff/7ZbbvqxtZkZmZy//33M3ToUHr06MGQIUOYPXv2Kccq1WW7k8dcVcS1du1aFi9ezPnnn0/fvn25/fbbKSwsxGq18vjjj5OUlETfvn25//773X42tY0N6ty5M4sWLao15g0bNjBr1iyGDBlCjx49uOiii3jppZdwOBxuMX/zzTekp6fTuXNnOnfu7BrPU9Pxf/rpJ6ZNm0afPn3o378/s2fPJiUlxa3OokWL6Ny5MwcPHuS+++6jf//+nHPOOdx///2UlpbWGndtMVW06eeff87zzz/P+eefT+/evSkqKiIvL4+nn36ayy67jL59+9KvXz9uvPFG9uzZ47b/ms6rLr+3AAUFBTzxxBMMHz6cHj16MHToUO655x5ycnL4+eefmTRpEgD333+/K/7Kx/riiy+YMGECvXr1YtCgQdx9990cO3bM7Rj33Xcfffv25dChQ9x000307duXu+++27Xu5DFXqqry5ptvMmbMGHr27Ml5553Hv//9b/Lz893qnepvSbQs0nMlRB1s3LiRtm3b0q9fvzrVf/DBB/n444+55JJLuOGGG9ixYwevvvoqKSkpvPTSS251Dx48yB133MGkSZO44oorWLVqFffddx/du3enU6dOACxevJhXX32VyZMn06tXL4qKiti1axd//PEHgwcPBmDfvn1cddVVREVFcdNNN+Hv788XX3zBLbfcwqJFixg5cqTbcR977DHMZjO33nor6enprFixgkcffZQXXngBgOzsbGbOnEloaCizZs3CbDZz+PBhkpOT69WGt912G3///TfXXHMNMTEx5OTksGnTJo4cOUJsbGyDbwfw2muv4evry6xZszh48CDvvPMOBoMBRVEoKCjg1ltvZfv27Xz00UfExMRw66231uvcTvbxxx/j7+/PDTfcgL+/P5s3b2bhwoUUFRVx7733AvCPf/yDwsJCjh496vqSDQgIqHGfP/74IzfddBOxsbHceuutWCwW3nnnHa666io++uijKm1x5513Ehsby9y5c/nzzz/53//+R1hYGP/6179qPEZdYnr55ZcxGo3MnDkTq9WK0Wjk77//ZsOGDYwaNYrY2FiysrL44IMPuOaaa/j888+Jioqq8Zh1/b0tLi7m6quvJiUlhYkTJ9KtWzdyc3P5+uuvOXbsGAkJCdx+++0sXLiQK6+8knPOOQfA9Tf70Ucfcf/999OzZ0/mzp1LdnY2b731Fr/99huffPIJZrPZFZPdbmfmzJmcc8453HvvvbWOpfz3v//Nxx9/zIQJE7j22ms5fPgw//3vf/nzzz957733MBqNDf63JJoBTQhRq8LCQi0xMVGbPXt2nerv3r1bS0xM1ObNm+dW/tRTT2mJiYnaTz/95Cq78MILtcTERG3Lli2usuzsbK1Hjx7aU0895SobN26cNmvWrFqPO336dG3s2LFaWVmZq0xVVe3KK6/ULr74YlfZqlWrtMTERO3666/XVFV1lT/xxBNa165dtYKCAk3TNC05OVlLTEzUduzYUeMxN2/erCUmJmqbN292K09LS9MSExO1VatWaZqmafn5+VpiYqL2+uuv13oOJ6vrdtdcc412zTXXVIlr7NixmtVqdZXPnTtX69y5s3bjjTe6bX/llVdqF154YY3xV5aYmKgtXLjQtVzRnmlpaa6y0tLSKts99NBDWu/evd1+PrNmzXI7bm3HHz9+vJaUlKTl5ua6ynbv3q116dJFu+eee1xlCxcu1BITE7X777/fbZ+33HKLNnDgwCrHOllNMVW06YgRI6qcX1lZmeZwOKqcQ48ePbTFixfXel51/b198cUXtcTERO3LL7+sElvF7/GOHTuq/blZrVYtKSlJGzt2rGaxWFzlGzdu1BITE7UXX3zRVXbvvfdqiYmJ2rPPPlvlOPfee69b22zZskVLTEzUPvvsM7d63333nVt5Xf6WRMsilwWFOIWioiKg9l6Fyr799lsAbrjhBrfyGTNmuK2v0LFjR/r37+9aDgsLo0OHDqSlpbnKzGYz+/bt48CBA9UeMy8vj82bNzN69GiKiorIyckhJyeH3NxchgwZwoEDB6pc/pgyZQqKoriW+/fvj8PhID09HYCgoCDAOZDfZrPV6dxr4uvri9Fo5JdffqlyuaQxtqswfvx4t3EyvXr1QtM0Jk6c6FavV69eHDlyBLvdftrHqE7lno6Kn0f//v0pLS0lNTX1tPd3/Phxdu/ezRVXXEFISIirvEuXLpx33nlVfqcApk6d6rbcv39/8vLyXL/P9XX55ZdX6ckxmUyucVcOh4Pc3Fz8/f3p0KEDf/75Z437Op3f2y+//JIuXbpU6YEF3H6Pq7Nr1y6ys7O56qqr3MZ8DRs2jPj4+GrHS1511VW17hNg3bp1BAUFMXjwYFfsOTk5dO/eHX9/f9fl8ob8WxLNg1wWFOIUAgMDAedlibpIT09Hp9PRrl07t/JWrVphNptdyUuF1q1bV9lHcHCwWzJx++23889//pNLLrmExMREhgwZwvjx4+nSpQvgnCJC0zRefPFFXnzxxWrjys7Odrs806ZNG7f1FZdFCgoKABg4cCCXXHIJixcv5s0332TgwIFcdNFFXHbZZac9gNxkMnH33Xfz9NNPM3jwYHr37s2wYcO4/PLLadWqVYNvV9M5VnzJndzmQUFBqKpKYWEhoaGhp3Vu1dm3bx8vvPACmzdvrpLMFBYWnvb+MjIyAOjQoUOVdQkJCfzwww+uQdcVavr55ufnu36n66O6S7GqqvLWW2/x7rvvcvjwYbexZZWTwZOdzu/toUOHuPjii+sVc23tFx8fz6+//upWZjAYiI6OPuV+Dx48SGFhIUlJSdWuz87OBhr2b0k0D5JcCXEKgYGBREZGsm/fvtPa7lT/mq6g1+tPWWfAgAEkJyfz1VdfsWnTJj788ENWrFjBI488wuTJk1FVFXD
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAHPCAYAAAB+5v83AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAArElJREFUeJzs3Xd4FNX6wPHvzNZkk00lCQQQAoQqTYoRRERREAVFQMSCFxTl2tGrotd6sf5Er8C1ISrqBeXaQQSDYkNRVBRUUEzoLT2btnXm98duNlmSQAip8H6eZ5+ZOXPm7JmTTfbNmTNnFF3XdYQQQgghRL1Qm7oCQgghhBDHEwmuhBBCCCHqkQRXQgghhBD1SIIrIYQQQoh6JMGVEEIIIUQ9kuBKCCGEEKIeSXAlhBBCCFGPJLgSQgghhKhHElwJIYQQQtQjCa6EEC3eFVdcwRVXXNEk7/3uu+/StWtX9uzZU29l7tmzh65du/Luu+/WW5nNQUs/r7vuuosRI0Y0dTVEC2Bs6goI0ZLs2rWLl156iXXr1pGVlYXJZCI1NZXRo0dzySWXYLVam7qKogVZvnw5ubm5XHXVVU1dlaDmWKfaOnjwIMuWLePss8+me/fuTV0dcQKT4EqIWvr888+5+eabMZvNjBs3jtTUVDweDz/++CP/93//x19//cW//vWvpq7mCWnRokVNXYU6WbFiBdu2basSyCQnJ7Np0yaMxsb/E11TnepDQ59XVlYWCxYsIDk5uUGCq3/961/I43hFbUhwJUQt7N69m1tvvZU2bdqwePFiEhISgvsuu+wydu7cyeeff950FTzBmc3mpq5CvVIUBYvF0tTVOCKXy4XJZEJVazfCpKWc16FKS0sJDw/HZDI1dVVECyFjroSohZdeeonS0lIefvjhkMCq3EknncTUqVOD216vl//85z+cffbZ9OrVixEjRvDUU0/hdrtDjhsxYgTXXnstP/zwAxMmTODkk0/mrLPO4v333w/J5/F4WLBgAeeccw4nn3wygwcP5tJLL2XdunUh+TIyMrjpppsYNGgQJ598MuPHj+fTTz8NyVM+RujHH3/k0Ucf5dRTT6Vv375cf/315OXlheTdvHkz06dPZ/DgwfTu3ZsRI0Ywe/bs4P7vvvuOrl278t1334UcV93YmuzsbGbPns2wYcPo1asXQ4cOZebMmUccq1Sb4w4dc1Ver5UrV7JgwQJOP/10+vXrx0033URRURFut5uHH36YtLQ0+vXrx+zZs0N+NocbG9S1a1fmz59/2DqvWbOGGTNmMHToUHr16sXZZ5/Nf/7zH3w+X0idP//8c/bu3UvXrl3p2rVrcDxPTe//7bffMmXKFPr27cuAAQOYOXMmGRkZIXnmz59P165d2blzJ3fddRcDBgzglFNOYfbs2ZSVlR223oerU3mbfvTRRzz99NOcfvrp9OnTh+LiYgoKCnj88ce54IIL6NevH/379+fqq69m69atIeXXdF61+dwCOBwOHnnkEUaMGEGvXr0YNmwYd9xxB3l5eXz33XdMmDABgNmzZwfrX/m9Pv74Y8aPH0/v3r0ZPHgwt99+OwcPHgx5j7vuuot+/fqxa9currnmGvr168ftt98e3HfomCtN03j11VcZM2YMJ598Mqeddhr33XcfhYWFIfmO9Lskji/ScyVELaxdu5Z27drRv3//WuX/5z//yXvvvce5557L3/72NzZt2sQLL7xARkYG//nPf0Ly7ty5k5tvvpkJEyZw0UUX8c4773DXXXfRs2dPunTpAsCCBQt44YUXmDhxIr1796a4uJhff/2V3377jSFDhgCwbds2Lr30UhITE7nmmmsIDw/n448/5vrrr2f+/PmMHDky5H3nzJmD3W7nhhtuYO/evSxevJiHHnqIf//73wDk5uYyffp0YmJimDFjBna7nT179pCenl6nNrzxxhv566+/uPzyy0lOTiYvL49169axf/9+2rZtW+/HAbz44otYrVZmzJjBzp07eeONNzAajSiKgsPh4IYbbuCXX37h3XffJTk5mRtuuKFO53ao9957j/DwcP72t78RHh7O+vXrmTdvHsXFxdx5550AXHfddRQVFXHgwIHgl6zNZquxzG+++YZrrrmGtm3bcsMNN+B0OnnjjTe49NJLeffdd6u0xS233ELbtm2ZNWsWv//+O//73/+IjY3lH//4R43vUZs6Pfvss5hMJqZPn47b7cZkMvHXX3+xZs0aRo0aRdu2bcnJyeGtt97i8ssv56OPPiIxMbHG96zt57akpITLLruMjIwMLr74Ynr06EF+fj6fffYZBw8epFOnTtx0003MmzePSy65hFNOOQUg+Dv77rvvMnv2bE4++WRmzZpFbm4ur732Gj/99BPvv/8+drs9WCev18v06dM55ZRTuPPOOw87lvK+++7jvffeY/z48VxxxRXs2bOH//73v/z+++8sXboUk8lU779LogXQhRCHVVRUpKempuozZ86sVf4tW7boqamp+j333BOS/thjj+mpqan6t99+G0w788wz9dTUVH3Dhg3BtNzcXL1Xr176Y489FkwbO3asPmPGjMO+79SpU/Xzzz9fd7lcwTRN0/RLLrlEP+ecc4Jp77zzjp6amqpfddVVuqZpwfRHHnlE7969u+5wOHRd1/X09HQ9NTVV37RpU43vuX79ej01NVVfv359SPru3bv11NRU/Z133tF1XdcLCwv11NRU/aWXXjrsORyqtsddfvnl+uWXX16lXueff77udruD6bNmzdK7du2qX3311SHHX3LJJfqZZ55ZY/0rS01N1efNmxfcLm/P3bt3B9PKysqqHHfvvffqffr0Cfn5zJgxI+R9D/f+48aN09PS0vT8/Pxg2pYtW/Ru3brpd9xxRzBt3rx5empqqj579uyQMq+//np90KBBVd7rUDXVqbxNzzrrrCrn53K5dJ/PV+UcevXqpS9YsOCw51Xbz+0zzzyjp6am6p988kmVupV/jjdt2lTtz83tdutpaWn6+eefrzudzmD62rVr9dTUVP2ZZ54Jpt155516amqq/uSTT1Z5nzvvvDOkbTZs2KCnpqbqH374YUi+L7/8MiS9Nr9L4vgilwWFOILi4mLg8L0KlX3xxRcA/O1vfwtJnzZtWsj+cp07d2bAgAHB7djYWDp27Mju3buDaXa7nW3btrFjx45q37OgoID169czevRoiouLycvLIy8vj/z8fIYOHcqOHTuqXP6YNGkSiqIEtwcMGIDP52Pv3r0AREZGAv6B/B6Pp1bnXhOr1YrJZOL777+vcrmkIY4rN27cuJBxMr1790bXdS6++OKQfL1792b//v14vd6jfo/qVO7pKP95DBgwgLKyMjIzM4+6vKysLLZs2cJFF11EdHR0ML1bt26cdtppVT5TAJMnTw7ZHjBgAAUFBcHPc11deOGFVXpyzGZzcNyVz+cjPz+f8PBwOnbsyO+//15jWUfzuf3kk0/o1q1blR5YIORzXJ1ff/2V3NxcLr300pAxX8OHDyclJaXa8ZKXXnrpYcsEWLVqFZGRkQwZMiRY97y8PHr27El4eHjwcnl9/i6JlkEuCwpxBBEREYD/skRt7N27F1VVad++fUh6q1atsNvtweClXOvWrauUERUVFRJM3HTTTfz973/n3HPPJTU1laFDhzJu3Di6desG+KeI0HWdZ555hmeeeabaeuXm5oZcnmnTpk3I/vLLIg6HA4BBgwZx7rnnsmDBAl599VUGDRrE2WefzQUXXHDUA8jNZjO33347jz/+OEOGDKFPnz4MHz6cCy+8kFatWtX7cTWdY/mX3KFtHhkZiaZpFBUVERMTc1TnVp1t27bx73//m/Xr11cJZoqKio66vH379gHQsWPHKvs6derE119/HRx0Xa6mn29hYWHwM10X1V2K1TSN1157jSVLlrBnz56QsWWVg8FDHc3ndteuXZxzzjl1qvPh2i8lJYUff/wxJM1oNJKUlHTEcnfu3ElRURFpaWnV7s/NzQXq93dJtAwSXAlxBBERESQkJLBt27ajOu5I/02XMxgMR8wzcOBA0tPT+fTTT1m3bh1vv/02ixc
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for i in range(5):\n",
" plot_consensus(x[i], config)"
2025-07-25 00:52:58 -04:00
]
2025-07-26 20:07:01 -04:00
},
{
"cell_type": "code",
"execution_count": 13,
"id": "eaf34907",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([ 0.88282514, 0.4825251 , -0.07153511, 0.03161097, 0.97659564], dtype=float32)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = initial_state[0]\n",
"s"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "faa4b66f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([[ 0. , -0.40030003, -0.95436025, -0.8512142 , 0.0937705 ],\n",
" [ 0.40030003, 0. , -0.5540602 , -0.45091414, 0.49407053],\n",
" [ 0.95436025, 0.5540602 , 0. , 0.10314608, 1.0481308 ],\n",
" [ 0.8512142 , 0.45091414, -0.10314608, 0. , 0.9449847 ],\n",
" [-0.0937705 , -0.49407053, -1.0481308 , -0.9449847 , 0. ]], dtype=float32)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s[jnp.newaxis, :] - s[:, jnp.newaxis]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "4d025175",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Array([3, 3, 3, 4, 2], dtype=int32)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jnp.sum(adj_mat, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0be99bad",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 22,
"id": "dcf551fc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running Kuramoto simulation for 2000 steps...\n",
"Simulation complete.\n",
"\n",
"--- Analysis Results ---\n",
"Initial Coherence R(0): 0.3215\n",
"Final Coherence R(T): 0.8273\n",
"\n",
"Natural Frequencies (ω):\n",
"[-0.7398006 -0.604128 -0.20279019 0.44994825 -0.46915287 -1.2962328\n",
" 0.21116947 -1.1270597 0.52725625 2.3874943 -0.81883216 0.7570075\n",
" 0.05850044 -0.18476951 1.1620507 1.8633609 0.87869114 1.6664302\n",
" 0.9078429 -2.4709177 ]\n",
"\n",
"Mean Frequencies over Simulation:\n",
"[ 1.46405891e-01 -3.69619280e-02 1.12412088e-01 1.85934424e-01\n",
" -2.74336944e-05 -4.56956811e-02 7.81505778e-02 1.00682445e-01\n",
" 5.45639619e-02 2.78184921e-01 3.78948152e-02 2.49829754e-01\n",
" 5.42316996e-02 5.19525371e-02 1.47024721e-01 6.63236454e-02\n",
" 1.17484398e-01 2.30125502e-01 9.03259367e-02 -6.20467544e-01]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKAAAAMQCAYAAAAQNB1HAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XecXHW9+P/XOdPLTtma3c1ukk2y6Q1IIHSCgHRFBFEQpQh+uerV6+/a7uNab9F7vX4Vvl6xIgjYQAVpAiJI6AmQ3su2ZOv0PnPO74/ZmexsSbZmy7yfj0cem5055zOfc95nPnvmPZ+i6LquI4QQQgghhBBCCCHEBFEnuwJCCCGEEEIIIYQQYmaTBJQQQgghhBBCCCGEmFCSgBJCCCGEEEIIIYQQE0oSUEIIIYQQQgghhBBiQkkCSgghhBBCCCGEEEJMKElACSGEEEIIIYQQQogJJQkoIYQQQgghhBBCCDGhJAElhBBCCCGEEEIIISaUJKCEEEIIIYQQQgghxISSBJQQQgghxCjcdNNN3HTTTfnfW1paWLRoEY8++mj+sbvvvptFixZNRvUm1KJFi/jGN74x2dWYUl5//XUWLVrE66+/PtlVGZX+17MQQggx3iQBJYQQQpwEjz76KIsWLWLr1q0Fj4dCIa699lpWrFjBSy+9NEm1m3gvvvgid99994SV/8ILL3Drrbdy+umns2LFCi655BK+/e1v4/P5Juw1J9qDDz5YkMw6GRYtWpT/t3jxYs4++2xuueWWaZtUAfjiF79YcFxD/fviF7842VU9rn379nH33XfT0tIy2VURQgghRsU42RUQQgghilU4HOaWW25h9+7d3HPPPZx77rmTXaUJ8+KLL/Lggw/yqU99atzL/va3v83Pf/5zFi9ezG233YbH42H79u386le/4oknnuC+++6joaFh3F/3Zz/72biX2dfDDz+M1+vlmmuumdDX6e+ss87i6quvRtd1WlpaePjhh7n55pu59957Oe+8805qXcbD9ddfz/r16/O/t7S08IMf/IDrr7+eU089Nf94fX39mF5n7dq1bNmyBZPJNKZyhrJv3z7uuece1q1bx+zZs8e9/Im+noUQQghJQAkhhBCTIBwOc+utt7Jz507uueeecflgr2kaqVQKi8UyDjWcHv785z/z85//nMsuu4z//u//xmAwAPDBD36Qa665ho9+9KN85jOf4Q9/+ANG4/je9pjN5nEt72RIJBKYTCZUdehO8HPnzuXqq6/O/37RRRdx1VVXcf/990/LBNSaNWtYs2ZN/vetW7fygx/8gNWrVxccZ3/RaBS73T7s11FVdVq+92KxGDabbVpez0IIIaYXGYInhBBCnGSRSITbbruN7du3c/fdd3P++efnn/viF7/Ihg0bBuwz2FxCuXl4HnvsMS6//HJWrFjB3//+dyDbm+FDH/oQp59+OitXruSaa67h6aefHlBuroynnnqKyy67jJUrV3L99deze/duAH79619z0UUXsWLFCm666aZBh/889dRTXHPNNaxcuZLTTz+dz3/+87S3txcc04MPPph/vdy/nGg0yn/+539y3nnnsXz5ci655BJ+9rOfoev6Cc/lPffcg9vt5pvf/GY++ZSzcuVKbrvtNvbs2cMzzzyTf/zQoUN86lOf4qyzzmLFihWce+65fPaznyUUChXs/6c//Ylrr72WVatWsXbtWj7ykY/w8ssv558f7Zw5jzzyCB/96EdZv349y5cv57LLLuOhhx4q2GbDhg3s3buXN954I3+++r5Wc3Mzn/70p1m3bh2rVq3iuuuu429/+1tBGbk5iZ544gm+973vcc4557Bq1SrC4fCI6rto0SK8Xu+gsX/uuee44oorWL58OZdffvmAYaStra187Wtf45JLLslfH5/+9KcHlJVKpbjnnnu4+OKLWbFiBaeffjo33HADGzduLNhu//79+eNesWIF11xzDc8///yIjmcwuSGyb7zxBl/72tdYv359Ptk23GMYag6od999l1tvvZVTTz2VVatWceONN7Jp06YBdWhvb+fLX/4yZ599NsuXL2fDhg189atfJZlM8uijj/KZz3wGgI9+9KP5a6Lvaz344INcfvnlLF++nLPPPpuvf/3rBIPBgte46aabuOKKK9i2bRsf+chHWLVqFf/zP/+Tf67/9ZxMJvnBD37ARRddxPLlyznvvPP4zne+QzKZLNhu48aN3HDDDZx22mmsWbOGSy65JF+uEEIIkSM9oIQQQoiTKBaLcfvtt7Nt2za+//3vc8EFF4ypvNdee42nnnqKj3zkI3i9XmprawG4//772bBhA1deeSWpVIonnniCz3zmM9x7770FCS+At956i7/+9a98+MMfBuDHP/4xd955J7fddhsPPfQQH/7whwkEAvz0pz/ly1/+Mvfff39+30cffZQvfelLrFixgs997nN0d3dz//33s3nzZv74xz/icrm4/vrr6ejoYOPGjXznO98peG1d1/nkJz/J66+/zrXXXsuSJUv4+9//zne+8538B/KhHDp0iIMHD3LNNdfgdDoH3eZ973sfd999Ny+88AKXX345yWSSW2+9lWQyyY033kh5eTnt7e387W9/IxgMUlJSAmQTW3fffTdr1qzh05/+NCaTiXfffZfXXnuNs88+e8Rx6uvhhx9m4cKFbNiwAaPRyAsvvMDXv/51dF3nIx/5CABf/vKX+eY3v4ndbufOO+8EoLy8HICuri4+9KEPEYvFuOmmm/B6vfzhD3/gk5/8ZD5Z0NcPf/hDTCZT/rhHOkQsEAgQDAaZM2dOweObNm3iL3/5Cx/+8IdxOBw88MADfPrTn+aFF17A6/UC2d5Gb7/9NpdffjmzZs2itbWVhx9+mI9+9KM88cQT2Gw2IHu+7733Xj74wQ+ycuVKwuEw27ZtY/v27Zx11lkA7N27lxtuuIGqqipuv/127HY7Tz31FHfddRd33333gOMeja9//euUlpZy1113EY1GR3QMg3n11Ve5/fbbWb58Of/wD/+Aoig8+uij3HzzzTz00EOsXLkSyCafrr32WkKhENdddx0NDQ20t7fzzDPPEI/HWbt2LTfddBMPPPAAd955Z35I6fz584Fsgvqee+7hzDPP5IYbbuDgwYM8/PDDbN26lYcffrgg5n6/n9tvv53LL7+cq666irKyskHrrmkan/zkJ9m0aRPXXXcd8+fPZ8+ePfzyl7/k0KFD/PCHP8zH5Y477mDRokV8+tOfxmw2c/jwYTZv3jzmeAghhJhhdCGEEEJMuEceeURvbGzUL7jgAn3ZsmX6s88+O+h2X/jCF/QLLrhgwOM/+MEP9MbGxoLHGhsb9cWLF+t79+4dsH0sFiv4PZlM6ldccYX+0Y9+dEAZy5cv15ubm/OP/frXv9YbGxv1s846Sw+FQvnHv/vd7+qNjY35bZPJpL5+/Xr9iiuu0OPxeH67F154QW9sbNS///3v5x/7+te/PqD+uq7rzz77rN7Y2Kj/8Ic/LHj8U5/6lL5o0SL98OHDA/bpv+8vfvGLIbfRdV0/5ZRT9Pe///26ruv6jh079MbGRv2pp54acvtDhw7pixcv1u+66y49k8kUPKdpWv7/N954o37jjTfmf29ubtYbGxv1Rx55JP/YYHHrHxtd1/VbbrlFv/DCCwseu/zyywvKz/m3f/s3vbGxUX/zzTfzj4XDYX3Dhg36BRdckK/za6+9pjc2NuoXXnjhoK85mMbGRv3LX/6y3t3drXd3d+vvvvuufvPNN+uNjY36z3/+84Ltli1bVhCfnTt36o2NjfoDDzxw3GN9++239cbGRv0Pf/hD/rGrrrpK/8QnPnHcut188836FVdcoScSifxjmqbp119/vX7xxRcP6/h0Xde3bNkyIE659+cNN9ygp9Ppgu2Hewy58/3aa6/l63bxxRfrt9xyS8F1E4vF9A0bNugf//jH84/98z//s7548WJ9y5YtA14rt+9TTz1VUH5Od3e3vmzZMv2WW24puF5/9atf6Y2Njfrvf//7/GM33nij3tjYqD/88MMDXqf/9fzHP/5RX7x4ccF1puu6/vDDD+u
"text/plain": [
"<Figure size 1200x800 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from kuramoto import *\n",
"config = KuramotoConfig(num_agents=20, coupling=3, T=20)\n",
"key = jax.random.PRNGKey(42)\n",
"key, adj_key, state_key = jax.random.split(key, 3)\n",
"\n",
"# 2. Generate system components\n",
"adj_matrix = generate_random_adjacency_matrix(adj_key, config)\n",
"thetas0, omegas = generate_initial_state(state_key, config)\n",
"\n",
"# 3. Run the simulation\n",
"print(f\"Running Kuramoto simulation for {config.num_time_steps} steps...\")\n",
"trajectory = run_kuramoto_simulation(thetas0, omegas, adj_matrix, config)\n",
"# Block until the computation is done to measure time accurately if needed\n",
"trajectory.block_until_ready()\n",
"print(\"Simulation complete.\")\n",
"\n",
"# 4. Analyze the results\n",
"R_over_time = phase_coherence(trajectory)\n",
"avg_frequencies = mean_frequency(trajectory, omegas, adj_matrix, config)\n",
"\n",
"print(\"\\n--- Analysis Results ---\")\n",
"print(f\"Initial Coherence R(0): {R_over_time[0]:.4f}\")\n",
"print(f\"Final Coherence R(T): {R_over_time[-1]:.4f}\")\n",
"print(\"\\nNatural Frequencies (ω):\")\n",
"print(np.asarray(omegas))\n",
"print(\"\\nMean Frequencies over Simulation:\")\n",
"print(np.asarray(avg_frequencies))\n",
"\n",
"# 5. Plot the results\n",
"plot_kuramoto_results(np.asarray(trajectory), np.asarray(R_over_time), config)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "70037c87",
"metadata": {},
"outputs": [],
"source": []
2025-07-25 00:52:58 -04:00
}
],
"metadata": {
"kernelspec": {
"display_name": "graph-recognition-w-attn",
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}