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();