001: /*
002: * Copyright 2003-2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.math.stat.descriptive;
017:
018: import java.io.Serializable;
019:
020: /**
021: * Abstract base class for all implementations of the
022: * {@link UnivariateStatistic} interface.
023: * <p>
024: * Provides a default implementation of <code>evaluate(double[]),</code>
025: * delegating to <code>evaluate(double[], int, int)</code> in the natural way.
026: * <p>
027: * Also includes a <code>test</code> method that performs generic parameter
028: * validation for the <code>evaluate</code> methods.
029: * <p>
030: *
031: * @version $Revision: 348519 $ $Date: 2005-11-23 12:12:18 -0700 (Wed, 23 Nov 2005) $
032: */
033: public abstract class AbstractUnivariateStatistic implements
034: UnivariateStatistic, Serializable {
035:
036: /** Serialization UID */
037: private static final long serialVersionUID = -8007759382851708045L;
038:
039: /**
040: * @see org.apache.commons.math.stat.descriptive.UnivariateStatistic#evaluate(double[])
041: */
042: public double evaluate(final double[] values) {
043: test(values, 0, 0);
044: return evaluate(values, 0, values.length);
045: }
046:
047: /**
048: * @see org.apache.commons.math.stat.descriptive.UnivariateStatistic#evaluate(double[], int, int)
049: */
050: public abstract double evaluate(final double[] values,
051: final int begin, final int length);
052:
053: /**
054: * This method is used by <code>evaluate(double[], int, int)</code> methods
055: * to verify that the input parameters designate a subarray of positive length.
056: * <p>
057: * <ul>
058: * <li>returns <code>true</code> iff the parameters designate a subarray of
059: * positive length</li>
060: * <li>throws <code>IllegalArgumentException</code> if the array is null or
061: * or the indices are invalid</li>
062: * <li>returns <code>false</li> if the array is non-null, but
063: * <code>length</code> is 0.
064: * </ul>
065: *
066: * @param values the input array
067: * @param begin index of the first array element to include
068: * @param length the number of elements to include
069: * @return true if the parameters are valid and designate a subarray of positive length
070: * @throws IllegalArgumentException if the indices are invalid or the array is null
071: */
072: protected boolean test(final double[] values, final int begin,
073: final int length) {
074:
075: if (values == null) {
076: throw new IllegalArgumentException(
077: "input value array is null");
078: }
079:
080: if (begin < 0) {
081: throw new IllegalArgumentException(
082: "start position cannot be negative");
083: }
084:
085: if (length < 0) {
086: throw new IllegalArgumentException(
087: "length cannot be negative");
088: }
089:
090: if (begin + length > values.length) {
091: throw new IllegalArgumentException(
092: "begin + length > values.length");
093: }
094:
095: if (length == 0) {
096: return false;
097: }
098:
099: return true;
100:
101: }
102: }
|