http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/Arrays.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/Arrays.java 
b/math/src/main/java/org/apache/mahout/math/Arrays.java
deleted file mode 100644
index 802ffb7..0000000
--- a/math/src/main/java/org/apache/mahout/math/Arrays.java
+++ /dev/null
@@ -1,662 +0,0 @@
-/*
-Copyright 1999 CERN - European Organization for Nuclear Research.
-Permission to use, copy, modify, distribute and sell this software and its 
documentation for any purpose 
-is hereby granted without fee, provided that the above copyright notice appear 
in all copies and 
-that both that copyright notice and this permission notice appear in 
supporting documentation. 
-CERN makes no representations about the suitability of this software for any 
purpose. 
-It is provided "as is" without expressed or implied warranty.
-*/
-package org.apache.mahout.math;
-
-/**
- * Array manipulations; complements <tt>java.util.Arrays</tt>.
- *
- * @see java.util.Arrays
- * @see org.apache.mahout.math.Sorting
- *
- */
-public final class Arrays {
-
-  private Arrays() {
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static byte[] ensureCapacity(byte[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    byte[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new byte[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static char[] ensureCapacity(char[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    char[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new char[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static double[] ensureCapacity(double[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    double[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new double[newCapacity];
-      //for (int i = oldCapacity; --i >= 0; ) newArray[i] = array[i];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static float[] ensureCapacity(float[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    float[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new float[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static int[] ensureCapacity(int[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    int[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new int[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static long[] ensureCapacity(long[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    long[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new long[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static Object[] ensureCapacity(Object[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    Object[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new Object[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static short[] ensureCapacity(short[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    short[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new short[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Ensures that a given array can hold up to <tt>minCapacity</tt> elements.
-   *
-   * Returns the identical array if it can hold at least the number of 
elements specified. Otherwise, returns a new
-   * array with increased capacity containing the same elements, ensuring that 
it can hold at least the number of
-   * elements specified by the minimum capacity argument.
-   *
-   * @param minCapacity the desired minimum capacity.
-   */
-  public static boolean[] ensureCapacity(boolean[] array, int minCapacity) {
-    int oldCapacity = array.length;
-    boolean[] newArray;
-    if (minCapacity > oldCapacity) {
-      int newCapacity = (oldCapacity * 3) / 2 + 1;
-      if (newCapacity < minCapacity) {
-        newCapacity = minCapacity;
-      }
-
-      newArray = new boolean[newCapacity];
-      System.arraycopy(array, 0, newArray, 0, oldCapacity);
-    } else {
-      newArray = array;
-    }
-    return newArray;
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(byte[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(char[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(double[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(float[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(int[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(long[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(Object[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(short[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Returns a string representation of the specified array.  The string 
representation consists of a list of the
-   * arrays's elements, enclosed in square brackets (<tt>"[]"</tt>).  Adjacent 
elements are separated by the characters
-   * <tt>", "</tt> (comma and space).
-   *
-   * @return a string representation of the specified array.
-   */
-  public static String toString(boolean[] array) {
-    StringBuilder buf = new StringBuilder();
-    buf.append('[');
-    int maxIndex = array.length - 1;
-    for (int i = 0; i <= maxIndex; i++) {
-      buf.append(array[i]);
-      if (i < maxIndex) {
-        buf.append(", ");
-      }
-    }
-    buf.append(']');
-    return buf.toString();
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static byte[] trimToCapacity(byte[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      byte[] oldArray = array;
-      array = new byte[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static char[] trimToCapacity(char[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      char[] oldArray = array;
-      array = new char[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static double[] trimToCapacity(double[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      double[] oldArray = array;
-      array = new double[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static float[] trimToCapacity(float[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      float[] oldArray = array;
-      array = new float[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static int[] trimToCapacity(int[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      int[] oldArray = array;
-      array = new int[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static long[] trimToCapacity(long[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      long[] oldArray = array;
-      array = new long[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static Object[] trimToCapacity(Object[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      Object[] oldArray = array;
-      array = new Object[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static short[] trimToCapacity(short[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      short[] oldArray = array;
-      array = new short[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * Ensures that the specified array cannot hold more than 
<tt>maxCapacity</tt> elements. An application can use this
-   * operation to minimize array storage. <p> Returns the identical array if 
<tt>array.length &lt;= maxCapacity</tt>.
-   * Otherwise, returns a new array with a length of <tt>maxCapacity</tt> 
containing the first <tt>maxCapacity</tt>
-   * elements of <tt>array</tt>.
-   *
-   * @param maxCapacity the desired maximum capacity.
-   */
-  public static boolean[] trimToCapacity(boolean[] array, int maxCapacity) {
-    if (array.length > maxCapacity) {
-      boolean[] oldArray = array;
-      array = new boolean[maxCapacity];
-      System.arraycopy(oldArray, 0, array, 0, maxCapacity);
-    }
-    return array;
-  }
-
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static byte[] copyOf(byte[] src, int length) {
-    byte[] result = new byte [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-  
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static char[] copyOf(char[] src, int length) {
-    char[] result = new char [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-  
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static short[] copyOf(short[] src, int length) {
-    short[] result = new short [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-  
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5. 
-   */
-  public static int[] copyOf(int[] src, int length) {
-    int[] result = new int [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-  
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static float[] copyOf(float[] src, int length) {
-    float[] result = new float [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static double[] copyOf(double[] src, int length) {
-    double[] result = new double [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-  
-  /**
-   * {@link java.util.Arrays#copyOf} compatibility with Java 1.5.
-   */
-  public static long[] copyOf(long[] src, int length) {
-    long[] result = new long [length];
-    System.arraycopy(src, 0, result, 0, Math.min(length, src.length));
-    return result;
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/BinarySearch.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/BinarySearch.java 
b/math/src/main/java/org/apache/mahout/math/BinarySearch.java
deleted file mode 100644
index ddb04a7..0000000
--- a/math/src/main/java/org/apache/mahout/math/BinarySearch.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import java.util.Comparator;
-
-public final class BinarySearch {
-
-  private BinarySearch() {}
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code byte} array to search.
-   * @param value
-   *          the {@code byte} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(byte[] array, byte value, int from, int 
to) {
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (value > array[mid]) {
-        from = mid + 1;
-      } else if (value == array[mid]) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-
-    return -mid - (value < array[mid] ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code char} array to search.
-   * @param value
-   *          the {@code char} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(char[] array, char value, int from, int 
to) {
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (value > array[mid]) {
-        from = mid + 1;
-      } else if (value == array[mid]) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (value < array[mid] ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code double} array to search.
-   * @param value
-   *          the {@code double} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(double[] array, double value, int from, 
int to) {
-    long longBits = Double.doubleToLongBits(value);
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (lessThan(array[mid], value)) {
-        from = mid + 1;
-      } else if (longBits == Double.doubleToLongBits(array[mid])) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (lessThan(value, array[mid]) ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code float} array to search.
-   * @param value
-   *          the {@code float} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(float[] array, float value, int from, 
int to) {
-    int intBits = Float.floatToIntBits(value);
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (lessThan(array[mid], value)) {
-        from = mid + 1;
-      } else if (intBits == Float.floatToIntBits(array[mid])) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (lessThan(value, array[mid]) ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code int} array to search.
-   * @param value
-   *          the {@code int} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(int[] array, int value, int from, int 
to) {
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (value > array[mid]) {
-        from = mid + 1;
-      } else if (value == array[mid]) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (value < array[mid] ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code long} array to search.
-   * @param value
-   *          the {@code long} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(long[] array, long value, int from, int 
to) {
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (value > array[mid]) {
-        from = mid + 1;
-      } else if (value == array[mid]) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (value < array[mid] ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code Object} array to search.
-   * @param object
-   *          the {@code Object} element to find
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   *
-   */
-  public static <T extends Comparable<T>> int binarySearchFromTo(T[] array, T 
object, int from, int to) {
-    if (array.length == 0) {
-      return -1;
-    }
-
-    int mid = 0;
-    int result = 0;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if ((result = array[mid].compareTo(object)) < 0) {
-        from = mid + 1;
-      } else if (result == 0) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    return -mid - (result >= 0 ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array using the {@code Comparator} to compare elements.
-   * Searching in an unsorted array has an undefined result. It's also 
undefined
-   * which element is found if there are multiple occurrences of the same
-   * element.
-   *
-   * @param array
-   *          the sorted array to search
-   * @param object
-   *          the element to find
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @param comparator
-   *          the {@code Comparator} used to compare the elements.
-   * @return the non-negative index of the element, or a negative index which
-   */
-  public static <T> int binarySearchFromTo(T[] array, T object, int from, int 
to, Comparator<? super T> comparator) {
-    int mid = 0;
-    int result = 0;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if ((result = comparator.compare(array[mid], object)) < 0) {
-        from = mid + 1;
-      } else if (result == 0) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    return -mid - (result >= 0 ? 1 : 2);
-  }
-
-  /**
-   * Performs a binary search for the specified element in the specified
-   * ascending sorted array. Searching in an unsorted array has an undefined
-   * result. It's also undefined which element is found if there are multiple
-   * occurrences of the same element.
-   *
-   * @param array
-   *          the sorted {@code short} array to search.
-   * @param value
-   *          the {@code short} element to find.
-   * @param from
-   *          the first index to sort, inclusive.
-   * @param to
-   *          the last index to sort, inclusive.
-   * @return the non-negative index of the element, or a negative index which 
is
-   *         {@code -index - 1} where the element would be inserted.
-   */
-  public static int binarySearchFromTo(short[] array, short value, int from, 
int to) {
-    int mid = -1;
-    while (from <= to) {
-      mid = (from + to) >>> 1;
-      if (value > array[mid]) {
-        from = mid + 1;
-      } else if (value == array[mid]) {
-        return mid;
-      } else {
-        to = mid - 1;
-      }
-    }
-    if (mid < 0) {
-      return -1;
-    }
-    return -mid - (value < array[mid] ? 1 : 2);
-  }
-
-  private static boolean lessThan(double double1, double double2) {
-    // A slightly specialized version of
-    // Double.compare(double1, double2) < 0.
-
-    // Non-zero and non-NaN checking.
-    if (double1 < double2) {
-      return true;
-    }
-    if (double1 > double2) {
-      return false;
-    }
-    if (double1 == double2 && double1 != 0.0) {
-      return false;
-    }
-
-    // NaNs are equal to other NaNs and larger than any other double.
-    if (Double.isNaN(double1)) {
-      return false;
-    }
-    if (Double.isNaN(double2)) {
-      return true;
-    }
-
-    // Deal with +0.0 and -0.0.
-    long d1 = Double.doubleToRawLongBits(double1);
-    long d2 = Double.doubleToRawLongBits(double2);
-    return d1 < d2;
-  }
-
-  private static boolean lessThan(float float1, float float2) {
-    // A slightly specialized version of Float.compare(float1, float2) < 0.
-
-    // Non-zero and non-NaN checking.
-    if (float1 < float2) {
-      return true;
-    }
-    if (float1 > float2) {
-      return false;
-    }
-    if (float1 == float2 && float1 != 0.0f) {
-      return false;
-    }
-
-    // NaNs are equal to other NaNs and larger than any other float
-    if (Float.isNaN(float1)) {
-      return false;
-    }
-    if (Float.isNaN(float2)) {
-      return true;
-    }
-
-    // Deal with +0.0 and -0.0
-    int f1 = Float.floatToRawIntBits(float1);
-    int f2 = Float.floatToRawIntBits(float2);
-    return f1 < f2;
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/CardinalityException.java
----------------------------------------------------------------------
diff --git 
a/math/src/main/java/org/apache/mahout/math/CardinalityException.java 
b/math/src/main/java/org/apache/mahout/math/CardinalityException.java
deleted file mode 100644
index 04e7602..0000000
--- a/math/src/main/java/org/apache/mahout/math/CardinalityException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-/**
- * Exception thrown when there is a cardinality mismatch in matrix or vector 
operations.
- * For example, vectors of differing cardinality cannot be added.
- */
-public class CardinalityException extends IllegalArgumentException {
-
-  public CardinalityException(int expected, int cardinality) {
-    super("Required cardinality " + expected + " but got " + cardinality);
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/Centroid.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/Centroid.java 
b/math/src/main/java/org/apache/mahout/math/Centroid.java
deleted file mode 100644
index dceffe1..0000000
--- a/math/src/main/java/org/apache/mahout/math/Centroid.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import org.apache.mahout.math.function.Functions;
-
-/**
- * A centroid is a weighted vector.  We have it delegate to the vector itself 
for lots of operations
- * to make it easy to use vector search classes and such.
- */
-public class Centroid extends WeightedVector {
-  public Centroid(WeightedVector original) {
-    super(original.getVector().like().assign(original), original.getWeight(), 
original.getIndex());
-  }
-
-  public Centroid(int key, Vector initialValue) {
-    super(initialValue, 1, key);
-  }
-
-  public Centroid(int key, Vector initialValue, double weight) {
-    super(initialValue, weight, key);
-  }
-
-  public static Centroid create(int key, Vector initialValue) {
-    if (initialValue instanceof WeightedVector) {
-      return new Centroid(key, new DenseVector(initialValue), 
((WeightedVector) initialValue).getWeight());
-    } else {
-      return new Centroid(key, new DenseVector(initialValue), 1);
-    }
-  }
-
-  public void update(Vector v) {
-    if (v instanceof Centroid) {
-      Centroid c = (Centroid) v;
-      update(c.delegate, c.getWeight());
-    } else {
-      update(v, 1);
-    }
-  }
-
-  public void update(Vector other, final double wy) {
-    final double wx = getWeight();
-    delegate.assign(other, Functions.reweigh(wx, wy));
-    setWeight(wx + wy);
-  }
-
-  @Override
-  public Centroid like() {
-    return new Centroid(getIndex(), getVector().like(), getWeight());
-  }
-
-  /**
-   * Gets the index of this centroid.  Use getIndex instead to maintain 
standard names.
-   */
-  @Deprecated
-  public int getKey() {
-    return getIndex();
-  }
-
-  public void addWeight(double newWeight) {
-    setWeight(getWeight() + newWeight);
-  }
-
-  @Override
-  public String toString() {
-    return String.format("key = %d, weight = %.2f, vector = %s", getIndex(), 
getWeight(), delegate);
-  }
-
-  @SuppressWarnings("CloneDoesntCallSuperClone")
-  @Override
-  public Centroid clone() {
-    return new Centroid(this);
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/CholeskyDecomposition.java
----------------------------------------------------------------------
diff --git 
a/math/src/main/java/org/apache/mahout/math/CholeskyDecomposition.java 
b/math/src/main/java/org/apache/mahout/math/CholeskyDecomposition.java
deleted file mode 100644
index 5cea8e5..0000000
--- a/math/src/main/java/org/apache/mahout/math/CholeskyDecomposition.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import com.google.common.base.Preconditions;
-import org.apache.mahout.math.function.Functions;
-
-/**
- * Cholesky decomposition shamelessly ported from JAMA.
- * <p>
- * A Cholesky decomposition of a semi-positive definite matrix A is a lower 
triangular matrix L such
- * that L L^* = A.  If A is full rank, L is unique.  If A is real, then it 
must be symmetric and R
- * will also be real.
- */
-public class CholeskyDecomposition {
-  private final PivotedMatrix L;
-  private boolean isPositiveDefinite = true;
-
-  public CholeskyDecomposition(Matrix a) {
-    this(a, true);
-  }
-
-  public CholeskyDecomposition(Matrix a, boolean pivot) {
-    int rows = a.rowSize();
-    L = new PivotedMatrix(new DenseMatrix(rows, rows));
-
-    // must be square
-    Preconditions.checkArgument(rows == a.columnSize(), "Must be a Square 
Matrix");
-
-    if (pivot) {
-      decomposeWithPivoting(a);
-    } else {
-      decompose(a);
-    }
-  }
-
-  private void decomposeWithPivoting(Matrix a) {
-    int n = a.rowSize();
-    L.assign(a);
-
-    // pivoted column-wise submatrix cholesky with simple pivoting
-    double uberMax = L.viewDiagonal().aggregate(Functions.MAX, Functions.ABS);
-    for (int k = 0; k < n; k++) {
-      double max = 0;
-      int pivot = k;
-      for (int j = k; j < n; j++) {
-        if (L.get(j, j) > max) {
-          max = L.get(j, j);
-          pivot = j;
-          if (uberMax < Math.abs(max)) {
-            uberMax = Math.abs(max);
-          }
-        }
-      }
-      L.swap(k, pivot);
-
-      double akk = L.get(k, k);
-      double epsilon = 1.0e-10 * Math.max(uberMax, 
L.viewColumn(k).aggregate(Functions.MAX, Functions.ABS));
-
-      if (akk < -epsilon) {
-        // can't have decidedly negative element on diagonal
-        throw new IllegalArgumentException("Matrix is not positive 
semi-definite");
-      } else if (akk <= epsilon) {
-        // degenerate column case.  Set all to zero
-        L.viewColumn(k).assign(0);
-        isPositiveDefinite = false;
-
-        // no need to subtract from remaining sub-matrix
-      } else {
-        // normalize column by diagonal element
-        akk = Math.sqrt(Math.max(0, akk));
-        L.viewColumn(k).viewPart(k, n - k).assign(Functions.div(akk));
-        L.viewColumn(k).viewPart(0, k).assign(0);
-
-        // subtract off scaled version of this column to the right
-        for (int j = k + 1; j < n; j++) {
-          Vector columnJ = L.viewColumn(j).viewPart(k, n - k);
-          Vector columnK = L.viewColumn(k).viewPart(k, n - k);
-          columnJ.assign(columnK, Functions.minusMult(columnK.get(j - k)));
-        }
-
-      }
-    }
-  }
-
-  private void decompose(Matrix a) {
-    int n = a.rowSize();
-    L.assign(a);
-
-    // column-wise submatrix cholesky with simple pivoting
-    for (int k = 0; k < n; k++) {
-
-      double akk = L.get(k, k);
-
-      // set upper part of column to 0.
-      L.viewColumn(k).viewPart(0, k).assign(0);
-
-      double epsilon = 1.0e-10 * L.viewColumn(k).aggregate(Functions.MAX, 
Functions.ABS);
-      if (akk <= epsilon) {
-        // degenerate column case.  Set diagonal to 1, all others to zero
-        L.viewColumn(k).viewPart(k, n - k).assign(0);
-
-        isPositiveDefinite = false;
-
-        // no need to subtract from remaining sub-matrix
-      } else {
-        // normalize column by diagonal element
-        akk = Math.sqrt(Math.max(0, akk));
-        L.set(k, k, akk);
-        L.viewColumn(k).viewPart(k + 1, n - k - 1).assign(Functions.div(akk));
-
-        // now subtract scaled version of column
-        for (int j = k + 1; j < n; j++) {
-          Vector columnJ = L.viewColumn(j).viewPart(j, n - j);
-          Vector columnK = L.viewColumn(k).viewPart(j, n - j);
-          columnJ.assign(columnK, Functions.minusMult(L.get(j, k)));
-        }
-      }
-    }
-  }
-
-  public boolean isPositiveDefinite() {
-    return isPositiveDefinite;
-  }
-
-  public Matrix getL() {
-    return L.getBase();
-  }
-
-  public PivotedMatrix getPermutedL() {
-    return L;
-  }
-
-  /**
-   * @return Returns the permutation of rows and columns that was applied to L
-   */
-  public int[] getPivot() {
-    return L.getRowPivot();
-  }
-
-  public int[] getInversePivot() {
-    return L.getInverseRowPivot();
-  }
-
-  /**
-   * Compute inv(L) * z efficiently.
-   *
-   * @param z
-   */
-  public Matrix solveLeft(Matrix z) {
-    int n = L.columnSize();
-    int nx = z.columnSize();
-
-    Matrix X = new DenseMatrix(n, z.columnSize());
-    X.assign(z);
-
-    // Solve L*Y = Z using back-substitution
-    // note that k and i have to go in a funny order because L is pivoted
-    for (int internalK = 0; internalK < n; internalK++) {
-      int k = L.rowUnpivot(internalK);
-      for (int j = 0; j < nx; j++) {
-        for (int internalI = 0; internalI < internalK; internalI++) {
-          int i = L.rowUnpivot(internalI);
-          X.set(k, j, X.get(k, j) - X.get(i, j) * L.get(k, i));
-        }
-        if (L.get(k, k) != 0) {
-          X.set(k, j, X.get(k, j) / L.get(k, k));
-        } else {
-          X.set(k, j, 0);
-        }
-      }
-    }
-    return X;
-  }
-
-  /**
-   * Compute z * inv(L') efficiently
-   */
-  public Matrix solveRight(Matrix z) {
-    int n = z.columnSize();
-    int nx = z.rowSize();
-
-    Matrix x = new DenseMatrix(z.rowSize(), z.columnSize());
-    x.assign(z);
-
-    // Solve Y*L' = Z using back-substitution
-    for (int internalK = 0; internalK < n; internalK++) {
-      int k = L.rowUnpivot(internalK);
-      for (int j = 0; j < nx; j++) {
-        for (int internalI = 0; internalI < k; internalI++) {
-          int i = L.rowUnpivot(internalI);
-          x.set(j, k, x.get(j, k) - x.get(j, i) * L.get(k, i));
-          if (Double.isInfinite(x.get(j, k)) || Double.isNaN(x.get(j, k))) {
-            throw new IllegalStateException(
-                String.format("Invalid value found at %d,%d (should not be 
possible)", j, k));
-          }
-        }
-        if (L.get(k, k) != 0) {
-          x.set(j, k, x.get(j, k) / L.get(k, k));
-        } else {
-          x.set(j, k, 0);
-        }
-        if (Double.isInfinite(x.get(j, k)) || Double.isNaN(x.get(j, k))) {
-          throw new IllegalStateException(String.format("Invalid value found 
at %d,%d (should not be possible)", j, k));
-        }
-      }
-    }
-    return x;
-  }
-
-}
-

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/ConstantVector.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/ConstantVector.java 
b/math/src/main/java/org/apache/mahout/math/ConstantVector.java
deleted file mode 100644
index f10f631..0000000
--- a/math/src/main/java/org/apache/mahout/math/ConstantVector.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import java.util.Iterator;
-
-import com.google.common.collect.AbstractIterator;
-
-/**
- * Implements a vector with all the same values.
- */
-public class ConstantVector extends AbstractVector {
-  private final double value;
-
-  public ConstantVector(double value, int size) {
-    super(size);
-    this.value = value;
-  }
-
-  /**
-   * Subclasses must override to return an appropriately sparse or dense result
-   *
-   * @param rows    the row cardinality
-   * @param columns the column cardinality
-   * @return a Matrix
-   */
-  @Override
-  protected Matrix matrixLike(int rows, int columns) {
-    return new DenseMatrix(rows, columns);
-  }
-
-  /**
-   * Used internally by assign() to update multiple indices and values at once.
-   * Only really useful for sparse vectors (especially 
SequentialAccessSparseVector).
-   * <p>
-   * If someone ever adds a new type of sparse vectors, this method must merge 
(index, value) pairs into the vector.
-   *
-   * @param updates a mapping of indices to values to merge in the vector.
-   */
-  @Override
-  public void mergeUpdates(OrderedIntDoubleMapping updates) {
-    throw new UnsupportedOperationException("Cannot mutate a ConstantVector");
-  }
-
-  /**
-   * @return true iff this implementation should be considered dense -- that 
it explicitly represents
-   *         every value
-   */
-  @Override
-  public boolean isDense() {
-    return true;
-  }
-
-  /**
-   * @return true iff this implementation should be considered to be iterable 
in index order in an
-   *         efficient way. In particular this implies that {@link 
#iterator()} and {@link
-   *         #iterateNonZero()} return elements in ascending order by index.
-   */
-  @Override
-  public boolean isSequentialAccess() {
-    return true;
-  }
-
-  /**
-   * Iterates over all elements <p>
-   * NOTE: Implementations may choose to reuse the Element returned
-   * for performance reasons, so if you need a copy of it, you should call 
{@link #getElement(int)}
-   * for the given index
-   *
-   * @return An {@link java.util.Iterator} over all elements
-   */
-  @Override
-  public Iterator<Element> iterator() {
-    return new AbstractIterator<Element>() {
-      private int i = 0;
-      private final int n = size();
-      @Override
-      protected Element computeNext() {
-        if (i < n) {
-          return new LocalElement(i++);
-        } else {
-          return endOfData();
-        }
-      }
-    };
-  }
-
-  /**
-   * Iterates over all non-zero elements.<p>
-   * NOTE: Implementations may choose to reuse the Element
-   * returned for performance reasons, so if you need a copy of it, you should 
call {@link
-   * #getElement(int)} for the given index
-   *
-   * @return An {@link java.util.Iterator} over all non-zero elements
-   */
-  @Override
-  public Iterator<Element> iterateNonZero() {
-    return iterator();
-  }
-
-  /**
-   * Return the value at the given index, without checking bounds
-   *
-   * @param index an int index
-   * @return the double at the index
-   */
-  @Override
-  public double getQuick(int index) {
-    return value;
-  }
-
-  /**
-   * Return an empty vector of the same underlying class as the receiver
-   *
-   * @return a Vector
-   */
-  @Override
-  public Vector like() {
-    return new DenseVector(size());
-  }
-
-  @Override
-  public Vector like(int cardinality) {
-    return new DenseVector(cardinality);
-  }
-
-  /**
-   * Set the value at the given index, without checking bounds
-   *
-   * @param index an int index into the receiver
-   * @param value a double value to set
-   */
-  @Override
-  public void setQuick(int index, double value) {
-    throw new UnsupportedOperationException("Can't set a value in a constant 
matrix");
-  }
-
-  /**
-   * Return the number of values in the recipient
-   *
-   * @return an int
-   */
-  @Override
-  public int getNumNondefaultElements() {
-    return size();
-  }
-
-  @Override
-  public double getLookupCost() {
-    return 1;
-  }
-
-  @Override
-  public double getIteratorAdvanceCost() {
-    return 1;
-  }
-
-  @Override
-  public boolean isAddConstantTime() {
-    throw new UnsupportedOperationException("Cannot mutate a ConstantVector");
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/DelegatingVector.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/DelegatingVector.java 
b/math/src/main/java/org/apache/mahout/math/DelegatingVector.java
deleted file mode 100644
index 0b2e36b..0000000
--- a/math/src/main/java/org/apache/mahout/math/DelegatingVector.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import org.apache.mahout.math.function.DoubleDoubleFunction;
-import org.apache.mahout.math.function.DoubleFunction;
-
-/**
- * A delegating vector provides an easy way to decorate vectors with weights 
or id's and such while
- * keeping all of the Vector functionality.
- *
- * This vector implements LengthCachingVector because almost all delegates 
cache the length and
- * the cost of false positives is very low.
- */
-public class DelegatingVector implements Vector, LengthCachingVector {
-  protected Vector delegate;
-
-  public DelegatingVector(Vector v) {
-    delegate = v;
-  }
-
-  protected DelegatingVector() {
-  }
-
-  public Vector getVector() {
-    return delegate;
-  }
-
-  @Override
-  public double aggregate(DoubleDoubleFunction aggregator, DoubleFunction map) 
{
-    return delegate.aggregate(aggregator, map);
-  }
-
-  @Override
-  public double aggregate(Vector other, DoubleDoubleFunction aggregator, 
DoubleDoubleFunction combiner) {
-    return delegate.aggregate(other, aggregator, combiner);
-  }
-
-  @Override
-  public Vector viewPart(int offset, int length) {
-    return delegate.viewPart(offset, length);
-  }
-
-  @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-  @Override
-  public Vector clone() {
-    DelegatingVector r;
-    try {
-      r = (DelegatingVector) super.clone();
-    } catch (CloneNotSupportedException e) {
-      throw new RuntimeException("Clone not supported for DelegatingVector, 
shouldn't be possible");
-    }
-    // delegate points to original without this
-    r.delegate = delegate.clone();
-    return r;
-  }
-
-  @Override
-  public Iterable<Element> all() {
-    return delegate.all();
-  }
-
-  @Override
-  public Iterable<Element> nonZeroes() {
-    return delegate.nonZeroes();
-  }
-
-  @Override
-  public Vector divide(double x) {
-    return delegate.divide(x);
-  }
-
-  @Override
-  public double dot(Vector x) {
-    return delegate.dot(x);
-  }
-
-  @Override
-  public double get(int index) {
-    return delegate.get(index);
-  }
-
-  @Override
-  public Element getElement(int index) {
-    return delegate.getElement(index);
-  }
-
-  /**
-   * Merge a set of (index, value) pairs into the vector.
-   *
-   * @param updates an ordered mapping of indices to values to be merged in.
-   */
-  @Override
-  public void mergeUpdates(OrderedIntDoubleMapping updates) {
-    delegate.mergeUpdates(updates);
-  }
-
-  @Override
-  public Vector minus(Vector that) {
-    return delegate.minus(that);
-  }
-
-  @Override
-  public Vector normalize() {
-    return delegate.normalize();
-  }
-
-  @Override
-  public Vector normalize(double power) {
-    return delegate.normalize(power);
-  }
-
-  @Override
-  public Vector logNormalize() {
-    return delegate.logNormalize();
-  }
-
-  @Override
-  public Vector logNormalize(double power) {
-    return delegate.logNormalize(power);
-  }
-
-  @Override
-  public double norm(double power) {
-    return delegate.norm(power);
-  }
-
-  @Override
-  public double getLengthSquared() {
-    return delegate.getLengthSquared();
-  }
-
-  @Override
-  public void invalidateCachedLength() {
-    if (delegate instanceof LengthCachingVector) {
-      ((LengthCachingVector) delegate).invalidateCachedLength();
-    }
-  }
-
-  @Override
-  public double getDistanceSquared(Vector v) {
-    return delegate.getDistanceSquared(v);
-  }
-
-  @Override
-  public double getLookupCost() {
-    return delegate.getLookupCost();
-  }
-
-  @Override
-  public double getIteratorAdvanceCost() {
-    return delegate.getIteratorAdvanceCost();
-  }
-
-  @Override
-  public boolean isAddConstantTime() {
-    return delegate.isAddConstantTime();
-  }
-
-  @Override
-  public double maxValue() {
-    return delegate.maxValue();
-  }
-
-  @Override
-  public int maxValueIndex() {
-    return delegate.maxValueIndex();
-  }
-
-  @Override
-  public double minValue() {
-    return delegate.minValue();
-  }
-
-  @Override
-  public int minValueIndex() {
-    return delegate.minValueIndex();
-  }
-
-  @Override
-  public Vector plus(double x) {
-    return delegate.plus(x);
-  }
-
-  @Override
-  public Vector plus(Vector x) {
-    return delegate.plus(x);
-  }
-
-  @Override
-  public void set(int index, double value) {
-    delegate.set(index, value);
-  }
-
-  @Override
-  public Vector times(double x) {
-    return delegate.times(x);
-  }
-
-  @Override
-  public Vector times(Vector x) {
-    return delegate.times(x);
-  }
-
-  @Override
-  public double zSum() {
-    return delegate.zSum();
-  }
-
-  @Override
-  public Vector assign(double value) {
-    delegate.assign(value);
-    return this;
-  }
-
-  @Override
-  public Vector assign(double[] values) {
-    delegate.assign(values);
-    return this;
-  }
-
-  @Override
-  public Vector assign(Vector other) {
-    delegate.assign(other);
-    return this;
-  }
-
-  @Override
-  public Vector assign(DoubleDoubleFunction f, double y) {
-    delegate.assign(f, y);
-    return this;
-  }
-
-  @Override
-  public Vector assign(DoubleFunction function) {
-    delegate.assign(function);
-    return this;
-  }
-
-  @Override
-  public Vector assign(Vector other, DoubleDoubleFunction function) {
-    delegate.assign(other, function);
-    return this;
-  }
-
-  @Override
-  public Matrix cross(Vector other) {
-    return delegate.cross(other);
-  }
-
-  @Override
-  public int size() {
-    return delegate.size();
-  }
-
-  @Override
-  public String asFormatString() {
-    return delegate.asFormatString();
-  }
-
-  @Override
-  public int hashCode() {
-    return delegate.hashCode();
-  }
-
-  @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
-  @Override
-  public boolean equals(Object o) {
-    return delegate.equals(o);
-  }
-
-  @Override
-  public String toString() {
-    return delegate.toString();
-  }
-
-  @Override
-  public boolean isDense() {
-    return delegate.isDense();
-  }
-
-  @Override
-  public boolean isSequentialAccess() {
-    return delegate.isSequentialAccess();
-  }
-
-  @Override
-  public double getQuick(int index) {
-    return delegate.getQuick(index);
-  }
-
-  @Override
-  public Vector like() {
-    return new DelegatingVector(delegate.like());
-  }
-
-  @Override
-  public Vector like(int cardinality) {
-    return new DelegatingVector(delegate.like(cardinality));
-  }
-
-  @Override
-  public void setQuick(int index, double value) {
-    delegate.setQuick(index, value);
-  }
-
-  @Override
-  public void incrementQuick(int index, double increment) {
-    delegate.incrementQuick(index, increment);
-  }
-
-  @Override
-  public int getNumNondefaultElements() {
-    return delegate.getNumNondefaultElements();
-  }
-
-  @Override
-  public int getNumNonZeroElements() {
-    return delegate.getNumNonZeroElements();
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/DenseMatrix.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/DenseMatrix.java 
b/math/src/main/java/org/apache/mahout/math/DenseMatrix.java
deleted file mode 100644
index eac449a..0000000
--- a/math/src/main/java/org/apache/mahout/math/DenseMatrix.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import org.apache.mahout.math.flavor.MatrixFlavor;
-
-import java.util.Arrays;
-
-/** Matrix of doubles implemented using a 2-d array */
-public class DenseMatrix extends AbstractMatrix {
-
-  private double[][] values;
-
-  /**
-   * Construct a matrix from the given values
-   * 
-   * @param values
-   *          a double[][]
-   */
-  public DenseMatrix(double[][] values) {
-    this(values, false);
-  }
-
-  /**
-   * Construct a matrix from the given values
-   *
-   * @param values
-   *          a double[][]
-   * @param shallowCopy directly use the supplied array?
-   */
-  public DenseMatrix(double[][] values, boolean shallowCopy) {
-    super(values.length, values[0].length);
-    if (shallowCopy) {
-      this.values = values;
-    } else {
-      this.values = new double[values.length][];
-      for (int i = 0; i < values.length; i++) {
-        this.values[i] = values[i].clone();
-      }
-    }
-  }
-
-  /**
-   * Constructs an empty matrix of the given size.
-   * @param rows  The number of rows in the result.
-   * @param columns The number of columns in the result.
-   */
-  public DenseMatrix(int rows, int columns) {
-    super(rows, columns);
-    this.values = new double[rows][columns];
-  }
-
-  /**
-   * Returns the backing array
-   * @return double[][]
-   */
-  public double[][] getBackingStructure() {
-    return this.values;
-  }
-
-  @Override
-  public Matrix clone() {
-    DenseMatrix clone = (DenseMatrix) super.clone();
-    clone.values = new double[values.length][];
-    for (int i = 0; i < values.length; i++) {
-      clone.values[i] = values[i].clone();
-    }
-    return clone;
-  }
-  
-  @Override
-  public double getQuick(int row, int column) {
-    return values[row][column];
-  }
-  
-  @Override
-  public Matrix like() {
-    return like(rowSize(), columnSize());
-  }
-  
-  @Override
-  public Matrix like(int rows, int columns) {
-    return new DenseMatrix(rows, columns);
-  }
-  
-  @Override
-  public void setQuick(int row, int column, double value) {
-    values[row][column] = value;
-  }
-
-  @Override
-  public Matrix viewPart(int[] offset, int[] size) {
-    int rowOffset = offset[ROW];
-    int rowsRequested = size[ROW];
-    int columnOffset = offset[COL];
-    int columnsRequested = size[COL];
-
-    return viewPart(rowOffset, rowsRequested, columnOffset, columnsRequested);
-  }
-
-  @Override
-  public Matrix viewPart(int rowOffset, int rowsRequested, int columnOffset, 
int columnsRequested) {
-    if (rowOffset < 0) {
-      throw new IndexException(rowOffset, rowSize());
-    }
-    if (rowOffset + rowsRequested > rowSize()) {
-      throw new IndexException(rowOffset + rowsRequested, rowSize());
-    }
-    if (columnOffset < 0) {
-      throw new IndexException(columnOffset, columnSize());
-    }
-    if (columnOffset + columnsRequested > columnSize()) {
-      throw new IndexException(columnOffset + columnsRequested, columnSize());
-    }
-    return new MatrixView(this, new int[]{rowOffset, columnOffset}, new 
int[]{rowsRequested, columnsRequested});
-  }
-
-  @Override
-  public Matrix assign(double value) {
-    for (int row = 0; row < rowSize(); row++) {
-      Arrays.fill(values[row], value);
-    }
-    return this;
-  }
-  
-  public Matrix assign(DenseMatrix matrix) {
-    // make sure the data field has the correct length
-    if (matrix.values[0].length != this.values[0].length || 
matrix.values.length != this.values.length) {
-      this.values = new double[matrix.values.length][matrix.values[0].length];
-    }
-    // now copy the values
-    for (int i = 0; i < this.values.length; i++) {
-      System.arraycopy(matrix.values[i], 0, this.values[i], 0, 
this.values[0].length);
-    }
-    return this;
-  }
-  
-  @Override
-  public Matrix assignColumn(int column, Vector other) {
-    if (rowSize() != other.size()) {
-      throw new CardinalityException(rowSize(), other.size());
-    }
-    if (column < 0 || column >= columnSize()) {
-      throw new IndexException(column, columnSize());
-    }
-    for (int row = 0; row < rowSize(); row++) {
-      values[row][column] = other.getQuick(row);
-    }
-    return this;
-  }
-  
-  @Override
-  public Matrix assignRow(int row, Vector other) {
-    if (columnSize() != other.size()) {
-      throw new CardinalityException(columnSize(), other.size());
-    }
-    if (row < 0 || row >= rowSize()) {
-      throw new IndexException(row, rowSize());
-    }
-    for (int col = 0; col < columnSize(); col++) {
-      values[row][col] = other.getQuick(col);
-    }
-    return this;
-  }
-  
-  @Override
-  public Vector viewRow(int row) {
-    if (row < 0 || row >= rowSize()) {
-      throw new IndexException(row, rowSize());
-    }
-    return new DenseVector(values[row], true);
-  }
-
-  @Override
-  public MatrixFlavor getFlavor() {
-    return MatrixFlavor.DENSELIKE;
-  }
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/DenseSymmetricMatrix.java
----------------------------------------------------------------------
diff --git 
a/math/src/main/java/org/apache/mahout/math/DenseSymmetricMatrix.java 
b/math/src/main/java/org/apache/mahout/math/DenseSymmetricMatrix.java
deleted file mode 100644
index 7252b9b..0000000
--- a/math/src/main/java/org/apache/mahout/math/DenseSymmetricMatrix.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import org.apache.mahout.math.flavor.TraversingStructureEnum;
-
-/**
- * Economy packaging for a dense symmetric in-core matrix.
- */
-public class DenseSymmetricMatrix extends UpperTriangular {
-  public DenseSymmetricMatrix(int n) {
-    super(n);
-  }
-
-  public DenseSymmetricMatrix(double[] data, boolean shallow) {
-    super(data, shallow);
-  }
-
-  public DenseSymmetricMatrix(Vector data) {
-    super(data);
-  }
-
-  public DenseSymmetricMatrix(UpperTriangular mx) {
-    super(mx);
-  }
-
-  @Override
-  public double getQuick(int row, int column) {
-    if (column < row) {
-      int swap = row;
-      row = column;
-      column = swap;
-    }
-    return super.getQuick(row, column);
-  }
-
-  @Override
-  public void setQuick(int row, int column, double value) {
-    if (column < row) {
-      int swap = row;
-      row = column;
-      column = swap;
-    }
-    super.setQuick(row, column, value);
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/mahout/blob/99a5358f/math/src/main/java/org/apache/mahout/math/DenseVector.java
----------------------------------------------------------------------
diff --git a/math/src/main/java/org/apache/mahout/math/DenseVector.java 
b/math/src/main/java/org/apache/mahout/math/DenseVector.java
deleted file mode 100644
index 3961966..0000000
--- a/math/src/main/java/org/apache/mahout/math/DenseVector.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.mahout.math;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import com.google.common.base.Preconditions;
-
-/** Implements vector as an array of doubles */
-public class DenseVector extends AbstractVector {
-
-  private double[] values;
-
-  /** For serialization purposes only */
-  public DenseVector() {
-    super(0);
-  }
-
-  /** Construct a new instance using provided values
-   *  @param values - array of values
-   */
-  public DenseVector(double[] values) {
-    this(values, false);
-  }
-
-  public DenseVector(double[] values, boolean shallowCopy) {
-    super(values.length);
-    this.values = shallowCopy ? values : values.clone();
-  }
-
-  public DenseVector(DenseVector values, boolean shallowCopy) {
-    this(values.values, shallowCopy);
-  }
-
-  /** Construct a new instance of the given cardinality
-   * @param cardinality - number of values in the vector
-   */
-  public DenseVector(int cardinality) {
-    super(cardinality);
-    this.values = new double[cardinality];
-  }
-
-  /**
-   * Copy-constructor (for use in turning a sparse vector into a dense one, 
for example)
-   * @param vector The vector to copy
-   */
-  public DenseVector(Vector vector) {
-    super(vector.size());
-    values = new double[vector.size()];
-    for (Element e : vector.nonZeroes()) {
-      values[e.index()] = e.get();
-    }
-  }
-
-  @Override
-  public double dot(Vector x) {
-    if (!x.isDense()) {
-      return super.dot(x);
-    } else {
-
-      int size = x.size();
-      if (values.length != size) {
-        throw new CardinalityException(values.length, size);
-      }
-
-      double sum = 0;
-      for (int n = 0; n < size; n++) {
-        sum += values[n] * x.getQuick(n);
-      }
-      return sum;
-    }
-  }
-
-  @Override
-  protected Matrix matrixLike(int rows, int columns) {
-    return new DenseMatrix(rows, columns);
-  }
-
-  @SuppressWarnings("CloneDoesntCallSuperClone")
-  @Override
-  public DenseVector clone() {
-    return new DenseVector(values.clone());
-  }
-
-  /**
-   * @return true
-   */
-  @Override
-  public boolean isDense() {
-    return true;
-  }
-
-  /**
-   * @return true
-   */
-  @Override
-  public boolean isSequentialAccess() {
-    return true;
-  }
-
-  @Override
-  protected double dotSelf() {
-    double result = 0.0;
-    int max = size();
-    for (int i = 0; i < max; i++) {
-      result += values[i] * values[i];
-    }
-    return result;
-  }
-
-  @Override
-  public double getQuick(int index) {
-    return values[index];
-  }
-
-  @Override
-  public DenseVector like() {
-    return new DenseVector(size());
-  }
-
-  @Override
-  public Vector like(int cardinality) {
-    return new DenseVector(cardinality);
-  }
-
-  @Override
-  public void setQuick(int index, double value) {
-    invalidateCachedLength();
-    values[index] = value;
-  }
-
-  @Override
-  public void incrementQuick(int index, double increment) {
-    invalidateCachedLength();
-    values[index] += increment;
-  }
-
-  @Override
-  public Vector assign(double value) {
-    invalidateCachedLength();
-    Arrays.fill(values, value);
-    return this;
-  }
-
-  @Override
-  public int getNumNondefaultElements() {
-    return values.length;
-  }
-
-  @Override
-  public int getNumNonZeroElements() {
-    int numNonZeros = 0;
-    for (int index = 0; index < values.length; index++) {
-      if (values[index] != 0) {
-        numNonZeros++;
-      }
-    }
-    return numNonZeros;
-  }
-
-  public Vector assign(DenseVector vector) {
-    // make sure the data field has the correct length
-    if (vector.values.length != this.values.length) {
-      this.values = new double[vector.values.length];
-    }
-    // now copy the values
-    System.arraycopy(vector.values, 0, this.values, 0, this.values.length);
-    return this;
-  }
-
-  @Override
-  public void mergeUpdates(OrderedIntDoubleMapping updates) {
-    int numUpdates = updates.getNumMappings();
-    int[] indices = updates.getIndices();
-    double[] values = updates.getValues();
-    for (int i = 0; i < numUpdates; ++i) {
-      this.values[indices[i]] = values[i];
-    }
-  }
-
-  @Override
-  public Vector viewPart(int offset, int length) {
-    if (offset < 0) {
-      throw new IndexException(offset, size());
-    }
-    if (offset + length > size()) {
-      throw new IndexException(offset + length, size());
-    }
-    return new DenseVectorView(this, offset, length);
-  }
-
-  @Override
-  public double getLookupCost() {
-    return 1;
-  }
-
-  @Override
-  public double getIteratorAdvanceCost() {
-    return 1;
-  }
-
-  @Override
-  public boolean isAddConstantTime() {
-    return true;
-  }
-
-  /**
-   * Returns an iterator that traverses this Vector from 0 to cardinality-1, 
in that order.
-   */
-  @Override
-  public Iterator<Element> iterateNonZero() {
-    return new NonDefaultIterator();
-  }
-
-  @Override
-  public Iterator<Element> iterator() {
-    return new AllIterator();
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof DenseVector) {
-      // Speedup for DenseVectors
-      return Arrays.equals(values, ((DenseVector) o).values);
-    }
-    return super.equals(o);
-  }
-
-  public void addAll(Vector v) {
-    if (size() != v.size()) {
-      throw new CardinalityException(size(), v.size());
-    }
-
-    for (Element element : v.nonZeroes()) {
-      values[element.index()] += element.get();
-    }
-  }
-
-  private final class NonDefaultIterator implements Iterator<Element> {
-    private final DenseElement element = new DenseElement();
-    private int index = -1;
-    private int lookAheadIndex = -1;
-
-    @Override
-    public boolean hasNext() {
-      if (lookAheadIndex == index) {  // User calls hasNext() after a next()
-        lookAhead();
-      } // else user called hasNext() repeatedly.
-      return lookAheadIndex < size();
-    }
-
-    private void lookAhead() {
-      lookAheadIndex++;
-      while (lookAheadIndex < size() && values[lookAheadIndex] == 0.0) {
-        lookAheadIndex++;
-      }
-    }
-
-    @Override
-    public Element next() {
-      if (lookAheadIndex == index) { // If user called next() without checking 
hasNext().
-        lookAhead();
-      }
-
-      Preconditions.checkState(lookAheadIndex > index);
-      index = lookAheadIndex;
-
-      if (index >= size()) { // If the end is reached.
-        throw new NoSuchElementException();
-      }
-
-      element.index = index;
-      return element;
-    }
-
-    @Override
-    public void remove() {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  private final class AllIterator implements Iterator<Element> {
-    private final DenseElement element = new DenseElement();
-
-    private AllIterator() {
-      element.index = -1;
-    }
-
-    @Override
-    public boolean hasNext() {
-      return element.index + 1 < size();
-    }
-
-    @Override
-    public Element next() {
-      if (element.index + 1 >= size()) { // If the end is reached.
-        throw new NoSuchElementException();
-      }
-      element.index++;
-      return element;
-    }
-
-    @Override
-    public void remove() {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  private final class DenseElement implements Element {
-    int index;
-
-    @Override
-    public double get() {
-      return values[index];
-    }
-
-    @Override
-    public int index() {
-      return index;
-    }
-
-    @Override
-    public void set(double value) {
-      invalidateCachedLength();
-      values[index] = value;
-    }
-  }
-
-  private final class DenseVectorView extends VectorView {
-
-    public DenseVectorView(Vector vector, int offset, int cardinality) {
-      super(vector, offset, cardinality);
-    }
-
-    @Override
-    public double dot(Vector x) {
-
-      // Apply custom dot kernels for pairs of dense vectors or their views to 
reduce
-      // view indirection.
-      if (x instanceof DenseVectorView) {
-
-        if (size() != x.size())
-          throw new IllegalArgumentException("Cardinality mismatch during 
dot(x,y).");
-
-        DenseVectorView xv = (DenseVectorView) x;
-        double[] thisValues = ((DenseVector) vector).values;
-        double[] thatValues = ((DenseVector) xv.vector).values;
-        int untilOffset = offset + size();
-
-        int i, j;
-        double sum = 0.0;
-
-        // Provoking SSE
-        int until4 = offset + (size() & ~3);
-        for (
-          i = offset, j = xv.offset;
-          i < until4;
-          i += 4, j += 4
-          ) {
-          sum += thisValues[i] * thatValues[j] +
-            thisValues[i + 1] * thatValues[j + 1] +
-            thisValues[i + 2] * thatValues[j + 2] +
-            thisValues[i + 3] * thatValues[j + 3];
-        }
-
-        // Picking up the slack
-        for (
-          i = offset, j = xv.offset;
-          i < untilOffset;
-          ) {
-          sum += thisValues[i++] * thatValues[j++];
-        }
-        return sum;
-
-      } else if (x instanceof DenseVector ) {
-
-        if (size() != x.size())
-          throw new IllegalArgumentException("Cardinality mismatch during 
dot(x,y).");
-
-        DenseVector xv = (DenseVector) x;
-        double[] thisValues = ((DenseVector) vector).values;
-        double[] thatValues = xv.values;
-        int untilOffset = offset + size();
-
-        int i, j;
-        double sum = 0.0;
-
-        // Provoking SSE
-        int until4 = offset + (size() & ~3);
-        for (
-          i = offset, j = 0;
-          i < until4;
-          i += 4, j += 4
-          ) {
-          sum += thisValues[i] * thatValues[j] +
-            thisValues[i + 1] * thatValues[j + 1] +
-            thisValues[i + 2] * thatValues[j + 2] +
-            thisValues[i + 3] * thatValues[j + 3];
-        }
-
-        // Picking up slack
-        for ( ;
-          i < untilOffset;
-          ) {
-          sum += thisValues[i++] * thatValues[j++];
-        }
-        return sum;
-
-      } else {
-        return super.dot(x);
-      }
-    }
-
-    @Override
-    public Vector viewPart(int offset, int length) {
-      if (offset < 0) {
-        throw new IndexException(offset, size());
-      }
-      if (offset + length > size()) {
-        throw new IndexException(offset + length, size());
-      }
-      return new DenseVectorView(vector, offset + this.offset, length);
-    }
-  }
-}

Reply via email to