public static void Print([NotNull] this ITestOutputHelper output, [NotNull] string title, [NotNull] Histogram histogram) { var values = histogram.GetAllValues().CopyToArray(); double mValue = MValueCalculator.Calculate(values); var cultureInfo = TestCultureInfo.Instance; var binSizeInterval = TimeInterval.FromNanoseconds(histogram.BinSize); output.WriteLine($"=== {title}:Short (BinSize={binSizeInterval.ToString(cultureInfo)}, mValue={mValue.ToString("0.##", cultureInfo)}) ==="); output.WriteLine(histogram.ToString(histogram.CreateNanosecondFormatter(cultureInfo, "0.0000"))); output.WriteLine($"=== {title}:Full (BinSize={binSizeInterval.ToString(cultureInfo)}, mValue={mValue.ToString("0.##", cultureInfo)}) ==="); output.WriteLine(histogram.ToString(histogram.CreateNanosecondFormatter(cultureInfo, "0.0000"), full: true)); }
public void Run() { var random = new Random(42); var data = new List <double>(); data.AddRange(new NormalDistribution(mean: 20, stdDev: 1).Random(random).Next(200)); data.AddRange(new NormalDistribution(mean: 22, stdDev: 1).Random(random).Next(200)); List <double> unimodal = new List <double>(), bimodal = new List <double>(), trimodal = new List <double>(); unimodal.AddRange(new NormalDistribution(mean: 20, stdDev: 1).Random(random).Next(200)); bimodal.AddRange(new NormalDistribution(mean: 20, stdDev: 1).Random(random).Next(200)); bimodal.AddRange(new NormalDistribution(mean: 30, stdDev: 1).Random(random).Next(200)); trimodal.AddRange(new NormalDistribution(mean: 20, stdDev: 1).Random(random).Next(200)); trimodal.AddRange(new NormalDistribution(mean: 30, stdDev: 1).Random(random).Next(200)); trimodal.AddRange(new NormalDistribution(mean: 40, stdDev: 1).Random(random).Next(200)); Console.WriteLine("Unimodal : " + MValueCalculator.Calculate(unimodal)); Console.WriteLine("Bimodal : " + MValueCalculator.Calculate(bimodal)); Console.WriteLine("Trimodal : " + MValueCalculator.Calculate(trimodal)); }
public void Run() { var random = new RandomDistribution(42); var data = new List <double>(); data.AddRange(random.Gaussian(200, mean: 20)); data.AddRange(random.Gaussian(200, mean: 22)); List <double> unimodal = new List <double>(), bimodal = new List <double>(), trimodal = new List <double>(); unimodal.AddRange(random.Gaussian(200, mean: 20)); bimodal.AddRange(random.Gaussian(200, mean: 20)); bimodal.AddRange(random.Gaussian(200, mean: 30)); trimodal.AddRange(random.Gaussian(200, mean: 20)); trimodal.AddRange(random.Gaussian(200, mean: 30)); trimodal.AddRange(random.Gaussian(200, mean: 40)); Console.WriteLine("Unimodal : " + MValueCalculator.Calculate(unimodal)); Console.WriteLine("Bimodal : " + MValueCalculator.Calculate(bimodal)); Console.WriteLine("Trimodal : " + MValueCalculator.Calculate(trimodal)); }
// code and magic values taken from BenchmarkDotNet.Analysers.MultimodalDistributionAnalyzer // See http://www.brendangregg.com/FrequencyTrails/modes.html internal static string GetModalInfo(Benchmark benchmark) { if (benchmark.Statistics.N < 12) // not enough data to tell { return(null); } double mValue = MValueCalculator.Calculate(benchmark.Statistics.OriginalValues); if (mValue > 4.2) { return("multimodal"); } else if (mValue > 3.2) { return("bimodal"); } else if (mValue > 2.8) { return("several?"); } return(null); }
protected override IEnumerable <Conclusion> AnalyseReport(BenchmarkReport report, Summary summary) { var statistics = report.ResultStatistics; if (statistics == null || statistics.N < EngineResolver.DefaultMinWorkloadIterationCount) { yield break; } double mValue = MValueCalculator.Calculate(statistics.OriginalValues); if (mValue > 4.2) { yield return(Create("is multimodal", mValue, report, summary.Style.CultureInfo)); } else if (mValue > 3.2) { yield return(Create("is bimodal", mValue, report, summary.Style.CultureInfo)); } else if (mValue > 2.8) { yield return(Create("can have several modes", mValue, report, summary.Style.CultureInfo)); } }
// code and magic values taken from BenchmarkDotNet.Analysers.MultimodalDistributionAnalyzer // See http://www.brendangregg.com/FrequencyTrails/modes.html private static Modality GetModalInfo(Benchmark benchmark) { if (benchmark.Statistics.N < 12) // not enough data to tell { return(Modality.Single); } double mValue = MValueCalculator.Calculate(benchmark.GetOriginalValues()); if (mValue > 4.2) { return(Modality.Multimodal); } else if (mValue > 3.2) { return(Modality.Bimodal); } else if (mValue > 2.8) { return(Modality.Several); } return(Modality.Single); }
public static void Run(MValueCalculatorOptions options) { var data = options.GetSourceArray(); Console.WriteLine(MValueCalculator.Calculate(data)); }
public static string ToString(this Statistics s, CultureInfo cultureInfo, Func <double, string> formatter, bool calcHistogram = false) { if (s == null) { return(NullSummaryMessage); } string listSeparator = cultureInfo.GetActualListSeparator(); var builder = new StringBuilder(); string errorPercent = (s.StandardError / s.Mean * 100).ToString("0.00", cultureInfo); var ci = s.ConfidenceInterval; string ciMarginPercent = (ci.Margin / s.Mean * 100).ToString("0.00", cultureInfo); double mValue = MValueCalculator.Calculate(s.OriginalValues); builder.Append("Mean = "); builder.Append(formatter(s.Mean)); builder.Append(listSeparator); builder.Append(" StdErr = "); builder.Append(formatter(s.StandardError)); builder.Append(" ("); builder.Append(errorPercent); builder.Append("%)"); builder.Append(listSeparator); builder.Append(" N = "); builder.Append(s.N.ToString(cultureInfo)); builder.Append(listSeparator); builder.Append(" StdDev = "); builder.Append(formatter(s.StandardDeviation)); builder.AppendLine(); builder.Append("Min = "); builder.Append(formatter(s.Min)); builder.Append(listSeparator); builder.Append(" Q1 = "); builder.Append(formatter(s.Q1)); builder.Append(listSeparator); builder.Append(" Median = "); builder.Append(formatter(s.Median)); builder.Append(listSeparator); builder.Append(" Q3 = "); builder.Append(formatter(s.Q3)); builder.Append(listSeparator); builder.Append(" Max = "); builder.Append(formatter(s.Max)); builder.AppendLine(); builder.Append("IQR = "); builder.Append(formatter(s.InterquartileRange)); builder.Append(listSeparator); builder.Append(" LowerFence = "); builder.Append(formatter(s.LowerFence)); builder.Append(listSeparator); builder.Append(" UpperFence = "); builder.Append(formatter(s.UpperFence)); builder.AppendLine(); builder.Append("ConfidenceInterval = "); builder.Append(s.ConfidenceInterval.ToString(formatter)); builder.Append(listSeparator); builder.Append(" Margin = "); builder.Append(formatter(ci.Margin)); builder.Append(" ("); builder.Append(ciMarginPercent); builder.Append("% of Mean)"); builder.AppendLine(); builder.Append("Skewness = "); builder.Append(s.Skewness.ToString("0.##", cultureInfo)); builder.Append(listSeparator); builder.Append(" Kurtosis = "); builder.Append(s.Kurtosis.ToString("0.##", cultureInfo)); builder.Append(listSeparator); builder.Append(" MValue = "); builder.Append(mValue.ToString("0.##", cultureInfo)); builder.AppendLine(); if (calcHistogram) { var histogram = HistogramBuilder.Adaptive.Build(s.OriginalValues); builder.AppendLine("-------------------- Histogram --------------------"); builder.AppendLine(histogram.ToString(formatter)); builder.AppendLine("---------------------------------------------------"); } return(builder.ToString().Trim()); }