/* * Copyright (C) 2015 Information Retrieval Group at Universidad Autónoma * de Madrid, http://ir.ii.uam.es * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package es.uam.eps.ir.ranksys.novdiv.reranking; import es.uam.eps.ir.ranksys.core.Recommendation; import es.uam.eps.ir.ranksys.fast.FastRecommendation; import es.uam.eps.ir.ranksys.fast.index.FastItemIndex; import es.uam.eps.ir.ranksys.fast.index.FastUserIndex; import es.uam.eps.ir.ranksys.rec.fast.AbstractFastRecommender; import es.uam.eps.ir.ranksys.rec.fast.FastRecommender; import static java.lang.Math.min; import java.util.List; import java.util.function.IntPredicate; import java.util.function.Predicate; import static java.util.stream.Collectors.toList; import org.ranksys.core.util.tuples.Tuple2id; import org.ranksys.core.util.tuples.Tuple2od; /** * Wrapper for re-ranker that re-ranks the output of another recommender. * * @author Saúl Vargas (saul.vargas@uam.es) * * @param <U> type of the users * @param <I> type of the items */ public class RerankingRecommender<U, I> extends AbstractFastRecommender<U, I> { private final FastRecommender<U, I> recommender; private final Reranker<U, I> reranker; /** * Constructor. * * @param uIndex user index * @param iIndex item index * @param recommender input recommender * @param reranker re-ranker to apply to input recommender */ public RerankingRecommender(FastUserIndex<U> uIndex, FastItemIndex<I> iIndex, FastRecommender<U, I> recommender, Reranker<U, I> reranker) { super(uIndex, iIndex); this.recommender = recommender; this.reranker = reranker; } @Override public Recommendation<U, I> getRecommendation(U u, int maxLength, Predicate<I> filter) { return reranker.rerankRecommendation(recommender.getRecommendation(u, filter), maxLength); } @Override public FastRecommendation getRecommendation(int uidx, int maxLength, IntPredicate filter) { FastRecommendation frec = recommender.getRecommendation(uidx, filter); U user = uidx2user(uidx); List<Tuple2od<I>> items = frec.getIidxs().stream() .map(this::iidx2item) .collect(toList()); Recommendation<U, I> rec = new Recommendation<>(user, items); rec = reranker.rerankRecommendation(rec, min(maxLength, items.size())); List<Tuple2id> iidxs = rec.getItems().stream() .map(this::item2iidx) .collect(toList()); frec = new FastRecommendation(uidx, iidxs); return frec; } }