Просмотр исходного кода

[research/lotterysim] fixed a bug in pid api

police 3 лет назад
Родитель
Сommit
7c43d712e7

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

@@ -16,9 +16,9 @@ REWARD_MAX = 1000
 
 SLOT = 90
 ONE_YEAR = 365.25*24*60*60/SLOT
-TARGET_APY = Num(0.5)
+TARGET_APY = Num(0.1)
 
-PRIMARY_REWARD_TARGET = 70 # ratio of staked tokens
+PRIMARY_REWARD_TARGET = 0.7 # ratio of staked tokens
 SECONDARY_LEAD_TARGET = 1 #number of lead per slot
 
 EPSILON = 1

+ 1 - 2
script/research/lotterysim/core/darkie.py

@@ -33,9 +33,8 @@ class Darkie():
         avg_apy = 0
         for idx, reward in enumerate(rewards):
             #print('slot: {}, idx: {} of {}, staked tokens: {}, initial stake: {}'.format(self.slot, idx, len(rewards), len(self.strategy.staked_tokens_ratio), len(self.initial_stake)))
-            current_epoch_staked_tokens = Num(self.strategy.staked_tokens_ratio[idx-1]) * Num(self.initial_stake[idx])
+            current_epoch_staked_tokens = Num(self.strategy.staked_tokens_ratio[idx-1]) * Num(self.initial_stake[idx-1])
             avg_apy += (Num(reward) / current_epoch_staked_tokens) if current_epoch_staked_tokens!=0 else 0
-        #return avg_apy/len(rewards) if len(rewards)>0 else 0
         return avg_apy
 
     def apr_scaled_to_runningtime(self):

+ 2 - 1
script/research/lotterysim/core/lottery.py

@@ -48,6 +48,7 @@ class DarkfiTable:
                 self.darkies[i].run(self.rewards, hp)
                 total_vesting_stake+=self.darkies[i].update_vesting()
 
+
             #print('reward: {}'.format(rewards[-1]))
             for i in range(len(self.darkies)):
                 winners += self.darkies[i].won
@@ -77,7 +78,7 @@ class DarkfiTable:
         return sum([darkie.apr_scaled_to_runningtime() for darkie in self.darkies])/len(self.darkies) * (ONE_YEAR/self.running_time) * 100
 
     def avg_stake_ratio(self):
-        return sum([darkie.staked_tokens_ratio() for darkie in self.darkies])/len(self.darkies)*100
+        return sum([darkie.staked_tokens_ratio() for darkie in self.darkies])/len(self.darkies)
 
     def write(self):
         elapsed=self.end_time-self.start_time

+ 1 - 1
script/research/lotterysim/log/f_feedback.hist

@@ -1 +1 @@
-0,0,0.0,0.0,0.0,0.0,0.0,1.0,2.0,0.0,2.0,100.0,1.0,8.0,100.0,5.0,6.0,100.0,3.0,8.0,100.0,6.0,5.0,100.0,6.0,4.0,100.0,8.0,5.0,100.0,3.0,5.0,100.0,8.0,7.0,100.0,4.0,4.0,100.0,7.0,5.0,100.0,4.0,3.0,100.0,7.0,9.0,100.0,6.0,1.0,100.0,3.0,4.0,100.0,3.0,6.0,100.0,6.0,7.0,100.0,9.0,6.0,100.0,9.0,5.0,100.0,8.0,5.0,100.0,9.0,7.0,100.0,8.0,6.0,100.0,5.0,7.0,100.0,5.0,6.0,100.0,9.0,5.0,100.0,6.0,9.0,100.0,4.0,7.0,100.0,6.0,6.0,100.0,8.0,7.0,100.0,8.0,7.0,100.0,8.0,6.0,100.0,
+0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,

+ 1 - 1
script/research/lotterysim/log/f_output.hist

