/*
* Copyright (C) 2016 RankSys http://ranksys.org
*
* 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 org.ranksys.fast.preference;
import es.uam.eps.ir.ranksys.core.preference.IdPref;
import es.uam.eps.ir.ranksys.fast.index.FastItemIndex;
import es.uam.eps.ir.ranksys.fast.index.FastUserIndex;
import es.uam.eps.ir.ranksys.fast.preference.AbstractFastPreferenceData;
import es.uam.eps.ir.ranksys.fast.preference.IdxPref;
import it.unimi.dsi.fastutil.doubles.DoubleIterator;
import it.unimi.dsi.fastutil.ints.IntIterator;
import java.util.function.Function;
import static java.util.stream.IntStream.range;
import java.util.stream.Stream;
/**
* Extends AbstractFastPreferenceData and implements the data access stream-based methods using the iterator-based ones. Avoids duplicating code where iterator-based methods are preferred.
*
* @author Saúl Vargas (Saul@VargasSandoval.es)
* @param <U> user type
* @param <I> item type
*/
public abstract class IteratorsAbstractFastPreferenceData<U, I> extends AbstractFastPreferenceData<U, I> {
/**
* Constructor with default IdxPref to IdPref converter.
*
* @param userIndex user index
* @param itemIndex item index
*/
public IteratorsAbstractFastPreferenceData(FastUserIndex<U> userIndex, FastItemIndex<I> itemIndex) {
super(userIndex, itemIndex);
}
/**
* Constructor with custom IdxPref to IdPref converter.
*
* @param userIndex user index
* @param itemIndex item index
* @param uPrefFun user IdxPref to IdPref converter
* @param iPrefFun item IdxPref to IdPref converter
*/
public IteratorsAbstractFastPreferenceData(FastUserIndex<U> userIndex, FastItemIndex<I> itemIndex, Function<IdxPref, IdPref<I>> uPrefFun, Function<IdxPref, IdPref<U>> iPrefFun) {
super(userIndex, itemIndex, uPrefFun, iPrefFun);
}
@Override
public Stream<? extends IdxPref> getUidxPreferences(int uidx) {
return getPreferences(numItems(uidx), getUidxIidxs(uidx), getUidxVs(uidx));
}
@Override
public Stream<? extends IdxPref> getIidxPreferences(int iidx) {
return getPreferences(numUsers(iidx), getIidxUidxs(iidx), getIidxVs(iidx));
}
/**
* Converts the int and double iterators to a stream of IdxPref.
*
* @param n length of iterators
* @param idxs iterator of user/item indices
* @param vs interator of user/item values
* @return stream of IdxPref
*/
protected Stream<IdxPref> getPreferences(int n, IntIterator idxs, DoubleIterator vs) {
return range(0, n).mapToObj(i -> new IdxPref(idxs.nextInt(), vs.nextDouble()));
}
@Override
public boolean useIteratorsPreferentially() {
return true;
}
}