1744 lines
196 KiB
Plaintext
1744 lines
196 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](https://github.com/BlockScience/cadCAD-Tutorials/tree/master/01%20Tutorials)\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': 24045.85625614501,\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': 837.7209354737918,\n",
|
|
" 'sentiment': 0.9643955178896184}"
|
|
]
|
|
},
|
|
"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.3515390332022055, '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": "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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]['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": "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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], 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": "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\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, 0.9]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"#power of 1 token forever\n",
|
|
"conviction_capactity = [2,10]\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": 21,
|
|
"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": 22,
|
|
"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": 23,
|
|
"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": 24,
|
|
"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": 25,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"single_proc: [<cadCAD.configuration.Configuration object at 0x1a208bcf98>]\n",
|
|
"[{'sensitivity': [0.75], 'tmin': [7], 'sentiment_decay': [0.001], 'alpha': [0.5, 0.9], 'base_completion_rate': [10], 'trigger_func': [<function trigger_threshold at 0x1a1f145400>]}]\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-25-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.8"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|