packmime_ranvar.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:40k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /* 
  3.  * Copyright 2002, Statistics Research, Bell Labs, Lucent Technologies and
  4.  * The University of North Carolina at Chapel Hill
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without 
  7.  * modification, are permitted provided that the following conditions are met:
  8.  * 
  9.  *    1. Redistributions of source code must retain the above copyright 
  10.  * notice, this list of conditions and the following disclaimer.
  11.  *    2. Redistributions in binary form must reproduce the above copyright 
  12.  * notice, this list of conditions and the following disclaimer in the 
  13.  * documentation and/or other materials provided with the distribution.
  14.  *    3. The name of the author may not be used to endorse or promote 
  15.  * products derived from this software without specific prior written 
  16.  * permission.
  17.  * 
  18.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
  19.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  20.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  21.  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 
  22.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  23.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  24.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  25.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  26.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
  27.  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  28.  * POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30. /*
  31.  * Reference
  32.  *     Stochastic Models for Generating Synthetic HTTP Source Traffic 
  33.  *     J. Cao, W.S. Cleveland, Y. Gao, K. Jeffay, F.D. Smith, and M.C. Weigle 
  34.  *     IEEE INFOCOM 2004.
  35.  *
  36.  * Documentation available at http://dirt.cs.unc.edu/packmime/
  37.  * 
  38.  * Contacts: Michele Weigle (mcweigle@cs.unc.edu),
  39.  *           Kevin Jeffay (jeffay@cs.unc.edu)
  40.  */
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <assert.h>
  44. #include <math.h>
  45. #include "packmime_ranvar.h"
  46. /*:::::::::::::::::::::::::::::::: FX  :::::::::::::::::::::::::::::::::::::*/
  47. FX::FX (const double *x, const double *y, int n) :
  48. x_((double*) x), y_((double*)y), nsteps_(n)
  49. {
  50. assert (n>=2);
  51. slope_ = new double[n];
  52. for (int i = 0; i<n-1; i++) 
  53. slope_[i] = (y[i+1] - y[i]) / (x[i+1] - x[i]);
  54. slope_[n-1] = slope_[n-2];
  55. }
  56. FX::~FX()
  57. {
  58. delete[] slope_;
  59. }
  60. double FX::LinearInterpolate (double xnew)
  61. {
  62. int i;
  63. // we should use binary search if nsteps is large, but for now...
  64. for (i=0; i<nsteps_-2; i++) {
  65. if (xnew < x_[i+1]) {
  66. return (y_[i] + slope_[i]*(xnew-x_[i]));
  67. }
  68. }
  69. return (y_[nsteps_-1] + slope_[nsteps_-1]*(xnew-x_[nsteps_-1]));
  70. }
  71. /*:::::::::::::::::::::::::::: Fractional ARIMA  ::::::::::::::::::::::::::::*/
  72. /** Reference:
  73.  * "Modeling Persistence in Hydrological Time Series 
  74.  * Using Fractional Differencing" 
  75.  * J.R.M. Hosking
  76.  * Water Resources Research, Vol 20, No 12, P1898-1908, Dec 1984
  77.  */
  78. /**
  79.  * y[t] = sum_j=1^p (AR[j] * y[t-j]) + x[t] - sum_j=1^q (MA[j] * x[t-j]
  80.  */
  81. #define Min(a, b)      ((a) < (b) ? (a) : (b))
  82. FARIMA::FARIMA(RNG* rng, double d, int N, int pAR, int qMA) :
  83. rng_(rng), N_(N), pAR_(pAR), qMA_(qMA), d_(d)
  84. {
  85. assert(N && qMA);
  86. if (pAR) {
  87. AR_ = new double[pAR];
  88. y_ = new double [pAR];
  89. }
  90. if (qMA)
  91. MA_ = new double[qMA];
  92. x_ = new double [N];
  93. phi_ = new double [N];
  94. /** use 1-theta[1] B-theta[2] B^2 - ..., and 
  95.  * our model is epsilon_j + epsilon_(j-1) 
  96.  */
  97. MA_[0] = -1; 
  98. for (int i=0; i<pAR; i++) 
  99. y_[i] = 0.0;
  100. t_ = tmod_ = 0;
  101. /* skip the first few in simulation to stablize */
  102. while (t_ < N + pAR + qMA)
  103. NextLow();
  104. }
  105. FARIMA::~FARIMA()
  106. {
  107. if (pAR_ > 0) { 
  108. delete[] AR_; 
  109. delete[] y_; 
  110. if (qMA_ > 0)
  111. delete[] MA_; 
  112. delete[] phi_;
  113. delete[] x_;
  114. }
  115. double FARIMA::NextLow()
  116. {
  117. int j;
  118. double mt, xt, yt, a, b, v0;
  119. if (t_ == 0) {
  120. /* d_0.25; gamma(1-2*d)/(gamma(1-d))^2 => 1.180341 */
  121. v0 = rng_->gammln(1.0-2.0*d_) - 2.0*rng_->gammln(1.0-d_);
  122. v0 = exp(v0);
  123. /* phi[0] is not used, so we use it for vt */
  124. phi_[0] = v0; 
  125. x_[t_] = rng_->rnorm() * pow(v0, 0.5);
  126. } else if (t_ < N_) {
  127. /* get phi_tt */
  128. phi_[t_] = d_/(t_-d_);
  129. /* get phi_tj */
  130. for (j=1; j<t_; j++) {
  131. if (j <= t_-j) {
  132. a = phi_[j] - phi_[t_] * phi_[t_-j];
  133. b = phi_[t_-j] - phi_[t_] * phi_[j];
  134. phi_[j] = a;
  135. phi_[t_-j] = b;
  136. }
  137. }
  138. /* get vt (phi[0]) */
  139. /* v[t] = (1-phi_tt^2) * v[t-1] */
  140. phi_[0] = (1-phi_[t_]*phi_[t_]) * phi_[0]; 
  141. }
  142. /* get m_t, v_t */
  143. mt = 0;
  144. for (j=1; j<=Min(t_,N_-1); j++)
  145. mt += phi_[j] * x_[(t_-j)%N_];
  146. /* get xt */
  147. xt = rng_->rnorm() * pow(phi_[0], 0.5) + mt;
  148. x_[t_%N_] = xt;
  149. /** add AR, MA parts only after enough points in the error 
  150.  * fARIMA process 
  151.  */
  152. yt = xt;
  153. if (t_ > qMA_) {
  154. if (qMA_ > 0) {
  155. for(j=0; j<qMA_; j++) 
  156. yt -= x_[(t_-1-j)%N_] * MA_[j];
  157. }
  158. }
  159. t_++;
  160. tmod_ = (++tmod_ == N_) ? 0 : tmod_;
  161. return (yt);
  162. }
  163. // assumes t > N and qMA < N
  164. double FARIMA::Next()
  165. {
  166. double mt, xt, yt;
  167. int j, m;
  168. /* get m_t, v_t */
  169. mt = 0;
  170. for (j=1; j<=tmod_; j++)
  171. mt += phi_[j] * x_[tmod_-j];
  172. for (j=tmod_+1; j<=N_-1; j++)
  173. mt += phi_[j] * x_[N_+tmod_-j];
  174. /* get xt */
  175. xt = rng_->rnorm() * pow(phi_[0], 0.5) + mt;
  176. x_[tmod_] = xt;
  177. /** add AR, MA parts only after enough points in the error 
  178.  * fARIMA process 
  179.  */
  180. yt = xt;
  181. if (t_>qMA_) {
  182. if (qMA_>0) {
  183. m = (tmod_ < qMA_) ? tmod_ : qMA_;
  184. for(j=0; j<m; j++) 
  185. yt -= x_[tmod_-1-j] * MA_[j];
  186. for(j=m; j<qMA_; j++) 
  187. yt -= x_[N_+tmod_-1-j] * MA_[j];
  188. }
  189. }
  190. t_++;
  191. tmod_ = (++tmod_ == N_) ? 0 : tmod_;
  192. return (yt);
  193. }
  194. /*:::::::::::::::::::::: PackMimeHTTP Transmission Delay RanVar :::::::::::::::::*/
  195. static class PackMimeHTTPXmitRandomVariableClass : public TclClass {
  196. public:
  197. PackMimeHTTPXmitRandomVariableClass() : 
  198. TclClass("RandomVariable/PackMimeHTTPXmit"){}
  199. TclObject* create(int argc, const char*const* argv) {
  200. if (argc == 6) {
  201. // rate, type
  202. return(new PackMimeHTTPXmitRandomVariable ((double) 
  203.    atof(argv[4]),
  204.    atoi(argv[5])));
  205. } else if (argc == 7) {
  206. // rate, type, RNG
  207. RNG* rng = (RNG*)TclObject::lookup(argv[6]);
  208. return(new PackMimeHTTPXmitRandomVariable ((double) 
  209.    atof(argv[4]), 
  210.    atoi(argv[5]),
  211.    rng));
  212. } else {
  213. return(new PackMimeHTTPXmitRandomVariable());
  214. }
  215. }
  216. } class_packmimexmitranvar;
  217. PackMimeHTTPXmitRandomVariable::PackMimeHTTPXmitRandomVariable() : 
  218. fARIMA_(NULL)
  219. {
  220. bind ("rate_", &rate_);
  221. bind ("type_", &type_);
  222. bind ("mean_", &mean_);
  223. bind ("const_", &const_);
  224. }
  225. PackMimeHTTPXmitRandomVariable::PackMimeHTTPXmitRandomVariable(double rate, 
  226.        int type) :
  227. rate_(rate), type_(type), const_(-1), mean_(-1), fARIMA_(NULL)
  228. {
  229. }
  230. PackMimeHTTPXmitRandomVariable::PackMimeHTTPXmitRandomVariable(double rate, 
  231.        int type, 
  232.        RNG* rng) :
  233.    rate_(rate), type_(type), const_(-1), mean_(-1), fARIMA_(NULL)
  234. {
  235. rng_ = rng;
  236. }
  237. PackMimeHTTPXmitRandomVariable::~PackMimeHTTPXmitRandomVariable() {
  238. if (fARIMA_)
  239. delete fARIMA_;
  240. }
  241. void PackMimeHTTPXmitRandomVariable::initialize() 
  242. {
  243. double sigmaTotal;
  244. struct arima_params * arima = & rtt_arima_params[type_];
  245. double d = arima->d;
  246.   
  247. assert(arima->N >= arima->qMA);
  248. varRatio_ = rng_->logitinv(arima->varRatioParam0 + 
  249.    arima->varRatioParam1 * log(rate_) / LOG2);
  250. sigmaTotal = 1.0;
  251. sigmaNoise_ = sigmaTotal * pow(varRatio_, 0.5);
  252. sigmaEpsilon_ = sigmaTotal * 
  253. pow(exp(2.0*rng_->gammln(1.0-d) - rng_->gammln(1.0-2.0*d)) 
  254.     / (2+2*d/(1-d)) * (1-varRatio_), 0.5);
  255. fARIMA_ = new FARIMA(rng_, arima->d, arima->N);
  256. }
  257. /* generate RTT according to the marginal distribution */
  258. double PackMimeHTTPXmitRandomVariable::value(void) {
  259. double yt, p;
  260.     
  261. if (fARIMA_ == NULL)
  262. initialize();
  263. yt = fARIMA_->Next();
  264. yt = yt * sigmaEpsilon_ + rng_->rnorm() * sigmaNoise_;
  265. p = rng_->pnorm(yt);
  266. p = -log(1-p)/log(10.0);
  267. yt = rtt_invcdf[type_].LinearInterpolate(p);
  268. yt = pow(yt, WEIBULL_SHAPE[type_]);
  269. // split in half for DelayBox -M. Weigle 9/17/01
  270. if (mean_ < 0)
  271. return(yt/2);
  272. else {
  273. if (const_ <0)
  274. const_ = mean_/avg();
  275. return(yt/2*const_);
  276. }
  277. double PackMimeHTTPXmitRandomVariable::avg(void) {
  278. if (type_)
  279. return 0.027;
  280. else
  281. return 0.058;
  282. }
  283. const double PackMimeHTTPXmitRandomVariable::SHORT_RTT_INVCDF_X[] = { 
  284. 0.00, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 
  285. 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 3.25, 
  286. 3.50, 3.75, 4.00, 4.25, 4.50, 4.75, 5.00, 
  287. 5.30103
  288. };
  289. const double PackMimeHTTPXmitRandomVariable::SHORT_RTT_INVCDF_Y[] = {
  290. 0.87741, 1.07293, 1.10812, 1.86701, 2.04735, 2.30645, 2.90111, 
  291. 3.30185, 3.59297, 3.87927, 4.02239, 4.17551, 4.32119, 4.43112, 
  292. 4.57079, 4.66087, 4.73359, 4.78683, 4.84591, 4.91282, 4.95503, 
  293. 5.01453
  294. };
  295. const double PackMimeHTTPXmitRandomVariable::LONG_RTT_INVCDF_X[]={ 
  296. 0.00, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50,  
  297. 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 4.00
  298. };
  299. const double PackMimeHTTPXmitRandomVariable::LONG_RTT_INVCDF_Y[]={
  300. 0.79105, 3.71848, 4.46097, 4.49838, 4.84954, 5.78215, 6.77357, 
  301. 7.78683, 8.75032, 10.3434, 11.4477, 14.0272, 14.6139, 17.2251
  302. };
  303. struct arima_params PackMimeHTTPXmitRandomVariable::rtt_arima_params[] = {
  304. { 0.31,    /* d */
  305.   1000,    /* number of finite AR rep of farima */
  306.   -0.445,  /* varRatioParam0 */
  307.   0.554,   /* varRatioParam1 */
  308.   0, 1     /* pAR=0, qMA */
  309. },
  310. { 0.32,    /* d */
  311.   1000,    /* number of finite AR rep of farima */
  312.   -0.053,  /* varRatioParam0 */
  313.   0.396,   /* varRatioParam1 */
  314.   0, 1     /* pAR=0, qMA */
  315. }
  316. };
  317. FX PackMimeHTTPXmitRandomVariable::rtt_invcdf[2] = {
  318. FX (SHORT_RTT_INVCDF_X, SHORT_RTT_INVCDF_Y, 
  319.     sizeof (SHORT_RTT_INVCDF_X) / sizeof(double)),
  320. FX (LONG_RTT_INVCDF_X, LONG_RTT_INVCDF_Y, 
  321.     sizeof (LONG_RTT_INVCDF_X) / sizeof(double))
  322. };
  323. const double PackMimeHTTPXmitRandomVariable::WEIBULL_SHAPE[2] = { 5, 3 };
  324. /*:::::::::::::::::::::: PackMimeHTTP Flow Arrival RanVar ::::::::::::::::::::::*/
  325. /**
  326.  * This random variable includes both flow interarrivals for non-persistent
  327.  * connections and persistent connections.  This RV is sampled during
  328.  * connection setup.  It will return an array of interarrivals.  The first
  329.  * element in the array wil be the number of requests in this connection.  If
  330.  * the number of elements is 1, then the connection is non-persistent.  If the
  331.  * number of elements is > 1, then the connection is persistent.  
  332.  */
  333. static class PackMimeHTTPFlowArriveRandomVariableClass : public TclClass {
  334. public:
  335. PackMimeHTTPFlowArriveRandomVariableClass() : 
  336. TclClass("RandomVariable/PackMimeHTTPFlowArrive"){}
  337. TclObject* create(int argc, const char*const* argv) {
  338. if (argc == 5) {
  339. // rate
  340. return(new PackMimeHTTPFlowArriveRandomVariable 
  341.        ((double) atof(argv[4])));
  342. } else if (argc == 6) {
  343. // rate, RNG
  344. RNG* rng = (RNG*)TclObject::lookup(argv[5]);
  345. return(new PackMimeHTTPFlowArriveRandomVariable ((double) 
  346.  atof(argv[4]), 
  347.  rng));
  348. } else {
  349. return(new PackMimeHTTPFlowArriveRandomVariable());
  350. }
  351. }
  352. } class_packmimeflowarriveranvar;
  353. PackMimeHTTPFlowArriveRandomVariable::PackMimeHTTPFlowArriveRandomVariable() : 
  354. const_(1), mean_(0), fARIMA_(NULL)
  355. {
  356. bind ("rate_", &rate_);
  357. }
  358. PackMimeHTTPFlowArriveRandomVariable::PackMimeHTTPFlowArriveRandomVariable(double rate) :
  359. rate_(rate), const_(1), mean_(0), fARIMA_(NULL)
  360. {
  361. }
  362. PackMimeHTTPFlowArriveRandomVariable::PackMimeHTTPFlowArriveRandomVariable(double rate, 
  363.    RNG* rng) :
  364. rate_(rate), const_(1), mean_(0), fARIMA_(NULL)
  365. {
  366. rng_ = rng;
  367. }
  368. PackMimeHTTPFlowArriveRandomVariable::~PackMimeHTTPFlowArriveRandomVariable() 
  369. {
  370. if (fARIMA_)
  371. delete fARIMA_;
  372. }
  373. void PackMimeHTTPFlowArriveRandomVariable::initialize() {
  374. double sigmaTotal;
  375. struct arima_params *arima = &flowarrive_arima_params;
  376. double d = arima->d;
  377. int N = arima->N;
  378. // New model Added by Y. Gao June 2003
  379. d = 0.33;
  380. varRatio_ = rng_->logitinv(0.333+0.414*log(rate_)/LOG2); 
  381. sigmaTotal = 1.0;
  382. sigmaNoise_ = sigmaTotal * pow(varRatio_,0.5);
  383. sigmaEpsilon_ = sigmaTotal * pow (exp (2.0 * rng_->gammln(1.0-d) - 
  384.        rng_->gammln(1.0-2.0*d)) / 
  385.   (2+2*d/(1-d)) * (1-varRatio_), 0.5);
  386. weibullShape_ = rng_->logitinv(0.352+0.388*log(rate_)/LOG2);
  387. weibullScale_ = 1.0 / (rate_ * exp(rng_->gammln(1+1.0/weibullShape_)));
  388. fARIMA_ = new FARIMA(rng_, d, N);
  389. }
  390. double PackMimeHTTPFlowArriveRandomVariable::avg(void) {
  391. return 4.3018;
  392. }
  393. double PackMimeHTTPFlowArriveRandomVariable::avg(int gap_type_) {
  394. if (gap_type_ == 0) {
  395. return 0.0262;
  396. }
  397. else {
  398. return 3.32;
  399. }
  400. }
  401. /* generate flow rate according to the marginal distribution */
  402. double PackMimeHTTPFlowArriveRandomVariable::value(void) {
  403. double yt;
  404. if (fARIMA_ == NULL) 
  405. initialize();
  406. yt = fARIMA_->Next();
  407. yt = yt * sigmaEpsilon_ + rng_->rnorm() * sigmaNoise_;
  408. yt = rng_->qweibull(rng_->pnorm(yt), weibullShape_, weibullScale_);
  409. // adjust by const_ and mean_ (by default, this does nothing)
  410. if (const_ == 0) {
  411. const_ = mean_ / avg(1);
  412. }
  413. return(yt * const_);
  414. }
  415. struct arima_params PackMimeHTTPFlowArriveRandomVariable::flowarrive_arima_params =
  416. {
  417. 0.35,       /* d */
  418. 1000,       /* number of finite AR rep of farima */
  419. -1.2811,    /* varRatioParam0 */
  420. -0.3150,    /* varRatioParam1 */
  421. 0, 1        /* pAR=0, qMA */
  422. };
  423. /*:::::::::::::::::::::: PackMimeHTTP File Size RanVar :::::::::::::::::::::*/
  424. static class PackMimeHTTPFileSizeRandomVariableClass : public TclClass {
  425. public:
  426. PackMimeHTTPFileSizeRandomVariableClass() : 
  427.   TclClass("RandomVariable/PackMimeHTTPFileSize"){}
  428. TclObject* create(int argc, const char*const* argv) {
  429. if (argc == 6) {
  430.   // rate, type
  431.   return(new PackMimeHTTPFileSizeRandomVariable 
  432.  ((double) atof(argv[4]), atoi(argv[5])));
  433. } else if (argc == 7) {
  434.   // rate, type, RNG
  435.   RNG* rng = (RNG*)TclObject::lookup(argv[6]);
  436.   return(new PackMimeHTTPFileSizeRandomVariable ((double) 
  437.        atof(argv[4]), 
  438.        atoi(argv[5]),
  439.        rng));
  440. } else {
  441. return(new PackMimeHTTPFileSizeRandomVariable());
  442. }
  443.  }
  444. } class_packmimefilesizeranvar;
  445. PackMimeHTTPFileSizeRandomVariable::PackMimeHTTPFileSizeRandomVariable() : 
  446.   const_(1), mean_(0), fARIMA_(NULL)
  447. {
  448. bind ("rate_", &rate_);
  449. bind ("type_", &type_);
  450. }
  451. PackMimeHTTPFileSizeRandomVariable::PackMimeHTTPFileSizeRandomVariable(double rate, int type) :
  452.   rate_(rate), type_(type), const_(1), mean_(0), fARIMA_(NULL)
  453. {
  454. }
  455. PackMimeHTTPFileSizeRandomVariable::PackMimeHTTPFileSizeRandomVariable(double rate, int type, RNG* rng) :
  456.   rate_(rate), type_(type), const_(1), mean_(0), fARIMA_(NULL)
  457. {
  458. rng_ = rng;
  459. }
  460. PackMimeHTTPFileSizeRandomVariable::~PackMimeHTTPFileSizeRandomVariable() 
  461. {
  462. if (fARIMA_)
  463. delete fARIMA_;
  464. }
  465. void PackMimeHTTPFileSizeRandomVariable::initialize() 
  466. {
  467. double sigmaTotal;
  468. struct arima_params *arima = &filesize_arima_params;
  469. double d = arima->d;
  470. int N = arima->N;
  471.  
  472. /* fsize0 run length */
  473. state_ = 0;
  474. runlen_ = 0;
  475. /* fsize1 */
  476. sigmaTotal = 1.0;
  477. varRatio_ = rng_->logitinv(FSIZE1_VARRATIO_INTERCEPT + 
  478.    FSIZE1_VARRATIO_SLOPE * log(rate_)/LOG2);
  479. sigmaNoise_ = sigmaTotal * pow(varRatio_,0.5);
  480. sigmaEpsilon_ = sigmaTotal * 
  481. pow(exp (2.0 * rng_->gammln(1.0-d) - 
  482.  rng_->gammln(1.0-2.0*d)) / 
  483.     (2+2*d/(1-d)) * (1-varRatio_), 0.5);
  484. /* fsize0 runlen */
  485. shape_[0] = rng_->logitinv(0.718+0.357*log(rate_)/LOG2);
  486. shape_[1] = rng_->logitinv(1.293+0.316*log(rate_)/LOG2);
  487. scale_[0] = 0.775;
  488. scale_[1] = 3.11;
  489. /* simulate */
  490. fARIMA_ = new FARIMA(rng_, d, N);
  491. }
  492. /** random generate the marginal distribution of fsize0 depending
  493.  *  on whether it is a cache validation (0) or downloaded file (1).
  494.  */
  495. int PackMimeHTTPFileSizeRandomVariable::rfsize0(int state)
  496. {
  497. double yt, p;
  498.   
  499. p = rng_->uniform();
  500. if (state==1) 
  501. p = log(1-p)/LOG2; 
  502. yt = fsize_invcdf[0][state].LinearInterpolate(p);
  503. if (state==1) 
  504. yt = exp(LOG2*yt); 
  505. return((int) yt);
  506. }
  507. /* given a probability, find the corresponding quantile of fsize1. */
  508. int PackMimeHTTPFileSizeRandomVariable::qfsize1(double p)
  509. {
  510. int state;
  511. double yt;
  512. /* first convert this to conditional probablity */
  513. if(p > FSIZE1_PROB_A){
  514. state = 1; 
  515. p = (p-FSIZE1_PROB_A)/(1-FSIZE1_PROB_A);
  516. }else {
  517. state = 0;
  518. p = p/FSIZE1_PROB_A;
  519. }
  520. if (state==1) 
  521. p=log(1-p)/LOG2;
  522. yt = fsize_invcdf[1][state].LinearInterpolate(p);
  523. if (state==1) 
  524. yt=exp(LOG2*yt); 
  525. return((int) yt);
  526. }
  527. double PackMimeHTTPFileSizeRandomVariable::avg(void) {
  528. if (type_ == PACKMIME_RSP_SIZE) {
  529. return 2272;
  530. }
  531. else {
  532. return 423;
  533. }
  534. }
  535. /* obtain the next server file size */
  536. double PackMimeHTTPFileSizeRandomVariable::value() 
  537. {
  538. int yt;
  539. if (fARIMA_ == NULL)
  540. initialize();
  541. if (type_ == PACKMIME_RSP_SIZE) {
  542. /* regenerate the runlen if a run is finished */
  543. if (runlen_ <= 0) { // XXX Y. G. changed to <= from ==
  544. state_ = 1-state_;
  545. runlen_ = (int) ceil(rng_->rweibull(shape_[state_], 
  546.     scale_[state_]));
  547. }
  548. yt = rfsize0(state_); 
  549. runlen_--;
  550. // adjust by const_ and mean_ (by default, this does nothing)
  551. if (const_ == 0) {
  552. const_ = mean_ / avg();
  553. }
  554. return (double) (yt * const_);
  555. } else if (type_ == PACKMIME_REQ_SIZE) {
  556. double yx;
  557. yx = fARIMA_->Next();
  558. yx = yx * sigmaEpsilon_ + rng_->rnorm() * sigmaNoise_;
  559. yt = qfsize1(rng_->pnorm(yx));
  560. // adjust by const_ and mean_ (by default, this does nothing)
  561. if (const_ == 0) {
  562. const_ = mean_ / avg();
  563. }
  564. return (double) (yt * const_);
  565. }
  566. return 0;
  567. }
  568. /* fitted inverse cdf curves for file sizes  */
  569. const double PackMimeHTTPFileSizeRandomVariable::FSIZE0_INVCDF_A_X[]={ 
  570. 1e-04, 0.0102, 0.0203, 0.0304, 0.0405, 0.0506, 0.0607, 0.0708, 
  571. 0.0809, 0.091, 0.1011, 0.1112, 0.1213, 0.1314, 0.1415, 0.1516, 
  572. 0.1617, 0.1718, 0.1819, 0.192, 0.2021, 0.2122, 0.2223, 0.2324, 
  573. 0.2425, 0.2526, 0.2627, 0.2728, 0.2829, 0.293, 0.3031, 0.3132, 
  574. 0.3233, 0.3334, 0.3435, 0.3536, 0.3637, 0.3738, 0.3839, 0.394, 
  575. 0.4041, 0.4142, 0.4243, 0.4344, 0.4445, 0.4546, 0.4647, 0.4748, 
  576. 0.4849, 0.495, 0.5051, 0.5152, 0.5253, 0.5354, 0.5455, 0.5556, 
  577. 0.5657, 0.5758, 0.5859, 0.596, 0.6061, 0.6162, 0.6263, 0.6364, 
  578. 0.64649, 0.65659, 0.66669, 0.67679, 0.68689, 0.69699, 0.70709, 
  579. 0.71719, 0.72729, 0.73739, 0.74749, 0.75759, 0.76769, 0.77779, 
  580. 0.78789, 0.79799, 0.80809, 0.81819, 0.82829, 0.83839, 0.84849, 
  581. 0.85859, 0.86869, 0.87879, 0.88889, 0.89899, 0.90909, 0.91919, 
  582. 0.92929, 0.93939, 0.94949, 0.95959, 0.96969, 0.97979, 0.98989, 
  583. 0.99999
  584. }; 
  585. const double PackMimeHTTPFileSizeRandomVariable::FSIZE0_INVCDF_A_Y[]={ 
  586. 4.645, 22.7357, 40.8041, 53.0108, 61.468, 64.4307, 67.3933, 69.6925, 
  587. 71.3981, 73.1037, 74.8092, 80.6677, 87.4875, 93.5693, 97.6514, 
  588. 101.249, 104.58, 107.021, 109.195, 111.087, 112.752, 114.273, 
  589. 115.545, 116.78, 118.014, 119.248, 120.483, 121.551, 122.51, 123.441, 
  590. 124.312, 125.119, 125.927, 126.734, 127.524, 128.288, 129.053, 
  591. 129.818, 130.582, 131.347, 132.143, 132.973, 133.835, 134.71, 
  592. 135.603, 136.537, 137.47, 138.404, 139.337, 140.28, 141.233, 142.186, 
  593. 143.139, 144.092, 145.045, 145.979, 146.904, 147.816, 148.71, 
  594. 149.589, 150.485, 151.478, 152.703, 153.928, 155.403, 157.294, 
  595. 159.389, 161.953, 165.018, 168.54, 172.7, 177.629, 183.365, 189.766, 
  596. 195.845, 200.636, 203.987, 206.43, 208.611, 211.114, 214.424, 
  597. 218.008, 221.925, 225.722, 229.242, 232.747, 236.235, 239.952, 
  598. 244.076, 248.68, 253.434, 257.857, 261.539, 264.471, 266.742, 
  599. 268.487, 269.793, 270.794, 271.571, 272.234
  600. }; 
  601. const double PackMimeHTTPFileSizeRandomVariable::FSIZE0_INVCDF_B_X[]={ 
  602. -18.1793, -17.9957, -17.8121, -17.6285, -17.4449, -17.2613, -17.0777, 
  603. -16.8941, -16.7104, -16.5268, -16.3432, -16.1596, -15.976, -15.7924, 
  604. -15.6088, -15.4252, -15.2415, -15.0579, -14.8743, -14.6907, -14.5071, 
  605. -14.3235, -14.1399, -13.9563, -13.7726, -13.589, -13.4054, -13.2218, 
  606. -13.0382, -12.8546, -12.671, -12.4874, -12.3038, -12.1201, -11.9365, 
  607. -11.7529, -11.5693, -11.3857, -11.2021, -11.0185, -10.8349, -10.6513, 
  608. -10.4677, -10.284, -10.1004, -9.91682, -9.7332, -9.54959, -9.36598, 
  609. -9.18237, -8.99876, -8.81515, -8.63154, -8.44792, -8.26431, -8.0807, 
  610. -7.89709, -7.71348, -7.52987, -7.34626, -7.16265, -6.97903, -6.79542, 
  611. -6.61181, -6.4282, -6.24459, -6.06098, -5.87737, -5.69376, -5.51014, 
  612. -5.32653, -5.14292, -4.95931, -4.7757, -4.59209, -4.40848, -4.22486, 
  613. -4.04125, -3.85764, -3.67403, -3.49042, -3.30681, -3.1232, -2.93959, 
  614. -2.75597, -2.57236, -2.38875, -2.20514, -2.02153, -1.83792, -1.65431, 
  615. -1.47069, -1.28708, -1.10347, -0.91986, -0.73625, -0.55264, -0.36903, 
  616. -0.18542, -0.0018
  617. }; 
  618. const double PackMimeHTTPFileSizeRandomVariable::FSIZE0_INVCDF_B_Y[]={ 
  619. 25.8765, 25.7274, 25.5782, 25.4291, 25.2799, 25.1308, 24.9817, 
  620. 24.8325, 24.6834, 24.5342, 24.3851, 24.2359, 24.0868, 23.9377, 
  621. 23.7885, 23.6394, 23.4902, 23.3411, 23.1919, 23.0428, 22.8937, 
  622. 22.7445, 22.5954, 22.4462, 22.2971, 22.1479, 21.9988, 21.8497, 
  623. 21.7005, 21.5514, 21.4022, 21.2531, 21.104, 20.9548, 20.8057, 
  624. 20.6565, 20.5074, 20.3582, 20.2091, 20.06, 19.9108, 19.7617, 19.6125, 
  625. 19.4634, 19.3143, 19.1651, 19.016, 18.8668, 18.7177, 18.5685, 
  626. 18.4194, 18.2703, 18.1211, 17.972, 17.8228, 17.6737, 17.5245, 
  627. 17.3754, 17.2263, 17.0771, 16.928, 16.7788, 16.6297, 16.4806, 
  628. 16.3314, 16.1823, 16.0331, 15.8842, 15.739, 15.6026, 15.4804, 
  629. 15.3778, 15.3003, 15.2465, 15.2045, 15.1597, 15.0978, 15.0044, 
  630. 14.8675, 14.6932, 14.4968, 14.2932, 14.0976, 13.9248, 13.7783, 
  631. 13.6435, 13.5042, 13.3444, 13.1478, 12.9005, 12.6008, 12.2512, 
  632. 11.8545, 11.4133, 10.9303, 10.4104, 9.86075, 9.28886, 8.70213, 
  633. 8.10797
  634. }; 
  635. const double PackMimeHTTPFileSizeRandomVariable::FSIZE1_INVCDF_A_X[]={ 
  636. 3e-05, 0.01013, 0.02023, 0.03033, 0.04043, 0.05053, 0.06063, 0.07074, 
  637. 0.08084, 0.09094, 0.10104, 0.11114, 0.12124, 0.13134, 0.14144, 
  638. 0.15154, 0.16164, 0.17174, 0.18184, 0.19194, 0.20204, 0.21214, 
  639. 0.22225, 0.23235, 0.24245, 0.25255, 0.26265, 0.27275, 0.28285, 
  640. 0.29295, 0.30305, 0.31315, 0.32325, 0.33335, 0.34345, 0.35355, 
  641. 0.36365, 0.37376, 0.38386, 0.39396, 0.40406, 0.41416, 0.42426, 
  642. 0.43436, 0.44446, 0.45456, 0.46466, 0.47476, 0.48486, 0.49496, 
  643. 0.50506, 0.51516, 0.52526, 0.53537, 0.54547, 0.55557, 0.56567, 
  644. 0.57577, 0.58587, 0.59597, 0.60607, 0.61617, 0.62627, 0.63637, 
  645. 0.64647, 0.65657, 0.66667, 0.67677, 0.68688, 0.69698, 0.70708, 
  646. 0.71718, 0.72728, 0.73738, 0.74748, 0.75758, 0.76768, 0.77778, 
  647. 0.78788, 0.79798, 0.80808, 0.81818, 0.82828, 0.83839, 0.84849, 
  648. 0.85859, 0.86869, 0.87879, 0.88889, 0.89899, 0.90909, 0.91919, 
  649. 0.92929, 0.93939, 0.94949, 0.95959, 0.96969, 0.97979, 0.98989, 1
  650. }; 
  651. const double PackMimeHTTPFileSizeRandomVariable::FSIZE1_INVCDF_A_Y[]={ 
  652. 50.9777, 93.8217, 123.301, 146.594, 168.813, 184.263, 193.95, 
  653. 200.037, 204.696, 210.069, 217.623, 226.668, 236.226, 245.269, 
  654. 253.057, 259.624, 265.16, 269.811, 273.754, 277.165, 280.193, 
  655. 283.062, 285.893, 288.79, 291.744, 294.738, 297.754, 300.776, 
  656. 303.784, 306.763, 309.698, 312.564, 315.349, 318.042, 320.624, 
  657. 323.107, 325.49, 327.782, 329.987, 332.11, 334.159, 336.135, 338.047, 
  658. 339.898, 341.695, 343.443, 345.145, 346.808, 348.439, 350.04, 
  659. 351.619, 353.177, 354.716, 356.239, 357.744, 359.233, 360.709, 
  660. 362.17, 363.619, 365.056, 366.483, 367.9, 369.31, 370.711, 372.106, 
  661. 373.496, 374.881, 376.263, 377.643, 379.021, 380.399, 381.778, 
  662. 383.159, 384.542, 385.929, 387.321, 388.719, 390.121, 391.528, 
  663. 392.939, 394.355, 395.775, 397.199, 398.626, 400.057, 401.491, 
  664. 402.928, 404.368, 405.81, 407.255, 408.702, 410.151, 411.602, 
  665. 413.054, 414.508, 415.963, 417.418, 418.874, 420.331, 421.788
  666. }; 
  667. const double PackMimeHTTPFileSizeRandomVariable::FSIZE1_INVCDF_B_X[]={ 
  668. -17.7791, -17.5996, -17.4201, -17.2406, -17.0611, -16.8816, -16.7021, 
  669. -16.5226, -16.3431, -16.1635, -15.984, -15.8045, -15.625, -15.4455, 
  670. -15.266, -15.0865, -14.907, -14.7275, -14.548, -14.3685, -14.189, 
  671. -14.0095, -13.83, -13.6505, -13.471, -13.2915, -13.112, -12.9325, 
  672. -12.753, -12.5735, -12.394, -12.2145, -12.035, -11.8555, -11.676, 
  673. -11.4965, -11.317, -11.1375, -10.958, -10.7785, -10.599, -10.4194, 
  674. -10.24, -10.0604, -9.88094, -9.70144, -9.52193, -9.34243, -9.16293, 
  675. -8.98342, -8.80392, -8.62442, -8.44491, -8.26541, -8.08591, -7.9064, 
  676. -7.7269, -7.5474, -7.3679, -7.18839, -7.00889, -6.82939, -6.64988, 
  677. -6.47038, -6.29088, -6.11137, -5.93187, -5.75237, -5.57286, -5.39336, 
  678. -5.21386, -5.03435, -4.85485, -4.67535, -4.49584, -4.31634, -4.13684, 
  679. -3.95733, -3.77783, -3.59833, -3.41883, -3.23932, -3.05982, -2.88032, 
  680. -2.70081, -2.52131, -2.34181, -2.1623, -1.9828, -1.8033, -1.62379, 
  681. -1.44429, -1.26479, -1.08528, -0.90578, -0.72628, -0.54678, -0.36727, 
  682. -0.18777, -0.00827
  683. }; 
  684. const double PackMimeHTTPFileSizeRandomVariable::FSIZE1_INVCDF_B_Y[]={ 
  685. 19.7578, 19.6369, 19.5159, 19.3949, 19.274, 19.153, 19.032, 18.9111, 
  686. 18.7901, 18.6691, 18.5482, 18.4272, 18.3063, 18.1853, 18.0643, 
  687. 17.9434, 17.8224, 17.7014, 17.5805, 17.4595, 17.3386, 17.2176, 
  688. 17.0966, 16.9757, 16.8547, 16.7337, 16.6128, 16.4918, 16.3708, 
  689. 16.2499, 16.1289, 16.0079, 15.887, 15.766, 15.6451, 15.5241, 15.4031, 
  690. 15.2822, 15.1612, 15.0402, 14.9193, 14.7983, 14.6774, 14.5564, 
  691. 14.4354, 14.3145, 14.1935, 14.0725, 13.9516, 13.8306, 13.7096, 
  692. 13.5887, 13.4677, 13.3468, 13.2258, 13.1048, 12.9839, 12.8629, 
  693. 12.7419, 12.621, 12.5, 12.3791, 12.2581, 12.1371, 12.0162, 11.8952, 
  694. 11.7742, 11.6533, 11.5323, 11.4113, 11.2904, 11.1694, 11.0485, 
  695. 10.9275, 10.8065, 10.6856, 10.5646, 10.4436, 10.3239, 10.2092, 
  696. 10.1034, 10.0105, 9.93459, 9.87896, 9.8393, 9.80562, 9.76884, 
  697. 9.71919, 9.64712, 9.54737, 9.42776, 9.29852, 9.16992, 9.05219, 
  698. 8.95525, 8.88155, 8.82669, 8.78593, 8.75459, 8.72795
  699. };
  700. const double PackMimeHTTPFileSizeRandomVariable:: FSIZE1_PROB_A=0.5;
  701. const double PackMimeHTTPFileSizeRandomVariable:: FSIZE1_D=0.31;
  702. const double PackMimeHTTPFileSizeRandomVariable:: FSIZE1_VARRATIO_INTERCEPT=0.123;
  703. const double PackMimeHTTPFileSizeRandomVariable:: FSIZE1_VARRATIO_SLOPE=0.494;
  704. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSCALECACHERUN = 1.1341;
  705. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSHAPECACHERUN_ASYMPTOE = 0.82;
  706. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSHAPECACHERUN_PARA1 = 0.6496;
  707. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSHAPECACHERUN_PARA2 = 0.0150;
  708. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSHAPECACHERUN_PARA3 = 1.5837;
  709. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSCALEDOWNLOADRUN = 3.0059;
  710. const double PackMimeHTTPFileSizeRandomVariable:: WEIBULLSHAPEDOWNLOADRUN = 0.82;
  711. const double PackMimeHTTPFileSizeRandomVariable::FSIZE0_PARA[] = {
  712. WEIBULLSHAPECACHERUN_ASYMPTOE,
  713. WEIBULLSHAPECACHERUN_PARA1,
  714. WEIBULLSHAPECACHERUN_PARA2,
  715. WEIBULLSHAPECACHERUN_PARA3
  716. };
  717. const double* PackMimeHTTPFileSizeRandomVariable::P = FSIZE0_PARA;
  718. const int PackMimeHTTPFileSizeRandomVariable::FSIZE0_CACHE_CUTOFF=275; 
  719. const int PackMimeHTTPFileSizeRandomVariable::FSIZE0_STRETCH_THRES=400;
  720. const double PackMimeHTTPFileSizeRandomVariable:: M_FSIZE0_NOTCACHE = 10.50;
  721. const double PackMimeHTTPFileSizeRandomVariable:: V_FSIZE0_NOTCACHE = 3.23; 
  722. const double PackMimeHTTPFileSizeRandomVariable:: M_LOC = 10.62;      
  723. const double PackMimeHTTPFileSizeRandomVariable:: V_LOC = 0.94;       
  724. const double PackMimeHTTPFileSizeRandomVariable:: SHAPE_SCALE2 = 3.22;
  725. const double PackMimeHTTPFileSizeRandomVariable:: RATE_SCALE2 = 3.22; 
  726. const double PackMimeHTTPFileSizeRandomVariable:: V_ERROR = 2.43;
  727. struct arima_params PackMimeHTTPFileSizeRandomVariable::filesize_arima_params  = {
  728. FSIZE1_D,   /* d */
  729. 5000,       /* number of finite AR rep of farima */
  730. 0,          /* varRatioParam0 */
  731. 0,          /* varRatioParam1 */
  732. 0, 1        /* pAR=0, qMA */
  733. };
  734. FX PackMimeHTTPFileSizeRandomVariable::fsize_invcdf[2][2] = {
  735. { FX(FSIZE0_INVCDF_A_X, FSIZE0_INVCDF_A_Y, 
  736.      sizeof(FSIZE0_INVCDF_A_X)/sizeof(double)), 
  737.   FX(FSIZE0_INVCDF_B_X, FSIZE0_INVCDF_B_Y,
  738.      sizeof(FSIZE0_INVCDF_B_X)/sizeof(double))
  739. },
  740. { FX(FSIZE1_INVCDF_A_X, FSIZE1_INVCDF_A_Y,
  741.      sizeof(FSIZE1_INVCDF_A_X)/sizeof(double)),
  742.   FX(FSIZE1_INVCDF_B_X, FSIZE1_INVCDF_B_Y,
  743.      sizeof(FSIZE1_INVCDF_B_X)/sizeof(double))
  744. }
  745. };
  746. /*:::::::::::::::::::::: PackMimeHTTP Persistent Response Size RanVar ::::::::::::::::::*/
  747. static class PackMimeHTTPPersistRspSizeRandomVariableClass : public TclClass {
  748. public:
  749. PackMimeHTTPPersistRspSizeRandomVariableClass() : 
  750. TclClass("RandomVariable/PackMimeHTTPPersistRspSize"){}
  751. TclObject* create(int argc, const char*const* argv) {
  752. return(new PackMimeHTTPPersistRspSizeRandomVariable());
  753. }
  754. } class_packmimepersistrspsizeranvar;
  755. PackMimeHTTPPersistRspSizeRandomVariable::PackMimeHTTPPersistRspSizeRandomVariable() : 
  756. loc_(-1), scale_(-1)
  757. {
  758. rng_ = new RNG();
  759. }
  760. PackMimeHTTPPersistRspSizeRandomVariable::PackMimeHTTPPersistRspSizeRandomVariable(RNG* rng) : 
  761. loc_(-1), scale_(-1)
  762. {
  763. rng_ = rng;
  764. }
  765. PackMimeHTTPPersistRspSizeRandomVariable::~PackMimeHTTPPersistRspSizeRandomVariable() 
  766. {
  767. if (rng_)
  768. delete rng_;
  769. }
  770. double PackMimeHTTPPersistRspSizeRandomVariable::value()
  771. {
  772. double interrand;
  773. double interres; 
  774. if (loc_ == -1 || scale_ == -1) {
  775. loc_ = rng_->rnorm() * sqrt(V_LOC) + M_LOC;
  776. scale_ = rng_->rgamma(SHAPE_SCALE2, 1/RATE_SCALE2);
  777. }
  778. interrand = rng_->rnorm();
  779. interres = loc_ + sqrt(scale_) * interrand * sqrt(V_ERROR);  
  780. return pow(2.0, interres);
  781. }
  782. double PackMimeHTTPPersistRspSizeRandomVariable::avg()
  783. {
  784. return 0;
  785. }
  786. const int PackMimeHTTPPersistRspSizeRandomVariable::FSIZE_CACHE_CUTOFF=275; 
  787. const double PackMimeHTTPPersistRspSizeRandomVariable::M_LOC = 10.62;
  788. const double PackMimeHTTPPersistRspSizeRandomVariable::V_LOC = 0.94;
  789. const double PackMimeHTTPPersistRspSizeRandomVariable::SHAPE_SCALE2 = 3.22;
  790. const double PackMimeHTTPPersistRspSizeRandomVariable::RATE_SCALE2 = 3.22;
  791. const double PackMimeHTTPPersistRspSizeRandomVariable::V_ERROR = 2.43;
  792. /*:::::::::::::::::::::: PackMimeHTTP Persistent RanVar :::::::::::::::::::::::::*/
  793. static class PackMimeHTTPPersistentRandomVariableClass : public TclClass {
  794. public:
  795. PackMimeHTTPPersistentRandomVariableClass() : 
  796. TclClass("RandomVariable/PackMimeHTTPPersistent"){}
  797. TclObject* create(int argc, const char*const* argv) {
  798. if (argc == 5) {
  799. // probability
  800. return(new PackMimeHTTPPersistentRandomVariable 
  801.        ((double) atof(argv[4])));
  802. } else if (argc == 6) {
  803. // probability, RNG
  804. RNG* rng = (RNG*)TclObject::lookup(argv[5]);
  805. return(new PackMimeHTTPPersistentRandomVariable ((double) 
  806.  atof(argv[4]), 
  807.  rng));
  808. } else {
  809. return(new PackMimeHTTPPersistentRandomVariable());
  810. }
  811. }
  812. } class_packmimepersistentranvar;
  813. PackMimeHTTPPersistentRandomVariable::PackMimeHTTPPersistentRandomVariable()
  814. {
  815. bind ("probability_", &probability_);
  816. }
  817. PackMimeHTTPPersistentRandomVariable::PackMimeHTTPPersistentRandomVariable(double prob) :
  818. probability_(prob)
  819. {
  820. }
  821. PackMimeHTTPPersistentRandomVariable::PackMimeHTTPPersistentRandomVariable(double prob, 
  822.    RNG* rng) :
  823. probability_(prob)
  824. {
  825. rng_ = rng;
  826. }
  827. double PackMimeHTTPPersistentRandomVariable::value(void)
  828. {
  829. return ((double) rng_->rbernoulli (probability_));
  830. }
  831. const double PackMimeHTTPPersistentRandomVariable::P_PERSISTENT = 0.09;
  832. /*:::::::::::::::::::::: PackMimeHTTP Num Pages RanVar :::::::::::::::::::::::::*/
  833. static class PackMimeHTTPNumPagesRandomVariableClass : public TclClass {
  834. public:
  835. PackMimeHTTPNumPagesRandomVariableClass() : 
  836. TclClass("RandomVariable/PackMimeHTTPNumPages"){}
  837. TclObject* create(int argc, const char*const* argv) {
  838. if (argc == 7) {
  839. // probability, shape, scale
  840. return(new PackMimeHTTPNumPagesRandomVariable 
  841.        ((double) atof(argv[4]), (double) atof(argv[5]), 
  842. (double) atof(argv[6])));
  843. } else if (argc == 8) {
  844. // probability, shape, scale, RNG
  845. RNG* rng = (RNG*)TclObject::lookup(argv[7]);
  846. return(new PackMimeHTTPNumPagesRandomVariable 
  847.        ((double) atof(argv[4]), (double) atof(argv[5]),
  848. (double) atof(argv[6]), rng));
  849. } else {
  850. return(new PackMimeHTTPNumPagesRandomVariable());
  851. }
  852. }
  853. } class_packmimenumpagesranvar;
  854. PackMimeHTTPNumPagesRandomVariable::PackMimeHTTPNumPagesRandomVariable() :
  855. probability_(P_1PAGE), shape_(SHAPE_NPAGE), scale_(SCALE_NPAGE)
  856. {
  857. }
  858. PackMimeHTTPNumPagesRandomVariable::PackMimeHTTPNumPagesRandomVariable(double prob, 
  859.        double shape,
  860.        double scale) :
  861. probability_(prob), shape_(shape), scale_(scale)
  862. {
  863. }
  864. PackMimeHTTPNumPagesRandomVariable::PackMimeHTTPNumPagesRandomVariable(double prob, 
  865.        double shape,
  866.        double scale,
  867.        RNG* rng) :
  868. probability_(prob), shape_(shape), scale_(scale)
  869. {
  870. rng_ = rng;
  871. }
  872. double PackMimeHTTPNumPagesRandomVariable::value(void)
  873. {
  874. double pages = 1;
  875. if (rng_->rbernoulli(probability_) == 0) {
  876. // multiple pages in this connection
  877. pages = rng_->rweibull (shape_, scale_) + 1;
  878. if (pages == 1) {
  879. // should be at least 2 pages at this point
  880. pages++;
  881. }
  882. }
  883. return (pages);
  884. }
  885. const double PackMimeHTTPNumPagesRandomVariable::P_1PAGE = 0.82;      
  886. const double PackMimeHTTPNumPagesRandomVariable::SHAPE_NPAGE = 1;
  887. const double PackMimeHTTPNumPagesRandomVariable::SCALE_NPAGE = 0.417;
  888. /*:::::::::::::::::::::: PackMimeHTTP SingleObj RanVar :::::::::::::::::::::::::*/
  889. static class PackMimeHTTPSingleObjRandomVariableClass : public TclClass {
  890. public:
  891. PackMimeHTTPSingleObjRandomVariableClass() : 
  892. TclClass("RandomVariable/PackMimeHTTPSingleObj"){}
  893. TclObject* create(int argc, const char*const* argv) {
  894. if (argc == 5) {
  895. // probability
  896. return(new PackMimeHTTPSingleObjRandomVariable 
  897.        ((double) atof(argv[4])));
  898. } else if (argc == 6) {
  899. // probability, RNG
  900. RNG* rng = (RNG*)TclObject::lookup(argv[5]);
  901. return(new PackMimeHTTPSingleObjRandomVariable 
  902.        ((double) atof(argv[4]), rng));
  903. } else {
  904. return(new PackMimeHTTPSingleObjRandomVariable());
  905. }
  906. }
  907. } class_packmimesingleobjranvar;
  908. PackMimeHTTPSingleObjRandomVariable::PackMimeHTTPSingleObjRandomVariable() :
  909. probability_(P_1TRANSFER)
  910. {
  911. }
  912. PackMimeHTTPSingleObjRandomVariable::PackMimeHTTPSingleObjRandomVariable(double prob) :
  913. probability_(prob)
  914. {
  915. }
  916. PackMimeHTTPSingleObjRandomVariable::PackMimeHTTPSingleObjRandomVariable(double prob, 
  917.        RNG* rng) :
  918. probability_(prob)
  919. {
  920. rng_ = rng;
  921. }
  922. double PackMimeHTTPSingleObjRandomVariable::value(void)
  923. {
  924. return (rng_->rbernoulli(probability_));
  925. }
  926. const double PackMimeHTTPSingleObjRandomVariable::P_1TRANSFER = 0.69; 
  927. /*:::::::::::::::::::::: PackMimeHTTP ObjsPerPage RanVar :::::::::::::::::::::::::*/
  928. static class PackMimeHTTPObjsPerPageRandomVariableClass : public TclClass {
  929. public:
  930. PackMimeHTTPObjsPerPageRandomVariableClass() : 
  931. TclClass("RandomVariable/PackMimeHTTPObjsPerPage"){}
  932. TclObject* create(int argc, const char*const* argv) {
  933. if (argc == 6) {
  934. // shape, scale
  935. return(new PackMimeHTTPObjsPerPageRandomVariable 
  936.        ((double) atof(argv[4]), (double) atof(argv[5])));
  937. } else if (argc == 7) {
  938. // shape, scale, RNG
  939. RNG* rng = (RNG*)TclObject::lookup(argv[6]);
  940. return(new PackMimeHTTPObjsPerPageRandomVariable 
  941.        ((double) atof(argv[4]), (double) atof(argv[5]), rng));
  942. } else {
  943. return(new PackMimeHTTPObjsPerPageRandomVariable());
  944. }
  945. }
  946. } class_packmimeobjsperpageranvar;
  947. PackMimeHTTPObjsPerPageRandomVariable::PackMimeHTTPObjsPerPageRandomVariable() :
  948. shape_(SHAPE_NTRANSFER), scale_(SCALE_NTRANSFER)
  949. {
  950. }
  951. PackMimeHTTPObjsPerPageRandomVariable::PackMimeHTTPObjsPerPageRandomVariable(double shape,
  952.        double scale) :
  953. shape_(shape), scale_(scale)
  954. {
  955. }
  956. PackMimeHTTPObjsPerPageRandomVariable::PackMimeHTTPObjsPerPageRandomVariable(double shape,
  957.        double scale,
  958.        RNG* rng) :
  959. shape_(shape), scale_(scale)
  960. {
  961. rng_ = rng;
  962. }
  963. double PackMimeHTTPObjsPerPageRandomVariable::value(void)
  964. {
  965. return (rng_->rweibull (shape_, scale_) + 1);
  966. }
  967. const double PackMimeHTTPObjsPerPageRandomVariable::SHAPE_NTRANSFER = 1; 
  968. const double PackMimeHTTPObjsPerPageRandomVariable::SCALE_NTRANSFER = 1.578;
  969. /*:::::::::::::::::::::: PackMimeHTTP TimeBtwnPages RanVar :::::::::::::::::::::::::*/
  970. static class PackMimeHTTPTimeBtwnPagesRandomVariableClass : public TclClass {
  971. public:
  972. PackMimeHTTPTimeBtwnPagesRandomVariableClass() : 
  973. TclClass("RandomVariable/PackMimeHTTPTimeBtwnPages"){}
  974. TclObject* create(int argc, const char*const* argv) {
  975. if (argc == 5) {
  976. // rng
  977. RNG* rng = (RNG*)TclObject::lookup(argv[4]);
  978. return(new PackMimeHTTPTimeBtwnPagesRandomVariable(rng));
  979. } else {
  980. return(new PackMimeHTTPTimeBtwnPagesRandomVariable());
  981. }
  982. }
  983. } class_packmimetimebtwnpagesranvar;
  984. PackMimeHTTPTimeBtwnPagesRandomVariable::PackMimeHTTPTimeBtwnPagesRandomVariable()
  985. {
  986. loc_b_ = rng_->rnorm() * sqrt(V_LOC_B) + M_LOC_B;
  987. scale2_b_ = rng_->rgamma(SHAPE_SCALE2_B, 1/RATE_SCALE2_B);
  988. }
  989. PackMimeHTTPTimeBtwnPagesRandomVariable::PackMimeHTTPTimeBtwnPagesRandomVariable(RNG* rng)
  990. {
  991. rng_ = rng;
  992. loc_b_ = rng_->rnorm() * sqrt(V_LOC_B) + M_LOC_B;
  993. scale2_b_ = rng_->rgamma(SHAPE_SCALE2_B, 1/RATE_SCALE2_B);
  994. }
  995. double PackMimeHTTPTimeBtwnPagesRandomVariable::value(void)
  996. {
  997. return (pow (2.0, loc_b_ + sqrt(scale2_b_) * rng_->rnorm() * sqrt(V_ERROR_B)));
  998. }
  999. const double PackMimeHTTPTimeBtwnPagesRandomVariable::M_LOC_B = 3.22; 
  1000. const double PackMimeHTTPTimeBtwnPagesRandomVariable::V_LOC_B = 0.73; 
  1001. const double PackMimeHTTPTimeBtwnPagesRandomVariable::SHAPE_SCALE2_B = 1.85;
  1002. const double PackMimeHTTPTimeBtwnPagesRandomVariable::RATE_SCALE2_B = 1.85; 
  1003. const double PackMimeHTTPTimeBtwnPagesRandomVariable::V_ERROR_B = 1.21; 
  1004. /*:::::::::::::::::::::: PackMimeHTTP TimeBtwnObjs RanVar :::::::::::::::::::::::::*/
  1005. static class PackMimeHTTPTimeBtwnObjsRandomVariableClass : public TclClass {
  1006. public:
  1007. PackMimeHTTPTimeBtwnObjsRandomVariableClass() : 
  1008. TclClass("RandomVariable/PackMimeHTTPTimeBtwnObjs"){}
  1009. TclObject* create(int argc, const char*const* argv) {
  1010. if (argc == 5) {
  1011. // rng
  1012. RNG* rng = (RNG*)TclObject::lookup(argv[4]);
  1013. return(new PackMimeHTTPTimeBtwnObjsRandomVariable(rng));
  1014. } else {
  1015. return(new PackMimeHTTPTimeBtwnObjsRandomVariable());
  1016. }
  1017. }
  1018. } class_packmimetimebtwnobjsranvar;
  1019. PackMimeHTTPTimeBtwnObjsRandomVariable::PackMimeHTTPTimeBtwnObjsRandomVariable()
  1020. {
  1021. loc_w_ = rng_->rnorm() * sqrt(V_LOC_W) + M_LOC_W;
  1022. scale2_w_ = rng_->rgamma(SHAPE_SCALE2_W, 1/RATE_SCALE2_W);
  1023. }
  1024. PackMimeHTTPTimeBtwnObjsRandomVariable::PackMimeHTTPTimeBtwnObjsRandomVariable(RNG* rng)
  1025. {
  1026. rng_ = rng;
  1027. loc_w_ = rng_->rnorm() * sqrt(V_LOC_W) + M_LOC_W;
  1028. scale2_w_ = rng_->rgamma(SHAPE_SCALE2_W, 1/RATE_SCALE2_W);
  1029. }
  1030. double PackMimeHTTPTimeBtwnObjsRandomVariable::value(void)
  1031. {
  1032. return (pow (2.0, loc_w_ + sqrt(scale2_w_) * rng_->rnorm() * sqrt(V_ERROR_W)));
  1033. }
  1034. const double PackMimeHTTPTimeBtwnObjsRandomVariable::M_LOC_W = -4.15; 
  1035. const double PackMimeHTTPTimeBtwnObjsRandomVariable::V_LOC_W = 3.12;  
  1036. const double PackMimeHTTPTimeBtwnObjsRandomVariable::SHAPE_SCALE2_W = 2.35;
  1037. const double PackMimeHTTPTimeBtwnObjsRandomVariable::RATE_SCALE2_W = 2.35; 
  1038. const double PackMimeHTTPTimeBtwnObjsRandomVariable::V_ERROR_W = 1.57; 
  1039. /*:::::::::::::::::::::: PackMimeHTTP ServerDelay RanVar :::::::::::::::::::::::::*/
  1040. static class PackMimeHTTPServerDelayRandomVariableClass : public TclClass {
  1041. public:
  1042. PackMimeHTTPServerDelayRandomVariableClass() : 
  1043. TclClass("RandomVariable/PackMimeHTTPServerDelay"){}
  1044. TclObject* create(int argc, const char*const* argv) {
  1045. if (argc == 6) {
  1046. // shape, scale
  1047. return(new PackMimeHTTPServerDelayRandomVariable 
  1048.        ((double) atof(argv[4]), (double) atof(argv[5])));
  1049. } else if (argc == 7) {
  1050. // shape, scale, RNG
  1051. RNG* rng = (RNG*)TclObject::lookup(argv[6]);
  1052. return(new PackMimeHTTPServerDelayRandomVariable 
  1053.        ((double) atof(argv[4]), (double) atof(argv[5]), rng));
  1054. } else {
  1055. return(new PackMimeHTTPServerDelayRandomVariable());
  1056. }
  1057. }
  1058. } class_packmimeserverdelayranvar;
  1059. PackMimeHTTPServerDelayRandomVariable::PackMimeHTTPServerDelayRandomVariable() : 
  1060. shape_(SERVER_DELAY_SHAPE), scale_(SERVER_DELAY_SCALE), const_(1), mean_(0)
  1061. {
  1062. }
  1063. PackMimeHTTPServerDelayRandomVariable::PackMimeHTTPServerDelayRandomVariable(double shape,
  1064.      double scale) :
  1065. shape_(shape), scale_(scale), const_(1), mean_(0)
  1066. {
  1067. }
  1068. PackMimeHTTPServerDelayRandomVariable::PackMimeHTTPServerDelayRandomVariable(double shape,
  1069.      double scale,
  1070.      RNG* rng) :
  1071. shape_(shape), scale_(scale), const_(1), mean_(0)
  1072. {
  1073. rng_ = rng;
  1074. }
  1075. double PackMimeHTTPServerDelayRandomVariable::value(void)
  1076. {
  1077. /*
  1078.  *  sample from Weibull distribution.
  1079.  *  delay is 1/sample, with a max delay of 0.1 sec
  1080.  */
  1081. double val = rng_->rweibull(shape_, scale_);
  1082. if (val < 10) {
  1083. val = 10;
  1084. }
  1085. // adjust by const_ and mean_ (by default, this does nothing)
  1086. if (const_ == 0) {
  1087. const_ = mean_ / SERVER_DELAY_DIV;
  1088. }
  1089. val = val / const_;
  1090. return (1 / val);  // delay in seconds
  1091. }
  1092. const double PackMimeHTTPServerDelayRandomVariable::SERVER_DELAY_SHAPE = 0.63;
  1093. const double PackMimeHTTPServerDelayRandomVariable::SERVER_DELAY_SCALE = 305;
  1094. const double PackMimeHTTPServerDelayRandomVariable::SERVER_DELAY_DIV = 0.0059;