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