secondary_takahashi_auto_crawler.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. KC_STEP=0.1
  10. KC_SEARCH=-0.5129999999999987
  11. TD_STEP=0.01
  12. TD_SEARCH=0.2690000000000005
  13. TI_STEP=0.01
  14. TI_SEARCH=0.004000000000058401
  15. TS_STEP=0.01
  16. TS_SEARCH=-1.4560000000001243
  17. EPSILON=0.0001
  18. RUNNING_TIME=1000
  19. NODES=1000
  20. highest_acc = 0
  21. KC='KC'
  22. TI='TI'
  23. TD='TD'
  24. TS='TS'
  25. KC_RANGE_MULTIPLIER = 2
  26. TI_RANGE_MULTIPLIER = 2
  27. TD_RANGE_MULTIPLIER = 2
  28. TS_RANGE_MULTIPLIER = 2
  29. highest_gain = (KC_SEARCH, TI_SEARCH, TD_SEARCH, TS_SEARCH)
  30. parser = ArgumentParser()
  31. parser.add_argument('-p', '--high-precision', action='store_true')
  32. parser.add_argument('-r', '--randomize-nodes', action='store_false')
  33. parser.add_argument('-t', '--rand-running-time', action='store_false')
  34. parser.add_argument('-d', '--debug', action='store_false')
  35. args = parser.parse_args()
  36. high_precision = args.high_precision
  37. randomize_nodes = args.randomize_nodes
  38. rand_running_time = args.rand_running_time
  39. debug = args.debug
  40. def experiment(controller_type=CONTROLLER_TYPE_TAKAHASHI, kp=0, ki=0, kd=0, kc=0, ti=0, td=0, ts=0, distribution=[], hp=False):
  41. dt = DarkfiTable(ERC20DRK, RUNNING_TIME, controller_type, kp=kp, ki=ki, kd=kd, kc=kc, td=td, ti=ti, ts=ts)
  42. RND_NODES = random.randint(5, NODES) if randomize_nodes else NODES
  43. for idx in range(0,RND_NODES):
  44. darkie = Darkie(distribution[idx], strategy=SigmoidStrategy(EPOCH_LENGTH))
  45. dt.add_darkie(darkie)
  46. acc, apy, reward, stake_ratio, apr = dt.background(rand_running_time, hp)
  47. return acc
  48. def multi_trial_exp(kc, td, ti, ts, distribution = [], hp=False):
  49. global highest_acc
  50. global highest_gain
  51. new_record = False
  52. accs = []
  53. for i in range(0, AVG_LEN):
  54. acc = experiment(CONTROLLER_TYPE_DISCRETE, kc=kc, ti=ti, td=td, ts=ts, distribution=distribution, hp=hp)
  55. accs += [acc]
  56. avg_acc = sum(accs)/float(AVG_LEN)
  57. buff = 'accuracy:{}, kc: {}, td:{}, ti:{}, ts:{}'.format(avg_acc, kc, td, ti, ts)
  58. if avg_acc > 0:
  59. gain = (kc, td, ti, ts)
  60. acc_gain = (avg_acc, gain)
  61. if avg_acc > highest_acc:
  62. new_record = True
  63. highest_acc = avg_acc
  64. highest_gain = gain
  65. with open('log'+os.sep+"highest_gain_takahashi.txt", 'w') as f:
  66. f.write(buff)
  67. return buff, new_record
  68. SHIFTING = 0.05
  69. def crawler(crawl, range_multiplier, step=0.1):
  70. start = None
  71. if crawl==KC:
  72. start = highest_gain[0]
  73. elif crawl==TI:
  74. start = highest_gain[1]
  75. elif crawl==TD:
  76. start = highest_gain[2]
  77. elif crawl==TS:
  78. start = highest_gain[3]
  79. range_start = (start*range_multiplier if start <=0 else -1*start)
  80. range_end = (-1*start if start<=0 else range_multiplier*start)
  81. # if number of steps under 10 step resize the step to 50
  82. while (range_end-range_start)/step < 10:
  83. range_start -= SHIFTING
  84. range_end += SHIFTING
  85. step /= 10
  86. crawl_range = np.arange(range_start, range_end, step)
  87. np.random.shuffle(crawl_range)
  88. crawl_range = tqdm(crawl_range)
  89. distribution = [random.random()*ERC20DRK*0.0001 for i in range(NODES)]
  90. for i in crawl_range:
  91. kc = i if crawl==KC else highest_gain[0]
  92. ti = i if crawl==TI else highest_gain[1]
  93. td = i if crawl==TD else highest_gain[2]
  94. ts = i if crawl==TS else highest_gain[3]
  95. buff, new_record = multi_trial_exp(kc, td, ti, ts, distribution, hp=high_precision)
  96. crawl_range.set_description('highest:{} / {}'.format(highest_acc, buff))
  97. if new_record:
  98. break
  99. while True:
  100. prev_highest_gain = highest_gain
  101. # kc crawl
  102. crawler(KC, KC_RANGE_MULTIPLIER, KC_STEP)
  103. if highest_gain[0] == prev_highest_gain[0]:
  104. KC_RANGE_MULTIPLIER+=1
  105. KC_STEP/=10
  106. else:
  107. start = highest_gain[0]
  108. range_start = (start*KC_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  109. range_end = (-1*start if start<=0 else KC_RANGE_MULTIPLIER*start) + SHIFTING
  110. while (range_end - range_start)/KC_STEP >500:
  111. if KC_STEP < 0.1:
  112. KC_STEP*=10
  113. KC_RANGE_MULTIPLIER-=1
  114. #TODO (res) shouldn't the range also shrink?
  115. # not always true.
  116. # how to distinguish between thrinking range, and large step?
  117. # good strategy is step shoudn't > 0.1
  118. # range also should be > 0.8
  119. # what about range multiplier?
  120. # td crawl
  121. crawler(TD, TD_RANGE_MULTIPLIER, TD_STEP)
  122. if highest_gain[2] == prev_highest_gain[2]:
  123. TD_RANGE_MULTIPLIER+=1
  124. TD_STEP/=10
  125. else:
  126. start = highest_gain[2]
  127. range_start = (start*TD_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  128. range_end = (-1*start if start<=0 else TD_RANGE_MULTIPLIER*start) + SHIFTING
  129. while (range_end - range_start)/TD_STEP >500:
  130. if TD_STEP < 0.1:
  131. TD_STEP*=10
  132. TD_RANGE_MULTIPLIER-=1
  133. # ti crawl
  134. crawler(TI, TI_RANGE_MULTIPLIER, TI_STEP)
  135. if highest_gain[1] == prev_highest_gain[1]:
  136. TI_RANGE_MULTIPLIER+=1
  137. TI_STEP/=10
  138. else:
  139. start = highest_gain[1]
  140. range_start = (start*TI_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  141. range_end = (-1*start if start<=0 else TI_RANGE_MULTIPLIER*start) + SHIFTING
  142. while (range_end - range_start)/TI_STEP >500:
  143. if TP_STEP < 0.3:
  144. TI_STEP*=10
  145. TI_RANGE_MULTIPLIER-=1
  146. # tS crawl
  147. crawler(TS, TS_RANGE_MULTIPLIER, TS_STEP)
  148. if highest_gain[2] == prev_highest_gain[2]:
  149. TS_RANGE_MULTIPLIER+=1
  150. TS_STEP/=10
  151. else:
  152. start = highest_gain[2]
  153. range_start = (start*TS_RANGE_MULTIPLIER if start <=0 else -1*start) - SHIFTING
  154. range_end = (-1*start if start<=0 else TS_RANGE_MULTIPLIER*start) + SHIFTING
  155. while (range_end - range_start)/TS_STEP >500:
  156. if TS_STEP < 0.1:
  157. TS_STEP*=10
  158. TS_RANGE_MULTIPLIER-=1