@@ -1 +1 @@
-0,0.7290000000000001,0.6561,0.5904900000000001,0.531441,0.4782969000000001,0.9999,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,0.9999,1,0.9999,
+0,0.7290000000000001,0.6561,0.5904900000000001,0.531441,0.4782969000000001,0.4304672100000001,0.3874204890000001,0.3486784401000001,0.3766784401000664,0.34687843974618293,0.4218784393923757,0.4584784390385635,0.49507843868475127,0.5316784383309391,0.568278437977127,0.6048784376233148,0.6414784372695027,0.6780784369156906,0.3486784401000001,0.31381059609000006,0.2824295364810001,0.2541865828329001,0.2287679245496101,0.20589113209464907,0.18530201888518416,0.16677181699666577,0.15009463529699918,0.13508517176729928,0.12157665459056935,0.10941898913151242,0.09847709021836118,0.12647709021842754,0.09667708986454407,0.1716770895107368,0.2082770891569246,0.2448770888031124,0.28147708844930014,0.3180770880954879,0.35467708774167567,0.39127708738786343,0.4278770870340512,0.3486784401000001,0.31381059609000006,0.2824295364810001,0.2541865828329001,0.2287679245496101,0.20589113209464907,0.18530201888518416,0.16677181699666577,0.15009463529699918,0.13508517176729928,0.12157665459056935,0.10941898913151242,0.09847709021836118,0.08862938119652507,0.07976644307687256,0.0717897987691853,0.06461081889226677,0.058149737003040096,0.05233476330273609,0.047101286972462485,0.04239115827521624,0.038152042447694615,0.03433683820292515,0.030903154382632636,0.027812838944369374,0.025031555049932437,0.022528399544939195,0.020275559590445275,0.01824800363140075,0.016423203268260675,0.014780882941434608,0.013302794647291146,0.011972515182562033,0.01077526366430583,0.009697737297875247,0.008727963568087723,0.00785516721127895,0.007069650490151055,0.00636268544113595,0.005726416897022355,0.00515377520732012,0.004638397686588108,0.004174557917929297,0.0037571021261363674,0.0033813919135227306,0.0030432527221704577,0.002738927449953412,0.002465034704958071,0.002218531234462264,0.0019966781110160375,0.001797010299914434,0.0016173092699229906,0.0014555783429306916,0.0013100205086376223,0.0011790184577738603,0.001061116611996474,0.0009550049507968268,0.0008595044557171441,0.0007735540101454297,

+ 1 - 1
script/research/lotterysim/log/highest_gain.txt

@@ -1 +1 @@
-avg(acc): 0.140228495669024, avg(apy): 40.57271508914573, avg(reward): 70.0, avg(stake ratio): 50.216539150462765, kp: -0.07000000000000003, ki:-0.3500000000000002, kd:-0.5
+avg(acc): 0.11957486631016043, avg(apy): 28322.80212232364, avg(apr): 0.015657109629920597, avg(reward): 0.7, avg(stake ratio): 0.6118475217775458, kp: -0.06999999999999895, ki:-3.2500000000000036, kd:0.3499999999999971

+ 2 - 2
script/research/lotterysim/pid/cascade.py

@@ -6,7 +6,7 @@ reward primary PID controller.
 '''
 class RPID(BasePID):
     def __init__(self, controller_type, kp=0, ki=0, kd=0, dt=1,  Kc=0, Ti=0, Td=0, Ts=0, debug=False):
-        BasePID.__init__(self, REWARD_MIN, REWARD_MAX, PRIMARY_REWARD_TARGET, controller_type, kp=kp, ki=ki, kd=kd, dt=dt,  Kc=Kc, Ti=Ti, Td=Td, Ts=Ts, debug=debug, type='reward', swap_error_fn=True)
+        BasePID.__init__(self, PRIMARY_REWARD_TARGET, REWARD_MIN, REWARD_MAX, controller_type, kp=kp, ki=ki, kd=kd, dt=dt,  Kc=Kc, Ti=Ti, Td=Td, Ts=Ts, debug=debug, type='reward', swap_error_fn=True)
 
 
 class PrimaryDiscretePID(RPID):
@@ -22,7 +22,7 @@ lead secondary PID controller
 '''
 class LeadPID(BasePID):
     def __init__(self, controller_type, kp=0, ki=0, kd=0, dt=1, Kc=0, Ti=0, Td=0, Ts=0, debug=False):
