1 #Region "Microsoft.VisualBasic::98b9558221e63a9532cc913a8d1e4986, Microsoft.VisualBasic.Core\Extensions\Math\StatisticsMathExtensions\Linq\EnumerableStatsVariance.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module EnumerableStatsVariance
35     
36     '         Function: (+20 Overloads) Variance
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.Runtime.CompilerServices
44 Imports sys = System.Math
45
46 Namespace Math.Statistics.Linq
47
48     Public Module EnumerableStatsVariance
49
50         '         ' Summary:
51         '     Computes the Variance of a sequence of nullable System.Decimal values.
52         '         ' Parameters:
53         '   source:
54         '     A sequence of nullable System.Decimal values to calculate the Variance of.
55         '         ' Returns:
56         '     The Variance of the sequence of values, or null if the source sequence is
57         '     empty or contains only values that are null.
58         '         ' Exceptions:
59         '   System.ArgumentNullException:
60         '     source is null.
61         '         '   System.OverflowException:
62         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
63         <Extension>
64         Public Function Variance(source As IEnumerable(Of Decimal?)) As Decimal
65             Dim values As IEnumerable(Of Decimal) = source.Coalesce()
66             If values.Any() Then
67                 Return values.Variance()
68             End If
69
70             Return Nothing
71         End Function
72         '         ' Summary:
73         '     Computes the Variance of a sequence of System.Decimal values.
74         '         ' Parameters:
75         '   source:
76         '     A sequence of System.Decimal values to calculate the Variance of.
77         '         ' Returns:
78         '     The Variance of the sequence of values.
79         '         ' Exceptions:
80         '   System.ArgumentNullException:
81         '     source is null.
82         '         '   System.InvalidOperationException:
83         '     source contains no elements.
84         '         '   System.OverflowException:
85         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
86         <Extension>
87         Public Function Variance(source As IEnumerable(Of Decimal)) As Decimal
88             Return CDec(source.[Select](Function(x) CDbl(x)).Variance())
89         End Function
90         '         ' Summary:
91         '     Computes the Variance of a sequence of nullable System.Double values.
92         '         ' Parameters:
93         '   source:
94         '     A sequence of nullable System.Double values to calculate the Variance of.
95         '         ' Returns:
96         '     The Variance of the sequence of values, or null if the source sequence is
97         '     empty or contains only values that are null.
98         '         ' Exceptions:
99         '   System.ArgumentNullException:
100         '     source is null.
101         <Extension>
102         Public Function Variance(source As IEnumerable(Of Double?)) As Double
103             Dim values As IEnumerable(Of Double) = source.Coalesce()
104             If values.Any() Then
105                 Return values.Variance()
106             End If
107
108             Return Nothing
109         End Function
110         '         ' Summary:
111         '     Computes the Variance of a sequence of System.Double values.
112         '         ' Parameters:
113         '   source:
114         '     A sequence of System.Double values to calculate the Variance of.
115         '         ' Returns:
116         '     The Variance of the sequence of values.
117         '         ' Exceptions:
118         '   System.ArgumentNullException:
119         '     source is null.
120         '         '   System.InvalidOperationException:
121         '     source contains no elements.
122         <Extension>
123         Public Function Variance(source As IEnumerable(Of Double)) As Double
124             Dim avg As Double = source.Average()
125             Dim d As Double = source.Aggregate(0.0, Function(total, [next]) As Double
126                                                         total += sys.Pow([next] - avg, 2)
127                                                         Return total
128                                                     End Function)
129             Return d / (source.Count() - 1)
130         End Function
131         '         ' Summary:
132         '     Computes the Variance of a sequence of nullable System.Single values.
133         '         ' Parameters:
134         '   source:
135         '     A sequence of nullable System.Single values to calculate the Variance of.
136         '         ' Returns:
137         '     The Variance of the sequence of values, or null if the source sequence is
138         '     empty or contains only values that are null.
139         '         ' Exceptions:
140         '   System.ArgumentNullException:
141         '     source is null.
142         <Extension>
143         Public Function Variance(source As IEnumerable(Of Single?)) As Single
144             Dim values As IEnumerable(Of Single) = source.Coalesce()
145             If values.Any() Then
146                 Return values.Variance()
147             End If
148
149             Return Nothing
150         End Function
151         '         ' Summary:
152         '     Computes the Variance of a sequence of System.Single values.
153         '         ' Parameters:
154         '   source:
155         '     A sequence of System.Single values to calculate the Variance of.
156         '         ' Returns:
157         '     The Variance of the sequence of values.
158         '         ' Exceptions:
159         '   System.ArgumentNullException:
160         '     source is null.
161         '         '   System.InvalidOperationException:
162         '     source contains no elements.
163         <Extension>
164         Public Function Variance(source As IEnumerable(Of Single)) As Single
165             Return CSng(source.[Select](Function(x) CDbl(x)).Variance())
166         End Function
167         '         ' Summary:
168         '     Computes the Variance of a sequence of nullable System.Int32 values.
169         '         ' Parameters:
170         '   source:
171         '     A sequence of nullable System.Int32values to calculate the Variance of.
172         '         ' Returns:
173         '     The Variance of the sequence of values, or null if the source sequence is
174         '     empty or contains only values that are null.
175         '         ' Exceptions:
176         '   System.ArgumentNullException:
177         '     source is null.
178         '         '   System.OverflowException:
179         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
180         <Extension>
181         Public Function Variance(source As IEnumerable(Of Integer?)) As Double
182             Dim values As IEnumerable(Of Integer) = source.Coalesce()
183             If values.Any() Then
184                 Return values.Variance()
185             End If
186
187             Return Nothing
188         End Function
189         '         ' Summary:
190         '     Computes the Variance of a sequence of System.Int32 values.
191         '         ' Parameters:
192         '   source:
193         '     A sequence of System.Int32 values to calculate the Variance of.
194         '         ' Returns:
195         '     The Variance of the sequence of values.
196         '         ' Exceptions:
197         '   System.ArgumentNullException:
198         '     source is null.
199         '         '   System.InvalidOperationException:
200         '     source contains no elements.
201         '         '   System.OverflowException:
202         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
203         <Extension>
204         Public Function Variance(source As IEnumerable(Of Integer)) As Double
205             Return source.[Select](Function(x) CDbl(x)).Variance()
206         End Function
207         '         ' Summary:
208         '     Computes the Variance of a sequence of nullable System.Int64 values.
209         '         ' Parameters:
210         '   source:
211         '     A sequence of nullable System.Int64 values to calculate the Variance of.
212         '         ' Returns:
213         '     The Variance of the sequence of values, or null if the source sequence is
214         '     empty or contains only values that are null.
215         '         ' Exceptions:
216         '   System.ArgumentNullException:
217         '     source is null.
218         '         '   System.OverflowException:
219         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
220         <Extension>
221         Public Function Variance(source As IEnumerable(Of Long?)) As Double
222             Dim values As IEnumerable(Of Long) = source.Coalesce()
223             If values.Any() Then
224                 Return values.Variance()
225             End If
226
227             Return Nothing
228         End Function
229         '         ' Summary:
230         '     Computes the Variance of a sequence of System.Int64 values.
231         '         ' Parameters:
232         '   source:
233         '     A sequence of System.Int64 values to calculate the Variance of.
234         '         ' Returns:
235         '     The Variance of the sequence of values.
236         '         ' Exceptions:
237         '   System.ArgumentNullException:
238         '     source is null.
239         '         '   System.InvalidOperationException:
240         '     source contains no elements.
241         '         '   System.OverflowException:
242         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
243         <Extension>
244         Public Function Variance(source As IEnumerable(Of Long)) As Double
245             Return source.[Select](Function(x) CDbl(x)).Variance()
246         End Function
247         '         ' Summary:
248         '     Computes the Variance of a sequence of nullable System.Decimal values that
249         '     are obtained by invoking a transform function on each element of the input
250         '     sequence.
251         '         ' Parameters:
252         '   source:
253         '     A sequence of values to calculate the Variance of.
254         '         '   selector:
255         '     A transform function to apply to each element.
256         '         ' Type parameters:
257         '   TSource:
258         '     The type of the elements of source.
259         '         ' Returns:
260         '     The Variance of the sequence of values, or null if the source sequence is
261         '     empty or contains only values that are null.
262         '         ' Exceptions:
263         '   System.ArgumentNullException:
264         '     source or selector is null.
265         '         '   System.OverflowException:
266         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
267         <Extension>
268         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Decimal?)) As Decimal
269             Return source.[Select](selector).Variance()
270         End Function
271         '         ' Summary:
272         '     Computes the Variance of a sequence of System.Decimal values that are obtained
273         '     by invoking a transform function on each element of the input sequence.
274         '         ' Parameters:
275         '   source:
276         '     A sequence of values that are used to calculate an Variance.
277         '         '   selector:
278         '     A transform function to apply to each element.
279         '         ' Type parameters:
280         '   TSource:
281         '     The type of the elements of source.
282         '         ' Returns:
283         '     The Variance of the sequence of values.
284         '         ' Exceptions:
285         '   System.ArgumentNullException:
286         '     source or selector is null.
287         '         '   System.InvalidOperationException:
288         '     source contains no elements.
289         '         '   System.OverflowException:
290         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
291         <Extension>
292         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Decimal)) As Decimal
293             Return source.[Select](selector).Variance()
294         End Function
295         '         ' Summary:
296         '     Computes the Variance of a sequence of nullable System.Double values that
297         '     are obtained by invoking a transform function on each element of the input
298         '     sequence.
299         '         ' Parameters:
300         '   source:
301         '     A sequence of values to calculate the Variance of.
302         '         '   selector:
303         '     A transform function to apply to each element.
304         '         ' Type parameters:
305         '   TSource:
306         '     The type of the elements of source.
307         '         ' Returns:
308         '     The Variance of the sequence of values, or null if the source sequence is
309         '     empty or contains only values that are null.
310         '         ' Exceptions:
311         '   System.ArgumentNullException:
312         '     source or selector is null.
313         <Extension>
314         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Double?)) As Double
315             Return source.[Select](selector).Variance()
316         End Function
317         '         ' Summary:
318         '     Computes the Variance of a sequence of System.Double values that are obtained
319         '     by invoking a transform function on each element of the input sequence.
320         '         ' Parameters:
321         '   source:
322         '     A sequence of values to calculate the Variance of.
323         '         '   selector:
324         '     A transform function to apply to each element.
325         '         ' Type parameters:
326         '   TSource:
327         '     The type of the elements of source.
328         '         ' Returns:
329         '     The Variance of the sequence of values.
330         '         ' Exceptions:
331         '   System.ArgumentNullException:
332         '     source or selector is null.
333         '         '   System.InvalidOperationException:
334         '     source contains no elements.
335         <Extension>
336         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Double)) As Double
337             Return source.[Select](selector).Variance()
338         End Function
339         '         ' Summary:
340         '     Computes the Variance of a sequence of nullable System.Single values that
341         '     are obtained by invoking a transform function on each element of the input
342         '     sequence.
343         '         ' Parameters:
344         '   source:
345         '     A sequence of values to calculate the Variance of.
346         '         '   selector:
347         '     A transform function to apply to each element.
348         '         ' Type parameters:
349         '   TSource:
350         '     The type of the elements of source.
351         '         ' Returns:
352         '     The Variance of the sequence of values, or null if the source sequence is
353         '     empty or contains only values that are null.
354         '         ' Exceptions:
355         '   System.ArgumentNullException:
356         '     source or selector is null.
357         <Extension>
358         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Single?)) As Single
359             Return source.[Select](selector).Variance()
360         End Function
361         '         ' Summary:
362         '     Computes the Variance of a sequence of System.Single values that are obtained
363         '     by invoking a transform function on each element of the input sequence.
364         '         ' Parameters:
365         '   source:
366         '     A sequence of values to calculate the Variance of.
367         '         '   selector:
368         '     A transform function to apply to each element.
369         '         ' Type parameters:
370         '   TSource:
371         '     The type of the elements of source.
372         '         ' Returns:
373         '     The Variance of the sequence of values.
374         '         ' Exceptions:
375         '   System.ArgumentNullException:
376         '     source or selector is null.
377         '         '   System.InvalidOperationException:
378         '     source contains no elements.
379         <Extension>
380         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Single)) As Single
381             Return source.[Select](selector).Variance()
382         End Function
383         '         ' Summary:
384         '     Computes the Variance of a sequence of nullable System.Int32 values that are
385         '     obtained by invoking a transform function on each element of the input sequence.
386         '         ' Parameters:
387         '   source:
388         '     A sequence of values to calculate the Variance of.
389         '         '   selector:
390         '     A transform function to apply to each element.
391         '         ' Type parameters:
392         '   TSource:
393         '     The type of the elements of source.
394         '         ' Returns:
395         '     The Variance of the sequence of values, or null if the source sequence is
396         '     empty or contains only values that are null.
397         '         ' Exceptions:
398         '   System.ArgumentNullException:
399         '     source or selector is null.
400         '         '   System.OverflowException:
401         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
402         <Extension>
403         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer?)) As Double
404             Return source.[Select](selector).Variance()
405         End Function
406         '         ' Summary:
407         '     Computes the Variance of a sequence of System.Int32 values that are obtained
408         '     by invoking a transform function on each element of the input sequence.
409         '         ' Parameters:
410         '   source:
411         '     A sequence of values to calculate the Variance of.
412         '         '   selector:
413         '     A transform function to apply to each element.
414         '         ' Type parameters:
415         '   TSource:
416         '     The type of the elements of source.
417         '         ' Returns:
418         '     The Variance of the sequence of values.
419         '         ' Exceptions:
420         '   System.ArgumentNullException:
421         '     source or selector is null.
422         '         '   System.InvalidOperationException:
423         '     source contains no elements.
424         '         '   System.OverflowException:
425         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
426         <Extension>
427         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer)) As Double
428             Return source.[Select](selector).Variance()
429         End Function
430         '         ' Summary:
431         '     Computes the Variance of a sequence of nullable System.Int64 values that are
432         '     obtained by invoking a transform function on each element of the input sequence.
433         '         ' Parameters:
434         '   source:
435         '     A sequence of values to calculate the Variance of.
436         '         '   selector:
437         '     A transform function to apply to each element.
438         '         ' Type parameters:
439         '   TSource:
440         '     The type of the elements of source.
441         '         ' Returns:
442         '     The Variance of the sequence of values, or null if the source sequence is
443         '     empty or contains only values that are null.
444         <Extension>
445         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Long?)) As Double
446             Return source.[Select](selector).Variance()
447         End Function
448         '         ' Summary:
449         '     Computes the Variance of a sequence of System.Int64 values that are obtained
450         '     by invoking a transform function on each element of the input sequence.
451         '         ' Parameters:
452         '   source:
453         '     A sequence of values to calculate the Variance of.
454         '         '   selector:
455         '     A transform function to apply to each element.
456         '         ' Type parameters:
457         '   TSource:
458         '     The type of the elements of source.
459         '         ' Returns:
460         '     The Variance of the sequence of values.
461         '         ' Exceptions:
462         '   System.ArgumentNullException:
463         '     source or selector is null.
464         '         '   System.InvalidOperationException:
465         '     source contains no elements.
466         '         '   System.OverflowException:
467         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
468         <Extension>
469         Public Function Variance(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Long)) As Double
470             Return source.[Select](selector).Variance()
471         End Function
472     End Module
473 End Namespace