/* Written by Abdy Abhari , June 2009 */ /* This program should be used only for research */ /* or educational purposes with proper citation to the paper */ /* A. Abhari, M. Soraya, Workload Generation for YouTube, */ /* Multimedia Tools and Applications journal, June 2009 */ /* It generates YouTbe variants and can be compiled in linux as */ /* gcc -lm youtubeworkld.c */ #include #include #include #include #include /* for seeding random generator */ int N=50000; int maxrelated=6; int maxclientsession =6; void popularweeklydb(int i); void populardailydb(int i); void regulardb(int i); int getRandomInt(int minval, int maxval); int clientsession(int i); int selectedvideo(int pos); double weibull(float alpha, float beta, float gamma); double weibull2 (double alpha, double beta); double log_logistic(double alpha, double beta); typedef struct { int FileSize; int ViewCount ; int Duration ; int AvgRating ; int RatingCount ; long SelectionProb ; int relatedvideos; int * ChildPointer; } video; video * video_list ; /* main */ main() { int i,j; float alpha= 0; float beta= 0; float gamma=0; // it is location parameter with setting to 0 it will be two parameter /* * Generate the object sizes */ srandom((long)getpid()); /* seed for random */ srand48((double) getpid()); /* is uniform */ video_list = (video *) malloc (N * sizeof (video)); for(i = 0; i < N; i++) { /* create database daily */ populardailydb(i); } i= getRandomInt(0,N-1); j=1; while (j<2000) /*client number*/ { i= clientsession(i); printf("%d %d %d \n",j, video_list[i].FileSize,i); j++; } } void popularweeklydb(int i) { int j; float alpha= 0; float beta= 0; float gamma=0; /* it is location parameter with setting to 0 it will be two parameter*/ alpha =1.13 ; beta = 11212; /* file size */ video_list[i].FileSize= weibull2(alpha,beta); alpha =2.05 ; beta = 195492; /* view count */ video_list[i].ViewCount = log_logistic(alpha,beta); alpha =1.13 ; beta = 246.07; /* Duration */ video_list[i].Duration = weibull2(alpha,beta); alpha =4.73 ; beta = 4.25; /* AvgRating */ video_list[i].AvgRating = weibull2(alpha,beta); alpha =0.75 ; beta = 668; /* RatingCount */ video_list[i].RatingCount = weibull2(alpha,beta); if (video_list[i].Duration > 5 ) /* partial size play back */ video_list[i].FileSize = (5* video_list[i].FileSize)/video_list[i].Duration; if (i==0) video_list[i].SelectionProb= video_list[i].ViewCount; else video_list[i].SelectionProb=video_list[i].ViewCount + video_list[i-1].SelectionProb ; video_list[i].relatedvideos =getRandomInt(0,maxrelated); video_list[i].ChildPointer = (int *) malloc(video_list[i].relatedvideos * sizeof (int)); for (j=0;j 5 ) /* partial size play back */ video_list[i].FileSize = (5* video_list[i].FileSize)/video_list[i].Duration; video_list[i].RatingCount = weibull2(alpha,beta); if (i==0) video_list[i].SelectionProb= video_list[i].ViewCount; else video_list[i].SelectionProb=video_list[i].ViewCount + video_list[i-1].SelectionProb ; video_list[i].relatedvideos =getRandomInt(0,maxrelated); video_list[i].ChildPointer = (int *) malloc(video_list[i].relatedvideos * sizeof (int)); for (j=0;j video_list[i].SelectionProb) i++; return(i); } else { /* related videos */ if (video_list[pos].relatedvideos > 0) { relatedvcount[0]= video_list[video_list[pos].ChildPointer[0]].ViewCount ; for (j=1;j < video_list[pos].relatedvideos; j++) relatedvcount[j]=video_list[video_list[pos].ChildPointer[j]].ViewCount + relatedvcount[j-1]; k = getRandomInt(0,relatedvcount[j-1]); i=0; while (k> relatedvcount[i]) i++; return(video_list[pos].ChildPointer[i]); } } } double weibull2 (double alpha, double beta) { float u=0; double i; u = (float)drand48(); /* do not need seed */ i= pow(-log(u),1/alpha); /* it is uniform so 1-u = u */ i= beta * i ; return(i); } double log_logistic(double alpha, double beta) { float u=0; double i; u = (float)drand48(); i= pow(u/(1-u),1/alpha); i= beta * i ; return(i); }