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 2008/05/31 02:18:27 UTC

svn commit: r661920 - in /lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model: BooleanPreference.java GenericPreference.java GenericUser.java SettableUserPreference.java

Author: srowen
Date: Fri May 30 17:18:27 2008
New Revision: 661920

URL: http://svn.apache.org/viewvc?rev=661920&view=rev
Log:
Added BooleanPreference, plus refactorings to support it, for better support of "binary" yes-or-nothing preferences in data models

Added:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java
      - copied, changed from r657697, lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/SettableUserPreference.java
      - copied, changed from r657697, lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
Modified:
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
    lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java

Copied: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java (from r657697, lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java)
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java?p2=lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java&p1=lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java&r1=657697&r2=661920&rev=661920&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/BooleanPreference.java Fri May 30 17:18:27 2008
@@ -24,24 +24,21 @@
 import java.io.Serializable;
 
 /**
- * <p>A simple {@link Preference} encapsulating an {@link Item} and preference value.</p>
+ * Encapsulates a simple boolean "preference" for an {@link Item} whose value does not matter (is fixed
+ * at 1.0). This is appropriate in situations where users conceptually have only a general "yes" preference
+ * for items, rather than a spectrum of preference values.
  */
-public class GenericPreference implements Preference, Serializable {
+public final class BooleanPreference implements Preference, SettableUserPreference, Serializable {
 
   private User user;
   private final Item item;
-  private double value;
 
-  public GenericPreference(User user, Item item, double value) {
+  public BooleanPreference(User user, Item item) {
     if (item == null) {
       throw new IllegalArgumentException("item is null");
     }
-    if (Double.isNaN(value)) {
-      throw new IllegalArgumentException("Invalid value: " + value);
-    }
     this.user = user;
     this.item = item;
-    this.value = value;
   }
 
   public User getUser() {
@@ -51,13 +48,7 @@
     return user;
   }
 
-  /**
-   * <p>Let this be set by {@link GenericUser} to avoid a circularity problem -- each
-   * wants a reference to the other in the constructor.</p>
-   *
-   * @param user user whose preference this is
-   */
-  void setUser(User user) {
+  public void setUser(User user) {
     if (user == null) {
       throw new IllegalArgumentException("user is null");
     }
@@ -69,19 +60,16 @@
   }
 
   public double getValue() {
-    return value;
+    return 1.0;
   }
 
   public void setValue(double value) {
-    if (Double.isNaN(value)) {
-      throw new IllegalArgumentException("Invalid value: " + value);
-    }
-    this.value = value;
+    throw new UnsupportedOperationException();
   }
 
   @Override
   public String toString() {
-    return "GenericPreference[user: " + user + ", item:" + item + ", value:" + value + ']';
+    return "BooleanPreference[user: " + user + ", item:" + item + ']';
   }
 
-}
+}
\ No newline at end of file

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java?rev=661920&r1=661919&r2=661920&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericPreference.java Fri May 30 17:18:27 2008
@@ -26,7 +26,7 @@
 /**
  * <p>A simple {@link Preference} encapsulating an {@link Item} and preference value.</p>
  */
-public class GenericPreference implements Preference, Serializable {
+public class GenericPreference implements Preference, SettableUserPreference, Serializable {
 
   private User user;
   private final Item item;
@@ -51,13 +51,7 @@
     return user;
   }
 
-  /**
-   * <p>Let this be set by {@link GenericUser} to avoid a circularity problem -- each
-   * wants a reference to the other in the constructor.</p>
-   *
-   * @param user user whose preference this is
-   */
-  void setUser(User user) {
+  public void setUser(User user) {
     if (user == null) {
       throw new IllegalArgumentException("user is null");
     }

Modified: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java?rev=661920&r1=661919&r2=661920&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java Fri May 30 17:18:27 2008
@@ -54,8 +54,8 @@
       values = preferences.toArray(new Preference[preferences.size()]);
       for (Preference preference : values) {
         // Is this hacky?
-        if (preference instanceof GenericPreference) {
-          ((GenericPreference) preference).setUser(this);
+        if (preference instanceof SettableUserPreference) {
+          ((SettableUserPreference) preference).setUser(this);
         }
         data.put(preference.getItem().getID(), preference);
       }

Copied: lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/SettableUserPreference.java (from r657697, lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java)
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/SettableUserPreference.java?p2=lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/SettableUserPreference.java&p1=lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java&r1=657697&r2=661920&rev=661920&view=diff
==============================================================================
--- lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericUser.java (original)
+++ lucene/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/SettableUserPreference.java Fri May 30 17:18:27 2008
@@ -17,85 +17,22 @@
 
 package org.apache.mahout.cf.taste.impl.model;
 
-import org.apache.mahout.cf.taste.impl.common.ArrayIterator;
 import org.apache.mahout.cf.taste.model.Preference;
 import org.apache.mahout.cf.taste.model.User;
 
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
 /**
- * <p>A simple {@link User} which has simply an ID and some {@link Collection} of
- * {@link Preference}s.</p>
+ * Simple interface that simply exposes a {@link #setUser(User)} method.
+ * This helps unify implementations of {@link Preference} which expose this method.
  */
-public class GenericUser<K extends Comparable<K>> implements User, Serializable {
-
-  private static final Preference[] NO_PREFS = new Preference[0];
-
-  private final K id;
-  private final Map<Object, Preference> data;
-  // Use an array for maximum performance
-  private final Preference[] values;
-
-  public GenericUser(K id, Collection<Preference> preferences) {
-    if (id == null) {
-      throw new IllegalArgumentException("id is null");
-    }
-    this.id = id;
-    if (preferences == null || preferences.isEmpty()) {
-      data = Collections.emptyMap();
-      values = NO_PREFS;
-    } else {
-      data = new HashMap<Object, Preference>();
-      values = preferences.toArray(new Preference[preferences.size()]);
-      for (Preference preference : values) {
-        // Is this hacky?
-        if (preference instanceof GenericPreference) {
-          ((GenericPreference) preference).setUser(this);
-        }
-        data.put(preference.getItem().getID(), preference);
-      }
-      Arrays.sort(values, ByItemPreferenceComparator.getInstance());
-    }
-  }
-
-  public K getID() {
-    return id;
-  }
-
-  public Preference getPreferenceFor(Object itemID) {
-    return data.get(itemID);
-  }
-
-  public Iterable<Preference> getPreferences() {
-    return new ArrayIterator<Preference>(values);
-  }
-
-  public Preference[] getPreferencesAsArray() {
-    return values;
-  }
-
-  @Override
-  public int hashCode() {
-    return id.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    return obj instanceof User && ((User) obj).getID().equals(id);
-  }
-
-  @Override
-  public String toString() {
-    return "User[id:" + String.valueOf(id) + ']';
-  }
+public interface SettableUserPreference extends Preference {
 
-  public int compareTo(User o) {
-    return id.compareTo((K) o.getID());
-  }
+  /**
+   * <p>Let this be set by {@link GenericUser} to avoid a circularity problem -- 
+   * implementations want a reference to a {@link User} in the constructor, but so does
+   * {@link GenericUser}.</p>
+   *
+   * @param user user whose preference this is
+   */
+  void setUser(User user);
 
-}
+}
\ No newline at end of file