blob: f59721a5e0176729405c16cb770961cdb2b6db38 [file] [log] [blame]
package io.prediction.algorithms.mahout.itemrec;
import org.apache.mahout.cf.taste.impl.recommender.AbstractCandidateItemsStrategy;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.model.GenericBooleanPrefDataModel;
/* modified based on PreferredItemsNeighborhoodCandidateItemsStrategy */
public final class AllPreferredItemsNeighborhoodCandidateItemsStrategy extends AbstractCandidateItemsStrategy {
//private final DataModel seenDataModel;
private final FastByIDMap<FastIDSet> seenDataMap;
/*
* @param seenDataModel set this to null if don't exclude seen items
*/
public AllPreferredItemsNeighborhoodCandidateItemsStrategy(
DataModel seenDataModel) throws TasteException {
super();
if (seenDataModel != null)
this.seenDataMap = GenericBooleanPrefDataModel.toDataMap(
seenDataModel);
else
this.seenDataMap = null;
}
public AllPreferredItemsNeighborhoodCandidateItemsStrategy()
throws TasteException {
this(null);
}
@Override
public FastIDSet getCandidateItems(long userID,
PreferenceArray preferencesFromUser, DataModel dataModel)
throws TasteException {
long[] seenItemIDs;
if (this.seenDataMap != null) {
FastIDSet ids = seenDataMap.get(userID);
if (ids != null) {
seenItemIDs = ids.toArray();
} else {
seenItemIDs = null;
}
} else {
seenItemIDs = null;
}
return doGetCandidateItems(preferencesFromUser.getIDs(),
dataModel, seenItemIDs);
}
/**
* returns all items that have not been rated by the user and that were preferred by another user
* that has preferred at least one item that the current user has preferred too.
* excluding seen items.
*/
protected FastIDSet doGetCandidateItems(long[] preferredItemIDs,
DataModel dataModel, long[] seenItemIDs) throws TasteException {
FastIDSet possibleItemsIDs = new FastIDSet();
for (long itemID : preferredItemIDs) {
PreferenceArray itemPreferences = dataModel.getPreferencesForItem(itemID);
int numUsersPreferringItem = itemPreferences.length();
for (int index = 0; index < numUsersPreferringItem; index++) {
possibleItemsIDs.addAll(
dataModel.getItemIDsFromUser(itemPreferences.getUserID(index)));
}
}
if (seenItemIDs != null)
possibleItemsIDs.removeAll(seenItemIDs);
return possibleItemsIDs;
}
@Override
protected FastIDSet doGetCandidateItems(long[] preferredItemIDs,
DataModel dataModel) throws TasteException {
return doGetCandidateItems(preferredItemIDs, dataModel, null);
}
}