@Override public BiConsumer<Map<Long, Long2DoubleMap>, IdBox<Long2DoubleMap>> accumulator() { return (acc, row) -> { Long2DoubleMap r2; if (modelSize <= 0) { r2 = LongUtils.frozenMap(row.getValue()); } else { Long2DoubleAccumulator racc = new TopNLong2DoubleAccumulator(modelSize); racc.putAll(row.getValue()); r2 = racc.finishMap(); } Long2DoubleMap res = acc.putIfAbsent(row.getId(), r2); assert res == null; }; }
private Long2ObjectMap<Long2DoubleMap> finishRows(Long2ObjectMap<Long2DoubleAccumulator> rows) { Long2ObjectMap<Long2DoubleMap> results = new Long2ObjectOpenHashMap<>(rows.size()); for (Long2ObjectMap.Entry<Long2DoubleAccumulator> e: rows.long2ObjectEntrySet()) { results.put(e.getLongKey(), e.getValue().finishMap()); } return results; }
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 BinaryOperator<Long2ObjectMap<Long2DoubleAccumulator>> combiner() { return (am1, am2) -> { for (Long2ObjectMap.Entry<Long2DoubleAccumulator> e: Long2ObjectMaps.fastIterable(am2)) { long item = e.getLongKey(); Long2DoubleAccumulator a2 = e.getValue(); Long2DoubleAccumulator a1 = am1.get(item); if (a1 == null) { am1.put(item, a2); } else { for (Long2DoubleMap.Entry ae: Long2DoubleMaps.fastIterable(a2.finishMap())) { a1.put(ae.getLongKey(), ae.getDoubleValue()); } } } return am1; }; }
/** * Score a single item into an accumulator. * @param scores The reference scores. * @param item The item to score. * @param accum The accumulator. */ protected void scoreItem(Long2DoubleMap scores, long item, ItemItemScoreAccumulator accum) { Long2DoubleMap allNeighbors = model.getNeighbors(item); Long2DoubleAccumulator acc; if (neighborhoodSize > 0) { // FIXME Abstract accumulator selection logic acc = new TopNLong2DoubleAccumulator(neighborhoodSize); } else { acc = new UnlimitedLong2DoubleAccumulator(); } for (Long2DoubleMap.Entry nbr: allNeighbors.long2DoubleEntrySet()) { if (scores.containsKey(nbr.getLongKey())) { acc.put(nbr.getLongKey(), nbr.getDoubleValue()); } } Long2DoubleMap neighborhood = acc.finishMap(); scorer.score(item, neighborhood, scores, accum); } }
@Test public void testAccumMap() { accum.put(5, 4.2); accum.put(3, 2.9); accum.put(2, 9.8); Long2DoubleMap out = accum.finishMap(); assertThat(out.size(), equalTo(3)); assertThat(out, hasEntry(2L, 9.8)); assertThat(out, hasEntry(5L, 4.2)); assertThat(out, hasEntry(3L, 2.9)); }
@Test public void testAccumMapLimit() { accum.put(7, 1.0); accum.put(5, 4.2); accum.put(3, 2.9); accum.put(2, 9.8); accum.put(8, 2.1); Long2DoubleMap out = accum.finishMap(); assertThat(out.size(), equalTo(3)); assertThat(out, hasEntry(2L, 9.8)); assertThat(out, hasEntry(5L, 4.2)); assertThat(out, hasEntry(3L, 2.9)); }
@Override public BiConsumer<Map<Long, Long2DoubleMap>, IdBox<Long2DoubleMap>> accumulator() { return (acc, row) -> { Long2DoubleMap r2; if (modelSize <= 0) { r2 = LongUtils.frozenMap(row.getValue()); } else { Long2DoubleAccumulator racc = new TopNLong2DoubleAccumulator(modelSize); racc.putAll(row.getValue()); r2 = racc.finishMap(); } Long2DoubleMap res = acc.putIfAbsent(row.getId(), r2); assert res == null; }; }
private Long2ObjectMap<Long2DoubleMap> finishRows(Long2ObjectMap<Long2DoubleAccumulator> rows) { Long2ObjectMap<Long2DoubleMap> results = new Long2ObjectOpenHashMap<>(rows.size()); for (Long2ObjectMap.Entry<Long2DoubleAccumulator> e: rows.long2ObjectEntrySet()) { results.put(e.getLongKey(), e.getValue().finishMap()); } return results; }
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 BinaryOperator<Long2ObjectMap<Long2DoubleAccumulator>> combiner() { return (am1, am2) -> { for (Long2ObjectMap.Entry<Long2DoubleAccumulator> e: Long2ObjectMaps.fastIterable(am2)) { long item = e.getLongKey(); Long2DoubleAccumulator a2 = e.getValue(); Long2DoubleAccumulator a1 = am1.get(item); if (a1 == null) { am1.put(item, a2); } else { for (Long2DoubleMap.Entry ae: Long2DoubleMaps.fastIterable(a2.finishMap())) { a1.put(ae.getLongKey(), ae.getDoubleValue()); } } } return am1; }; }
/** * Score a single item into an accumulator. * @param scores The reference scores. * @param item The item to score. * @param accum The accumulator. */ protected void scoreItem(Long2DoubleMap scores, long item, ItemItemScoreAccumulator accum) { Long2DoubleMap allNeighbors = model.getNeighbors(item); Long2DoubleAccumulator acc; if (neighborhoodSize > 0) { // FIXME Abstract accumulator selection logic acc = new TopNLong2DoubleAccumulator(neighborhoodSize); } else { acc = new UnlimitedLong2DoubleAccumulator(); } for (Long2DoubleMap.Entry nbr: allNeighbors.long2DoubleEntrySet()) { if (scores.containsKey(nbr.getLongKey())) { acc.put(nbr.getLongKey(), nbr.getDoubleValue()); } } Long2DoubleMap neighborhood = acc.finishMap(); scorer.score(item, neighborhood, scores, accum); } }