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 2010/04/07 13:56:26 UTC
svn commit: r931509 - in
/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste: hadoop/
hadoop/item/ impl/recommender/ recommender/
Author: srowen
Date: Wed Apr 7 11:56:25 2010
New Revision: 931509
URL: http://svn.apache.org/viewvc?rev=931509&view=rev
Log:
MAHOUT-358 More attempts to fix possible small problems
Added:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByValueRecommendedItemComparator.java
Modified:
lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/MapFilesMap.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/hadoop/item/RecommenderMapper.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/recommender/RecommendedItem.java
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/MapFilesMap.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/MapFilesMap.java?rev=931509&r1=931508&r2=931509&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/MapFilesMap.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/MapFilesMap.java Wed Apr 7 11:56:25 2010
@@ -74,8 +74,9 @@ public final class MapFilesMap<K extends
*/
public V get(K key, V value) throws IOException {
for (MapFile.Reader reader : readers) {
- if (reader.get(key, value) != null) {
- return value;
+ V theValue;
+ if ((theValue = (V) reader.get(key, value)) != null) {
+ return theValue;
}
}
log.debug("No value for key {}", key);
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=931509&r1=931508&r2=931509&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 Wed Apr 7 11:56:25 2010
@@ -51,6 +51,7 @@ public final class RecommendedItemsWrita
@Override
public void write(DataOutput out) throws IOException {
+ out.writeInt(recommended.size());
for (RecommendedItem item : recommended) {
out.writeLong(item.getItemID());
out.writeFloat(item.getValue());
@@ -60,20 +61,13 @@ public final class RecommendedItemsWrita
@Override
public void readFields(DataInput in) throws IOException {
- recommended = new ArrayList<RecommendedItem>();
- try {
- do {
- long itemID = in.readLong();
- float value = in.readFloat();
- if (!Float.isNaN(value)) {
- RecommendedItem recommendedItem = new GenericRecommendedItem(itemID, value);
- recommended.add(recommendedItem);
- }
- } while (true);
- } catch (EOFException eofe) {
- // continue; done
- } catch (ArrayIndexOutOfBoundsException aiooe) {
- // bizarre ByteArrayInputStream bug? sometimes throws from read(); done
+ int size = in.readInt();
+ recommended = new ArrayList<RecommendedItem>(size);
+ for (int i = 0; i < size; i++) {
+ long itemID = in.readLong();
+ float value = in.readFloat();
+ RecommendedItem recommendedItem = new GenericRecommendedItem(itemID, value);
+ recommended.add(recommendedItem);
}
}
@@ -94,9 +88,9 @@ public final class RecommendedItemsWrita
} else {
result.append(',');
}
- result.append(item.getItemID());
+ result.append(String.valueOf(item.getItemID()));
result.append(':');
- result.append(item.getValue());
+ result.append(String.valueOf(item.getValue()));
}
result.append(']');
return result.toString();
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderMapper.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderMapper.java?rev=931509&r1=931508&r2=931509&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderMapper.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderMapper.java Wed Apr 7 11:56:25 2010
@@ -42,6 +42,7 @@ import org.apache.mahout.cf.taste.hadoop
import org.apache.mahout.cf.taste.impl.common.Cache;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.Retriever;
+import org.apache.mahout.cf.taste.impl.recommender.ByValueRecommendedItemComparator;
import org.apache.mahout.cf.taste.impl.recommender.GenericRecommendedItem;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.common.FileLineIterable;
@@ -128,7 +129,7 @@ public final class RecommenderMapper ext
}
Queue<RecommendedItem> topItems = new PriorityQueue<RecommendedItem>(recommendationsPerUser + 1,
- Collections.reverseOrder());
+ Collections.reverseOrder(ByValueRecommendedItemComparator.getInstance()));
Iterator<Vector.Element> recommendationVectorIterator = recommendationVector.iterateNonZero();
LongWritable itemID = new LongWritable();
@@ -137,19 +138,23 @@ public final class RecommenderMapper ext
int index = element.index();
if (userVector.get(index) == 0.0) {
if (topItems.size() < recommendationsPerUser) {
- indexItemIDMap.get(new IntWritable(index), itemID);
- topItems.add(new GenericRecommendedItem(itemID.get(), (float) element.get()));
+ LongWritable theItemID = indexItemIDMap.get(new IntWritable(index), itemID);
+ if (theItemID != null) {
+ topItems.add(new GenericRecommendedItem(theItemID.get(), (float) element.get()));
+ } // else, huh?
} else if (element.get() > topItems.peek().getValue()) {
- indexItemIDMap.get(new IntWritable(index), itemID);
- topItems.add(new GenericRecommendedItem(itemID.get(), (float) element.get()));
- topItems.poll();
+ LongWritable theItemID = indexItemIDMap.get(new IntWritable(index), itemID);
+ if (theItemID != null) {
+ topItems.add(new GenericRecommendedItem(theItemID.get(), (float) element.get()));
+ topItems.poll();
+ } // else, huh?
}
}
}
List<RecommendedItem> recommendations = new ArrayList<RecommendedItem>(topItems.size());
recommendations.addAll(topItems);
- Collections.sort(recommendations);
+ Collections.sort(recommendations, ByValueRecommendedItemComparator.getInstance());
output.collect(userID, new RecommendedItemsWritable(recommendations));
}
@@ -162,31 +167,26 @@ public final class RecommenderMapper ext
private static class CooccurrenceCache implements Retriever<IntWritable,Vector> {
private final MapFilesMap<IntWritable,VectorWritable> map;
- private VectorWritable columnVector;
-
+
private CooccurrenceCache(MapFilesMap<IntWritable,VectorWritable> map) {
this.map = map;
- columnVector = new VectorWritable();
- columnVector.set(new RandomAccessSparseVector(Integer.MAX_VALUE, 1000));
}
@Override
public Vector get(IntWritable key) throws TasteException {
- VectorWritable writable;
+ VectorWritable columnVector = new VectorWritable();
try {
- writable = map.get(key, columnVector);
+ columnVector = map.get(key, columnVector);
} catch (IOException ioe) {
throw new TasteException(ioe);
}
- if (writable == null) {
+ if (columnVector == null) {
return null;
}
- Vector value = writable.get();
+ Vector value = columnVector.get();
if (value == null) {
throw new IllegalStateException("Vector in map file was empty?");
}
- columnVector = new VectorWritable();
- columnVector.set(new RandomAccessSparseVector(Integer.MAX_VALUE, 1000));
return value;
}
Added: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByValueRecommendedItemComparator.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByValueRecommendedItemComparator.java?rev=931509&view=auto
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByValueRecommendedItemComparator.java (added)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/ByValueRecommendedItemComparator.java Wed Apr 7 11:56:25 2010
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.mahout.cf.taste.impl.recommender;
+
+import java.util.Comparator;
+
+import org.apache.mahout.cf.taste.recommender.RecommendedItem;
+
+/**
+ * Defines a natural ordering from most-preferred item (highest value) to least-preferred.
+ */
+public final class ByValueRecommendedItemComparator implements Comparator<RecommendedItem> {
+
+ private static final Comparator<RecommendedItem> instance = new ByValueRecommendedItemComparator();
+
+ public static Comparator<RecommendedItem> getInstance() {
+ return instance;
+ }
+
+ @Override
+ public int compare(RecommendedItem o1, RecommendedItem o2) {
+ float value1 = o1.getValue();
+ float value2 = o2.getValue();
+ return value1 > value2 ? -1 : value1 < value2 ? 1 : 0;
+ }
+
+}
Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java?rev=931509&r1=931508&r2=931509&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/GenericRecommendedItem.java Wed Apr 7 11:56:25 2010
@@ -73,15 +73,4 @@ public final class GenericRecommendedIte
return (itemID == other.getItemID()) && (value == other.getValue());
}
- /**
- * Defines a natural ordering from most-preferred item (highest value) to least-preferred.
- *
- * @return 1, -1, 0 as this value is less than, greater than or equal to the other's value
- */
- @Override
- public int compareTo(RecommendedItem other) {
- float otherValue = other.getValue();
- return value > otherValue ? -1 : value < otherValue ? 1 : 0;
- }
-
}
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=931509&r1=931508&r2=931509&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 Wed Apr 7 11:56:25 2010
@@ -23,7 +23,7 @@ package org.apache.mahout.cf.taste.recom
* expressing the strength of the preference.
* </p>
*/
-public interface RecommendedItem extends Comparable<RecommendedItem> {
+public interface RecommendedItem {
/** @return the recommended item ID */
long getItemID();