1@startuml 2title "Torflow measurements scaling." 3 4' Own previous bwfile 5:prev_votes = VoteSet(); 6note right 7initialize measurements from previous Bandwidth File 8end note 9' while (for n in nodes.itervalues()?) 10' if (n.idhex in prev_votes.vote_map and n.idhex in prev_consensus) then (yes) 11' endif 12' endwhile 13:tot_net_bw = 0; 14:; 15note right 16 for every measurement 17end note 18while (for n in nodes.itervalues()?) 19 ' Anything not set is initialized to 0 or None 20 :n.fbw_ratio = n.filt_bw/true_filt_avg[n.node_class()]; 21 :n.sbw_ratio = n.strm_bw/true_strm_avg[n.node_class()]; 22 :n.use_bw = n.desc_bw; 23 :n.pid_error = ...; 24 note right 25 if n.sbw_ratio > n.fbw_ratio: 26 #assert cs_junk.use_best_ratio == True 27 n.pid_error = (n.strm_bw - true_strm_avg[n.node_class()]) 28 / true_strm_avg[n.node_class()] 29 else: 30 n.pid_error = (n.filt_bw - true_filt_avg[n.node_class()]) 31 / true_filt_avg[n.node_class()] 32 0 <= n.pid_error <= 500.0 33 end note 34 if (n.idhex in prev_votes.vote_map?) then (yes) 35 :; 36 note right 37 if n.measured_at > 38 prev_votes.vote_map[n.idhex].measured_at; 39 end note 40 if (measurement newer?) then (yes) 41 :; 42 note right 43 if n.idhex in prev_consensus 44 and ("Guard" in prev_consensus[n.idhex].flags 45 and "Exit" not in prev_consensus[n.idhex].flags) 46 end note 47 if (in prev_consensus, \nis guard \nbut not exit?) then (yes) 48 :; 49 note right 50 if n.idhex not in prev_votes.vote_map 51 or n.measured_at - prev_votes.vote_map[n.idhex].measured_at 52 > cs_junk.guard_sample_rate: 53 # cs_jung.guard_sample_rate = 2*7*24*60*60 # 2wks 54 end note 55 if (diff bigger than 2 weeks) then (yes) 56 :; 57 note right 58 # full feedback 59 n.new_bw = n.get_pid_bw(prev_votes.vote_map[n.idhex], 60 cs_junk.K_p, 61 cs_junk.K_i, 62 cs_junk.K_d, 63 cs_junk.K_i_decay) 64 = n.get_pid_bw(prev_votes.vote_map[n.idhex], 65 1.0, 0, 0, 0) 66 end note 67 :self.prev_error = prev_vote.pid_error 68 self.pid_bw = self.use_bw 69 + self.use_bw * self.pid_error 70 # + self.desc_bw * self.pid_error 71 self.pid_error_sum = 0 + self.pid_error 72 n.new_bw = self.pid_bw; 73 else (no) 74 :; 75 note right 76 \# Use new measurement but not feedback 77 n.copy_vote(prev_vote.vote_map[n.idhex])); 78 n.new_bw = n.get_pid_bw(prev_votes.vote_map[n.idhex], 79 cs_junk.K_p, 80 cs_junk.K_i, 81 cs_junk.K_d, 82 0.0, False) 83 end note 84 :\# self.new_bw = vote.bw * 1000 85 self.pid_bw = vote.pid_bw 86 self.pid_error_sum = vote.pid_error_sum 87 self.pid_delta = vote.pid_delta 88 89 n.new_bw = self.use_bw + self.use_bw * self_pid_error 90 91 n.measured_at = prev_vote.measured_at 92 n.pid_error = prev_vote.pid_error; 93 endif 94 ' No (G and noE) 95 else (no) 96 if (in prev_consensus, \nis guard and exit) then (yes) 97 :; 98 note right 99 n.new_bw = n.get_pid_bw(prev_votes.vote_map[n.idhex], 100 cs_junk.K_p*weight, 101 cs_junk.K_i*weight, 102 cs_junk.K_d*weight, 103 cs_junk.K_i_decay) 104 n.new_bw = n.get_pid_bw(prev_votes.vote_map[n.idhex], 105 1.0*1.0, 0, 0, 0) 106 \# so, same code as for when diff is bigger than 2 weeks 107 end note 108 :self.prev_error = prev_vote.pid_error 109 self.pid_bw = self.use_bw 110 + self.use_bw * self.pid_error 111 # + self.desc_bw * self.pid_error 112 self.pid_error_sum = 0 + self.pid_error 113 n.new_bw = self.pid_bw; 114 else (no) 115 :; 116 note right 117 \#again, same code 118 end note 119 :self.prev_error = prev_vote.pid_error 120 self.pid_bw = self.use_bw 121 + self.use_bw * self.pid_error 122 # + self.desc_bw * self.pid_error 123 self.pid_error_sum = 0 + self.pid_error 124 n.new_bw = self.pid_bw; 125 endif 126 endif 127 ' No new measurement (in prev bwfile, but havent check consensus), do not vote this round 128 else (no) 129 :; 130 note right 131 \# Reset values. Don't vote/sample this measurement round. 132 \# is in the previous bwfile, but haven't check the consensus 133 n.revert_to_vote(prev_votes.vote_map[n.idhex]) 134 \# which calls again self.copy_vote(vote) 135 end note 136 :self.new_bw = prev_vote.bw*1000 137 self.pid_bw = prev_vote.pid_bw 138 self.pid_error_sum = prev_vote.pid_error_sum 139 self.pid_delta = prev_vote.pid_delta 140 141 self.pid_error = vote.pid_error 142 self.measured_at = vote.measured_at; 143 144 endif 145 ' Not in previous bwfile, usually only with authoritites, possibly not in conensus? 146 else (no) 147 ' :n.new_bw = n.use_bw + cs_junk.K_p*n.use_bw*n.pid_error = \n 148 :n.new_bw = n.use_bw + n.use_bw * n.pid_error 149 n.pid_error_sum = n.pid_error 150 n.pid_bw = n.new_bw; 151 endif 152 ' :n.change = n.new_bw - n.desc_bw; 153 154 ' For capping later 155 if (n.idhex in prev_consensus) then (yes) 156 if (prev_consensus[n.idhex].bandwidth != None) then (yes) 157 :prev_consensus[n.idhex].measured = True; 158 :tot_net_bw += n.new_bw; 159 endif 160 endif 161endwhile 162while (for n in nodes.itervalues()?) 163 :cap...; 164endwhile 165stop 166 167footer last updated 2021-01-08 168@enduml 169