-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathutils.go
More file actions
301 lines (259 loc) · 5.77 KB
/
Copy pathutils.go
File metadata and controls
301 lines (259 loc) · 5.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
package promsketch
import (
"math"
"sort"
"github.com/zzylol/prometheus-sketches/util/zeropool"
)
const WINDOW_SIZE int = 1000000
const HASH_SEED int = 2147483647
/* sketch configurations */
const CM_ROW_NO int = 5
const CM_COL_NO int = 1000
const CS_ROW_NO int = 5
const CS_COL_NO int = 4096
const CS_ONE_COL_NO int = 100000
// for UnivMon
// for SHUniv, use larger config; for EHUniv, use smaller config
// Configuration 4
// const ELEPHANT_LAYER = 8
// const MICE_LAYER = 6
// const CS_LVLS int = 14 // total layers
// const CS_ROW_NO_Univ_ELEPHANT int = 3
// const CS_COL_NO_Univ_ELEPHANT int = 256
// const CS_ROW_NO_Univ_MICE int = 3
// const CS_COL_NO_Univ_MICE int = 64
// Configuration 3
// const ELEPHANT_LAYER = 8
// const MICE_LAYER = 6
// const CS_LVLS int = 14 // total layers
// const CS_ROW_NO_Univ_ELEPHANT int = 3
// const CS_COL_NO_Univ_ELEPHANT int = 512
// const CS_ROW_NO_Univ_MICE int = 3
// const CS_COL_NO_Univ_MICE int = 128
// Configuration 2
// const ELEPHANT_LAYER = 8
// const MICE_LAYER = 8
// const CS_LVLS int = 16 // total layers
// const CS_ROW_NO_Univ_ELEPHANT int = 3
// const CS_COL_NO_Univ_ELEPHANT int = 1024
// const CS_ROW_NO_Univ_MICE int = 3
// const CS_COL_NO_Univ_MICE int = 128
// Configuration 1, used in performance evaluation
const ELEPHANT_LAYER = 8
const MICE_LAYER = 8
const CS_LVLS int = 16 // total layers
const CS_ROW_NO_Univ_ELEPHANT int = 3
const CS_COL_NO_Univ_ELEPHANT int = 2048
const CS_ROW_NO_Univ_MICE int = 3
const CS_COL_NO_Univ_MICE int = 512
const EHUniv_MAX_MAP_SIZE int = (ELEPHANT_LAYER*(CS_ROW_NO_Univ_ELEPHANT*CS_COL_NO_Univ_ELEPHANT) + MICE_LAYER*(CS_ROW_NO_Univ_MICE*CS_COL_NO_Univ_MICE))
const TOPK_SIZE int = 100
const TOPK_SIZE_MICE int = 100
const TOPK_SIZE2 int = 200
const INTERVAL int = 1000 // ms
const MILLION int = 1000000
const BILLION int = 1000000000
const UnivPoolCAP uint32 = 1
const maxPointsSliceSize = 5000
var zero_int64_uarr_ele []int64
var zero_int64_uarr_mice []int64
func init() {
zero_int64_uarr_ele = make([]int64, CS_COL_NO_Univ_ELEPHANT)
for i := 0; i < CS_COL_NO_Univ_ELEPHANT; i++ {
zero_int64_uarr_ele[i] = 0
}
zero_int64_uarr_mice = make([]int64, CS_COL_NO_Univ_MICE)
for i := 0; i < CS_COL_NO_Univ_MICE; i++ {
zero_int64_uarr_mice[i] = 0
}
}
var (
farr2Pool = zeropool.New(func() [][]float64 {
tmp := make([][]float64, CS_ROW_NO_Univ_ELEPHANT)
for r := 0; r < CS_ROW_NO_Univ_ELEPHANT; r++ {
tmp[r] = make([]float64, CS_COL_NO_Univ_ELEPHANT)
tmp[r][0] = 0
for c := 1; c < CS_COL_NO_Univ_ELEPHANT; c *= 2 {
copy(tmp[r][c:], tmp[r][:c])
}
}
return tmp
})
iarr2Pool_ele = zeropool.New(func() [][]int64 {
tmp := make([][]int64, CS_ROW_NO_Univ_ELEPHANT)
for r := 0; r < CS_ROW_NO_Univ_ELEPHANT; r++ {
tmp[r] = make([]int64, CS_COL_NO_Univ_ELEPHANT)
tmp[r][0] = 0
for c := 1; c < CS_COL_NO_Univ_ELEPHANT; c *= 2 {
copy(tmp[r][c:], tmp[r][:c])
}
}
return tmp
})
iarrPool_ele = zeropool.New(func() []int64 {
tmp := make([]int64, CS_ROW_NO_Univ_ELEPHANT)
for r := 0; r < CS_ROW_NO_Univ_ELEPHANT; r++ {
tmp[r] = 0
}
return tmp
})
iarr2Pool_mice = zeropool.New(func() [][]int64 {
tmp := make([][]int64, CS_ROW_NO_Univ_MICE)
for r := 0; r < CS_ROW_NO_Univ_MICE; r++ {
tmp[r] = make([]int64, CS_COL_NO_Univ_MICE)
tmp[r][0] = 0
for c := 1; c < CS_COL_NO_Univ_MICE; c *= 2 {
copy(tmp[r][c:], tmp[r][:c])
}
}
return tmp
})
iarrPool_mice = zeropool.New(func() []int64 {
tmp := make([]int64, CS_ROW_NO_Univ_MICE)
for r := 0; r < CS_ROW_NO_Univ_MICE; r++ {
tmp[r] = 0
}
return tmp
})
farrPool = zeropool.New(func() []float64 {
tmp := make([]float64, CS_ROW_NO_Univ_ELEPHANT)
for r := 0; r < CS_ROW_NO_Univ_ELEPHANT; r++ {
tmp[r] = 0
}
return tmp
})
)
func Min(a []float64) (min float64) {
min = 200
for _, x := range a {
if min > x {
min = x
}
}
return min
}
func Max(a []float64) (max float64) {
max = 0
for _, x := range a {
if max < x {
max = x
}
}
return max
}
func Median(a []float64) (median float64) {
sort.Float64s(a)
l := len(a)
if l == 0 {
return math.NaN()
} else if l%2 == 0 {
median = (a[l/2-1] + a[l/2]) / 2
} else {
median = a[l/2]
}
return median
}
// TODO
func MedianOfFive(a, b, c, d, e int64) int64 {
if a <= c && b <= c && c <= d && c <= e || a <= c && d <= c && c <= b && c <= e || a <= c && e <= c && c <= b && c <= d {
return c
}
return a
}
func MedianOfThree(a, b, c int64) int64 {
if a <= b && b <= c || c <= b && b <= a {
return b
} else if a <= c && c <= b || b <= c && c <= a {
return c
} else {
return a
}
}
func AbsInt(x int) int {
if x < 0 {
return -x
}
return x
}
func AbsInt64(x int64) int64 {
if x < 0 {
return -x
}
return x
}
func AbsFloat64(x float64) float64 {
if x < 0 {
return -x
}
return x
}
func MaxFloat64(x float64, y float64) float64 {
if x < y {
return y
} else {
return x
}
}
func SignInt(x int) int {
if x < 0 {
return -1
} else {
return 1
}
}
func SignFloat64(x float64) float64 {
if x < 0 {
return -1
} else {
return 1
}
}
func MinInt(x int, y int) int {
if x < y {
return x
} else {
return y
}
}
func i64tob(val uint64) []byte {
r := make([]byte, 8)
for i := uint64(0); i < 8; i++ {
r[i] = byte((val >> (i * 8)) & 0xff)
}
return r
}
func btoi64(val []byte) uint64 {
r := uint64(0)
for i := uint64(0); i < 8; i++ {
r |= uint64(val[i]) << (8 * i)
}
return r
}
func i32tob(val uint32) []byte {
r := make([]byte, 4)
for i := uint32(0); i < 4; i++ {
r[i] = byte((val >> (8 * i)) & 0xff)
}
return r
}
func btoi32(val []byte) uint32 {
r := uint32(0)
for i := uint32(0); i < 4; i++ {
r |= uint32(val[i]) << (8 * i)
}
return r
}
func MinInt64(a, b int64) int64 {
if a < b {
return a
} else {
return b
}
}
func MaxInt64(a, b int64) int64 {
if a > b {
return a
} else {
return b
}
}