Author: srowen
Date: Wed Jun  2 12:36:10 2010
New Revision: 950536

URL: http://svn.apache.org/viewvc?rev=950536&view=rev
Log:
Add bulk getter for item similarity and take advantage where appropriate

Modified:
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
    
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanItemPreferenceArray.java
 Wed Jun  2 12:36:10 2010
@@ -105,6 +105,14 @@ public final class BooleanItemPreference
   public void setItemID(int i, long itemID) {
     id = itemID;
   }
+
+  /**
+   * @return all user IDs
+   */
+  @Override
+  public long[] getIDs() {
+    return ids;
+  }
   
   @Override
   public float getValue(int i) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanUserPreferenceArray.java
 Wed Jun  2 12:36:10 2010
@@ -105,6 +105,14 @@ public final class BooleanUserPreference
   public void setItemID(int i, long itemID) {
     ids[i] = itemID;
   }
+
+  /**
+   * @return all item IDs
+   */
+  @Override
+  public long[] getIDs() {
+    return ids;
+  }
   
   @Override
   public float getValue(int i) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItemPreferenceArray.java
 Wed Jun  2 12:36:10 2010
@@ -113,6 +113,14 @@ public final class GenericItemPreference
   public void setItemID(int i, long itemID) {
     id = itemID;
   }
+
+  /**
+   * @return all user IDs
+   */
+  @Override
+  public long[] getIDs() {
+    return ids;
+  }
   
   @Override
   public float getValue(int i) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUserPreferenceArray.java
 Wed Jun  2 12:36:10 2010
@@ -114,6 +114,14 @@ public final class GenericUserPreference
   public void setItemID(int i, long itemID) {
     ids[i] = itemID;
   }
+
+  /**
+   * @return all item IDs
+   */
+  @Override
+  public long[] getIDs() {
+    return ids;
+  }
   
   @Override
   public float getValue(int i) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
 Wed Jun  2 12:36:10 2010
@@ -184,9 +184,9 @@ public class GenericItemBasedRecommender
     double totalSimilarity = 0.0;
     int count = 0;
     PreferenceArray prefs = getDataModel().getPreferencesFromUser(userID);
-    int size = prefs.length();
-    for (int i = 0; i < size; i++) {
-      double theSimilarity = similarity.itemSimilarity(itemID, 
prefs.getItemID(i));
+    double[] similarities = similarity.itemSimilarities(itemID, 
prefs.getIDs());
+    for (int i = 0; i < similarities.length; i++) {
+      double theSimilarity = similarities[i];
       if (!Double.isNaN(theSimilarity)) {
         // Weights can be negative!
         preference += theSimilarity * prefs.getValue(i);
@@ -285,12 +285,14 @@ public class GenericItemBasedRecommender
     @Override
     public double estimate(Long itemID) throws TasteException {
       RunningAverage average = new FullRunningAverage();
-      for (long toItemID : toItemIDs) {
+      double[] similarities = similarity.itemSimilarities(itemID, toItemIDs);
+      for (int i = 0; i < toItemIDs.length; i++) {
+        long toItemID = toItemIDs[i];
         LongPair pair = new LongPair(toItemID, itemID);
         if ((rescorer != null) && rescorer.isFiltered(pair)) {
           continue;
         }
-        double estimate = similarity.itemSimilarity(toItemID, itemID);
+        double estimate = similarities[i];
         if (rescorer != null) {
           estimate = rescorer.rescore(pair, estimate);
         }

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -324,6 +324,16 @@ abstract class AbstractSimilarity implem
     }
     return result;
   }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException {
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = itemSimilarity(itemID1, itemID2s[i]);
+    }
+    return result;
+  }
   
   final double normalizeWeightResult(double result, int count, int num) {
     if (weighted) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -48,6 +48,16 @@ public final class CachingItemSimilarity
     LongPair key = itemID1 < itemID2 ? new LongPair(itemID1, itemID2) : new 
LongPair(itemID2, itemID1);
     return similarityCache.get(key);
   }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException {
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = itemSimilarity(itemID1, itemID2s[i]);
+    }
+    return result;
+  }
   
   @Override
   public void refresh(Collection<Refreshable> alreadyRefreshed) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -206,6 +206,16 @@ public final class GenericItemSimilarity
     Double similarity = nextMap.get(secondID);
     return similarity == null ? Double.NaN : similarity;
   }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) {
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = itemSimilarity(itemID1, itemID2s[i]);
+    }
+    return result;
+  }
   
   @Override
   public void refresh(Collection<Refreshable> alreadyRefreshed) {

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -68,16 +68,32 @@ public final class LogLikelihoodSimilari
   
   @Override
   public double itemSimilarity(long itemID1, long itemID2) throws 
TasteException {
+    int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+    int numUsers = dataModel.getNumUsers();    
+    return doItemSimilarity(itemID1, itemID2, preferring1, numUsers);
+  }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException {
+    int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+    int numUsers = dataModel.getNumUsers();
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = doItemSimilarity(itemID1, itemID2s[i], preferring1, 
numUsers);
+    }
+    return result;
+  }
+
+  private double doItemSimilarity(long itemID1, long itemID2, int preferring1, 
int numUsers) 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();
     double logLikelihood = twoLogLambda(preferring1and2,
                                         preferring1 - preferring1and2,
-                                        preferring2, 
+                                        preferring2,
                                         numUsers - preferring2);
     return 1.0 - 1.0 / (1.0 + logLikelihood);
   }

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -86,8 +86,23 @@ public final class TanimotoCoefficientSi
   
   @Override
   public double itemSimilarity(long itemID1, long itemID2) throws 
