@Nonnull @Override public ResultMap scoreWithDetails(long user, @Nonnull Collection<Long> items) { if(cachedId == user && cachedScores != null) { LongSet cachedItems = LongUtils.asLongSet(cachedScores.keySet()); if (!cachedItems.containsAll(LongUtils.asLongCollection(items))) { LongSet reqItems = LongUtils.packedSet(items); LongSortedSet diffItems = LongUtils.setDifference(reqItems, cachedItems); ResultMap newCache = scorer.scoreWithDetails(user, diffItems); cachedScores = Results.newResultMap(Iterables.concat(cachedScores, newCache)); } } else { cachedScores = scorer.scoreWithDetails(user, items); cachedId = user; } return cachedScores; }
@Nonnull @Override public ResultMap scoreWithDetails(long user, @Nonnull Collection<Long> items) { if(cachedId == user && cachedScores != null) { LongSet cachedItems = LongUtils.asLongSet(cachedScores.keySet()); if (!cachedItems.containsAll(LongUtils.asLongCollection(items))) { LongSet reqItems = LongUtils.packedSet(items); LongSortedSet diffItems = LongUtils.setDifference(reqItems, cachedItems); ResultMap newCache = scorer.scoreWithDetails(user, diffItems); cachedScores = Results.newResultMap(Iterables.concat(cachedScores, newCache)); } } else { cachedScores = scorer.scoreWithDetails(user, items); cachedId = user; } return cachedScores; }
@Nonnull @Override public MetricResult measureUser(TestUser user, ResultList recommendations, MeanAccumulator context) { if (recommendations == null) { return MetricResult.empty(); } Long2DoubleMap ratings = user.getTestRatings(); long[] ideal = ratings.keySet().toLongArray(); LongArrays.quickSort(ideal, LongComparators.oppositeComparator(LongUtils.keyValueComparator(ratings))); double idealGain = computeDCG(ideal, ratings); long[] actual = LongUtils.asLongCollection(recommendations.idList()).toLongArray(); double gain = computeDCG(actual, ratings); double score = gain / idealGain; context.add(score); return MetricResult.singleton(columnName, score); }