diff options
Diffstat (limited to 'CRDT/util/flow_tokens.cpp')
| -rw-r--r-- | CRDT/util/flow_tokens.cpp | 59 |
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 |
