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 sampledPrefs = new FixedSizeSamplingIterator(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 sampledPossibleIDs = new FixedSizeSamplingIterator(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;