/// <summary> /// Returns the corresponding distribution. /// </summary> /// <param name="wholeDistribution">the distribution of all configurations</param> /// <param name="allBuckets">all buckets of the distribution</param> /// <returns>the user-specified distribution (e.g., uniform)</returns> public override Dictionary <double, double> CreateDistribution(Dictionary <double, List <Configuration> > wholeDistribution, List <double> allBuckets) { // If a normal distribution is wanted, the parameters can be computed // from the whole population if available if (this.distribution is NormalDistribution && !this.strategyParameter[USE_WHOLE_POPULATION].Equals("false")) { Dictionary <double, int> distr = DistributionUtils.CountConfigurations(wholeDistribution); double sum = 0; int count = 0; foreach (double key in distr.Keys) { sum += key * distr[key]; count += distr[key]; } // Compute the mean value of the whole distribution double mean = sum / count; // Compute the deviation double deviation = Math.Sqrt(distr.Sum(x => x.Value * Math.Pow(x.Key - mean, 2)) / count); return(((NormalDistribution)this.distribution).CreateDistribution(allBuckets, mean, deviation)); } else { return(this.distribution.CreateDistribution(allBuckets)); } }
/// <summary> /// See <see cref="IDistribution.CreateDistribution(List{double})"/>. /// </summary> public Dictionary <double, double> CreateDistribution(List <double> allBuckets) { Dictionary <double, double> result = new Dictionary <double, double>(); double previousResultCache = 0; for (int i = 0; i < allBuckets.Count; i++) { double currentResult = 1 - Math.Pow(1 - PROBABILITY, i + 1); result[allBuckets[i]] = currentResult - previousResultCache; previousResultCache = currentResult; } return(DistributionUtils.AdjustToOne(result)); }
/// <summary> /// Creates the distribution by using the given mean and deviation value. /// </summary> /// <param name="allBuckets">All buckets.</param> /// <param name="mean">The mean for the normal distribution.</param> /// <param name="deviation">The standard deviation for the normal distribution.</param> public virtual Dictionary <double, double> CreateDistribution(List <double> allBuckets, double mean, double deviation) { Dictionary <double, double> result = new Dictionary <double, double>(); double previousResultCache = 0; for (int i = 0; i < allBuckets.Count; i++) { double currentResult = Normal.CDF(mean, deviation, allBuckets[i]); result[allBuckets[i]] = currentResult - previousResultCache; previousResultCache = currentResult; } return(DistributionUtils.AdjustToOne(result)); }
/// <summary> /// See <see cref="IDistribution.CreateDistribution(List{double})"/>. /// </summary> public Dictionary <double, double> CreateDistribution(List <double> allBuckets) { GeometricDistribution geometricDistribution = new GeometricDistribution(); Dictionary <double, double> original = geometricDistribution.CreateDistribution(allBuckets); Dictionary <double, double> result = new Dictionary <double, double>(); for (int i = 0; i < allBuckets.Count; i++) { double index = allBuckets[i]; double inverseIndex = allBuckets[allBuckets.Count - 1 - i]; result[index] = original[index] + original[inverseIndex]; } return(DistributionUtils.AdjustToOne(result)); }
/// <summary> /// See <see cref="Distribution.CreateDistribution(List{double})"/>. /// </summary> public Dictionary <double, double> CreateDistribution(List <double> allBuckets) { Dictionary <double, double> result = new Dictionary <double, double>(); int numberOfBuckets = allBuckets.Count - 1; for (int k = 0; k <= numberOfBuckets; k++) { double firstPart = (Factorial(numberOfBuckets) / (Factorial(k) * Factorial(numberOfBuckets - k))); double secondPart = Math.Pow(PROBABILITY, k) * Math.Pow((1 - PROBABILITY), (numberOfBuckets - k)); double probability = firstPart * secondPart; result[allBuckets[k]] = probability; } // Adjust it to be 1.0 in the sum result = DistributionUtils.AdjustToOne(result); return(result); }