protected FastIDSet doGetCandidateItems(long[] preferredItemIDs, DataModel dataModel) throws TasteException {
int maxPrefsPerItemConsidered = (int) Math.min(defaultMaxPrefsPerItemConsidered, userItemCountMultiplier * Math.log(Math.max(dataModel.getNumUsers(), dataModel.getNumItems())));
FastIDSet possibleItemsIDs = new FastIDSet();
for (long itemID : preferredItemIDs) {
PreferenceArray prefs = dataModel.getPreferencesForItem(itemID);
int prefsConsidered = Math.min(prefs.length(), maxPrefsPerItemConsidered);
Iterator<Preference> sampledPrefs = new FixedSizeSamplingIterator<Preference>(prefsConsidered, prefs.iterator());
while (sampledPrefs.hasNext()) {
possibleItemsIDs.addAll(dataModel.getItemIDsFromUser(sampledPrefs.next().getUserID()));
}
}
possibleItemsIDs.removeAll(preferredItemIDs);
//
if (this.maxSampledItems > 0) {
FastIDSet finalPossibleItemsIDs = new FastIDSet();
Iterator<Long> sampledPossibleIDs = new FixedSizeSamplingIterator<Long>(this.maxSampledItems, possibleItemsIDs.iterator());
while (sampledPossibleIDs.hasNext()) {
finalPossibleItemsIDs.add(sampledPossibleIDs.next().longValue());
}
logger.debug("finalPossibleItemsIDs size:" + finalPossibleItemsIDs.size());
return finalPossibleItemsIDs;
}
logger.debug("possibleItemsIDs size:" + possibleItemsIDs.size());
return possibleItemsIDs;