00001 // ////////////////////////////////////////////////////////////////////// 00002 // Import section 00003 // ////////////////////////////////////////////////////////////////////// 00004 // GSL Random Number Generation (GSL Reference Manual, version 1.7, Chapter 19) 00005 #include <gsl/gsl_cdf.h> 00006 // C 00007 #include <math.h> 00008 #include <assert.h> 00009 // RMOL 00010 #include <rmol/bom/EmsrUtils.hpp> 00011 #include <rmol/bom/Bucket.hpp> 00012 00013 namespace RMOL { 00014 // //////////////////////////////////////////////////////////////////// 00015 void EmsrUtils::computeAggregatedBucket (Bucket& ioAggregatedBucket, 00016 Bucket& ioCurrentBucket) { 00017 // Retrieve the demand mean, demand standard deviation and average 00018 // yield of the classes/buckets. 00019 const double lAggregatedMean = ioAggregatedBucket.getMean(); 00020 const double lCurrentMean = ioCurrentBucket.getMean(); 00021 const double lAggregatedSD = ioAggregatedBucket.getStandardDeviation(); 00022 const double lCurrentSD = ioCurrentBucket.getStandardDeviation(); 00023 const double lAggregatedAverageYield = ioAggregatedBucket.getAverageYield(); 00024 const double lCurrentAverageYield = ioCurrentBucket.getAverageYield(); 00025 00026 // Compute the new demand mean, new demand standard deviation and 00027 // new average yield for the new aggregated class/bucket. 00028 const double lNewMean = lAggregatedMean + lCurrentMean; 00029 const double lNewSD = 00030 sqrt(lAggregatedSD*lAggregatedSD + lCurrentSD*lCurrentSD); 00031 double lNewAverageYield = lCurrentAverageYield; 00032 if (lNewMean > 0) { 00033 lNewAverageYield = (lAggregatedAverageYield*lAggregatedMean + 00034 lCurrentAverageYield*lCurrentMean)/lNewMean; 00035 } 00036 // Set the new yield range for the new aggregated class/bucket. 00037 ioAggregatedBucket.setYieldRange(lNewAverageYield); 00038 00039 // Set the new demand for the new aggregated class/bucket. 00040 ioAggregatedBucket.setDemandParameters (lNewMean, lNewSD); 00041 } 00042 00043 // //////////////////////////////////////////////////////////////////// 00044 const double EmsrUtils::computeProtectionLevel (Bucket& ioAggregatedBucket, 00045 Bucket& ioNextBucket) { 00046 // Retrive the mean & standard deviation of the aggregated 00047 // class/bucket and the average yield of all the two 00048 // classes/buckets. 00049 const double lMean = ioAggregatedBucket.getMean(); 00050 const double lSD = ioAggregatedBucket.getStandardDeviation(); 00051 const double lAggreatedYield = ioAggregatedBucket.getAverageYield(); 00052 const double lNextYield = ioNextBucket.getAverageYield(); 00053 assert (lAggreatedYield != 0); 00054 00055 // Compute the protection for the aggregated class/bucket 00056 const double lProtection = 00057 lMean + gsl_cdf_gaussian_Qinv (lNextYield/lAggreatedYield, lSD); 00058 00059 return lProtection; 00060 } 00061 00062 // //////////////////////////////////////////////////////////////////// 00063 const double EmsrUtils::computeEmsrValue (double iCapacity, Bucket& ioBucket) { 00064 // Retrive the average yield, mean and standard deviation of the 00065 // demand of the class/bucket. 00066 const double lMean = ioBucket.getMean(); 00067 const double lSD = ioBucket.getStandardDeviation(); 00068 const double lYield = ioBucket.getAverageYield(); 00069 00070 // Compute the EMSR value = lYield * Pr (demand >= iCapacity). 00071 const double emsrValue = lYield * gsl_cdf_gaussian_Q(iCapacity-lMean, lSD); 00072 00073 return emsrValue; 00074 } 00075 }
Generated on Tue Apr 14 17:57:51 2009 for RMOL by Doxygen 1.5.8