From 4e031e7a91241e626272eb4b3f105969c9289ea5 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sat, 26 Oct 2013 00:13:20 +0200 Subject: [PATCH] Statistics: drop redundant explicit null checks --- src/Numerics/Statistics/ArrayStatistics.cs | 17 ---- .../Statistics/SortedArrayStatistics.cs | 7 -- src/Numerics/Statistics/Statistics.cs | 39 -------- .../Statistics/StreamingStatistics.cs | 30 ------ .../StatisticsTests/StatisticsTests.cs | 97 ++++++++++--------- 5 files changed, 50 insertions(+), 140 deletions(-) diff --git a/src/Numerics/Statistics/ArrayStatistics.cs b/src/Numerics/Statistics/ArrayStatistics.cs index 454cb303..63646059 100644 --- a/src/Numerics/Statistics/ArrayStatistics.cs +++ b/src/Numerics/Statistics/ArrayStatistics.cs @@ -52,7 +52,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static double Minimum(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return double.NaN; var min = double.PositiveInfinity; @@ -73,7 +72,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static double Maximum(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return double.NaN; var max = double.NegativeInfinity; @@ -94,7 +92,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static double Mean(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return double.NaN; double mean = 0; @@ -114,7 +111,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static double Variance(double[] samples) { - if (samples == null) throw new ArgumentNullException("samples"); if (samples.Length <= 1) return double.NaN; double variance = 0; @@ -136,7 +132,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static double PopulationVariance(double[] population) { - if (population == null) throw new ArgumentNullException("population"); if (population.Length == 0) return double.NaN; double variance = 0; @@ -180,7 +175,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. public static Tuple MeanVariance(double[] samples) { - if (samples == null) throw new ArgumentNullException("samples"); return new Tuple(Mean(samples), Variance(samples)); } @@ -193,14 +187,11 @@ namespace MathNet.Numerics.Statistics /// Second sample array. public static double Covariance(double[] samples1, double[] samples2) { - if (samples1 == null) throw new ArgumentNullException("samples1"); - if (samples2 == null) throw new ArgumentNullException("samples2"); if (samples1.Length != samples2.Length) throw new ArgumentException(Resources.ArgumentVectorsSameLength); if (samples1.Length <= 1) return double.NaN; var mean1 = Mean(samples1); var mean2 = Mean(samples2); - var covariance = 0.0; for (int i = 0; i < samples1.Length; i++) { @@ -218,14 +209,11 @@ namespace MathNet.Numerics.Statistics /// Second population array. public static double PopulationCovariance(double[] population1, double[] population2) { - if (population1 == null) throw new ArgumentNullException("population1"); - if (population2 == null) throw new ArgumentNullException("population2"); if (population1.Length != population2.Length) throw new ArgumentException(Resources.ArgumentVectorsSameLength); if (population1.Length == 0) return double.NaN; var mean1 = Mean(population1); var mean2 = Mean(population2); - var covariance = 0.0; for (int i = 0; i < population1.Length; i++) { @@ -242,7 +230,6 @@ namespace MathNet.Numerics.Statistics /// One-based order of the statistic, must be between 1 and N (inclusive). public static double OrderStatisticInplace(double[] data, int order) { - if (data == null) throw new ArgumentNullException("data"); if (order < 1 || order > data.Length) return double.NaN; if (order == 1) return Minimum(data); @@ -316,7 +303,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, no sorting is assumed. Will be reordered. public static double[] FiveNumberSummaryInplace(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return new[] { double.NaN, double.NaN, double.NaN, double.NaN, double.NaN }; // TODO: Benchmark: is this still faster than sorting the array then using SortedArrayStatistics instead? @@ -339,7 +325,6 @@ namespace MathNet.Numerics.Statistics /// public static double QuantileInplace(double[] data, double tau) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; double h = (data.Length + 1d/3d)*tau + 1d/3d; @@ -374,7 +359,6 @@ namespace MathNet.Numerics.Statistics /// d-parameter public static double QuantileCustomInplace(double[] data, double tau, double a, double b, double c, double d) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; var x = a + (data.Length + b) * tau - 1; @@ -407,7 +391,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static double QuantileCustomInplace(double[] data, double tau, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; if (tau == 0d || data.Length == 1) return Minimum(data); if (tau == 1d) return Maximum(data); diff --git a/src/Numerics/Statistics/SortedArrayStatistics.cs b/src/Numerics/Statistics/SortedArrayStatistics.cs index 111858bd..347b97cd 100644 --- a/src/Numerics/Statistics/SortedArrayStatistics.cs +++ b/src/Numerics/Statistics/SortedArrayStatistics.cs @@ -46,7 +46,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, must be sorted ascendingly. public static double Minimum(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return double.NaN; return data[0]; @@ -58,7 +57,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, must be sorted ascendingly. public static double Maximum(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return double.NaN; return data[data.Length - 1]; @@ -71,7 +69,6 @@ namespace MathNet.Numerics.Statistics /// One-based order of the statistic, must be between 1 and N (inclusive). public static double OrderStatistic(double[] data, int order) { - if (data == null) throw new ArgumentNullException("data"); if (order < 1 || order > data.Length) return double.NaN; return data[order - 1]; @@ -136,7 +133,6 @@ namespace MathNet.Numerics.Statistics /// Sample array, must be sorted ascendingly. public static double[] FiveNumberSummary(double[] data) { - if (data == null) throw new ArgumentNullException("data"); if (data.Length == 0) return new[] {double.NaN, double.NaN, double.NaN, double.NaN, double.NaN}; return new[] {data[0], Quantile(data, 0.25), Quantile(data, 0.50), Quantile(data, 0.75), data[data.Length - 1]}; } @@ -156,7 +152,6 @@ namespace MathNet.Numerics.Statistics /// public static double Quantile(double[] data, double tau) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; if (tau == 0d || data.Length == 1) return data[0]; if (tau == 1d) return data[data.Length - 1]; @@ -182,7 +177,6 @@ namespace MathNet.Numerics.Statistics /// d-parameter public static double QuantileCustom(double[] data, double tau, double a, double b, double c, double d) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; var x = a + (data.Length + b)*tau - 1; @@ -214,7 +208,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static double QuantileCustom(double[] data, double tau, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); if (tau < 0d || tau > 1d || data.Length == 0) return double.NaN; if (tau == 0d || data.Length == 1) return data[0]; if (tau == 1d) return data[data.Length - 1]; diff --git a/src/Numerics/Statistics/Statistics.cs b/src/Numerics/Statistics/Statistics.cs index e5ef021f..73369c73 100644 --- a/src/Numerics/Statistics/Statistics.cs +++ b/src/Numerics/Statistics/Statistics.cs @@ -61,7 +61,6 @@ namespace MathNet.Numerics.Statistics /// The minimum value in the sample data. public static double Minimum(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); return StreamingStatistics.Minimum(data.Where(d => d.HasValue).Select(d => d.Value)); } @@ -88,7 +87,6 @@ namespace MathNet.Numerics.Statistics /// The maximum value in the sample data. public static double Maximum(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); return StreamingStatistics.Maximum(data.Where(d => d.HasValue).Select(d => d.Value)); } @@ -115,7 +113,6 @@ namespace MathNet.Numerics.Statistics /// The mean of the sample. public static double Mean(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); return StreamingStatistics.Mean(data.Where(d => d.HasValue).Select(d => d.Value)); } @@ -142,7 +139,6 @@ namespace MathNet.Numerics.Statistics /// A subset of samples, sampled from the full population. public static double Variance(this IEnumerable samples) { - if (samples == null) throw new ArgumentNullException("samples"); return StreamingStatistics.Variance(samples.Where(d => d.HasValue).Select(d => d.Value)); } @@ -169,7 +165,6 @@ namespace MathNet.Numerics.Statistics /// The full population data. public static double PopulationVariance(this IEnumerable population) { - if (population == null) throw new ArgumentNullException("population"); return StreamingStatistics.PopulationVariance(population.Where(d => d.HasValue).Select(d => d.Value)); } @@ -196,7 +191,6 @@ namespace MathNet.Numerics.Statistics /// A subset of samples, sampled from the full population. public static double StandardDeviation(this IEnumerable samples) { - if (samples == null) throw new ArgumentNullException("samples"); return StreamingStatistics.StandardDeviation(samples.Where(d => d.HasValue).Select(d => d.Value)); } @@ -223,7 +217,6 @@ namespace MathNet.Numerics.Statistics /// The full population data. public static double PopulationStandardDeviation(this IEnumerable population) { - if (population == null) throw new ArgumentNullException("population"); return StreamingStatistics.PopulationStandardDeviation(population.Where(d => d.HasValue).Select(d => d.Value)); } @@ -268,8 +261,6 @@ namespace MathNet.Numerics.Statistics /// A subset of samples, sampled from the full population. public static double Covariance(this IEnumerable samples1, IEnumerable samples2) { - if (samples1 == null) throw new ArgumentNullException("samples1"); - if (samples2 == null) throw new ArgumentNullException("samples2"); return StreamingStatistics.Covariance(samples1.Where(d => d.HasValue).Select(d => d.Value), samples2.Where(d => d.HasValue).Select(d => d.Value)); } @@ -299,8 +290,6 @@ namespace MathNet.Numerics.Statistics /// The full population data. public static double PopulationCovariance(this IEnumerable population1, IEnumerable population2) { - if (population1 == null) throw new ArgumentNullException("population1"); - if (population2 == null) throw new ArgumentNullException("population2"); return StreamingStatistics.PopulationCovariance(population1.Where(d => d.HasValue).Select(d => d.Value), population2.Where(d => d.HasValue).Select(d => d.Value)); } @@ -310,7 +299,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double Median(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.MedianInplace(array); } @@ -321,7 +309,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double Median(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.MedianInplace(array); } @@ -336,7 +323,6 @@ namespace MathNet.Numerics.Statistics /// Quantile selector, between 0.0 and 1.0 (inclusive). public static double Quantile(this IEnumerable data, double tau) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.QuantileInplace(array, tau); } @@ -351,7 +337,6 @@ namespace MathNet.Numerics.Statistics /// Quantile selector, between 0.0 and 1.0 (inclusive). public static double Quantile(this IEnumerable data, double tau) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.QuantileInplace(array, tau); } @@ -365,7 +350,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func QuantileFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.Quantile(array, tau); @@ -380,7 +364,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func QuantileFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.Quantile(array, tau); @@ -393,7 +376,6 @@ namespace MathNet.Numerics.Statistics /// Quantile selector, between 0.0 and 1.0 (inclusive). public static double InverseCDF(this IEnumerable data, double tau) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.QuantileCustomInplace(array, tau, QuantileDefinition.InverseCDF); } @@ -405,7 +387,6 @@ namespace MathNet.Numerics.Statistics /// Quantile selector, between 0.0 and 1.0 (inclusive). public static double InverseCDF(this IEnumerable data, double tau) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.QuantileCustomInplace(array, tau, QuantileDefinition.InverseCDF); } @@ -416,7 +397,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func InverseCDFFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.QuantileCustom(array, tau, QuantileDefinition.InverseCDF); @@ -428,7 +408,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func InverseCDFFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.QuantileCustom(array, tau, QuantileDefinition.InverseCDF); @@ -445,7 +424,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static double QuantileCustom(this IEnumerable data, double tau, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.QuantileCustomInplace(array, tau, definition); } @@ -461,7 +439,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static double QuantileCustom(this IEnumerable data, double tau, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.QuantileCustomInplace(array, tau, definition); } @@ -476,7 +453,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static Func QuantileCustomFunc(this IEnumerable data, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.QuantileCustom(array, tau, definition); @@ -492,7 +468,6 @@ namespace MathNet.Numerics.Statistics /// Quantile definition, to choose what product/definition it should be consistent with public static Func QuantileCustomFunc(this IEnumerable data, QuantileDefinition definition) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); Array.Sort(array); return tau => SortedArrayStatistics.QuantileCustom(array, tau, definition); @@ -507,7 +482,6 @@ namespace MathNet.Numerics.Statistics /// Percentile selector, between 0 and 100 (inclusive). public static double Percentile(this IEnumerable data, int p) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.PercentileInplace(array, p); } @@ -521,7 +495,6 @@ namespace MathNet.Numerics.Statistics /// Percentile selector, between 0 and 100 (inclusive). public static double Percentile(this IEnumerable data, int p) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.PercentileInplace(array, p); } @@ -534,7 +507,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func PercentileFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); Array.Sort(array); return p => SortedArrayStatistics.Percentile(array, p); @@ -548,7 +520,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func PercentileFunc(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); Array.Sort(array); return p => SortedArrayStatistics.Percentile(array, p); @@ -561,7 +532,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double LowerQuartile(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.LowerQuartileInplace(array); } @@ -573,7 +543,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double LowerQuartile(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.LowerQuartileInplace(array); } @@ -585,7 +554,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double UpperQuartile(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.UpperQuartileInplace(array); } @@ -597,7 +565,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double UpperQuartile(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.UpperQuartileInplace(array); } @@ -609,7 +576,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double InterquartileRange(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.InterquartileRangeInplace(array); } @@ -621,7 +587,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double InterquartileRange(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.InterquartileRangeInplace(array); } @@ -633,7 +598,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double[] FiveNumberSummary(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.FiveNumberSummaryInplace(array); } @@ -645,7 +609,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static double[] FiveNumberSummary(this IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.Where(d => d.HasValue).Select(d => d.Value).ToArray(); return ArrayStatistics.FiveNumberSummaryInplace(array); } @@ -657,7 +620,6 @@ namespace MathNet.Numerics.Statistics /// One-based order of the statistic, must be between 1 and N (inclusive). public static double OrderStatistic(IEnumerable data, int order) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); return ArrayStatistics.OrderStatisticInplace(array, order); } @@ -668,7 +630,6 @@ namespace MathNet.Numerics.Statistics /// The data sample sequence. public static Func OrderStatisticFunc(IEnumerable data) { - if (data == null) throw new ArgumentNullException("data"); var array = data.ToArray(); Array.Sort(array); return order => SortedArrayStatistics.OrderStatistic(array, order); diff --git a/src/Numerics/Statistics/StreamingStatistics.cs b/src/Numerics/Statistics/StreamingStatistics.cs index ac1bb20a..b0a65c60 100644 --- a/src/Numerics/Statistics/StreamingStatistics.cs +++ b/src/Numerics/Statistics/StreamingStatistics.cs @@ -50,8 +50,6 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static double Minimum(IEnumerable stream) { - if (stream == null) throw new ArgumentNullException("stream"); - var min = double.PositiveInfinity; bool any = false; foreach (var d in stream) @@ -72,8 +70,6 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static double Maximum(IEnumerable stream) { - if (stream == null) throw new ArgumentNullException("stream"); - var max = double.NegativeInfinity; bool any = false; foreach (var d in stream) @@ -94,8 +90,6 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static double Mean(IEnumerable stream) { - if (stream == null) throw new ArgumentNullException("stream"); - double mean = 0; ulong m = 0; bool any = false; @@ -115,12 +109,9 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static double Variance(IEnumerable samples) { - if (samples == null) throw new ArgumentNullException("samples"); - double variance = 0; double sum = 0; ulong count = 0; - using (var iterator = samples.GetEnumerator()) { if (iterator.MoveNext()) @@ -138,7 +129,6 @@ namespace MathNet.Numerics.Statistics variance += (diff*diff)/(count*(count - 1)); } } - return count > 1 ? variance/(count - 1) : double.NaN; } @@ -150,12 +140,9 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static double PopulationVariance(IEnumerable population) { - if (population == null) throw new ArgumentNullException("population"); - double variance = 0; double sum = 0; ulong count = 0; - using (var iterator = population.GetEnumerator()) { if (iterator.MoveNext()) @@ -173,7 +160,6 @@ namespace MathNet.Numerics.Statistics variance += (diff*diff)/(count*(count - 1)); } } - return variance/count; } @@ -207,13 +193,10 @@ namespace MathNet.Numerics.Statistics /// Sample stream, no sorting is assumed. public static Tuple MeanVariance(IEnumerable samples) { - if (samples == null) throw new ArgumentNullException("samples"); - double mean = 0; double variance = 0; double sum = 0; ulong count = 0; - using (var iterator = samples.GetEnumerator()) { if (iterator.MoveNext()) @@ -232,7 +215,6 @@ namespace MathNet.Numerics.Statistics mean += (xi - mean) / count; } } - return new Tuple( count > 0 ? mean : double.NaN, count > 1 ? variance/(count - 1) : double.NaN); @@ -247,16 +229,11 @@ namespace MathNet.Numerics.Statistics /// Second sample stream. public static double Covariance(IEnumerable samples1, IEnumerable samples2) { - if (samples1 == null) throw new ArgumentNullException("samples1"); - if (samples2 == null) throw new ArgumentNullException("samples2"); - // https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance - var n = 0; var mean1 = 0.0; var mean2 = 0.0; var comoment = 0.0; - using (var s1 = samples1.GetEnumerator()) using (var s2 = samples2.GetEnumerator()) { @@ -279,7 +256,6 @@ namespace MathNet.Numerics.Statistics throw new ArgumentException(Resources.ArgumentVectorsSameLength); } } - return n > 1 ? comoment/(n - 1) : double.NaN; } @@ -292,16 +268,11 @@ namespace MathNet.Numerics.Statistics /// Second population stream. public static double PopulationCovariance(IEnumerable population1, IEnumerable population2) { - if (population1 == null) throw new ArgumentNullException("population1"); - if (population2 == null) throw new ArgumentNullException("population2"); - // https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance - var n = 0; var mean1 = 0.0; var mean2 = 0.0; var comoment = 0.0; - using (var p1 = population1.GetEnumerator()) using (var p2 = population2.GetEnumerator()) { @@ -324,7 +295,6 @@ namespace MathNet.Numerics.Statistics throw new ArgumentException(Resources.ArgumentVectorsSameLength); } } - return comoment/n; } } diff --git a/src/UnitTests/StatisticsTests/StatisticsTests.cs b/src/UnitTests/StatisticsTests/StatisticsTests.cs index bbc18e88..6e531629 100644 --- a/src/UnitTests/StatisticsTests/StatisticsTests.cs +++ b/src/UnitTests/StatisticsTests/StatisticsTests.cs @@ -63,53 +63,56 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests { double[] data = null; - Assert.Throws(() => Statistics.Minimum(data)); - Assert.Throws(() => Statistics.Maximum(data)); - Assert.Throws(() => Statistics.Mean(data)); - Assert.Throws(() => Statistics.Median(data)); - Assert.Throws(() => Statistics.Quantile(data, 0.3)); - Assert.Throws(() => Statistics.Variance(data)); - Assert.Throws(() => Statistics.StandardDeviation(data)); - Assert.Throws(() => Statistics.PopulationVariance(data)); - Assert.Throws(() => Statistics.PopulationStandardDeviation(data)); - Assert.Throws(() => Statistics.Covariance(data, data)); - Assert.Throws(() => Statistics.PopulationCovariance(data, data)); - - Assert.Throws(() => SortedArrayStatistics.Minimum(data)); - Assert.Throws(() => SortedArrayStatistics.Maximum(data)); - Assert.Throws(() => SortedArrayStatistics.OrderStatistic(data, 1)); - Assert.Throws(() => SortedArrayStatistics.Median(data)); - Assert.Throws(() => SortedArrayStatistics.LowerQuartile(data)); - Assert.Throws(() => SortedArrayStatistics.UpperQuartile(data)); - Assert.Throws(() => SortedArrayStatistics.Percentile(data, 30)); - Assert.Throws(() => SortedArrayStatistics.Quantile(data, 0.3)); - Assert.Throws(() => SortedArrayStatistics.QuantileCustom(data, 0.3, 0, 0, 1, 0)); - Assert.Throws(() => SortedArrayStatistics.QuantileCustom(data, 0.3, QuantileDefinition.Nearest)); - Assert.Throws(() => SortedArrayStatistics.InterquartileRange(data)); - Assert.Throws(() => SortedArrayStatistics.FiveNumberSummary(data)); - - Assert.Throws(() => ArrayStatistics.Minimum(data)); - Assert.Throws(() => ArrayStatistics.Maximum(data)); - Assert.Throws(() => ArrayStatistics.OrderStatisticInplace(data, 1)); - Assert.Throws(() => ArrayStatistics.Mean(data)); - Assert.Throws(() => ArrayStatistics.Variance(data)); - Assert.Throws(() => ArrayStatistics.StandardDeviation(data)); - Assert.Throws(() => ArrayStatistics.PopulationVariance(data)); - Assert.Throws(() => ArrayStatistics.PopulationStandardDeviation(data)); - Assert.Throws(() => ArrayStatistics.Covariance(data, data)); - Assert.Throws(() => ArrayStatistics.PopulationCovariance(data, data)); - Assert.Throws(() => ArrayStatistics.MedianInplace(data)); - Assert.Throws(() => ArrayStatistics.QuantileInplace(data, 0.3)); - - Assert.Throws(() => StreamingStatistics.Minimum(data)); - Assert.Throws(() => StreamingStatistics.Maximum(data)); - Assert.Throws(() => StreamingStatistics.Mean(data)); - Assert.Throws(() => StreamingStatistics.Variance(data)); - Assert.Throws(() => StreamingStatistics.StandardDeviation(data)); - Assert.Throws(() => StreamingStatistics.PopulationVariance(data)); - Assert.Throws(() => StreamingStatistics.PopulationStandardDeviation(data)); - Assert.Throws(() => StreamingStatistics.Covariance(data, data)); - Assert.Throws(() => StreamingStatistics.PopulationCovariance(data, data)); + // ReSharper disable InvokeAsExtensionMethod + Assert.That(() => Statistics.Minimum(data), Throws.Exception); + Assert.That(() => Statistics.Maximum(data), Throws.Exception); + Assert.That(() => Statistics.Mean(data), Throws.Exception); + Assert.That(() => Statistics.Median(data), Throws.Exception); + Assert.That(() => Statistics.Quantile(data, 0.3), Throws.Exception); + Assert.That(() => Statistics.Variance(data), Throws.Exception); + Assert.That(() => Statistics.StandardDeviation(data), Throws.Exception); + Assert.That(() => Statistics.PopulationVariance(data), Throws.Exception); + Assert.That(() => Statistics.PopulationStandardDeviation(data), Throws.Exception); + Assert.That(() => Statistics.Covariance(data, data), Throws.Exception); + Assert.That(() => Statistics.PopulationCovariance(data, data), Throws.Exception); + // ReSharper restore InvokeAsExtensionMethod + + Assert.That(() => SortedArrayStatistics.Minimum(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.Minimum(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.Maximum(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.OrderStatistic(data, 1), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.Median(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.LowerQuartile(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.UpperQuartile(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.Percentile(data, 30), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.Quantile(data, 0.3), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.QuantileCustom(data, 0.3, 0, 0, 1, 0), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.QuantileCustom(data, 0.3, QuantileDefinition.Nearest), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.InterquartileRange(data), Throws.Exception.TypeOf()); + Assert.That(() => SortedArrayStatistics.FiveNumberSummary(data), Throws.Exception.TypeOf()); + + Assert.That(() => ArrayStatistics.Minimum(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.Maximum(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.OrderStatisticInplace(data, 1), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.Mean(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.Variance(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.StandardDeviation(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.PopulationVariance(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.PopulationStandardDeviation(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.Covariance(data, data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.PopulationCovariance(data, data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.MedianInplace(data), Throws.Exception.TypeOf()); + Assert.That(() => ArrayStatistics.QuantileInplace(data, 0.3), Throws.Exception.TypeOf()); + + Assert.That(() => StreamingStatistics.Minimum(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.Maximum(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.Mean(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.Variance(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.StandardDeviation(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.PopulationVariance(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.PopulationStandardDeviation(data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.Covariance(data, data), Throws.Exception.TypeOf()); + Assert.That(() => StreamingStatistics.PopulationCovariance(data, data), Throws.Exception.TypeOf()); } [Test]