Author: srowen
Date: Fri Nov  7 03:01:09 2008
New Revision: 712108

URL: http://svn.apache.org/viewvc?rev=712108&view=rev
Log:
Favor null rescorers over NullRescorer for modest performance gains

Modified:
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
    
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
 Fri Nov  7 03:01:09 2008
@@ -129,12 +129,7 @@
           }
 
           int intersectionSize = 0;
-          List<RecommendedItem> recommendedItems;
-          if (rescorer == null) {
-            recommendedItems = recommender.recommend(id, at);
-          } else {
-            recommendedItems = recommender.recommend(id, at, rescorer);
-          }
+          List<RecommendedItem> recommendedItems = recommender.recommend(id, 
at, rescorer);
           for (RecommendedItem recommendedItem : recommendedItems) {
             if (relevantItems.contains(recommendedItem.getItem())) {
               intersectionSize++;

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -49,7 +49,7 @@
    * with a [EMAIL PROTECTED] org.apache.mahout.cf.taste.recommender.Rescorer} 
that does nothing.</p>
    */
   public List<RecommendedItem> recommend(Object userID, int howMany) throws 
TasteException {
-    return recommend(userID, howMany, NullRescorer.getItemInstance());
+    return recommend(userID, howMany, null);
   }
 
   /**

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
 Fri Nov  7 03:01:09 2008
@@ -32,15 +32,19 @@
   private final Rescorer<Item> rescorer;
 
   ByRescoreComparator(Rescorer<Item> rescorer) {
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     this.rescorer = rescorer;
   }
 
   public int compare(RecommendedItem o1, RecommendedItem o2) {
-    double rescored1 = rescorer.rescore(o1.getItem(), o1.getValue());
-    double rescored2 = rescorer.rescore(o2.getItem(), o2.getValue());
+    double rescored1;
+    double rescored2;
+    if (rescorer == null) {
+      rescored1 = o1.getValue();
+      rescored2 = o2.getValue();
+    } else {
+      rescored1 = rescorer.rescore(o1.getItem(), o1.getValue());
+      rescored2 = rescorer.rescore(o2.getItem(), o2.getValue());
+    }
     if (rescored1 < rescored2) {
       return 1;
     } else if (rescored1 > rescored2) {

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -83,9 +83,6 @@
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
     }
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
 
     log.debug("Recommending items for user ID '{}'", userID);
 
@@ -116,30 +113,24 @@
   }
 
   public List<RecommendedItem> mostSimilarItems(Object itemID, int howMany) 
throws TasteException {
-    return mostSimilarItems(itemID, howMany, 
NullRescorer.getItemItemPairInstance());
+    return mostSimilarItems(itemID, howMany, null);
   }
 
   public List<RecommendedItem> mostSimilarItems(Object itemID,
                                                 int howMany,
                                                 Rescorer<Pair<Item, Item>> 
rescorer) throws TasteException {
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     Item toItem = getDataModel().getItem(itemID);
     TopItems.Estimator<Item> estimator = new MostSimilarEstimator(toItem, 
similarity, rescorer);
     return doMostSimilarItems(itemID, howMany, estimator);
   }
 
   public List<RecommendedItem> mostSimilarItems(List<Object> itemIDs, int 
howMany) throws TasteException {
-    return mostSimilarItems(itemIDs, howMany, 
NullRescorer.getItemItemPairInstance());
+    return mostSimilarItems(itemIDs, howMany, null);
   }
 
   public List<RecommendedItem> mostSimilarItems(List<Object> itemIDs,
                                                 int howMany,
                                                 Rescorer<Pair<Item, Item>> 
rescorer) throws TasteException {
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     DataModel model = getDataModel();
     List<Item> toItems = new ArrayList<Item>(itemIDs.size());
     for (Object itemID : itemIDs) {
@@ -153,7 +144,7 @@
     for (Item item : toItems) {
       allItems.remove(item);
     }
-    return TopItems.getTopItems(howMany, allItems, 
NullRescorer.getItemInstance(), estimator);
+    return TopItems.getTopItems(howMany, allItems, null, estimator);
   }
 
   public List<RecommendedItem> recommendedBecause(Object userID,
@@ -181,7 +172,7 @@
     }
     allUserItems.remove(recommendedItem);
 
-    return TopItems.getTopItems(howMany, allUserItems, 
NullRescorer.getItemInstance(), estimator);
+    return TopItems.getTopItems(howMany, allUserItems, null, estimator);
   }
 
   private List<RecommendedItem> doMostSimilarItems(Object itemID,
@@ -194,7 +185,7 @@
       allItems.add(item);
     }
     allItems.remove(toItem);
-    return TopItems.getTopItems(howMany, allItems, 
NullRescorer.getItemInstance(), estimator);
+    return TopItems.getTopItems(howMany, allItems, null, estimator);
   }
 
   private double doEstimatePreference(User theUser, Item item) throws 
TasteException {
@@ -245,11 +236,11 @@
 
     public double estimate(Item item) throws TasteException {
       Pair<Item, Item> pair = new Pair<Item, Item>(toItem, item);
-      if (rescorer.isFiltered(pair)) {
+      if (rescorer != null && rescorer.isFiltered(pair)) {
         return Double.NaN;
       }
       double originalEstimate = similarity.itemSimilarity(toItem, item);
-      return rescorer.rescore(pair, originalEstimate);
+      return rescorer == null ? originalEstimate : rescorer.rescore(pair, 
originalEstimate);
     }
   }
 
@@ -284,11 +275,13 @@
       RunningAverage average = new FullRunningAverage();
       for (Item toItem : toItems) {
         Pair<Item, Item> pair = new Pair<Item, Item>(toItem, item);
-        if (rescorer.isFiltered(pair)) {
+        if (rescorer != null && rescorer.isFiltered(pair)) {
           continue;
         }
         double estimate = similarity.itemSimilarity(toItem, item);
-        estimate = rescorer.rescore(pair, estimate);
+        if (rescorer != null) {
+          estimate = rescorer.rescore(pair, estimate);
+        }
         average.addDatum(estimate);
       }
       return average.getAverage();

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -75,9 +75,6 @@
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
     }
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
 
     log.debug("Recommending items for user ID '{}'", userID);
 
@@ -113,15 +110,12 @@
   }
 
   public List<User> mostSimilarUsers(Object userID, int howMany) throws 
TasteException {
-    return mostSimilarUsers(userID, howMany, 
NullRescorer.getUserUserPairInstance());
+    return mostSimilarUsers(userID, howMany, null);
   }
 
   public List<User> mostSimilarUsers(Object userID,
                                      int howMany,
                                      Rescorer<Pair<User, User>> rescorer) 
throws TasteException {
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     User toUser = getDataModel().getUser(userID);
     TopItems.Estimator<User> estimator = new MostSimilarEstimator(toUser, 
similarity, rescorer);
     return doMostSimilarUsers(userID, howMany, estimator);
@@ -137,7 +131,7 @@
       allUsers.add(user);
     }
     allUsers.remove(toUser);
-    return TopItems.getTopUsers(howMany, allUsers, 
NullRescorer.getUserInstance(), estimator);
+    return TopItems.getTopUsers(howMany, allUsers, null, estimator);
   }
 
   private double doEstimatePreference(User theUser, Collection<User> 
theNeighborhood, Item item)
@@ -203,11 +197,11 @@
 
     public double estimate(User user) throws TasteException {
       Pair<User, User> pair = new Pair<User, User>(toUser, user);
-      if (rescorer.isFiltered(pair)) {
+      if (rescorer != null && rescorer.isFiltered(pair)) {
         return Double.NaN;
       }
       double originalEstimate = similarity.userSimilarity(toUser, user);
-      return rescorer.rescore(pair, originalEstimate);
+      return rescorer == null ? originalEstimate : rescorer.rescore(pair, 
originalEstimate);
     }
   }
 

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -77,9 +77,6 @@
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
     }
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     log.debug("Recommending items for user ID '{}'", userID);
     checkAverageDiffsBuilt();
 

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -82,9 +82,6 @@
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
     }
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
     log.debug("Recommending items for user ID '{}'", userID);
     checkAverageDiffsBuilt();
 

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
 Fri Nov  7 03:01:09 2008
@@ -44,15 +44,15 @@
                                                   Iterable<Item> allItems,
                                                   Rescorer<Item> rescorer,
                                                   Estimator<Item> estimator) 
throws TasteException {
-    if (allItems == null || rescorer == null || estimator == null) {
+    if (allItems == null || estimator == null) {
       throw new IllegalArgumentException("argument is null");
     }
     LinkedList<RecommendedItem> topItems = new LinkedList<RecommendedItem>();
     boolean full = false;
     for (Item item : allItems) {
-      if (item.isRecommendable() && !rescorer.isFiltered(item)) {
+      if (item.isRecommendable() && (rescorer == null || 
!rescorer.isFiltered(item))) {
         double preference = estimator.estimate(item);
-        double rescoredPref = rescorer.rescore(item, preference);
+        double rescoredPref = rescorer == null ? preference : 
rescorer.rescore(item, preference);
         if (!Double.isNaN(rescoredPref) && (!full || rescoredPref > 
topItems.getLast().getValue())) {
           // I think this is faster than Collections.binarySearch() over a 
LinkedList since our
           // comparisons are cheap, which binarySearch() economizes at the 
expense of more traversals.
@@ -84,11 +84,11 @@
     LinkedList<SimilarUser> topUsers = new LinkedList<SimilarUser>();
     boolean full = false;
     for (User user : allUsers) {
-      if (rescorer.isFiltered(user)) {
+      if (rescorer != null && rescorer.isFiltered(user)) {
         continue;
       }
       double similarity = estimator.estimate(user);
-      double rescoredSimilarity = rescorer.rescore(user, similarity);
+      double rescoredSimilarity = rescorer == null ? similarity : 
rescorer.rescore(user, similarity);
       if (!Double.isNaN(rescoredSimilarity) &&
           (!full || rescoredSimilarity > topUsers.getLast().getSimilarity())) {
         ListIterator<SimilarUser> iterator = 
topUsers.listIterator(topUsers.size());

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -184,8 +184,8 @@
 
   public List<RecommendedItem> recommend(Object userID, int howMany, 
Rescorer<Item> rescorer)
           throws TasteException {
-    if (userID == null || rescorer == null) {
-      throw new IllegalArgumentException("userID or rescorer is null");
+    if (userID == null) {
+      throw new IllegalArgumentException("userID is null");
     }
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
@@ -205,11 +205,11 @@
     // And that the rescorer doesn't "reject".
     for (RecommendedItem recommendedItem : recommended) {
       Item item = recommendedItem.getItem();
-      if (rescorer.isFiltered(item)) {
+      if (rescorer != null && rescorer.isFiltered(item)) {
         continue;
       }
       if (theUser.getPreferenceFor(item.getID()) == null &&
-          !Double.isNaN(rescorer.rescore(item, recommendedItem.getValue()))) {
+          (rescorer == null || !Double.isNaN(rescorer.rescore(item, 
recommendedItem.getValue())))) {
         rescored.add(recommendedItem);
       }
     }
@@ -386,7 +386,7 @@
     TopItems.Estimator<Item> estimator = new Estimator(cluster);
 
     List<RecommendedItem> topItems =
-            TopItems.getTopItems(Integer.MAX_VALUE, allItems, 
NullRescorer.getItemInstance(), estimator);
+            TopItems.getTopItems(Integer.MAX_VALUE, allItems, null, estimator);
 
     log.debug("Recommendations are: {}", topItems);
     return Collections.unmodifiableList(topItems);

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
 Fri Nov  7 03:01:09 2008
@@ -150,8 +150,8 @@
 
   public List<RecommendedItem> recommend(Object userID, int howMany, 
Rescorer<Item> rescorer)
           throws TasteException {
-    if (userID == null || rescorer == null) {
-      throw new IllegalArgumentException("userID or rescorer is null");
+    if (userID == null) {
+      throw new IllegalArgumentException("userID is null");
     }
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
@@ -171,11 +171,11 @@
     // And that the rescorer doesn't "reject".
     for (RecommendedItem recommendedItem : recommended) {
       Item item = recommendedItem.getItem();
-      if (rescorer.isFiltered(item)) {
+      if (rescorer != null && rescorer.isFiltered(item)) {
         continue;
       }
       if (theUser.getPreferenceFor(item.getID()) == null &&
-          !Double.isNaN(rescorer.rescore(item, recommendedItem.getValue()))) {
+          (rescorer == null || !Double.isNaN(rescorer.rescore(item, 
recommendedItem.getValue())))) {
         rescored.add(recommendedItem);
       }
     }
@@ -469,7 +469,7 @@
     TopItems.Estimator<Item> estimator = new Estimator(cluster);
 
     List<RecommendedItem> topItems =
-            TopItems.getTopItems(Integer.MAX_VALUE, allItems, 
NullRescorer.getItemInstance(), estimator);
+            TopItems.getTopItems(Integer.MAX_VALUE, allItems, null, estimator);
 
     log.debug("Recommendations are: {}", topItems);
     return Collections.unmodifiableList(topItems);

Modified: 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
URL: 
http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java?rev=712108&r1=712107&r2=712108&view=diff
==============================================================================
--- 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
 (original)
+++ 
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
 Fri Nov  7 03:01:09 2008
@@ -105,9 +105,7 @@
     if (howMany < 1) {
       throw new IllegalArgumentException("howMany must be at least 1");
     }
-    if (rescorer == null) {
-      throw new IllegalArgumentException("rescorer is null");
-    }
+
     log.debug("Recommending items for user ID '{}'", userID);
 
     User theUser = getDataModel().getUser(userID);


Reply via email to