@Override public Long2DoubleMap getItemBiases(LongSet items) { return itemBiases.subMap(items); }
@Override public Long2DoubleMap getUserBiases(LongSet users) { return userBiases.subMap(users); }
@Nonnull @Override public Map<Long, Double> score(long user, @Nonnull Collection<Long> items) { return rankScores.subMap(LongUtils.asLongSet(items)); }
@Override public ObjectSortedSet<Entry> subSet(Entry from, Entry to) { return subMap(from.getLongKey(), to.getLongKey()).long2DoubleEntrySet(); }
protected void scoreItem(Long2DoubleMap userData, long item, ItemItemScoreAccumulator accum) { // find the usable neighbors Long2DoubleSortedArrayMap allNeighbors = Long2DoubleSortedArrayMap.create(model.getNeighbors(item)); Long2DoubleMap neighborhood = allNeighbors.subMap(userData.keySet()); if (neighborhoodSize > 0) { if (logger.isTraceEnabled()) { logger.trace("truncating {} neighbors to {}", neighborhood.size(), neighborhoodSize); } Long2DoubleAccumulator acc = new TopNLong2DoubleAccumulator(neighborhoodSize); for (Long2DoubleMap.Entry e: neighborhood.long2DoubleEntrySet()) { acc.put(e.getLongKey(), e.getDoubleValue()); } neighborhood = acc.finishMap(); } assert neighborhoodSize <= 0 || neighborhood.size() <= neighborhoodSize; if (neighborhood.size() < minNeighbors) { return; } if (logger.isTraceEnabled()) { logger.trace("scoring item {} with {} of {} neighbors", item, neighborhood.size(), allNeighbors.size()); } scorer.score(item, neighborhood, userData, accum); } }
@Override public Long2DoubleMap getUserBiases(LongSet users) { return userBiases.subMap(users); }
@Override public Long2DoubleMap getItemBiases(LongSet items) { return itemBiases.subMap(items); }
@Test public void testSubMap() { SortedKeyIndex idx = SortedKeyIndex.create(1, 2, 3, 4, 5); double[] values = { 1.5, 2.4, -3.2, 4.3, -5.7 }; Long2DoubleSortedArrayMap map = new Long2DoubleSortedArrayMap(idx, values); assertThat(map.size(), equalTo(5)); Long2DoubleSortedMap sub = map.subMap(LongUtils.packedSet(2L, 4L)); assertThat(sub.size(), equalTo(2)); assertThat(sub.containsKey(2L), equalTo(true)); assertThat(sub.containsKey(1L), equalTo(false)); assertThat(sub.containsKey(5L), equalTo(false)); assertThat(sub.containsKey(4L), equalTo(true)); assertThat(sub.containsKey(3L), equalTo(false)); assertThat(sub.keySet(), contains(2L, 4L)); assertThat(sub, hasEntry(2L, 2.4)); assertThat(sub, hasEntry(4L, 4.3)); }
@Test public void testSubMapIndexes() { Long2DoubleMap map = new Long2DoubleOpenHashMap(); map.put(1, 1.0); map.put(2, 2.0); map.put(3, 3.0); map.put(4, 4.0); Long2DoubleSortedArrayMap sam = Long2DoubleSortedArrayMap.create(map); Long2DoubleSortedArrayMap s2 = sam.subMap(2, 4); assertThat(s2.keySet(), contains(2L, 3L)); assertThat(s2.getKeyByIndex(0), equalTo(2L)); assertThat(s2.getKeyByIndex(1), equalTo(3L)); assertThat(s2.getValueByIndex(0), equalTo(2.0)); assertThat(s2.getValueByIndex(1), equalTo(3.0)); } }
@Test public void testSubMapUnpacked() { SortedKeyIndex idx = SortedKeyIndex.create(1, 2, 3, 4, 5); double[] values = { 1.5, 2.4, -3.2, 4.3, -5.7 }; Long2DoubleSortedArrayMap map = new Long2DoubleSortedArrayMap(idx, values); assertThat(map.size(), equalTo(5)); Long2DoubleSortedMap sub = map.subMap(new LongOpenHashSet(LongUtils.packedSet(2L, 10L, 4L))); assertThat(sub.size(), equalTo(2)); assertThat(sub.containsKey(2L), equalTo(true)); assertThat(sub.containsKey(1L), equalTo(false)); assertThat(sub.containsKey(5L), equalTo(false)); assertThat(sub.containsKey(4L), equalTo(true)); assertThat(sub.containsKey(3L), equalTo(false)); assertThat(sub.keySet(), contains(2L, 4L)); assertThat(sub, hasEntry(2L, 2.4)); assertThat(sub, hasEntry(4L, 4.3)); }
@Test public void testRandomMaps() { for (Map<Long,Double> map: someMaps(longs(), doubles())) { Long2DoubleSortedArrayMap vec = Long2DoubleSortedArrayMap.create(map); Set<Long> picked = sets(map.keySet()).next(); Set<Long> extra = sets(longs()).next(); LongSortedSet wanted = LongUtils.setUnion(LongUtils.asLongSet(picked), LongUtils.asLongSet(extra)); Long2DoubleSortedMap sv = vec.subMap(wanted); assertThat(sv.keySet(), everyItem(isIn(wanted))); assertThat(sv.keySet(), containsInAnyOrder(picked.toArray())); assertThat(sv.entrySet(), everyItem(isIn(map.entrySet()))); } }
@Nonnull @Override public Map<Long, Double> score(long user, @Nonnull Collection<Long> items) { return rankScores.subMap(LongUtils.asLongSet(items)); }
@Override public ObjectSortedSet<Entry> subSet(Entry from, Entry to) { return subMap(from.getLongKey(), to.getLongKey()).long2DoubleEntrySet(); }
protected void scoreItem(Long2DoubleMap userData, long item, ItemItemScoreAccumulator accum) { // find the usable neighbors Long2DoubleSortedArrayMap allNeighbors = Long2DoubleSortedArrayMap.create(model.getNeighbors(item)); Long2DoubleMap neighborhood = allNeighbors.subMap(userData.keySet()); if (neighborhoodSize > 0) { if (logger.isTraceEnabled()) { logger.trace("truncating {} neighbors to {}", neighborhood.size(), neighborhoodSize); } Long2DoubleAccumulator acc = new TopNLong2DoubleAccumulator(neighborhoodSize); for (Long2DoubleMap.Entry e: neighborhood.long2DoubleEntrySet()) { acc.put(e.getLongKey(), e.getDoubleValue()); } neighborhood = acc.finishMap(); } assert neighborhoodSize <= 0 || neighborhood.size() <= neighborhoodSize; if (neighborhood.size() < minNeighbors) { return; } if (logger.isTraceEnabled()) { logger.trace("scoring item {} with {} of {} neighbors", item, neighborhood.size(), allNeighbors.size()); } scorer.score(item, neighborhood, userData, accum); } }