primary_discrete_auto_crawler.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. from argparse import ArgumentParser
  2. from core.lottery import DarkfiTable
  3. from core.utils import *
  4. from core.darkie import Darkie
  5. from tqdm import tqdm
  6. from core.strategy import SigmoidStrategy
  7. import os
  8. AVG_LEN = 5
  9. KP_STEP=0.5
  10. KP_SEARCH=0.01
  11. KI_STEP=0.5
  12. KI_SEARCH=-0.5
  13. KD_STEP=0.5
  14. KD_SEARCH=-0.5
  15. RUNNING_TIME=1000
  16. NODES = 100
  17. SHIFTING = 0.05
  18. highest_apy = 0
  19. highest_acc = 0
  20. highest_staked = 0
  21. KP='kp'
  22. KI='ki'
  23. KD='kd'
  24. KP_RANGE_MULTIPLIER = 2
  25. KI_RANGE_MULTIPLIER = 2
  26. KD_RANGE_MULTIPLIER = 2
  27. highest_gain = (KP_SEARCH, KI_SEARCH, KD_SEARCH)
  28. parser = ArgumentParser()
  29. parser.add_argument('-p', '--high-precision', action='store_true')
  30. parser.add_argument('-r', '--randomize-nodes', action='store_false')
  31. parser.add_argument('-t', '--rand-running-time', action='store_false')
  32. parser.add_argument('-d', '--debug', action='store_false')
  33. args = parser.parse_args()
  34. high_precision = args.high_precision
  35. randomize_nodes = args.randomize_nodes
  36. rand_running_time = args.rand_running_time
  37. debug = args.debug
  38. def experiment(controller_type=CONTROLLER_TYPE_DISCRETE, rkp=0, rki=0, rkd=0, distribution=[], hp=True):
  39. dt = DarkfiTable(ERC20DRK, RUNNING_TIME, controller_type, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0.03840000000000491, r_kp=rkp, r_ki=rki, r_kd=rkd)
  40. RND_NODES = random.randint(5, NODES) if randomize_nodes else NODES
  41. for idx in range(0,RND_NODES):
  42. darkie = Darkie(distribution[idx])
  43. dt.add_darkie(darkie)
  44. acc, apy, reward, stake_ratio, apr = dt.background_with_apy(rand_running_time, hp)
  45. return acc, apy, reward, stake_ratio, apr
  46. def multi_trial_exp(kp, ki, kd, distribution = [], hp=True):
  47. global highest_apy
  48. global highest_acc
  49. global highest_staked
  50. global highest_gain
  51. new_record=False
  52. accs = []
  53. apys = []
  54. rewards = []
  55. stakes_ratios = []
  56. aprs = []
  57. for i in range(0, AVG_LEN):
  58. acc, apy, reward, stake_ratio, apr = experiment(CONTROLLER_TYPE_DISCRETE, rkp=kp, rki=ki, rkd=kd, distribution=distribution, hp=hp)
  59. accs += [acc]
  60. apys += [apy]
  61. rewards += [reward]
  62. aprs += [apr]
  63. stakes_ratios += [stake_ratio]
  64. avg_acc = float(sum(accs))/len(accs)
  65. avg_apy = float(sum(apys))/len(apys)
  66. avg_reward = float(sum(rewards))/len(rewards)
  67. avg_staked = float(sum(stakes_ratios))/len(stakes_ratios)
  68. avg_apr = float(sum(aprs))/len(aprs)
  69. buff = 'avg(acc): {}, avg(apy): {}, avg(apr): {}, avg(reward): {}, avg(stake ratio): {}, kp: {}, ki:{}, kd:{}'.format(avg_acc, avg_apy, avg_apr, avg_reward, avg_staked, kp, ki, kd)
  70. if avg_apy > 0:
  71. gain = (kp, ki, kd)
  72. acc_gain = (avg_apy, gain)
  73. if avg_acc > highest_acc:
  74. #if avg_apy > highest_apy and avg_acc > highest_acc and avg_staked > highest_staked:
  75. new_record = True
  76. highest_apy = avg_apy
  77. highest_acc = avg_acc
  78. highest_staked = avg_staked
  79. highest_gain = (kp, ki, kd)
  80. with open('log'+os.sep+"highest_gain.txt", 'w') as f:
  81. f.write(buff)
  82. return buff, new_record
  83. def crawler(crawl, range_multiplier, step=0.1):
  84. start = None
  85. if crawl==KP:
  86. start = highest_gain[0]
  87. elif crawl==KI:
  88. start = highest_gain[1]
  89. elif crawl==KD:
  90. start = highest_gain[2]
  91. range_start = (start*range_multiplier if start <=0 else -1*start)
  92. range_end = (-1*start if start<=0 else range_multiplier*start)
  93. # if number of steps under 10 step resize the step to 50
  94. while (range_end-range_start)/step < 10:
  95. range_start -= SHIFTING
  96. range_end += SHIFTING
  97. step /= 10
  98. while True:
  99. try:
  100. crawl_range = np.arange(range_start, range_end, step)
  101. break
  102. except Exception as e:
  103. print('start: {}, end: {}, step: {}, exp: {}'.format(range_start, rang_end, step, e))
  104. step*=10
  105. np.random.shuffle(crawl_range)
  106. crawl_range = tqdm(crawl_range)
  107. distribution = [random.gauss(ERC20DRK/NODES, ERC20DRK/NODES*0.1) for i in range(NODES)]
  108. for i in crawl_range:
  109. kp = i if crawl==KP else highest_gain[0]
  110. ki = i if crawl==KI else highest_gain[1]
  111. kd = i if crawl==KD else highest_gain[2]
  112. buff, new_record = multi_trial_exp(kp, ki, kd, distribution, hp=high_precision)
  113. crawl_range.set_description('highest:{} / {}'.format(highest_acc, buff))
  114. if new_record:
  115. break
  116. while True:
  117. prev_highest_gain = highest_gain
  118. # kp crawl
  119. crawler(KP, KP_RANGE_MULTIPLIER, KP_STEP)
  120. if highest_gain[0] == prev_highest_gain[0]:
  121. KP_RANGE_MULTIPLIER+=1
  122. KP_STEP/=10
  123. else:
  124. start = highest_gain[0]
  125. range_start = (start*KP_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  126. range_end = (-1*start if start<=0 else KP_RANGE_MULTIPLIER*start) + SHIFTING
  127. while (range_end - range_start)/KP_STEP >500:
  128. #if KP_STEP < 0.1:
  129. KP_STEP*=2
  130. KP_RANGE_MULTIPLIER-=1
  131. #TODO (res) shouldn't the range also shrink?
  132. # not always true.
  133. # how to distinguish between thrinking range, and large step?
  134. # good strategy is step shoudn't > 0.1
  135. # range also should be > 0.8
  136. # what about range multiplier?
  137. # ki crawl
  138. crawler(KI, KI_RANGE_MULTIPLIER, KI_STEP)
  139. if highest_gain[1] == prev_highest_gain[1]:
  140. KI_RANGE_MULTIPLIER+=1
  141. KI_STEP/=10
  142. else:
  143. start = highest_gain[1]
  144. range_start = (start*KI_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  145. range_end = (-1*start if start<=0 else KI_RANGE_MULTIPLIER*start) + SHIFTING
  146. while (range_end - range_start)/KI_STEP >500:
  147. #print('range_end: {}, range_start: {}, ki_step: {}'.format(range_end, range_start, KI_STEP))
  148. #if KP_STEP < 1:
  149. KI_STEP*=2
  150. KI_RANGE_MULTIPLIER-=1
  151. # kd crawl
  152. crawler(KD, KD_RANGE_MULTIPLIER, KD_STEP)
  153. if highest_gain[2] == prev_highest_gain[2]:
  154. KD_RANGE_MULTIPLIER+=1
  155. KD_STEP/=10
  156. else:
  157. start = highest_gain[2]
  158. range_start = (start*KD_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  159. range_end = (-1*start if start<=0 else KD_RANGE_MULTIPLIER*start) + SHIFTING
  160. while (range_end - range_start)/KD_STEP >500:
  161. #if KD_STEP < 0.1:
  162. KD_STEP*=2
  163. KD_RANGE_MULTIPLIER-=1