@Override @Nonnull public List<Collection<RatingMatrixEntry>> get() { int nusers = data.getUserIndex().size(); ArrayList<IntArrayList> userLists = new ArrayList<>(nusers); for (int i = 0; i < nusers; i++) { userLists.add(new IntArrayList()); } for (RatingMatrixEntry pref : getRatings()) { final int uidx = pref.getUserIndex(); final int idx = pref.getIndex(); userLists.get(uidx).add(idx); } ArrayList<Collection<RatingMatrixEntry>> users = new ArrayList<>(nusers); for (IntArrayList list: userLists) { list.trim(); users.add(new PackedRatingCollection(data, list)); } return users; } }
@Override public LongCollection getItemIds() { return itemIndex().getKeyList(); }
@Override public Collection<RatingMatrixEntry> getUserRatings(long userId) { int uidx = userIndex().tryGetIndex(userId); List<Collection<RatingMatrixEntry>> userLists = userIndexLists.get(); if (uidx < 0 || uidx >= userLists.size()) { return Collections.emptyList(); } else { return userLists.get(uidx); } }
@Override public synchronized Long2DoubleMap getUserRatingVector(long userId) { // FIXME Don't make this so locky if (cache == null) { cache = new Long2ObjectOpenHashMap<>(); } Long2DoubleMap data = cache.get(userId); if (data != null) { return data; } else { Collection<RatingMatrixEntry> prefs = this.getUserRatings(userId); Long2DoubleMap map = new Long2DoubleOpenHashMap(); for (RatingMatrixEntry e: prefs) { map.put(e.getItemId(), e.getValue()); } data = new Long2DoubleSortedArrayMap(map); cache.put(userId, data); return data; } }
@Override public KeyIndex userIndex() { requireValid(); return data.getUserIndex(); }
PackedRatingData data = bld.build(); return new PackedRatingMatrix(data);
@Test public void testUserRatingVector() { Long2DoubleMap ratings = snap.getUserRatingVector(1); assertEquals(4, ratings.size()); assertEquals(4, ratings.get(7), EPSILON); ratings = snap.getUserRatingVector(2); assertEquals(0, ratings.size()); ratings = snap.getUserRatingVector(3); assertEquals(4, ratings.size()); assertEquals(3, ratings.get(7), EPSILON); ratings = snap.getUserRatingVector(4); assertEquals(5, ratings.size()); assertEquals(4, ratings.get(7), EPSILON); ratings = snap.getUserRatingVector(5); assertEquals(2, ratings.size()); assertEquals(3, ratings.get(7), EPSILON); assertEquals(5, ratings.get(8), EPSILON); ratings = snap.getUserRatingVector(6); assertEquals(2, ratings.size()); assertEquals(5, ratings.get(7), EPSILON); assertEquals(5, ratings.get(8), EPSILON); ratings = snap.getUserRatingVector(7); assertEquals(3, ratings.size()); assertEquals(2, ratings.get(8), EPSILON);
@Test public void testGetUserIds() { LongCollection users = snap.getUserIds(); assertTrue(users.contains(1)); assertTrue(users.contains(3)); assertTrue(users.contains(4)); assertTrue(users.contains(5)); assertTrue(users.contains(6)); assertTrue(users.contains(7)); }
@Test public void testGetItemIds() { LongCollection items = snap.getItemIds(); assertEquals(5, items.size()); assertTrue(items.contains(7)); assertTrue(items.contains(8)); assertTrue(items.contains(9)); assertTrue(items.contains(10)); assertTrue(items.contains(11)); }
@Test public void testGetUserRatings() { Collection<RatingMatrixEntry> ratings = snap.getUserRatings(1); Equivalence<Preference> eq = Ratings.preferenceEquivalence(); assertThat(ratings, hasSize(4)); ratings = snap.getUserRatings(2); assertThat(ratings, hasSize(0)); ratings = snap.getUserRatings(3); assertEquals(4, ratings.size()); assertThat(Iterables.transform(ratings, eq::wrap), ratings = snap.getUserRatings(4); assertEquals(5, ratings.size()); assertThat(Iterables.transform(ratings, eq::wrap), ratings = snap.getUserRatings(5); assertEquals(2, ratings.size()); assertThat(Iterables.transform(ratings, eq::wrap), ratings = snap.getUserRatings(6); assertEquals(2, ratings.size()); assertThat(Iterables.transform(ratings, eq::wrap), ratings = snap.getUserRatings(7); assertEquals(3, ratings.size()); assertThat(Iterables.transform(ratings, eq::wrap),
@Override public KeyIndex itemIndex() { requireValid(); return data.getItemIndex(); }
PackedRatingData data = bld.build(); return new PackedRatingMatrix(data);
@Override public LongCollection getUserIds() { return userIndex().getKeyList(); }
@Test public void testBasicStats() { assertThat(snap.getRatings(), hasSize(20)); }
@Test public void testItemIndex() { KeyIndex ind = snap.itemIndex(); assertEquals(5, ind.size()); assertThat(ind.getKeyList(), containsInAnyOrder(7L, 8L, 9L, 10L, 11L)); }
@Override public synchronized Long2DoubleMap getUserRatingVector(long userId) { // FIXME Don't make this so locky if (cache == null) { cache = new Long2ObjectOpenHashMap<>(); } Long2DoubleMap data = cache.get(userId); if (data != null) { return data; } else { Collection<RatingMatrixEntry> prefs = this.getUserRatings(userId); Long2DoubleMap map = new Long2DoubleOpenHashMap(); for (RatingMatrixEntry e: prefs) { map.put(e.getItemId(), e.getValue()); } data = new Long2DoubleSortedArrayMap(map); cache.put(userId, data); return data; } }
@Override public KeyIndex itemIndex() { requireValid(); return data.getItemIndex(); }
@Override public Collection<RatingMatrixEntry> getUserRatings(long userId) { int uidx = userIndex().tryGetIndex(userId); List<Collection<RatingMatrixEntry>> userLists = userIndexLists.get(); if (uidx < 0 || uidx >= userLists.size()) { return Collections.emptyList(); } else { return userLists.get(uidx); } }
@Test public void testGetRatings() { List<RatingMatrixEntry> ratings = snap.getRatings(); assertEquals(20, ratings.size()); for (int i = 0; i < 20; i++) { RatingMatrixEntry entry = ratings.get(i); assertThat(entry.getIndex(), equalTo(i)); assertThat(ratingList, Matchers.<List<Rating>>anyOf(hasItem(rating(entry.getUserId(), entry.getItemId(), entry.getValue(), 1)), hasItem(rating(entry.getUserId(), entry.getItemId(), entry.getValue(), 2)))); } }
@Override public LongCollection getItemIds() { return itemIndex().getKeyList(); }