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/08/11 14:04:38 UTC
svn commit: r803081 [5/7] - 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/common/
core/src/main/java/org/apache/maho...
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.common.IteratorIterable;
import org.apache.mahout.cf.taste.impl.common.IteratorUtils;
import org.apache.mahout.cf.taste.impl.common.RandomUtils;
@@ -31,13 +31,11 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.NoSuchElementException;
public final class GenericUserSimilarity implements UserSimilarity {
- private final Map<Comparable<?>, Map<Comparable<?>, Double>> similarityMaps =
- new FastMap<Comparable<?>, Map<Comparable<?>, Double>>();
+ private final FastByIDMap<FastByIDMap<Double>> similarityMaps = new FastByIDMap<FastByIDMap<Double>>();
public GenericUserSimilarity(Iterable<UserUserSimilarity> similarities) {
initSimilarityMaps(similarities);
@@ -49,14 +47,14 @@
}
public GenericUserSimilarity(UserSimilarity otherSimilarity, DataModel dataModel) throws TasteException {
- List<? extends Comparable<?>> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
+ List<Long> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
Iterator<UserUserSimilarity> it = new DataModelSimilaritiesIterator(otherSimilarity, userIDs);
initSimilarityMaps(new IteratorIterable<UserUserSimilarity>(it));
}
public GenericUserSimilarity(UserSimilarity otherSimilarity, DataModel dataModel, int maxToKeep)
throws TasteException {
- List<? extends Comparable<?>> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
+ List<Long> userIDs = IteratorUtils.iterableToList(dataModel.getUserIDs());
Iterator<UserUserSimilarity> it = new DataModelSimilaritiesIterator(otherSimilarity, userIDs);
Iterable<UserUserSimilarity> keptSimilarities =
TopItems.getTopUserUserSimilarities(maxToKeep, new IteratorIterable<UserUserSimilarity>(it));
@@ -65,23 +63,22 @@
private void initSimilarityMaps(Iterable<UserUserSimilarity> similarities) {
for (UserUserSimilarity uuc : similarities) {
- Comparable<?> similarityUser1 = uuc.getUserID1();
- Comparable<?> similarityUser2 = uuc.getUserID2();
- int compare = ((Comparable<Object>) similarityUser1).compareTo(similarityUser2);
- if (compare != 0) {
+ long similarityUser1 = uuc.getUserID1();
+ long similarityUser2 = uuc.getUserID2();
+ if (similarityUser1 != similarityUser2) {
// Order them -- first key should be the "smaller" one
- Comparable<?> user1;
- Comparable<?> user2;
- if (compare < 0) {
+ long user1;
+ long user2;
+ if (similarityUser1 < similarityUser2) {
user1 = similarityUser1;
user2 = similarityUser2;
} else {
user1 = similarityUser2;
user2 = similarityUser1;
}
- Map<Comparable<?>, Double> map = similarityMaps.get(user1);
+ FastByIDMap<Double> map = similarityMaps.get(user1);
if (map == null) {
- map = new FastMap<Comparable<?>, Double>();
+ map = new FastByIDMap<Double>();
similarityMaps.put(user1, map);
}
map.put(user2, uuc.getValue());
@@ -91,21 +88,20 @@
}
@Override
- public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) {
- int compare = ((Comparable<Object>) userID1).compareTo(userID2);
- if (compare == 0) {
+ public double userSimilarity(long userID1, long userID2) {
+ if (userID1 == userID2) {
return 1.0;
}
- Comparable<?> first;
- Comparable<?> second;
- if (compare < 0) {
+ long first;
+ long second;
+ if (userID1 < userID2) {
first = userID1;
second = userID2;
} else {
first = userID2;
second = userID1;
}
- Map<Comparable<?>, Double> nextMap = similarityMaps.get(first);
+ FastByIDMap<Double> nextMap = similarityMaps.get(first);
if (nextMap == null) {
return Double.NaN;
}
@@ -125,14 +121,11 @@
public static final class UserUserSimilarity implements Comparable<UserUserSimilarity> {
- private final Comparable<?> userID1;
- private final Comparable<?> userID2;
+ private final long userID1;
+ private final long userID2;
private final double value;
- public UserUserSimilarity(Comparable<?> userID1, Comparable<?> userID2, double value) {
- if (userID1 == null || userID2 == null) {
- throw new IllegalArgumentException("A user is null");
- }
+ public UserUserSimilarity(long userID1, long userID2, double value) {
if (Double.isNaN(value) || value < -1.0 || value > 1.0) {
throw new IllegalArgumentException("Illegal value: " + value);
}
@@ -141,11 +134,11 @@
this.value = value;
}
- public Comparable<?> getUserID1() {
+ public long getUserID1() {
return userID1;
}
- public Comparable<?> getUserID2() {
+ public long getUserID2() {
return userID2;
}
@@ -171,12 +164,12 @@
return false;
}
UserUserSimilarity otherSimilarity = (UserUserSimilarity) other;
- return otherSimilarity.userID1.equals(userID1) && otherSimilarity.userID2.equals(userID2) && otherSimilarity.value == value;
+ return otherSimilarity.userID1 == userID1 && otherSimilarity.userID2 == userID2 && otherSimilarity.value == value;
}
@Override
public int hashCode() {
- return userID1.hashCode() ^ userID2.hashCode() ^ RandomUtils.hashDouble(value);
+ return (int) userID1 ^ (int) userID2 ^ RandomUtils.hashDouble(value);
}
}
@@ -184,13 +177,13 @@
private static final class DataModelSimilaritiesIterator implements Iterator<UserUserSimilarity> {
private final UserSimilarity otherSimilarity;
- private final List<? extends Comparable<?>> userIDs;
+ private final List<Long> userIDs;
private final int size;
private int i;
- private Comparable<?> userID1;
+ private long userID1;
private int j;
- private DataModelSimilaritiesIterator(UserSimilarity otherSimilarity, List<? extends Comparable<?>> userIDs) {
+ private DataModelSimilaritiesIterator(UserSimilarity otherSimilarity, List<Long> userIDs) {
this.otherSimilarity = otherSimilarity;
this.userIDs = userIDs;
this.size = userIDs.size();
@@ -209,7 +202,7 @@
if (!hasNext()) {
throw new NoSuchElementException();
}
- Comparable<?> userID2 = userIDs.get(j);
+ long userID2 = userIDs.get(j);
double similarity;
try {
similarity = otherSimilarity.userSimilarity(userID1, userID2);
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/LogLikelihoodSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
@@ -46,16 +46,19 @@
}
@Override
- public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
+ public double userSimilarity(long userID1, long userID2) throws TasteException {
- FastSet<Comparable<?>> prefs1 = dataModel.getItemIDsFromUser(userID1);
- FastSet<Comparable<?>> prefs2 = dataModel.getItemIDsFromUser(userID2);
+ FastIDSet prefs1 = dataModel.getItemIDsFromUser(userID1);
+ FastIDSet prefs2 = dataModel.getItemIDsFromUser(userID2);
int prefs1Size = prefs1.size();
int prefs2Size = prefs2.size();
int intersectionSize = prefs1Size < prefs2Size ?
prefs2.intersectionSize(prefs1) :
prefs1.intersectionSize(prefs2);
+ if (intersectionSize == 0) {
+ return Double.NaN;
+ }
int numItems = dataModel.getNumItems();
double logLikelihood = LogLikelihoodSimilarity.twoLogLambda(intersectionSize,
prefs1Size - intersectionSize,
@@ -65,11 +68,11 @@
}
@Override
- public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
- if (itemID1 == null || itemID2 == null) {
- throw new IllegalArgumentException("item1 or item2 is null");
- }
+ public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, itemID2);
+ if (preferring1and2 == 0) {
+ return Double.NaN;
+ }
int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
int numUsers = dataModel.getNumUsers();
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/SpearmanCorrelationSimilarity.java Tue Aug 11 12:04:35 2009
@@ -44,12 +44,7 @@
}
@Override
- public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
-
- if (userID1 == null || userID2 == null) {
- throw new IllegalArgumentException("userID1 or userID2 is null");
- }
-
+ public double userSimilarity(long userID1, long userID2) throws TasteException {
PreferenceArray xPrefs = dataModel.getPreferencesFromUser(userID1);
PreferenceArray yPrefs = dataModel.getPreferencesFromUser(userID2);
int xLength = xPrefs.length();
@@ -75,8 +70,8 @@
xPrefs.sortByItem();
yPrefs.sortByItem();
- Comparable<?> xIndex = xPrefs.getItemID(0);
- Comparable<?> yIndex = yPrefs.getItemID(0);
+ long xIndex = xPrefs.getItemID(0);
+ long yIndex = yPrefs.getItemID(0);
int xPrefIndex = 0;
int yPrefIndex = 0;
@@ -84,7 +79,7 @@
int count = 0;
while (true) {
- int compare = ((Comparable<Object>) xIndex).compareTo(yIndex);
+ int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0;
if (compare == 0) {
double diff = xPrefs.getValue(xPrefIndex) - yPrefs.getValue(yPrefIndex);
sumXYRankDiff2 += diff * diff;
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/TanimotoCoefficientSimilarity.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
@@ -56,14 +56,10 @@
}
@Override
- public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
+ public double userSimilarity(long userID1, long userID2) throws TasteException {
- if (userID1 == null || userID2 == null) {
- throw new IllegalArgumentException("userID1 or userID2 is null");
- }
-
- FastSet<Comparable<?>> xPrefs = dataModel.getItemIDsFromUser(userID1);
- FastSet<Comparable<?>> yPrefs = dataModel.getItemIDsFromUser(userID2);
+ FastIDSet xPrefs = dataModel.getItemIDsFromUser(userID1);
+ FastIDSet yPrefs = dataModel.getItemIDsFromUser(userID2);
if (xPrefs.isEmpty() && yPrefs.isEmpty()) {
return Double.NaN;
@@ -73,6 +69,9 @@
}
int intersectionSize = xPrefs.intersectionSize(yPrefs);
+ if (intersectionSize == 0) {
+ return Double.NaN;
+ }
int unionSize = xPrefs.size() + yPrefs.size() - intersectionSize;
@@ -80,10 +79,7 @@
}
@Override
- public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
- if (itemID1 == null || itemID2 == null) {
- throw new IllegalArgumentException("itemID1 or itemID2 is null");
- }
+ public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
int preferring1and2 = dataModel.getNumUsersWithPreferenceFor(itemID1, itemID2);
int preferring1 = dataModel.getNumUsersWithPreferenceFor(itemID1);
int preferring2 = dataModel.getNumUsersWithPreferenceFor(itemID2);
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/AbstractJDBCItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -70,9 +70,6 @@
String itemBIDColumn,
String similarityColumn,
String getItemItemSimilaritySQL) {
-
- log.debug("Creating AbstractJDBCItemSimilarity...");
-
checkNotNullAndLog("similarityTable", similarityTable);
checkNotNullAndLog("itemAIDColumn", itemAIDColumn);
checkNotNullAndLog("itemBIDColumn", itemBIDColumn);
@@ -110,15 +107,14 @@
}
@Override
- public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException {
+ public double itemSimilarity(long itemID1, long itemID2) throws TasteException {
- int compare = ((Comparable<Object>) itemID1).compareTo(itemID2);
- if (compare == 0) {
+ if (itemID1 == itemID2) {
return 1.0;
}
// Order as smaller - larger
- if (compare > 0) {
- Comparable<?> temp = itemID1;
+ if (itemID1 > itemID2) {
+ long temp = itemID1;
itemID1 = itemID2;
itemID2 = temp;
}
@@ -132,8 +128,8 @@
stmt = conn.prepareStatement(getItemItemSimilaritySQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
stmt.setFetchSize(getFetchSize());
- stmt.setObject(1, itemID1);
- stmt.setObject(2, itemID2);
+ stmt.setLong(1, itemID1);
+ stmt.setLong(2, itemID2);
log.debug("Executing SQL query: {}", getItemItemSimilaritySQL);
rs = stmt.executeQuery();
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/jdbc/MySQLJDBCItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -39,8 +39,8 @@
*
* <pre>
* CREATE TABLE taste_item_similarity (
- * item_id_a INT NOT NULL,
- * item_id_b INT NOT NULL,
+ * item_id_a BIGINT NOT NULL,
+ * item_id_b BIGINT NOT NULL,
* similarity FLOAT NOT NULL,
* PRIMARY KEY (item_id_a, item_id_b),
* )
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/CaseAmplification.java Tue Aug 11 12:04:35 2009
@@ -26,7 +26,7 @@
* <p>Applies "case amplification" to similarities. This essentially makes big values bigger and small values smaller by
* raising each score to a power. It could however be used to achieve the opposite effect.</p>
*/
-public final class CaseAmplification implements SimilarityTransform<Object> {
+public final class CaseAmplification implements SimilarityTransform {
private final double factor;
@@ -47,14 +47,14 @@
* <p>Transforms one similarity value. This implementation is such that it's possible to define this transformation on
* one value in isolation. The "thing" parameters are therefore unused.</p>
*
- * @param thing1 unused
- * @param thing2 unused
+ * @param id1 unused
+ * @param id2 unused
* @param value similarity to transform
* @return <code>value<sup>factor</sup></code> if value is nonnegative; <code>-value<sup>-factor</sup></code>
* otherwise
*/
@Override
- public double transformSimilarity(Object thing1, Object thing2, double value) {
+ public double transformSimilarity(long id1, long id2, double value) {
return value < 0.0 ? -Math.pow(-value, factor) : Math.pow(value, factor);
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/Counters.java Tue Aug 11 12:04:35 2009
@@ -17,16 +17,16 @@
package org.apache.mahout.cf.taste.impl.transforms;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import java.util.Map;
/** <p>A simple, fast utility class that maps keys to counts.</p> */
-final class Counters<T> {
+final class Counters {
- private final Map<T, int[]> counts = new FastMap<T, int[]>();
+ private final FastByIDMap<int[]> counts = new FastByIDMap<int[]>();
- void increment(T key) {
+ void increment(long key) {
int[] count = counts.get(key);
if (count == null) {
int[] newCount = new int[1];
@@ -37,7 +37,7 @@
}
}
- int getCount(T key) {
+ int getCount(long key) {
int[] count = counts.get(key);
return count == null ? 0 : count[0];
}
@@ -46,7 +46,7 @@
return counts.size();
}
- Iterable<Map.Entry<T, int[]>> getEntrySet() {
+ Iterable<Map.Entry<Long, int[]>> getEntrySet() {
return counts.entrySet();
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/InverseUserFrequency.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,8 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.common.RefreshHelper;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.Preference;
@@ -27,7 +28,6 @@
import org.apache.mahout.cf.taste.transforms.PreferenceTransform;
import java.util.Collection;
-import java.util.Collections;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicReference;
@@ -51,7 +51,7 @@
private final DataModel dataModel;
private final RefreshHelper refreshHelper;
private final double logBase;
- private final AtomicReference<Map<Comparable<?>, Double>> iufFactors;
+ private final AtomicReference<FastByIDMap<Double>> iufFactors;
/**
* <p>Creates a {@link InverseUserFrequency} transformation. Computations use the given log base.</p>
@@ -69,7 +69,7 @@
}
this.dataModel = dataModel;
this.logBase = logBase;
- this.iufFactors = new AtomicReference<Map<Comparable<?>, Double>>(new FastMap<Comparable<?>, Double>());
+ this.iufFactors = new AtomicReference<FastByIDMap<Double>>(new FastByIDMap<Double>());
this.refreshHelper = new RefreshHelper(new Callable<Object>() {
@Override
public Object call() throws TasteException {
@@ -101,23 +101,24 @@
}
private synchronized void recompute() throws TasteException {
- Counters<Comparable<?>> itemPreferenceCounts = new Counters<Comparable<?>>();
+ Counters itemPreferenceCounts = new Counters();
int numUsers = 0;
- for (Comparable<?> userID : dataModel.getUserIDs()) {
- PreferenceArray prefs = dataModel.getPreferencesFromUser(userID);
+ LongPrimitiveIterator it = dataModel.getUserIDs();
+ while (it.hasNext()) {
+ PreferenceArray prefs = dataModel.getPreferencesFromUser(it.nextLong());
int size = prefs.length();
for (int i = 0; i < size; i++) {
itemPreferenceCounts.increment(prefs.getItemID(i));
}
numUsers++;
}
- Map<Comparable<?>, Double> newIufFactors = new FastMap<Comparable<?>, Double>(itemPreferenceCounts.size());
+ FastByIDMap<Double> newIufFactors = new FastByIDMap<Double>(itemPreferenceCounts.size());
double logFactor = Math.log(logBase);
- for (Map.Entry<Comparable<?>, int[]> entry : itemPreferenceCounts.getEntrySet()) {
+ for (Map.Entry<Long, int[]> entry : itemPreferenceCounts.getEntrySet()) {
newIufFactors.put(entry.getKey(),
Math.log((double) numUsers / (double) entry.getValue()[0]) / logFactor);
}
- iufFactors.set(Collections.unmodifiableMap(newIufFactors));
+ iufFactors.set(newIufFactors);
}
@Override
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/transforms/ZScore.java Tue Aug 11 12:04:35 2009
@@ -32,7 +32,8 @@
import java.util.Collection;
/**
- * <p>Normalizes preference values for a user by converting them to <a href="http://mathworld.wolfram.com/z-Score.html">"z-scores"</a>.
+ * <p>Normalizes preference values for a user by converting them to
+ * <a href="http://mathworld.wolfram.com/z-Score.html">"z-scores"</a>.
* This process normalizes preference values to adjust for variation in mean and variance of a user's preferences.</p>
*
* <p>Imagine two users, one who tends to rate every movie he/she sees four or five stars, and another who uses the full
@@ -42,11 +43,11 @@
public final class ZScore implements PreferenceTransform {
private final DataModel dataModel;
- private final Cache<Comparable<?>, RunningAverageAndStdDev> meanAndStdevs;
+ private final Cache<Long, RunningAverageAndStdDev> meanAndStdevs;
public ZScore(DataModel dataModel) {
this.dataModel = dataModel;
- this.meanAndStdevs = new Cache<Comparable<?>, RunningAverageAndStdDev>(new MeanStdevRetriever());
+ this.meanAndStdevs = new Cache<Long, RunningAverageAndStdDev>(new MeanStdevRetriever());
refresh(null);
}
@@ -74,10 +75,10 @@
return "ZScore";
}
- private class MeanStdevRetriever implements Retriever<Comparable<?>, RunningAverageAndStdDev> {
+ private class MeanStdevRetriever implements Retriever<Long, RunningAverageAndStdDev> {
@Override
- public RunningAverageAndStdDev get(Comparable<?> userID) throws TasteException {
+ public RunningAverageAndStdDev get(Long userID) throws TasteException {
RunningAverageAndStdDev running = new FullRunningAverageAndStdDev();
PreferenceArray prefs = dataModel.getPreferencesFromUser(userID);
int size = prefs.length();
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/DataModel.java Tue Aug 11 12:04:35 2009
@@ -21,7 +21,8 @@
import org.apache.mahout.cf.taste.common.NoSuchUserException;
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import java.util.List;
@@ -32,10 +33,10 @@
public interface DataModel extends Refreshable {
/**
- * @return a {@link List} of all user IDs in the model, in order
+ * @return all user IDs in the model, in order
* @throws TasteException if an error occurs while accessing the data
*/
- Iterable<Comparable<?>> getUserIDs() throws TasteException;
+ LongPrimitiveIterator getUserIDs() throws TasteException;
/**
* @param userID ID of user to get prefs for
@@ -43,7 +44,7 @@
* @throws NoSuchUserException if the user does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- PreferenceArray getPreferencesFromUser(Comparable<?> userID) throws TasteException;
+ PreferenceArray getPreferencesFromUser(long userID) throws TasteException;
/**
* @param userID ID of user to get prefs for
@@ -51,13 +52,13 @@
* @throws NoSuchUserException if the user does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- FastSet<Comparable<?>> getItemIDsFromUser(Comparable<?> userID) throws TasteException;
+ FastIDSet getItemIDsFromUser(long userID) throws TasteException;
/**
* @return a {@link List} of all item IDs in the model, in order
* @throws TasteException if an error occurs while accessing the data
*/
- Iterable<Comparable<?>> getItemIDs() throws TasteException;
+ LongPrimitiveIterator getItemIDs() throws TasteException;
/**
* @param itemID item ID
@@ -65,7 +66,7 @@
* @throws NoSuchItemException if the item does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- PreferenceArray getPreferencesForItem(Comparable<?> itemID) throws TasteException;
+ PreferenceArray getPreferencesForItem(long itemID) throws TasteException;
/**
* Retrieves the preference value for a single user and item.
@@ -76,7 +77,7 @@
* @throws NoSuchUserException if the user does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- Float getPreferenceValue(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+ Float getPreferenceValue(long userID, long itemID) throws TasteException;
/**
* @return total number of items known to the model. This is generally the union of all items
@@ -99,7 +100,7 @@
* of up to 2 items are needed and supported
* @throws NoSuchItemException if an item does not exist
*/
- int getNumUsersWithPreferenceFor(Comparable<?>... itemIDs) throws TasteException;
+ int getNumUsersWithPreferenceFor(long... itemIDs) throws TasteException;
/**
* <p>Sets a particular preference (item plus rating) for a user.</p>
@@ -111,7 +112,7 @@
* @throws NoSuchUserException if the user does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- void setPreference(Comparable<?> userID, Comparable<?> itemID, float value) throws TasteException;
+ void setPreference(long userID, long itemID, float value) throws TasteException;
/**
* <p>Removes a particular preference for a user.</p>
@@ -122,6 +123,6 @@
* @throws NoSuchUserException if the user does not exist
* @throws TasteException if an error occurs while accessing the data
*/
- void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+ void removePreference(long userID, long itemID) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/JDBCDataModel.java Tue Aug 11 12:04:35 2009
@@ -18,10 +18,10 @@
package org.apache.mahout.cf.taste.model;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastSet;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import javax.sql.DataSource;
-import java.util.Map;
public interface JDBCDataModel extends DataModel {
@@ -36,8 +36,8 @@
*
* @return all user preference data
*/
- Map<Comparable<?>, PreferenceArray> exportWithPrefs() throws TasteException;
+ FastByIDMap<PreferenceArray> exportWithPrefs() throws TasteException;
- Map<Comparable<?>, FastSet<Comparable<?>>> exportWithIDsOnly() throws TasteException;
+ FastByIDMap<FastIDSet> exportWithIDsOnly() throws TasteException;
}
\ No newline at end of file
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/Preference.java Tue Aug 11 12:04:35 2009
@@ -24,10 +24,10 @@
public interface Preference {
/** @return ID of user who prefers the item */
- Comparable<?> getUserID();
+ long getUserID();
/** @return item ID that is preferred */
- Comparable<?> getItemID();
+ long getItemID();
/**
* @return strength of the preference for that item. Zero should indicate "no preference either way"; positive values
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/model/PreferenceArray.java Tue Aug 11 12:04:35 2009
@@ -31,13 +31,13 @@
void set(int i, Preference pref);
- Comparable<?> getUserID(int i);
+ long getUserID(int i);
- void setUserID(int i, Comparable<?> userID);
+ void setUserID(int i, long userID);
- Comparable<?> getItemID(int i);
+ long getItemID(int i);
- void setItemID(int i, Comparable<?> itemID);
+ void setItemID(int i, long itemID);
float getValue(int i);
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/neighborhood/UserNeighborhood.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
-import java.util.Collection;
-
/**
* <p>Implementations of this interface compute a "neighborhood" of users like a given user. This
* neighborhood can be used to compute recommendations then.</p>
@@ -30,10 +28,9 @@
/**
* @param userID ID of user for which a neighborhood will be computed
- * @return {@link Collection} of IDs of users in the neighborhood
- * @throws org.apache.mahout.cf.taste.common.TasteException
- * if an error occurs while accessing data
+ * @return IDs of users in the neighborhood
+ * @throws TasteException if an error occurs while accessing data
*/
- Collection<Comparable<?>> getUserNeighborhood(Comparable<?> userID) throws TasteException;
+ long[] getUserNeighborhood(long userID) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ClusteringRecommender.java Tue Aug 11 12:04:35 2009
@@ -18,6 +18,7 @@
package org.apache.mahout.cf.taste.recommender;
import org.apache.mahout.cf.taste.common.TasteException;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import java.util.Collection;
@@ -31,7 +32,7 @@
* @return {@link Collection} of IDs of users in the requested user's cluster
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- Collection<Comparable<?>> getCluster(Comparable<?> userID) throws TasteException;
+ FastIDSet getCluster(long userID) throws TasteException;
/**
* <p>Returns all clusters of users.</p>
@@ -39,6 +40,6 @@
* @return {@link Collection} of {@link Collection}s of user IDs
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- Collection<Collection<Comparable<?>>> getClusters() throws TasteException;
+ FastIDSet[] getClusters() throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/ItemBasedRecommender.java Tue Aug 11 12:04:35 2009
@@ -18,7 +18,7 @@
package org.apache.mahout.cf.taste.recommender;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.Pair;
+import org.apache.mahout.cf.taste.impl.common.LongPair;
import java.util.List;
@@ -31,7 +31,7 @@
* @return items most similar to the given item, ordered from most similar to least
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<RecommendedItem> mostSimilarItems(Comparable<?> itemID, int howMany) throws TasteException;
+ List<RecommendedItem> mostSimilarItems(long itemID, int howMany) throws TasteException;
/**
* @param itemID ID of item for which to find most similar other items
@@ -41,9 +41,9 @@
* @return itemss most similar to the given item, ordered from most similar to least
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<RecommendedItem> mostSimilarItems(Comparable<?> itemID,
+ List<RecommendedItem> mostSimilarItems(long itemID,
int howMany,
- Rescorer<Pair<Comparable<?>, Comparable<?>>> rescorer) throws TasteException;
+ Rescorer<LongPair> rescorer) throws TasteException;
/**
* @param itemIDs IDs of item for which to find most similar other items
@@ -51,7 +51,7 @@
* @return items most similar to the given items, ordered from most similar to least
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<RecommendedItem> mostSimilarItems(List<Comparable<?>> itemIDs, int howMany) throws TasteException;
+ List<RecommendedItem> mostSimilarItems(long[] itemIDs, int howMany) throws TasteException;
/**
* @param itemIDs IDs of item for which to find most similar other items
@@ -61,9 +61,9 @@
* @return items most similar to the given items, ordered from most similar to least
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<RecommendedItem> mostSimilarItems(List<Comparable<?>> itemIDs,
+ List<RecommendedItem> mostSimilarItems(long[] itemIDs,
int howMany,
- Rescorer<Pair<Comparable<?>, Comparable<?>>> rescorer) throws TasteException;
+ Rescorer<LongPair> rescorer) throws TasteException;
/**
* <p>Lists the items that were most influential in recommending a given item to a given user. Exactly how
@@ -82,7 +82,6 @@
* given item to least
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<RecommendedItem> recommendedBecause(Comparable<?> userID, Comparable<?> itemID, int howMany)
- throws TasteException;
+ List<RecommendedItem> recommendedBecause(long userID, long itemID, int howMany) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/RecommendedItem.java Tue Aug 11 12:04:35 2009
@@ -24,7 +24,7 @@
public interface RecommendedItem extends Comparable<RecommendedItem> {
/** @return the recommended item ID */
- Comparable<?> getItemID();
+ long getItemID();
/**
* <p>A value expressing the strength of the preference for the recommended item. The range of the values
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/Recommender.java Tue Aug 11 12:04:35 2009
@@ -35,7 +35,7 @@
* @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to least
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
- List<RecommendedItem> recommend(Comparable<?> userID, int howMany) throws TasteException;
+ List<RecommendedItem> recommend(long userID, int howMany) throws TasteException;
/**
* @param userID user for which recommendations are to be computed
@@ -44,7 +44,7 @@
* @return {@link List} of recommended {@link RecommendedItem}s, ordered from most strongly recommend to least
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
- List<RecommendedItem> recommend(Comparable<?> userID, int howMany, Rescorer<Comparable<?>> rescorer)
+ List<RecommendedItem> recommend(long userID, int howMany, Rescorer<Long> rescorer)
throws TasteException;
/**
@@ -54,7 +54,7 @@
* preference for the item. If a preference cannot be estimated, returns {@link Double#NaN}
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
- float estimatePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+ float estimatePreference(long userID, long itemID) throws TasteException;
/**
* @param userID user to set preference for
@@ -62,14 +62,14 @@
* @param value preference value
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
- void setPreference(Comparable<?> userID, Comparable<?> itemID, float value) throws TasteException;
+ void setPreference(long userID, long itemID, float value) throws TasteException;
/**
* @param userID user from which to remove preference
* @param itemID item for which to remove preference
* @throws TasteException if an error occurs while accessing the {@link DataModel}
*/
- void removePreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+ void removePreference(long userID, long itemID) throws TasteException;
/** @return {@link DataModel} used by this {@link Recommender} */
DataModel getDataModel();
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/UserBasedRecommender.java Tue Aug 11 12:04:35 2009
@@ -17,9 +17,7 @@
package org.apache.mahout.cf.taste.recommender;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.Pair;
-
-import java.util.List;
+import org.apache.mahout.cf.taste.impl.common.LongPair;
/** <p>Interface implemented by "user-based" recommenders.</p> */
public interface UserBasedRecommender extends Recommender {
@@ -30,7 +28,7 @@
* @return users most similar to the given user
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<Comparable<?>> mostSimilarUserIDs(Comparable<?> userID, int howMany) throws TasteException;
+ long[] mostSimilarUserIDs(long userID, int howMany) throws TasteException;
/**
* @param userID ID of user for which to find most similar other users
@@ -40,9 +38,6 @@
* @return IDs of users most similar to the given user
* @throws TasteException if an error occurs while accessing the {@link org.apache.mahout.cf.taste.model.DataModel}
*/
- List<Comparable<?>> mostSimilarUserIDs(Comparable<?> userID,
- int howMany,
- Rescorer<Pair<Comparable<?>,
- Comparable<?>>> rescorer) throws TasteException;
+ long[] mostSimilarUserIDs(long userID, int howMany, Rescorer<LongPair> rescorer) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/recommender/slopeone/DiffStorage.java Tue Aug 11 12:04:35 2009
@@ -19,16 +19,16 @@
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
+import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.RunningAverage;
import org.apache.mahout.cf.taste.model.PreferenceArray;
-import java.util.List;
-import java.util.Set;
-
/**
- * <p>Implementations store item-item preference diffs for a {@link org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender}.
- * It actually does a bit more for this implementation, like listing all items that may be considered for recommedation,
- * in order to maximize what implementations can do to optimize the slope-one algorithm.</p>
+ * <p>Implementations store item-item preference diffs for a
+ * {@link org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender}.
+ * It actually does a bit more for this implementation, like listing all items that may be
+ * considered for recommendation, in order to maximize what implementations can do to optimize
+ * the slope-one algorithm.</p>
*
* @see org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender
*/
@@ -39,18 +39,18 @@
* <code>itemID1</code> and <code>itemID2</code>, in that direction; that is, it's the average of item 2's
* preferences minus item 1's preferences
*/
- RunningAverage getDiff(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException;
+ RunningAverage getDiff(long itemID1, long itemID2) throws TasteException;
/**
* @param userID user ID to get diffs for
* @param itemID itemID to assess
* @param prefs user's preferendces
- * @return {@link List} of {@link RunningAverage} for that user's item-item diffs
+ * @return {@link RunningAverage}s for that user's item-item diffs
*/
- RunningAverage[] getDiffs(Comparable<?> userID, Comparable<?> itemID, PreferenceArray prefs) throws TasteException;
+ RunningAverage[] getDiffs(long userID, long itemID, PreferenceArray prefs) throws TasteException;
/** @return {@link RunningAverage} encapsulating the average preference for the given item */
- RunningAverage getAverageItemPref(Comparable<?> itemID) throws TasteException;
+ RunningAverage getAverageItemPref(long itemID) throws TasteException;
/**
* <p>Updates internal data structures to reflect an update in a preference value for an item.</p>
@@ -59,12 +59,12 @@
* @param prefDelta amount by which preference value changed (or its old value, if being removed
* @param remove if <code>true</code>, operation reflects a removal rather than change of preference
*/
- void updateItemPref(Comparable<?> itemID, float prefDelta, boolean remove) throws TasteException;
+ void updateItemPref(long itemID, float prefDelta, boolean remove) throws TasteException;
/**
* @return item IDs that may possibly be recommended to the given user, which may not be all items since
* the item-item diff matrix may be sparse
*/
- Set<Comparable<?>> getRecommendableItemIDs(Comparable<?> userID) throws TasteException;
+ FastIDSet getRecommendableItemIDs(long userID) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/ItemSimilarity.java Tue Aug 11 12:04:35 2009
@@ -37,6 +37,6 @@
* @return similarity between the items, in [-1,1]
* @throws TasteException if an error occurs while accessing the data
*/
- double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) throws TasteException;
+ double itemSimilarity(long itemID1, long itemID2) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/PreferenceInferrer.java Tue Aug 11 12:04:35 2009
@@ -35,6 +35,6 @@
* @return inferred preference
* @throws TasteException if an error occurs while inferring
*/
- float inferPreference(Comparable<?> userID, Comparable<?> itemID) throws TasteException;
+ float inferPreference(long userID, long itemID) throws TasteException;
}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/similarity/UserSimilarity.java Tue Aug 11 12:04:35 2009
@@ -36,7 +36,7 @@
* @return similarity between the two users, in [-1,1]
* @throws TasteException if an error occurs while accessing the data
*/
- double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException;
+ double userSimilarity(long userID1, long userID2) throws TasteException;
/**
* <p>Attaches a {@link PreferenceInferrer} to the {@link UserSimilarity} implementation.</p>
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/transforms/SimilarityTransform.java Tue Aug 11 12:04:35 2009
@@ -23,12 +23,12 @@
* <p>Implementations encapsulate some transformation on similarity values between two things, where things might be
* IDs of users or items or something else.</p>
*/
-public interface SimilarityTransform<T> extends Refreshable {
+public interface SimilarityTransform extends Refreshable {
/**
* @param value original similarity between thing1 and thing2 (should be in [-1,1])
* @return transformed similarity (should be in [-1,1])
*/
- double transformSimilarity(T thing1, T thing2, double value);
+ double transformSimilarity(long id1, long id2, double value);
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/LoadTest.java Tue Aug 11 12:04:35 2009
@@ -19,7 +19,7 @@
import junit.textui.TestRunner;
import org.apache.mahout.cf.taste.common.TasteException;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.common.RandomUtils;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
@@ -41,8 +41,6 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
-import java.util.Map;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
@@ -91,20 +89,14 @@
}
private DataModel createModel() {
- List<Comparable<?>> itemIDs = new ArrayList<Comparable<?>>(NUM_ITEMS);
- for (int i = 0; i < NUM_ITEMS; i++) {
- itemIDs.add(String.valueOf(i));
- }
- Map<Comparable<?>, PreferenceArray> data = new FastMap<Comparable<?>, PreferenceArray>(NUM_USERS);
+ FastByIDMap<PreferenceArray> data = new FastByIDMap<PreferenceArray>(NUM_USERS);
for (int i = 0; i < NUM_USERS; i++) {
- String userID = String.valueOf(i);
-
int numPrefs = random.nextInt(NUM_PREFS) + 1;
PreferenceArray prefs = new GenericUserPreferenceArray(numPrefs);
for (int j = 0; j < numPrefs; j++) {
- prefs.set(j, new GenericPreference(userID, itemIDs.get(random.nextInt(NUM_ITEMS)), random.nextFloat()));
+ prefs.set(j, new GenericPreference(i, random.nextInt(NUM_ITEMS), random.nextFloat()));
}
- data.put(userID, prefs);
+ data.put(i, prefs);
}
return new GenericDataModel(data);
}
@@ -140,11 +132,11 @@
@Override
public Object call() throws TasteException {
for (int i = 0; i < NUM_USERS / 2; i++) {
- recommender.recommend(String.valueOf(random.nextInt(NUM_USERS)), 10);
+ recommender.recommend(random.nextInt(NUM_USERS), 10);
}
recommender.refresh(null);
for (int i = NUM_USERS / 2; i < NUM_USERS; i++) {
- recommender.recommend(String.valueOf(random.nextInt(NUM_USERS)), 10);
+ recommender.recommend(random.nextInt(NUM_USERS), 10);
}
return null;
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/TasteTestCase.java Tue Aug 11 12:04:35 2009
@@ -18,7 +18,7 @@
package org.apache.mahout.cf.taste.impl;
import junit.framework.TestCase;
-import org.apache.mahout.cf.taste.impl.common.FastMap;
+import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.common.RandomUtils;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.impl.model.GenericPreference;
@@ -29,7 +29,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public abstract class TasteTestCase extends TestCase {
@@ -42,13 +41,13 @@
RandomUtils.useTestSeed();
}
- public static DataModel getDataModel(Comparable<?>[] userIDs, Double[][] prefValues) {
- Map<Comparable<?>, PreferenceArray> result = new FastMap<Comparable<?>, PreferenceArray>();
+ public static DataModel getDataModel(long[] userIDs, Double[][] prefValues) {
+ FastByIDMap<PreferenceArray> result = new FastByIDMap<PreferenceArray>();
for (int i = 0; i < userIDs.length; i++) {
List<Preference> prefsList = new ArrayList<Preference>();
for (int j = 0; j < prefValues[i].length; j++) {
if (prefValues[i][j] != null) {
- prefsList.add(new GenericPreference(userIDs[i], String.valueOf(j), prefValues[i][j].floatValue()));
+ prefsList.add(new GenericPreference(userIDs[i], j, prefValues[i][j].floatValue()));
}
}
if (!prefsList.isEmpty()) {
@@ -60,7 +59,7 @@
public static DataModel getDataModel() {
return getDataModel(
- new Comparable<?>[] {"test1", "test2", "test3", "test4"},
+ new long[] {1, 2, 3, 4},
new Double[][] {
{0.1, 0.3},
{0.2, 0.3, 0.3},
@@ -69,4 +68,13 @@
});
}
+ protected static boolean arrayContains(long[] array, long value) {
+ for (long l : array) {
+ if (l == value) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
Copied: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java (from r802574, lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java)
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java?p2=lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java&p1=lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java&r1=802574&r2=803081&rev=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastSetTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java Tue Aug 11 12:04:35 2009
@@ -24,97 +24,103 @@
import java.util.Random;
import java.util.Set;
-/** <p>Tests {@link org.apache.mahout.cf.taste.impl.common.FastSet}.</p> */
-public final class FastSetTest extends TasteTestCase {
+/** <p>Tests {@link FastIDSet}.</p> */
+public final class FastIDSetTest extends TasteTestCase {
public void testContainsAndAdd() {
- FastSet<String> set = new FastSet<String>();
- assertFalse(set.contains("foo"));
- set.add("foo");
- assertTrue(set.contains("foo"));
+ FastIDSet set = new FastIDSet();
+ assertFalse(set.contains(1));
+ set.add(1);
+ assertTrue(set.contains(1));
}
-
public void testRemove() {
- FastSet<String> set = new FastSet<String>();
- set.add("foo");
- set.remove("foo");
+ FastIDSet set = new FastIDSet();
+ set.add(1);
+ set.remove(1);
assertEquals(0, set.size());
assertTrue(set.isEmpty());
- assertFalse(set.contains("foo"));
+ assertFalse(set.contains(1));
}
public void testClear() {
- FastSet<String> set = new FastSet<String>();
- set.add("foo");
+ FastIDSet set = new FastIDSet();
+ set.add(1);
set.clear();
assertEquals(0, set.size());
assertTrue(set.isEmpty());
- assertFalse(set.contains("foo"));
+ assertFalse(set.contains(1));
}
public void testSizeEmpty() {
- FastSet<String> set = new FastSet<String>();
+ FastIDSet set = new FastIDSet();
assertEquals(0, set.size());
assertTrue(set.isEmpty());
- set.add("foo");
+ set.add(1);
assertEquals(1, set.size());
assertFalse(set.isEmpty());
- set.remove("foo");
+ set.remove(1);
assertEquals(0, set.size());
assertTrue(set.isEmpty());
}
public void testContains() {
- FastSet<String> set = buildTestFastSet();
- assertTrue(set.contains("foo"));
- assertTrue(set.contains("baz"));
- assertTrue(set.contains("alpha"));
- assertFalse(set.contains("something"));
+ FastIDSet set = buildTestFastSet();
+ assertTrue(set.contains(1));
+ assertTrue(set.contains(2));
+ assertTrue(set.contains(3));
+ assertFalse(set.contains(4));
}
- public void testNull() {
- FastSet<String> set = new FastSet<String>();
+ public void testReservedValues() {
+ FastIDSet set = new FastIDSet();
try {
- set.add(null);
- fail("Should have thrown NullPointerException");
- } catch (NullPointerException npe) {
+ set.add(Long.MIN_VALUE);
+ fail("Should have thrown IllegalArgumentException");
+ } catch (IllegalArgumentException iae) {
// good
}
- assertFalse(set.contains(null));
+ assertFalse(set.contains(Long.MIN_VALUE));
+ try {
+ set.add(Long.MAX_VALUE);
+ fail("Should have thrown IllegalArgumentException");
+ } catch (IllegalArgumentException iae) {
+ // good
+ }
+ assertFalse(set.contains(Long.MAX_VALUE));
}
public void testRehash() {
- FastSet<String> set = buildTestFastSet();
- set.remove("foo");
+ FastIDSet set = buildTestFastSet();
+ set.remove(1);
set.rehash();
- assertFalse(set.contains("foo"));
+ assertFalse(set.contains(1));
}
public void testGrow() {
- FastMap<String, String> map = new FastMap<String, String>(1, FastMap.NO_MAX_SIZE);
- map.put("foo", "bar");
- map.put("baz", "bang");
- assertEquals("bar", map.get("foo"));
- assertEquals("bang", map.get("baz"));
+ FastIDSet set = new FastIDSet(1);
+ set.add(1);
+ set.add(2);
+ assertTrue(set.contains(1));
+ assertTrue(set.contains(2));
}
public void testIterator() {
- FastSet<String> set = buildTestFastSet();
- Collection<String> expected = new HashSet<String>(3);
- expected.add("foo");
- expected.add("baz");
- expected.add("alpha");
- for (String s : set) {
- expected.remove(s);
+ FastIDSet set = buildTestFastSet();
+ Collection<Long> expected = new HashSet<Long>(3);
+ expected.add(1L);
+ expected.add(2L);
+ expected.add(3L);
+ LongPrimitiveIterator it = set.iterator();
+ while (it.hasNext()) {
+ expected.remove(it.next());
}
assertTrue(expected.isEmpty());
}
-
public void testVersusHashSet() {
- Set<Integer> actual = new FastSet<Integer>(1);
+ FastIDSet actual = new FastIDSet(1);
Set<Integer> expected = new HashSet<Integer>(1000000);
Random r = RandomUtils.getRandom();
for (int i = 0; i < 1000000; i++) {
@@ -134,11 +140,11 @@
}
}
- private static FastSet<String> buildTestFastSet() {
- FastSet<String> set = new FastSet<String>();
- set.add("foo");
- set.add("baz");
- set.add("alpha");
+ private static FastIDSet buildTestFastSet() {
+ FastIDSet set = new FastIDSet();
+ set.add(1);
+ set.add(2);
+ set.add(3);
return set;
}
Propchange: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/common/FastIDSetTest.java
------------------------------------------------------------------------------
svn:mergeinfo =
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/AverageAbsoluteDifferenceRecommenderEvaluatorTest.java Tue Aug 11 12:04:35 2009
@@ -37,7 +37,7 @@
};
RecommenderEvaluator evaluator =
new AverageAbsoluteDifferenceRecommenderEvaluator();
- double eval = evaluator.evaluate(builder, model, 0.85, 1.0);
+ double eval = evaluator.evaluate(builder, null, model, 0.85, 1.0);
assertEquals(0.2234257618121795, eval, EPSILON);
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/GenericRecommenderIRStatsEvaluatorImplTest.java Tue Aug 11 12:04:35 2009
@@ -37,7 +37,7 @@
}
};
RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
- IRStatistics stats = evaluator.evaluate(builder, model, null, 1, 0.2, 1.0);
+ IRStatistics stats = evaluator.evaluate(builder, null, model, null, 1, 0.2, 1.0);
assertNotNull(stats);
assertEquals(0.75, stats.getPrecision(), EPSILON);
assertEquals(0.75, stats.getRecall(), EPSILON);
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/eval/RMSRecommenderEvaluatorTest.java Tue Aug 11 12:04:35 2009
@@ -36,7 +36,7 @@
}
};
RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();
- double eval = evaluator.evaluate(builder, model, 0.85, 1.0);
+ double eval = evaluator.evaluate(builder, null, model, 0.85, 1.0);
assertEquals(0.3004147161079469, eval, EPSILON);
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/model/file/FileDataModelTest.java Tue Aug 11 12:04:35 2009
@@ -19,6 +19,7 @@
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.TasteTestCase;
+import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
@@ -35,7 +36,6 @@
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.Charset;
-import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -43,16 +43,16 @@
public final class FileDataModelTest extends TasteTestCase {
private static final String[] DATA = {
- "A123,456,0.1",
- "A123,789,0.6",
- "A123,654,0.7",
- "B234,123,0.5",
- "B234,234,1.0",
- "C345,789,0.6",
- "C345,654,0.7",
- "C345,123,1.0",
- "C345,234,0.5",
- "D456,456,0.1"};
+ "123,456,0.1",
+ "123,789,0.6",
+ "123,654,0.7",
+ "234,123,0.5",
+ "234,234,1.0",
+ "345,789,0.6",
+ "345,654,0.7",
+ "345,123,1.0",
+ "345,234,0.5",
+ "456,456,0.1"};
private DataModel model;
private File testFile;
@@ -89,9 +89,9 @@
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, userSimilarity, model);
Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, userSimilarity);
- assertEquals(2, recommender.recommend("A123", 3).size());
- assertEquals(2, recommender.recommend("B234", 3).size());
- assertEquals(1, recommender.recommend("C345", 3).size());
+ assertEquals(2, recommender.recommend(123, 3).size());
+ assertEquals(2, recommender.recommend(234, 3).size());
+ assertEquals(1, recommender.recommend(345, 3).size());
// Make sure this doesn't throw an exception
model.refresh(null);
@@ -100,28 +100,26 @@
public void testTranspose() throws Exception {
FileDataModel tModel = new FileDataModel(testFile, true);
- PreferenceArray userPrefs = tModel.getPreferencesFromUser("456");
+ PreferenceArray userPrefs = tModel.getPreferencesFromUser(456);
assertNotNull("user prefs are null and it shouldn't be", userPrefs);
- PreferenceArray pref = tModel.getPreferencesForItem("A123");
+ PreferenceArray pref = tModel.getPreferencesForItem(123);
assertNotNull("pref is null and it shouldn't be", pref);
assertEquals("pref Size: " + pref.length() + " is not: " + 3, 3, pref.length());
}
public void testGetItems() throws Exception {
- Iterable<Comparable<?>> items = model.getItemIDs();
- assertNotNull(items);
- Iterator<Comparable<?>> it = items.iterator();
+ LongPrimitiveIterator it = model.getItemIDs();
assertNotNull(it);
assertTrue(it.hasNext());
- assertEquals("123", it.next());
+ assertEquals(123, it.nextLong());
assertTrue(it.hasNext());
- assertEquals("234", it.next());
+ assertEquals(234, it.nextLong());
assertTrue(it.hasNext());
- assertEquals("456", it.next());
+ assertEquals(456, it.nextLong());
assertTrue(it.hasNext());
- assertEquals("654", it.next());
+ assertEquals(654, it.nextLong());
assertTrue(it.hasNext());
- assertEquals("789", it.next());
+ assertEquals(789, it.nextLong());
assertFalse(it.hasNext());
try {
it.next();
@@ -132,14 +130,14 @@
}
public void testPreferencesForItem() throws Exception {
- PreferenceArray prefs = model.getPreferencesForItem("456");
+ PreferenceArray prefs = model.getPreferencesForItem(456);
assertNotNull(prefs);
Preference pref1 = prefs.get(0);
- assertEquals("A123", pref1.getUserID());
- assertEquals("456", pref1.getItemID());
+ assertEquals(123, pref1.getUserID());
+ assertEquals(456, pref1.getItemID());
Preference pref2 = prefs.get(1);
- assertEquals("D456", pref2.getUserID());
- assertEquals("456", pref2.getItemID());
+ assertEquals(456, pref2.getUserID());
+ assertEquals(456, pref2.getItemID());
assertEquals(2, prefs.length());
}
@@ -148,10 +146,10 @@
}
public void testNumUsersPreferring() throws Exception {
- assertEquals(2, model.getNumUsersWithPreferenceFor("456"));
- assertEquals(0, model.getNumUsersWithPreferenceFor("111"));
- assertEquals(0, model.getNumUsersWithPreferenceFor("111", "456"));
- assertEquals(2, model.getNumUsersWithPreferenceFor("123", "234"));
+ assertEquals(2, model.getNumUsersWithPreferenceFor(456));
+ assertEquals(0, model.getNumUsersWithPreferenceFor(111));
+ assertEquals(0, model.getNumUsersWithPreferenceFor(111, 456));
+ assertEquals(2, model.getNumUsersWithPreferenceFor(123, 234));
}
public void testRefresh() throws Exception {
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/DummySimilarity.java Tue Aug 11 12:04:35 2009
@@ -35,15 +35,15 @@
}
@Override
- public double userSimilarity(Comparable<?> userID1, Comparable<?> userID2) throws TasteException {
- return 1.0 / Math.abs(dataModel.getPreferencesFromUser(userID1).get(0).getValue() -
- dataModel.getPreferencesFromUser(userID2).get(0).getValue());
+ public double userSimilarity(long userID1, long userID2) throws TasteException {
+ return 1.0 / (1.0 + Math.abs(dataModel.getPreferencesFromUser(userID1).get(0).getValue() -
+ dataModel.getPreferencesFromUser(userID2).get(0).getValue()));
}
@Override
- public double itemSimilarity(Comparable<?> itemID1, Comparable<?> itemID2) {
+ public double itemSimilarity(long itemID1, long itemID2) {
// Make up something wacky
- return (double) (itemID1.hashCode() - itemID2.hashCode());
+ return 1.0 / (1.0 + Math.abs(itemID1 - itemID2));
}
@Override
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/NearestNNeighborhoodTest.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
import org.apache.mahout.cf.taste.impl.TasteTestCase;
import org.apache.mahout.cf.taste.model.DataModel;
-import java.util.Collection;
-
/** <p>Tests {@link NearestNUserNeighborhood}.</p> */
public final class NearestNNeighborhoodTest extends TasteTestCase {
@@ -29,27 +27,26 @@
DataModel dataModel = getDataModel();
- Collection<Comparable<?>> neighborhood =
- new NearestNUserNeighborhood(1, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+ long[] neighborhood =
+ new NearestNUserNeighborhood(1, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
assertNotNull(neighborhood);
- assertEquals(1, neighborhood.size());
- assertTrue(neighborhood.contains("test2"));
+ assertEquals(1, neighborhood.length);
+ assertTrue(arrayContains(neighborhood, 2));
- Collection<Comparable<?>> neighborhood2 =
- new NearestNUserNeighborhood(2, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test2");
+ long[] neighborhood2 =
+ new NearestNUserNeighborhood(2, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(2);
assertNotNull(neighborhood2);
- assertEquals(2, neighborhood2.size());
- assertTrue(neighborhood2.contains("test1"));
- assertTrue(neighborhood2.contains("test3"));
+ assertEquals(2, neighborhood2.length);
+ assertTrue(arrayContains(neighborhood2, 1));
+ assertTrue(arrayContains(neighborhood2, 3));
- Collection<Comparable<?>> neighborhood3 =
- new NearestNUserNeighborhood(4, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test4");
+ long[] neighborhood3 =
+ new NearestNUserNeighborhood(4, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(4);
assertNotNull(neighborhood3);
- assertEquals(3, neighborhood3.size());
- assertTrue(neighborhood3.contains("test1"));
- assertTrue(neighborhood3.contains("test2"));
- assertTrue(neighborhood3.contains("test3"));
-
+ assertEquals(3, neighborhood3.length);
+ assertTrue(arrayContains(neighborhood3, 1));
+ assertTrue(arrayContains(neighborhood3, 2));
+ assertTrue(arrayContains(neighborhood3, 3));
}
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/neighborhood/ThresholdNeighborhoodTest.java Tue Aug 11 12:04:35 2009
@@ -20,8 +20,6 @@
import org.apache.mahout.cf.taste.impl.TasteTestCase;
import org.apache.mahout.cf.taste.model.DataModel;
-import java.util.Collection;
-
/** <p>Tests {@link ThresholdUserNeighborhood}.</p> */
public final class ThresholdNeighborhoodTest extends TasteTestCase {
@@ -29,24 +27,25 @@
DataModel dataModel = getDataModel();
- Collection<Comparable<?>> neighborhood =
- new ThresholdUserNeighborhood(19.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+ long[] neighborhood =
+ new ThresholdUserNeighborhood(1.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
assertNotNull(neighborhood);
- assertTrue(neighborhood.isEmpty());
+ assertTrue(neighborhood.length == 0);
- Collection<Comparable<?>> neighborhood2 =
- new ThresholdUserNeighborhood(9.0, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test1");
+ long[] neighborhood2 =
+ new ThresholdUserNeighborhood(0.8, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(1);
assertNotNull(neighborhood2);
- assertEquals(1, neighborhood2.size());
- assertTrue(neighborhood2.contains("test2"));
+ assertEquals(1, neighborhood2.length);
+ assertTrue(arrayContains(neighborhood2, 2));
- Collection<Comparable<?>> neighborhood3 =
- new ThresholdUserNeighborhood(0.9, new DummySimilarity(dataModel), dataModel).getUserNeighborhood("test2");
+ long[] neighborhood3 =
+ new ThresholdUserNeighborhood(0.6, new DummySimilarity(dataModel), dataModel).getUserNeighborhood(2);
assertNotNull(neighborhood3);
- assertEquals(3, neighborhood3.size());
- assertTrue(neighborhood3.contains("test1"));
- assertTrue(neighborhood3.contains("test3"));
- assertTrue(neighborhood3.contains("test4"));
+ assertEquals(3, neighborhood3.length);
+ assertTrue(arrayContains(neighborhood3, 1));
+ assertTrue(arrayContains(neighborhood3, 3));
+ assertTrue(arrayContains(neighborhood3, 4));
+
}
Modified: lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java?rev=803081&r1=803080&r2=803081&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java (original)
+++ lucene/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/recommender/CachingRecommenderTest.java Tue Aug 11 12:04:35 2009
@@ -31,46 +31,46 @@
Recommender mockRecommender = new MockRecommender(recommendCount);
Recommender cachingRecommender = new CachingRecommender(mockRecommender);
- cachingRecommender.recommend("1", 1);
+ cachingRecommender.recommend(1, 1);
assertEquals(1, recommendCount.get());
- cachingRecommender.recommend("2", 1);
+ cachingRecommender.recommend(2, 1);
assertEquals(2, recommendCount.get());
- cachingRecommender.recommend("1", 1);
+ cachingRecommender.recommend(1, 1);
assertEquals(2, recommendCount.get());
- cachingRecommender.recommend("2", 1);
+ cachingRecommender.recommend(2, 1);
assertEquals(2, recommendCount.get());
cachingRecommender.refresh(null);
- cachingRecommender.recommend("1", 1);
+ cachingRecommender.recommend(1, 1);
assertEquals(3, recommendCount.get());
- cachingRecommender.recommend("2", 1);
+ cachingRecommender.recommend(2, 1);
assertEquals(4, recommendCount.get());
- cachingRecommender.recommend("3", 1);
+ cachingRecommender.recommend(3, 1);
assertEquals(5, recommendCount.get());
// Results from this recommend() method can be cached...
- Rescorer<Comparable<?>> rescorer = NullRescorer.getItemInstance();
+ Rescorer<Long> rescorer = NullRescorer.getItemInstance();
cachingRecommender.refresh(null);
- cachingRecommender.recommend("1", 1, rescorer);
+ cachingRecommender.recommend(1, 1, rescorer);
assertEquals(6, recommendCount.get());
- cachingRecommender.recommend("2", 1, rescorer);
+ cachingRecommender.recommend(2, 1, rescorer);
assertEquals(7, recommendCount.get());
- cachingRecommender.recommend("1", 1, rescorer);
+ cachingRecommender.recommend(1, 1, rescorer);
assertEquals(7, recommendCount.get());
- cachingRecommender.recommend("2", 1, rescorer);
+ cachingRecommender.recommend(2, 1, rescorer);
assertEquals(7, recommendCount.get());
// until you switch Rescorers
- cachingRecommender.recommend("1", 1, null);
+ cachingRecommender.recommend(1, 1, null);
assertEquals(8, recommendCount.get());
- cachingRecommender.recommend("2", 1, null);
+ cachingRecommender.recommend(2, 1, null);
assertEquals(9, recommendCount.get());
cachingRecommender.refresh(null);
- cachingRecommender.estimatePreference("test1", "1");
+ cachingRecommender.estimatePreference(1, 1);
assertEquals(10, recommendCount.get());
- cachingRecommender.estimatePreference("test1", "2");
+ cachingRecommender.estimatePreference(1, 2);
assertEquals(11, recommendCount.get());
- cachingRecommender.estimatePreference("test1", "2");
+ cachingRecommender.estimatePreference(1, 2);
assertEquals(11, recommendCount.get());
}