Example usage for org.apache.commons.math3.exception.util LocalizedFormats NORMALIZE_NAN

List of usage examples for org.apache.commons.math3.exception.util LocalizedFormats NORMALIZE_NAN

Introduction

In this page you can find the example usage for org.apache.commons.math3.exception.util LocalizedFormats NORMALIZE_NAN.

Prototype

LocalizedFormats NORMALIZE_NAN

To view the source code for org.apache.commons.math3.exception.util LocalizedFormats NORMALIZE_NAN.

Click Source Link

Usage

From source file:org.gitools.analysis.groupcomparison.format.math33Preview.MathArrays.java

/**
 * Normalizes an array to make it sum to a specified value.
 * Returns the result of the transformation
 * <pre>/*from   w w w. j a  v  a  2  s .  co  m*/
 *    x |-> x * normalizedSum / sum
 * </pre>
 * applied to each non-NaN element x of the input array, where sum is the
 * sum of the non-NaN entries in the input array.
 * <p/>
 * Throws IllegalArgumentException if {@code normalizedSum} is infinite
 * or NaN and ArithmeticException if the input array contains any infinite elements
 * or sums to 0.
 * <p/>
 * Ignores (i.e., copies unchanged to the output array) NaNs in the input array.
 *
 * @param values        Input array to be normalized
 * @param normalizedSum Target sum for the normalized array
 * @return the normalized array.
 * @throws MathArithmeticException      if the input array contains infinite
 *                                      elements or sums to zero.
 * @throws MathIllegalArgumentException if the target sum is infinite or {@code NaN}.
 * @since 2.1
 */
public static double[] normalizeArray(double[] values, double normalizedSum)
        throws MathIllegalArgumentException, MathArithmeticException {
    if (Double.isInfinite(normalizedSum)) {
        throw new MathIllegalArgumentException(LocalizedFormats.NORMALIZE_INFINITE);
    }
    if (Double.isNaN(normalizedSum)) {
        throw new MathIllegalArgumentException(LocalizedFormats.NORMALIZE_NAN);
    }
    double sum = 0d;
    final int len = values.length;
    double[] out = new double[len];
    for (int i = 0; i < len; i++) {
        if (Double.isInfinite(values[i])) {
            throw new MathIllegalArgumentException(LocalizedFormats.INFINITE_ARRAY_ELEMENT, values[i], i);
        }
        if (!Double.isNaN(values[i])) {
            sum += values[i];
        }
    }
    if (sum == 0) {
        throw new MathArithmeticException(LocalizedFormats.ARRAY_SUMS_TO_ZERO);
    }
    for (int i = 0; i < len; i++) {
        if (Double.isNaN(values[i])) {
            out[i] = Double.NaN;
        } else {
            out[i] = values[i] * normalizedSum / sum;
        }
    }
    return out;
}