TasteException {
-    int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, 
itemID2);
     int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+    return doItemSimilarity(itemID1, itemID2, preferring1);
+  }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException {
+    int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = doItemSimilarity(itemID1, itemID2s[i], preferring1);
+    }
+    return result;
+  }
+
+  private double doItemSimilarity(long itemID1, long itemID2, int preferring1) 
throws TasteException {
+    int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, 
itemID2);
     int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
     return (double) preferring1and2 / (double) (preferring1 + preferring2 - 
preferring1and2);
   }

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -52,10 +52,15 @@ public abstract class AbstractJDBCItemSi
   private final String itemBIDColumn;
   private final String similarityColumn;
   private final String getItemItemSimilaritySQL;
-  
-  protected AbstractJDBCItemSimilarity(DataSource dataSource, String 
getItemItemSimilaritySQL) {
-    this(dataSource, DEFAULT_SIMILARITY_TABLE, DEFAULT_ITEM_A_ID_COLUMN, 
DEFAULT_ITEM_B_ID_COLUMN,
-        DEFAULT_SIMILARITY_COLUMN, getItemItemSimilaritySQL);
+
+  protected AbstractJDBCItemSimilarity(DataSource dataSource,
+                                       String getItemItemSimilaritySQL) {
+    this(dataSource,
+         DEFAULT_SIMILARITY_TABLE,
+         DEFAULT_ITEM_A_ID_COLUMN,
+         DEFAULT_ITEM_B_ID_COLUMN,
+         DEFAULT_SIMILARITY_COLUMN,
+         getItemItemSimilaritySQL);
   }
   
   protected AbstractJDBCItemSimilarity(DataSource dataSource,
@@ -70,7 +75,7 @@ public abstract class AbstractJDBCItemSi
     AbstractJDBCComponent.checkNotNullAndLog("similarityColumn", 
similarityColumn);
     
     AbstractJDBCComponent.checkNotNullAndLog("getItemItemSimilaritySQL", 
getItemItemSimilaritySQL);
-    
+
     if (!(dataSource instanceof ConnectionPoolDataSource)) {
       log.warn("You are not using ConnectionPoolDataSource. Make sure your 
DataSource pools connections "
                + "to the database itself, or database performance will be 
severely reduced.");
@@ -102,48 +107,71 @@ public abstract class AbstractJDBCItemSi
   
   @Override
   public double itemSimilarity(long itemID1, long itemID2) throws 
TasteException {
-    
     if (itemID1 == itemID2) {
       return 1.0;
     }
-    // Order as smaller - larger
-    if (itemID1 > itemID2) {
-      long temp = itemID1;
-      itemID1 = itemID2;
-      itemID2 = temp;
-    }
-    
     Connection conn = null;
     PreparedStatement stmt = null;
-    ResultSet rs = null;
-    
     try {
       conn = dataSource.getConnection();
-      stmt = conn.prepareStatement(getItemItemSimilaritySQL, 
ResultSet.TYPE_FORWARD_ONLY,
-        ResultSet.CONCUR_READ_ONLY);
+      stmt = conn.prepareStatement(getItemItemSimilaritySQL, 
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
       stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
       stmt.setFetchSize(getFetchSize());
-      stmt.setLong(1, itemID1);
-      stmt.setLong(2, itemID2);
-      
-      log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
-      rs = stmt.executeQuery();
+      return doItemSimilarity(stmt, itemID1, itemID2);
+    } catch (SQLException sqle) {
+      log.warn("Exception while retrieving user", sqle);
+      throw new TasteException(sqle);
+    } finally {
+      IOUtils.quietClose(null, stmt, conn);
+    }
+  }
 
-      // If not found, perhaps the items exist but have no presence in the 
table,
-      // so NaN is appropriate
-      return rs.next() ? rs.getDouble(1) : Double.NaN;
-      
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException {
+    double[] result = new double[itemID2s.length];
+    Connection conn = null;
+    PreparedStatement stmt = null;
+    try {
+      conn = dataSource.getConnection();
+      stmt = conn.prepareStatement(getItemItemSimilaritySQL, 
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+      stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
+      stmt.setFetchSize(getFetchSize());
+      for (int i = 0; i < itemID2s.length; i++) {
+        result[i] = doItemSimilarity(stmt, itemID1, itemID2s[i]);
+      }
     } catch (SQLException sqle) {
       log.warn("Exception while retrieving user", sqle);
       throw new TasteException(sqle);
     } finally {
-      IOUtils.quietClose(rs, stmt, conn);
+      IOUtils.quietClose(null, stmt, conn);
     }
+    return result;
   }
   
   @Override
   public void refresh(Collection<Refreshable> alreadyRefreshed) {
   // do nothing
   }
+
+  private double doItemSimilarity(PreparedStatement stmt, long itemID1, long 
itemID2) throws SQLException {
+    // Order as smaller - larger
+    if (itemID1 > itemID2) {
+      long temp = itemID1;
+      itemID1 = itemID2;
+      itemID2 = temp;
+    }
+    stmt.setLong(1, itemID1);
+    stmt.setLong(2, itemID2);
+    log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
+    ResultSet rs = null;
+    try {
+      rs = stmt.executeQuery();
+      // If not found, perhaps the items exist but have no presence in the 
table,
+      // so NaN is appropriate
+      return rs.next() ? rs.getDouble(1) : Double.NaN;
+    } finally {
+      IOUtils.quietClose(rs);
+    }
+  }
   
 }

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -68,7 +68,7 @@ import org.apache.mahout.cf.taste.impl.c
  * </p>
  * 
  * <p>
- * Note that for each row, item_id_a should be "less than" item_id_b. It is 
redundant to store it both ways,
+ * Note that for each row, item_id_a should be less than item_id_b. It is 
redundant to store it both ways,
  * so the pair is always stored as a pair with the lesser one first.
  * 
  * @see 
org.apache.mahout.cf.taste.impl.recommender.slopeone.jdbc.MySQLJDBCDiffStorage
@@ -85,10 +85,11 @@ public final class MySQLJDBCItemSimilari
   }
   
   public MySQLJDBCItemSimilarity(DataSource dataSource) {
-    this(dataSource, DEFAULT_SIMILARITY_TABLE,
-        DEFAULT_ITEM_A_ID_COLUMN,
-        DEFAULT_ITEM_B_ID_COLUMN,
-        DEFAULT_SIMILARITY_COLUMN);
+    this(dataSource,
+         DEFAULT_SIMILARITY_TABLE,
+         DEFAULT_ITEM_A_ID_COLUMN,
+         DEFAULT_ITEM_B_ID_COLUMN,
+         DEFAULT_SIMILARITY_COLUMN);
   }
   
   public MySQLJDBCItemSimilarity(DataSource dataSource,
@@ -96,14 +97,12 @@ public final class MySQLJDBCItemSimilari
                                  String itemAIDColumn,
                                  String itemBIDColumn,
                                  String similarityColumn) {
-    super(dataSource, similarityTable, itemAIDColumn, itemBIDColumn, 
similarityColumn, "SELECT "
-                                                                               
        + similarityColumn
-                                                                               
        + " FROM "
-                                                                               
        + similarityTable
-                                                                               
        + " WHERE "
-                                                                               
        + itemAIDColumn
-                                                                               
        + "=? AND "
-                                                                               
        + itemBIDColumn + "=?");
+    super(dataSource,
+          similarityTable,
+          itemAIDColumn,
+          itemBIDColumn, similarityColumn,
+          "SELECT " + similarityColumn + " FROM " + similarityTable + " WHERE "
+              + itemAIDColumn + "=? AND " + itemBIDColumn + "=?");
   }
   
   @Override

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
 Wed Jun  2 12:36:10 2010
@@ -78,6 +78,11 @@ public interface PreferenceArray extends
    *          new item ID
    */
   void setItemID(int i, long itemID);
+
+  /**
+   * @return all user or item IDs
+   */
+  long[] getIDs();
   
   /**
    * @param i

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -44,5 +44,17 @@ public interface ItemSimilarity extends 
    * @throws TasteException if an error occurs while accessing the data
    */
   double itemSimilarity(long itemID1, long itemID2) throws TasteException;
+
+  /**
+   * <p>A bulk-get version of {...@link #itemSimilarity(long, long)}.</p>
+   *
+   * @param itemID1 first item ID
+   * @param itemID2s second item IDs to compute similarity with
+   * @return similarity between itemID1 and other items
+   * @throws org.apache.mahout.cf.taste.common.NoSuchItemException
+   *  if any item is known to be non-existent in the data
+   * @throws TasteException if an error occurs while accessing the data
+   */
+  double[] itemSimilarities(long itemID1, long[] itemID2s) throws 
TasteException;
   
 }

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -43,6 +43,8 @@ public interface UserSimilarity extends 
    * @throws TasteException if an error occurs while accessing the data
    */
   double userSimilarity(long userID1, long userID2) throws TasteException;
+
+  // Should we implement userSimilarities() like 
ItemSimilarity.itemSimilarities()?
   
   /**
    * <p>

Modified: 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java?rev=950536&r1=950535&r2=950536&view=diff
==============================================================================
--- 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
 (original)
+++ 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
 Wed Jun  2 12:36:10 2010
@@ -45,6 +45,16 @@ final class DummySimilarity implements U
     // Make up something wacky
     return 1.0 / (1.0 + Math.abs(itemID1 - itemID2));
   }
+
+  @Override
+  public double[] itemSimilarities(long itemID1, long[] itemID2s) {
+    int length = itemID2s.length;
+    double[] result = new double[length];
+    for (int i = 0; i < length; i++) {
+      result[i] = itemSimilarity(itemID1, itemID2s[i]);
+    }
+    return result;
+  }
   
   @Override
   public void setPreferenceInferrer(PreferenceInferrer inferrer) {


Reply via email to