1 #Region "Microsoft.VisualBasic::4da71ac7517d7efafb5034e7036db872, Microsoft.VisualBasic.Core\Extensions\Math\StatisticsMathExtensions\Linq\EnumerableStatsMedian.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 EnumerableStatsMedian
35     
36     '         Function: (+20 OverloadsMedian
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.Collections.Generic
44 Imports System.Linq
45 Imports System.Runtime.CompilerServices
46
47 Namespace Math.Statistics.Linq
48
49     Public Module EnumerableStatsMedian
50         '
51         ' Summary:
52         '     Computes the Median of a sequence of nullable System.Decimal values.
53         '
54         ' Parameters:
55         '   source:
56         '     A sequence of nullable System.Decimal values to calculate the Median of.
57         '
58         Returns:
59         '     The Median of the sequence of values, or null if the source sequence is
60         '     empty or contains only values that are null.
61         '
62         ' Exceptions:
63         '   System.ArgumentNullException:
64         '     source is null.
65         '
66         '   System.OverflowException:
67         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
68         <Extension>
69         Public Function Median(source As IEnumerable(Of Decimal?)) As Decimal
70             Dim values As IEnumerable(Of Decimal) = source.Coalesce()
71
72             If values.Any() Then
73                 Return values.Median()
74             End If
75
76             Return Nothing
77         End Function
78         '
79         ' Summary:
80         '     Computes the Median of a sequence of System.Decimal values.
81         '
82         ' Parameters:
83         '   source:
84         '     A sequence of System.Decimal values to calculate the Median of.
85         '
86         Returns:
87         '     The Median of the sequence of values.
88         '
89         ' Exceptions:
90         '   System.ArgumentNullException:
91         '     source is null.
92         '
93         '   System.InvalidOperationException:
94         '     source contains no elements.
95         '
96         '   System.OverflowException:
97         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
98         <Extension>
99         Public Function Median(source As IEnumerable(Of Decimal)) As Decimal
100             Dim sortedList = From number In source Order By number Select number
101
102             Dim count As Integer = sortedList.Count()
103             Dim itemIndex As Integer = count \ 2
104
105             If count Mod 2 = 0 Then
106                 ' Even number of items.
107                 Return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2
108             End If
109
110             ' Odd number of items.
111             Return sortedList.ElementAt(itemIndex)
112         End Function
113         '
114         ' Summary:
115         '     Computes the Median of a sequence of nullable System.Double values.
116         '
117         ' Parameters:
118         '   source:
119         '     A sequence of nullable System.Double values to calculate the Median of.
120         '
121         Returns:
122         '     The Median of the sequence of values, or null if the source sequence is
123         '     empty or contains only values that are null.
124         '
125         ' Exceptions:
126         '   System.ArgumentNullException:
127         '     source is null.
128         <Extension>
129         Public Function Median(source As IEnumerable(Of Double?)) As Double
130             Dim values As IEnumerable(Of Double) = source.Coalesce()
131             If values.Any() Then
132                 Return values.Median()
133             End If
134
135             Return Nothing
136         End Function
137         '
138         ' Summary:
139         '     Computes the Median of a sequence of System.Double values.
140         '
141         ' Parameters:
142         '   source:
143         '     A sequence of System.Double values to calculate the Median of.
144         '
145         Returns:
146         '     The Median of the sequence of values.
147         '
148         ' Exceptions:
149         '   System.ArgumentNullException:
150         '     source is null.
151         '
152         '   System.InvalidOperationException:
153         '     source contains no elements.
154         <Extension>
155         Public Function Median(source As IEnumerable(Of Double)) As Double
156             Dim sortedList = From number In source Order By number Select number
157
158             Dim count As Integer = sortedList.Count()
159             Dim itemIndex As Integer = count \ 2
160
161             If count Mod 2 = 0 Then
162                 ' Even number of items.
163                 Return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2
164             End If
165
166             ' Odd number of items.
167             Return sortedList.ElementAt(itemIndex)
168         End Function
169         '
170         ' Summary:
171         '     Computes the Median of a sequence of nullable System.Single values.
172         '
173         ' Parameters:
174         '   source:
175         '     A sequence of nullable System.Single values to calculate the Median of.
176         '
177         Returns:
178         '     The Median of the sequence of values, or null if the source sequence is
179         '     empty or contains only values that are null.
180         '
181         ' Exceptions:
182         '   System.ArgumentNullException:
183         '     source is null.
184         <Extension>
185         Public Function Median(source As IEnumerable(Of Single?)) As Single
186             Dim values As IEnumerable(Of Single) = source.Coalesce()
187             If values.Any() Then
188                 Return values.Median()
189             End If
190
191             Return Nothing
192         End Function
193         '
194         ' Summary:
195         '     Computes the Median of a sequence of System.Single values.
196         '
197         ' Parameters:
198         '   source:
199         '     A sequence of System.Single values to calculate the Median of.
200         '
201         Returns:
202         '     The Median of the sequence of values.
203         '
204         ' Exceptions:
205         '   System.ArgumentNullException:
206         '     source is null.
207         '
208         '   System.InvalidOperationException:
209         '     source contains no elements.
210         <Extension>
211         Public Function Median(source As IEnumerable(Of Single)) As Single
212             Dim sortedList = From number In source Order By number Select number
213
214             Dim count As Integer = sortedList.Count()
215             Dim itemIndex As Integer = count \ 2
216
217             If count Mod 2 = 0 Then
218                 ' Even number of items.
219                 Return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2
220             End If
221
222             ' Odd number of items.
223             Return sortedList.ElementAt(itemIndex)
224         End Function
225         '
226         ' Summary:
227         '     Computes the Median of a sequence of nullable System.Int32 values.
228         '
229         ' Parameters:
230         '   source:
231         '     A sequence of nullable System.Int32values to calculate the Median of.
232         '
233         Returns:
234         '     The Median of the sequence of values, or null if the source sequence is
235         '     empty or contains only values that are null.
236         '
237         ' Exceptions:
238         '   System.ArgumentNullException:
239         '     source is null.
240         '
241         '   System.OverflowException:
242         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
243         <Extension>
244         Public Function Median(source As IEnumerable(Of Integer?)) As Double
245             Dim values As IEnumerable(Of Integer) = source.Coalesce()
246             If values.Any() Then
247                 Return values.Median()
248             End If
249
250             Return Nothing
251         End Function
252         '
253         ' Summary:
254         '     Computes the Median of a sequence of System.Int32 values.
255         '
256         ' Parameters:
257         '   source:
258         '     A sequence of System.Int32 values to calculate the Median of.
259         '
260         Returns:
261         '     The Median of the sequence of values.
262         '
263         ' Exceptions:
264         '   System.ArgumentNullException:
265         '     source is null.
266         '
267         '   System.InvalidOperationException:
268         '     source contains no elements.
269         '
270         '   System.OverflowException:
271         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
272         <Extension>
273         Public Function Median(source As IEnumerable(Of Integer)) As Double
274             Dim sortedList = From number In source Order By number Select CDbl(number)
275
276             Dim count As Integer = sortedList.Count()
277             Dim itemIndex As Integer = count \ 2
278
279             If count Mod 2 = 0 Then
280                 ' Even number of items.
281                 Return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2
282             End If
283
284             ' Odd number of items.
285             Return sortedList.ElementAt(itemIndex)
286         End Function
287         '
288         ' Summary:
289         '     Computes the Median of a sequence of nullable System.Int64 values.
290         '
291         ' Parameters:
292         '   source:
293         '     A sequence of nullable System.Int64 values to calculate the Median of.
294         '
295         Returns:
296         '     The Median of the sequence of values, or null if the source sequence is
297         '     empty or contains only values that are null.
298         '
299         ' Exceptions:
300         '   System.ArgumentNullException:
301         '     source is null.
302         '
303         '   System.OverflowException:
304         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
305         <Extension>
306         Public Function Median(source As IEnumerable(Of Long?)) As Double
307             Dim values As IEnumerable(Of Long) = source.Coalesce()
308             If values.Any() Then
309                 Return values.Median()
310             End If
311
312             Return Nothing
313         End Function
314         '
315         ' Summary:
316         '     Computes the Median of a sequence of System.Int64 values.
317         '
318         ' Parameters:
319         '   source:
320         '     A sequence of System.Int64 values to calculate the Median of.
321         '
322         Returns:
323         '     The Median of the sequence of values.
324         '
325         ' Exceptions:
326         '   System.ArgumentNullException:
327         '     source is null.
328         '
329         '   System.InvalidOperationException:
330         '     source contains no elements.
331         '
332         '   System.OverflowException:
333         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
334         <Extension>
335         Public Function Median(source As IEnumerable(Of Long)) As Double
336             Dim sortedList = From number In source Order By number Select CDbl(number)
337
338             Dim count As Integer = sortedList.Count()
339             Dim itemIndex As Integer = count \ 2
340
341             If count Mod 2 = 0 Then
342                 ' Even number of items.
343                 Return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2
344             End If
345
346             ' Odd number of items.
347             Return sortedList.ElementAt(itemIndex)
348         End Function
349         '
350         ' Summary:
351         '     Computes the Median of a sequence of nullable System.Decimal values that
352         '     are obtained by invoking a transform function on each element of the input
353         '     sequence.
354         '
355         ' Parameters:
356         '   source:
357         '     A sequence of values to calculate the Median of.
358         '
359         '   selector:
360         '     A transform function to apply to each element.
361         '
362         ' Type parameters:
363         '   TSource:
364         '     The type of the elements of source.
365         '
366         Returns:
367         '     The Median of the sequence of values, or null if the source sequence is
368         '     empty or contains only values that are null.
369         '
370         ' Exceptions:
371         '   System.ArgumentNullException:
372         '     source or selector is null.
373         '
374         '   System.OverflowException:
375         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
376         <Extension>
377         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Decimal?)) As Decimal
378             Return source.[Select](selector).Median()
379         End Function
380         '
381         ' Summary:
382         '     Computes the Median of a sequence of System.Decimal values that are obtained
383         '     by invoking a transform function on each element of the input sequence.
384         '
385         ' Parameters:
386         '   source:
387         '     A sequence of values that are used to calculate an Median.
388         '
389         '   selector:
390         '     A transform function to apply to each element.
391         '
392         ' Type parameters:
393         '   TSource:
394         '     The type of the elements of source.
395         '
396         Returns:
397         '     The Median of the sequence of values.
398         '
399         ' Exceptions:
400         '   System.ArgumentNullException:
401         '     source or selector is null.
402         '
403         '   System.InvalidOperationException:
404         '     source contains no elements.
405         '
406         '   System.OverflowException:
407         '     The sum of the elements in the sequence is larger than System.Decimal.MaxValue.
408         <Extension>
409         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Decimal)) As Decimal
410             Return source.[Select](selector).Median()
411         End Function
412         '
413         ' Summary:
414         '     Computes the Median of a sequence of nullable System.Double values that
415         '     are obtained by invoking a transform function on each element of the input
416         '     sequence.
417         '
418         ' Parameters:
419         '   source:
420         '     A sequence of values to calculate the Median of.
421         '
422         '   selector:
423         '     A transform function to apply to each element.
424         '
425         ' Type parameters:
426         '   TSource:
427         '     The type of the elements of source.
428         '
429         Returns:
430         '     The Median of the sequence of values, or null if the source sequence is
431         '     empty or contains only values that are null.
432         '
433         ' Exceptions:
434         '   System.ArgumentNullException:
435         '     source or selector is null.
436         <Extension>
437         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Double?)) As Double
438             Return source.[Select](selector).Median()
439         End Function
440         '
441         ' Summary:
442         '     Computes the Median of a sequence of System.Double values that are obtained
443         '     by invoking a transform function on each element of the input sequence.
444         '
445         ' Parameters:
446         '   source:
447         '     A sequence of values to calculate the Median of.
448         '
449         '   selector:
450         '     A transform function to apply to each element.
451         '
452         ' Type parameters:
453         '   TSource:
454         '     The type of the elements of source.
455         '
456         Returns:
457         '     The Median of the sequence of values.
458         '
459         ' Exceptions:
460         '   System.ArgumentNullException:
461         '     source or selector is null.
462         '
463         '   System.InvalidOperationException:
464         '     source contains no elements.
465         <Extension>
466         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Double)) As Double
467             Return source.[Select](selector).Median()
468         End Function
469         '
470         ' Summary:
471         '     Computes the Median of a sequence of nullable System.Single values that
472         '     are obtained by invoking a transform function on each element of the input
473         '     sequence.
474         '
475         ' Parameters:
476         '   source:
477         '     A sequence of values to calculate the Median of.
478         '
479         '   selector:
480         '     A transform function to apply to each element.
481         '
482         ' Type parameters:
483         '   TSource:
484         '     The type of the elements of source.
485         '
486         Returns:
487         '     The Median of the sequence of values, or null if the source sequence is
488         '     empty or contains only values that are null.
489         '
490         ' Exceptions:
491         '   System.ArgumentNullException:
492         '     source or selector is null.
493         <Extension>
494         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Single?)) As Single
495             Return source.[Select](selector).Median()
496         End Function
497         '
498         ' Summary:
499         '     Computes the Median of a sequence of System.Single values that are obtained
500         '     by invoking a transform function on each element of the input sequence.
501         '
502         ' Parameters:
503         '   source:
504         '     A sequence of values to calculate the Median of.
505         '
506         '   selector:
507         '     A transform function to apply to each element.
508         '
509         ' Type parameters:
510         '   TSource:
511         '     The type of the elements of source.
512         '
513         Returns:
514         '     The Median of the sequence of values.
515         '
516         ' Exceptions:
517         '   System.ArgumentNullException:
518         '     source or selector is null.
519         '
520         '   System.InvalidOperationException:
521         '     source contains no elements.
522         <Extension>
523         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Single)) As Single
524             Return source.[Select](selector).Median()
525         End Function
526         '
527         ' Summary:
528         '     Computes the Median of a sequence of nullable System.Int32 values that are
529         '     obtained by invoking a transform function on each element of the input sequence.
530         '
531         ' Parameters:
532         '   source:
533         '     A sequence of values to calculate the Median of.
534         '
535         '   selector:
536         '     A transform function to apply to each element.
537         '
538         ' Type parameters:
539         '   TSource:
540         '     The type of the elements of source.
541         '
542         Returns:
543         '     The Median of the sequence of values, or null if the source sequence is
544         '     empty or contains only values that are null.
545         '
546         ' Exceptions:
547         '   System.ArgumentNullException:
548         '     source or selector is null.
549         '
550         '   System.OverflowException:
551         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
552         <Extension>
553         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer?)) As Double
554             Return source.[Select](selector).Median()
555         End Function
556         '
557         ' Summary:
558         '     Computes the Median of a sequence of System.Int32 values that are obtained
559         '     by invoking a transform function on each element of the input sequence.
560         '
561         ' Parameters:
562         '   source:
563         '     A sequence of values to calculate the Median of.
564         '
565         '   selector:
566         '     A transform function to apply to each element.
567         '
568         ' Type parameters:
569         '   TSource:
570         '     The type of the elements of source.
571         '
572         Returns:
573         '     The Median of the sequence of values.
574         '
575         ' Exceptions:
576         '   System.ArgumentNullException:
577         '     source or selector is null.
578         '
579         '   System.InvalidOperationException:
580         '     source contains no elements.
581         '
582         '   System.OverflowException:
583         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
584         <Extension>
585         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer)) As Double
586             Return source.[Select](selector).Median()
587         End Function
588         '
589         ' Summary:
590         '     Computes the Median of a sequence of nullable System.Int64 values that are
591         '     obtained by invoking a transform function on each element of the input sequence.
592         '
593         ' Parameters:
594         '   source:
595         '     A sequence of values to calculate the Median of.
596         '
597         '   selector:
598         '     A transform function to apply to each element.
599         '
600         ' Type parameters:
601         '   TSource:
602         '     The type of the elements of source.
603         '
604         Returns:
605         '     The Median of the sequence of values, or null if the source sequence is
606         '     empty or contains only values that are null.
607         <Extension>
608         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Long?)) As Double
609             Return source.[Select](selector).Median()
610         End Function
611         '
612         ' Summary:
613         '     Computes the Median of a sequence of System.Int64 values that are obtained
614         '     by invoking a transform function on each element of the input sequence.
615         '
616         ' Parameters:
617         '   source:
618         '     A sequence of values to calculate the Median of.
619         '
620         '   selector:
621         '     A transform function to apply to each element.
622         '
623         ' Type parameters:
624         '   TSource:
625         '     The type of the elements of source.
626         '
627         Returns:
628         '     The Median of the sequence of values.
629         '
630         ' Exceptions:
631         '   System.ArgumentNullException:
632         '     source or selector is null.
633         '
634         '   System.InvalidOperationException:
635         '     source contains no elements.
636         '
637         '   System.OverflowException:
638         '     The sum of the elements in the sequence is larger than System.Int64.MaxValue.
639         <Extension>
640         Public Function Median(Of TSource)(source As IEnumerable(Of TSource), selector As Func(Of TSource, Long)) As Double
641             Return source.[Select](selector).Median()
642         End Function
643     End Module
644 End Namespace