primary_discrete_auto_crawler_pi.py 5.9 KB

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