You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by sr...@apache.org on 2009/08/11 14:04:38 UTC

svn commit: r803081 [5/7] - in /lucene/mahout/trunk: core/src/main/java/org/apache/mahout/cf/taste/eval/ core/src/main/java/org/apache/mahout/cf/taste/hadoop/ core/src/main/java/org/apache/mahout/cf/taste/impl/common/ core/src/main/java/org/apache/maho...

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
 
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
 import org.apache.mahout.cf.taste.impl.common.IteratorIterable;
 import org.apache.mahout.cf.taste.impl.common.IteratorUtils;
 import org.apache.mahout.cf.taste.impl.common.RandomUtils;
@@ -31,13 +31,11 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.NoSuchElementException;
 
 public final class GenericUserSimilarity implements UserSimilarity {
 
-  private final Map<Comparable<?>, Map<Comparable<?>, Double>> similarityMaps =
-          new FastMap<Comparable<?>, Map<Comparable<?>, Double>>();
+  private final FastByIDMap<FastByIDMap<Double>> similarityMaps = new FastByIDMap<FastByIDMap<Double>>();
 
   public GenericUserSimilarity(Iterable<UserUserSimilarity> similarities) {
     initSimilarityMaps(similarities);
@@ -49,14 +47,14 @@
   }
 
   public GenericUserSimilarity(UserSimilarity otherSimilarity, DataModel dataModel) throws TasteException {
-    List<? extends Comparable<?>> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
+    List<Long> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
     Iterator<UserUserSimilarity> it = new DataModelSimilaritiesIterator(otherSimilarity, userIDs);
     initSimilarityMaps(new IteratorIterable<UserUserSimilarity>(it));
   }
 
   public GenericUserSimilarity(UserSimilarity otherSimilarity, DataModel dataModel, int maxToKeep)
       throws TasteException {
-    List<? extends Comparable<?>> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
+    List<Long> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
     Iterator<UserUserSimilarity> it = new DataModelSimilaritiesIterator(otherSimilarity, userIDs);
     Iterable<UserUserSimilarity> keptSimilarities =
         TopItems.getTopUserUserSimilarities(maxToKeep, new IteratorIterable<UserUserSimilarity>(it));
@@ -65,23 +63,22 @@
 
   private void initSimilarityMaps(Iterable<UserUserSimilarity> similarities) {
     for (UserUserSimilarity uuc : similarities) {
-      Comparable<?> similarityUser1 = uuc.getUserID1();
-      Comparable<?> similarityUser2 = uuc.getUserID2();
-      int compare = ((Comparable<Object>) similarityUser1).compareTo(similarityUser2);
-      if (compare != 0) {
+      long similarityUser1 = uuc.getUserID1();
+      long similarityUser2 = uuc.getUserID2();
+      if (similarityUser1 != similarityUser2) {
         // Order them -- first key should be the "smaller" one
-        Comparable<?> user1;
-        Comparable<?> user2;
-        if (compare < 0) {
+        long user1;
+        long user2;
+        if (similarityUser1 < similarityUser2) {
           user1 = similarityUser1;
           user2 = similarityUser2;
         } else {
           user1 = similarityUser2;
           user2 = similarityUser1;
         }
-        Map<Comparable<?>, Double> map = similarityMaps.get(user1);
+        FastByIDMap<Double> map = similarityMaps.get(user1);
         if (map == null) {
-          map = new FastMap<Comparable<?>, Double>();
+          map = new FastByIDMap<Double>();
           similarityMaps.put(user1, map);
         }
         map.put(user2, uuc.getValue());
@@ -91,21 +88,20 @@
   }
 
   @Override
-  public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) {
-    int compare = ((Comparable<Object>) userID1).compareTo(userID2);
-    if (compare == 0) {
+  public double userSimilarity(long userID1, long userID2) {
+    if (userID1 == userID2) {
       return 1.0;
     }
-    Comparable<?> first;
-    Comparable<?> second;
-    if (compare < 0) {
+    long first;
+    long second;
+    if (userID1 < userID2) {
       first = userID1;
       second = userID2;
     } else {
       first = userID2;
       second = userID1;
     }
-    Map<Comparable<?>, Double> nextMap = similarityMaps.get(first);
+    FastByIDMap<Double> nextMap = similarityMaps.get(first);
     if (nextMap == null) {
       return Double.NaN;
     }
@@ -125,14 +121,11 @@
 
   public static final class UserUserSimilarity implements Comparable<UserUserSimilarity> {
 
-    private final Comparable<?> userID1;
-    private final Comparable<?> userID2;
+    private final long userID1;
+    private final long userID2;
     private final double value;
 
-    public UserUserSimilarity(Comparable<?> userID1, Comparable<?> userID2, double value) {
-      if (userID1 == null || userID2 == null) {
-        throw new IllegalArgumentException("A user is null");
-      }
+    public UserUserSimilarity(long userID1, long userID2, double value) {
       if (Double.isNaN(value) || value < -1.0 || value > 1.0) {
         throw new IllegalArgumentException("Illegal value: " + value);
       }
@@ -141,11 +134,11 @@
       this.value = value;
     }
 
-    public Comparable<?> getUserID1() {
+    public long getUserID1() {
       return userID1;
     }
 
-    public Comparable<?> getUserID2() {
+    public long getUserID2() {
       return userID2;
     }
 
@@ -171,12 +164,12 @@
         return false;
       }
       UserUserSimilarity otherSimilarity = (UserUserSimilarity) other;
-      return otherSimilarity.userID1.equals(userID1) && otherSimilarity.userID2.equals(userID2) && otherSimilarity.value == value;
+      return otherSimilarity.userID1 == userID1 && otherSimilarity.userID2 == userID2 && otherSimilarity.value == value;
     }
 
     @Override
     public int hashCode() {
-      return userID1.hashCode() ^ userID2.hashCode() ^ RandomUtils.hashDouble(value);
+      return (int) userID1 ^ (int) userID2 ^ RandomUtils.hashDouble(value);
     }
 
   }
@@ -184,13 +177,13 @@
   private static final class DataModelSimilaritiesIterator implements Iterator<UserUserSimilarity> {
 
     private final UserSimilarity otherSimilarity;
-    private final List<? extends Comparable<?>> userIDs;
+    private final List<Long> userIDs;
     private final int size;
     private int i;
-    private Comparable<?> userID1;
+    private long userID1;
     private int j;
 
-    private DataModelSimilaritiesIterator(UserSimilarity otherSimilarity, List<? extends Comparable<?>> userIDs) {
+    private DataModelSimilaritiesIterator(UserSimilarity otherSimilarity, List<Long> userIDs) {
       this.otherSimilarity = otherSimilarity;
       this.userIDs = userIDs;
       this.size = userIDs.size();
@@ -209,7 +202,7 @@
       if (!hasNext()) {
         throw new NoSuchElementException();
       }
-      Comparable<?> userID2 = userIDs.get(j);
+      long userID2 = userIDs.get(j);
       double similarity;
       try {
         similarity = otherSimilarity.userSimilarity(userID1, userID2);

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
 
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
 import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
@@ -46,16 +46,19 @@
   }
 
   @Override
-  public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
+  public double userSimilarity(long userID1, long userID2) throws TasteException {
 
-    FastSet<Comparable<?>> prefs1 = dataModel.getItemIDsFromUser(userID1);
-    FastSet<Comparable<?>> prefs2 = dataModel.getItemIDsFromUser(userID2);
+    FastIDSet prefs1 = dataModel.getItemIDsFromUser(userID1);
+    FastIDSet prefs2 = dataModel.getItemIDsFromUser(userID2);
 
     int prefs1Size = prefs1.size();
     int prefs2Size = prefs2.size();
     int intersectionSize = prefs1Size < prefs2Size ?
         prefs2.intersectionSize(prefs1) :
         prefs1.intersectionSize(prefs2);
+    if (intersectionSize == 0) {
+      return Double.NaN;
+    }
     int numItems = dataModel.getNumItems();
     double logLikelihood = LogLikelihoodSimilarity.twoLogLambda(intersectionSize,
                                                                 prefs1Size - intersectionSize,
@@ -65,11 +68,11 @@
   }
 
   @Override
-  public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
-    if (itemID1 == null || itemID2 == null) {
-      throw new IllegalArgumentException("item1 or item2 is null");
-    }
+  public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
     int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, itemID2);
+    if (preferring1and2 == 0) {
+      return Double.NaN;
+    }
     int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
     int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
     int numUsers = dataModel.getNumUsers();

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java Tue Aug 11 12:04:35 2009
@@ -44,12 +44,7 @@
   }
 
   @Override
-  public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
-
-    if (userID1 == null || userID2 == null) {
-      throw new IllegalArgumentException("userID1 or userID2 is null");
-    }
-
+  public double userSimilarity(long userID1, long userID2) throws TasteException {
     PreferenceArray xPrefs = dataModel.getPreferencesFromUser(userID1);
     PreferenceArray yPrefs = dataModel.getPreferencesFromUser(userID2);
     int xLength = xPrefs.length();
@@ -75,8 +70,8 @@
     xPrefs.sortByItem();
     yPrefs.sortByItem();
 
-    Comparable<?> xIndex = xPrefs.getItemID(0);
-    Comparable<?> yIndex = yPrefs.getItemID(0);
+    long xIndex = xPrefs.getItemID(0);
+    long yIndex = yPrefs.getItemID(0);
     int xPrefIndex = 0;
     int yPrefIndex = 0;
 
@@ -84,7 +79,7 @@
     int count = 0;
 
     while (true) {
-      int compare = ((Comparable<Object>) xIndex).compareTo(yIndex);
+      int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0;
       if (compare == 0) {
         double diff = xPrefs.getValue(xPrefIndex) - yPrefs.getValue(yPrefIndex);
         sumXYRankDiff2 += diff * diff;

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
 
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
 import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
@@ -56,14 +56,10 @@
   }
 
   @Override
-  public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
+  public double userSimilarity(long userID1, long userID2) throws TasteException {
 
-    if (userID1 == null || userID2 == null) {
-      throw new IllegalArgumentException("userID1 or userID2 is null");
-    }
-
-    FastSet<Comparable<?>> xPrefs = dataModel.getItemIDsFromUser(userID1);
-    FastSet<Comparable<?>> yPrefs = dataModel.getItemIDsFromUser(userID2);
+    FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1);
+    FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2);
 
     if (xPrefs.isEmpty() && yPrefs.isEmpty()) {
       return Double.NaN;
@@ -73,6 +69,9 @@
     }
 
     int intersectionSize = xPrefs.intersectionSize(yPrefs);
+    if (intersectionSize == 0) {
+      return Double.NaN;
+    }
 
     int unionSize = xPrefs.size() + yPrefs.size() - intersectionSize;
 
@@ -80,10 +79,7 @@
   }
 
   @Override
-  public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
-    if (itemID1 == null || itemID2 == null) {
-      throw new IllegalArgumentException("itemID1 or itemID2 is null");
-    }
+  public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
     int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, itemID2);
     int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
     int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -70,9 +70,6 @@
                                        String itemBIDColumn,
                                        String similarityColumn,
                                        String getItemItemSimilaritySQL) {
-
-    log.debug("Creating AbstractJDBCItemSimilarity...");
-
     checkNotNullAndLog("similarityTable", similarityTable);
     checkNotNullAndLog("itemAIDColumn", itemAIDColumn);
     checkNotNullAndLog("itemBIDColumn", itemBIDColumn);
@@ -110,15 +107,14 @@
   }
 
   @Override
-  public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
+  public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
 
-    int compare = ((Comparable<Object>) itemID1).compareTo(itemID2);
-    if (compare == 0) {
+    if (itemID1 == itemID2) {
       return 1.0;
     }
     // Order as smaller - larger
-    if (compare > 0) {
-      Comparable<?> temp = itemID1;
+    if (itemID1 > itemID2) {
+      long temp = itemID1;
       itemID1 = itemID2;
       itemID2 = temp;
     }
@@ -132,8 +128,8 @@
       stmt = conn.prepareStatement(getItemItemSimilaritySQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
       stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
       stmt.setFetchSize(getFetchSize());
-      stmt.setObject(1, itemID1);
-      stmt.setObject(2, itemID2);
+      stmt.setLong(1, itemID1);
+      stmt.setLong(2, itemID2);
 
       log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
       rs = stmt.executeQuery();

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -39,8 +39,8 @@
  *
  * <pre>
  * CREATE TABLE taste_item_similarity (
- *   item_id_a INT NOT NULL,
- *   item_id_b INT NOT NULL,
+ *   item_id_a BIGINT NOT NULL,
+ *   item_id_b BIGINT NOT NULL,
  *   similarity FLOAT NOT NULL,
  *   PRIMARY KEY (item_id_a, item_id_b),
  * )

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java Tue Aug 11 12:04:35 2009
@@ -26,7 +26,7 @@
  * <p>Applies "case amplification" to similarities. This essentially makes big values bigger and small values smaller by
  * raising each score to a power. It could however be used to achieve the opposite effect.</p>
  */
-public final class CaseAmplification implements SimilarityTransform<Object> {
+public final class CaseAmplification implements SimilarityTransform {
 
   private final double factor;
 
@@ -47,14 +47,14 @@
    * <p>Transforms one similarity value. This implementation is such that it's possible to define this transformation on
    * one value in isolation. The "thing" parameters are therefore unused.</p>
    *
-   * @param thing1 unused
-   * @param thing2 unused
+   * @param id1 unused
+   * @param id2 unused
    * @param value  similarity to transform
    * @return <code>value<sup>factor</sup></code> if value is nonnegative; <code>-value<sup>-factor</sup></code>
    *         otherwise
    */
   @Override
-  public double transformSimilarity(Object thing1, Object thing2, double value) {
+  public double transformSimilarity(long id1, long id2, double value) {
     return value < 0.0 ? -Math.pow(-value, factor) : Math.pow(value, factor);
   }
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java Tue Aug 11 12:04:35 2009
@@ -17,16 +17,16 @@
 
 package org.apache.mahout.cf.taste.impl.transforms;
 
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
 
 import java.util.Map;
 
 /** <p>A simple, fast utility class that maps keys to counts.</p> */
-final class Counters<T> {
+final class Counters {
 
-  private final Map<T, int[]> counts = new FastMap<T, int[]>();
+  private final FastByIDMap<int[]> counts = new FastByIDMap<int[]>();
 
-  void increment(T key) {
+  void increment(long key) {
     int[] count = counts.get(key);
     if (count == null) {
       int[] newCount = new int[1];
@@ -37,7 +37,7 @@
     }
   }
 
-  int getCount(T key) {
+  int getCount(long key) {
     int[] count = counts.get(key);
     return count == null ? 0 : count[0];
   }
@@ -46,7 +46,7 @@
     return counts.size();
   }
 
-  Iterable<Map.Entry<T, int[]>> getEntrySet() {
+  Iterable<Map.Entry<Long, int[]>> getEntrySet() {
     return counts.entrySet();
   }
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,8 @@
 
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
 import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.model.Preference;
@@ -27,7 +28,6 @@
 import org.apache.mahout.cf.taste.transforms.PreferenceTransform;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicReference;
@@ -51,7 +51,7 @@
   private final DataModel dataModel;
   private final RefreshHelper refreshHelper;
   private final double logBase;
-  private final AtomicReference<Map<Comparable<?>, Double>> iufFactors;
+  private final AtomicReference<FastByIDMap<Double>> iufFactors;
 
   /**
    * <p>Creates a {@link InverseUserFrequency} transformation. Computations use the given log base.</p>
@@ -69,7 +69,7 @@
     }
     this.dataModel = dataModel;
     this.logBase = logBase;
-    this.iufFactors = new AtomicReference<Map<Comparable<?>, Double>>(new FastMap<Comparable<?>, Double>());
+    this.iufFactors = new AtomicReference<FastByIDMap<Double>>(new FastByIDMap<Double>());
     this.refreshHelper = new RefreshHelper(new Callable<Object>() {
       @Override
       public Object call() throws TasteException {
@@ -101,23 +101,24 @@
   }
 
   private synchronized void recompute() throws TasteException {
-    Counters<Comparable<?>> itemPreferenceCounts = new Counters<Comparable<?>>();
+    Counters itemPreferenceCounts = new Counters();
     int numUsers = 0;
-    for (Comparable<?> userID : dataModel.getUserIDs()) {
-      PreferenceArray prefs = dataModel.getPreferencesFromUser(userID);
+    LongPrimitiveIterator it = dataModel.getUserIDs();
+    while (it.hasNext()) {
+      PreferenceArray prefs = dataModel.getPreferencesFromUser(it.nextLong());
       int size = prefs.length();
       for (int i = 0; i < size; i++) {
         itemPreferenceCounts.increment(prefs.getItemID(i));
       }
       numUsers++;
     }
-    Map<Comparable<?>, Double> newIufFactors = new FastMap<Comparable<?>, Double>(itemPreferenceCounts.size());
+    FastByIDMap<Double> newIufFactors = new FastByIDMap<Double>(itemPreferenceCounts.size());
     double logFactor = Math.log(logBase);
-    for (Map.Entry<Comparable<?>, int[]> entry : itemPreferenceCounts.getEntrySet()) {
+    for (Map.Entry<Long, int[]> entry : itemPreferenceCounts.getEntrySet()) {
       newIufFactors.put(entry.getKey(),
           Math.log((double) numUsers / (double) entry.getValue()[0]) / logFactor);
     }
-    iufFactors.set(Collections.unmodifiableMap(newIufFactors));
+    iufFactors.set(newIufFactors);
   }
 
   @Override

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java Tue Aug 11 12:04:35 2009
@@ -32,7 +32,8 @@
 import java.util.Collection;
 
 /**
- * <p>Normalizes preference values for a user by converting them to <a href="http://mathworld.wolfram.com/z-Score.html">"z-scores"</a>.
+ * <p>Normalizes preference values for a user by converting them to
+ * <a href="http://mathworld.wolfram.com/z-Score.html">"z-scores"</a>.
  * This process normalizes preference values to adjust for variation in mean and variance of a user's preferences.</p>
  *
  * <p>Imagine two users, one who tends to rate every movie he/she sees four or five stars, and another who uses the full
@@ -42,11 +43,11 @@
 public final class ZScore implements PreferenceTransform {
 
   private final DataModel dataModel;
-  private final Cache<Comparable<?>, RunningAverageAndStdDev> meanAndStdevs;
+  private final Cache<Long, RunningAverageAndStdDev> meanAndStdevs;
 
   public ZScore(DataModel dataModel) {
     this.dataModel = dataModel;
-    this.meanAndStdevs = new Cache<Comparable<?>, RunningAverageAndStdDev>(new MeanStdevRetriever());
+    this.meanAndStdevs = new Cache<Long, RunningAverageAndStdDev>(new MeanStdevRetriever());
     refresh(null);
   }
 
@@ -74,10 +75,10 @@
     return "ZScore";
   }
 
-  private class MeanStdevRetriever implements Retriever<Comparable<?>, RunningAverageAndStdDev> {
+  private class MeanStdevRetriever implements Retriever<Long, RunningAverageAndStdDev> {
 
     @Override
-    public RunningAverageAndStdDev get(Comparable<?> userID) throws TasteException {
+    public RunningAverageAndStdDev get(Long userID) throws TasteException {
       RunningAverageAndStdDev running = new FullRunningAverageAndStdDev();
       PreferenceArray prefs = dataModel.getPreferencesFromUser(userID);
       int size = prefs.length();

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java Tue Aug 11 12:04:35 2009
@@ -21,7 +21,8 @@
 import org.apache.mahout.cf.taste.common.NoSuchUserException;
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
 
 import java.util.List;
 
@@ -32,10 +33,10 @@
 public interface DataModel extends Refreshable {
 
   /**
-   * @return a {@link List} of all user IDs in the model, in order
+   * @return all user IDs in the model, in order
    * @throws TasteException if an error occurs while accessing the data
    */
-  Iterable<Comparable<?>> getUserIDs() throws TasteException;
+  LongPrimitiveIterator getUserIDs() throws TasteException;
 
   /**
    * @param userID ID of user to get prefs for
@@ -43,7 +44,7 @@
    * @throws NoSuchUserException if the user does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  PreferenceArray getPreferencesFromUser(Comparable<?> userID) throws TasteException;
+  PreferenceArray getPreferencesFromUser(long userID) throws TasteException;
 
   /**
    * @param userID ID of user to get prefs for
@@ -51,13 +52,13 @@
    * @throws NoSuchUserException if the user does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  FastSet<Comparable<?>> getItemIDsFromUser(Comparable<?> userID) throws TasteException;
+  FastIDSet getItemIDsFromUser(long userID) throws TasteException;
 
   /**
    * @return a {@link List} of all item IDs in the model, in order
    * @throws TasteException if an error occurs while accessing the data
    */
-  Iterable<Comparable<?>> getItemIDs() throws TasteException;
+  LongPrimitiveIterator getItemIDs() throws TasteException;
 
   /**
    * @param itemID item ID
@@ -65,7 +66,7 @@
    * @throws NoSuchItemException if the item does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  PreferenceArray getPreferencesForItem(Comparable<?> itemID) throws TasteException;
+  PreferenceArray getPreferencesForItem(long itemID) throws TasteException;
 
   /**
    * Retrieves the preference value for a single user and item.
@@ -76,7 +77,7 @@
    * @throws NoSuchUserException if the user does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  Float getPreferenceValue(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+  Float getPreferenceValue(long userID, long itemID) throws TasteException;
 
   /**
    * @return total number of items known to the model. This is generally the union of all items
@@ -99,7 +100,7 @@
    *                                  of up to 2 items are needed and supported
    * @throws NoSuchItemException if an item does not exist
    */
-  int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException;
+  int getNumUsersWithPreferenceFor(long... itemIDs) throws TasteException;
 
   /**
    * <p>Sets a particular preference (item plus rating) for a user.</p>
@@ -111,7 +112,7 @@
    * @throws NoSuchUserException if the user does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  void setPreference(Comparable<?> userID, Comparable<?> itemID, float value) throws TasteException;
+  void setPreference(long userID, long itemID, float value) throws TasteException;
 
   /**
    * <p>Removes a particular preference for a user.</p>
@@ -122,6 +123,6 @@
    * @throws NoSuchUserException if the user does not exist
    * @throws TasteException if an error occurs while accessing the data
    */
-  void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+  void removePreference(long userID, long itemID) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java Tue Aug 11 12:04:35 2009
@@ -18,10 +18,10 @@
 package org.apache.mahout.cf.taste.model;
 
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
 
 import javax.sql.DataSource;
-import java.util.Map;
 
 public interface JDBCDataModel extends DataModel {
 
@@ -36,8 +36,8 @@
    *
    * @return all user preference data
    */
-  Map<Comparable<?>, PreferenceArray> exportWithPrefs() throws TasteException;
+  FastByIDMap<PreferenceArray> exportWithPrefs() throws TasteException;
 
-  Map<Comparable<?>, FastSet<Comparable<?>>> exportWithIDsOnly() throws TasteException;
+  FastByIDMap<FastIDSet> exportWithIDsOnly() throws TasteException;
 
 }
\ No newline at end of file

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java Tue Aug 11 12:04:35 2009
@@ -24,10 +24,10 @@
 public interface Preference {
 
   /** @return ID of user who prefers the item */
-  Comparable<?> getUserID();
+  long getUserID();
 
   /** @return item ID that is preferred */
-  Comparable<?> getItemID();
+  long getItemID();
 
   /**
    * @return strength of the preference for that item. Zero should indicate "no preference either way"; positive values

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java Tue Aug 11 12:04:35 2009
@@ -31,13 +31,13 @@
 
   void set(int i, Preference pref);
 
-  Comparable<?> getUserID(int i);
+  long getUserID(int i);
 
-  void setUserID(int i, Comparable<?> userID);
+  void setUserID(int i, long userID);
 
-  Comparable<?> getItemID(int i);
+  long getItemID(int i);
 
-  void setItemID(int i, Comparable<?> itemID);
+  void setItemID(int i, long itemID);
 
   float getValue(int i);
 

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
 
-import java.util.Collection;
-
 /**
  * <p>Implementations of this interface compute a "neighborhood" of users like a given user. This
  * neighborhood can be used to compute recommendations then.</p>
@@ -30,10 +28,9 @@
 
   /**
    * @param userID ID of user for which a neighborhood will be computed
-   * @return {@link Collection} of IDs of users in the neighborhood
-   * @throws org.apache.mahout.cf.taste.common.TasteException
-   *          if an error occurs while accessing data
+   * @return IDs of users in the neighborhood
+   * @throws TasteException if an error occurs while accessing data
    */
-  Collection<Comparable<?>> getUserNeighborhood(Comparable<?> userID) throws TasteException;
+  long[] getUserNeighborhood(long userID) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java Tue Aug 11 12:04:35 2009
@@ -18,6 +18,7 @@
 package org.apache.mahout.cf.taste.recommender;
 
 import org.apache.mahout.cf.taste.common.TasteException;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
 
 import java.util.Collection;
 
@@ -31,7 +32,7 @@
    * @return {@link Collection} of IDs of users in the requested user's cluster
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  Collection<Comparable<?>> getCluster(Comparable<?> userID) throws TasteException;
+  FastIDSet getCluster(long userID) throws TasteException;
 
   /**
    * <p>Returns all clusters of users.</p>
@@ -39,6 +40,6 @@
    * @return {@link Collection} of {@link Collection}s of user IDs
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  Collection<Collection<Comparable<?>>> getClusters() throws TasteException;
+  FastIDSet[] getClusters() throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java Tue Aug 11 12:04:35 2009
@@ -18,7 +18,7 @@
 package org.apache.mahout.cf.taste.recommender;
 
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.Pair;
+import org.apache.mahout.cf.taste.impl.common.LongPair;
 
 import java.util.List;
 
@@ -31,7 +31,7 @@
    * @return items most similar to the given item, ordered from most similar to least
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<RecommendedItem> mostSimilarItems(Comparable<?> itemID, int howMany) throws TasteException;
+  List<RecommendedItem> mostSimilarItems(long itemID, int howMany) throws TasteException;
 
   /**
    * @param itemID   ID of item for which to find most similar other items
@@ -41,9 +41,9 @@
    * @return itemss most similar to the given item, ordered from most similar to least
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<RecommendedItem> mostSimilarItems(Comparable<?> itemID,
+  List<RecommendedItem> mostSimilarItems(long itemID,
                                          int howMany,
-                                         Rescorer<Pair<Comparable<?>, Comparable<?>>> rescorer) throws TasteException;
+                                         Rescorer<LongPair> rescorer) throws TasteException;
 
   /**
    * @param itemIDs IDs of item for which to find most similar other items
@@ -51,7 +51,7 @@
    * @return items most similar to the given items, ordered from most similar to least
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<RecommendedItem> mostSimilarItems(List<Comparable<?>> itemIDs, int howMany) throws TasteException;
+  List<RecommendedItem> mostSimilarItems(long[] itemIDs, int howMany) throws TasteException;
 
   /**
    * @param itemIDs  IDs of item for which to find most similar other items
@@ -61,9 +61,9 @@
    * @return items most similar to the given items, ordered from most similar to least
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<RecommendedItem> mostSimilarItems(List<Comparable<?>> itemIDs,
+  List<RecommendedItem> mostSimilarItems(long[] itemIDs,
                                          int howMany,
-                                         Rescorer<Pair<Comparable<?>, Comparable<?>>> rescorer) throws TasteException;
+                                         Rescorer<LongPair> rescorer) throws TasteException;
 
   /**
    * <p>Lists the items that were most influential in recommending a given item to a given user. Exactly how
@@ -82,7 +82,6 @@
    * given item to least
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<RecommendedItem> recommendedBecause(Comparable<?> userID, Comparable<?> itemID, int howMany)
-          throws TasteException;
+  List<RecommendedItem> recommendedBecause(long userID, long itemID, int howMany) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java Tue Aug 11 12:04:35 2009
@@ -24,7 +24,7 @@
 public interface RecommendedItem extends Comparable<RecommendedItem> {
 
   /** @return the recommended item ID */
-  Comparable<?> getItemID();
+  long getItemID();
 
   /**
    * <p>A value expressing the strength of the preference for the recommended item. The range of the values

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java Tue Aug 11 12:04:35 2009
@@ -35,7 +35,7 @@
    * @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to least
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
-  List<RecommendedItem> recommend(Comparable<?> userID, int howMany) throws TasteException;
+  List<RecommendedItem> recommend(long userID, int howMany) throws TasteException;
 
   /**
    * @param userID   user for which recommendations are to be computed
@@ -44,7 +44,7 @@
    * @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to least
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
-  List<RecommendedItem> recommend(Comparable<?> userID, int howMany, Rescorer<Comparable<?>> rescorer)
+  List<RecommendedItem> recommend(long userID, int howMany, Rescorer<Long> rescorer)
           throws TasteException;
 
   /**
@@ -54,7 +54,7 @@
    *         preference for the item. If a preference cannot be estimated, returns {@link Double#NaN}
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
-  float estimatePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+  float estimatePreference(long userID, long itemID) throws TasteException;
 
   /**
    * @param userID user to set preference for
@@ -62,14 +62,14 @@
    * @param value  preference value
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
-  void setPreference(Comparable<?> userID, Comparable<?> itemID, float value) throws TasteException;
+  void setPreference(long userID, long itemID, float value) throws TasteException;
 
   /**
    * @param userID user from which to remove preference
    * @param itemID item for which to remove preference
    * @throws TasteException if an error occurs while accessing the {@link DataModel}
    */
-  void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+  void removePreference(long userID, long itemID) throws TasteException;
 
   /** @return {@link DataModel} used by this {@link Recommender} */
   DataModel getDataModel();

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java Tue Aug 11 12:04:35 2009
@@ -17,9 +17,7 @@
 package org.apache.mahout.cf.taste.recommender;
 
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.Pair;
-
-import java.util.List;
+import org.apache.mahout.cf.taste.impl.common.LongPair;
 
 /** <p>Interface implemented by "user-based" recommenders.</p> */
 public interface UserBasedRecommender extends Recommender {
@@ -30,7 +28,7 @@
    * @return users most similar to the given user
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<Comparable<?>> mostSimilarUserIDs(Comparable<?> userID, int howMany) throws TasteException;
+  long[] mostSimilarUserIDs(long userID, int howMany) throws TasteException;
 
   /**
    * @param userID   ID of user for which to find most similar other users
@@ -40,9 +38,6 @@
    * @return IDs of users most similar to the given user
    * @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
    */
-  List<Comparable<?>> mostSimilarUserIDs(Comparable<?> userID,
-                                         int howMany,
-                                         Rescorer<Pair<Comparable<?>,
-                                         Comparable<?>>> rescorer) throws TasteException;
+  long[] mostSimilarUserIDs(long userID, int howMany, Rescorer<LongPair> rescorer) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java Tue Aug 11 12:04:35 2009
@@ -19,16 +19,16 @@
 
 import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.TasteException;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
 import org.apache.mahout.cf.taste.impl.common.RunningAverage;
 import org.apache.mahout.cf.taste.model.PreferenceArray;
 
-import java.util.List;
-import java.util.Set;
-
 /**
- * <p>Implementations store item-item preference diffs for a {@link org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender}.
- * It actually does a bit more for this implementation, like listing all items that may be considered for recommedation,
- * in order to maximize what implementations can do to optimize the slope-one algorithm.</p>
+ * <p>Implementations store item-item preference diffs for a
+ * {@link org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender}.
+ * It actually does a bit more for this implementation, like listing all items that may be
+ * considered for recommendation, in order to maximize what implementations can do to optimize
+ * the slope-one algorithm.</p>
  *
  * @see org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender
  */
@@ -39,18 +39,18 @@
    *         <code>itemID1</code> and <code>itemID2</code>, in that direction; that is, it's the average of item 2's
    *         preferences minus item 1's preferences
    */
-  RunningAverage getDiff(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException;
+  RunningAverage getDiff(long itemID1, long itemID2) throws TasteException;
 
   /**
    * @param userID user ID to get diffs for
    * @param itemID itemID to assess
    * @param prefs  user's preferendces
-   * @return {@link List} of {@link RunningAverage} for that user's item-item diffs
+   * @return {@link RunningAverage}s for that user's item-item diffs
    */
-  RunningAverage[] getDiffs(Comparable<?> userID, Comparable<?> itemID, PreferenceArray prefs) throws TasteException;
+  RunningAverage[] getDiffs(long userID, long itemID, PreferenceArray prefs) throws TasteException;
 
   /** @return {@link RunningAverage} encapsulating the average preference for the given item */
-  RunningAverage getAverageItemPref(Comparable<?> itemID) throws TasteException;
+  RunningAverage getAverageItemPref(long itemID) throws TasteException;
 
   /**
    * <p>Updates internal data structures to reflect an update in a preference value for an item.</p>
@@ -59,12 +59,12 @@
    * @param prefDelta amount by which preference value changed (or its old value, if being removed
    * @param remove    if <code>true</code>, operation reflects a removal rather than change of preference
    */
-  void updateItemPref(Comparable<?> itemID, float prefDelta, boolean remove) throws TasteException;
+  void updateItemPref(long itemID, float prefDelta, boolean remove) throws TasteException;
 
   /**
    * @return item IDs that may possibly be recommended to the given user, which may not be all items since
    *         the item-item diff matrix may be sparse
    */
-  Set<Comparable<?>> getRecommendableItemIDs(Comparable<?> userID) throws TasteException;
+  FastIDSet getRecommendableItemIDs(long userID) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -37,6 +37,6 @@
    * @return similarity between the items, in [-1,1]
    * @throws TasteException if an error occurs while accessing the data
    */
-  double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException;
+  double itemSimilarity(long itemID1, long itemID2) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java Tue Aug 11 12:04:35 2009
@@ -35,6 +35,6 @@
    * @return inferred preference
    * @throws TasteException if an error occurs while inferring
    */
-  float inferPreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+  float inferPreference(long userID, long itemID) throws TasteException;
 
 }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java Tue Aug 11 12:04:35 2009
@@ -36,7 +36,7 @@
    * @return similarity between the two users, in [-1,1]
    * @throws TasteException if an error occurs while accessing the data
    */
-  double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException;
+  double userSimilarity(long userID1, long userID2) throws TasteException;
 
   /**
    * <p>Attaches a {@link PreferenceInferrer} to the {@link UserSimilarity} implementation.</p>

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java Tue Aug 11 12:04:35 2009
@@ -23,12 +23,12 @@
  * <p>Implementations encapsulate some transformation on similarity values between two things, where things might be
  * IDs of users or items or something else.</p>
  */
-public interface SimilarityTransform<T> extends Refreshable {
+public interface SimilarityTransform extends Refreshable {
 
   /**
    * @param value original similarity between thing1 and thing2 (should be in [-1,1])
    * @return transformed similarity (should be in [-1,1])
    */
-  double transformSimilarity(T thing1, T thing2, double value);
+  double transformSimilarity(long id1, long id2, double value);
 
 }

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
 
 import junit.textui.TestRunner;
 import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
 import org.apache.mahout.cf.taste.impl.common.RandomUtils;
 import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
 import org.apache.mahout.cf.taste.impl.model.GenericPreference;
@@ -41,8 +41,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
 import java.util.Random;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -91,20 +89,14 @@
   }
 
   private DataModel createModel() {
-    List<Comparable<?>> itemIDs = new ArrayList<Comparable<?>>(NUM_ITEMS);
-    for (int i = 0; i < NUM_ITEMS; i++) {
-      itemIDs.add(String.valueOf(i));
-    }
-    Map<Comparable<?>, PreferenceArray> data = new FastMap<Comparable<?>, PreferenceArray>(NUM_USERS);
+    FastByIDMap<PreferenceArray> data = new FastByIDMap<PreferenceArray>(NUM_USERS);
     for (int i = 0; i < NUM_USERS; i++) {
-      String userID = String.valueOf(i);
-
       int numPrefs = random.nextInt(NUM_PREFS) + 1;
       PreferenceArray prefs = new GenericUserPreferenceArray(numPrefs);
       for (int j = 0; j < numPrefs; j++) {
-        prefs.set(j, new GenericPreference(userID, itemIDs.get(random.nextInt(NUM_ITEMS)), random.nextFloat()));
+        prefs.set(j, new GenericPreference(i, random.nextInt(NUM_ITEMS), random.nextFloat()));
       }
-      data.put(userID, prefs);
+      data.put(i, prefs);
     }
     return new GenericDataModel(data);
   }
@@ -140,11 +132,11 @@
     @Override
     public Object call() throws TasteException {
       for (int i = 0; i < NUM_USERS / 2; i++) {
-        recommender.recommend(String.valueOf(random.nextInt(NUM_USERS)), 10);
+        recommender.recommend(random.nextInt(NUM_USERS), 10);
       }
       recommender.refresh(null);
       for (int i = NUM_USERS / 2; i < NUM_USERS; i++) {
-        recommender.recommend(String.valueOf(random.nextInt(NUM_USERS)), 10);
+        recommender.recommend(random.nextInt(NUM_USERS), 10);
       }
       return null;
     }

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java Tue Aug 11 12:04:35 2009
@@ -18,7 +18,7 @@
 package org.apache.mahout.cf.taste.impl;
 
 import junit.framework.TestCase;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
 import org.apache.mahout.cf.taste.impl.common.RandomUtils;
 import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
 import org.apache.mahout.cf.taste.impl.model.GenericPreference;
@@ -29,7 +29,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 public abstract class TasteTestCase extends TestCase {
 
@@ -42,13 +41,13 @@
     RandomUtils.useTestSeed();
   }
 
-  public static DataModel getDataModel(Comparable<?>[] userIDs, Double[][] prefValues) {
-    Map<Comparable<?>, PreferenceArray> result = new FastMap<Comparable<?>, PreferenceArray>();
+  public static DataModel getDataModel(long[] userIDs, Double[][] prefValues) {
+    FastByIDMap<PreferenceArray> result = new FastByIDMap<PreferenceArray>();
     for (int i = 0; i < userIDs.length; i++) {
       List<Preference> prefsList = new ArrayList<Preference>();
       for (int j = 0; j < prefValues[i].length; j++) {
         if (prefValues[i][j] != null) {
-          prefsList.add(new GenericPreference(userIDs[i], String.valueOf(j), prefValues[i][j].floatValue()));
+          prefsList.add(new GenericPreference(userIDs[i], j, prefValues[i][j].floatValue()));
         }
       }
       if (!prefsList.isEmpty()) {
@@ -60,7 +59,7 @@
 
   public static DataModel getDataModel() {
     return getDataModel(
-            new Comparable<?>[] {"test1", "test2", "test3", "test4"},
+            new long[] {1, 2, 3, 4},
             new Double[][] {
                     {0.1, 0.3},
                     {0.2, 0.3, 0.3},
@@ -69,4 +68,13 @@
             });
   }
 
+  protected static boolean arrayContains(long[] array, long value) {
+    for (long l : array) {
+      if (l == value) {
+        return true;
+      }
+    }
+    return false;
+  }
+
 }

Copied: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java (from r802574, lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java)
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java?p2=lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java&p1=lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java&r1=802574&r2=803081&rev=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java Tue Aug 11 12:04:35 2009
@@ -24,97 +24,103 @@
 import java.util.Random;
 import java.util.Set;
 
-/** <p>Tests {@link org.apache.mahout.cf.taste.impl.common.FastSet}.</p> */
-public final class FastSetTest extends TasteTestCase {
+/** <p>Tests {@link FastIDSet}.</p> */
+public final class FastIDSetTest extends TasteTestCase {
 
   public void testContainsAndAdd() {
-    FastSet<String> set = new FastSet<String>();
-    assertFalse(set.contains("foo"));
-    set.add("foo");
-    assertTrue(set.contains("foo"));
+    FastIDSet set = new FastIDSet();
+    assertFalse(set.contains(1));
+    set.add(1);
+    assertTrue(set.contains(1));
   }
 
-
   public void testRemove() {
-    FastSet<String> set = new FastSet<String>();
-    set.add("foo");
-    set.remove("foo");
+    FastIDSet set = new FastIDSet();
+    set.add(1);
+    set.remove(1);
     assertEquals(0, set.size());
     assertTrue(set.isEmpty());
-    assertFalse(set.contains("foo"));
+    assertFalse(set.contains(1));
   }
 
 
   public void testClear() {
-    FastSet<String> set = new FastSet<String>();
-    set.add("foo");
+    FastIDSet set = new FastIDSet();
+    set.add(1);
     set.clear();
     assertEquals(0, set.size());
     assertTrue(set.isEmpty());
-    assertFalse(set.contains("foo"));
+    assertFalse(set.contains(1));
   }
 
   public void testSizeEmpty() {
-    FastSet<String> set = new FastSet<String>();
+    FastIDSet set = new FastIDSet();
     assertEquals(0, set.size());
     assertTrue(set.isEmpty());
-    set.add("foo");
+    set.add(1);
     assertEquals(1, set.size());
     assertFalse(set.isEmpty());
-    set.remove("foo");
+    set.remove(1);
     assertEquals(0, set.size());
     assertTrue(set.isEmpty());
   }
 
   public void testContains() {
-    FastSet<String> set = buildTestFastSet();
-    assertTrue(set.contains("foo"));
-    assertTrue(set.contains("baz"));
-    assertTrue(set.contains("alpha"));
-    assertFalse(set.contains("something"));
+    FastIDSet set = buildTestFastSet();
+    assertTrue(set.contains(1));
+    assertTrue(set.contains(2));
+    assertTrue(set.contains(3));
+    assertFalse(set.contains(4));
   }
 
-  public void testNull() {
-    FastSet<String> set = new FastSet<String>();
+  public void testReservedValues() {
+    FastIDSet set = new FastIDSet();
     try {
-      set.add(null);
-      fail("Should have thrown NullPointerException");
-    } catch (NullPointerException npe) {
+      set.add(Long.MIN_VALUE);
+      fail("Should have thrown IllegalArgumentException");
+    } catch (IllegalArgumentException iae) {
       // good
     }
-    assertFalse(set.contains(null));
+    assertFalse(set.contains(Long.MIN_VALUE));
+    try {
+      set.add(Long.MAX_VALUE);
+      fail("Should have thrown IllegalArgumentException");
+    } catch (IllegalArgumentException iae) {
+      // good
+    }
+    assertFalse(set.contains(Long.MAX_VALUE));
   }
 
   public void testRehash() {
-    FastSet<String> set = buildTestFastSet();
-    set.remove("foo");
+    FastIDSet set = buildTestFastSet();
+    set.remove(1);
     set.rehash();
-    assertFalse(set.contains("foo"));
+    assertFalse(set.contains(1));
   }
 
   public void testGrow() {
-    FastMap<String, String> map = new FastMap<String, String>(1, FastMap.NO_MAX_SIZE);
-    map.put("foo", "bar");
-    map.put("baz", "bang");
-    assertEquals("bar", map.get("foo"));
-    assertEquals("bang", map.get("baz"));
+    FastIDSet set = new FastIDSet(1);
+    set.add(1);
+    set.add(2);
+    assertTrue(set.contains(1));
+    assertTrue(set.contains(2));
   }
 
   public void testIterator() {
-    FastSet<String> set = buildTestFastSet();
-    Collection<String> expected = new HashSet<String>(3);
-    expected.add("foo");
-    expected.add("baz");
-    expected.add("alpha");
-    for (String s : set) {
-      expected.remove(s);
+    FastIDSet set = buildTestFastSet();
+    Collection<Long> expected = new HashSet<Long>(3);
+    expected.add(1L);
+    expected.add(2L);
+    expected.add(3L);
+    LongPrimitiveIterator it = set.iterator();
+    while (it.hasNext()) {
+      expected.remove(it.next());
     }
     assertTrue(expected.isEmpty());
   }
 
-
   public void testVersusHashSet() {
-    Set<Integer> actual = new FastSet<Integer>(1);
+    FastIDSet actual = new FastIDSet(1);
     Set<Integer> expected = new HashSet<Integer>(1000000);
     Random r = RandomUtils.getRandom();
     for (int i = 0; i < 1000000; i++) {
@@ -134,11 +140,11 @@
     }
   }
 
-  private static FastSet<String> buildTestFastSet() {
-    FastSet<String> set = new FastSet<String>();
-    set.add("foo");
-    set.add("baz");
-    set.add("alpha");
+  private static FastIDSet buildTestFastSet() {
+    FastIDSet set = new FastIDSet();
+    set.add(1);
+    set.add(2);
+    set.add(3);
     return set;
   }
 

Propchange: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java Tue Aug 11 12:04:35 2009
@@ -37,7 +37,7 @@
     };
     RecommenderEvaluator evaluator =
         new AverageAbsoluteDifferenceRecommenderEvaluator();
-    double eval = evaluator.evaluate(builder, model, 0.85, 1.0);
+    double eval = evaluator.evaluate(builder, null, model, 0.85, 1.0);
     assertEquals(0.2234257618121795, eval, EPSILON);
   }
 

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java Tue Aug 11 12:04:35 2009
@@ -37,7 +37,7 @@
       }
     };
     RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
-    IRStatistics stats = evaluator.evaluate(builder, model, null, 1, 0.2, 1.0);
+    IRStatistics stats = evaluator.evaluate(builder, null, model, null, 1, 0.2, 1.0);
     assertNotNull(stats);
     assertEquals(0.75, stats.getPrecision(), EPSILON);
     assertEquals(0.75, stats.getRecall(), EPSILON);

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java Tue Aug 11 12:04:35 2009
@@ -36,7 +36,7 @@
       }
     };
     RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();
-    double eval = evaluator.evaluate(builder, model, 0.85, 1.0);
+    double eval = evaluator.evaluate(builder, null, model, 0.85, 1.0);
     assertEquals(0.3004147161079469, eval, EPSILON);
   }
 

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java Tue Aug 11 12:04:35 2009
@@ -19,6 +19,7 @@
 
 import org.apache.mahout.cf.taste.common.TasteException;
 import org.apache.mahout.cf.taste.impl.TasteTestCase;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
 import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
 import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
 import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
@@ -35,7 +36,6 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.nio.charset.Charset;
-import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -43,16 +43,16 @@
 public final class FileDataModelTest extends TasteTestCase {
 
   private static final String[] DATA = {
-      "A123,456,0.1",
-      "A123,789,0.6",
-      "A123,654,0.7",
-      "B234,123,0.5",
-      "B234,234,1.0",
-      "C345,789,0.6",
-      "C345,654,0.7",
-      "C345,123,1.0",
-      "C345,234,0.5",
-      "D456,456,0.1"};
+      "123,456,0.1",
+      "123,789,0.6",
+      "123,654,0.7",
+      "234,123,0.5",
+      "234,234,1.0",
+      "345,789,0.6",
+      "345,654,0.7",
+      "345,123,1.0",
+      "345,234,0.5",
+      "456,456,0.1"};
 
   private DataModel model;
   private File testFile;
@@ -89,9 +89,9 @@
     UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
     UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, userSimilarity, model);
     Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, userSimilarity);
-    assertEquals(2, recommender.recommend("A123", 3).size());
-    assertEquals(2, recommender.recommend("B234", 3).size());
-    assertEquals(1, recommender.recommend("C345", 3).size());
+    assertEquals(2, recommender.recommend(123, 3).size());
+    assertEquals(2, recommender.recommend(234, 3).size());
+    assertEquals(1, recommender.recommend(345, 3).size());
 
     // Make sure this doesn't throw an exception
     model.refresh(null);
@@ -100,28 +100,26 @@
 
   public void testTranspose() throws Exception {
     FileDataModel tModel = new FileDataModel(testFile, true);
-    PreferenceArray userPrefs = tModel.getPreferencesFromUser("456");
+    PreferenceArray userPrefs = tModel.getPreferencesFromUser(456);
     assertNotNull("user prefs are null and it shouldn't be", userPrefs);
-    PreferenceArray pref = tModel.getPreferencesForItem("A123");
+    PreferenceArray pref = tModel.getPreferencesForItem(123);
     assertNotNull("pref is null and it shouldn't be", pref);
     assertEquals("pref Size: " + pref.length() + " is not: " + 3, 3, pref.length());
   }
 
   public void testGetItems() throws Exception {
-    Iterable<Comparable<?>> items = model.getItemIDs();
-    assertNotNull(items);
-    Iterator<Comparable<?>> it = items.iterator();
+    LongPrimitiveIterator it = model.getItemIDs();
     assertNotNull(it);
     assertTrue(it.hasNext());
-    assertEquals("123", it.next());
+    assertEquals(123, it.nextLong());
     assertTrue(it.hasNext());
-    assertEquals("234", it.next());
+    assertEquals(234, it.nextLong());
     assertTrue(it.hasNext());
-    assertEquals("456", it.next());
+    assertEquals(456, it.nextLong());
     assertTrue(it.hasNext());
-    assertEquals("654", it.next());
+    assertEquals(654, it.nextLong());
     assertTrue(it.hasNext());
-    assertEquals("789", it.next());
+    assertEquals(789, it.nextLong());
     assertFalse(it.hasNext());
     try {
       it.next();
@@ -132,14 +130,14 @@
   }
 
   public void testPreferencesForItem() throws Exception {
-    PreferenceArray prefs = model.getPreferencesForItem("456");
+    PreferenceArray prefs = model.getPreferencesForItem(456);
     assertNotNull(prefs);
     Preference pref1 = prefs.get(0);
-    assertEquals("A123", pref1.getUserID());
-    assertEquals("456", pref1.getItemID());
+    assertEquals(123, pref1.getUserID());
+    assertEquals(456, pref1.getItemID());
     Preference pref2 = prefs.get(1);
-    assertEquals("D456", pref2.getUserID());
-    assertEquals("456", pref2.getItemID());
+    assertEquals(456, pref2.getUserID());
+    assertEquals(456, pref2.getItemID());
     assertEquals(2, prefs.length());
   }
 
@@ -148,10 +146,10 @@
   }
 
   public void testNumUsersPreferring() throws Exception {
-    assertEquals(2, model.getNumUsersWithPreferenceFor("456"));
-    assertEquals(0, model.getNumUsersWithPreferenceFor("111"));
-    assertEquals(0, model.getNumUsersWithPreferenceFor("111", "456"));
-    assertEquals(2, model.getNumUsersWithPreferenceFor("123", "234"));
+    assertEquals(2, model.getNumUsersWithPreferenceFor(456));
+    assertEquals(0, model.getNumUsersWithPreferenceFor(111));
+    assertEquals(0, model.getNumUsersWithPreferenceFor(111, 456));
+    assertEquals(2, model.getNumUsersWithPreferenceFor(123, 234));
   }
 
   public void testRefresh() throws Exception {

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java Tue Aug 11 12:04:35 2009
@@ -35,15 +35,15 @@
   }
 
   @Override
-  public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
-    return 1.0 / Math.abs(dataModel.getPreferencesFromUser(userID1).get(0).getValue() -
-        dataModel.getPreferencesFromUser(userID2).get(0).getValue());
+  public double userSimilarity(long userID1, long userID2) throws TasteException {
+    return 1.0 / (1.0 + Math.abs(dataModel.getPreferencesFromUser(userID1).get(0).getValue() -
+        dataModel.getPreferencesFromUser(userID2).get(0).getValue()));
   }
 
   @Override
-  public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) {
+  public double itemSimilarity(long itemID1, long itemID2) {
     // Make up something wacky
-    return (double) (itemID1.hashCode() - itemID2.hashCode());
+    return 1.0 / (1.0 + Math.abs(itemID1 - itemID2));
   }
 
   @Override

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
 import org.apache.mahout.cf.taste.impl.TasteTestCase;
 import org.apache.mahout.cf.taste.model.DataModel;
 
-import java.util.Collection;
-
 /** <p>Tests {@link NearestNUserNeighborhood}.</p> */
 public final class NearestNNeighborhoodTest extends TasteTestCase {
 
@@ -29,27 +27,26 @@
 
     DataModel dataModel = getDataModel();
 
-    Collection<Comparable<?>> neighborhood =
-        new NearestNUserNeighborhood(1, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+    long[] neighborhood =
+        new NearestNUserNeighborhood(1, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
     assertNotNull(neighborhood);
-    assertEquals(1, neighborhood.size());
-    assertTrue(neighborhood.contains("test2"));
+    assertEquals(1, neighborhood.length);
+    assertTrue(arrayContains(neighborhood, 2));
 
-    Collection<Comparable<?>> neighborhood2 =
-        new NearestNUserNeighborhood(2, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test2");
+    long[] neighborhood2 =
+        new NearestNUserNeighborhood(2, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(2);
     assertNotNull(neighborhood2);
-    assertEquals(2, neighborhood2.size());
-    assertTrue(neighborhood2.contains("test1"));
-    assertTrue(neighborhood2.contains("test3"));
+    assertEquals(2, neighborhood2.length);
+    assertTrue(arrayContains(neighborhood2, 1));
+    assertTrue(arrayContains(neighborhood2, 3));
 
-    Collection<Comparable<?>> neighborhood3 =
-        new NearestNUserNeighborhood(4, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test4");
+    long[] neighborhood3 =
+        new NearestNUserNeighborhood(4, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(4);
     assertNotNull(neighborhood3);
-    assertEquals(3, neighborhood3.size());
-    assertTrue(neighborhood3.contains("test1"));
-    assertTrue(neighborhood3.contains("test2"));
-    assertTrue(neighborhood3.contains("test3"));
-
+    assertEquals(3, neighborhood3.length);
+    assertTrue(arrayContains(neighborhood3, 1));
+    assertTrue(arrayContains(neighborhood3, 2));
+    assertTrue(arrayContains(neighborhood3, 3));
   }
 
 }

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
 import org.apache.mahout.cf.taste.impl.TasteTestCase;
 import org.apache.mahout.cf.taste.model.DataModel;
 
-import java.util.Collection;
-
 /** <p>Tests {@link ThresholdUserNeighborhood}.</p> */
 public final class ThresholdNeighborhoodTest extends TasteTestCase {
 
@@ -29,24 +27,25 @@
 
     DataModel dataModel = getDataModel();
 
-    Collection<Comparable<?>> neighborhood =
-        new ThresholdUserNeighborhood(19.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+    long[] neighborhood =
+        new ThresholdUserNeighborhood(1.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
     assertNotNull(neighborhood);
-    assertTrue(neighborhood.isEmpty());
+    assertTrue(neighborhood.length == 0);
 
-    Collection<Comparable<?>> neighborhood2 =
-        new ThresholdUserNeighborhood(9.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+    long[] neighborhood2 =
+        new ThresholdUserNeighborhood(0.8, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
     assertNotNull(neighborhood2);
-    assertEquals(1, neighborhood2.size());
-    assertTrue(neighborhood2.contains("test2"));
+    assertEquals(1, neighborhood2.length);
+    assertTrue(arrayContains(neighborhood2, 2));
 
-    Collection<Comparable<?>> neighborhood3 =
-        new ThresholdUserNeighborhood(0.9, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test2");
+    long[] neighborhood3 =
+        new ThresholdUserNeighborhood(0.6, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(2);
     assertNotNull(neighborhood3);
-    assertEquals(3, neighborhood3.size());
-    assertTrue(neighborhood3.contains("test1"));
-    assertTrue(neighborhood3.contains("test3"));
-    assertTrue(neighborhood3.contains("test4"));
+    assertEquals(3, neighborhood3.length);
+    assertTrue(arrayContains(neighborhood3, 1));
+    assertTrue(arrayContains(neighborhood3, 3));
+    assertTrue(arrayContains(neighborhood3, 4));
+
 
   }
 

Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java Tue Aug 11 12:04:35 2009
@@ -31,46 +31,46 @@
     Recommender mockRecommender = new MockRecommender(recommendCount);
 
     Recommender cachingRecommender = new CachingRecommender(mockRecommender);
-    cachingRecommender.recommend("1", 1);
+    cachingRecommender.recommend(1, 1);
     assertEquals(1, recommendCount.get());
-    cachingRecommender.recommend("2", 1);
+    cachingRecommender.recommend(2, 1);
     assertEquals(2, recommendCount.get());
-    cachingRecommender.recommend("1", 1);
+    cachingRecommender.recommend(1, 1);
     assertEquals(2, recommendCount.get());
-    cachingRecommender.recommend("2", 1);
+    cachingRecommender.recommend(2, 1);
     assertEquals(2, recommendCount.get());
     cachingRecommender.refresh(null);
-    cachingRecommender.recommend("1", 1);
+    cachingRecommender.recommend(1, 1);
     assertEquals(3, recommendCount.get());
-    cachingRecommender.recommend("2", 1);
+    cachingRecommender.recommend(2, 1);
     assertEquals(4, recommendCount.get());
-    cachingRecommender.recommend("3", 1);
+    cachingRecommender.recommend(3, 1);
     assertEquals(5, recommendCount.get());
 
     // Results from this recommend() method can be cached...
-    Rescorer<Comparable<?>> rescorer = NullRescorer.getItemInstance();
+    Rescorer<Long> rescorer = NullRescorer.getItemInstance();
     cachingRecommender.refresh(null);
-    cachingRecommender.recommend("1", 1, rescorer);
+    cachingRecommender.recommend(1, 1, rescorer);
     assertEquals(6, recommendCount.get());
-    cachingRecommender.recommend("2", 1, rescorer);
+    cachingRecommender.recommend(2, 1, rescorer);
     assertEquals(7, recommendCount.get());
-    cachingRecommender.recommend("1", 1, rescorer);
+    cachingRecommender.recommend(1, 1, rescorer);
     assertEquals(7, recommendCount.get());
-    cachingRecommender.recommend("2", 1, rescorer);
+    cachingRecommender.recommend(2, 1, rescorer);
     assertEquals(7, recommendCount.get());
 
     // until you switch Rescorers
-    cachingRecommender.recommend("1", 1, null);
+    cachingRecommender.recommend(1, 1, null);
     assertEquals(8, recommendCount.get());
-    cachingRecommender.recommend("2", 1, null);
+    cachingRecommender.recommend(2, 1, null);
     assertEquals(9, recommendCount.get());
 
     cachingRecommender.refresh(null);
-    cachingRecommender.estimatePreference("test1", "1");
+    cachingRecommender.estimatePreference(1, 1);
     assertEquals(10, recommendCount.get());
-    cachingRecommender.estimatePreference("test1", "2");
+    cachingRecommender.estimatePreference(1, 2);
     assertEquals(11, recommendCount.get());
-    cachingRecommender.estimatePreference("test1", "2");
+    cachingRecommender.estimatePreference(1, 2);
     assertEquals(11, recommendCount.get());
   }