-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworkloads.cpp
53 lines (46 loc) · 1.34 KB
/
workloads.cpp
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
/*
* Workloads
*/
#include "workloads.h"
using namespace std;
Workloads::Workloads(uint32_t avgFlowSize,
FlowDist flowSizeDist)
: _avgFlowSize(avgFlowSize),
_flowSizeDist(flowSizeDist)
{
if (_flowSizeDist == ENTERPRISE) {
_avgFlowSize = 215000;
for (uint32_t i = 0; i < sizeof(enterprise_size)/8; i++) {
_flowSizeCDF[enterprise_prob[i]] = enterprise_size[i];
}
} else if (_flowSizeDist == DATAMINING) {
_avgFlowSize = 12500000;
for (uint32_t i = 0; i < sizeof(datamining_size)/8; i++) {
_flowSizeCDF[datamining_prob[i]] = datamining_size[i];
}
}
}
uint64_t
Workloads::generateFlowSize()
{
switch (_flowSizeDist) {
case PARETO:
// Pareto
return (uint64_t)pareto(1.1, _avgFlowSize);
case ENTERPRISE:
case DATAMINING:
// Custom workload, generate using _flowSizeCDF.
break;
default: // UNIFORM
return _avgFlowSize;
}
double random = drand();
auto it = _flowSizeCDF.upper_bound(random);
double rp = it->first;
uint64_t rv = it->second;
it = prev(it);
double lp = it->first;
uint64_t lv = it->second;
uint64_t flowsize = lv + (rv - lv) * (random - lp) / (rp - lp);
return flowsize;
}