131 lines
4.2 KiB
Python
131 lines
4.2 KiB
Python
import numpy as np
|
|
from .utils import *
|
|
import networkx as nx
|
|
|
|
|
|
# Behaviors
|
|
def trigger_function(params, step, sL, s):
|
|
'''
|
|
This policy checks to see if each proposal passes or not.
|
|
'''
|
|
network = s['network']
|
|
funds = s['funds']
|
|
supply = s['effective_supply']
|
|
proposals = get_nodes_by_type(network, 'proposal')
|
|
|
|
accepted = []
|
|
triggers = {}
|
|
funds_to_be_released = 0
|
|
for j in proposals:
|
|
if network.nodes[j]['status'] == 'candidate':
|
|
requested = network.nodes[j]['funds_requested']
|
|
age = network.nodes[j]['age']
|
|
threshold = trigger_threshold(requested, funds, supply, params['alpha'],params)
|
|
if age > params['tmin']:
|
|
conviction = network.nodes[j]['conviction']
|
|
if conviction >threshold:
|
|
accepted.append(j)
|
|
funds_to_be_released = funds_to_be_released + requested
|
|
else:
|
|
threshold = np.nan
|
|
|
|
triggers[j] = threshold
|
|
|
|
#catch over release and keep the highest conviction results
|
|
if funds_to_be_released > funds:
|
|
|
|
ordered = conviction_order(network, accepted)
|
|
accepted = []
|
|
release = 0
|
|
ind = 0
|
|
while release + network.nodes[ordered[ind]]['funds_requested'] < funds:
|
|
accepted.append(ordered[ind])
|
|
release= network.nodes[ordered[ind]]['funds_requested']
|
|
ind=ind+1
|
|
|
|
|
|
return({'accepted':accepted, 'triggers':triggers})
|
|
|
|
# Mechanisms
|
|
def decrement_funds(params, step, sL, s, _input):
|
|
'''
|
|
If a proposal passes, funds are decremented by the amount of the proposal
|
|
'''
|
|
|
|
funds = s['funds']
|
|
network = s['network']
|
|
accepted = _input['accepted']
|
|
|
|
#decrement funds
|
|
for j in accepted:
|
|
funds = funds - network.nodes[j]['funds_requested']
|
|
|
|
key = 'funds'
|
|
value = funds
|
|
|
|
return (key, value)
|
|
|
|
def update_sentiment_on_release(params, step, sL, s, _input):
|
|
|
|
network = s['network']
|
|
proposals = get_nodes_by_type(network, 'proposal')
|
|
accepted = _input['accepted']
|
|
|
|
proposals_outstanding = np.sum([network.nodes[j]['funds_requested'] for j in proposals if network.nodes[j]['status']=='candidate'])
|
|
|
|
proposals_accepted = np.sum([network.nodes[j]['funds_requested'] for j in accepted])
|
|
|
|
sentiment = s['sentiment']
|
|
force = len(accepted)
|
|
if force>0:
|
|
sentiment = get_sentimental(sentiment, force, .25)
|
|
else:
|
|
sentiment = get_sentimental(sentiment, 0, 0)
|
|
|
|
key = 'sentiment'
|
|
value = sentiment
|
|
|
|
return (key, value)
|
|
|
|
def update_proposals(params, step, sL, s, _input):
|
|
'''
|
|
If proposal passes, its status is changed in the network object.
|
|
'''
|
|
|
|
network = s['network']
|
|
accepted = _input['accepted']
|
|
triggers = _input['triggers']
|
|
participants = get_nodes_by_type(network, 'participant')
|
|
proposals = get_nodes_by_type(network, 'proposals')
|
|
|
|
for j in proposals:
|
|
network.nodes[j]['trigger'] = triggers[j]
|
|
|
|
#bookkeeping conviction and participant sentiment
|
|
for j in accepted:
|
|
network.nodes[j]['status']='active'
|
|
network.nodes[j]['conviction']=np.nan
|
|
#change status to active
|
|
for i in participants:
|
|
|
|
#operating on edge = (i,j)
|
|
#reset tokens assigned to other candidates
|
|
network.edges[(i,j)]['tokens']=0
|
|
network.edges[(i,j)]['conviction'] = np.nan
|
|
|
|
#update participants sentiments (positive or negative)
|
|
affinities = [network.edges[(i,p)]['affinity'] for p in proposals if not(p in accepted)]
|
|
if len(affinities)>1:
|
|
max_affinity = np.max(affinities)
|
|
force = network.edges[(i,j)]['affinity']-params['sensitivity']*max_affinity
|
|
else:
|
|
force = 0
|
|
|
|
#based on what their affinities to the accepted proposals
|
|
network.nodes[i]['sentiment'] = get_sentimental(network.nodes[i]['sentiment'], force, False)
|
|
|
|
|
|
key = 'network'
|
|
value = network
|
|
|
|
return (key, value) |