Quellcode durchsuchen

[research/lotterysim] bug fixed with cascade control, round primary feedback precision to .2f

ertosns vor 3 Jahren
Ursprung
Commit
5f44e59bb1

+ 2 - 0
script/research/lotterysim/core/constants.py

@@ -33,3 +33,5 @@ F_MAX_HP = Num(F_MAX)
 EPSILON_HP = Num(EPSILON)
 REWARD_MIN_HP = Num(REWARD_MIN)
 REWARD_MAX_HP = Num(REWARD_MAX)
+
+ACC_WINDOW = 100

+ 3 - 3
script/research/lotterysim/core/lottery.py

@@ -42,12 +42,12 @@ class DarkfiTable:
             f = self.secondary_pid.pid_clipped(float(feedback), debug)
 
             if count%EPOCH_LENGTH == 0:
-                acc = self.secondary_pid.acc_percentage()
+                acc = self.secondary_pid.acc()
                 #staked_ratio = self.avg_stake_ratio()
                 reward = self.primary_pid.pid_clipped(acc, debug)
                 self.rewards += [reward]
 
-            rt_range.set_description('issuance {} DRK'.format(sum(self.rewards)))
+            rt_range.set_description('issuance {} DRK, acc: {}'.format(round(sum(self.rewards),2), round(acc,2)))
             #note! thread overhead is 10X slower than sequential node execution!
             for i in range(len(self.darkies)):
                 self.darkies[i].set_sigma_feedback(self.Sigma, feedback, f, count, hp)
@@ -95,7 +95,7 @@ class DarkfiTable:
         avg_apy = self.avg_apy()
         avg_apr = self.avg_apr()
         #print('apy: {}, staked_ratio: {}'.format(avg_apy, stake_ratio))
-        return self.secondary_pid.acc(), avg_apy, avg_reward, stake_ratio, avg_apr
+        return self.secondary_pid.acc_percentage(), avg_apy, avg_reward, stake_ratio, avg_apr
 
     def avg_apy(self):
         return Num(sum([darkie.apy_scaled_to_runningtime(self.rewards) for darkie in self.darkies])/len(self.darkies))

+ 2 - 1
script/research/lotterysim/discrete_instance.py

@@ -27,7 +27,8 @@ if __name__ == "__main__":
     for darkie in darkies:
         effective_airdrop+=darkie.stake
     print("network airdrop: {}, staked token: {}/{}% on {} nodes".format(airdrop, effective_airdrop, effective_airdrop/airdrop*100, len(darkies)))
-    dt = DarkfiTable(airdrop, RUNNING_TIME, CONTROLLER_TYPE_DISCRETE, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0.03840000000000491,  r_kp=-2.53, r_ki=29.5, r_kd=53.77)
+    #dt = DarkfiTable(airdrop, RUNNING_TIME, CONTROLLER_TYPE_DISCRETE, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0.03840000000000491,  r_kp=-2.53, r_ki=29.5, r_kd=53.77)
+    dt = DarkfiTable(airdrop, RUNNING_TIME, CONTROLLER_TYPE_DISCRETE, kp=-0.010399999999938556, ki=-0.0365999996461878, kd=0.03840000000000491,  r_kp=-0.63, r_ki=3.35, r_kd=-1.11)
     for darkie in darkies:
         dt.add_darkie(darkie)
     acc, avg_apy, avg_reward, stake_ratio, avg_apr = dt.background(rand_running_time=False)

BIN
script/research/lotterysim/img/apr_distribution.png


BIN
script/research/lotterysim/img/feedback_history_processed.png


BIN
script/research/lotterysim/img/output_history_processed.png


+ 4 - 3
script/research/lotterysim/pid/pid_base.py

@@ -121,8 +121,9 @@ class BasePID:
         self.write_feedback('log' + os.sep + self.type+feedback_hist_file)
         self.write_fval('log'+ os.sep + self.type+output_hist_file)
 
-    def acc(self):
-        return sum(np.array(self.feedback_hist)==self.target)/float(len(self.feedback_hist))
+    def acc(self, window=ACC_WINDOW):
+        windowed_hist = [round(hist, 2) for hist in self.feedback_hist][-1*window:]
+        return sum(np.array(windowed_hist)==self.target)/float(len(windowed_hist))
 
     def acc_percentage(self):
-        return self.acc() * 100
+        return self.acc(window=0) * 100

+ 8 - 8
script/research/lotterysim/primary_discrete_auto_crawler.py

@@ -8,17 +8,17 @@ from core.strategy import random_strategy
 
 AVG_LEN = 10
 
-KP_STEP=10
-KP_SEARCH=0.47
+KP_STEP=5
+KP_SEARCH=0.92
 
-KI_STEP=10
-KI_SEARCH=5.3
+KI_STEP=5
+KI_SEARCH=1.6
 
-KD_STEP=10
-KD_SEARCH=70.77
+KD_STEP=5
+KD_SEARCH=0.1
 
-RUNNING_TIME=1000
-NODES = 10
+RUNNING_TIME=5000
+NODES = 100
 
 SHIFTING = 0.05