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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) Xerox Corporation 1997. All rights reserved.
  4.  *  
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.  *
  19.  * Linking this file statically or dynamically with other modules is making
  20.  * a combined work based on this file.  Thus, the terms and conditions of
  21.  * the GNU General Public License cover the whole combination.
  22.  *
  23.  * In addition, as a special exception, the copyright holders of this file
  24.  * give you permission to combine this file with free software programs or
  25.  * libraries that are released under the GNU LGPL and with code included in
  26.  * the standard release of ns-2 under the Apache 2.0 license or under
  27.  * otherwise-compatible licenses with advertising requirements (or modified
  28.  * versions of such code, with unchanged license).  You may copy and
  29.  * distribute such a system following the terms of the GNU GPL for this
  30.  * file and the licenses of the other code concerned, provided that you
  31.  * include the source code of that other code when and as the GNU GPL
  32.  * requires distribution of source code.
  33.  *
  34.  * Note that people who make modified versions of this file are not
  35.  * obligated to grant this special exception for their modified versions;
  36.  * it is their choice whether to do so.  The GNU General Public License
  37.  * gives permission to release a modified version without this exception;
  38.  * this exception also makes it possible to release a modified version
  39.  * which carries forward this exception.
  40.  *
  41.  * @(#) $Header: /cvsroot/nsnam/ns-2/tools/ranvar.h,v 1.18 2008/02/01 21:39:43 tom_henderson Exp $ (Xerox)
  42.  */
  43. #ifndef ns_ranvar_h
  44. #define ns_ranvar_h
  45. /* XXX still need to clean up dependencies among parameters such that
  46.  * when one parameter is changed, other parameters are recomputed as
  47.  * appropriate.
  48.  */
  49. #include "random.h"
  50. #include "rng.h"
  51. class RandomVariable : public TclObject {
  52.  public:
  53. virtual double value() = 0;
  54. virtual double avg() = 0;
  55. int command(int argc, const char*const* argv);
  56. RandomVariable();
  57. // This is added by Debojyoti Dutta 12th Oct 2000
  58. int seed(char *);
  59.  protected:
  60. RNG* rng_;
  61. };
  62. class UniformRandomVariable : public RandomVariable {
  63.  public:
  64. virtual double value();
  65. virtual inline double avg() { return (max_-min_)/2; };
  66. UniformRandomVariable();
  67. UniformRandomVariable(double, double);
  68. double* minp() { return &min_; };
  69. double* maxp() { return &max_; };
  70. double min() { return min_; };
  71. double max() { return max_; };
  72. void setmin(double d) { min_ = d; };
  73. void setmax(double d) { max_ = d; };
  74.  private:
  75. double min_;
  76. double max_;
  77. };
  78. class ExponentialRandomVariable : public RandomVariable {
  79.  public:
  80. virtual double value();
  81. ExponentialRandomVariable();
  82. ExponentialRandomVariable(double);
  83. double* avgp() { return &avg_; };
  84. virtual inline double avg() { return avg_; };
  85. void setavg(double d) { avg_ = d; };
  86.  private:
  87. double avg_;
  88. };
  89. class ErlangRandomVariable : public RandomVariable {
  90.  public:
  91. virtual double value();
  92. ErlangRandomVariable();
  93. ErlangRandomVariable(double, int);
  94. virtual inline double avg() { return k_/lambda_; };
  95.  private:
  96. double lambda_;
  97. int    k_;
  98. };
  99. class GammaRandomVariable : public RandomVariable {
  100.  public:
  101. virtual double value();
  102. GammaRandomVariable();
  103. GammaRandomVariable(double, double);
  104. virtual inline double avg() { return alpha_*beta_; };
  105.  private:
  106. double alpha_;
  107. double beta_;
  108. };
  109. class ParetoRandomVariable : public RandomVariable {
  110.  public:
  111. virtual double value();
  112. ParetoRandomVariable();
  113. ParetoRandomVariable(double, double);
  114. double* avgp() { return &avg_; };
  115. double* shapep() { return &shape_; };
  116. virtual inline double avg() { return avg_; };
  117. double shape() { return shape_; };
  118. void setavg(double d) { avg_ = d; };
  119. void setshape(double d) { shape_ = d; };
  120.  private:
  121. double avg_;
  122. double shape_;
  123. double scale_;
  124. };
  125. class ParetoIIRandomVariable : public RandomVariable {
  126.  public:
  127.         virtual double value();
  128.         ParetoIIRandomVariable();
  129.         ParetoIIRandomVariable(double, double);
  130.         double* avgp() { return &avg_; };
  131.         double* shapep() { return &shape_; };
  132.         virtual inline double avg()   { return avg_; };
  133.         double shape()   { return shape_; };
  134.         void setavg(double d)  { avg_ = d; };
  135.         void setshape(double d)  { shape_ = d; };
  136.  private:
  137.         double avg_;
  138.         double shape_;
  139.         double scale_;
  140. };
  141. class NormalRandomVariable : public RandomVariable {
  142.  public:
  143.         virtual double value();
  144.         NormalRandomVariable();
  145.         inline double* avgp() { return &avg_; };
  146.         inline double* stdp() { return &std_; };
  147.         virtual inline double avg()     { return avg_; };
  148.         inline double std()     { return std_; };
  149.         inline void setavg(double d)    { avg_ = d; };
  150.         inline void setstd(double d)    { std_ = d; };
  151.  private:
  152.         double avg_;
  153.         double std_;
  154. };
  155. class LogNormalRandomVariable : public RandomVariable {
  156. public:
  157.         virtual double value();
  158.         LogNormalRandomVariable();
  159.         inline double* avgp() { return &avg_; };
  160.         inline double* stdp() { return &std_; };
  161.         virtual inline double avg()     { return avg_; };
  162.         inline double std()     { return std_; };
  163.         inline void setavg(double d)    { avg_ = d; };
  164.         inline void setstd(double d)    { std_ = d; };
  165. private:
  166.         double avg_;
  167.         double std_;
  168. };
  169. class ConstantRandomVariable : public RandomVariable {
  170.  public:
  171. virtual double value();
  172. virtual double avg(){ return val_;}
  173. ConstantRandomVariable();
  174. ConstantRandomVariable(double);
  175. double* valp() { return &val_; };
  176. double val() { return val_; };
  177. void setval(double d) { val_ = d; };
  178.  private:
  179. double val_;
  180. };
  181. class HyperExponentialRandomVariable : public RandomVariable {
  182.  public:
  183. virtual double value();
  184. HyperExponentialRandomVariable();
  185. HyperExponentialRandomVariable(double, double);
  186. double* avgp() { return &avg_; };
  187. double* covp() { return &cov_; };
  188. virtual double avg() { return avg_; };
  189. double cov() { return cov_; };
  190. void setavg(double d) { avg_ = d; };
  191. void setcov(double d) { cov_ = d; };
  192.  private:
  193. double avg_;
  194. double cov_;
  195. double alpha_;
  196. };
  197. class WeibullRandomVariable : public RandomVariable {
  198. public:
  199.         virtual double value();
  200.         virtual double avg();
  201.         WeibullRandomVariable();
  202.         WeibullRandomVariable(double shape, double scale);
  203.         WeibullRandomVariable(double shape, double scale, RNG* rng);
  204.         double* shapep() { return &shape_; };
  205.         double* scalep() { return &scale_; };
  206.         double shape()   { return shape_; };
  207.         double scale()   { return scale_; };
  208.         void setshape(double d)  { shape_ = d; };       
  209.         void setscale(double d)  { scale_ = d; };
  210. private:
  211.         double shape_;
  212.         double scale_;
  213. };
  214. #define INTER_DISCRETE 0 // no interpolation (discrete)
  215. #define INTER_CONTINUOUS 1 // linear interpolation
  216. #define INTER_INTEGRAL 2 // linear interpolation and round up
  217. struct CDFentry {
  218. double cdf_;
  219. double val_;
  220. };
  221. class EmpiricalRandomVariable : public RandomVariable {
  222. public:
  223. virtual double value();
  224. virtual double interpolate(double u, double x1, double y1, double x2, double y2);
  225. virtual double avg(){ return value(); } // junk
  226. EmpiricalRandomVariable();
  227. double& minCDF() { return minCDF_; }
  228. double& maxCDF() { return maxCDF_; }
  229. int loadCDF(const char* filename);
  230. protected:
  231. int command(int argc, const char*const* argv);
  232. int lookup(double u);
  233. double minCDF_; // min value of the CDF (default to 0)
  234. double maxCDF_; // max value of the CDF (default to 1)
  235. int interpolation_; // how to interpolate data (INTER_DISCRETE...)
  236. int numEntry_; // number of entries in the CDF table
  237. int maxEntry_; // size of the CDF table (mem allocation)
  238. CDFentry* table_; // CDF table of (val_, cdf_)
  239. };
  240. #endif