Ver código fonte

[research/lotterysim] plot from ./log initial stake, apr for each node in plot_darkies.py

ertosns 3 anos atrás
pai
commit
b3a868999d

+ 3 - 0
script/research/lotterysim/core/constants.py

@@ -38,3 +38,6 @@ ACC_WINDOW = 100
 
 BASE_L = 0.001*L
 BASE_L_HP = Num(BASE_L)
+
+# HEADSTART AIRDROP period ~ 1 month
+HEADSTART_AIRDROP=28800

+ 2 - 0
script/research/lotterysim/core/darkie.py

@@ -74,6 +74,8 @@ class Darkie():
             self.strategy.set_ratio(self.slot, apr)
             # epoch stake is added
             self.initial_stake +=[self.stake]
+        #if self.slot == HEADSTART_AIRDROP:
+        #    self.initial_stake += [self.stake]
         T = target(self.f, self.strategy.staked_value(self.stake))
         won = lottery(T, hp)
         self.won_hist += [won]

+ 20 - 1
script/research/lotterysim/core/strategy.py

@@ -2,8 +2,15 @@ import math
 from core.utils import *
 
 class Strategy(object):
-    def __init__(self, epoch_len=0):
+    '''
+    @type epoch_len: int
+    @epoch_len: epoch length
+    @type airdrop_period: int
+    @param airdrop_period: strategy grace period, during which strategy is HODL only
+    '''
+    def __init__(self, epoch_len=0, airdrop_period=HEADSTART_AIRDROP):
         self.epoch_len = epoch_len
+        self.airdrop_period=HEADSTART_AIRDROP
         self.staked_tokens_ratio = [1]
         self.target_apy = TARGET_APR
         self.annual_return = [0]
@@ -32,6 +39,10 @@ class LinearStrategy(Strategy):
 
     def set_ratio(self, slot, apr):
         if slot%self.epoch_len==0:
+            if slot < self.airdrop_period:
+                self.staked_tokens_ratio += [1]
+                self.annual_return +=[apr]
+                return
             sr = Num(apr)/Num(self.target_apy)
             if sr>1:
                 sr = 1
@@ -48,6 +59,10 @@ class LogarithmicStrategy(Strategy):
 
     def set_ratio(self, slot, apr):
         if slot%self.epoch_len==0:
+            if slot < self.airdrop_period:
+                self.staked_tokens_ratio += [1]
+                self.annual_return +=[apr]
+                return
             apr_ratio = math.fabs(apr/self.target_apy)
             fn = lambda x: (math.log(x, 10)+1)/2 * 0.95 + 0.05
             sr = Num(fn(apr_ratio) if apr_ratio != 0 else 0)
@@ -65,6 +80,10 @@ class SigmoidStrategy(Strategy):
 
     def set_ratio(self, slot, apr):
         if slot%self.epoch_len==0:
+            if slot < self.airdrop_period:
+                self.staked_tokens_ratio += [1]
+                self.annual_return +=[apr]
+                return
             apr_ratio = apr/self.target_apy
             sr = Num(2/(1+math.pow(math.e, -4*apr_ratio))-1)
             if sr>1:

+ 1 - 1
script/research/lotterysim/discrete_instance_pi_headstart.py

@@ -10,7 +10,7 @@ from draw import draw
 os.system("rm log/*_feedback.hist; rm log/*_output.hist")
 
 RUNNING_TIME = int(input("running time:"))
-NODES=1000
+NODES=100
 
 if __name__ == "__main__":
     darkies = [Darkie(0, strategy=LinearStrategy(EPOCH_LENGTH)) for _ in range(NODES)]

BIN
script/research/lotterysim/img/apr_distribution.png


BIN
script/research/lotterysim/img/feedback_history_processed.png


BIN
script/research/lotterysim/img/output_history_processed.png


+ 27 - 0
script/research/lotterysim/plot_darkies.py

@@ -0,0 +1,27 @@
+import matplotlib.pyplot as plt
+import numpy as np
+import os
+import glob
+
+darkies = []
+idx = 0
+for darkie in glob.glob('log/darkie[0-9]*.log'):
+    with open(darkie) as f:
+        buf = f.read()
+        lines = buf.split('\n')
+        apr = float(lines[2].split(':')[1].strip())
+        initial_stake = [float(item) for item in lines[0].split(':')[1].split(',')]
+        idx +=1
+        if sum(initial_stake)!=0 :
+            darkies += [(initial_stake, apr, idx)]
+
+for darkie in darkies:
+    plt.plot(darkie[0])
+
+legends = []
+for darkie in darkies:
+    legend = ["darkie{}, apr: {}".format(darkie[2], format(darkie[1]))]
+    legends +=[legend]
+plt.legend(legends)
+plt.show()
+plt.savefig("log/plot_darkies.png")