1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.math.stat.descriptive.rank;
17
18 import org.apache.commons.math.stat.descriptive.AbstractStorelessUnivariateStatistic;
19
20 /**
21 * Returns the maximum of the available values.
22 * <p>
23 * <ul>
24 * <li>The result is <code>NaN</code> iff all values are <code>NaN</code>
25 * (i.e. <code>NaN</code> values have no impact on the value of the statistic).</li>
26 * <li>If any of the values equals <code>Double.POSITIVE_INFINITY</code>,
27 * the result is <code>Double.POSITIVE_INFINITY.</code></li>
28 * </ul>
29 * <p>
30 * <strong>Note that this implementation is not synchronized.</strong> If
31 * multiple threads access an instance of this class concurrently, and at least
32 * one of the threads invokes the <code>increment()</code> or
33 * <code>clear()</code> method, it must be synchronized externally.
34 *
35 * @version $Revision: 348519 $ $Date: 2005-11-23 12:12:18 -0700 (Wed, 23 Nov 2005) $
36 */
37 public class Max extends AbstractStorelessUnivariateStatistic {
38
39 /** Serializable version identifier */
40 private static final long serialVersionUID = -5593383832225844641L;
41
42 /** Number of values that have been added */
43 private long n;
44
45 /** Current value of the statistic */
46 private double value;
47
48 /**
49 * Create a Max instance
50 */
51 public Max() {
52 n = 0;
53 value = Double.NaN;
54 }
55
56 /**
57 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#increment(double)
58 */
59 public void increment(final double d) {
60 if (d > value || Double.isNaN(value)) {
61 value = d;
62 }
63 n++;
64 }
65
66 /**
67 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#clear()
68 */
69 public void clear() {
70 value = Double.NaN;
71 n = 0;
72 }
73
74 /**
75 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#getResult()
76 */
77 public double getResult() {
78 return value;
79 }
80
81 /**
82 * @see org.apache.commons.math.stat.descriptive.StorelessUnivariateStatistic#getN()
83 */
84 public long getN() {
85 return n;
86 }
87
88 /**
89 * Returns the maximum of the entries in the specified portion of
90 * the input array, or <code>Double.NaN</code> if the designated subarray
91 * is empty.
92 * <p>
93 * Throws <code>IllegalArgumentException</code> if the array is null or
94 * the array index parameters are not valid.
95 * <p>
96 * <ul>
97 * <li>The result is <code>NaN</code> iff all values are <code>NaN</code>
98 * (i.e. <code>NaN</code> values have no impact on the value of the statistic).</li>
99 * <li>If any of the values equals <code>Double.POSITIVE_INFINITY</code>,
100 * the result is <code>Double.POSITIVE_INFINITY.</code></li>
101 * </ul>
102 *
103 * @param values the input array
104 * @param begin index of the first array element to include
105 * @param length the number of elements to include
106 * @return the maximum of the values or Double.NaN if length = 0
107 * @throws IllegalArgumentException if the array is null or the array index
108 * parameters are not valid
109 */
110 public double evaluate(final double[] values, final int begin, final int length) {
111 double max = Double.NaN;
112 if (test(values, begin, length)) {
113 max = values[begin];
114 for (int i = begin; i < begin + length; i++) {
115 if (!Double.isNaN(values[i])) {
116 max = (max > values[i]) ? max : values[i];
117 }
118 }
119 }
120 return max;
121 }
122 }