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 2010/10/31 21:30:02 UTC

svn commit: r1029486 - /mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java

Author: srowen
Date: Sun Oct 31 20:30:02 2010
New Revision: 1029486

URL: http://svn.apache.org/viewvc?rev=1029486&view=rev
Log:
Small simplification and do not cache 'anonymous user' recs

Modified:
    mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java

Modified: mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java
URL: http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java?rev=1029486&r1=1029485&r2=1029486&view=diff
==============================================================================
--- mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java (original)
+++ mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java Sun Oct 31 20:30:02 2010
@@ -27,6 +27,7 @@ import org.apache.mahout.cf.taste.common
 import org.apache.mahout.cf.taste.impl.common.Cache;
 import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
 import org.apache.mahout.cf.taste.impl.common.Retriever;
+import org.apache.mahout.cf.taste.impl.model.PlusAnonymousUserDataModel;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.recommender.IDRescorer;
 import org.apache.mahout.cf.taste.recommender.RecommendedItem;
@@ -48,6 +49,7 @@ public final class CachingRecommender im
   
   private final Recommender recommender;
   private final int[] maxHowMany;
+  private final Retriever<Long,Recommendations> recommendationsRetriever;
   private final Cache<Long,Recommendations> recommendationCache;
   private final Cache<LongPair,Float> estimatedPrefCache;
   private final RefreshHelper refreshHelper;
@@ -56,28 +58,23 @@ public final class CachingRecommender im
   public CachingRecommender(Recommender recommender) throws TasteException {
     Preconditions.checkArgument(recommender != null, "recommender is null");
     this.recommender = recommender;
-    this.maxHowMany = new int[]{1};
+    maxHowMany = new int[]{1};
     // Use "num users" as an upper limit on cache size. Rough guess.
     int numUsers = recommender.getDataModel().getNumUsers();
-    this.recommendationCache = new Cache<Long, Recommendations>(new RecommendationRetriever(this.recommender),
-      numUsers);
-    this.estimatedPrefCache = new Cache<LongPair, Float>(new EstimatedPrefRetriever(this.recommender),
-      numUsers);
-    this.refreshHelper = new RefreshHelper(new Callable<Object>() {
+    recommendationsRetriever = new RecommendationRetriever();
+    recommendationCache = new Cache<Long, Recommendations>(recommendationsRetriever, numUsers);
+    estimatedPrefCache = new Cache<LongPair, Float>(new EstimatedPrefRetriever(), numUsers);
+    refreshHelper = new RefreshHelper(new Callable<Object>() {
       @Override
       public Object call() {
         clear();
         return null;
       }
     });
-    this.refreshHelper.addDependency(recommender);
+    refreshHelper.addDependency(recommender);
   }
   
-  private synchronized IDRescorer getCurrentRescorer() {
-    return currentRescorer;
-  }
-  
-  private synchronized void setCurrentRescorer(IDRescorer rescorer) {
+  private  void setCurrentRescorer(IDRescorer rescorer) {
     if (rescorer == null) {
       if (currentRescorer != null) {
         currentRescorer = null;
@@ -105,6 +102,11 @@ public final class CachingRecommender im
       }
     }
 
+    // Special case, avoid caching an anonymous user
+    if (userID == PlusAnonymousUserDataModel.TEMP_USER_ID) {
+      return recommendationsRetriever.get(PlusAnonymousUserDataModel.TEMP_USER_ID).getItems();
+    }
+
     setCurrentRescorer(rescorer);
 
     Recommendations recommendations = recommendationCache.get(userID);
@@ -176,38 +178,23 @@ public final class CachingRecommender im
   }
   
   private final class RecommendationRetriever implements Retriever<Long,Recommendations> {
-    
-    private final Recommender recommender;
-    
-    private RecommendationRetriever(Recommender recommender) {
-      this.recommender = recommender;
-    }
-    
     @Override
     public Recommendations get(Long key) throws TasteException {
       log.debug("Retrieving new recommendations for user ID '{}'", key);
       int howMany = maxHowMany[0];
-      IDRescorer rescorer = getCurrentRescorer();
-      List<RecommendedItem> recommendations = rescorer == null ? recommender.recommend(key, howMany)
-          : recommender.recommend(key, howMany, rescorer);
+      IDRescorer rescorer = currentRescorer;
+      List<RecommendedItem> recommendations =
+          rescorer == null ? recommender.recommend(key, howMany) : recommender.recommend(key, howMany, rescorer);
       return new Recommendations(Collections.unmodifiableList(recommendations));
     }
   }
   
-  private static final class EstimatedPrefRetriever implements Retriever<LongPair,Float> {
-    
-    private final Recommender recommender;
-    
-    private EstimatedPrefRetriever(Recommender recommender) {
-      this.recommender = recommender;
-    }
-    
+  private final class EstimatedPrefRetriever implements Retriever<LongPair,Float> {
     @Override
     public Float get(LongPair key) throws TasteException {
       long userID = key.getFirst();
       long itemID = key.getSecond();
-      log.debug("Retrieving estimated preference for user ID '{}' and item ID '{}'",
-        userID, itemID);
+      log.debug("Retrieving estimated preference for user ID '{}' and item ID '{}'", userID, itemID);
       return recommender.estimatePreference(userID, itemID);
     }
   }