summaryrefslogtreecommitdiff
path: root/CRDT/util/flow_tokens.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CRDT/util/flow_tokens.cpp')
-rw-r--r--CRDT/util/flow_tokens.cpp59
1 files changed, 39 insertions, 20 deletions
diff --git a/CRDT/util/flow_tokens.cpp b/CRDT/util/flow_tokens.cpp
index a1057e2..fae761d 100644
--- a/CRDT/util/flow_tokens.cpp
+++ b/CRDT/util/flow_tokens.cpp
@@ -1,6 +1,7 @@
#include "flow_tokens.h"
#include "math.h"
#include "../crdt_utils.h"
+#include <cstdio>
long long get_request_tokens(long long class_num, long long CIR, size_t index, long long step_us, enum traffic_type type)
{
@@ -8,7 +9,7 @@ long long get_request_tokens(long long class_num, long long CIR, size_t index, l
double average_ratio2, average_ratio8, total_ratio2, total_ratio8;
long long standard = CIR*step_us/1000;
// long long sdf = floor((long double)standard * 0.05); //floating 5%
- size_t occupy8_replica_num = floor(class_num * 0.8);
+ size_t occupy8_class_num = floor(class_num * 0.8);
// long long rand_sdf = random()%sdf;
long long rand_sdf = 0;
size_t scope_flag = FALSE;
@@ -27,13 +28,13 @@ long long get_request_tokens(long long class_num, long long CIR, size_t index, l
//average 0.67*CIR per node
total_ratio2 = (0.67*class_num) / 5;
total_ratio8 = (0.67*class_num) - total_ratio2;
- average_ratio2 = total_ratio2 / occupy8_replica_num;
- average_ratio8 = total_ratio8 / (class_num-occupy8_replica_num);
- if (index < occupy8_replica_num && scope_flag) {
+ average_ratio2 = total_ratio2 / occupy8_class_num;
+ average_ratio8 = total_ratio8 / (class_num-occupy8_class_num);
+ if (index < occupy8_class_num && scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio2) + rand_sdf;
- } else if (index < occupy8_replica_num && !scope_flag) {
+ } else if (index < occupy8_class_num && !scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio2) - rand_sdf;
- } else if (index >= occupy8_replica_num && scope_flag) {
+ } else if (index >= occupy8_class_num && scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio8) + rand_sdf;
} else {
request_size = (long long)floor((long double)standard * average_ratio8) - rand_sdf;
@@ -43,13 +44,13 @@ long long get_request_tokens(long long class_num, long long CIR, size_t index, l
//average 2*CIR per node
total_ratio2 = (2.0*class_num) / 5;
total_ratio8 = (2.0*class_num) - total_ratio2;
- average_ratio2 = total_ratio2 / occupy8_replica_num;
- average_ratio8 = total_ratio8 / (class_num-occupy8_replica_num);
- if (index < occupy8_replica_num && scope_flag) {
+ average_ratio2 = total_ratio2 / occupy8_class_num;
+ average_ratio8 = total_ratio8 / (class_num-occupy8_class_num);
+ if (index < occupy8_class_num && scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio2) + rand_sdf;
- } else if (index < occupy8_replica_num && !scope_flag) {
+ } else if (index < occupy8_class_num && !scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio2) - rand_sdf;
- } else if (index >= occupy8_replica_num && scope_flag) {
+ } else if (index >= occupy8_class_num && scope_flag) {
request_size = (long long)floor((long double)standard * average_ratio8) + rand_sdf;
} else {
request_size = (long long)floor((long double)standard * average_ratio8) - rand_sdf;
@@ -69,24 +70,42 @@ long long get_request_tokens(long long class_num, long long CIR, size_t index, l
return request_size;
}
-void set_flow_prob(double *prob, int replica_num, enum flow_type ftype)
+double set_flow_prob(double *prob, int class_num, enum flow_type ftype)
{
int i;
+ double sum_w = 0.0, sum_p = 0.0;
+ double probabilities[class_num];
+ double a = 0.9; //Pareto形参
if(ftype == UNIFORM)
{
- for(i = 0; i < replica_num; i++)
+ for(i = 0; i < class_num; i++)
{
- prob[i] = 1;
+ prob[i] = 2.0/class_num;
+ sum_w += prob[i];
}
- }else{
- int eight_replica_num = floor(replica_num * 0.8);
- for(i = 0; i < eight_replica_num; ++i)
+ }else if(ftype == PARETO){
+ for (i = 1; i <= class_num; ++i)
{
- prob[i] = ceil(1000*2.0/eight_replica_num);
+ probabilities[i - 1] = (a * pow(1, a)) / pow(i, a + 1);
+ sum_p += probabilities[i - 1];
+ }
+
+ for (i = 0; i < class_num; ++i) {
+ probabilities[i] /= sum_p;
+ prob[class_num-i-1] = probabilities[i] * 2.0;
+ // printf("[%d]=%lf\n ", class_num-i-1, prob[class_num-i-1]);
+ sum_w += prob[class_num-i-1];
}
- for(; i < replica_num; ++i)
+ }else if(ftype == ONEHEAVY){
+ for(i = 0; i < class_num-1; i++)
{
- prob[i] = floor(1000*8.0/(replica_num-eight_replica_num));
+ prob[i] = 1.0/class_num;
+ sum_w += prob[i];
}
+ prob[i] = 0.5;
+ sum_w += prob[i];
+ }else{
+ sum_w = 0;
}
+ return sum_w;
} \ No newline at end of file