github.com/aigarnetwork/aigar@v0.0.0-20191115204914-d59a6eb70f8e/metrics/ewma_test.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // Copyright 2019 The go-aigar Authors 3 // This file is part of the go-aigar library. 4 // 5 // The go-aigar library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-aigar library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-aigar library. If not, see <http://www.gnu.org/licenses/>. 17 18 package metrics 19 20 import ( 21 "math" 22 "testing" 23 ) 24 25 func BenchmarkEWMA(b *testing.B) { 26 a := NewEWMA1() 27 b.ResetTimer() 28 for i := 0; i < b.N; i++ { 29 a.Update(1) 30 a.Tick() 31 } 32 } 33 34 func TestEWMA1(t *testing.T) { 35 a := NewEWMA1() 36 a.Update(3) 37 a.Tick() 38 if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { 39 t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) 40 } 41 elapseMinute(a) 42 if rate := a.Rate(); math.Abs(0.22072766470286553-rate) > epsilon { 43 t.Errorf("1 minute a.Rate(): 0.22072766470286553 != %v\n", rate) 44 } 45 elapseMinute(a) 46 if rate := a.Rate(); math.Abs(0.08120116994196772-rate) > epsilon { 47 t.Errorf("2 minute a.Rate(): 0.08120116994196772 != %v\n", rate) 48 } 49 elapseMinute(a) 50 if rate := a.Rate(); math.Abs(0.029872241020718428-rate) > epsilon { 51 t.Errorf("3 minute a.Rate(): 0.029872241020718428 != %v\n", rate) 52 } 53 elapseMinute(a) 54 if rate := a.Rate(); math.Abs(0.01098938333324054-rate) > epsilon { 55 t.Errorf("4 minute a.Rate(): 0.01098938333324054 != %v\n", rate) 56 } 57 elapseMinute(a) 58 if rate := a.Rate(); math.Abs(0.004042768199451294-rate) > epsilon { 59 t.Errorf("5 minute a.Rate(): 0.004042768199451294 != %v\n", rate) 60 } 61 elapseMinute(a) 62 if rate := a.Rate(); math.Abs(0.0014872513059998212-rate) > epsilon { 63 t.Errorf("6 minute a.Rate(): 0.0014872513059998212 != %v\n", rate) 64 } 65 elapseMinute(a) 66 if rate := a.Rate(); math.Abs(0.0005471291793327122-rate) > epsilon { 67 t.Errorf("7 minute a.Rate(): 0.0005471291793327122 != %v\n", rate) 68 } 69 elapseMinute(a) 70 if rate := a.Rate(); math.Abs(0.00020127757674150815-rate) > epsilon { 71 t.Errorf("8 minute a.Rate(): 0.00020127757674150815 != %v\n", rate) 72 } 73 elapseMinute(a) 74 if rate := a.Rate(); math.Abs(7.404588245200814e-05-rate) > epsilon { 75 t.Errorf("9 minute a.Rate(): 7.404588245200814e-05 != %v\n", rate) 76 } 77 elapseMinute(a) 78 if rate := a.Rate(); math.Abs(2.7239957857491083e-05-rate) > epsilon { 79 t.Errorf("10 minute a.Rate(): 2.7239957857491083e-05 != %v\n", rate) 80 } 81 elapseMinute(a) 82 if rate := a.Rate(); math.Abs(1.0021020474147462e-05-rate) > epsilon { 83 t.Errorf("11 minute a.Rate(): 1.0021020474147462e-05 != %v\n", rate) 84 } 85 elapseMinute(a) 86 if rate := a.Rate(); math.Abs(3.6865274119969525e-06-rate) > epsilon { 87 t.Errorf("12 minute a.Rate(): 3.6865274119969525e-06 != %v\n", rate) 88 } 89 elapseMinute(a) 90 if rate := a.Rate(); math.Abs(1.3561976441886433e-06-rate) > epsilon { 91 t.Errorf("13 minute a.Rate(): 1.3561976441886433e-06 != %v\n", rate) 92 } 93 elapseMinute(a) 94 if rate := a.Rate(); math.Abs(4.989172314621449e-07-rate) > epsilon { 95 t.Errorf("14 minute a.Rate(): 4.989172314621449e-07 != %v\n", rate) 96 } 97 elapseMinute(a) 98 if rate := a.Rate(); math.Abs(1.8354139230109722e-07-rate) > epsilon { 99 t.Errorf("15 minute a.Rate(): 1.8354139230109722e-07 != %v\n", rate) 100 } 101 } 102 103 func TestEWMA5(t *testing.T) { 104 a := NewEWMA5() 105 a.Update(3) 106 a.Tick() 107 if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { 108 t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) 109 } 110 elapseMinute(a) 111 if rate := a.Rate(); math.Abs(0.49123845184678905-rate) > epsilon { 112 t.Errorf("1 minute a.Rate(): 0.49123845184678905 != %v\n", rate) 113 } 114 elapseMinute(a) 115 if rate := a.Rate(); math.Abs(0.4021920276213837-rate) > epsilon { 116 t.Errorf("2 minute a.Rate(): 0.4021920276213837 != %v\n", rate) 117 } 118 elapseMinute(a) 119 if rate := a.Rate(); math.Abs(0.32928698165641596-rate) > epsilon { 120 t.Errorf("3 minute a.Rate(): 0.32928698165641596 != %v\n", rate) 121 } 122 elapseMinute(a) 123 if rate := a.Rate(); math.Abs(0.269597378470333-rate) > epsilon { 124 t.Errorf("4 minute a.Rate(): 0.269597378470333 != %v\n", rate) 125 } 126 elapseMinute(a) 127 if rate := a.Rate(); math.Abs(0.2207276647028654-rate) > epsilon { 128 t.Errorf("5 minute a.Rate(): 0.2207276647028654 != %v\n", rate) 129 } 130 elapseMinute(a) 131 if rate := a.Rate(); math.Abs(0.18071652714732128-rate) > epsilon { 132 t.Errorf("6 minute a.Rate(): 0.18071652714732128 != %v\n", rate) 133 } 134 elapseMinute(a) 135 if rate := a.Rate(); math.Abs(0.14795817836496392-rate) > epsilon { 136 t.Errorf("7 minute a.Rate(): 0.14795817836496392 != %v\n", rate) 137 } 138 elapseMinute(a) 139 if rate := a.Rate(); math.Abs(0.12113791079679326-rate) > epsilon { 140 t.Errorf("8 minute a.Rate(): 0.12113791079679326 != %v\n", rate) 141 } 142 elapseMinute(a) 143 if rate := a.Rate(); math.Abs(0.09917933293295193-rate) > epsilon { 144 t.Errorf("9 minute a.Rate(): 0.09917933293295193 != %v\n", rate) 145 } 146 elapseMinute(a) 147 if rate := a.Rate(); math.Abs(0.08120116994196763-rate) > epsilon { 148 t.Errorf("10 minute a.Rate(): 0.08120116994196763 != %v\n", rate) 149 } 150 elapseMinute(a) 151 if rate := a.Rate(); math.Abs(0.06648189501740036-rate) > epsilon { 152 t.Errorf("11 minute a.Rate(): 0.06648189501740036 != %v\n", rate) 153 } 154 elapseMinute(a) 155 if rate := a.Rate(); math.Abs(0.05443077197364752-rate) > epsilon { 156 t.Errorf("12 minute a.Rate(): 0.05443077197364752 != %v\n", rate) 157 } 158 elapseMinute(a) 159 if rate := a.Rate(); math.Abs(0.04456414692860035-rate) > epsilon { 160 t.Errorf("13 minute a.Rate(): 0.04456414692860035 != %v\n", rate) 161 } 162 elapseMinute(a) 163 if rate := a.Rate(); math.Abs(0.03648603757513079-rate) > epsilon { 164 t.Errorf("14 minute a.Rate(): 0.03648603757513079 != %v\n", rate) 165 } 166 elapseMinute(a) 167 if rate := a.Rate(); math.Abs(0.0298722410207183831020718428-rate) > epsilon { 168 t.Errorf("15 minute a.Rate(): 0.0298722410207183831020718428 != %v\n", rate) 169 } 170 } 171 172 func TestEWMA15(t *testing.T) { 173 a := NewEWMA15() 174 a.Update(3) 175 a.Tick() 176 if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { 177 t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) 178 } 179 elapseMinute(a) 180 if rate := a.Rate(); math.Abs(0.5613041910189706-rate) > epsilon { 181 t.Errorf("1 minute a.Rate(): 0.5613041910189706 != %v\n", rate) 182 } 183 elapseMinute(a) 184 if rate := a.Rate(); math.Abs(0.5251039914257684-rate) > epsilon { 185 t.Errorf("2 minute a.Rate(): 0.5251039914257684 != %v\n", rate) 186 } 187 elapseMinute(a) 188 if rate := a.Rate(); math.Abs(0.4912384518467888184678905-rate) > epsilon { 189 t.Errorf("3 minute a.Rate(): 0.4912384518467888184678905 != %v\n", rate) 190 } 191 elapseMinute(a) 192 if rate := a.Rate(); math.Abs(0.459557003018789-rate) > epsilon { 193 t.Errorf("4 minute a.Rate(): 0.459557003018789 != %v\n", rate) 194 } 195 elapseMinute(a) 196 if rate := a.Rate(); math.Abs(0.4299187863442732-rate) > epsilon { 197 t.Errorf("5 minute a.Rate(): 0.4299187863442732 != %v\n", rate) 198 } 199 elapseMinute(a) 200 if rate := a.Rate(); math.Abs(0.4021920276213831-rate) > epsilon { 201 t.Errorf("6 minute a.Rate(): 0.4021920276213831 != %v\n", rate) 202 } 203 elapseMinute(a) 204 if rate := a.Rate(); math.Abs(0.37625345116383313-rate) > epsilon { 205 t.Errorf("7 minute a.Rate(): 0.37625345116383313 != %v\n", rate) 206 } 207 elapseMinute(a) 208 if rate := a.Rate(); math.Abs(0.3519877317060185-rate) > epsilon { 209 t.Errorf("8 minute a.Rate(): 0.3519877317060185 != %v\n", rate) 210 } 211 elapseMinute(a) 212 if rate := a.Rate(); math.Abs(0.3292869816564153165641596-rate) > epsilon { 213 t.Errorf("9 minute a.Rate(): 0.3292869816564153165641596 != %v\n", rate) 214 } 215 elapseMinute(a) 216 if rate := a.Rate(); math.Abs(0.3080502714195546-rate) > epsilon { 217 t.Errorf("10 minute a.Rate(): 0.3080502714195546 != %v\n", rate) 218 } 219 elapseMinute(a) 220 if rate := a.Rate(); math.Abs(0.2881831806538789-rate) > epsilon { 221 t.Errorf("11 minute a.Rate(): 0.2881831806538789 != %v\n", rate) 222 } 223 elapseMinute(a) 224 if rate := a.Rate(); math.Abs(0.26959737847033216-rate) > epsilon { 225 t.Errorf("12 minute a.Rate(): 0.26959737847033216 != %v\n", rate) 226 } 227 elapseMinute(a) 228 if rate := a.Rate(); math.Abs(0.2522102307052083-rate) > epsilon { 229 t.Errorf("13 minute a.Rate(): 0.2522102307052083 != %v\n", rate) 230 } 231 elapseMinute(a) 232 if rate := a.Rate(); math.Abs(0.23594443252115815-rate) > epsilon { 233 t.Errorf("14 minute a.Rate(): 0.23594443252115815 != %v\n", rate) 234 } 235 elapseMinute(a) 236 if rate := a.Rate(); math.Abs(0.2207276647028646247028654470286553-rate) > epsilon { 237 t.Errorf("15 minute a.Rate(): 0.2207276647028646247028654470286553 != %v\n", rate) 238 } 239 } 240 241 func elapseMinute(a EWMA) { 242 for i := 0; i < 12; i++ { 243 a.Tick() 244 } 245 }