/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ /* * Copyright (c) Xerox Corporation 1997. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Linking this file statically or dynamically with other modules is making * a combined work based on this file. Thus, the terms and conditions of * the GNU General Public License cover the whole combination. * * In addition, as a special exception, the copyright holders of this file * give you permission to combine this file with free software programs or * libraries that are released under the GNU LGPL and with code included in * the standard release of ns-2 under the Apache 2.0 license or under * otherwise-compatible licenses with advertising requirements (or modified * versions of such code, with unchanged license). You may copy and * distribute such a system following the terms of the GNU GPL for this * file and the licenses of the other code concerned, provided that you * include the source code of that other code when and as the GNU GPL * requires distribution of source code. * * Note that people who make modified versions of this file are not * obligated to grant this special exception for their modified versions; * it is their choice whether to do so. The GNU General Public License * gives permission to release a modified version without this exception; * this exception also makes it possible to release a modified version * which carries forward this exception. * * @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/tools/ranvar.h,v 1.16 2005/08/26 05:05:31 tomh Exp $ (Xerox) */ #ifndef ns_ranvar_h #define ns_ranvar_h /* XXX still need to clean up dependencies among parameters such that * when one parameter is changed, other parameters are recomputed as * appropriate. */ #include "random.h" #include "rng.h" class RandomVariable : public TclObject { public: virtual double value() = 0; virtual double avg() = 0; int command(int argc, const char*const* argv); RandomVariable(); // This is added by Debojyoti Dutta 12th Oct 2000 int seed(char *); protected: RNG* rng_; }; class UniformRandomVariable : public RandomVariable { public: virtual double value(); virtual inline double avg() { return (max_-min_)/2; }; UniformRandomVariable(); UniformRandomVariable(double, double); double* minp() { return &min_; }; double* maxp() { return &max_; }; double min() { return min_; }; double max() { return max_; }; void setmin(double d) { min_ = d; }; void setmax(double d) { max_ = d; }; private: double min_; double max_; }; class ExponentialRandomVariable : public RandomVariable { public: virtual double value(); ExponentialRandomVariable(); ExponentialRandomVariable(double); double* avgp() { return &avg_; }; virtual inline double avg() { return avg_; }; void setavg(double d) { avg_ = d; }; private: double avg_; }; class ParetoRandomVariable : public RandomVariable { public: virtual double value(); ParetoRandomVariable(); ParetoRandomVariable(double, double); double* avgp() { return &avg_; }; double* shapep() { return &shape_; }; virtual inline double avg() { return avg_; }; double shape() { return shape_; }; void setavg(double d) { avg_ = d; }; void setshape(double d) { shape_ = d; }; private: double avg_; double shape_; double scale_; }; class ParetoIIRandomVariable : public RandomVariable { public: virtual double value(); ParetoIIRandomVariable(); ParetoIIRandomVariable(double, double); double* avgp() { return &avg_; }; double* shapep() { return &shape_; }; virtual inline double avg() { return avg_; }; double shape() { return shape_; }; void setavg(double d) { avg_ = d; }; void setshape(double d) { shape_ = d; }; private: double avg_; double shape_; double scale_; }; class NormalRandomVariable : public RandomVariable { public: virtual double value(); NormalRandomVariable(); inline double* avgp() { return &avg_; }; inline double* stdp() { return &std_; }; virtual inline double avg() { return avg_; }; inline double std() { return std_; }; inline void setavg(double d) { avg_ = d; }; inline void setstd(double d) { std_ = d; }; private: double avg_; double std_; }; class LogNormalRandomVariable : public RandomVariable { public: virtual double value(); LogNormalRandomVariable(); inline double* avgp() { return &avg_; }; inline double* stdp() { return &std_; }; virtual inline double avg() { return avg_; }; inline double std() { return std_; }; inline void setavg(double d) { avg_ = d; }; inline void setstd(double d) { std_ = d; }; private: double avg_; double std_; }; class ConstantRandomVariable : public RandomVariable { public: virtual double value(); virtual double avg(){ return val_;} ConstantRandomVariable(); ConstantRandomVariable(double); double* valp() { return &val_; }; double val() { return val_; }; void setval(double d) { val_ = d; }; private: double val_; }; class HyperExponentialRandomVariable : public RandomVariable { public: virtual double value(); HyperExponentialRandomVariable(); HyperExponentialRandomVariable(double, double); double* avgp() { return &avg_; }; double* covp() { return &cov_; }; virtual double avg() { return avg_; }; double cov() { return cov_; }; void setavg(double d) { avg_ = d; }; void setcov(double d) { cov_ = d; }; private: double avg_; double cov_; double alpha_; }; #define INTER_DISCRETE 0 // no interpolation (discrete) #define INTER_CONTINUOUS 1 // linear interpolation #define INTER_INTEGRAL 2 // linear interpolation and round up struct CDFentry { double cdf_; double val_; }; class EmpiricalRandomVariable : public RandomVariable { public: virtual double value(); virtual double interpolate(double u, double x1, double y1, double x2, double y2); virtual double avg(){ return value(); } // junk EmpiricalRandomVariable(); double& minCDF() { return minCDF_; } double& maxCDF() { return maxCDF_; } int loadCDF(const char* filename); protected: int command(int argc, const char*const* argv); int lookup(double u); double minCDF_; // min value of the CDF (default to 0) double maxCDF_; // max value of the CDF (default to 1) int interpolation_; // how to interpolate data (INTER_DISCRETE...) int numEntry_; // number of entries in the CDF table int maxEntry_; // size of the CDF table (mem allocation) CDFentry* table_; // CDF table of (val_, cdf_) }; #endif