Community_Inclusion_Currencies/Simulation_param/model/parts/operatorentity.py

288 lines
7.5 KiB
Python

import numpy as np
import pandas as pd
from cadCAD.configuration.utils import access_block
from .initialization import *
from .supportingFunctions import *
from collections import OrderedDict
# Parameters
FrequencyOfAllocation = 45 # every two weeks
idealFiat = 5000
idealCIC = 200000
varianceCIC = 50000
varianceFiat = 1000
unadjustedPerAgent = 50
agentAllocation = {'a':[1,1],'b':[1,1],'c':[1,1], # agent:[centrality,allocationValue]
'd':[1,1],'e':[1,1],'f':[1,1],
'g':[1,1],'h':[1,1],'i':[1,1],
'j':[1,1],'k':[1,1],'l':[1,1],
'm':[1,1],'o':[1,1],'p':[1,1]}
# Behaviors
def disbursement_to_agents(params, step, sL, s):
'''
Distribute every FrequencyOfAllocation days to agents based off of centrality allocation metric
'''
fiatBalance = s['operatorFiatBalance']
cicBalance = s['operatorCICBalance']
timestep = s['timestep']
division = timestep % FrequencyOfAllocation == 0
if division == True:
agentDistribution ={} # agent: amount distributed
for i,j in agentAllocation.items():
agentDistribution[i] = unadjustedPerAgent * agentAllocation[i][1]
distribute = 'Yes'
else:
agentDistribution = 0
distribute = 'No'
return {'distribute':distribute,'amount':agentDistribution}
def inventory_controller(params, step, sL, s):
'''
Monetary policy hysteresis conservation allocation between fiat and cic reserves.
# TODO: If scarcity on both sides, add feedback to reduce percentage able to withdraw, frequency you can redeem, or redeem at less than par.
'''
fiatBalance = s['operatorFiatBalance']
cicBalance = s['operatorCICBalance']
timestep = s['timestep']
fundsInProcess = s['fundsInProcess']
updatedCIC = cicBalance
updatedFiat = fiatBalance
#decision,amt = mint_burn_logic_control(idealCIC,updatedCIC,variance,updatedFiat)
decision,amt = mint_burn_logic_control(idealCIC,updatedCIC,varianceCIC,updatedFiat,varianceFiat,idealFiat)
if decision == 'burn':
try:
deltaR, realized_price = withdraw(amt,updatedFiat,updatedCIC, V0, kappa)
# update state
# fiatBalance = fiatBalance - deltaR
# cicBalance = cicBalance - amt
fiatChange = abs(deltaR)
cicChange = amt
except:
print('Not enough to burn')
fiatChange = 0
cicChange = 0
elif decision == 'mint':
try:
deltaS, realized_price = mint(amt,updatedFiat,updatedCIC, V0, kappa)
# update state
# fiatBalance = fiatBalance + amt
# cicBalance = cicBalance + deltaS
fiatChange = amt
cicChange = abs(deltaS)
except:
print('Not enough to mint')
fiatChange = 0
cicChange = 0
else:
fiatChange = 0
cicChange = 0
decision = 'none'
pass
if decision == 'mint':
fundsInProcess['timestep'].append(timestep + process_lag)
fundsInProcess['decision'].append(decision)
fundsInProcess['cic'].append(fiatChange)
fundsInProcess['shilling'].append(cicChange)
elif decision == 'burn':
fundsInProcess['timestep'].append(timestep +process_lag)
fundsInProcess['decision'].append(decision)
fundsInProcess['cic'].append(fiatChange)
fundsInProcess['shilling'].append(cicChange)
else:
pass
return {'decision':decision,'fiatChange':fiatChange,'cicChange':cicChange,'fundsInProcess':fundsInProcess}
# Mechanisms
def update_agent_tokens(params,step,sL,s,_input):
'''
'''
y = 'network'
network = s['network']
distribute = _input['distribute']
amount = _input['amount']
if distribute == 'Yes':
for i in agents:
network.nodes[i]['tokens'] = network.nodes[i]['tokens'] + amount[i]
else:
pass
return (y,network)
def update_operator_FromDisbursements(params,step,sL,s,_input):
'''
'''
y = 'operatorCICBalance'
x = s['operatorCICBalance']
timestep = s['timestep']
distribute = _input['distribute']
amount = _input['amount']
if distribute == 'Yes':
totalDistribution = []
for i,j in amount.items():
totalDistribution.append(j)
totalDistribution = sum(totalDistribution)
x = x - totalDistribution
else:
pass
return (y,x)
def update_totalDistributedToAgents(params,step,sL,s,_input):
'''
'''
y = 'totalDistributedToAgents'
x = s['totalDistributedToAgents']
timestep = s['timestep']
distribute = _input['distribute']
amount = _input['amount']
if distribute == 'Yes':
totalDistribution = []
for i,j in amount.items():
totalDistribution.append(j)
totalDistribution = sum(totalDistribution)
x = x + totalDistribution
else:
pass
return (y,x)
def update_operator_fiatBalance(params,step,sL,s,_input):
'''
'''
y = 'operatorFiatBalance'
x = s['operatorFiatBalance']
fundsInProcess = s['fundsInProcess']
timestep = s['timestep']
if _input['fiatChange']:
try:
if fundsInProcess['timestep'][0] == timestep + 1:
if fundsInProcess['decision'][0] == 'mint':
x = x - abs(fundsInProcess['shilling'][0])
elif fundsInProcess['decision'][0] == 'burn':
x = x + abs(fundsInProcess['shilling'][0])
else:
pass
except:
pass
else:
pass
return (y,x)
def update_operator_cicBalance(params,step,sL,s,_input):
'''
'''
y = 'operatorCICBalance'
x = s['operatorCICBalance']
fundsInProcess = s['fundsInProcess']
timestep = s['timestep']
if _input['cicChange']:
try:
if fundsInProcess['timestep'][0] == timestep + 1:
if fundsInProcess['decision'][0] == 'mint':
x = x + abs(fundsInProcess['cic'][0])
elif fundsInProcess['decision'][0] == 'burn':
x = x - abs(fundsInProcess['cic'][0])
else:
pass
except:
pass
else:
pass
return (y,x)
def update_totalMinted(params,step,sL,s,_input):
'''
'''
y = 'totalMinted'
x = s['totalMinted']
timestep = s['timestep']
try:
if _input['fundsInProcess']['decision'][0] == 'mint':
x = x + abs(_input['fundsInProcess']['cic'][0])
elif _input['fundsInProcess']['decision'][0] == 'burn':
pass
except:
pass
return (y,x)
def update_totalBurned(params,step,sL,s,_input):
'''
'''
y = 'totalBurned'
x = s['totalBurned']
timestep = s['timestep']
try:
if _input['fundsInProcess']['decision'][0] == 'burn':
x = x + abs(_input['fundsInProcess']['cic'][0])
elif _input['fundsInProcess']['decision'][0] == 'mint':
pass
except:
pass
return (y,x)
def update_fundsInProcess(params,step,sL,s,_input):
'''
'''
y = 'fundsInProcess'
x = _input['fundsInProcess']
timestep = s['timestep']
if _input['fundsInProcess']:
try:
if x['timestep'][0] == timestep:
del x['timestep'][0]
del x['decision'][0]
del x['cic'][0]
del x['shilling'][0]
else:
pass
except:
pass
else:
pass
return (y,x)