@Override public ItemRecommender getItemRecommender() { return get(ItemRecommender.class); }
@Test public void testConfigSeparation() { try (LenskitRecommender rec1 = engine.createRecommender(dao); LenskitRecommender rec2 = engine.createRecommender(dao)) { assertThat(rec1.getItemScorer(), not(sameInstance(rec2.getItemScorer()))); assertThat(rec1.get(SlopeOneModel.class), allOf(not(nullValue()), sameInstance(rec2.get(SlopeOneModel.class)))); } } }
@SuppressWarnings("deprecation") @Test public void testItemItemRecommenderEngineCreate() { try (LenskitRecommender rec = engine.createRecommender()) { assertThat(rec.getItemScorer(), instanceOf(ItemItemScorer.class)); assertThat(rec.getRatingPredictor(), instanceOf(SimpleRatingPredictor.class)); assertThat(rec.getItemRecommender(), instanceOf(TopNItemRecommender.class)); assertThat(rec.getItemBasedItemRecommender(), instanceOf(TopNItemBasedItemRecommender.class)); assertThat(rec.get(ItemBasedItemScorer.class), instanceOf(ItemItemItemBasedItemScorer.class)); } }
@SuppressWarnings("deprecation") @Test public void testItemItemRecommenderEngineCreate() { try (LenskitRecommender rec = engine.createRecommender(dao)) { assertThat(rec.getItemScorer(), instanceOf(ItemItemScorer.class)); assertThat(rec.getRatingPredictor(), instanceOf(SimpleRatingPredictor.class)); assertThat(rec.getItemRecommender(), instanceOf(TopNItemRecommender.class)); assertThat(rec.getItemBasedItemRecommender(), instanceOf(TopNItemBasedItemRecommender.class)); assertThat(rec.get(ItemBasedItemScorer.class), instanceOf(ItemItemItemBasedItemScorer.class)); } }
@Test public void testConfigSeparation() { try(LenskitRecommender rec1 = engine.createRecommender(dao); LenskitRecommender rec2 = engine.createRecommender(dao)){ assertThat(rec1.getItemScorer(), not(sameInstance(rec2.getItemScorer()))); assertThat(rec1.get(ItemItemModel.class), allOf(not(nullValue()), sameInstance(rec2.get(ItemItemModel.class)))); } } }
@Override public ItemScorer getItemScorer() { return get(ItemScorer.class); }
@Test public void testConfigSeparation() { try (LenskitRecommender rec1 = engine.createRecommender(); LenskitRecommender rec2 = engine.createRecommender()) { assertThat(rec1.getItemScorer(), not(sameInstance(rec2.getItemScorer()))); assertThat(rec1.get(ItemItemModel.class), allOf(not(nullValue()), sameInstance(rec2.get(ItemItemModel.class)))); } } }
@Override public RatingPredictor getRatingPredictor() { return get(RatingPredictor.class); }
@Test public void testConfigSeparation() throws RecommenderBuildException { LenskitRecommenderEngine engine = makeEngine(); try (LenskitRecommender rec1 = engine.createRecommender(dao); LenskitRecommender rec2 = engine.createRecommender(dao)) { assertThat(rec1.getItemScorer(), not(sameInstance(rec2.getItemScorer()))); assertThat(rec1.get(HPFModel.class), sameInstance(rec2.get(HPFModel.class))); } }
@Nullable @Override public ItemBasedItemRecommender getItemBasedItemRecommender() { return get(ItemBasedItemRecommender.class); }
@Test public void testConfigSeparation() throws RecommenderBuildException { LenskitRecommenderEngine engine = makeEngine(); try (LenskitRecommender rec1 = engine.createRecommender(dao); LenskitRecommender rec2 = engine.createRecommender(dao)) { assertThat(rec1.getItemScorer(), not(sameInstance(rec2.getItemScorer()))); assertThat(rec1.get(FunkSVDModel.class), sameInstance(rec2.get(FunkSVDModel.class))); } } }
@Nullable @Override public ItemBasedItemScorer getItemBasedItemScorer() { return get(ItemBasedItemScorer.class); }
/** * Get the data access object from this recommender. * @return The data access object. */ @Nonnull public DataAccessObject getDataAccessObject() { DataAccessObject dao = get(DataAccessObject.class); if (dao == null) { throw new IllegalStateException("recommender has no DAO"); } return dao; }
@Nonnull @Override public MetricResult measureUserRecList(Recommender rec, TestUser user, int targetLength, List<Long> recs, Context context) { RatingSummary summary = null; if (rec instanceof LenskitRecommender) { summary = ((LenskitRecommender) rec).get(RatingSummary.class); } if (recs == null || recs.isEmpty() || summary == null) { return MetricResult.empty(); } double pop = 0; for (long item: recs) { pop += summary.getItemRatingCount(item); } pop = pop / recs.size(); context.addUser(pop); return new PopResult(pop); }
@Test public void testContextRemoved() { try (LenskitRecommender rec = engine.createRecommender()) { assertThat(rec.get(ItemItemBuildContext.class), nullValue()); } }
/** * Check that we score items but do not provide scores for items * the user has previously rated. User 5 has rated only item 8 * previously. */ @Test public void testItemScorerNoRating() { long[] items = {7, 8}; ItemItemScorer scorer = session.get(ItemItemScorer.class); assertThat(scorer, notNullValue()); Map<Long, Double> scores = scorer.score(5, LongArrayList.wrap(items)); assertThat(scores, notNullValue()); assertThat(scores.size(), equalTo(1)); assertThat(scores.get(7L), not(notANumber())); assertThat(scores.containsKey(8L), equalTo(false)); }
@Test public void testFeatureInfo() throws RecommenderBuildException { LenskitRecommenderEngine engine = makeEngine(); try (LenskitRecommender rec = engine.createRecommender(dao)) { FunkSVDModel model = rec.get(FunkSVDModel.class); assertThat(model, notNullValue()); assertThat(model.getFeatureInfo().size(), equalTo(20)); for (FeatureInfo feat : model.getFeatureInfo()) { assertThat(feat.getIterCount(), equalTo(10)); assertThat(feat.getLastDeltaRMSE(), greaterThan(0.0)); } } }
@Test public void testComputeMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(101, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(103, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(ItemAverageRatingBiasModelProvider.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getItemBias(200), closeTo(0.0, 1.0e-3)); assertThat(model.getItemBias(201), closeTo(-1.0, 1.0e-3)); assertThat(model.getItemBias(203), closeTo(0.5, 1.0e-3)); } }
@Test public void testComputeItemMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(101, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(103, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(ItemAverageRatingBiasModelProvider.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getItemBias(200), closeTo(0.0, 1.0e-3)); assertThat(model.getItemBias(201), closeTo(-1.0, 1.0e-3)); assertThat(model.getItemBias(203), closeTo(0.5, 1.0e-3)); }
@Test public void testComputeUserMeans() { EntityFactory efac = new EntityFactory(); EntityCollectionDAOBuilder daoBuilder = new EntityCollectionDAOBuilder(); daoBuilder.addEntities(efac.rating(100, 200, 3.0), efac.rating(101, 200, 4.0), efac.rating(102, 201, 2.5), efac.rating(102, 203, 4.5), efac.rating(101, 203, 3.5)); LenskitConfiguration config = new LenskitConfiguration(); config.addRoot(BiasModel.class); config.bind(BiasModel.class).toProvider(UserAverageRatingBiasModelProvider.class); LenskitRecommender rec = LenskitRecommender.build(config, daoBuilder.build()); BiasModel model = rec.get(BiasModel.class); assertThat(model.getIntercept(), closeTo(3.5, 1.0e-3)); assertThat(model.getUserBias(100), closeTo(-0.5, 1.0e-3)); assertThat(model.getUserBias(101), closeTo(0.25, 1.0e-3)); assertThat(model.getUserBias(102), closeTo(0.0, 1.0e-3)); }