lottery.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 = []
  18. def add_darkie(self, darkie):
  19. self.darkies+=[darkie]
  20. def background_with_apy(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. if count%EPOCH_LENGTH == 0:
  36. acc = self.secondary_pid.acc_percentage()
  37. reward = self.primary_pid.pid_clipped(acc, debug)
  38. self.rewards += [reward]
  39. #note! thread overhead is 10X slower than sequential node execution!
  40. for i in range(len(self.darkies)):
  41. self.darkies[i].set_sigma_feedback(self.Sigma, feedback, f, count, hp)
  42. self.darkies[i].run(self.rewards, hp)
  43. total_vesting_stake+=self.darkies[i].update_vesting()
  44. #print('reward: {}'.format(rewards[-1]))
  45. for i in range(len(self.darkies)):
  46. winners += self.darkies[i].won
  47. self.darkies[i].update_stake(self.rewards[-1])
  48. ###
  49. feedback = winners
  50. if winners==1:
  51. if count >= ERC20DRK:
  52. self.Sigma += 1
  53. for i in range(len(self.darkies)):
  54. self.darkies[i].finalize_stake()
  55. count+=1
  56. self.end_time=time.time()
  57. avg_reward = sum(self.rewards)/len(self.rewards)
  58. stake_ratio = self.avg_stake_ratio()
  59. avg_apy = self.avg_apy()
  60. avg_apr = self.avg_apr()
  61. #print('apy: {}, staked_ratio: {}'.format(avg_apy, stake_ratio))
  62. return self.secondary_pid.acc(), avg_apy, avg_reward, stake_ratio, avg_apr
  63. def avg_apy(self):
  64. return Num(sum([darkie.apy_scaled_to_runningtime(self.rewards) for darkie in self.darkies])/len(self.darkies))
  65. def avg_apr(self):
  66. return Num(sum([darkie.apr_scaled_to_runningtime() for darkie in self.darkies])/len(self.darkies))
  67. def avg_stake_ratio(self):
  68. return sum([darkie.staked_tokens_ratio() for darkie in self.darkies])/len(self.darkies)
  69. def write(self):
  70. elapsed=self.end_time-self.start_time
  71. for id, darkie in enumerate(self.darkies):
  72. darkie.write(id)
  73. if self.debug:
  74. print("total time: {}, slot time: {}".format(str(timedelta(seconds=elapsed)), str(timedelta(seconds=elapsed/self.running_time))))
  75. self.secondary_pid.write()
  76. with open('log/rewards.log', 'w+') as f:
  77. buff = ','.join([str(i) for i in self.rewards])
  78. f.write(buff)