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);
}
}