You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by sr...@apache.org on 2009/07/24 16:32:07 UTC
svn commit: r797487 [1/5] - in /lucene/mahout/trunk:
core/src/main/java/org/apache/mahout/cf/taste/eval/
core/src/main/java/org/apache/mahout/cf/taste/hadoop/
core/src/main/java/org/apache/mahout/cf/taste/impl/eval/
core/src/main/java/org/apache/mahout...
Author: srowen
Date: Fri Jul 24 14:32:05 2009
New Revision: 797487
URL: http://svn.apache.org/viewvc?rev=797487&view=rev
Log:
MAHOUT-149 and MAHOUT-150
Removed:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/DetailedPreference.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericItem.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Item.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/Book.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/Movie.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixMovie.java
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/CachingUserNeighborhood.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNUserNeighborhood.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdUserNeighborhood.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/AbstractRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/BooleanUserGenericUserBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByRescoreComparator.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemAverageRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ItemUserAverageRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/NullRescorer.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TopItems.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommender2.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/knn/KnnItemBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/MemoryDiffStorage.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/jdbc/AbstractJDBCDiffStorage.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd/SVDRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AveragingPreferenceInferrer.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/BooleanLogLikelihoodSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/BooleanTanimotoCoefficientSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/CachingItemSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/User.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericItemBasedRecommenderTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/GenericUserBasedRecommenderTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/MockRecommender.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/NullRescorerTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/TreeClusteringRecommenderTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/slopeone/SlopeOneRecommenderTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/AveragingPreferenceInferrerTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/EuclideanDistanceSimilarityTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/GenericItemSimilarityTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarityTest.java
lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJB.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJBBean.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/ejb/RecommenderEJBLocal.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingRecommender.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/bookcrossing/BookCrossingUser.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/GroupLensDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens/GroupLensRecommender.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/jester/JesterRecommender.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixFileDataModel.java
lucene/mahout/trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/netflix/NetflixRecommender.java
lucene/mahout/trunk/taste-web/src/main/java/org/apache/mahout/cf/taste/web/RecommenderServlet.java
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/eval/RecommenderIRStatsEvaluator.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.recommender.Rescorer;
/**
@@ -37,14 +36,14 @@
* @param rescorer if any, to use when computing recommendations
* @param at as in, "precision at 5". The number of recommendations to consider when evaluating
* precision, etc.
- * @param relevanceThreshold {@link Item}s whose preference value is at least this value are considered "relevant" for
+ * @param relevanceThreshold items whose preference value is at least this value are considered "relevant" for
* the purposes of computations
* @return {@link IRStatistics} with resulting precision, recall, etc.
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
DataModel dataModel,
- Rescorer<Item> rescorer,
+ Rescorer<Comparable<?>> rescorer,
int at,
double relevanceThreshold,
double evaluationPercentage) throws TasteException;
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/RecommendedItemsWritable.java Fri Jul 24 14:32:05 2009
@@ -18,9 +18,7 @@
package org.apache.mahout.cf.taste.hadoop;
import org.apache.hadoop.io.Writable;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
import org.apache.mahout.cf.taste.impl.recommender.GenericRecommendedItem;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import java.io.DataInput;
@@ -53,7 +51,7 @@
@Override
public void write(DataOutput out) throws IOException {
for (RecommendedItem item : recommended) {
- out.writeUTF(item.getItem().getID().toString());
+ out.writeUTF(item.getItemID().toString());
out.writeDouble(item.getValue());
}
@@ -66,8 +64,7 @@
do {
String itemID = in.readUTF();
double value = in.readDouble();
- Item item = new GenericItem<String>(itemID);
- RecommendedItem recommendedItem = new GenericRecommendedItem(item, value);
+ RecommendedItem recommendedItem = new GenericRecommendedItem(itemID, value);
recommended.add(recommendedItem);
} while (true);
} catch (EOFException eofe) {
@@ -92,7 +89,7 @@
} else {
result.append(',');
}
- result.append(item.getItem().getID().toString());
+ result.append(item.getItemID().toString());
result.append(':');
result.append(item.getValue());
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AbstractDifferenceRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -98,7 +98,7 @@
List<Preference> testPrefs = new ArrayList<Preference>();
Preference[] prefs = user.getPreferencesAsArray();
for (Preference pref : prefs) {
- Preference newPref = new GenericPreference(null, pref.getItem(), pref.getValue());
+ Preference newPref = new GenericPreference(null, pref.getItemID(), pref.getValue());
if (random.nextDouble() < trainingPercentage) {
trainingPrefs.add(newPref);
} else {
@@ -108,15 +108,8 @@
log.debug("Training against {} preferences", trainingPrefs.size());
log.debug("Evaluating accuracy of {} preferences", testPrefs.size());
if (!trainingPrefs.isEmpty()) {
- Object id = user.getID();
- User trainingUser;
- if (id instanceof Long) {
- trainingUser = new GenericUser<Long>((Long) id, trainingPrefs);
- } else if (id instanceof Integer) {
- trainingUser = new GenericUser<Integer>((Integer) id, trainingPrefs);
- } else {
- trainingUser = new GenericUser<String>(id.toString(), trainingPrefs);
- }
+ Comparable<?> id = user.getID();
+ User trainingUser = new GenericUser(id, trainingPrefs);
trainingUsers.add(trainingUser);
if (!testPrefs.isEmpty()) {
testUserPrefs.put(trainingUser, testPrefs);
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -51,7 +51,7 @@
User testUser = entry.getKey();
try {
double estimatedPreference =
- recommender.estimatePreference(testUser.getID(), realPref.getItem().getID());
+ recommender.estimatePreference(testUser.getID(), realPref.getItemID());
if (!Double.isNaN(estimatedPreference)) {
average.addDatum(Math.abs(realPref.getValue() - estimatedPreference));
}
@@ -60,7 +60,7 @@
// NSEE will be thrown. Just ignore it and move on.
log.debug("User exists in test data but not training data: {}", testUser.getID(), nsue);
} catch (NoSuchItemException nsie) {
- log.debug("Item exists in test data but not training data: {}", realPref.getItem().getID(), nsie);
+ log.debug("Item exists in test data but not training data: {}", realPref.getItemID(), nsie);
}
}
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluator.java Fri Jul 24 14:32:05 2009
@@ -34,7 +34,6 @@
import org.apache.mahout.cf.taste.impl.model.GenericUser;
import org.apache.mahout.cf.taste.impl.model.GenericBooleanUserDataModel;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
@@ -54,7 +53,7 @@
* <p>For each {@link User}, these implementation determine the top <code>n</code> preferences, then evaluate the IR
* statistics based on a {@link DataModel} that does not have these values. This number <code>n</code> is the "at"
* value, as in "precision at 5". For example, this would mean precision evaluated by removing the top 5 preferences for
- * a {@link User} and then finding the percentage of those 5 {@link Item}s included in the top 5 recommendations for
+ * a {@link User} and then finding the percentage of those 5 items included in the top 5 recommendations for
* that user.</p>
*/
public final class GenericRecommenderIRStatsEvaluator implements RecommenderIRStatsEvaluator {
@@ -76,7 +75,7 @@
@Override
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
DataModel dataModel,
- Rescorer<Item> rescorer,
+ Rescorer<Comparable<?>> rescorer,
int at,
double relevanceThreshold,
double evaluationPercentage) throws TasteException {
@@ -104,8 +103,8 @@
for (User user : dataModel.getUsers()) {
if (random.nextDouble() < evaluationPercentage) {
long start = System.currentTimeMillis();
- Object id = user.getID();
- Collection<Item> relevantItems = new FastSet<Item>(at);
+ Comparable<?> id = user.getID();
+ Collection<Comparable<?>> relevantItemIDs = new FastSet<Comparable<?>>(at);
Preference[] prefs = user.getPreferencesAsArray();
if (prefs.length < 2 * at) {
// Really not enough prefs to meaningfully evaluate this user
@@ -115,17 +114,17 @@
// List some most-preferred items that would count as (most) "relevant" results
double theRelevanceThreshold = Double.isNaN(relevanceThreshold) ? computeThreshold(prefs) : relevanceThreshold;
Arrays.sort(prefs, Collections.reverseOrder(ByValuePreferenceComparator.getInstance()));
- for (int i = 0; i < prefs.length && relevantItems.size() < at; i++) {
+ for (int i = 0; i < prefs.length && relevantItemIDs.size() < at; i++) {
Preference pref = prefs[i];
if (pref.getValue() >= theRelevanceThreshold) {
- relevantItems.add(pref.getItem());
+ relevantItemIDs.add(pref.getItemID());
}
}
- int numRelevantItems = relevantItems.size();
+ int numRelevantItems = relevantItemIDs.size();
if (numRelevantItems > 0) {
List<User> trainingUsers = new ArrayList<User>(dataModel.getNumUsers());
for (User user2 : dataModel.getUsers()) {
- processOtherUser(id, relevantItems, trainingUsers, user2);
+ processOtherUser(id, relevantItemIDs, trainingUsers, user2);
}
DataModel trainingModel;
@@ -145,7 +144,7 @@
int intersectionSize = 0;
List<RecommendedItem> recommendedItems = recommender.recommend(id, at, rescorer);
for (RecommendedItem recommendedItem : recommendedItems) {
- if (relevantItems.contains(recommendedItem.getItem())) {
+ if (relevantItemIDs.contains(recommendedItem.getItemID())) {
intersectionSize++;
}
}
@@ -171,15 +170,15 @@
return new IRStatisticsImpl(precision.getAverage(), recall.getAverage(), fallOut.getAverage());
}
- private static void processOtherUser(Object id,
- Collection<Item> relevantItems,
+ private static void processOtherUser(Comparable<?> id,
+ Collection<Comparable<?>> relevantItemIDs,
Collection<User> trainingUsers,
User user2) {
if (id.equals(user2.getID())) {
List<Preference> trainingPrefs = new ArrayList<Preference>();
Preference[] prefs2 = user2.getPreferencesAsArray();
for (Preference pref : prefs2) {
- if (!relevantItems.contains(pref.getItem())) {
+ if (!relevantItemIDs.contains(pref.getItemID())) {
trainingPrefs.add(pref);
}
}
@@ -187,25 +186,13 @@
// TODO hack
User trainingUser;
if (user2 instanceof BooleanPrefUser) {
- FastSet<Object> itemIDs = new FastSet<Object>();
+ FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
for (Preference pref : trainingPrefs) {
- itemIDs.add(pref.getItem().getID());
- }
- if (id instanceof Long) {
- trainingUser = new BooleanPrefUser<Long>((Long) id, itemIDs);
- } else if (id instanceof Integer) {
- trainingUser = new BooleanPrefUser<Integer>((Integer) id, itemIDs);
- } else {
- trainingUser = new BooleanPrefUser<String>(id.toString(), itemIDs);
+ itemIDs.add(pref.getItemID());
}
+ trainingUser = new BooleanPrefUser(id, itemIDs);
} else {
- if (id instanceof Long) {
- trainingUser = new GenericUser<Long>((Long) id, trainingPrefs);
- } else if (id instanceof Integer) {
- trainingUser = new GenericUser<Integer>((Integer) id, trainingPrefs);
- } else {
- trainingUser = new GenericUser<String>(id.toString(), trainingPrefs);
- }
+ trainingUser = new GenericUser(id, trainingPrefs);
}
trainingUsers.add(trainingUser);
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluator.java Fri Jul 24 14:32:05 2009
@@ -49,7 +49,7 @@
User testUser = entry.getKey();
try {
double estimatedPreference =
- recommender.estimatePreference(testUser.getID(), realPref.getItem().getID());
+ recommender.estimatePreference(testUser.getID(), realPref.getItemID());
if (!Double.isNaN(estimatedPreference)) {
double diff = realPref.getValue() - estimatedPreference;
average.addDatum(diff * diff);
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPrefUser.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
import org.apache.mahout.cf.taste.impl.common.ArrayIterator;
import org.apache.mahout.cf.taste.impl.common.FastSet;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
@@ -30,12 +29,12 @@
* A variant of {@link GenericUser} which is appropriate when users express only a "yes" preference for an item, or none
* at all. The preference value for all items is considered to be 1.0.
*/
-public class BooleanPrefUser<K extends Comparable<K>> implements User, Serializable {
+public class BooleanPrefUser implements User, Serializable {
- private final K id;
- private final FastSet<Object> itemIDs;
+ private final Comparable id;
+ private final FastSet<Comparable<?>> itemIDs;
- public BooleanPrefUser(K id, FastSet<Object> itemIDs) {
+ public BooleanPrefUser(Comparable<?> id, FastSet<Comparable<?>> itemIDs) {
if (id == null || itemIDs == null || itemIDs.isEmpty()) {
throw new IllegalArgumentException("id or itemIDs is null or empty");
}
@@ -44,23 +43,23 @@
}
@Override
- public K getID() {
+ public Comparable<?> getID() {
return id;
}
@Override
- public Preference getPreferenceFor(Object itemID) {
+ public Preference getPreferenceFor(Comparable<?> itemID) {
return itemIDs.contains(itemID) ? buildPreference(itemID) : null;
}
/** Note that the value parameter is ignored; it is as if it were always 1.0. */
@Override
- public void setPreference(Item item, double value) {
- itemIDs.add(item.getID());
+ public void setPreference(Comparable<?> itemID, double value) {
+ itemIDs.add(itemID);
}
@Override
- public void removePreference(Object itemID) {
+ public void removePreference(Comparable<?> itemID) {
itemIDs.remove(itemID);
}
@@ -73,7 +72,7 @@
public Preference[] getPreferencesAsArray() {
Preference[] result = new Preference[itemIDs.size()];
int i = 0;
- for (Object itemID : itemIDs) {
+ for (Comparable<?> itemID : itemIDs) {
result[i] = buildPreference(itemID);
i++;
}
@@ -81,22 +80,17 @@
return result;
}
- private Preference buildPreference(Object itemID) {
- if (itemID instanceof Long) {
- return new BooleanPreference(this, new GenericItem<Long>((Long) itemID));
- } else if (itemID instanceof Integer) {
- return new BooleanPreference(this, new GenericItem<Integer>((Integer) itemID));
- }
- return new BooleanPreference(this, new GenericItem<String>(itemID.toString()));
+ private Preference buildPreference(Comparable<?> itemID) {
+ return new BooleanPreference(this, itemID);
}
/** @return true iff this user expresses a preference for the given item */
- public boolean hasPreferenceFor(Object itemID) {
+ public boolean hasPreferenceFor(Comparable<?> itemID) {
return itemIDs.contains(itemID);
}
/** @return all item IDs the user expresses a preference for */
- public FastSet<Object> getItemIDs() {
+ public FastSet<Comparable<?>> getItemIDs() {
return itemIDs;
}
@@ -118,7 +112,7 @@
@Override
@SuppressWarnings("unchecked")
public int compareTo(User o) {
- return id.compareTo((K) o.getID());
+ return id.compareTo(o.getID());
}
}
\ No newline at end of file
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java Fri Jul 24 14:32:05 2009
@@ -17,27 +17,26 @@
package org.apache.mahout.cf.taste.impl.model;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.User;
import java.io.Serializable;
/**
- * Encapsulates a simple boolean "preference" for an {@link Item} whose value does not matter (is fixed at 1.0). This is
+ * Encapsulates a simple boolean "preference" for an item whose value does not matter (is fixed at 1.0). This is
* appropriate in situations where users conceptually have only a general "yes" preference for items, rather than a
* spectrum of preference values.
*/
public final class BooleanPreference implements SettableUserPreference, Serializable {
private User user;
- private final Item item;
+ private final Comparable<?> itemID;
- public BooleanPreference(User user, Item item) {
- if (item == null) {
- throw new IllegalArgumentException("item is null");
+ public BooleanPreference(User user, Comparable<?> itemID) {
+ if (itemID == null) {
+ throw new IllegalArgumentException("itemID is null");
}
this.user = user;
- this.item = item;
+ this.itemID = itemID;
}
@Override
@@ -57,8 +56,8 @@
}
@Override
- public Item getItem() {
- return item;
+ public Comparable<?> getItemID() {
+ return itemID;
}
@Override
@@ -73,7 +72,7 @@
@Override
public String toString() {
- return "BooleanPreference[user: " + user + ", item:" + item + ']';
+ return "BooleanPreference[user: " + user + ", itemID:" + itemID + ']';
}
}
\ No newline at end of file
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/ByItemPreferenceComparator.java Fri Jul 24 14:32:05 2009
@@ -23,8 +23,7 @@
import java.util.Comparator;
/**
- * <p>{@link java.util.Comparator} that orders {@link org.apache.mahout.cf.taste.model.Preference}s by {@link
- * org.apache.mahout.cf.taste.model.Item}.</p>
+ * <p>{@link java.util.Comparator} that orders {@link org.apache.mahout.cf.taste.model.Preference}s by item.</p>
*/
public final class ByItemPreferenceComparator implements Comparator<Preference>, Serializable {
@@ -40,7 +39,7 @@
@Override
public int compare(Preference o1, Preference o2) {
- return o1.getItem().compareTo(o2.getItem());
+ return ((Comparable<Object>) o1.getItemID()).compareTo(o2.getItemID());
}
@Override
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericBooleanUserDataModel.java Fri Jul 24 14:32:05 2009
@@ -24,7 +24,6 @@
import org.apache.mahout.cf.taste.impl.common.FastMap;
import org.apache.mahout.cf.taste.impl.common.FastSet;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
@@ -42,17 +41,16 @@
public final class GenericBooleanUserDataModel implements DataModel, Serializable {
private final List<User> users;
- private final FastMap<Object, User> userMap;
+ private final FastMap<Comparable<?>, User> userMap;
private final Object[] itemIDs;
- //private final Set<Object> itemIDSet;
public GenericBooleanUserDataModel(Iterable<? extends User> users) {
if (users == null) {
throw new IllegalArgumentException("users is null");
}
this.users = new ArrayList<User>(1003);
- this.userMap = new FastMap<Object, User>(1003);
- Set<Object> itemIDs = new FastSet<Object>(1003);
+ this.userMap = new FastMap<Comparable<?>, User>(1003);
+ Set<Comparable<?>> itemIDs = new FastSet<Comparable<?>>(1003);
for (User user : users) {
if (!(user instanceof BooleanPrefUser)) {
throw new IllegalArgumentException("Must use a source of BooleanPrefUsers");
@@ -67,8 +65,6 @@
this.itemIDs = itemIDs.toArray();
itemIDs = null;
Arrays.sort(this.itemIDs);
- //this.itemIDSet = new FastSet<Object>(this.itemIDs.length);
- //itemIDSet.addAll(Arrays.asList(this.itemIDs));
}
public GenericBooleanUserDataModel(DataModel dataModel) throws TasteException {
@@ -81,7 +77,7 @@
}
@Override
- public User getUser(Object id) throws NoSuchUserException {
+ public User getUser(Comparable<?> id) throws NoSuchUserException {
User user = userMap.get(id);
if (user == null) {
throw new NoSuchUserException();
@@ -90,22 +86,17 @@
}
@Override
- public Iterable<? extends Item> getItems() {
+ public Iterable<Comparable<?>> getItemIDs() {
throw new UnsupportedOperationException();
}
@Override
- public Item getItem(Object id) throws NoSuchItemException {
+ public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) {
throw new UnsupportedOperationException();
}
@Override
- public Iterable<? extends Preference> getPreferencesForItem(Object itemID) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Preference[] getPreferencesForItemAsArray(Object itemID) {
+ public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) {
throw new UnsupportedOperationException();
}
@@ -120,7 +111,7 @@
}
@Override
- public int getNumUsersWithPreferenceFor(Object... itemIDs) {
+ public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) {
if (itemIDs == null) {
throw new IllegalArgumentException("itemIDs is null");
}
@@ -132,13 +123,13 @@
}
@Override
- public void setPreference(Object userID, Object itemID, double value)
+ public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
throws NoSuchUserException, NoSuchItemException {
throw new UnsupportedOperationException();
}
@Override
- public void removePreference(Object userID, Object itemID) throws NoSuchUserException {
+ public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws NoSuchUserException {
throw new UnsupportedOperationException();
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java Fri Jul 24 14:32:05 2009
@@ -26,7 +26,6 @@
import org.apache.mahout.cf.taste.impl.common.FastMap;
import org.apache.mahout.cf.taste.impl.common.FastSet;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
import org.slf4j.Logger;
@@ -54,10 +53,9 @@
private static final Iterable<Preference> NO_PREFS_ITERABLE = new EmptyIterable<Preference>();
private final List<User> users;
- private final FastMap<Object, User> userMap;
- private final List<Item> items;
- private final FastMap<Object, Item> itemMap;
- private final FastMap<Object, Preference[]> preferenceForItems;
+ private final FastMap<Comparable<?>, User> userMap;
+ private final List<Comparable<?>> itemIDs;
+ private final FastMap<Comparable<?>, Preference[]> preferenceForItems;
/**
* <p>Creates a new {@link GenericDataModel} from the given {@link User}s (and their preferences). This {@link
@@ -71,19 +69,18 @@
throw new IllegalArgumentException("users is null");
}
- this.userMap = new FastMap<Object, User>();
- this.itemMap = new FastMap<Object, Item>();
+ this.userMap = new FastMap<Comparable<?>, User>();
// I'm abusing generics a little here since I want to use this (huge) map to hold Lists,
// then arrays, and don't want to allocate two Maps at once here.
- FastMap<Object, Object> prefsForItems = new FastMap<Object, Object>();
+ FastMap<Comparable<?>, Object> prefsForItems = new FastMap<Comparable<?>, Object>();
+ FastSet<Comparable<?>> itemIDSet = new FastSet<Comparable<?>>();
int currentCount = 0;
for (User user : users) {
userMap.put(user.getID(), user);
Preference[] prefsArray = user.getPreferencesAsArray();
for (Preference preference : prefsArray) {
- Item item = preference.getItem();
- Object itemID = item.getID();
- itemMap.put(itemID, item);
+ Comparable<?> itemID = preference.getItemID();
+ itemIDSet.add(itemID);
List<Preference> prefsForItem = (List<Preference>) prefsForItems.get(itemID);
if (prefsForItem == null) {
prefsForItem = new ArrayList<Preference>();
@@ -97,19 +94,16 @@
}
}
userMap.rehash();
- itemMap.rehash();
- List<User> usersCopy = new ArrayList<User>(userMap.values());
- Collections.sort(usersCopy);
- this.users = Collections.unmodifiableList(usersCopy);
-
- List<Item> itemsCopy = new ArrayList<Item>(itemMap.values());
- Collections.sort(itemsCopy);
- this.items = Collections.unmodifiableList(itemsCopy);
+ this.users = new ArrayList<User>(userMap.values());
+ Collections.sort(this.users);
+
+ this.itemIDs = new ArrayList<Comparable<?>>(itemIDSet);
+ Collections.sort((List<? extends Comparable>) this.itemIDs);
prefsForItems.rehash();
// Swap out lists for arrays here -- using the same Map. This is why the generics mess is worth it.
- for (Map.Entry<Object, Object> entry : prefsForItems.entrySet()) {
+ for (Map.Entry<Comparable<?>, Object> entry : prefsForItems.entrySet()) {
List<Preference> list = (List<Preference>) entry.getValue();
Preference[] prefsAsArray = list.toArray(new Preference[list.size()]);
Arrays.sort(prefsAsArray, ByUserPreferenceComparator.getInstance());
@@ -117,7 +111,7 @@
}
// Yeah more generics ugliness
- this.preferenceForItems = (FastMap<Object, Preference[]>) (FastMap<Object, ?>) prefsForItems;
+ this.preferenceForItems = (FastMap<Comparable<?>, Preference[]>) (FastMap<Comparable<?>, ?>) prefsForItems;
}
/**
@@ -138,7 +132,7 @@
/** @throws NoSuchUserException if there is no such {@link User} */
@Override
- public User getUser(Object id) throws NoSuchUserException {
+ public User getUser(Comparable<?> id) throws NoSuchUserException {
User user = userMap.get(id);
if (user == null) {
throw new NoSuchUserException();
@@ -147,35 +141,25 @@
}
@Override
- public Iterable<? extends Item> getItems() {
- return items;
- }
-
- /** @throws NoSuchItemException if there is no such {@link Item} */
- @Override
- public Item getItem(Object id) throws NoSuchItemException {
- Item item = itemMap.get(id);
- if (item == null) {
- throw new NoSuchItemException();
- }
- return item;
+ public Iterable<Comparable<?>> getItemIDs() {
+ return itemIDs;
}
@Override
- public Iterable<? extends Preference> getPreferencesForItem(Object itemID) {
+ public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) {
Preference[] prefs = preferenceForItems.get(itemID);
return prefs == null ? NO_PREFS_ITERABLE : new ArrayIterator<Preference>(prefs);
}
@Override
- public Preference[] getPreferencesForItemAsArray(Object itemID) {
+ public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) {
Preference[] prefs = preferenceForItems.get(itemID);
return prefs == null ? NO_PREFS_ARRAY : prefs;
}
@Override
public int getNumItems() {
- return items.size();
+ return itemIDs.size();
}
@Override
@@ -184,7 +168,7 @@
}
@Override
- public int getNumUsersWithPreferenceFor(Object... itemIDs) {
+ public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) {
if (itemIDs == null) {
throw new IllegalArgumentException("itemIDs is null");
}
@@ -201,11 +185,11 @@
if (prefs1 == null || prefs2 == null) {
return 0;
}
- Set<Object> users1 = new FastSet<Object>(prefs1.length);
+ Set<Comparable<?>> users1 = new FastSet<Comparable<?>>(prefs1.length);
for (Preference aPrefs1 : prefs1) {
users1.add(aPrefs1.getUser().getID());
}
- Set<Object> users2 = new FastSet<Object>(prefs2.length);
+ Set<Comparable<?>> users2 = new FastSet<Comparable<?>>(prefs2.length);
for (Preference aPrefs2 : prefs2) {
users2.add(aPrefs2.getUser().getID());
}
@@ -215,13 +199,13 @@
}
@Override
- public void setPreference(Object userID, Object itemID, double value)
+ public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
throws NoSuchUserException, NoSuchItemException {
- getUser(userID).setPreference(getItem(itemID), value);
+ getUser(userID).setPreference(itemID, value);
}
@Override
- public void removePreference(Object userID, Object itemID) throws NoSuchUserException {
+ public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws NoSuchUserException {
getUser(userID).removePreference(itemID);
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java Fri Jul 24 14:32:05 2009
@@ -17,28 +17,27 @@
package org.apache.mahout.cf.taste.impl.model;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
import java.io.Serializable;
-/** <p>A simple {@link Preference} encapsulating an {@link Item} and preference value.</p> */
+/** <p>A simple {@link Preference} encapsulating an item and preference value.</p> */
public class GenericPreference implements SettableUserPreference, Serializable {
private User user;
- private final Item item;
+ private final Comparable<?> itemID;
private double value;
- public GenericPreference(User user, Item item, double value) {
- if (item == null) {
- throw new IllegalArgumentException("item is null");
+ public GenericPreference(User user, Comparable<?> itemID, double value) {
+ if (itemID == null) {
+ throw new IllegalArgumentException("itemID is null");
}
if (Double.isNaN(value)) {
throw new IllegalArgumentException("Invalid value: " + value);
}
this.user = user;
- this.item = item;
+ this.itemID = itemID;
this.value = value;
}
@@ -59,8 +58,8 @@
}
@Override
- public Item getItem() {
- return item;
+ public Comparable<?> getItemID() {
+ return itemID;
}
@Override
@@ -78,7 +77,7 @@
@Override
public String toString() {
- return "GenericPreference[user: " + user + ", item:" + item + ", value:" + value + ']';
+ return "GenericPreference[user: " + user + ", itemID:" + itemID + ", value:" + value + ']';
}
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreferenceArray.java Fri Jul 24 14:32:05 2009
@@ -17,7 +17,6 @@
package org.apache.mahout.cf.taste.impl.model;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.apache.mahout.cf.taste.model.User;
@@ -25,7 +24,7 @@
import java.io.Serializable;
/**
- * This implementation maintains three parallel arrays, of {@link User}s, {@link Item}s, and values. The idea is to save
+ * This implementation maintains three parallel arrays, of {@link User}s, items, and values. The idea is to save
* allocating {@link Preference} objects themselves. On a 64-bit virtual machine, this should save 12 bytes per element
* (the overhead of an enclosing {@link Preference} object reference and object header).
*
@@ -34,24 +33,24 @@
public final class GenericPreferenceArray implements PreferenceArray, Serializable {
private final User[] users;
- private final Item[] items;
+ private final Comparable<?>[] itemIDs;
private final double[] values;
public GenericPreferenceArray(int size) {
users = new User[size];
- items = new Item[size];
+ itemIDs = new Comparable<?>[size];
values = new double[size];
}
@Override
public Preference get(int i) {
- return new GenericPreference(users[i], items[i], values[i]);
+ return new GenericPreference(users[i], itemIDs[i], values[i]);
}
@Override
public void set(int i, Preference pref) {
users[i] = pref.getUser();
- items[i] = pref.getItem();
+ itemIDs[i] = pref.getItemID();
values[i] = pref.getValue();
}
@@ -66,13 +65,13 @@
}
@Override
- public Item getItem(int i) {
- return items[i];
+ public Comparable<?> getItemID(int i) {
+ return itemIDs[i];
}
@Override
- public void setItem(int i, Item item) {
- items[i] = item;
+ public void setItemID(int i, Comparable<?> itemID) {
+ itemIDs[i] = itemID;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java Fri Jul 24 14:32:05 2009
@@ -19,7 +19,6 @@
import org.apache.mahout.cf.taste.impl.common.ArrayIterator;
import org.apache.mahout.cf.taste.impl.common.FastMap;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
@@ -31,16 +30,16 @@
import java.util.Map;
/** <p>A simple {@link User} which has simply an ID and some {@link Collection} of {@link Preference}s.</p> */
-public class GenericUser<K extends Comparable<K>> implements User, Serializable {
+public class GenericUser implements User, Serializable {
private static final Preference[] NO_PREFS = new Preference[0];
- private final K id;
- private final Map<Object, Preference> data;
+ private final Comparable id;
+ private final Map<Comparable<?>, Preference> data;
// Use an array for maximum performance
private Preference[] values;
- public GenericUser(K id, List<Preference> preferences) {
+ public GenericUser(Comparable<?> id, List<Preference> preferences) {
if (id == null) {
throw new IllegalArgumentException("id is null");
}
@@ -49,7 +48,7 @@
data = Collections.emptyMap();
values = NO_PREFS;
} else {
- data = new FastMap<Object, Preference>();
+ data = new FastMap<Comparable<?>, Preference>();
int size = preferences.size();
values = new Preference[size];
for (int i = 0; i < size; i++) {
@@ -59,25 +58,24 @@
if (preference instanceof SettableUserPreference) {
((SettableUserPreference) preference).setUser(this);
}
- data.put(preference.getItem().getID(), preference);
+ data.put(preference.getItemID(), preference);
}
Arrays.sort(values, ByItemPreferenceComparator.getInstance());
}
}
@Override
- public K getID() {
+ public Comparable<?> getID() {
return id;
}
@Override
- public Preference getPreferenceFor(Object itemID) {
+ public Preference getPreferenceFor(Comparable<?> itemID) {
return data.get(itemID);
}
@Override
- public void setPreference(Item item, double value) {
- Object itemID = item.getID();
+ public void setPreference(Comparable<?> itemID, double value) {
Preference oldPref = data.get(itemID);
int numValues = values.length;
if (oldPref == null) {
@@ -85,7 +83,7 @@
// TODO I am concerned we don't have a good theory about where the factory method
// belongs for Preference objects in the scheme of things. Should probably live in DataModel.
// For now we are hard-coding GenericPreference which is usually fine but not really right.
- Preference preference = new GenericPreference(this, item, value);
+ Preference preference = new GenericPreference(this, itemID, value);
Preference[] newValues = new Preference[numValues + 1];
System.arraycopy(values, 0, newValues, 1, numValues);
newValues[0] = preference;
@@ -99,12 +97,12 @@
}
@Override
- public void removePreference(Object itemID) {
+ public void removePreference(Comparable<?> itemID) {
int numValues = values.length;
Preference[] newValues = new Preference[numValues - 1];
for (int i = 0, j = 0; i < numValues; i++, j++) {
Preference value = values[i];
- if (value.getItem().getID().equals(itemID)) {
+ if (value.getItemID().equals(itemID)) {
i++; // skip
} else {
newValues[j] = value;
@@ -142,7 +140,7 @@
@Override
@SuppressWarnings("unchecked")
public int compareTo(User o) {
- return id.compareTo((K) o.getID());
+ return id.compareTo(o.getID());
}
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModel.java Fri Jul 24 14:32:05 2009
@@ -25,11 +25,9 @@
import org.apache.mahout.cf.taste.impl.model.BooleanPrefUser;
import org.apache.mahout.cf.taste.impl.model.BooleanPreference;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
import org.apache.mahout.cf.taste.impl.model.GenericUser;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
import org.slf4j.Logger;
@@ -74,8 +72,8 @@
* that, a JDBC-backed {@link DataModel} and a database are more appropriate.</p>
*
* <p>It is possible and likely useful to subclass this class and customize its behavior to accommodate
- * application-specific needs and input formats. See {@link #processLine(String, Map, Map)}, {@link #buildItem(String)},
- * {@link #buildUser(String, List)} and {@link #buildPreference(User, Item, double)}.</p>
+ * application-specific needs and input formats. See {@link #processLine(String, Map)},
+ * {@link #buildUser(String, List)} and {@link #buildPreference(User, Comparable, double)}.</p>
*/
public class FileDataModel implements DataModel {
@@ -166,7 +164,6 @@
protected void processFile(File dataOrUpdateFile, Map<String, List<Preference>> data) {
log.info("Reading file info...");
- Map<String, Item> itemCache = new FastMap<String, Item>(1001);
AtomicInteger count = new AtomicInteger();
for (String line : new FileLineIterable(dataOrUpdateFile, false)) {
if (line.length() > 0) {
@@ -176,7 +173,7 @@
if (delimiter == UNKNOWN_DELIMITER) {
delimiter = determineDelimiter(line);
}
- processLine(line, data, itemCache);
+ processLine(line, data);
int currentCount = count.incrementAndGet();
if (currentCount % 100000 == 0) {
log.info("Processed {} lines", currentCount);
@@ -202,18 +199,16 @@
* determining which user and item the preference pertains to, the method should look to see if the data contains a
* mapping for the user ID already, and if not, add an empty {@link List} of {@link Preference}s to the data.</p>
*
- * <p>The method should use {@link #buildItem(String)} to create an {@link Item} representing the item in question if
- * needed, and use {@link #buildPreference(User, Item, double)} to build {@link Preference} objects as needed.</p>
+ * <p>The method should use {@link #buildPreference(User, Comparable, double)} to
+ * build {@link Preference} objects as needed.</p>
*
* <p>Note that if the line is empty or begins with '#' it will be ignored as a comment.</p>
*
* @param line line from input data file
* @param data all data read so far, as a mapping from user IDs to preferences
- * @param itemCache A cache of existing items
- * @see #buildPreference(User, Item, double)
- * @see #buildItem(String)
+ * @see #buildPreference(User, Comparable, double)
*/
- protected void processLine(String line, Map<String, List<Preference>> data, Map<String, Item> itemCache) {
+ protected void processLine(String line, Map<String, List<Preference>> data) {
if (line.length() == 0 || line.charAt(0) == '#') {
return;
@@ -251,23 +246,18 @@
Iterator<Preference> prefsIterator = prefs.iterator();
while (prefsIterator.hasNext()) {
Preference pref = prefsIterator.next();
- if (pref.getItem().getID().equals(itemID)) {
+ if (pref.getItemID().equals(itemID)) {
prefsIterator.remove();
break;
}
}
} else {
// add pref -- assume it does not already exist
- Item item = itemCache.get(itemID);
- if (item == null) {
- item = buildItem(itemID);
- itemCache.put(itemID, item);
- }
if (preferenceValueString == null) {
- prefs.add(new BooleanPreference(null, item));
+ prefs.add(new BooleanPreference(null, itemID));
} else {
double preferenceValue = Double.parseDouble(preferenceValueString);
- prefs.add(buildPreference(null, item, preferenceValue));
+ prefs.add(buildPreference(null, itemID, preferenceValue));
}
}
}
@@ -285,31 +275,25 @@
}
@Override
- public User getUser(Object id) throws TasteException {
+ public User getUser(Comparable<?> id) throws TasteException {
checkLoaded();
return delegate.getUser(id);
}
@Override
- public Iterable<? extends Item> getItems() throws TasteException {
- checkLoaded();
- return delegate.getItems();
- }
-
- @Override
- public Item getItem(Object id) throws TasteException {
+ public Iterable<Comparable<?>> getItemIDs() throws TasteException {
checkLoaded();
- return delegate.getItem(id);
+ return delegate.getItemIDs();
}
@Override
- public Iterable<? extends Preference> getPreferencesForItem(Object itemID) throws TasteException {
+ public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) throws TasteException {
checkLoaded();
return delegate.getPreferencesForItem(itemID);
}
@Override
- public Preference[] getPreferencesForItemAsArray(Object itemID) throws TasteException {
+ public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) throws TasteException {
checkLoaded();
return delegate.getPreferencesForItemAsArray(itemID);
}
@@ -327,7 +311,7 @@
}
@Override
- public int getNumUsersWithPreferenceFor(Object... itemIDs) throws TasteException {
+ public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException {
checkLoaded();
return delegate.getNumUsersWithPreferenceFor(itemIDs);
}
@@ -338,14 +322,14 @@
* reloaded from a file. This method should also be considered relatively slow.
*/
@Override
- public void setPreference(Object userID, Object itemID, double value) throws TasteException {
+ public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value) throws TasteException {
checkLoaded();
delegate.setPreference(userID, itemID, value);
}
- /** See the warning at {@link #setPreference(Object, Object, double)}. */
+ /** See the warning at {@link #setPreference(Comparable, Comparable, double)}. */
@Override
- public void removePreference(Object userID, Object itemID) throws TasteException {
+ public void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException {
checkLoaded();
delegate.removePreference(userID, itemID);
}
@@ -376,26 +360,14 @@
protected User buildUser(String id, List<Preference> prefs) {
if (!prefs.isEmpty() && prefs.get(0) instanceof BooleanPreference) {
// If first is a BooleanPreference, assuming all are, so, want to use BooleanPrefUser
- FastSet<Object> itemIDs = new FastSet<Object>(prefs.size());
+ FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>(prefs.size());
for (Preference pref : prefs) {
- itemIDs.add(pref.getItem().getID());
+ itemIDs.add(pref.getItemID());
}
itemIDs.rehash();
- return new BooleanPrefUser<String>(id, itemIDs);
+ return new BooleanPrefUser(id, itemIDs);
}
- return new GenericUser<String>(id, prefs);
- }
-
- /**
- * Subclasses may override to return a different {@link Item} implementation. The default implementation always builds
- * a new {@link GenericItem}; likewise it may be better here to return an existing object encapsulating the item
- * instead.
- *
- * @param id item ID
- * @return {@link GenericItem} by default
- */
- protected Item buildItem(String id) {
- return new GenericItem<String>(id);
+ return new GenericUser(id, prefs);
}
/**
@@ -403,12 +375,12 @@
* a new {@link GenericPreference}.
*
* @param user {@link User} who expresses the preference
- * @param item preferred {@link Item}
+ * @param itemID preferred item
* @param value preference value
* @return {@link GenericPreference} by default
*/
- protected Preference buildPreference(User user, Item item, double value) {
- return new GenericPreference(user, item, value);
+ protected Preference buildPreference(User user, Comparable<?> itemID, double value) {
+ return new GenericPreference(user, itemID, value);
}
@Override
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractBooleanPrefJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -25,7 +25,6 @@
import org.apache.mahout.cf.taste.impl.common.SkippingIterator;
import org.apache.mahout.cf.taste.impl.model.BooleanPrefUser;
import org.apache.mahout.cf.taste.impl.model.BooleanPreference;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
@@ -59,7 +58,6 @@
String removePreferenceSQL,
String getUsersSQL,
String getItemsSQL,
- String getItemSQL,
String getPrefsForItemSQL,
String getNumPreferenceForItemSQL,
String getNumPreferenceForItemsSQL) {
@@ -75,7 +73,6 @@
removePreferenceSQL,
getUsersSQL,
getItemsSQL,
- getItemSQL,
getPrefsForItemSQL,
getNumPreferenceForItemSQL,
getNumPreferenceForItemsSQL);
@@ -90,7 +87,7 @@
* if there is no such user
*/
@Override
- public User getUser(Object id) throws TasteException {
+ public User getUser(Comparable<?> id) throws TasteException {
log.debug("Retrieving user ID '{}'", id);
@@ -108,9 +105,9 @@
log.debug("Executing SQL query: {}", getUserSQL);
rs = stmt.executeQuery();
- FastSet<Object> itemIDs = new FastSet<Object>();
+ FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
while (rs.next()) {
- itemIDs.add(rs.getObject(1));
+ itemIDs.add((Comparable<?>) rs.getObject(1));
}
if (itemIDs.isEmpty()) {
@@ -135,7 +132,7 @@
}
@Override
- public void setPreference(Object userID, Object itemID, double value)
+ public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
throws TasteException {
if (userID == null || itemID == null) {
throw new IllegalArgumentException("userID or itemID is null");
@@ -169,9 +166,8 @@
}
@Override
- protected List<? extends Preference> doGetPreferencesForItem(Object itemID) throws TasteException {
+ protected List<? extends Preference> doGetPreferencesForItem(Comparable<?> itemID) throws TasteException {
log.debug("Retrieving preferences for item ID '{}'", itemID);
- Item item = getItem(itemID, true);
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
@@ -186,8 +182,8 @@
rs = stmt.executeQuery();
List<Preference> prefs = new ArrayList<Preference>();
while (rs.next()) {
- Object userID = rs.getObject(2);
- Preference pref = buildPreference(buildUser(userID, (FastSet<Object>) null), item);
+ Comparable<?> userID = (Comparable<?>) rs.getObject(2);
+ Preference pref = buildPreference(buildUser(userID, (FastSet<Comparable<?>>) null), itemID);
prefs.add(pref);
}
return prefs;
@@ -199,17 +195,12 @@
}
}
- protected User buildUser(Object id, FastSet<Object> itemIDs) {
- if (id instanceof Long) {
- return new BooleanPrefUser<Long>((Long) id, itemIDs);
- } else if (id instanceof Integer) {
- return new BooleanPrefUser<Integer>((Integer) id, itemIDs);
- }
- return new BooleanPrefUser<String>(id.toString(), itemIDs);
+ protected User buildUser(Comparable<?> id, FastSet<Comparable<?>> itemIDs) {
+ return new BooleanPrefUser(id, itemIDs);
}
- protected Preference buildPreference(User user, Item item) {
- return new BooleanPreference(user, item);
+ protected Preference buildPreference(User user, Comparable<?> itemID) {
+ return new BooleanPreference(user, itemID);
}
private final class ResultSetUserIterator implements SkippingIterator<User> {
@@ -262,12 +253,12 @@
throw new NoSuchElementException();
}
- Object currentUserID = null;
- FastSet<Object> itemIDs = new FastSet<Object>();
+ Comparable<?> currentUserID = null;
+ FastSet<Comparable<?>> itemIDs = new FastSet<Comparable<?>>();
try {
do {
- Object userID = resultSet.getObject(2);
+ Comparable<?> userID = (Comparable<?>) resultSet.getObject(2);
if (currentUserID == null) {
currentUserID = userID;
}
@@ -276,7 +267,7 @@
break;
}
// else add a new preference for the current user
- itemIDs.add(resultSet.getObject(1));
+ itemIDs.add((Comparable<?>) resultSet.getObject(1));
} while (resultSet.next());
} catch (SQLException sqle) {
// No good way to handle this since we can't throw an exception
@@ -308,7 +299,7 @@
int distinctUserNamesSeen = 0;
Object currentUserID = null;
do {
- Object userID = resultSet.getObject(2);
+ Comparable<?> userID = (Comparable<?>) resultSet.getObject(2);
if (!userID.equals(currentUserID)) {
distinctUserNamesSeen++;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/AbstractJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -26,11 +26,9 @@
import org.apache.mahout.cf.taste.impl.common.Retriever;
import org.apache.mahout.cf.taste.impl.common.SkippingIterator;
import org.apache.mahout.cf.taste.impl.common.jdbc.AbstractJDBCComponent;
-import org.apache.mahout.cf.taste.impl.model.GenericItem;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
import org.apache.mahout.cf.taste.impl.model.GenericUser;
import org.apache.mahout.cf.taste.model.DataModel;
-import org.apache.mahout.cf.taste.model.Item;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.User;
@@ -63,7 +61,7 @@
*
* <p>Also note: this default implementation assumes that the user and item ID keys are {@link String}s, for maximum
* flexibility. You can override this behavior by subclassing an implementation and overriding {@link
- * #buildItem(Object)} and {@link #buildUser(Object, List)}. If you don't, just make sure you use {@link String}s as IDs
+ * {@link #buildUser(Comparable, List)}. If you don't, just make sure you use {@link String}s as IDs
* throughout your code. If your IDs are really numeric, and you use, say, {@link Long} for IDs in the rest of your
* code, you will run into subtle problems because the {@link Long} values won't be equal to or compare correctly to the
* underlying {@link String} key values.</p>
@@ -89,13 +87,12 @@
private final String removePreferenceSQL;
private final String getUsersSQL;
private final String getItemsSQL;
- private final String getItemSQL;
private final String getPrefsForItemSQL;
private final String getNumPreferenceForItemSQL;
private final String getNumPreferenceForItemsSQL;
private int cachedNumUsers;
private int cachedNumItems;
- private final Cache<Object, Integer> itemPrefCounts;
+ private final Cache<Comparable<?>, Integer> itemPrefCounts;
protected AbstractJDBCDataModel(DataSource dataSource,
String getUserSQL,
@@ -105,7 +102,6 @@
String removePreferenceSQL,
String getUsersSQL,
String getItemsSQL,
- String getItemSQL,
String getPrefsForItemSQL,
String getNumPreferenceForItemSQL,
String getNumPreferenceForItemsSQL) {
@@ -121,7 +117,6 @@
removePreferenceSQL,
getUsersSQL,
getItemsSQL,
- getItemSQL,
getPrefsForItemSQL,
getNumPreferenceForItemSQL,
getNumPreferenceForItemsSQL);
@@ -139,7 +134,6 @@
String removePreferenceSQL,
String getUsersSQL,
String getItemsSQL,
- String getItemSQL,
String getPrefsForItemSQL,
String getNumPreferenceForItemSQL,
String getNumPreferenceForItemsSQL) {
@@ -159,7 +153,6 @@
checkNotNullAndLog("removePreferenceSQL", removePreferenceSQL);
checkNotNullAndLog("getUsersSQL", getUsersSQL);
checkNotNullAndLog("getItemsSQL", getItemsSQL);
- checkNotNullAndLog("getItemSQL", getItemSQL);
checkNotNullAndLog("getPrefsForItemSQL", getPrefsForItemSQL);
checkNotNullAndLog("getNumPreferenceForItemSQL", getNumPreferenceForItemSQL);
checkNotNullAndLog("getNumPreferenceForItemsSQL", getNumPreferenceForItemsSQL);
@@ -182,14 +175,13 @@
this.removePreferenceSQL = removePreferenceSQL;
this.getUsersSQL = getUsersSQL;
this.getItemsSQL = getItemsSQL;
- this.getItemSQL = getItemSQL;
this.getPrefsForItemSQL = getPrefsForItemSQL;
this.getNumPreferenceForItemSQL = getNumPreferenceForItemSQL;
this.getNumPreferenceForItemsSQL = getNumPreferenceForItemsSQL;
this.cachedNumUsers = -1;
this.cachedNumItems = -1;
- this.itemPrefCounts = new Cache<Object, Integer>(new ItemPrefCountRetriever(getNumPreferenceForItemSQL));
+ this.itemPrefCounts = new Cache<Comparable<?>, Integer>(new ItemPrefCountRetriever(getNumPreferenceForItemSQL));
}
@@ -223,7 +215,7 @@
/** @throws NoSuchUserException if there is no such user */
@Override
- public User getUser(Object id) throws TasteException {
+ public User getUser(Comparable<?> id) throws TasteException {
log.debug("Retrieving user ID '{}'", id);
@@ -264,63 +256,24 @@
}
@Override
- public Iterable<? extends Item> getItems() throws TasteException {
+ public Iterable<Comparable<?>> getItemIDs() throws TasteException {
log.debug("Retrieving all items...");
- return new IteratorIterable<Item>(new ResultSetItemIterator(dataSource, getItemsSQL));
+ return new IteratorIterable<Comparable<?>>(new ResultSetItemIterator(dataSource, getItemsSQL));
}
@Override
- public Item getItem(Object id) throws TasteException {
- return getItem(id, false);
- }
-
- @Override
- public Item getItem(Object id, boolean assumeExists) throws TasteException {
-
- if (assumeExists) {
- return buildItem((String) id);
- }
-
- log.debug("Retrieving item ID '{}'", id);
-
- Connection conn = null;
- PreparedStatement stmt = null;
- ResultSet rs = null;
-
- try {
- conn = dataSource.getConnection();
- stmt = conn.prepareStatement(getItemSQL);
- stmt.setObject(1, id);
-
- log.debug("Executing SQL query: {}", getItemSQL);
- rs = stmt.executeQuery();
- if (rs.next()) {
- return buildItem((String) id);
- } else {
- throw new NoSuchElementException();
- }
- } catch (SQLException sqle) {
- log.warn("Exception while retrieving item", sqle);
- throw new TasteException(sqle);
- } finally {
- IOUtils.quietClose(rs, stmt, conn);
- }
- }
-
- @Override
- public Iterable<? extends Preference> getPreferencesForItem(Object itemID) throws TasteException {
+ public Iterable<? extends Preference> getPreferencesForItem(Comparable<?> itemID) throws TasteException {
return doGetPreferencesForItem(itemID);
}
@Override
- public Preference[] getPreferencesForItemAsArray(Object itemID) throws TasteException {
+ public Preference[] getPreferencesForItemAsArray(Comparable<?> itemID) throws TasteException {
List<? extends Preference> list = doGetPreferencesForItem(itemID);
return list.toArray(new Preference[list.size()]);
}
- protected List<? extends Preference> doGetPreferencesForItem(Object itemID) throws TasteException {
+ protected List<? extends Preference> doGetPreferencesForItem(Comparable<?> itemID) throws TasteException {
log.debug("Retrieving preferences for item ID '{}'", itemID);
- Item item = getItem(itemID, true);
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
@@ -336,8 +289,8 @@
List<Preference> prefs = new ArrayList<Preference>();
while (rs.next()) {
double preference = rs.getDouble(1);
- Object userID = rs.getObject(2);
- Preference pref = buildPreference(buildUser(userID, null), item, preference);
+ Comparable<?> userID = (Comparable<?>) rs.getObject(2);
+ Preference pref = buildPreference(buildUser(userID, null), itemID, preference);
prefs.add(pref);
}
return prefs;
@@ -366,7 +319,7 @@
}
@Override
- public int getNumUsersWithPreferenceFor(Object... itemIDs) throws TasteException {
+ public int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException {
if (itemIDs == null) {
throw new IllegalArgumentException("itemIDs is null");
}
@@ -408,7 +361,7 @@
}
@Override
- public void setPreference(Object userID, Object itemID, double value)
+ public void setPreference(Comparable<?> userID, Comparable<?> itemID, double value)
throws TasteException {
if (userID == null || itemID == null) {
throw new IllegalArgumentException("userID or itemID is null");
@@ -444,7 +397,7 @@
}
@Override
- public void removePreference(Object userID, Object itemID)
+ public void removePreference(Comparable<?> userID, Comparable<?> itemID)
throws TasteException {
if (userID == null || itemID == null) {
throw new IllegalArgumentException("userID or itemID is null");
@@ -482,9 +435,9 @@
private void addPreference(ResultSet rs, Collection<Preference> prefs)
throws SQLException {
- Item item = buildItem(rs.getObject(1));
+ Comparable<?> itemID = (Comparable<?>) rs.getObject(1);
double preferenceValue = rs.getDouble(2);
- prefs.add(buildPreference(null, item, preferenceValue));
+ prefs.add(buildPreference(null, itemID, preferenceValue));
}
/**
@@ -495,41 +448,19 @@
* @param prefs user preferences
* @return {@link GenericUser} by default
*/
- protected User buildUser(Object id, List<Preference> prefs) {
- // ugly
- if (id instanceof Long) {
- return new GenericUser<Long>((Long) id, prefs);
- } else if (id instanceof Integer) {
- return new GenericUser<Integer>((Integer) id, prefs);
- }
- return new GenericUser<String>(id.toString(), prefs);
- }
-
- /**
- * <p>Default implementation which returns a new {@link GenericItem} with {@link String} IDs. Subclasses may override
- * to return a different {@link Item} implementation.</p>
- *
- * @param id item ID
- * @return {@link GenericItem} by default
- */
- protected Item buildItem(Object id) {
- if (id instanceof Long) {
- return new GenericItem<Long>((Long) id);
- } else if (id instanceof Integer) {
- return new GenericItem<Integer>((Integer) id);
- }
- return new GenericItem<String>(id.toString());
+ protected User buildUser(Comparable<?> id, List<Preference> prefs) {
+ return new GenericUser(id, prefs);
}
/**
* Subclasses may override to return a different {@link Preference} implementation.
*
* @param user {@link User}
- * @param item {@link Item}
+ * @param itemID item ID
* @return {@link GenericPreference} by default
*/
- protected Preference buildPreference(User user, Item item, double value) {
- return new GenericPreference(user, item, value);
+ protected Preference buildPreference(User user, Comparable<?> itemID, double value) {
+ return new GenericPreference(user, itemID, value);
}
/**
@@ -589,12 +520,12 @@
throw new NoSuchElementException();
}
- Object currentUserID = null;
+ Comparable<?> currentUserID = null;
List<Preference> prefs = new ArrayList<Preference>();
try {
do {
- Object userID = resultSet.getObject(3);
+ Comparable<?> userID = (Comparable<?>) resultSet.getObject(3);
if (currentUserID == null) {
currentUserID = userID;
}
@@ -635,7 +566,7 @@
int distinctUserNamesSeen = 0;
Object currentUserID = null;
do {
- Object userID = resultSet.getObject(3);
+ Comparable<?> userID = (Comparable<?>) resultSet.getObject(3);
if (!userID.equals(currentUserID)) {
distinctUserNamesSeen++;
}
@@ -651,13 +582,13 @@
}
/**
- * <p>An {@link java.util.Iterator} which returns {@link org.apache.mahout.cf.taste.model.Item}s from a {@link
+ * <p>An {@link java.util.Iterator} which returns items from a {@link
* java.sql.ResultSet}. This is a useful way to iterate over all user data since it does not require all data to be
* read into memory at once. It does however require that the DB connection be held open. Note that this class will
* only release database resources after {@link #hasNext()} has been called and has returned <code>false</code>;
* callers should make sure to "drain" the entire set of data to avoid tying up database resources.</p>
*/
- private final class ResultSetItemIterator implements SkippingIterator<Item> {
+ private final class ResultSetItemIterator implements SkippingIterator<Comparable<?>> {
private final Connection connection;
private final Statement statement;
@@ -701,16 +632,16 @@
}
@Override
- public Item next() {
+ public Comparable<?> next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
try {
- Item item = buildItem(resultSet.getObject(1));
+ Comparable<?> itemID = (Comparable<?>) resultSet.getObject(1);
resultSet.next();
- return item;
+ return itemID;
} catch (SQLException sqle) {
// No good way to handle this since we can't throw an exception
log.warn("Exception while iterating over items", sqle);
@@ -747,7 +678,7 @@
}
- private class ItemPrefCountRetriever implements Retriever<Object, Integer> {
+ private class ItemPrefCountRetriever implements Retriever<Comparable<?>, Integer> {
private final String getNumPreferenceForItemSQL;
private ItemPrefCountRetriever(String getNumPreferenceForItemSQL) {
@@ -755,7 +686,7 @@
}
@Override
- public Integer get(Object key) throws TasteException {
+ public Integer get(Comparable<?> key) throws TasteException {
return getNumThings("user preferring item", getNumPreferenceForItemSQL, key);
}
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/GenericJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -45,7 +45,6 @@
public static final String REMOVE_PREFERENCE_SQL_KEY = "removePreferenceSQL";
public static final String GET_USERS_SQL_KEY = "getUsersSQL";
public static final String GET_ITEMS_SQL_KEY = "getItemsSQL";
- public static final String GET_ITEM_SQL_KEY = "getItemSQL";
public static final String GET_PREFS_FOR_ITEM_SQL_KEY = "getPrefsForItemSQL";
public static final String GET_NUM_PREFERENCE_FOR_ITEM_KEY = "getNumPreferenceForItemSQL";
public static final String GET_NUM_PREFERENCE_FOR_ITEMS_KEY = "getNumPreferenceForItemsSQL";
@@ -66,7 +65,6 @@
props.getProperty(REMOVE_PREFERENCE_SQL_KEY),
props.getProperty(GET_USERS_SQL_KEY),
props.getProperty(GET_ITEMS_SQL_KEY),
- props.getProperty(GET_ITEM_SQL_KEY),
props.getProperty(GET_PREFS_FOR_ITEM_SQL_KEY),
props.getProperty(GET_NUM_PREFERENCE_FOR_ITEM_KEY),
props.getProperty(GET_NUM_PREFERENCE_FOR_ITEMS_KEY));
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLBooleanPrefJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -111,8 +111,6 @@
"SELECT " + itemIDColumn + ", " + userIDColumn + " FROM " + preferenceTable + " ORDER BY " + userIDColumn,
// getItemsSQL
"SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn,
- // getItemSQL
- "SELECT 1 FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
// getPrefsForItemSQL
"SELECT " + userIDColumn + " FROM " +
preferenceTable + " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java?rev=797487&r1=797486&r2=797487&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/jdbc/MySQLJDBCDataModel.java Fri Jul 24 14:32:05 2009
@@ -162,8 +162,6 @@
preferenceTable + " ORDER BY " + userIDColumn + ", " + itemIDColumn,
// getItemsSQL
"SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn,
- // getItemSQL
- "SELECT 1 FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
// getPrefsForItemSQL
"SELECT " + preferenceColumn + ", " + userIDColumn + " FROM " +
preferenceTable + " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,