Przeglądaj źródła

[research/lotterysim] fix a bug with APR period during headstart phase

ertosns 3 lat temu
rodzic
commit
3ee043cdbc

+ 8 - 4
script/research/lotterysim/core/constants.py

@@ -9,7 +9,9 @@ CONTROLLER_TYPE_DISCRETE=0
 # takahashi controller enum
 CONTROLLER_TYPE_TAKAHASHI=1
 # initial distribution of tokens (random value for sake of experimentation)
-ERC20DRK=2.1*10**7
+ERC20DRK = 2.1*10**7
+# initial distribution
+PREMINT = ERC20DRK
 # group base/order
 L = 28948022309329048855892746252171976963363056481941560715954676764349967630337.0
 # secondary finalization controller minimal clipped value
@@ -40,12 +42,14 @@ SECONDARY_LEAD_TARGET = 1 #number of lead per slot
 EPSILON = 1
 # window of accuracy calculation
 ACC_WINDOW = int(EPOCH_LENGTH)
-# headstart value
-BASE_L = 0.0001*L
 # headstart airdrop period
-HEADSTART_AIRDROP = 288
+HEADSTART_AIRDROP = 0
 # threshold of randomly slashing stakeholder
 SLASHING_RATIO = 0.0001
+# number of nodes
+NODES=1000
+# headstart value
+BASE_L = NODES**-1*L*0.01
 # decimal high precision.
 L_HP = Num(L)
 F_MIN_HP = Num(F_MIN)

+ 16 - 4
script/research/lotterysim/core/darkie.py

@@ -37,7 +37,15 @@ class Darkie():
     def apr_scaled_to_runningtime(self):
         initial_stake = self.vesting_wrapped_initial_stake()
         assert self.stake >= initial_stake, 'stake: {}, initial_stake: {}, slot: {}, current: {}, previous: {} vesting'.format(self.stake, initial_stake, self.slot, self.current_vesting(), self.prev_vesting())
-        apr = Num(self.stake - initial_stake) / Num(initial_stake) *  Num(ONE_YEAR/(self.slot)) if initial_stake > 0 and self.slot>0 else 0
+        apr_scaled = Num(self.stake - initial_stake) / Num(initial_stake) if initial_stake>0 else 0
+        if self.slot <= HEADSTART_AIRDROP:
+            # during this phase, it's only called at end of epoch
+            apr_period = EPOCH_LENGTH
+        else:
+            apr_period = self.slot-HEADSTART_AIRDROP
+        apr = apr_scaled * Num(ONE_YEAR/apr_period) if initial_stake > 0 and self.slot>0 else 0
+        #if apr>0 and self.stake-initial_stake>0:
+            #print("apr: {}, stake: {}, initial_stake: {}".format(apr, self.stake, initial_stake))
         return apr
 
 
@@ -48,8 +56,11 @@ class Darkie():
     def vesting_wrapped_initial_stake(self):
         #returns  vesting stake plus initial stake gained from zero coin headstart during aridrop period
         vesting = self.current_vesting()
-        #return vesting if vesting > 0 else  self.initial_stake[0]
-        return vesting +  self.initial_stake[0]
+        if self.slot <= HEADSTART_AIRDROP:
+            initial_stake = self.initial_stake[-1]
+        else:
+            initial_stake = self.initial_stake[int(HEADSTART_AIRDROP/EPOCH_LENGTH)]
+        return vesting + initial_stake
 
     """
     update stake with vesting return every scheduled vesting period
@@ -113,7 +124,8 @@ class Darkie():
             x = (Num(1) if hp else 1)  - (Num(tune_parameter) if hp else tune_parameter)
             c = (x.ln() if type(x)==Num else math.log(x))
             sigmas = [   c/((self.Sigma+EPSILON)**i) * ( ((L_HP if hp else L)/fact(i)) ) for i in range(1, k+1) ]
-            scaled_target = approx_target_in_zk(sigmas, Num(stake)) + ((BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0)
+            headstart = (BASE_L_HP if hp else BASE_L) if self.slot < HEADSTART_AIRDROP else 0
+            scaled_target = approx_target_in_zk(sigmas, Num(stake)) + headstart
             return scaled_target
 
         if self.slot % EPOCH_LENGTH ==0 and self.slot > 0:

+ 1 - 1
script/research/lotterysim/core/lottery.py

@@ -106,7 +106,7 @@ class DarkfiTable:
             # fork resolved #
             #################
             rt_range.set_description('epoch: {}, fork: {} issuance {} DRK, acc: {}%, stake = {}%, sr: {}%, reward:{}, apr: {}%'.format(int(count/EPOCH_LENGTH), merge_length, round(self.Sigma,2), round(acc*100, 2), round(total_stake/self.Sigma*100 if self.Sigma>0 else 0,2), round(self.avg_stake_ratio()*100,2) , round(self.rewards[-1],2), round(self.avg_apr()*100,2)))
-            assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma)
+            #assert round(total_stake,1) <= round(self.Sigma,1), 'stake: {}, sigma: {}'.format(total_stake, self.Sigma)
             count+=1
         self.end_time=time.time()
         avg_reward = sum(self.rewards)/len(self.rewards)

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

@@ -10,8 +10,7 @@ from draw import draw
 os.system("rm log/*_feedback.hist; rm log/*_output.hist; rm log/darkie*.log")
 
 RUNNING_TIME = int(input("running time:"))
-NODES=1000
-PREMINT = 2.1*10**7
+
 
 if __name__ == "__main__":
     mu = PREMINT/NODES