lottery.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import matplotlib.pyplot as plt
  2. from tqdm import tqdm
  3. from darkie import *
  4. import time
  5. from datetime import timedelta
  6. from pid import PID
  7. class DarkfiTable:
  8. def __init__(self, airdrop, running_time, controller_type=CONTROLLER_TYPE_DISCRETE, kp=0, ki=0, kd=0, dt=1, target=1, kc=0, ti=0, td=0, ts=0, debug=False):
  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.pid = None
  15. self.pid = PID(kp=kp, ki=ki, kd=kd, dt=dt, target=target, Kc=kc, Ti=ti, Td=td, Ts=ts)
  16. self.controller_type=controller_type
  17. self.debug=debug
  18. def add_darkie(self, darkie):
  19. self.darkies+=[darkie]
  20. def background(self, rand_running_time=True, debug=False, hp=False):
  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.pid.pid_clipped(feedback, self.controller_type, 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, hp)
  38. self.darkies[i].run(hp)
  39. total_vesting_stake+=self.darkies[i].update_vesting(count)
  40. self.Sigma+=total_vesting_stake
  41. for i in range(len(self.darkies)):
  42. winners += self.darkies[i].won
  43. feedback = winners
  44. count+=1
  45. self.end_time=time.time()
  46. return self.pid.acc()
  47. def write(self):
  48. elapsed=self.end_time-self.start_time
  49. if self.debug:
  50. print("total time: {}, slot time: {}".format(str(timedelta(seconds=elapsed)), str(timedelta(seconds=elapsed/self.running_time))))
  51. self.pid.write()