lottery.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import matplotlib.pyplot as plt
  2. from tqdm import tqdm
  3. import time
  4. from datetime import timedelta
  5. from core.darkie import *
  6. from pid.cascade import *
  7. class DarkfiTable:
  8. def __init__(self, airdrop, running_time, controller_type=CONTROLLER_TYPE_DISCRETE, kp=0, ki=0, kd=0, dt=1, kc=0, ti=0, td=0, ts=0, debug=False, r_kp=0, r_ki=0, r_kd=0):
  9. self.Sigma=airdrop
  10. self.darkies = []
  11. self.running_time=running_time
  12. self.start_time=None
  13. self.end_time=None
  14. self.secondary_pid = SecondaryDiscretePID(kp=kp, ki=ki, kd=kd) if controller_type==CONTROLLER_TYPE_DISCRETE else SecondaryTakahashiPID(kc=kc, ti=ti, td=td, ts=ts)
  15. self.primary_pid = PrimaryDiscretePID(kp=r_kp, ki=r_ki, kd=r_kd) if controller_type==CONTROLLER_TYPE_DISCRETE else PrimaryTakahashiPID(kc=kc, ti=ti, td=td, ts=ts)
  16. self.debug=debug
  17. self.rewards = [0]
  18. def add_darkie(self, darkie):
  19. self.darkies+=[darkie]
  20. def background(self, rand_running_time=True, debug=False, hp=True):
  21. self.debug=debug
  22. self.start_time=time.time()
  23. feedback=0 # number leads in previous slot
  24. count = 0
  25. # random running time
  26. rand_running_time = random.randint(1,self.running_time) if rand_running_time else self.running_time
  27. self.running_time = rand_running_time
  28. #if rand_running_time and debug:
  29. #print("random running time: {}".format(self.running_time))
  30. #print('running time: {}'.format(self.running_time))
  31. while count < self.running_time:
  32. winners=0
  33. total_vesting_stake = 0
  34. f = self.secondary_pid.pid_clipped(float(feedback), debug)
  35. #note! thread overhead is 10X slower than sequential node execution!
  36. for i in range(len(self.darkies)):
  37. self.darkies[i].set_sigma_feedback(self.Sigma, feedback, f, count, hp)
  38. self.darkies[i].run(self.rewards, hp)
  39. total_vesting_stake+=self.darkies[i].update_vesting()
  40. for i in range(len(self.darkies)):
  41. winners += self.darkies[i].won
  42. print('reward: {}'.format(self.rewards[-1]))
  43. self.darkies[i].update_stake(self.rewards[-1])
  44. if count%EPOCH_LENGTH == 0:
  45. acc = self.secondary_pid.acc()
  46. reward = self.primary_pid.pid_clipped(float(self.avg_apy()), debug)
  47. self.rewards += [reward]
  48. feedback = winners
  49. if winners==1:
  50. if count >= ERC20DRK:
  51. self.Sigma += 1
  52. for i in range(len(self.darkies)):
  53. self.darkies[i].finalize_stake()
  54. count+=1
  55. self.end_time=time.time()
  56. return self.secondary_pid.acc()
  57. def background_with_apy(self, rand_running_time=True, debug=False, hp=True):
  58. self.debug=debug
  59. self.start_time=time.time()
  60. feedback=0 # number leads in previous slot
  61. count = 0
  62. # random running time
  63. rand_running_time = random.randint(1,self.running_time) if rand_running_time else self.running_time
  64. self.running_time = rand_running_time
  65. #if rand_running_time and debug:
  66. #print("random running time: {}".format(self.running_time))
  67. #print('running time: {}'.format(self.running_time))
  68. while count < self.running_time:
  69. winners=0
  70. total_vesting_stake = 0
  71. f = self.secondary_pid.pid_clipped(float(feedback), debug)
  72. #note! thread overhead is 10X slower than sequential node execution!
  73. for i in range(len(self.darkies)):
  74. self.darkies[i].set_sigma_feedback(self.Sigma, feedback, f, count, hp)
  75. self.darkies[i].run(self.rewards, hp)
  76. total_vesting_stake+=self.darkies[i].update_vesting()
  77. #print('reward: {}'.format(rewards[-1]))
  78. for i in range(len(self.darkies)):
  79. winners += self.darkies[i].won
  80. self.darkies[i].update_stake(self.rewards[-1])
  81. ###
  82. if count%EPOCH_LENGTH == 0 and count > EPOCH_LENGTH:
  83. acc = self.secondary_pid.acc_percentage()
  84. reward = self.primary_pid.pid_clipped(float(self.avg_stake_ratio()), debug)
  85. self.rewards += [reward]
  86. feedback = winners
  87. if winners==1:
  88. if count >= ERC20DRK:
  89. self.Sigma += 1
  90. for i in range(len(self.darkies)):
  91. self.darkies[i].finalize_stake()
  92. count+=1
  93. self.end_time=time.time()
  94. avg_reward = sum(self.rewards)/len(self.rewards)
  95. stake_ratio = self.avg_stake_ratio()
  96. avg_apy = self.avg_apy()
  97. #print('apy: {}, staked_ratio: {}'.format(avg_apy, stake_ratio))
  98. return self.secondary_pid.acc(), avg_apy, avg_reward, stake_ratio
  99. def avg_apy(self):
  100. return sum([darkie.apy_percentage(self.rewards) for darkie in self.darkies])/len(self.darkies)
  101. def avg_stake_ratio(self):
  102. return sum([darkie.staked_tokens_ratio() for darkie in self.darkies])/len(self.darkies)*100
  103. def write(self):
  104. elapsed=self.end_time-self.start_time
  105. if self.debug:
  106. print("total time: {}, slot time: {}".format(str(timedelta(seconds=elapsed)), str(timedelta(seconds=elapsed/self.running_time))))
  107. self.secondary_pid.write()