1744 lines
198 KiB
Plaintext
1744 lines
198 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n",
|
|
"from cadCAD.configuration import Configuration\n",
|
|
"import networkx as nx\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import numpy as np\n",
|
|
"import scipy.stats as sts\n",
|
|
"import pandas as pd\n",
|
|
"import seaborn as sns\n",
|
|
"import matplotlib.colors as colors\n",
|
|
"import matplotlib.cm as cmx\n",
|
|
"\n",
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"#import conviction files\n",
|
|
"from conviction_helpers import *\n",
|
|
"from conviction_system_logic import *"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"This notebook uses the differential games framework developed by BlockScience. It is currently in private beta, and building towards a full open source release.\n",
|
|
"\n",
|
|
"**Description:**\n",
|
|
"\n",
|
|
"cadCAD is a Python library that assists in the processes of designing, testing and validating complex systems through simulation. At its core, cadCAD is a differential games engine that supports parameter sweeping and Monte Carlo analyses and can be easily integrated with other scientific computing Python modules and data science workflows.\n",
|
|
"\n",
|
|
"To learn more about cadCAD, follow our [tutorial series](../../tutorials)\n",
|
|
"\n",
|
|
"**Installing cadCAD:**\n",
|
|
"\n",
|
|
"cadCAD is in private beta. Tokens are issued to participants. Replace `<TOKEN>` in the installation URL below\n",
|
|
"```bash\n",
|
|
"pip3 install cadCAD --extra-index-url https://<TOKEN>@repo.fury.io/blockscience/\n",
|
|
"```\n",
|
|
"\n",
|
|
"If you'd like to participate in the beta program, contact cadcad [at] block [dot] science.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#THIS policy is one of the main paramters of this system!\n",
|
|
"\n",
|
|
"#maximum share of funds a proposal can take\n",
|
|
"default_beta = .2 #later we should set this to be param so we can sweep it\n",
|
|
"# tuning param for the trigger function\n",
|
|
"default_rho = default_beta**2\n",
|
|
"\n",
|
|
"def trigger_threshold(requested, funds, supply, beta=default_beta , rho=default_rho):\n",
|
|
" \n",
|
|
" share = requested/funds\n",
|
|
" if share < beta:\n",
|
|
" return rho*supply/(beta-share)**2\n",
|
|
" else: \n",
|
|
" return np.inf"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/Users/Zargham/Documents/GitHub/conviction/conviction_helpers.py:96: RuntimeWarning: divide by zero encountered in log10\n",
|
|
" demo_data_Z0[sof_ind,ts_ind] = np.log10(trigger)\n",
|
|
"/Users/Zargham/Documents/GitHub/conviction/conviction_helpers.py:98: RuntimeWarning: invalid value encountered in double_scalars\n",
|
|
" demo_data_Z2[sof_ind,ts_ind] = trigger/tc #share of maximum possible conviction\n",
|
|
"/Users/Zargham/Documents/GitHub/conviction/conviction_helpers.py:99: RuntimeWarning: invalid value encountered in double_scalars\n",
|
|
" demo_data_Z3[sof_ind,ts_ind] = np.log10(trigger/tc)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"dict1 = trigger_sweep('token_supply',trigger_threshold)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.15940000000000001, 1008990000.0, 'fixed alpha = 0.5')"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 720x360 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"trigger_plotter(dict1['share_of_funds'],\n",
|
|
" dict1['log10_trigger'], \n",
|
|
" 'log10_trigger',\n",
|
|
" dict1['total_supply'],\n",
|
|
" 'Token Supply')\n",
|
|
"axis = plt.axis()\n",
|
|
"plt.text(.2*axis[0]+.8*axis[1],axis[-1]*1.01, 'fixed alpha = 0.5')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dict2 = trigger_sweep('alpha',trigger_threshold)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"dict_keys(['log10_trigger', 'trigger', 'share_of_max_conv', 'log10_share_of_max_conv', 'alpha', 'share_of_funds'])"
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"dict2.keys()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 720x360 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"trigger_plotter(dict2['share_of_funds'],\n",
|
|
" dict2['log10_share_of_max_conv'], \n",
|
|
" 'Log10 Share of Conviction Required to Pass',\n",
|
|
" dict2['alpha'],\n",
|
|
" 'alpha')\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"n= 25 #initial participants\n",
|
|
"m= 3 #initial proposals\n",
|
|
"\n",
|
|
"initial_sentiment = .5\n",
|
|
"\n",
|
|
"network, initial_funds, initial_supply, total_requested = initialize_network(n,m,total_funds_given_total_supply,trigger_threshold)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Note from Kris, consider: substitutibility of proposals st when a substitute passes, affinity for the others goes away; this will make the process more realistic because proposals will end up never passing.\n",
|
|
"\n",
|
|
"implementation notes:\n",
|
|
"- create substitutability matrix (proposal x proposal)\n",
|
|
"- update accounting when thing pass: change affinities and should affect sentiments\n",
|
|
"- define a new 'type' of proposals for tracking 'dead' ones (no longer candidates = zero tokens in support)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
"participants = get_nodes_by_type(network, 'participant')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'type': 'proposal',\n",
|
|
" 'conviction': 0,\n",
|
|
" 'status': 'candidate',\n",
|
|
" 'age': 0,\n",
|
|
" 'funds_requested': 63248.8961832528,\n",
|
|
" 'trigger': inf}"
|
|
]
|
|
},
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"#sample proposal\n",
|
|
"network.nodes[proposals[0]]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'type': 'participant',\n",
|
|
" 'holdings': 753.5821088000997,\n",
|
|
" 'sentiment': 0.20260793282468248}"
|
|
]
|
|
},
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"#sample participant\n",
|
|
"network.nodes[participants[0]]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'affinity': 0.13023927236764288, 'tokens': 0, 'conviction': 0}"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"#sample relationship participant to proposal\n",
|
|
"network.edges[(participants[0],proposals[0])]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Explore the data created in initial conditions!"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'Histogram of Participants Token Holdings')"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.hist([ network.nodes[i]['holdings'] for i in participants])\n",
|
|
"plt.title('Histogram of Participants Token Holdings')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'Histogram of Proposals Funds Requested')"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEICAYAAABYoZ8gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHP9JREFUeJzt3XuYXFWZ7/Hvj1xAAkowDcZcCGhUoiJgnwiCY7yAAZU4j54xESGonBwvzBlnvMHoAQSdg845jnpQQ9QM3iAwKE7EMCFHRHQQSEcDGCAQQpi0DSQQQrg4YsJ7/lirZadS3VXdXUmFXr/P89TTe6+19q53r6p6a9fau/dWRGBmZuXYo90BmJnZruXEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHi30UkrZI0o91xtJOkv5S0XtLjko5odzytJmmdpDe3O46+SApJL253HLs7SadJ+lW749iZnPhboN4HvvbNExEvj4jrGqxnSv5wjtxJobbb/wbOiIh9IuK3tZV525/IXwy/l/QlSSPaEOcuI2mGpKfzNvc+ftLuuHrl9/G2HNcWSbdIelu74+qPpOsknd7uOHZnwzXBWB2SRkbE1jaGcBCwqkGbV0XEGkkvA64D7gLmVxvsBtvRaj0RMbHdQfTj1xFxrKQ9gP8GLJI0MSI2tzswGxzv8e8i1V8FkqZL6sp7UA9K+lJudn3+uznvYR0taQ9Jn5F0n6QNkr4r6XmV9Z6a6x6W9D9rnudcSVdI+r6kLcBp+bl/LWmzpPslXShpdGV9IenDku6W9Jik8yW9KC+zRdLl1fY121g3Vkl7SnocGAHcIumeRv0VEXcCvwReUem/T0m6FXhC0khJh+a9u815KO2kSiwXS5ovaVnejl9IOqhS/1pJyyU9mv++tlJ3mqS1ebl7JZ2cy18k6drc1w9J+oGk/froi75e46blbfhcZX6GpO7K/DpJH5d0a96OyyTtVan/RH6NeyS9v2bdJ0q6PW/j7yV9vFE8EfE08D1gDDC1sq6jJN2QX4dbVBnSlHRw7vvH8mtxoaTv19ueyjb1vn/3kHSmpHtyn18uaf9ct1d+Xz+cn3e5pAMlfR54HXCh0mfowtz+Zfn5N0laLemvKs/5fEmL82t1M/CiRn3xrBcRfgzxAawD3lxTdhrwq3ptgF8Dp+TpfYCj8vQUIICRleXeD6wBDsltfwR8L9dNAx4HjgVGk4ZS/lR5nnPz/DtIX/LPAV4NHEX6tTcFuAP4aOX5AlgMPBd4OfBH4Gf5+Z8H3A7M7aMf+oy1su4X99OPf67P2/YA8IFK/60EJuXtGJWf6+/ztr8ReAx4aW5/cZ7/C2BP4Cu9rwewP/AIcEruhzl5/vmkpLalsp7xwMvz9IuB4/L6Okhf1F8eyGtcZ5tnAN191F0MfK6vtvn5bgZemLfpDuCDuW4m8CDpi3MMcElN/94PvC5PjwWO7COG0yr9NgL4CPAUcEAumwA8DJxIeo8dl+c7Kv3wpdxnf5Ffk+/3te01ffhR4EZgYl7+IuDSXPffgZ8Ae+e4Xg08N9ddB5xeWecYYD3wvvx6Hwk8VHldFwGX53avAH5P5bM7HB9tD2A4PPKb9XFgc+XxJH0n/uuBzwLjatYzhR0T/8+AD1fmX0pK5iOBs3s/CLlu7/yhrCb+6xvE/lHgysp8AMdU5lcAn6rM/x8qya5mXX3GWll3o8S/hZSE7wE+B+xR6b/3V9q+jvTFsEel7FLg3Dx9MbCoUrcPsI30xXEKcHPNc/+alOTG5NfvncBzGvTdO4DfDuQ1rrOOGcDTNe+dv6psQ6PE/97K/BeB+Xl6IXBBpe4lbJ/4/4OUPJ/bIL7TgK05rj8Bf+iNL9d/isqXey5bCswFJudlx1TqLqH5xH8H8KZK3Xieee+/H7gBOKxOzNexfeJ/N/DLmjYXAeeQvjT+BLysUvcPDPPE76Ge1nlHROzX+wA+3E/bD5A+iHfmn6j9HSx7IXBfZf4+0hv/wFy3vrciIp4k7W1Vra/OSHqJpKskPaA0/PMPwLiaZR6sTP+hzvw+g4i1WUdGxNiIeFFEfCbS8EK9bXkhsL6m/j7SHugO7SPicWBTXq42zj8vGxFPkBLFB4H7Jf1U6XgDkg6QtCgPjWwBvs+OfddrIK9xT/W9ExGX99O21gOV6Sd55rXZ7r3Bjtv7TtJe+n15KObofp7jxvyeHkv6Nfi6St1BwH/Nwy2bJW0m/QIdn2N4JPdpX3H05yDgysp67yB9eR9IGnJaSjre0CPpi5JG9bOe19TEeDLwAtIvt5H031fDjhN/G0TE3RExBzgA+AJwhaQxpD2yWj2kN26v3r2oB0k/1/98UFDSc0jDFds9Xc38N4A7gakR8VzSUIkGvzVNx9oK1W3pASYpHXCsPt/vK/OTeick7UMaDumpE+d2y0bE0og4jpS87gS+mdv8rxzDYbnv3ksffdfPazwQT5B+xfV6wQCWvZ/K9pO2rxrf8oiYleP7MWmoo1/5y/PDwCl65nTc9aQ9/uoX15iIuCDHMLZmu6txbLd9SmdwdVTq1wMn1Kx7r4j4fUT8KSI+GxHTgNcCbwNO7Q21JvT1wC9q1rNPRHwI2Eh6j/bZV8ORE38bSHqvpI68t9p7ZsQ20pvwadIYea9Lgb/NB8n2Ie2hXxbprJYrgLfnA5WjSUMLjZL4vqThlMfznuyHWrZh/cfaajeREscnJY3KBxTfThqv7XWipGNz35wP3BQR64ElwEskvUfpIPG7SccUrsoHCE/KyeqPpCG8bXl9++b5zZImAJ/oK7h+XuOBWJm3YX9JLyANyzXrctLB/GmS9iYNa/TGNlrSyZKeFxF/Ir0fmootIh4GvkUaZoT0q+ftkt4iaUQ+6DpD6ayf+4Au4LP5OY8lvUa97gL2kvTWvLf+GdJYfq/5wOeVD8pL6pA0K0+/QdIr85fFFtJwTe82PMj2n6GrSK/3Kfm9MkrSf5F0aERsIx2LOlfS3pKmkYaphjUn/vaYCaxSOtPlK8DsiPjPPFTzeeDf80/So0hjtd8jjRnfC/wn8NcAEbEqTy8i7V09BmwgJay+fBx4T277TeCyFm5Xn7G2WkQ8BZwEnEA6UPd14NRIZwP1uoSU8DaRDv6dnJd9mLSH+DHS0NgngbdFxEOkz8THSL8KNgGv55lhu8+SDgw+CvyUlDD6Uvc1HuBmfg+4hTTufQ0DeK0i4mrgy8C1pIPg19Y0OQVYl4esPkj69dKsL5O+kA7LX6SzSL8cN5L2rj/BM7nlPcBrSH15DvDdSoyPkvr2W6RfW08A1bN8vkIaWrpG0mOkA72vyXUvIO34bCENAf2C9CXUu9y7JD0i6asR8RhwPDCb9Lo+QPoV1vslcwZpiOwB0nGVfx5AXzwrKR/MsGEg72VvJg3j3NvueNpJ0sWkA4efaXcs9gxJ55IOMA/ki8ZazHv8z3KS3p5/oo4hnc55G2kP0cysLif+Z79ZPHPAcippSME/48ysTx7qMTMrjPf4zcwKs1tepG3cuHExZcqUdodhZvassWLFiocioqNxy9008U+ZMoWurq52h2Fm9qwhqen/OPZQj5lZYZz4zcwK48RvZlYYJ34zs8I48ZuZFcaJ38ysMA0Tv6RJkn4u6Q6l+5r+TZ02kvRVSWuU7v95ZKVurtL9W++WNOwvd2pmtrtr5jz+rcDHIuI3kvYFVkhaFhG3V9qcQLpOzFTSZVO/Qbrjzf6kS7F2km6OsELS4oh4pKVbYWZmTWu4xx8R90fEb/L0Y6RrX0+oaTYL+G4kNwL7SRoPvAVYFhGbcrJfRrpOuZmZtcmA/nNX0hTgCNLdj6omsP09K7tzWV/l9dY9D5gHMHnysL/zmZntxqac+dO2PO+6C966S56n6YO7+SYfPwQ+GhFbaqvrLBL9lO9YGLEgIjojorOjo6nLTZiZ2SA0lfjz/TB/CPwgIurdbq6b7W9WPJF0ffi+ys3MrE2aOatHwLeBOyLiS300Wwycms/uOQp4NCLuB5YCx0saK2ks6b6XS1sUu5mZDUIzY/zHkG7MfJuklbns74HJABExH1gCnEi6qfOTwPty3SZJ5wPL83LnRcSm1oVvZmYD1TDxR8SvqD9WX20TwEf6qFsILBxUdGZm1nL+z10zs8I48ZuZFcaJ38ysME78ZmaFceI3MyuME7+ZWWGc+M3MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVpiGN2KRtBB4G7AhIl5Rp/4TwMmV9R0KdOS7b60DHgO2AVsjorNVgZuZ2eA0s8d/MTCzr8qI+MeIODwiDgfOAn5Rc3vFN+R6J30zs91Aw8QfEdcDzd4ndw5w6ZAiMjOznaplY/yS9ib9MvhhpTiAayStkDSvVc9lZmaD13CMfwDeDvx7zTDPMRHRI+kAYJmkO/MviB3kL4Z5AJMnT25hWGZmVtXKs3pmUzPMExE9+e8G4Epgel8LR8SCiOiMiM6Ojo4WhmVmZlUtSfySnge8HvjXStkYSfv2TgPHA79rxfOZmdngNXM656XADGCcpG7gHGAUQETMz83+ErgmIp6oLHogcKWk3ue5JCL+rXWhm5nZYDRM/BExp4k2F5NO+6yWrQVeNdjAzMxs5/B/7pqZFcaJ38ysME78ZmaFceI3MyuME7+ZWWGc+M3MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVpmHil7RQ0gZJde+XK2mGpEclrcyPsyt1MyWtlrRG0pmtDNzMzAanmT3+i4GZDdr8MiIOz4/zACSNAL4GnABMA+ZImjaUYM3MbOgaJv6IuB7YNIh1TwfWRMTaiHgKWATMGsR6zMyshVo1xn+0pFskXS3p5blsArC+0qY7l9UlaZ6kLkldGzdubFFYZmZWqxWJ/zfAQRHxKuD/Aj/O5arTNvpaSUQsiIjOiOjs6OhoQVhmZlbPkBN/RGyJiMfz9BJglKRxpD38SZWmE4GeoT6fmZkNzZATv6QXSFKenp7X+TCwHJgq6WBJo4HZwOKhPp+ZmQ3NyEYNJF0KzADGSeoGzgFGAUTEfOBdwIckbQX+AMyOiAC2SjoDWAqMABZGxKqdshVmZta0hok/IuY0qL8QuLCPuiXAksGFZmZmO4P/c9fMrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVx4jczK4wTv5lZYZz4zcwK48RvZlYYJ34zs8I48ZuZFcaJ38ysMA0Tv6SFkjZI+l0f9SdLujU/bpD0qkrdOkm3SVopqauVgZuZ2eA0s8d/MTCzn/p7gddHxGHA+cCCmvo3RMThEdE5uBDNzKyVmrnn7vWSpvRTf0Nl9kZg4tDDMjOznaXVY/wfAK6uzAdwjaQVkub1t6CkeZK6JHVt3LixxWGZmVmvhnv8zZL0BlLiP7ZSfExE9Eg6AFgm6c6IuL7e8hGxgDxM1NnZGa2Ky8zMtteSPX5JhwHfAmZFxMO95RHRk/9uAK4Eprfi+czMbPCGnPglTQZ+BJwSEXdVysdI2rd3GjgeqHtmkJmZ7ToNh3okXQrMAMZJ6gbOAUYBRMR84Gzg+cDXJQFszWfwHAhcmctGApdExL/thG0wM7MBaOasnjkN6k8HTq9TvhZ41Y5LmJlZO/k/d83MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVx4jczK4wTv5lZYZz4zcwK01Til7RQ0gZJde+Zq+SrktZIulXSkZW6uZLuzo+5rQrczMwGp9k9/ouBmf3UnwBMzY95wDcAJO1Pukfva4DpwDmSxg42WDMzG7qmEn9EXA9s6qfJLOC7kdwI7CdpPPAWYFlEbIqIR4Bl9P8FYmZmO1nDm603aQKwvjLfncv6Kt+BpHmkXwtMnjx50IFMOfOng152KNZd8Na2PK+Z2UC16uCu6pRFP+U7FkYsiIjOiOjs6OhoUVhmZlarVYm/G5hUmZ8I9PRTbmZmbdKqxL8YODWf3XMU8GhE3A8sBY6XNDYf1D0+l5mZWZs0NcYv6VJgBjBOUjfpTJ1RABExH1gCnAisAZ4E3pfrNkk6H1ieV3VeRPR3kNjMzHayphJ/RMxpUB/AR/qoWwgsHHhoZma2M/g/d83MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVx4jczK4wTv5lZYZz4zcwK01TilzRT0mpJaySdWaf+nyStzI+7JG2u1G2r1C1uZfBmZjZwDW+9KGkE8DXgOKAbWC5pcUTc3tsmIv620v6vgSMqq/hDRBzeupDNzGwomtnjnw6siYi1EfEUsAiY1U/7OcClrQjOzMxar5nEPwFYX5nvzmU7kHQQcDBwbaV4L0ldkm6U9I6+nkTSvNyua+PGjU2EZWZmg9FM4ledsuij7WzgiojYVimbHBGdwHuAL0t6Ub0FI2JBRHRGRGdHR0cTYZmZ2WA0k/i7gUmV+YlATx9tZ1MzzBMRPfnvWuA6th//NzOzXayZxL8cmCrpYEmjScl9h7NzJL0UGAv8ulI2VtKeeXoccAxwe+2yZma26zQ8qycitko6A1gKjAAWRsQqSecBXRHR+yUwB1gUEdVhoEOBiyQ9TfqSuaB6NpCZme16DRM/QEQsAZbUlJ1dM39uneVuAF45hPjMzKzF/J+7ZmaFceI3MyuME7+ZWWGc+M3MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVpKvFLmilptaQ1ks6sU3+apI2SVubH6ZW6uZLuzo+5rQzezMwGruGtFyWNAL4GHAd0A8slLa5z79zLIuKMmmX3B84BOoEAVuRlH2lJ9GZmNmDN7PFPB9ZExNqIeApYBMxqcv1vAZZFxKac7JcBMwcXqpmZtUIziX8CsL4y353Lar1T0q2SrpA0aYDLImmepC5JXRs3bmwiLDMzG4xmEr/qlEXN/E+AKRFxGPD/gO8MYNlUGLEgIjojorOjo6OJsMzMbDCaSfzdwKTK/ESgp9ogIh6OiD/m2W8Cr252WTMz27WaSfzLgamSDpY0GpgNLK42kDS+MnsScEeeXgocL2mspLHA8bnMzMzapOFZPRGxVdIZpIQ9AlgYEasknQd0RcRi4H9IOgnYCmwCTsvLbpJ0PunLA+C8iNi0E7bDzMya1DDxA0TEEmBJTdnZlemzgLP6WHYhsHAIMZqZWQv5P3fNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVx4jczK4wTv5lZYZz4zcwK48RvZlYYJ34zs8I48ZuZFcaJ38ysME78ZmaFceI3MyuME7+ZWWGc+M3MCtNU4pc0U9JqSWsknVmn/u8k3S7pVkk/k3RQpW6bpJX5sbh2WTMz27Ua3npR0gjga8BxQDewXNLiiLi90uy3QGdEPCnpQ8AXgXfnuj9ExOEtjtvMzAapmT3+6cCaiFgbEU8Bi4BZ1QYR8fOIeDLP3ghMbG2YZmbWKs0k/gnA+sp8dy7ryweAqyvze0nqknSjpHf0tZCkebld18aNG5sIy8zMBqPhUA+gOmVRt6H0XqATeH2leHJE9Eg6BLhW0m0Rcc8OK4xYACwA6OzsrLt+MzMbumb2+LuBSZX5iUBPbSNJbwY+DZwUEX/sLY+Invx3LXAdcMQQ4jUzsyFqJvEvB6ZKOljSaGA2sN3ZOZKOAC4iJf0NlfKxkvbM0+OAY4DqQWEzM9vFGg71RMRWSWcAS4ERwMKIWCXpPKArIhYD/wjsA/yLJID/iIiTgEOBiyQ9TfqSuaDmbCAzM9vFmhnjJyKWAEtqys6uTL+5j+VuAF45lADNzKy1/J+7ZmaFceI3MyuME7+ZWWGc+M3MCuPEb2ZWGCd+M7PCOPGbmRXGid/MrDBO/GZmhXHiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kVxonfzKwwTvxmZoVpKvFLmilptaQ1ks6sU7+npMty/U2SplTqzsrlqyW9pXWhm5nZYDRM/JJGAF8DTgCmAXMkTatp9gHgkYh4MfBPwBfystNIN2d/OTAT+Hpen5mZtUkze/zTgTURsTYingIWAbNq2swCvpOnrwDepHTX9VnAooj4Y0TcC6zJ6zMzszZp5mbrE4D1lflu4DV9tYmIrZIeBZ6fy2+sWXZCvSeRNA+Yl2cfl7S6idh2tnHAQ8001Bd2ciTt1XQ/DHPuh8T9kLS8H4aYRw5qtmEziV91yqLJNs0smwojFgALmohnl5HUFRGd7Y6j3dwPifshcT8kz+Z+aGaopxuYVJmfCPT01UbSSOB5wKYmlzUzs12omcS/HJgq6WBJo0kHaxfXtFkMzM3T7wKujYjI5bPzWT8HA1OBm1sTupmZDUbDoZ48Zn8GsBQYASyMiFWSzgO6ImIx8G3ge5LWkPb0Z+dlV0m6HLgd2Ap8JCK27aRt2Rl2q6GnNnI/JO6HxP2QPGv7QWnH3MzMSuH/3DUzK4wTv5lZYYZ94pc0SdLPJd0haZWkv8nl+0taJunu/HdsLpekr+bLTNwq6cjKuubm9ndLmlspf7Wk2/IyX83/vLZbkbSXpJsl3ZL74bO5/OB8mY2782U3RufyAV+Go9GlPXYXkkZI+q2kq/J8cX0AIGldft+ulNSVy4r6XABI2k/SFZLuzHni6GHfDxExrB/AeODIPL0vcBfp0hNfBM7M5WcCX8jTJwJXk/4H4Sjgply+P7A2/x2bp8fmupuBo/MyVwMntHu76/SDgH3y9Cjgprx9lwOzc/l84EN5+sPA/Dw9G7gsT08DbgH2BA4G7iEd9B+Rpw8BRuc209q93X30xd8BlwBX5fni+iBvxzpgXE1ZUZ+LHOd3gNPz9Ghgv+HeD23v9Da8yP8KHAesBsbnsvHA6jx9ETCn0n51rp8DXFQpvyiXjQfurJRv1253fAB7A78h/Qf2Q8DIXH40sDRPLwWOztMjczsBZwFnVda1NC/352Vz+XbtdpcH6X9Jfga8Ebgqb1NRfVCJbx07Jv6iPhfAc4F7ySe6lNIPw36opyr/VD+CtLd7YETcD5D/HpCb1btExYQG5d11ync7eYhjJbABWEbaO90cEVtzk2rs212GA6hehmMg/bO7+TLwSeDpPP98yuuDXgFcI2mF0iVToLzPxSHARuCf8/DftySNYZj3QzGJX9I+wA+Bj0bElv6a1inr7/ITTV+Wot0iYltEHE7a650OHFqvWf477PpB0tuADRGxolpcp+mw7YMax0TEkaQr735E0l/003a49sVI4EjgGxFxBPAEaWinL8OiH4pI/JJGkZL+DyLiR7n4QUnjc/140l4w9H2Zif7KJ9Yp321FxGbgOtIY5X5Kl9mA7WMf6GU4ng2X5zgGOEnSOtJVZt9I+gVQUh/8WUT05L8bgCtJOwOlfS66ge6IuCnPX0H6IhjW/TDsE38+gv5t4I6I+FKlqnqZibmksf/e8lPz0fujgEfzT72lwPGSxuYj/MeTxnPvBx6TdFR+rlMr69ptSOqQtF+efg7wZuAO4Oeky2zAjv0wkMtwNHNpj7aKiLMiYmJETCHFd21EnExBfdBL0hhJ+/ZOk97Pv6Owz0VEPACsl/TSXPQm0pUGhnc/tPsgw85+AMeSflrdCqzMjxNJY7U/A+7Of/fP7UW68cw9wG1AZ2Vd7yfdU2AN8L5KeSfpQ3MPcCE1B4p2hwdwGPDb3A+/A87O5YeQktYa4F+APXP5Xnl+Ta4/pLKuT+dtXU3lDIXcr3fluk+3e5sb9McMnjmrp7g+yNt8S36s6o21tM9FjvNwoCt/Nn5MOitnWPeDL9lgZlaYYT/UY2Zm23PiNzMrjBO/mVlhnPjNzArjxG9mVhgnfjOzwjjxm5kV5v8DzZ1iOmb0oUgAAAAASUVORK5CYII=\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.hist([ network.nodes[i]['funds_requested'] for i in proposals])\n",
|
|
"plt.title('Histogram of Proposals Funds Requested')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'Histogram of Affinities between Participants and Proposals')"
|
|
]
|
|
},
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.hist([ network.edges[e]['affinity'] for e in network.edges])\n",
|
|
"plt.title('Histogram of Affinities between Participants and Proposals')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 1.0, 'Histogram of Affinities between Participants and Proposals weighted by holdings')"
|
|
]
|
|
},
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAEICAYAAABGRG3WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XuYHFWd//H3h4SbXIMJCEkgiJE1oCJGyC4oKAohiAEVF3aRgGgUwVV/6IJXEFDxgrqsgqJEiAqBRZEoKETkIiqXoCwQkB8RAgkJEEyAIIoEvvvHOUNqOt09PZOZ6emTz+t5+knXqVNV55w6Vd+qUzUdRQRmZmbW+dZpdwHMzMysfziom5mZFcJB3czMrBAO6mZmZoVwUDczMyuEg7qZmVkh+iWoS5onae/+WFenknSwpIWSnpL0mj4sv5Wk6yWtkHSGku9LWi7pZkmvl3RPi+tqmlfStrmcw3pbzibrHCcpJA3vr3WubVo9jvK+e+kgFGlIkHSypB+2uxwDoZ3HTS/PKXtLWjSAZWm6/txGL+uH7Rwp6YY+Ltu0H0paIOnN+fsnJX2vr+VcEz0G9WpBK2ndGiYidoqIa3tYT+kn/a8Cx0XExhHxx3oZcqC+T9JddWZPBx4DNo2I44E9gbcAYyJit4j4TUTs2EpBavPW7sOIeDCX87le1G/AdELfyCed53NAXSHpHklHrcH6zpN0WjWtleMo59s4Iu7r67ZbVe/YH2r6e7+sTXpzTulJvf68NouIL0TEe9ux7WKG34dAQNgOmNdDnjcAWwIvlfS6OsvfFat+DWg7YEFE/LV/i2lrYHFEbAxsCpwAfFfShN6upD9HSAxocb8MgXOE2cCLiKYfYAHw5pq0I4Eb6uUBdgPmAk8CjwBfy+kPAgE8lT//TLqo+DTwAPAoMBPYrLLeI/K8vwCfqdnOycAlwA/ztt6bt/174HFgCfBNYL3K+gL4IHAvsAI4FdghL/MkcHE1f02d65YVWD/XJ4C/An9u0pYzgB8BPwG+WUk/D3gW+Ede1/uBvwPP5enPAXsDi2ra/GPA7cATwEXABnneC3mBHwDPA3/L6/pPYFwu7/CcZzPg3NxmDwGnAcPyvJcB1+VtPAZc1KBuXeucDizO6zq+pv1OBP6c9+fFwBZN+sYDwGvz/MPz/Al5+r3AT3tab54/Cfhd7hP/C+xdmXdt7gO/zf3hKmBkg/p1a/+cthR4Z/7+P8DDuZ2uB3aq2b9nA1fkPjK9Zn//rM5xNAz4ZK7XCuBWYGylH7+ssu5vA3NyvuuA7Srb/i9gIal/3wq8vjLv5NxeM/Oy84CJTfrNBqTj7S+5PW8BtmrQXl37ZAVwF3Bw7fmDNLq1HLgf2L8yf/tcjxW5Xt8Eftjb/cKqPnk0qY9dn+e/Ldf18dwHXlFzXH0il3k58H3ycZXnvw+YDywDZgPb5HQBXyedG54gHZc753kHAH/M+2AhcHKd42Z4pW3uy3W/H/j3OnXeIO+XkXn608BK0igfpOP3G/n7+rmdHySdj78NbFiv7YBdczlXkPrzRcBp1bzA8bmOS4Cj8rxG/Xkb4Md5f9wP/EdlWxuS+u7y3NYfr92PNXUO4D9y2zwGfIV07K+f98UrK3m3zO0zqs56jqR539sm79dleT+/r+Z4+WFl+t2sik+fYvX49MOafTwt74fHgE/VtMX5uTx3k4616n45gXReXgHcA+zTqJ0iYkCC+u+Bd+fvGwOT6nXenPae3HAvzXl/Avwgz5uQO8iewHp5Jzxb02jPAgflnbsh8FrSSXx43t7dwEdqOsZs0hX9TsAzwNV5+5uROte0Bu3QsKy1J9oGy7+IdFBPAd6Rd2z1guM88gHUoI33ZvWgfjOpE26R6/qBJnnfXJnuti+AnwLfATYiHRA3A+/P8y4kddh1SCeTPRvUr2udF+b1vJJ0MHftr48ANwJjSAfid4ALm/SNmeSLAuAcUoA4pjLvoy2sdzTpgJuSy/+WPD0qz782r/flpP5zLXB6g/q90KZ5XQeT+t+Olf6xSS7DN4DbavbtE8AelXbstr/rHEcfB+4AdiQFjFcDL67ta3k9K0ijQOuTgni13xwOvJh0TBxPuvDouvg7mXTxOIV0EfFF4MYm/eb9wM9IfXkY6XjbtEF7HULqm+sA/0q6mNm60refJQXIYcAxpAtBVc4hX8v1eUOuX49BvXa/sKpfzST1yQ3zvv5r7gvrkk6g88nHYq7zncBY0nH1W1YFtjeRjttdc9n+m1UXCvuRLpo2z/vrFZX67k06HtYBXkUKrgfV9v1cxidZ1ae2pnJxWFPv64F35O9Xkfrx/pV5B+fv3yCd87Yg9c+fAV+s03brkQLUh3O7vJ0UpKtBfSVwSp4/BXgaGNHg/LVObo/P5nW/lBSQ98vzTwd+k8s1Nrd5T0H9mpx/W+D/A+/N884CvlTJ+2HyhUWd9RxJ8753XV7fBsAupHPYPpXjpStQd8WnruPua7l9mgX175L64KtJsecVlba4DhhBOo/dXtkvO5IuBLeprGuHRu0U0XpQf4p0Vdv1eZrGQf160p3lyJr1dFWseuK+GvhgZXrH3ODDc2e4sDLvRaROVm2063so+0eAS2s6xh6V6VuBEyrTZ5CvcOusq2FZa0+0DZY/PHeQ4bkTPE73u5fz6H1QP7wy/WXg203y1g3qwFa5g21YmX8YcE3+PpMUVMf00NZd6/ynmjKdm7/fTeUKk3TC6trX9frG0cDsyrLvBWbl6QeAXVtY7wlULrzy/CvJF26kIP7pyrwPAr9sUL+9SXeuj5Ou4m8DDm2Qd/Ncn80q+3ZmTZ5u+7vOcXQPMLXB+muD+qzKvI1JIzxjGyy7HHh15Rj6VWXeBOBvTfrNe0ijHq9q1hcabPe2rvqQ+vb8mmM7gJeQTtgrgY0q8y+geVCvu18q/eqllfyfAS6uTK9Dugvau1LnD1TmTyGPvpFGs75c09bP5u28iRRoJgHr9NAW3wC+XudY3CjX4x1UjscG6zgVODMv9zApkJ1O5S6edHHxVypBgDQKdn/teYIUnB4iB7ecdgPdg/rf6H6MPsqqm7bz6H7+2h14sKbMnwC+n7/fB0yuzJtOz0G9mv+DwNWVbS3sanfSSPG7GqznSBr3vbGkY2eTyvwvAudVjpeuQP1Zuh93G7F6fKoN6mMq+W9mVT994WInT7+3sl9eltv5zcC6rRxrrT5TPygiNu/65AZt5GjS1fCfJN0i6a1N8m5DOkF3eYBVgWYb0o4CICKeJt1lVS2sTkh6uaSfS3pY0pPAF0idu+qRyve/1ZneuA9lbcU00slkZUQ8Q7rTn9biso08XPn+NI3L3sx2pCvvJZIel/Q46W53yzz/P0knh5vz29nv6WF91X3yAKndurZzaWUbd5MOoEbtdx3wekkvIV1RXwTsIWkcaVTlthbWux1wSNe8PH9PUuDv0ps2XJyPgS0iYpeImAXpGbmk0yX9Ofe7BTl/te8trF1ZD8aS7r5aUT1OniIFt21y2Y6XdLekJ3L9N6spV239N2jy7PkHpIuiWZIWS/qypHXrZZR0hKTbKu2+c6Pt5mMbUttvAyyP7u+SVI+7eurul4pq23c7jiPi+Tx/dIP81T5cu+xTpHPS6Ij4NekxwbeARySdI2lTAEm7S7pG0lJJTwAfYPXzErnO/5rnL5F0uaR/alDn60iBdlfSiM4cYC/SRcX8iHgMGEUKWrdW9sMvc3qtbYCHIkeSOu0A8JeIWFmZbna8bAdsU3PsfZJVx3u38zs97+Pa8rywXyLiJtLFy165vV5GGp1opFnfWxYRK2q2U+0bXWrj019ZPT413C7d2662LarrnU+6OT0ZeFTSLEnb0ES/vygXEfdGxGGkoPAl4BJJG5GuVGotJu38Ll1X6Y+QntmM6ZohaUPSMGK3zdVMnw38CRgfEZuSOpH6XpuWy9qUpDGkK/nD8wXHw6RnflMkrXZwD4B6bd9lIelOfWTlwm3TiNgJICIejoj3RcQ2pOHXs3r405Kxle/bktqtazv7Vy8OI2KDiHioXvlyZ36a9Bzt+nygPUy6or8hn4x7Wu9C0p16dd5GEXF609bqvX8DppKupjcjXZlD975XW8dm+wRS2XdocfsvtLmkjUlDlIslvZ40WvEu0jDp5qTHAK0eE93KGBHPRsTnImIC8C/AW0nvvXQjaTvSUONxpEcGm5OGV1vZ7hJgRD5ndNm2xfI2Uq1Ht+NYkkjt91AlT6M+XLvsRqRz0kMAEXFmRLyW9Gjv5aRHKJBGGmaTRk82Iz3XrtsWEXFlRLyFdOH5J1I71vM70mjhwcB1EXFXLusBpIAP6VHB30hD+F39f7NILxXWWgKMzu1Rrx16UtufF5JGBKrH3iYRMaWyvdp27kmj/QLpmfThpOfcl0TE33tR9i6LgS0kbVKznYfq5O1WfkkvYvX41KpusY6ado+ICyJiT1LfC1Jcbajfg7qkwyWNyifdx3Pyc6Sh5+dJz1a6XAh8VNL2+WT0BdKLWCtJL8EdKOlfJK1HGtLv6aSwCemZ1FP5iu2YfqtY87L25N2kobkdSc9pdiEd9ItIQ90D7RG6t/sLImIJ6ZncGZI2lbSOpB0k7QUg6ZB8UQJp6DZI+7ORz0h6kaSdgKNId9iQTmSfzyd8JI2SNDXPq9c3IJ2cjmPVSeramume1vtDUh/aL99Nb5D/BKp6APWHTUgXRn8h3Rl9oYVlGu6T7HvAqZLGK3mVpEYnjSmS9szHyanATRGxMJdrJfmxj6TPkt4naVW3Mkp6o6RX5rf3nyQNPdfrC10X8UvzckeR7tR7FBEPkIZPPydpPUl7Agf2osw9uRg4QNI+eZTheNK++10lz7GSxkjagnRj0NWHLwCOkrSLpPVJ+/mmiFgg6XX5jnxd0l1j14uukPbDsoj4u6TdSBeBq1H6rYq35YuFZ0iPPesea/kO81bgWFYdD78jXXhfl/M8T7oo+LqkLfM2Rkvar84qf5+3dZyk4fkY2q1+E9ZV259vBp6UdIKkDfPxt7NW/dXPxcAnJI3Ix+OHWtjGx3P+saTHDRdV5v2AdIFzOOmRYa/lY+Z3wBfzueJVpJHnH9XJfgnw1spxdwp9j6fVthhNOscBIGlHSW/K/e3vpIu0pn+KPBB/0jYZmCfpKdJLO4dGxN9zJ/w88Ns8HDOJ9Db4D0jP4e/Phf4QQETMy99nka5kVpCeLTzTZNsfIx0wK0id+aImeXurYVlbMA04K9/1vvAhBaQ1HYJvxReBT+d2/1id+UeQXmbpeuP3ElYNUb8OuCnvz9nAhyPi/ibbuo704tHVwFcj4qqc/l95+askrSC93LY7vHCCqu0bXevahNTm9aZ7Wu9C0h30J0kBZiHp7qm/+/1M0jDdQ6Q2vLGFZc4FJuT6/rTO/K+RDvarSAH0XNJLNvVcAJxEGnZ/LfDvOf1K4BekC8oHSH22N48BavvNS0h940nSY47rSBdO3eS7xjNIgeIR0ktiv+3Fdv+NtA+X5Xr16SRdT0TcQzrx/zfpTvZA4MCI+Ecl2wWkdr8vf07Ly15Neib/Y9I5aQfg0LzMpqRzznJWvRH91Tzvg8ApuX9+lrRf61mHdJGxmFT3vWj+qPM60qOzmyvTtcfHCaTj8UalR0O/It1cdJPr/3ZSEHuc1EY/p/n5tqpbf470GxgHkm5g7ie19fdII1mQbtIeyPOuIp1be3IZ6ULmNuDyvM2u8i8C/kC6mPxNi2Wu5zDSSNti4FLgpIiYU5spx6djSX1lCWm/9/XHeU7Jy95P2j+XsKrd1ye9K/EYaaRyS9L5rKGuN/6GvHx3/DhpaL1ZUDFba0g6j/RSzafbXZYSSFpAeqv6V+0uS7tJuon08u33212WVkiaQXq/oqOPBUnHkG6G9+rL8kP6x2ckHZiHcjciXfXewaqXkMzMrJ9I2kvSS/Lw+zTSn9/9st3laoXSC7Rvp3L33ikkbS1pj/zoc0fSaM2lfV3fkA7qpKHTxfkznnT10hlDC2ZmnWVH0g80PUEKLO/M79wMaZJOJb2I+ZUOHcVdj/QXRyuAX5MeM5zV15V1zPC7mZmZNTfU79TNzMysRf4PDvrRyJEjY9y4ce0uhplZR7n11lsfi4h6P4pjveSg3o/GjRvH3Llz210MM7OOIqmVX5SzFnj43czMrBAO6mZmZoVwUDczMyuEg7qZmVkhHNTNzMwK4aBuZmZWCAd1MzOzQjiom5mZFcJB3czMrBD+RbkhZNyJl7dluwtOP6At2zUzs/7lO3UzM7NCOKibmZkVwkHdzMysEA7qZmZmhXBQNzMzK4SDupmZWSEc1M3MzArhoG5mZlYIB3UzM7NCOKibmZkVwkHdzMysEA7qZmZmhXBQNzMzK4SDupmZWSE6NqhLGivpGkl3S5on6cM5/WRJD0m6LX+mVJb5hKT5ku6RtF8lfXJOmy/pxEr69pJuknSvpIskrTe4tTQzM2tdxwZ1YCVwfES8ApgEHCtpQp739YjYJX+uAMjzDgV2AiYDZ0kaJmkY8C1gf2ACcFhlPV/K6xoPLAeOHqzKmZmZ9VbHBvWIWBIRf8jfVwB3A6ObLDIVmBURz0TE/cB8YLf8mR8R90XEP4BZwFRJAt4EXJKXPx84aGBqY2ZmtuY6NqhXSRoHvAa4KScdJ+l2STMkjchpo4GFlcUW5bRG6S8GHo+IlTXpZmZmQ1LHB3VJGwM/Bj4SEU8CZwM7ALsAS4AzurLWWTz6kF67/emS5kqau3Tp0j7UwMzMrH90dFCXtC4poP8oIn4CEBGPRMRzEfE88F3S8DqkO+2xlcXHAIubpD8GbC5peE16NxFxTkRMjIiJo0aN6r/KmZmZ9VLHBvX8zPtc4O6I+FolfetKtoOBO/P32cChktaXtD0wHrgZuAUYn990X4/0Mt3siAjgGuCdeflpwGUDWSczM7M1MbznLEPWHsC7gTsk3ZbTPkl6e30X0lD5AuD9ABExT9LFwF2kN+ePjYjnACQdB1wJDANmRMS8vL4TgFmSTgP+SLqIMDMzG5I6NqhHxA3Uf+59RZNlPg98vk76FfWWi4j7WDV8b2ZmNqR17PC7mZmZdeegbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQHRvUJY2VdI2kuyXNk/ThnL6FpDmS7s3/jsjpknSmpPmSbpe0a2Vd03L+eyVNq6S/VtIdeZkzJWnwa2pmZtaajg3qwErg+Ih4BTAJOFbSBOBE4OqIGA9cnacB9gfG58904GxIFwHAScDuwG7ASV0XAjnP9MpykwehXmZmZn3SsUE9IpZExB/y9xXA3cBoYCpwfs52PnBQ/j4VmBnJjcDmkrYG9gPmRMSyiFgOzAEm53mbRsTvIyKAmZV1mZmZDTkdG9SrJI0DXgPcBGwVEUsgBX5gy5xtNLCwstiinNYsfVGd9NptT5c0V9LcpUuX9kd1zMzM+qTjg7qkjYEfAx+JiCebZa2TFn1I754QcU5ETIyIiaNGjWqlyGZmZgOio4O6pHVJAf1HEfGTnPxIHjon//toTl8EjK0sPgZY3EP6mDrpZmZmQ1LHBvX8Jvq5wN0R8bXKrNlA1xvs04DLKulH5LfgJwFP5OH5K4F9JY3IL8jtC1yZ562QNClv64jKuszMzIac4e0uwBrYA3g3cIek23LaJ4HTgYslHQ08CByS510BTAHmA08DRwFExDJJpwK35HynRMSy/P0Y4DxgQ+AX+WNmZjYkdWxQj4gbqP/cG2CfOvkDOLbBumYAM+qkzwV2XoNimpmZDZqOHX43MzOz7hzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0IMb3cBrP3GnXh527a94PQD2rZtM7PSdOyduqQZkh6VdGcl7WRJD0m6LX+mVOZ9QtJ8SfdI2q+SPjmnzZd0YiV9e0k3SbpX0kWS1hu82pmZmfVexwZ14Dxgcp30r0fELvlzBYCkCcChwE55mbMkDZM0DPgWsD8wATgs5wX4Ul7XeGA5cPSA1sbMzGwNdWxQj4jrgWUtZp8KzIqIZyLifmA+sFv+zI+I+yLiH8AsYKokAW8CLsnLnw8c1K8VMDMz62cdG9SbOE7S7Xl4fkROGw0srORZlNMapb8YeDwiVtakr0bSdElzJc1dunRpf9bDzMysV0oL6mcDOwC7AEuAM3K66uSNPqSvnhhxTkRMjIiJo0aN6n2JzczM+klRb79HxCNd3yV9F/h5nlwEjK1kHQMszt/rpT8GbC5peL5br+Y3MzMbkoq6U5e0dWXyYKDrzfjZwKGS1pe0PTAeuBm4BRif33Rfj/Qy3eyICOAa4J15+WnAZYNRBzMzs77q2Dt1SRcCewMjJS0CTgL2lrQLaah8AfB+gIiYJ+li4C5gJXBsRDyX13MccCUwDJgREfPyJk4AZkk6DfgjcO4gVc3MzKxPOjaoR8RhdZIbBt6I+Dzw+TrpVwBX1Em/j/R2vJmZWUcoavjdzMxsbeagbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrRMf+nbqVYdyJl7dluwtOP6At2zUzG0gO6rZW8sWEmZXIw+9mZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZITo2qEuaIelRSXdW0raQNEfSvfnfETldks6UNF/S7ZJ2rSwzLee/V9K0SvprJd2RlzlTkga3hmZmZr3TsUEdOA+YXJN2InB1RIwHrs7TAPsD4/NnOnA2pIsA4CRgd2A34KSuC4GcZ3pludptmZmZDSkdG9Qj4npgWU3yVOD8/P184KBK+sxIbgQ2l7Q1sB8wJyKWRcRyYA4wOc/bNCJ+HxEBzKysy8zMbEjq2KDewFYRsQQg/7tlTh8NLKzkW5TTmqUvqpO+GknTJc2VNHfp0qX9UgkzM7O+KC2oN1LveXj0IX31xIhzImJiREwcNWrUGhTRzMxszZQW1B/JQ+fkfx/N6YuAsZV8Y4DFPaSPqZNuZmY2ZJUW1GcDXW+wTwMuq6Qfkd+CnwQ8kYfnrwT2lTQivyC3L3BlnrdC0qT81vsRlXWZmZkNScPbXYC+knQhsDcwUtIi0lvspwMXSzoaeBA4JGe/ApgCzAeeBo4CiIhlkk4Fbsn5TomIrpfvjiG9Yb8h8Iv8MTMzG7I6NqhHxGENZu1TJ28AxzZYzwxgRp30ucDOa1JGMzOzwVTa8LuZmdlay0HdzMysEA7qZmZmhXBQNzMzK4SDupmZWSEc1M3MzArhoG5mZlYIB3UzM7NCOKibmZkVwkHdzMysEA7qZmZmhXBQNzMzK4SDupmZWSEc1M3MzArhoG5mZlYIB3UzM7NCOKibmZkVwkHdzMysEA7qZmZmhXBQNzMzK4SDupmZWSEc1M3MzArhoG5mZlYIB3UzM7NCOKibmZkVwkHdzMysEA7qZmZmhXBQNzMzK4SDupmZWSGKDOqSFki6Q9JtkubmtC0kzZF0b/53RE6XpDMlzZd0u6RdK+uZlvPfK2lau+pjZmbWiiKDevbGiNglIibm6ROBqyNiPHB1ngbYHxifP9OBsyFdBAAnAbsDuwEndV0ImJmZDUUlB/VaU4Hz8/fzgYMq6TMjuRHYXNLWwH7AnIhYFhHLgTnA5MEutJmZWauGt7sAAySAqyQF8J2IOAfYKiKWAETEEklb5ryjgYWVZRfltEbp3UiaTrrDZ9ttt+3vepiZ9cq4Ey9vy3YXnH5AW7Zr3ZUa1PeIiMU5cM+R9KcmeVUnLZqkd09IFwznAEycOHG1+WZmZoOlyOH3iFic/30UuJT0TPyRPKxO/vfRnH0RMLay+BhgcZN0MzOzIam4oC5pI0mbdH0H9gXuBGYDXW+wTwMuy99nA0fkt+AnAU/kYforgX0ljcgvyO2b08zMzIakEofftwIulQSpfhdExC8l3QJcLOlo4EHgkJz/CmAKMB94GjgKICKWSToVuCXnOyUilg1eNczMzHqnuKAeEfcBr66T/hdgnzrpARzbYF0zgBn9XUYzK1u7XlYzK2743czMbG3loG5mZlaI4obfzWxoaedQtP922tY2vlM3MzMrhO/UzQaR71rNbCD5Tt3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVggHdTMzs0I4qJuZmRXCQd3MzKwQDupmZmaFcFA3MzMrhIO6mZlZIRzUzczMCuGgbmZmVojh7S6AmQ2OcSde3u4imNkAc1A3s2L5QsbWNh5+74GkyZLukTRf0ontLo+ZmVkjDupNSBoGfAvYH5gAHCZpQntLZWZmVp+DenO7AfMj4r6I+AcwC5ja5jKZmZnV5WfqzY0GFlamFwG7VzNImg5Mz5NPSbqnj9saCTzWx2U7neu+9llb6w2F1l1failbo7pv16+FWYs5qDenOmnRbSLiHOCcNd6QNDciJq7pejqR67721X1trTe47mtr3QeLh9+bWwSMrUyPARa3qSxmZmZNOag3dwswXtL2ktYDDgVmt7lMZmZmdXn4vYmIWCnpOOBKYBgwIyLmDdDm1ngIv4O57muftbXe4LrbAFJE9JweZZVDAAADeElEQVTLzMzMhjwPv5uZmRXCQd3MzKwQDuqDrKefnZW0vqSL8vybJI0b/FIOjBbq/v8k3SXpdklXSyrib1db/alhSe+UFJKK+ZOfVuou6V15v8+TdMFgl3GgtNDft5V0jaQ/5j4/pR3l7G+SZkh6VNKdDeZL0pm5XW6XtOtgl7FoEeHPIH1IL9v9GXgpsB7wv8CEmjwfBL6dvx8KXNTucg9i3d8IvCh/P6aEurdS75xvE+B64EZgYrvLPYj7fDzwR2BEnt6y3eUexLqfAxyTv08AFrS73P1U9zcAuwJ3Npg/BfgF6XdAJgE3tbvMJX18pz64WvnZ2anA+fn7JcA+kur9CE6n6bHuEXFNRDydJ28k/S5Ap2v1p4ZPBb4M/H0wCzfAWqn7+4BvRcRygIh4dJDLOFBaqXsAm+bvm1HIb2BExPXAsiZZpgIzI7kR2FzS1oNTuvI5qA+uej87O7pRnohYCTwBvHhQSjewWql71dGkq/lO12O9Jb0GGBsRPx/Mgg2CVvb5y4GXS/qtpBslTR600g2sVup+MnC4pEXAFcCHBqdobdfbc4H1gv9OfXD1+LOzLebpRC3XS9LhwERgrwEt0eBoWm9J6wBfB44crAINolb2+XDSEPzepJGZ30jaOSIeH+CyDbRW6n4YcF5EnCHpn4Ef5Lo/P/DFa6tSz3FDgu/UB1crPzv7Qh5Jw0nDcs2GsjpFSz+5K+nNwKeAt0XEM4NUtoHUU703AXYGrpW0gPSMcXYhL8u12t8vi4hnI+J+4B5SkO90rdT9aOBigIj4PbAB6T88KZ1/fnsAOagPrlZ+dnY2MC1/fyfw68hvl3S4Huueh6G/QwropTxbbVrviHgiIkZGxLiIGEd6l+BtETG3PcXtV63095+SXpBE0kjScPx9g1rKgdFK3R8E9gGQ9ApSUF86qKVsj9nAEfkt+EnAExGxpN2FKoWH3wdRNPjZWUmnAHMjYjZwLmkYbj7pDv3Q9pW4/7RY968AGwP/k98NfDAi3ta2QveDFutdpBbrfiWwr6S7gOeAj0fEX9pX6v7RYt2PB74r6aOk4ecjS7iAl3Qh6XHKyPy+wEnAugAR8W3S+wNTgPnA08BR7SlpmfwzsWZmZoXw8LuZmVkhHNTNzMwK4aBuZmZWCAd1MzOzQjiom5mZFcJB3czMrBAO6mZmZoX4P9FNmZ2vgBT6AAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.hist([ network.edges[e]['affinity'] for e in network.edges], weights = [network.nodes[e[0]]['holdings']for e in network.edges],alpha = 1)\n",
|
|
"plt.title('Histogram of Affinities between Participants and Proposals weighted by holdings')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"affinities = np.empty((n,m))\n",
|
|
"for i_ind in range(n):\n",
|
|
" for j_ind in range(m):\n",
|
|
" i = participants[i_ind]\n",
|
|
" j = proposals[j_ind]\n",
|
|
" affinities[i_ind][j_ind] = network.edges[(i,j)]['affinity']"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Text(0.5, 106.33200000000001, 'participant_id')"
|
|
]
|
|
},
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABAcAAAEoCAYAAAAkBpgGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xm8tfW8//HX+74r0WQIRzMphEolHCHTkY5TZKofJ9PROcjMkeMcMh5T5jhuSg4RMnXITJnTLaVJVEq3SkVJJXXbn98f17Vva297WrfWvtba6/W8H9fjXsM1vNe11772uj7r+/1eqSokSZIkSdL4WtZ1AEmSJEmS1C2LA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjTmLA5IkSZIkjbl1ug4gSZIkSdJSdOMV51e/y6y76Z0yiCzzsTggSZIkSdIgTPy56wQLZnFAkiRJkqRBqImuEyyYxQFJkiRJkgZhwuKAJEmSJEljrWw5IEmSJEnSmLPlgCRJkiRJY26EWg4s6zqAJEmSJEnqli0HJEmSJEkaBC9lKEmSJEnSmBuhbgUWByRJkiRJGgQHJJQkSZIkabx5KUNJkiRJksadLQckSZIkSRpzthyQJEmSJGnMebUCSZIkSZLGnC0HJEmSJEkac445IEmSJEnSmLPlgCRJkiRJY86WA5IkSZIkjbcqBySUJEmSJGm82a1AkiRJkqQxZ7cCSZIkSZLGnC0HJEmSJEkacxOOOSBJkiRJ0ngboZYDy7oOIEmSJEmSumXLAUmSJEmSBsEBCSVJkiRJGnMj1K3A4oAkSZIkSYNgywFJkiRJksacxQFJkiRJksZblZcylCRJkiRpvNlyQJIkSZKkMeeAhJIkSZIkjTlbDkiSJEmSNOZsOSBJkiRJ0piz5YAkSZIkSWPOlgOSJEmSJI05Ww5IkiRJkjTmLA5IkiRJkjTm7FYgSZIkSdKYs+WAJEmSJEljboRaDizrOoAkSZIkSeqWLQckSZIkSRqEEepWYMsBSZIkSZIGoSb6nxYgyV5JzklybpJDZnh+qyTfSvKTJD9Nsvd867TlgCRJkiRJgzCAlgNJlgOHAw8HVgEnJzmuqs7qme0/gU9W1fuS7AAcD2wz13otDkiSJEmSNAiD6VawO3BuVZ0PkOQYYF+gtzhQwMbt7U2Ai+dbqcUBSZIkSZIGoWoQa90cuKjn/irgPtPmORT4apLnAhsAD5tvpY45IEmSJEnSIExM9D0lOSjJyp7poGlrzQxbml6FOAA4qqq2APYGPpJkzvN/Ww5IkiRJkjQIa9GtoKpWACvmmGUVsGXP/S34624DzwD2atf3gyTrA5sCl822UlsOSJIkSZI0CIO5WsHJwHZJ7phkPWB/4Lhp8/wKeChAkrsB6wOXz7VSWw5IkiRJkjQIAxiQsKpWJzkY+AqwHDiyqs5M8hpgZVUdB7wY+ECSF9J0OXhq1dwDIFgckCRJkiRpEAYzICFVdTzN5Ql7H3tlz+2zgPv3s06LA5IkSZIkDcJgLmU4EBYHJEmSJEkaBIsDkiRJkiSNuYUNMDgULA5IkiRJkjQANTGYMQcGweKAJEmSJEmDYLcCSZIkSZLG3Ah1K1jWdQBJkiRJktQtWw5IkiRJkjQIjjkgSZIkSdKYc8wBSZIkSZLGnMUBSZIkSZLGXNmtQJIkSZKk8WbLAUmSJEmSxtwIDUjopQwlacgkeV2SK5Jc2t5/TJKLklyT5F5Jzkyy5wLXNee8Sb6U5Ck3TfI16zwhyb/clOscN+3P+k7zzLNVO9/yxcrVtSRHJXld1zkGxd8dSVqCaqL/qSO2HJCkIZJkS+DFwNZVdVn78FuBg6vq8+39uy90fVW1Zt4khwJ3rqon9zz/yL859E0oyQnAR6vqg11nWSwzveaq2nC+5arqV8C8890UkhSwXVWduxjbkyRpyRihlgMWByRpuGwN/LanMDD52Jkd5dGAJAmQrnOMo8l9X9Xh1zOSpLFQIzTmgN0KJGmRJTkkyXlJ/pDkrCSPaR9/GPA1YLO2ufjHk1wDLAdOS3JeO98F7bwkOTTJJ5P8b7u+M5Ps1rOtC5I8LMlewH8AT2zXfVr7/JRmzEmenuTsJFcm+UqSrdvHk+TtSS5L8vskP01yjzle5rZJftTO+/kkt+7Zxn2TfD/JVUlOm+z2kOT1wAOA97QZ35Pk1Une3T6/bpJrk7y5vX/zJNcnudVc622f2yTJEUkuSfLrtuvG8va5pyb5bpK3tq/7l0lmbVHR7tOXtz+7K5N8KMn67XO3SvKFJJe3z30hyRY9y56Q5PVJvgdcB3xk+mtu56skd+55nYclubDdn99tH9umnW+dnnX/9xz7/VNJLm2f+3aS3lYlRyU5PMkX2/fRSUm2bZ/7djvbaW3GJybZtH1tVyX5XZLvJJnxM0WSd6bpFnN1kh8neUDPc/O9f++V5JT2uU8A68/xc3lqku8leXf7Gn+W5KFz7Ps7JdksyXHtazg3yTOnZTs2ySfa7Z+SZKee5+/WrvOqNvc+Pc/t3b4//tC+316ykPfHtNdz5yQntq/livb1S5JGzUT1P3XE4oAkLb7zaE4INwFeDXw0yR2q6uvAI4GLq2rDqjqgp3n5TlW17Szr2wc4BrglcBzwnukzVNWXgTcAn2jXvdP0eZI8mqaAsB9wW+A7wMfbp/8BeCCwfbudJwK/neM1Hgg8HdgMWA28q93G5sAXgdcBtwZeAnw6yW2r6hXtNg9uMx4MnAjs2a7z3sClwIPa+/cDzqmqK+dabzvvh9scdwbu1b6e3r7d9wHOATYF3gwckWSub/WfBDwC2LbdJ//ZPr4M+BBNa4+tgD/y1z+PfwYOAjYCnjrDa57urcCuwN+3r+3fgdm+hphxv7e+BGwH3A44BTh62rIH0LwfbwWcC7weoKoe2D6/U5vxEzRdX1bRvE9uT/O+me3TzMnAzm32jwGfmiymtGZ8/yZZD/gcTQHl1sCngMfOso1J9wHOp/k5vgr4TG+BhKn7/kKa9/cqmv31OOANvQUFYN92u5PZP5emSLUu8H/AV2n253OBo5PcpV3uCOBfq2oj4B7AN9vHF/L+mPTadv23ArYA3j3Pa5ckDaMRGnPA4oAkLbKq+lRVXVxVE+2J1i+A3f+GVX63qo6vqj/TnEj91Yn/Av0r8N9VdXZVraYpJuycpvXAjTQnVHelaY59dlVdMse6PlJVZ1TVtcB/AU9I8039k4Hj27wTVfU1YCWw9yzr+QGwXZLb0BQnjgA2T7IhTZHgxHa+Wdeb5PY0RZcXVNW1bZeNtwP792znwqr6QLsPPwzcgeakdzbvqaqLqup3NCfRBwBU1W+r6tNVdV1V/aF97kHTlj2qqs6sqtVVdeMc26D9Nv7pwPOr6tdV9eeq+n5V/WmWRWbb71TVkVX1h3bZQ4GdkmzSs+xnqupH7c/+aJoT+tncSLOPtq6qG6vqO1UzX8i5qj7a7pfVVXUYcDPgLj2zzPb+vS+wLvCOdhvH0hQa5nJZz/yfoCn4/GPP82v2PfB3wB7Ay6rq+qo6FfggTQFh0o+r6tj25/Q2mpYL922nDYE3VtUNVfVN4Au074N2/+yQZOOqurKqTmn3xULeH/SsY2tgszbfd+d57ZKkYWTLAUnSbJIcmOTUtjnyVTTfLG76N6zy0p7b1wHrTzY179PWwDt7cv2Opk/85u3Jz3uAw4HfJFmRZOM51nVRz+0LaU7yNm238fjJbbTb2YPmRPOvVNUfaU7yH0RTHDgR+D5wf6YWB+Za79bt9i/pee79NN/4TlqzD6vquvbmXIP9TX99mwEkuUWS96fpAnA18G3glpl6RYHeZeezKc0J6XkLnH/G/Z5keZI3punOcjVwQc/6J01/H831+t9C07rgq0nOT3LIbDMmeXGariq/b/f9JvNsd/L9uxnw62lFhwvnyMQs82/Wc793/2wG/K49Se+df/OZ5m/HJ5hsZbAZcNG0MQt6l30sTcHrwrZrwP1gwe+PSf9O8/v3o7bbwtPnee2SpGE0MdH/1BGLA5K0iNpv4T8AHAzcpqpuCZzB4gxMN18p+iKaptC37JluXlXfB6iqd1XVrjRXS9geeOkc69qy5/ZWNN+CXtFu4yPTtrFBVb1xjownAg+h6Q5wcnv/ETStLSb7w8+13ouAPwGb9jy3cfVcyWEtTH99F7e3X0zzrfh9qmpjmoIGTP35Tn+Nc/1crgCup+m+sDa5Jvf7/6NpIv8wmpPzbWbItWBtC4QXV9WdgH8CXjStOX6z8mZ8gZcBTwBu1b7ff7/A7V5C00qkd96t5llmpvkv7rnfu68vBm6dZKNp8/+65/6a/dm24tiiXe5iYMtMHWdhzbJVdXJV7UtTgPoc8Ml2noW8P2jXcWlVPbOqNqNp1fPetONQSJJGiC0HJEmz2IDmBOVygCRPo2k5sBh+A2yTWQaOA/4HeHnagerSDOL3+Pb2vZPcp+1rfS3NCeuf59jWk5PskOQWwGuAY9tm4x8F/inJI9pvs9dPsmfPoGy/Ae40bV0n0vSlP6uqbgBOoBkv4JdVdXk7z6zrbbs/fBU4LMnGSZYl2TbJbM25F+I5SbZo+7P/BzA5WNxGNP3Ir2qfe9UC1jXTawbWfFt9JPC2NIPnLU9yvyQ3m2Vds+33jWgKJL8FbkHTZaQfUzImeVQ7YF6Aq2neCzO9HzaiGfvgcmCdJK8E5mpx0usH7bLPS7JOkv2Yv/vN7dr5123fu3cDjp9pxqq6iKYVyn+375cdgWcwdSyGXZPs17ZkeAHNPvwhcBLN78G/t9vak6ZIckyS9ZI8KckmbXeEyf0zuT8W9P5I8vie34sraY4bc/3OSZKGkWMOSJJmUlVnAYfRnPj8Brgn8L1F2vyn2v9/m+SUGbJ9FngTzQnO1TQtGiZH7d+YpsXDlTTNp39LM1DebD4CHEXTZHx94HntNi6i+Qb7P2hOGC+iaYEw+ffoncDj0ozkPjmY3veBm/OXVgJn0RQnJu8vZL0HAuu1y14JHMssXRkW6GM0BYfz2+l17ePvaLNeQXMS+eUFrGum19zrJcDpNK0mfkfzM5rt7/eM+x34X5qf269p9sEPF5Cr16HAh9tuGU+gGdjw68A1NO/l91bVCTMs9xWagRB/3m7/ehbYraItBO1HM2jjlTSDYH5mnsVOarNdQdOf/3FVNdfAmQfQtKK4GPgs8Kp2vIpJn2+3eyXNWAT7teMZ3EAzkOIj2229Fziwqn7WLvfPwAXt79G/0YyJAf29P+4NnJTmiiXH0Yw78ct5Xr8kadiMUMuBzDJ+kCRJmkGSC4B/qebqEkMjyQnAR6vqg11n6UKSp9L8XPa4idZ3KHDnqnryfPNKkjSba1/x+L5PuDd4/acWo7vpX1mbAaskSZIkSdI8qsMBBvtlcUCSJEmSpEHosJtAv+xWIEmSJEnSAFzz0sf0fcK94Vs+a7cCSZIkSZKWjA6vPtAviwOSJEmSJA3CCHUrGOriwC532GNo9uRF110+/0xjbI9Ntu86who7ZaGX0F4chxzzqK4jTLHHfu/tOsIUB6y7ddcR1vjoDcN1lbDN17tl1xGmuGL1tV1HWOOEzzyr6whTvP2J/9d1hCk+eO1ZXUeY4oy3PaLrCGts9dz5roa4uD5w8127jjDF0Tcbnt/zj3zmaV1HmGL5FnfrOsIUD7jXv3YdYYqVV/yi6whrPPYO9+46whSbZf2uI0zxjesv7DrCFD+99AedNKFfLGVxQJIkSZKkMWdxQJIkSZKkMeelDCVJkiRJGnO2HJAkSZIkacxZHJAkSZIkabxVWRyQJEmSJGm82XJAkiRJkqQxZ3FAkiRJkqTxVhYHJEmSJEkacxYHJEmSJEkacxNdB1i4ZV0HkCRJkiRJ3bLlgCRJkiRJA+CYA5IkSZIkjTuLA5IkSZIkjbkRGnPA4oAkSZIkSQNgtwJJkiRJksbdCLUcGNjVCpLs1XN7kyRHJPlpko8luf2gtitJkiRJ0jCoiep76sogL2X4hp7bhwGXAP8EnAy8f7aFkhyUZGWSlVdcd+kA40mSJEmSNEATazEtQJK9kpyT5Nwkh8wyzxOSnJXkzCQfm2+di9WtYLeq2rm9/fYkT5ltxqpaAawA2OUOe4xOBw1JkiRJknrUALoVJFkOHA48HFgFnJzkuKo6q2ee7YCXA/evqiuT3G6+9Q6yOHC7JC8CAmycJFU1ebI/yBYLkiRJkiR1bzBjDuwOnFtV5wMkOQbYFzirZ55nAodX1ZUAVXXZfCsd5En6B4CNgA2BDwObAiT5O+DUAW5XkiRJkqTO1UT/0wJsDlzUc39V+1iv7YHtk3wvyQ97xwSczcBaDlTVq5PclSbkSVV1Tfv4pQvp7yBJkiRJ0khbi5YDSQ4CDup5aEXb/X7NLDMsNr1L/jrAdsCewBbAd5Lco6qumm27g7xawXOBzwPPBc5Ism/P02+YeSlJkiRJkpaGtWk5UFUrqmq3nmnFtNWuArbsub8FcPEM83y+qm6sql8C59AUC2Y1yG4FBwG7VtWjaaoV/5Xk+e1zM1U6JEmSJElaMgbUreBkYLskd0yyHrA/cNy0eT4HPBggyaY03QzOn2ulgxyQcHlPV4ILkuwJHJtkaywOSJIkSZKWuEFcraCqVic5GPgKsBw4sqrOTPIaYGVVHdc+9w9JzgL+DLy0qn4713oHWRy4NMnOVXVq+wKuSfIo4EjgngPcriRJkiRJ3avBfC9eVccDx0977JU9twt4UTstyLzFgSS7zBPqlFmeOhBYPW3e1cCBSd6/0ICSJEmSJI2iQbQcGJSFtBw4rP1/fWA34DSabgE7AicBe8y0UFWtmm2FVfW9/mJKkiRJkjRaamJ0etTPOyBhVT24qh4MXAjs0o6WuCtwL+DcQQeUJEmSJEmD1c+YA3etqtMn71TVGUl2HkAmSZIkSZJG3lLrVjDp7CQfBD4KFPBk4OyBpJIkSZIkacTVgAYkHIR+igNPA54FPL+9/23gfTd5IkmSJEmSloAl2XKgqq4H3t5OkiRJkiRpDqM0IOFCLmX4yap6QpLTaboTTFFVOw4kmSRJkiRJI6z+6gx6eC2k5cBkN4JHDTLITNZLP70eBmujdW/RdYQpLrvuqq4jTLHDso26jrDG4Veu7DrCFAe/Ztarenbi+okbu44wxQkMz3v5+0c8vusIU91wfdcJpvjmv53WdYQ1dn/0O7qOMMX3n3y7riNM8Z4j/tR1hClWrzx9/pkWycXnfanrCFPcYrMHdB1hii03Hp738vsfc2zXEaZ49spXdR1hivOuvaTrCFNc+exduo6wxqs+t37XEaZ498Xf6TrCFD/b/h5dRxgrS6rlQFVd0v5/4VzzJflBVd3vpgomSZIkSdIoW1LFgT4MV4lOkiRJkqQOLbVuBQs1Qi9bkiRJkqTBGteWA5IkSZIkqVU1nsWB0XnVkiRJkiQNWE10nWDhbsriwD/fhOuSJEmSJGmkTSyllgNJ/sDM4wkEqKramObGGTdxNkmSJEmSRtaS6lZQVcNzAXtJkiRJkkbEkh6QMMnt6LlsYVX96iZNJEmSJEnSErAkL2WYZB/gMGAz4DJga+Bs4O6DiSZJkiRJ0ugapZYDy/qY97XAfYGfV9UdgYcC3xtIKkmSJEmStGj6KQ7cWFW/BZYlWVZV3wJ2HlAuSZIkSZJG2kSl76kr/Yw5cFWSDYFvA0cnuQxYPZhYkiRJkiSNtlG6WkE/LQf2Ba4DXgh8GTgP+KdBhJIkSZIkadRV9T91pe+rFVTV6iQ/AO4KXH3TR5IkSZIkafR12U2gX/20HPg2sH6SzYFvAE8DjupnY0lu08/8kiRJkiSNqqr0PXWln+JAquo6YD/g3VX1GGCHWWdO3phk0/b2bknOB05KcmGSB/1NqSVJkiRJGnKj1K2gr+JAkvsBTwK+2D42V7eEf6yqK9rbbwGeWFV3Bh4OHDbHRg5KsjLJysuuu7iPeJIkSZIkDY9RulpBP8WBFwAvBz5bVWcmuRPwrTnmXzfJZPHg5lV1MkBV/Ry42WwLVdWKqtqtqna73S026yOeJEmSJEnDY5S6FSx4QMKqOhE4MclGSTasqvOB582xyOHA8UneCHw5yTuAzwAPBU79W0JLkiRJkjTsRmlAwgUXB5LcE/hf4NbN3VwOHFhVZ840f1W9O8npwLOA7dttbQ98Dnjd3xpckiRJkqRh1uEQAn3r51KG7wdeVFXfAkiyJ/AB4O/nWOZSYAVwUlVdM/lgkr2AL/edVpIkSZKkETFKLQf6GXNgg8nCAEBVnQBsMNvMSZ4HfB54LnBGkn17nn5DnzklSZIkSRopS3LMAeD8JP8FfKS9/2Tgl3PM/0xg16q6Jsk2wLFJtqmqdwKjUz6RJEmSJGktTHQdoA/9FAeeDryaZlDBAN8GnjbH/MsnuxJU1QVtN4Rjk2yNxQFJkiRJ0hJXI3Tq28/VCq4EnpdkE2Ciqv4wzyKXJtm5qk5tl78myaOAI4F7rnViSZIkSZJGwMQIjUi44DEHkty7vfrAacDpSU5LsuscixxIMyDhGlW1uqoOBB64VmklSZIkSRoRE6TvqSv9dCs4Anh2VX0HIMkewIeAHWeauapWzbaiqvpePyElSZIkSdLg9FMc+MNkYQCgqr6bZL6uBZIkSZIkjaUlOeYA8KMk7wc+DhTwROCEJLsAVNUpA8gnSZIkSdJIWqpXK9i5/f9V0x7/e5piwUNukkSSJEmSJC0BS7LlQFU9eJBBJEmSJElaSkap5UA/VyvYJMnbkqxsp8PayxpKkiRJkqRpJtZi6sqCiwPAkcAfgCe009U0VyuQJEmSJEnTFOl76ko/Yw5sW1WP7bn/6iSn3tSBJEmSJElaCiZGZ8iBvooDf0yyR1V9FyDJ/YE/DiZW45TfnjvI1fclGa6f6hNuf++uI0xxxFU/6TrCGlf+8ZquI0xxp29f1HWEKa5ffUPXEaZ42u3v3HWENT7zzJVdR5hivyN27zrCFHvsfXnXEdY4+eVv6TrCFH/+7BFdR5hi70126DrCFE/+3EA/LvTlUy+4ousIU+x+27t0HWGKC/94WdcR1njaI4fnmAPwtXv+V9cRpjh9pzt0HWGK7Y86r+sIa9x34227jjDFQ26/Y9cRptjsvU/sOsJYmViKAxIC/wb8b884A1cCT7npI0mSJEmSNPqq6wB9WFBxIMky4C5VtVOSjQGq6uqBJpMkSZIkaYQtuasVVNUEcHB7+2oLA5IkSZIkzW0i6XtaiCR7JTknyblJDpljvsclqSS7zbfOfq5W8LUkL0myZZJbT059LC9JkiRJ0tiotZjmk2Q5cDjwSGAH4IAkfzXgUJKNgOcBJy0kaz9jDjydJuuzpz1+pz7WIUmSJEnSWBhQt4LdgXOr6nyAJMcA+wJnTZvvtcCbgZcsZKX9tBzYgaY6cRpwKvBu4O59LC9JkiRJ0tiYSP/TAmwO9F4SbVX72BpJ7gVsWVVfWGjWfloOfBi4GnhXe/+A9rEn9LEOSZIkSZLGwtpcyjDJQcBBPQ+tqKoVvbPMsNiaHgntBQXeDjy1n+32Uxy4S1Xt1HP/W0lO62djkiRJkiSNi7W5lGFbCFgxxyyrgC177m8BXNxzfyPgHsAJaQY4/DvguCT7VNXK2VbaT7eCnyS57+SdJPcBvtfH8pIkSZIk6W9zMrBdkjsmWQ/YHzhu8smq+n1VbVpV21TVNsAPgTkLA9Bfy4H7AAcm+VV7fyvg7CSnN9uvHftYlyRJkiRJS9oCxxDoS1WtTnIw8BVgOXBkVZ2Z5DXAyqo6bu41zKyf4sBea7MBSZIkSZLG0YCuVkBVHQ8cP+2xV84y754LWeeCiwNVdeFC55UkSZIkadytzZgDXemn5YAkSZIkSVqgQXQrGBSLA5IkSZIkDcCguhUMgsUBSZIkSZIGwOKAJEmSJEljrkaoW8GyQa04ySlJ/jPJtoPahiRJkiRJw2piLaauDKw4ANwKuCXwrSQ/SvLCJJvNt1CSg5KsTLJy4s/XDjCeJEmSJEmDY3GgcWVVvaSqtgJeDGwHnJLkW0kOmm2hqlpRVbtV1W7Llm8wwHiSJEmSJA1OrcXUlUEWB9aoqu9U1bOBzYE3AfdbjO1KkiRJktSVifQ/dWWQAxL+fPoDVfVn4MvtJEmSJEnSkjVKVysYWMuBqto/yV2TPDTJhr3PJdlrUNuVJEmSJGkYOOYAkOS5wOeB5wJnJNm35+k3DGq7kiRJkiQNg1Eac2CQ3QoOAnatqmuSbAMcm2SbqnonMEJXe5QkSZIkqX9djiHQr0EWB5ZX1TUAVXVBkj1pCgRbY3FAkiRJkrTEOeZA49IkO0/eaQsFjwI2Be45wO1KkiRJkqQ+DLI4cCBwae8DVbW6qg4EHjjA7UqSJEmS1DnHHACqatUcz31vUNuVJEmSJGkYTHR6ut+fQY45IEmSJEnS2BqlMQcsDkiSJEmSNACj027A4oAkSZIkSQNhywFJkiRJksbcRLpOsHAWByRJkiRJGgAHJJQkSZIkacyNTmnA4oAkSZIkSQMxSmMOpGqUahlrJ8lBVbWi6xyThinPMGUB88xnmPIMUxYwz1yGKQuYZz7DlGeYsoB55jJMWcA8cxmmLGCe+QxTnmHKAsOXZ1i9bJsD+j7hftMFH+9kpIJlXWy0Awd1HWCaYcozTFnAPPMZpjzDlAXMM5dhygLmmc8w5RmmLGCeuQxTFjDPXIYpC5hnPsOUZ5iywPDlGUq1FlNX7FYgSZIkSdIAjFK3AosDkiRJkiQNgFcrGD7D1hdmmPIMUxYwz3yGKc8wZQHzzGWYsoB55jNMeYYpC5hnLsOUBcwzl2HKAuaZzzDlGaYsMHx5htLolAbGZEBCSZIkSZIW2/O32b/vE+53XnBMJwMSjkvLAUmSJEmSFlWNUNuBJX21giR7JTknyblJDhmCPEcmuSzJGUOQZcsk30pydpIzkzy/4zzrJ/lRktPaPK/uMk+baXmSnyT5whBkuSDJ6UlOTbJyCPLcMsmxSX7Wvofu12GWu7T7ZXK6OskLOszzwvY9fEaSjydZv6ssbZ7nt1nO7GK/zHTcS3LrJF/64zgFAAAP7klEQVRL8ov2/1t1nOfx7f6ZSLJbx1ne0v5e/TTJZ5PcsuM8r22znJrkq0k26zJPz3MvSVJJNu0qS5JDk/y659iz92JkmS1P+/hz2889ZyZ5c5d5knyiZ99ckOTUjvPsnOSHk39Hk+zeYZadkvyg/bv+f0k2Xows7bZn/PzXxXF5jixdHZNny9PJcXmOPIt+XJ4tS8/zi3pMHjUTazF1ZckWB5IsBw4HHgnsAByQZIduU3EUsFfHGSatBl5cVXcD7gs8p+P98yfgIVW1E7AzsFeS+3aYB+D5wNkdZ+j14KrauaoW7Q/lHN4JfLmq7grsRIf7qarOaffLzsCuwHXAZ7vIkmRz4HnAblV1D2A5sH8XWdo89wCeCexO83N6VJLtFjnGUfz1ce8Q4BtVtR3wjfZ+l3nOAPYDvr2IOWbL8jXgHlW1I/Bz4OUd53lLVe3Y/n59AXhlx3lIsiXwcOBXXWcB3j55/Kmq47vMk+TBwL7AjlV1d+CtXeapqif2HJs/DXymyzzAm4FXt3le2d7vKssHgUOq6p40f69eukhZYPbPf10cl2fL0tUxebY8XR2XZ8vTxXF51vOGjo7JGpAlWxyg+TB8blWdX1U3AMfQ/NHsTFV9G/hdlxkmVdUlVXVKe/sPNCd3m3eYp6rqmvbuuu3UWRucJFsA/0jzB1w92m84HggcAVBVN1TVVd2mWuOhwHlVdWGHGdYBbp5kHeAWwMUdZrkb8MOquq6qVgMnAo9ZzACzHPf2BT7c3v4w8Ogu81TV2VV1zmJlmCfLV9ufFcAPgS06znN1z90NWMTj8hx/M98O/PuQZOnELHmeBbyxqv7UznNZx3kASBLgCcDHO85TwOQ39JuwSMfmWbLchb+c+H4NeOxiZGnzzPb5b9GPy7Nl6fCYPFueTo7Lc+RZ9OPyPOcNi35MHjUTVN9TV5ZycWBz4KKe+6vo8OR3mCXZBrgXcFLHOZa3zQ4vA75WVV3meQfNgW5YLk1awFeT/DjJQR1nuRNwOfChNN0uPphkg44zTdqfRfwAOl1V/Zrm27pfAZcAv6+qr3aVh+bblwcmuU2SWwB7A1t2mGfS7avqEmg+cAC36zjPsHo68KWuQyR5fZKLgCexuC0HZsqyD/Drqjqtyxw9Dm6b9x65GM2w57E98IAkJyU5Mcm9O84z6QHAb6rqFx3neAHwlva9/FYWt1XOdGcA+7S3H09Hx+Vpn/86PS4Py2fRSXPk6eS4PD1Pl8fl3ixDeEweSrUWU1eWcnFgphEerWhNk2RDmuZ+L5hWiVx0VfXntonUFsDubZPoRZfkUcBlVfXjLrY/i/tX1S403WSek+SBHWZZB9gFeF9V3Qu4lsVtFj6jJOvRfNj6VIcZbkXz7csdgc2ADZI8uas8VXU28Caab6a+DJxG0zRQQy7JK2h+Vkd3naWqXlFVW7ZZDu4qR1vgegUdFyh6vA/YlqYr3CXAYd3GYR3gVjRNfl8KfLL91r5rB9Bh0bbHs4AXtu/lF9K2fuvI02n+lv8Y2Ai4YbEDDNPnv2HKMleero7LM+Xp6rjcm4VmXwzTMXlo2XJgOKxiaiV2C7pt3jt0kqxL8wt+dFUtZl/AObVN1E+gu/EZ7g/sk+QCmu4oD0ny0Y6yAFBVF7f/X0bTP3FRBlKaxSpgVU/LjmNpigVdeyRwSlX9psMMDwN+WVWXV9WNNH1s/77DPFTVEVW1S1U9kKZpa9ff3gH8JskdANr/F6358yhI8hTgUcCTariuN/wxFrH58wy2pSm8ndYen7cATknyd12EqarftEXtCeADdHtchubY/Jm2m96PaFq+dTo4WNu9aj/gE13maD2Fv4x78Ck6/HlV1c+q6h+qaleawsl5i7n9WT7/dXJcHrbPorPl6eq4vID9s2jH5RmyDNUxeZg5IOFwOBnYLskd228U9weO6zjT0Gi/TTgCOLuq3jYEeW47OfprkpvTnGT9rIssVfXyqtqiqrahed98s6o6+/Y3yQZJNpq8DfwDTZPETlTVpcBFSe7SPvRQ4Kyu8vQYhm+nfgXcN8kt2t+xh9LxoJZJbtf+vxXNh/Su9xE0x+KntLefAny+wyxDJclewMuAfarquiHI0zuA5T50dFwGqKrTq+p2VbVNe3xeBezSHpMW3eSJVOsxdHhcbn0OeAhAku2B9YArOk3U/i2vqlUd54DmC6IHtbcfQoeF0p7j8jLgP4H/WcRtz/b5b9GPy0P4WXTGPF0dl+fIs+jH5ZmyDNsxeZjVWvzryjqdbXnAqmp1koOBr9CMGH5kVZ3ZZaYkHwf2BDZNsgp4VVV11azt/sA/A6fnL5cX+o9a3NGWe90B+HB7lYllwCerqvNLCA6J2wOfbVuHrgN8rKq+3G0kngsc3Rbezgee1mWYtrnxw4F/7TJHVZ2U5FjgFJrmdj8BVnSZCfh0ktsANwLPqaorF3PjMx33gDfSNHl+Bk1B5fEd5/kd8G7gtsAXk5xaVY/oKMvLgZsBX2t/539YVf826Cxz5Nm7LQROABcCi5Jltjxd/c2cZd/smWRnmi6LF7CIx59Z8hwJHJnmknk3AE9ZrG845/hZdTIOzCz755nAO9vWDNcDizJ+zyxZNkzynHaWzwAfWowsrRk//9HNcXm2LDejg2PyHHneRTfH5dnyPKOD4/KwnTeMlGEZwGwhMlwtFiVJkiRJWhqets1j+z7h/tAFn+5kzJgl23JAkiRJkqQujVLLAYsDkiRJkiQNwMQItdS3OCBJkiRJ0gCMTmnA4oAkSZIkSQMxMULlAYsDkiRJkiQNQJeXJuyXxQFJkiRJkgZglAYkXNZ1AEmSloIkj06yQ8/91yR52Bzz75bkXQPI8dQkm80zzwd7s05b9j03dSZJksbVBNX31BWLA5Ik/Y2SrAM8Glhzwl1Vr6yqr8+2TFWtrKrnDSDOU4E5iwNV9S9VddYAti1JknrUWvxbiCR7JTknyblJDpnh+RclOSvJT5N8I8nW863T4oAkSUCSbZL8LMmH2z+kxya5RZJXJjk5yRlJViRJO/8JSd6Q5ETgZcA+wFuSnJpk2yRHJXlcO++9k3w/yWlJfpRkoyR7JvlC+/yhST6S5JtJfpHkme3jG7Z/0E9JcnqSfXuynp3kA0nOTPLVJDdvt7cbcHSb4+azvNYTkuzW3n5akp+3r+P+g93LkiSNl4m1mOaTZDlwOPBImi8mDpihReBPgN2qakfgWODN863X4oAkSX9xF2BF+4f0auDZwHuq6t5VdQ/g5sCjeua/ZVU9qKpeDxwHvLSqdq6q8yZnSLIe8Ang+VW1E/Aw4I8zbHtH4B+B+wGvbLsGXA88pqp2AR4MHDZZnAC2Aw6vqrsDVwGPrapjgZXAk9ocM21njSR3AF5NUxR4OD0tHyRJ0tDaHTi3qs6vqhuAY4B9e2eoqm9V1XXt3R8CW8y3UosDkiT9xUVV9b329keBPYAHJzkpyenAQ4C798z/iQWs8y7AJVV1MkBVXV1Vq2eY7/NV9cequgL4Fs0f/gBvSPJT4OvA5sDt2/l/WVWntrd/DGyz0BfZ4z7ACVV1efvhYiGvR5IkLVBV9T0twObART33V7WPzeYZwJfmW6lXK5Ak6S+m/0Uu4L00zfIuSnIosH7P89cuYJ2ZYb0L3faTgNsCu1bVjUku6Nn+n3rm/TNNq4a1MTrXWJIkacSszQCDSQ4CDup5aEVVreidZYbFZtxQkifTdDl80HzbteWAJEl/sVWS+7W3DwC+296+IsmGwOPmWPYPwEYzPP4zYLMk9wZoxxuYqTi/b5L1k9wG2BM4GdgEuKwtDDwYmHcwoTlyzOQkYM8kt0myLvD4BS4nSZIWYG3GHKiqFVW1W8+0YtpqVwFb9tzfArh4+rbbqya9Atinqv40/fnpbDkgSdJfnA08Jcn7gV8A7wNuBZwOXEBzwj6bY4APJHkePUWEqrohyROBd7cDBP6RZtyB6X4EfBHYCnhtVV2c5Gjg/5KsBE6lKTTM5yjgf5L8EbjfXOMOVNUlbWuIHwCXAKcAyxewDUmStAALvfpAn04GtktyR+DXwP7A/+udIcm9gPcDe1XVZQtZaRbYp0GSpCUtyTbAF9qBBxd724cC11TVWxd725IkaXD23mrvvk+4j//V8TN1G5giyd7AO2iK+kdW1euTvAZYWVXHJfk6cE+a4j/Ar6pqn7nWacsBSZIkSZIGYFBfxlfV8cDx0x57Zc/tmVopzsnigCRJQFVdACx6q4F224cOYr1JPgvccdrDL6uqrwxie5IkaaqJrgP0weKAJElLVFU9pusMkiSNswGNOTAQFgckSZIkSRqAtbmUYVcsDkiSJEmSNACjdAEAiwOSJEmSJA2ALQckSZIkSRpzjjkgSZIkSdKYm7BbgSRJkiRJ4210SgMWByRJkiRJGgjHHJAkSZIkacyNUnFgWdcBJEmSJElSt2w5IEmSJEnSAJQDEkqSJEmSNN5GqVuBxQFJkiRJkgagLA5IkiRJkjTe7FYgSZIkSdKYs1uBJEmSJEljzpYDkiRJkiSNOVsOSJIkSZI05hyQUJIkSZKkMTdhtwJJkiRJksabLQckSZIkSRpzthyQJEmSJGnM2XJAkiRJkqQxZ8sBSZIkSZLGnC0HJEmSJEkac7YckCRJkiRpzI1Sy4FlXQeQJEmSJEndsuWAJEmSJEkDUDXRdYQFszggSZIkSdIATIxQtwKLA5IkSZIkDUA5IKEkSZIkSePNlgOSJEmSJI05Ww5IkiRJkjTmJiwOSJIkSZI03spuBZIkSZIkjTe7FUiSJEmSNOYckFCSJEmSpDFnywFJkiRJksacAxJKkiRJkjTmbDkgSZIkSdKYc8wBSZIkSZLGnC0HJEmSJEkac445IEmSJEnSmKsR6lawrOsAkiRJkiSpW7YckCRJkiRpAOxWIEmSJEnSmBulAQntViBJkiRJ0gDUWvxbiCR7JTknyblJDpnh+Zsl+UT7/ElJtplvnRYHJEmSJEkagKrqe5pPkuXA4cAjgR2AA5LsMG22ZwBXVtWdgbcDb5pvvRYHJEmSJEkagEEUB4DdgXOr6vyqugE4Bth32jz7Ah9ubx8LPDRJ5lqpYw5IkiRJkjQAN97w6zlPyNfS5sBFPfdXAfeZbZ6qWp3k98BtgCtmW6ktByRJkiRJGhJJDkqysmc6aPosMyw2vcnBQuaZwpYDkiRJkiQNiapaAayYY5ZVwJY997cALp5lnlVJ1gE2AX4313ZtOSBJkiRJ0ug4GdguyR2TrAfsDxw3bZ7jgKe0tx8HfLPmGdDAlgOSJEmSJI2IdgyBg4GvAMuBI6vqzCSvAVZW1XHAEcBHkpxL02Jg//nWmwWOhihJkiRJkpYouxVIkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTmLA5IkiRJkjTm/j+er6lfIEWswwAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<Figure size 1440x360 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"dims = (20, 5)\n",
|
|
"fig, ax = plt.subplots(figsize=dims)\n",
|
|
"\n",
|
|
"sns.heatmap(affinities.T,\n",
|
|
" xticklabels=participants,\n",
|
|
" yticklabels=proposals,\n",
|
|
" square=True,\n",
|
|
" cbar=True,\n",
|
|
" ax=ax)\n",
|
|
"\n",
|
|
"plt.title('affinities between participants and proposals')\n",
|
|
"plt.ylabel('proposal_id')\n",
|
|
"plt.xlabel('participant_id')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[0.5]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"#power of 1 token forever\n",
|
|
"conviction_capactity = [2]\n",
|
|
"alpha = [1-1/cc for cc in conviction_capactity]\n",
|
|
"print(alpha)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"params= {\n",
|
|
" 'sensitivity': [.75],\n",
|
|
" 'tmin': [7], #unit days; minimum periods passed before a proposal can pass\n",
|
|
" 'sentiment_decay': [.001], #termed mu in the state update function\n",
|
|
" 'alpha': alpha,\n",
|
|
" 'base_completion_rate': [10],\n",
|
|
" 'trigger_func': [trigger_threshold]\n",
|
|
" }"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
|
|
"# Settings of general simulation parameters, unrelated to the system itself\n",
|
|
"# `T` is a range with the number of discrete units of time the simulation will run for;\n",
|
|
"# `N` is the number of times the simulation will be run (Monte Carlo runs)\n",
|
|
"time_periods_per_run = 250\n",
|
|
"monte_carlo_runs = 1\n",
|
|
"\n",
|
|
"simulation_parameters = {\n",
|
|
" 'T': range(time_periods_per_run),\n",
|
|
" 'N': monte_carlo_runs,\n",
|
|
" 'M': params\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"initial_conditions = {'network':network,\n",
|
|
" 'supply': initial_supply,\n",
|
|
" 'funds':initial_funds,\n",
|
|
" 'sentiment': initial_sentiment}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#functions for partial state update block 1\n",
|
|
"\n",
|
|
"def gen_new_participant(network, new_participant_holdings):\n",
|
|
" \n",
|
|
" i = len([node for node in network.nodes])\n",
|
|
" \n",
|
|
" network.add_node(i)\n",
|
|
" network.nodes[i]['type']=\"participant\"\n",
|
|
" \n",
|
|
" s_rv = np.random.rand() \n",
|
|
" network.nodes[i]['sentiment'] = s_rv\n",
|
|
" network.nodes[i]['holdings']=new_participant_holdings\n",
|
|
" \n",
|
|
" for j in get_nodes_by_type(network, 'proposal'):\n",
|
|
" network.add_edge(i, j)\n",
|
|
" \n",
|
|
" rv = np.random.rand()\n",
|
|
" a_rv = 1-4*(1-rv)*rv #polarized distribution\n",
|
|
" network.edges[(i, j)]['affinity'] = a_rv\n",
|
|
" network.edges[(i,j)]['tokens'] = a_rv*network.nodes[i]['holdings']\n",
|
|
" network.edges[(i, j)]['conviction'] = 0\n",
|
|
" \n",
|
|
" return network\n",
|
|
" \n",
|
|
"\n",
|
|
"def gen_new_proposal(network, funds, supply):\n",
|
|
" j = len([node for node in network.nodes])\n",
|
|
" network.add_node(j)\n",
|
|
" network.nodes[j]['type']=\"proposal\"\n",
|
|
" \n",
|
|
" network.nodes[j]['conviction']=0\n",
|
|
" network.nodes[j]['status']='candidate'\n",
|
|
" network.nodes[j]['age']=0\n",
|
|
" \n",
|
|
" rescale = 10000*funds/initial_funds\n",
|
|
" r_rv = gamma.rvs(3,loc=0.001, scale=rescale)\n",
|
|
" network.node[j]['funds_requested'] = r_rv\n",
|
|
" \n",
|
|
" network.nodes[j]['trigger']= trigger_threshold(r_rv, funds, supply)\n",
|
|
" \n",
|
|
" participants = get_nodes_by_type(network, 'participant')\n",
|
|
" proposing_participant = np.random.choice(participants)\n",
|
|
" \n",
|
|
" for i in participants:\n",
|
|
" network.add_edge(i, j)\n",
|
|
" if i==proposing_participant:\n",
|
|
" network.edges[(i, j)]['affinity']=1\n",
|
|
" else:\n",
|
|
" rv = np.random.rand()\n",
|
|
" a_rv = 1-4*(1-rv)*rv #polarized distribution\n",
|
|
" network.edges[(i, j)]['affinity'] = a_rv\n",
|
|
" \n",
|
|
" network.edges[(i, j)]['conviction'] = 0\n",
|
|
" network.edges[(i,j)]['tokens'] = 0\n",
|
|
" return network\n",
|
|
" \n",
|
|
" \n",
|
|
"\n",
|
|
"def driving_process(params, step, sL, s):\n",
|
|
" \n",
|
|
" #placeholder plumbing for random processes\n",
|
|
" arrival_rate = 10/s['sentiment']\n",
|
|
" rv1 = np.random.rand()\n",
|
|
" new_participant = bool(rv1<1/arrival_rate)\n",
|
|
" if new_participant:\n",
|
|
" h_rv = expon.rvs(loc=0.0, scale=1000)\n",
|
|
" new_participant_holdings = h_rv\n",
|
|
" else:\n",
|
|
" new_participant_holdings = 0\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" affinities = [network.edges[e]['affinity'] for e in network.edges ]\n",
|
|
" median_affinity = np.median(affinities)\n",
|
|
" \n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" fund_requests = [network.nodes[j]['funds_requested'] for j in proposals if network.nodes[j]['status']=='candidate' ]\n",
|
|
" \n",
|
|
" funds = s['funds']\n",
|
|
" total_funds_requested = np.sum(fund_requests)\n",
|
|
" \n",
|
|
" proposal_rate = 10/median_affinity * total_funds_requested/funds\n",
|
|
" rv2 = np.random.rand()\n",
|
|
" new_proposal = bool(rv2<1/proposal_rate)\n",
|
|
" \n",
|
|
" sentiment = s['sentiment']\n",
|
|
" funds = s['funds']\n",
|
|
" scale_factor = 1+4000*sentiment**2\n",
|
|
" \n",
|
|
" #this shouldn't happen but expon is throwing domain errors\n",
|
|
" if scale_factor > 1: \n",
|
|
" funds_arrival = expon.rvs(loc = 0, scale = scale_factor )\n",
|
|
" else:\n",
|
|
" funds_arrival = 0\n",
|
|
" \n",
|
|
" return({'new_participant':new_participant,\n",
|
|
" 'new_participant_holdings':new_participant_holdings,\n",
|
|
" 'new_proposal':new_proposal, \n",
|
|
" 'funds_arrival':funds_arrival})\n",
|
|
"\n",
|
|
"def update_network(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" funds = s['funds']\n",
|
|
" supply = s['supply']\n",
|
|
" #placeholder plumbing for new proposals and new participants\n",
|
|
" new_participant = _input['new_participant'] #T/F\n",
|
|
" new_proposal = _input['new_proposal'] #T/F\n",
|
|
" # IF THEN logic to create new nodes // left out for now since always FALSE\n",
|
|
" if new_participant:\n",
|
|
" new_participant_holdings = _input['new_participant_holdings']\n",
|
|
" network = gen_new_participant(network, new_participant_holdings)\n",
|
|
" \n",
|
|
" if new_proposal:\n",
|
|
" network= gen_new_proposal(network,funds,supply )\n",
|
|
" \n",
|
|
" #update age of the existing proposals\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" \n",
|
|
" for j in proposals:\n",
|
|
" network.nodes[j]['age'] = network.nodes[j]['age']+1\n",
|
|
" if network.nodes[j]['status'] == 'candidate':\n",
|
|
" requested = network.nodes[j]['funds_requested']\n",
|
|
" network.nodes[j]['trigger'] = trigger_threshold(requested, funds, supply)\n",
|
|
" else:\n",
|
|
" network.nodes[j]['trigger'] = np.nan\n",
|
|
" \n",
|
|
" key = 'network'\n",
|
|
" value = network\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def increment_funds(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" funds = s['funds']\n",
|
|
" funds_arrival = _input['funds_arrival']\n",
|
|
"\n",
|
|
" #increment funds\n",
|
|
" funds = funds + funds_arrival\n",
|
|
" \n",
|
|
" key = 'funds'\n",
|
|
" value = funds\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def increment_supply(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" supply = s['supply']\n",
|
|
" supply_arrival = _input['new_participant_holdings']\n",
|
|
"\n",
|
|
" #increment funds\n",
|
|
" supply = supply + supply_arrival\n",
|
|
" \n",
|
|
" key = 'supply'\n",
|
|
" value = supply\n",
|
|
" \n",
|
|
" return (key, value)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#partial state update block 2\n",
|
|
"def check_progress(params, step, sL, s):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" \n",
|
|
" completed = []\n",
|
|
" for j in proposals:\n",
|
|
" if network.nodes[j]['status'] == 'active':\n",
|
|
" grant_size = network.nodes[j]['funds_requested']\n",
|
|
" likelihood = 1.0/(min_completion_rate+np.log(grant_size))\n",
|
|
" if np.random.rand() < likelihood:\n",
|
|
" completed.append(j)\n",
|
|
" \n",
|
|
" return({'completed':completed})\n",
|
|
"\n",
|
|
"def complete_proposal(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" participants = get_nodes_by_type(network, 'participant')\n",
|
|
" \n",
|
|
" completed = _input['completed']\n",
|
|
" for j in completed:\n",
|
|
" network.nodes[j]['status']='completed'\n",
|
|
" for i in participants:\n",
|
|
" force = network.edges[(i,j)]['affinity']\n",
|
|
" sentiment = network.node[i]['sentiment']\n",
|
|
" network.node[i]['sentiment'] = get_sentimental(sentiment, force, decay=False)\n",
|
|
" \n",
|
|
" key = 'network'\n",
|
|
" value = network\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def update_sentiment_on_completion(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" completed = _input['completed']\n",
|
|
" \n",
|
|
" grants_outstanding = np.sum([network.nodes[j]['funds_requested'] for j in proposals if network.nodes[j]['status']=='active'])\n",
|
|
" \n",
|
|
" grants_completed = np.sum([network.nodes[j]['funds_requested'] for j in completed])\n",
|
|
" \n",
|
|
" sentiment = s['sentiment']\n",
|
|
" \n",
|
|
" force = grants_completed/grants_outstanding\n",
|
|
" if (force >=0) and (force <=1):\n",
|
|
" sentiment = get_sentimental(sentiment, force, True)\n",
|
|
" else:\n",
|
|
" sentiment = get_sentimental(sentiment, 0, True)\n",
|
|
" \n",
|
|
" \n",
|
|
" key = 'sentiment'\n",
|
|
" value = sentiment\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def get_sentimental(sentiment, force, decay=True):\n",
|
|
" sentiment = sentiment*(1-int(decay)*mu) + force\n",
|
|
" \n",
|
|
" if sentiment > 1:\n",
|
|
" sentiment = 1\n",
|
|
" \n",
|
|
" return sentiment"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#partial state update block 3\n",
|
|
"def trigger_function(params, step, sL, s):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" funds = s['funds']\n",
|
|
" supply = s['supply']\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" \n",
|
|
" accepted = []\n",
|
|
" triggers = {}\n",
|
|
" for j in proposals:\n",
|
|
" if network.nodes[j]['status'] == 'candidate':\n",
|
|
" requested = network.nodes[j]['funds_requested']\n",
|
|
" age = network.nodes[j]['age']\n",
|
|
" threshold = trigger_threshold(requested, funds, supply)\n",
|
|
" if age > tmin:\n",
|
|
" conviction = network.nodes[j]['conviction']\n",
|
|
" if conviction >threshold:\n",
|
|
" accepted.append(j)\n",
|
|
" else:\n",
|
|
" threshold = np.nan\n",
|
|
" \n",
|
|
" triggers[j] = threshold\n",
|
|
" \n",
|
|
" \n",
|
|
" \n",
|
|
" return({'accepted':accepted, 'triggers':triggers})\n",
|
|
"\n",
|
|
"def decrement_funds(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" funds = s['funds']\n",
|
|
" network = s['network']\n",
|
|
" accepted = _input['accepted']\n",
|
|
"\n",
|
|
" #decrement funds\n",
|
|
" for j in accepted:\n",
|
|
" funds = funds - network.nodes[j]['funds_requested']\n",
|
|
" \n",
|
|
" key = 'funds'\n",
|
|
" value = funds\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def update_proposals(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" accepted = _input['accepted']\n",
|
|
" triggers = _input['triggers']\n",
|
|
" participants = get_nodes_by_type(network, 'participant')\n",
|
|
" proposals = get_nodes_by_type(network, 'proposals')\n",
|
|
" \n",
|
|
" for j in proposals:\n",
|
|
" network.nodes[j]['trigger'] = triggers[j]\n",
|
|
" \n",
|
|
" #bookkeeping conviction and participant sentiment\n",
|
|
" for j in accepted:\n",
|
|
" network.nodes[j]['status']='active'\n",
|
|
" network.nodes[j]['conviction']=np.nan\n",
|
|
" #change status to active\n",
|
|
" for i in participants:\n",
|
|
" \n",
|
|
" edge = (i,j)\n",
|
|
" #reset tokens assigned to other candidates\n",
|
|
" network.edges[(i,j)]['tokens']=0\n",
|
|
" network.edges[(i,j)]['conviction'] = np.nan\n",
|
|
" \n",
|
|
" #update participants sentiments (positive or negative) \n",
|
|
" affinities = [network.edges[(i,p)]['affinity'] for p in proposals if not(p in accepted)]\n",
|
|
" if len(affinities)>1:\n",
|
|
" max_affinity = np.max(affinities)\n",
|
|
" force = network.edges[(i,j)]['affinity']-sensitivity*max_affinity\n",
|
|
" else:\n",
|
|
" force = 0\n",
|
|
" \n",
|
|
" #based on what their affinities to the accepted proposals\n",
|
|
" network.nodes[i]['sentiment'] = get_sentimental(network.nodes[i]['sentiment'], force, False)\n",
|
|
" \n",
|
|
" \n",
|
|
" key = 'network'\n",
|
|
" value = network\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def update_sentiment_on_release(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" accepted = _input['accepted']\n",
|
|
" \n",
|
|
" proposals_outstanding = np.sum([network.nodes[j]['funds_requested'] for j in proposals if network.nodes[j]['status']=='candidate'])\n",
|
|
" \n",
|
|
" proposals_accepted = np.sum([network.nodes[j]['funds_requested'] for j in accepted])\n",
|
|
" \n",
|
|
" sentiment = s['sentiment']\n",
|
|
" force = proposals_accepted/proposals_outstanding\n",
|
|
" if (force >=0) and (force <=1):\n",
|
|
" sentiment = get_sentimental(sentiment, force, False)\n",
|
|
" else:\n",
|
|
" sentiment = get_sentimental(sentiment, 0, False)\n",
|
|
" \n",
|
|
" key = 'sentiment'\n",
|
|
" value = sentiment\n",
|
|
" \n",
|
|
" return (key, value)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"def participants_decisions(params, step, sL, s):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" participants = get_nodes_by_type(network, 'participant')\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" candidates = [j for j in proposals if network.nodes[j]['status']=='candidate']\n",
|
|
" \n",
|
|
" gain = .01\n",
|
|
" delta_holdings={}\n",
|
|
" proposals_supported ={}\n",
|
|
" for i in participants:\n",
|
|
" force = network.nodes[i]['sentiment']-sensitivity\n",
|
|
" delta_holdings[i] = network.nodes[i]['holdings']*gain*force\n",
|
|
" \n",
|
|
" support = []\n",
|
|
" for j in candidates:\n",
|
|
" affinity = network.edges[(i, j)]['affinity']\n",
|
|
" cutoff = sensitivity*np.max([network.edges[(i,p)]['affinity'] for p in candidates])\n",
|
|
" if cutoff <.5:\n",
|
|
" cutoff = .5\n",
|
|
" \n",
|
|
" if affinity > cutoff:\n",
|
|
" support.append(j)\n",
|
|
" \n",
|
|
" proposals_supported[i] = support\n",
|
|
" \n",
|
|
" return({'delta_holdings':delta_holdings, 'proposals_supported':proposals_supported})\n",
|
|
"\n",
|
|
"def update_tokens(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" network = s['network']\n",
|
|
" delta_holdings = _input['delta_holdings']\n",
|
|
" proposals = get_nodes_by_type(network, 'proposal')\n",
|
|
" proposals_supported = _input['proposals_supported']\n",
|
|
" participants = get_nodes_by_type(network, 'participant')\n",
|
|
" \n",
|
|
" for i in participants:\n",
|
|
" network.nodes[i]['holdings'] = network.nodes[i]['holdings']+delta_holdings[i]\n",
|
|
" supported = proposals_supported[i]\n",
|
|
" total_affinity = np.sum([ network.edges[(i, j)]['affinity'] for j in supported])\n",
|
|
" for j in proposals:\n",
|
|
" if j in supported:\n",
|
|
" normalized_affinity = network.edges[(i, j)]['affinity']/total_affinity\n",
|
|
" network.edges[(i, j)]['tokens'] = normalized_affinity*network.nodes[i]['holdings']\n",
|
|
" else:\n",
|
|
" network.edges[(i, j)]['tokens'] = 0\n",
|
|
" \n",
|
|
" prior_conviction = network.edges[(i, j)]['conviction']\n",
|
|
" current_tokens = network.edges[(i, j)]['tokens']\n",
|
|
" network.edges[(i, j)]['conviction'] =current_tokens+alpha*prior_conviction\n",
|
|
" \n",
|
|
" for j in proposals:\n",
|
|
" network.nodes[j]['conviction'] = np.sum([ network.edges[(i, j)]['conviction'] for i in participants])\n",
|
|
" \n",
|
|
" key = 'network'\n",
|
|
" value = network\n",
|
|
" \n",
|
|
" return (key, value)\n",
|
|
"\n",
|
|
"def update_supply(params, step, sL, s, _input):\n",
|
|
" \n",
|
|
" supply = s['supply']\n",
|
|
" delta_holdings = _input['delta_holdings']\n",
|
|
" delta_supply = np.sum([v for v in delta_holdings.values()])\n",
|
|
" \n",
|
|
" supply = supply + delta_supply\n",
|
|
" \n",
|
|
" key = 'supply'\n",
|
|
" value = supply\n",
|
|
" \n",
|
|
" return (key, value)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
|
|
"# The Partial State Update Blocks\n",
|
|
"partial_state_update_blocks = [\n",
|
|
" { \n",
|
|
" 'policies': { \n",
|
|
" #new proposals or new participants\n",
|
|
" 'random': driving_process\n",
|
|
" },\n",
|
|
" 'variables': {\n",
|
|
" 'network': update_network,\n",
|
|
" 'funds':increment_funds,\n",
|
|
" 'supply':increment_supply\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" 'policies': {\n",
|
|
" 'completion': check_progress #see if any of the funded proposals completes\n",
|
|
" },\n",
|
|
" 'variables': { # The following state variables will be updated simultaneously\n",
|
|
" 'sentiment': update_sentiment_on_completion, #note completing decays sentiment, completing bumps it\n",
|
|
" 'network': complete_proposal #book-keeping\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" 'policies': {\n",
|
|
" 'release': trigger_function #check each proposal to see if it passes\n",
|
|
" },\n",
|
|
" 'variables': { # The following state variables will be updated simultaneously\n",
|
|
" 'funds': decrement_funds, #funds expended\n",
|
|
" 'sentiment': update_sentiment_on_release, #releasing funds can bump sentiment\n",
|
|
" 'network': update_proposals #reset convictions, and participants sentiments\n",
|
|
" #update based on affinities\n",
|
|
" }\n",
|
|
" },\n",
|
|
" { \n",
|
|
" 'policies': { \n",
|
|
" 'participants_act': participants_decisions, #high sentiment, high affinity =>buy\n",
|
|
" #low sentiment, low affinities => burn\n",
|
|
" #assign tokens to top affinities\n",
|
|
" },\n",
|
|
" 'variables': {\n",
|
|
" 'supply': update_supply,\n",
|
|
" 'network': update_tokens #update everyones holdings \n",
|
|
" #and their conviction for each proposal\n",
|
|
" }\n",
|
|
" }\n",
|
|
"]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
|
|
"# The configurations above are then packaged into a `Configuration` object\n",
|
|
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
|
|
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
|
|
" sim_config=simulation_parameters #dict containing simulation parameters\n",
|
|
" )"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"single_proc: [<cadCAD.configuration.Configuration object at 0x1a19a85c18>]\n",
|
|
"[{'sensitivity': [0.75], 'tmin': [7], 'sentiment_decay': [0.001], 'alpha': [0.5], 'base_completion_rate': [10], 'trigger_func': [<function trigger_threshold at 0x1a1831c620>]}]\n",
|
|
"<class 'list'>\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "TypeError",
|
|
"evalue": "list indices must be integers or slices, not str",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
|
|
"\u001b[0;32m<ipython-input-32-57ee2d652975>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mexec_context\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExecutionContext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexec_mode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msingle_proc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mexecutor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mExecutor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexec_context\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Pass the configuration object inside an array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mraw_result\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# The `main()` method returns a tuple; its first elements contains the raw results\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/__init__.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;31m# ToDO: Deprication Handler - \"sanitize\" in appropriate place\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[0mtensor_field\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_tensor_field\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpartial_state_updates\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0meps\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 98\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexec_method\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msimulation_execs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvar_dict_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_lists\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs_structs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 99\u001b[0m \u001b[0mfinal_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtensor_field\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexec_context\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mExecutionMode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmulti_proc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/__init__.py\u001b[0m in \u001b[0;36msingle_proc_exec\u001b[0;34m(simulation_execs, var_dict_list, states_lists, configs_structs, env_processes_list, Ts, Ns)\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0msimulation_execs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_lists\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs_structs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0msimulation_exec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msimulation_exec\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar_dict_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36msimulation\u001b[0;34m(self, var_dict, states_list, configs, env_processes, time_seq, runs)\u001b[0m\n\u001b[1;32m 270\u001b[0m TPool().map(\n\u001b[1;32m 271\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mexecute_run\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_seq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 272\u001b[0;31m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mruns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 273\u001b[0m )\n\u001b[1;32m 274\u001b[0m )\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/pathos/threading.py\u001b[0m in \u001b[0;36mmap\u001b[0;34m(self, f, *args, **kwds)\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0mAbstractWorkerPool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_AbstractWorkerPool__map\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[0m_pool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_serve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 134\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_pool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# chunksize\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 135\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mAbstractWorkerPool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mimap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/multiprocess/pool.py\u001b[0m in \u001b[0;36mmap\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ma\u001b[0m \u001b[0mlist\u001b[0m \u001b[0mthat\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mreturned\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 265\u001b[0m '''\n\u001b[0;32m--> 266\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_map_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmapstar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 267\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstarmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunksize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/multiprocess/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 642\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 643\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 644\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 645\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_set\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/multiprocess/pool.py\u001b[0m in \u001b[0;36mworker\u001b[0;34m(inqueue, outqueue, initializer, initargs, maxtasks, wrap_exception)\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0mjob\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtask\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 119\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 120\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mwrap_exception\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0m_helper_reraises_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/multiprocess/pool.py\u001b[0m in \u001b[0;36mmapstar\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmapstar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstarmapstar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/pathos/helpers/mp_helper.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mstarargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\"\"\"decorator to convert a many-arg function to a single-arg function\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;31m#func.__module__ = f.__module__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;31m#func.__name__ = f.__name__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(run)\u001b[0m\n\u001b[1;32m 269\u001b[0m pipe_run: List[List[Dict[str, Any]]] = flatten(\n\u001b[1;32m 270\u001b[0m TPool().map(\n\u001b[0;32m--> 271\u001b[0;31m \u001b[0;32mlambda\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mexecute_run\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_seq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 272\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mruns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 273\u001b[0m )\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36mexecute_run\u001b[0;34m(var_dict, states_list, configs, env_processes, time_seq, run)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0mstates_list_copy\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerate_init_sys_metrics\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeepcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstates_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 264\u001b[0;31m \u001b[0mfirst_timestep_per_run\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_pipeline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list_copy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_seq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 265\u001b[0m \u001b[0;32mdel\u001b[0m \u001b[0mstates_list_copy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 266\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36mrun_pipeline\u001b[0;34m(self, var_dict, states_list, configs, env_processes, time_seq, run)\u001b[0m\n\u001b[1;32m 230\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtime_step\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtime_seq\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 231\u001b[0m pipe_run: List[Dict[str, Any]] = self.state_update_pipeline(\n\u001b[0;32m--> 232\u001b[0;31m \u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msimulation_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfigs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_step\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 233\u001b[0m )\n\u001b[1;32m 234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36mstate_update_pipeline\u001b[0;34m(self, var_dict, simulation_list, configs, env_processes, time_step, run)\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 198\u001b[0m states_list: List[Dict[str, Any]] = self.partial_state_update(\n\u001b[0;32m--> 199\u001b[0;31m \u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msub_step\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstates_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msimulation_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ms_conf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp_conf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime_step\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 200\u001b[0m )\n\u001b[1;32m 201\u001b[0m \u001b[0;31m# print(sub_step)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36mpartial_state_update\u001b[0;34m(self, var_dict, sub_step, sL, sH, state_funcs, policy_funcs, env_processes, time_step, run)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdestination\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m \u001b[0mlast_in_copy\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransfer_missing_fields\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlast_in_obj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerate_record\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_funcs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 139\u001b[0m \u001b[0;31m# ToDo: Remove\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0mlast_in_copy\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_env_proc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv_processes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlast_in_copy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlast_in_copy\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestep'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m/anaconda3/lib/python3.6/site-packages/cadCAD/engine/simulation.py\u001b[0m in \u001b[0;36mgenerate_record\u001b[0;34m(state_funcs)\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mgenerate_record\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstate_funcs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate_funcs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 129\u001b[0;31m \u001b[0;32myield\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate_update_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvar_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msub_step\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msH\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlast_in_obj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_input\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 130\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 131\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtransfer_missing_fields\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdestination\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;32m~/Documents/GitHub/conviction/conviction_system_logic.py\u001b[0m in \u001b[0;36mupdate_network\u001b[0;34m(params, step, sL, s, _input)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0mfunds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'funds'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0msupply\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'supply'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 121\u001b[0;31m \u001b[0mtrigger_func\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'trigger_func'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 122\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0mnew_participant\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_input\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'new_participant'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m#T/F\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
"\u001b[0;31mTypeError\u001b[0m: list indices must be integers or slices, not str"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"exec_mode = ExecutionMode()\n",
|
|
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
|
|
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
|
|
"raw_result, tensor = executor.main() # The `main()` method returns a tuple; its first elements contains the raw results"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df = pd.DataFrame(raw_result)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df.tail(5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df.supply.plot()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df.sentiment.plot()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df.plot(x='timestep', y='funds')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def pad(vec, length,fill=True):\n",
|
|
" \n",
|
|
" if fill:\n",
|
|
" padded = np.zeros(length,)\n",
|
|
" else:\n",
|
|
" padded = np.empty(length,)\n",
|
|
" padded[:] = np.nan\n",
|
|
" \n",
|
|
" for i in range(len(vec)):\n",
|
|
" padded[i]= vec[i]\n",
|
|
" \n",
|
|
" return padded\n",
|
|
"\n",
|
|
"def make2D(key, data, fill=False):\n",
|
|
" maxL = data[key].apply(len).max()\n",
|
|
" newkey = 'padded_'+key\n",
|
|
" data[newkey] = data[key].apply(lambda x: pad(x,maxL,fill))\n",
|
|
" reshaped = np.array([a for a in data[newkey].values])\n",
|
|
" \n",
|
|
" return reshaped"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df['conviction'] = df.network.apply(lambda g: np.array([g.nodes[j]['conviction'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate']))\n",
|
|
"df['candidate_count'] = df.network.apply(lambda g: len([j for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate']))\n",
|
|
"df['candidate_funds'] = df.network.apply(lambda g: np.sum([g.nodes[j]['funds_requested'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate']))\n",
|
|
"df['candidate_funds_requested'] = df.network.apply(lambda g: np.array([g.nodes[j]['funds_requested'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate']))\n",
|
|
"df['active_count'] = df.network.apply(lambda g: len([j for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='active']))\n",
|
|
"df['active_funds'] = df.network.apply(lambda g: np.sum([g.nodes[j]['funds_requested'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='active']))\n",
|
|
"df['completed_count'] = df.network.apply(lambda g: len([j for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='completed']))\n",
|
|
"df['completed_funds'] = df.network.apply(lambda g: np.sum([g.nodes[j]['funds_requested'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='completed']))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df['funds_requested'] = df.network.apply(lambda g: np.array([g.nodes[j]['funds_requested'] for j in get_nodes_by_type(g, 'proposal')]))\n",
|
|
"df['share_of_funds_requested'] = df.candidate_funds_requested/df.funds\n",
|
|
"\n",
|
|
"df['share_of_funds_requested_all'] = df.funds_requested/df.funds"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df['triggers'] = df.network.apply(lambda g: np.array([g.nodes[j]['trigger'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate' ]))\n",
|
|
"df['conviction_share_of_trigger'] = df.conviction/df.triggers\n",
|
|
"df['age'] = df.network.apply(lambda g: np.array([g.nodes[j]['age'] for j in get_nodes_by_type(g, 'proposal') if g.nodes[j]['status']=='candidate' ]))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"df['age_all'] = df.network.apply(lambda g: np.array([g.nodes[j]['age'] for j in get_nodes_by_type(g, 'proposal') ]))\n",
|
|
"df['conviction_all'] = df.network.apply(lambda g: np.array([g.nodes[j]['conviction'] for j in get_nodes_by_type(g, 'proposal') ]))\n",
|
|
"df['triggers_all'] = df.network.apply(lambda g: np.array([g.nodes[j]['trigger'] for j in get_nodes_by_type(g, 'proposal') ]))\n",
|
|
"\n",
|
|
"df['conviction_share_of_trigger_all'] = df.conviction_all/df.triggers_all"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"rdf= df[df.substep==4].copy()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"last_net= df.network.values[-1]\n",
|
|
"last_props=get_nodes_by_type(last_net, 'proposal')\n",
|
|
"M = len(last_props)\n",
|
|
"last_parts=get_nodes_by_type(last_net, 'participant')\n",
|
|
"N = len(last_parts)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"affinities = np.empty((N,M))\n",
|
|
"for i_ind in range(N):\n",
|
|
" for j_ind in range(M):\n",
|
|
" i = last_parts[i_ind]\n",
|
|
" j = last_props[j_ind]\n",
|
|
" affinities[i_ind][j_ind] = last_net.edges[(i,j)]['affinity']"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dims = (100, 25)\n",
|
|
"fig, ax = plt.subplots(figsize=dims)\n",
|
|
"\n",
|
|
"sns.heatmap(affinities,\n",
|
|
" yticklabels=last_parts,\n",
|
|
" xticklabels=last_props,\n",
|
|
" square=True,\n",
|
|
" cbar=True,\n",
|
|
" ax=ax)\n",
|
|
"\n",
|
|
"plt.title('affinities between participants and proposals')\n",
|
|
"plt.xlabel('proposal_id')\n",
|
|
"plt.ylabel('participant_id')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#working on deduplicating colors\n",
|
|
"#\n",
|
|
"#last_props=get_nodes_by_type(last_net, 'proposal')\n",
|
|
"#M = len(last_props)\n",
|
|
"\n",
|
|
"#cm = plt.get_cmap('gist_rainbow')\n",
|
|
"#c= [cm(1.*j/M) for j in range(M)] "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"make2D('age_all', rdf)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.plot(rdf.timestep,make2D('age_all', rdf))\n",
|
|
"plt.title('check age')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"rdf.plot(x='timestep',y=['candidate_count','active_count','completed_count'])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"rdf.plot(x='timestep',y=['candidate_funds','active_funds','completed_funds'])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(rdf.timestep,make2D('conviction_all', rdf))\n",
|
|
"plt.title('conviction by proposal')\n",
|
|
"plt.xlabel('time $t$')\n",
|
|
"plt.ylabel('conviction')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(make2D('age_all', rdf),make2D('conviction_all', rdf))\n",
|
|
"plt.title('conviction by proposal')\n",
|
|
"plt.xlabel('proposal age')\n",
|
|
"plt.ylabel('conviction')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.plot(rdf.timestep,make2D('share_of_funds_requested_all', rdf))\n",
|
|
"plt.title('share_of_funds_requested by proposal')\n",
|
|
"plt.xlabel('time $t$')\n",
|
|
"plt.ylabel('share_of_funds_requested')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(make2D('age_all', rdf),make2D('share_of_funds_requested_all', rdf))\n",
|
|
"plt.title('share_of_funds_requested by proposal')\n",
|
|
"plt.xlabel('proposal age')\n",
|
|
"plt.ylabel('share_of_funds_requested')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.loglog(make2D('share_of_funds_requested_all', rdf), make2D('conviction_all', rdf), '.')\n",
|
|
"plt.ylabel('conviction')\n",
|
|
"plt.xlabel('share_of_funds_requested')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(make2D('age_all', rdf), make2D('triggers_all', rdf))\n",
|
|
"plt.ylabel('triggers')\n",
|
|
"plt.xlabel('proposal_age')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.loglog(make2D('conviction_all', rdf), make2D('triggers_all', rdf))\n",
|
|
"a = plt.axis()\n",
|
|
"plt.loglog(a[:2],a[2:], 'k',alpha=.5 )\n",
|
|
"plt.ylabel('triggers')\n",
|
|
"plt.xlabel('conviction')\n",
|
|
"plt.title('phase: Triggers & Conviction')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(rdf.timestep,make2D('conviction_share_of_trigger_all', rdf))\n",
|
|
"plt.title('conviction_share_of_trigger')\n",
|
|
"plt.xlabel('time $t$')\n",
|
|
"plt.ylabel('conviction_share_of_trigger')\n",
|
|
"plt.hlines(1,0,T, linestyle='--')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.semilogy(make2D('age_all', rdf), make2D('conviction_share_of_trigger_all', rdf))\n",
|
|
"plt.ylabel('triggers')\n",
|
|
"plt.xlabel('proposal_age')\n",
|
|
"plt.hlines(1,0,T, linestyle='--')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"pos = {}\n",
|
|
"for ind in range(N):\n",
|
|
" i = last_parts[ind] \n",
|
|
" pos[i] = np.array([0, 2*ind-N])\n",
|
|
"\n",
|
|
"for ind in range(M):\n",
|
|
" j = last_props[ind] \n",
|
|
" pos[j] = np.array([1, 2*N/M *ind-N])\n",
|
|
"\n",
|
|
"#for i in last_parts:\n",
|
|
"#for j in last_props:\n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"edges = [e for e in last_net.edges]\n",
|
|
"max_tok = np.max([last_net.edges[e]['tokens'] for e in edges])\n",
|
|
"\n",
|
|
"E = len(edges)\n",
|
|
"\n",
|
|
"node_color = np.empty((M+N,4))\n",
|
|
"node_size = np.empty(M+N)\n",
|
|
"\n",
|
|
"edge_color = np.empty((E,4))\n",
|
|
"cm = plt.get_cmap('Reds')\n",
|
|
"\n",
|
|
"cNorm = colors.Normalize(vmin=0, vmax=max_tok)\n",
|
|
"scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"size_scale = 1/500\n",
|
|
"node_label = {}\n",
|
|
"\n",
|
|
"for j in last_props:\n",
|
|
" node_size[j] = last_net.nodes[j]['funds_requested']*size_scale\n",
|
|
" if last_net.nodes[j]['status']==\"candidate\":\n",
|
|
" node_color[j] = colors.to_rgba('blue')\n",
|
|
" trigger = last_net.nodes[j]['trigger']\n",
|
|
" #print(trigger)\n",
|
|
" conviction = last_net.nodes[j]['conviction']\n",
|
|
" #print(conviction)\n",
|
|
" percent_of_trigger = str(int(100*conviction/trigger))+'%'\n",
|
|
" #age = last_net.nodes[j]['age']\n",
|
|
" node_label[j] = str(percent_of_trigger)\n",
|
|
" elif last_net.nodes[j]['status']==\"active\":\n",
|
|
" node_color[j] = colors.to_rgba('orange')\n",
|
|
" node_label[j] = ''\n",
|
|
" elif last_net.nodes[j]['status']==\"completed\":\n",
|
|
" node_color[j] = colors.to_rgba('green')\n",
|
|
" node_label[j] = ''\n",
|
|
"\n",
|
|
"for i in last_parts: \n",
|
|
" node_size[i] = last_net.nodes[i]['holdings']*size_scale\n",
|
|
" node_color[i] = colors.to_rgba('red')\n",
|
|
" node_label[i] = ''\n",
|
|
"\n",
|
|
"included_edges = []\n",
|
|
"for ind in range(E):\n",
|
|
" e = edges[ind]\n",
|
|
" tokens = last_net.edges[e]['tokens']\n",
|
|
" if tokens >0:\n",
|
|
" included_edges.append(e)\n",
|
|
" #print(tokens)\n",
|
|
" edge_color[ind] = scalarMap.to_rgba(tokens)\n",
|
|
"\n",
|
|
"iE = len(included_edges)\n",
|
|
"included_edge_color = np.empty((iE,4))\n",
|
|
"for ind in range(iE):\n",
|
|
" e = included_edges[ind]\n",
|
|
" tokens = last_net.edges[e]['tokens']\n",
|
|
" included_edge_color[ind] = scalarMap.to_rgba(tokens)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nx.draw(last_net,\n",
|
|
" pos=pos, \n",
|
|
" node_size = node_size, \n",
|
|
" node_color = node_color, \n",
|
|
" edge_color = included_edge_color, \n",
|
|
" edgelist=included_edges,\n",
|
|
" labels = node_label)\n",
|
|
"plt.title('Tokens Staked by Partipants to Proposals')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nets = rdf.network.values"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def snap_plot(nets, size_scale = 1/500, ani = False, dims = (20,20), savefigs=False ):\n",
|
|
" \n",
|
|
" last_net= df.network.values[-1]\n",
|
|
" last_props=get_nodes_by_type(last_net, 'proposal')\n",
|
|
" M = len(last_props)\n",
|
|
" last_parts=get_nodes_by_type(last_net, 'participant')\n",
|
|
" N = len(last_parts)\n",
|
|
" pos = {}\n",
|
|
" \n",
|
|
" for ind in range(N):\n",
|
|
" i = last_parts[ind] \n",
|
|
" pos[i] = np.array([0, 2*ind-N])\n",
|
|
"\n",
|
|
" for ind in range(M):\n",
|
|
" j = last_props[ind] \n",
|
|
" pos[j] = np.array([1, 2*N/M *ind-N])\n",
|
|
" \n",
|
|
" if ani:\n",
|
|
" figs = []\n",
|
|
" fig, ax = plt.subplots(figsize=dims)\n",
|
|
" \n",
|
|
" if savefigs:\n",
|
|
" counter = 0\n",
|
|
" length = 10\n",
|
|
" import string\n",
|
|
" unique_id = ''.join([np.random.choice(list(string.ascii_letters + string.digits)) for _ in range(length)])\n",
|
|
" for net in nets:\n",
|
|
" edges = [e for e in net.edges]\n",
|
|
" max_tok = np.max([net.edges[e]['tokens'] for e in edges])\n",
|
|
"\n",
|
|
" E = len(edges)\n",
|
|
" \n",
|
|
" net_props = get_nodes_by_type(net, 'proposal')\n",
|
|
" net_parts = get_nodes_by_type(net, 'participant')\n",
|
|
" net_node_label ={}\n",
|
|
" \n",
|
|
" num_nodes = len([node for node in net.nodes])\n",
|
|
" \n",
|
|
" node_color = np.empty((num_nodes,4))\n",
|
|
" node_size = np.empty(num_nodes)\n",
|
|
"\n",
|
|
" edge_color = np.empty((E,4))\n",
|
|
" cm = plt.get_cmap('Reds')\n",
|
|
"\n",
|
|
" cNorm = colors.Normalize(vmin=0, vmax=max_tok)\n",
|
|
" scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)\n",
|
|
" \n",
|
|
" \n",
|
|
"\n",
|
|
" for j in net_props:\n",
|
|
" node_size[j] = net.nodes[j]['funds_requested']*size_scale\n",
|
|
" if net.nodes[j]['status']==\"candidate\":\n",
|
|
" node_color[j] = colors.to_rgba('blue')\n",
|
|
" trigger = net.nodes[j]['trigger'] \n",
|
|
" conviction = net.nodes[j]['conviction']\n",
|
|
" percent_of_trigger = \" \"+str(int(100*conviction/trigger))+'%'\n",
|
|
" net_node_label[j] = str(percent_of_trigger)\n",
|
|
" elif net.nodes[j]['status']==\"active\":\n",
|
|
" node_color[j] = colors.to_rgba('orange')\n",
|
|
" net_node_label[j] = ''\n",
|
|
" elif net.nodes[j]['status']==\"completed\":\n",
|
|
" node_color[j] = colors.to_rgba('green')\n",
|
|
" net_node_label[j] = ''\n",
|
|
"\n",
|
|
" for i in net_parts: \n",
|
|
" node_size[i] = net.nodes[i]['holdings']*size_scale\n",
|
|
" node_color[i] = colors.to_rgba('red')\n",
|
|
" net_node_label[i] = ''\n",
|
|
"\n",
|
|
" included_edges = []\n",
|
|
" for ind in range(E):\n",
|
|
" e = edges[ind]\n",
|
|
" tokens = net.edges[e]['tokens']\n",
|
|
" if tokens >0:\n",
|
|
" included_edges.append(e)\n",
|
|
" edge_color[ind] = scalarMap.to_rgba(tokens)\n",
|
|
"\n",
|
|
" iE = len(included_edges)\n",
|
|
" included_edge_color = np.empty((iE,4))\n",
|
|
" for ind in range(iE):\n",
|
|
" e = included_edges[ind]\n",
|
|
" tokens = net.edges[e]['tokens']\n",
|
|
" included_edge_color[ind] = scalarMap.to_rgba(tokens)\n",
|
|
" \n",
|
|
" nx.draw(net,\n",
|
|
" pos=pos, \n",
|
|
" node_size = node_size,\n",
|
|
" node_color = node_color, \n",
|
|
" edge_color = included_edge_color, \n",
|
|
" edgelist=included_edges,\n",
|
|
" labels = net_node_label)\n",
|
|
" plt.title('Tokens Staked by Partipants to Proposals')\n",
|
|
" if ani:\n",
|
|
" nx.draw(net,\n",
|
|
" pos=pos, \n",
|
|
" node_size = node_size,\n",
|
|
" node_color = node_color, \n",
|
|
" edge_color = included_edge_color, \n",
|
|
" edgelist=included_edges,\n",
|
|
" labels = net_node_label, ax=ax)\n",
|
|
" figs.append(fig)\n",
|
|
" \n",
|
|
" else:\n",
|
|
" nx.draw(net,\n",
|
|
" pos=pos, \n",
|
|
" node_size = node_size,\n",
|
|
" node_color = node_color, \n",
|
|
" edge_color = included_edge_color, \n",
|
|
" edgelist=included_edges,\n",
|
|
" labels = net_node_label)\n",
|
|
" plt.title('Tokens Staked by Partipants to Proposals')\n",
|
|
" if savefigs:\n",
|
|
" plt.savefig(unique_id+'_fig'+str(counter)+'.png')\n",
|
|
" counter = counter+1\n",
|
|
" plt.show()\n",
|
|
" \n",
|
|
" if ani:\n",
|
|
" False\n",
|
|
" #anim = animation.ArtistAnimation(fig, , interval=50, blit=True, repeat_delay=1000)\n",
|
|
" #plt.show()\n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"snap_plot(nets, ani=False, savefigs=False)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#totally failing at animating by trying to save a sequence of figures.\n",
|
|
"#snap_plot(nets, ani=True)\n",
|
|
"\n",
|
|
"#saving the images to files works so there is almost the option to compile a video from the images"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"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.6.5"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|