-        BasePID.__init__(self, F_MIN, F_MAX, SECONDARY_LEAD_TARGET, controller_type, kp=kp, ki=ki, kd=kd, dt=dt, Kc=Kc, Ti=Ti, Td=Td, Ts=Ts, debug=debug, type='f')
+        BasePID.__init__(self, SECONDARY_LEAD_TARGET, F_MIN, F_MAX,  controller_type, kp=kp, ki=ki, kd=kd, dt=dt, Kc=Kc, Ti=Ti, Td=Td, Ts=Ts, debug=debug, type='f')
 
 class SecondaryDiscretePID(LeadPID):
     def __init__(self, kp, ki, kd):

+ 1 - 0
script/research/lotterysim/pid/pid_base.py

@@ -68,6 +68,7 @@ class BasePID:
         else:
             pid_value = self.continuous_pid(feedback)
 
+        print('[{}-{}]'.format(self.clip_min, self.clip_max))
         if pid_value <= self.clip_min:
             pid_value = self.clip_min
         if pid_value >= self.clip_max:

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

@@ -8,17 +8,17 @@ import os
 
 AVG_LEN = 5
 
-KP_STEP=1
+KP_STEP=10
 KP_SEARCH=0.01
 
-KI_STEP=1
+KI_STEP=10
 KI_SEARCH=1#-154.52
 
-KD_STEP=1
+KD_STEP=10
 KD_SEARCH=-0.5
 
-RUNNING_TIME=1000
-NODES = 100
+RUNNING_TIME=100
+NODES = 5
 
 SHIFTING = 0.05
 
@@ -53,7 +53,7 @@ def experiment(controller_type=CONTROLLER_TYPE_DISCRETE, rkp=0, rki=0, rkd=0, di
         darkie = Darkie(distribution[idx])
         dt.add_darkie(darkie)
     acc, apy, reward, stake_ratio, apr = dt.background_with_apy(rand_running_time, hp)
-    return acc, apy, reward, stake_ratio
+    return acc, apy, reward, stake_ratio, apr
 
 def multi_trial_exp(kp, ki, kd, distribution = [], hp=True):
     global highest_apy
@@ -65,17 +65,20 @@ def multi_trial_exp(kp, ki, kd, distribution = [], hp=True):
     apys = []
     rewards = []
     stakes_ratios = []
+    aprs = []
     for i in range(0, AVG_LEN):
-        acc, apy, reward, stake_ratio = experiment(CONTROLLER_TYPE_DISCRETE, rkp=kp, rki=ki, rkd=kd, distribution=distribution, hp=hp)
+        acc, apy, reward, stake_ratio, apr = experiment(CONTROLLER_TYPE_DISCRETE, rkp=kp, rki=ki, rkd=kd, distribution=distribution, hp=hp)
         accs += [acc]
         apys += [apy]
         rewards += [reward]
+        aprs += [apr]
         stakes_ratios += [stake_ratio]
     avg_acc = float(sum(accs))/len(accs)
     avg_apy = float(sum(apys))/float(AVG_LEN)
     avg_reward = float(sum(rewards))/len(rewards)
     avg_staked = float(sum(stakes_ratios))/len(stakes_ratios)
-    buff = 'avg(acc): {}, avg(apy): {}, avg(reward): {}, avg(stake ratio): {}, kp: {}, ki:{}, kd:{}'.format(avg_acc, avg_apy, avg_reward, avg_staked, kp, ki, kd)
+    avg_apr = float(sum(aprs))/len(aprs)
+    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)
     if avg_apy > 0:
         gain = (kp, ki, kd)
         acc_gain = (avg_apy, gain)