Author: srowen
Date: Tue Jun 29 08:09:12 2010
New Revision: 958865

URL: http://svn.apache.org/viewvc?rev=958865&view=rev
Log:
MAHOUT-430

Modified:
    
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
    
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java

Modified: 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java?rev=958865&r1=958864&r2=958865&view=diff
==============================================================================
--- 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
 (original)
+++ 
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/similarity/AbstractSimilarity.java
 Tue Jun 29 08:09:12 2010
@@ -169,7 +169,7 @@ abstract class AbstractSimilarity implem
     
     while (true) {
       int compare = xIndex < yIndex ? -1 : xIndex > yIndex ? 1 : 0;
-      if (hasInferrer || (compare == 0)) {
+      if (hasInferrer || compare == 0) {
         double x;
         double y;
         if (xIndex == yIndex) {
@@ -186,15 +186,17 @@ abstract class AbstractSimilarity implem
           // as if the other user expressed that preference
           if (compare < 0) {
             // X has a value; infer Y's
-            x = hasPrefTransform ? 
prefTransform.getTransformedValue(xPrefs.get(xPrefIndex)) : xPrefs
-                .getValue(xPrefIndex);
+            x = hasPrefTransform
+                ? prefTransform.getTransformedValue(xPrefs.get(xPrefIndex))
+                : xPrefs.getValue(xPrefIndex);
             y = inferrer.inferPreference(userID2, xIndex);
           } else {
             // compare > 0
             // Y has a value; infer X's
             x = inferrer.inferPreference(userID1, yIndex);
-            y = hasPrefTransform ? 
prefTransform.getTransformedValue(yPrefs.get(yPrefIndex)) : yPrefs
-                .getValue(yPrefIndex);
+            y = hasPrefTransform
+                ? prefTransform.getTransformedValue(yPrefs.get(yPrefIndex))
+                : yPrefs.getValue(yPrefIndex);
           }
         }
         sumXY += x * y;
@@ -208,15 +210,35 @@ abstract class AbstractSimilarity implem
       }
       if (compare <= 0) {
         if (++xPrefIndex >= xLength) {
-          break;
+          if (hasInferrer) {
+            // Must count other Ys; pretend next X is far away
+            if (yIndex == Long.MAX_VALUE) {
+              // ... but stop if both are done!
+              break;
+            }
+            xIndex = Long.MAX_VALUE;
+          } else {
+            break;
+          }
+        } else {
+          xIndex = xPrefs.getItemID(xPrefIndex);
         }
-        xIndex = xPrefs.getItemID(xPrefIndex);
       }
       if (compare >= 0) {
         if (++yPrefIndex >= yLength) {
-          break;
+          if (hasInferrer) {
+            // Must count other Xs; pretend next Y is far away            
+            if (xIndex == Long.MAX_VALUE) {
+              // ... but stop if both are done!
+              break;
+            }
+            yIndex = Long.MAX_VALUE;
+          } else {
+            break;
+          }
+        } else {
+          yIndex = yPrefs.getItemID(yPrefIndex);
         }
-        yIndex = yPrefs.getItemID(yPrefIndex);
       }
     }
     

Modified: 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java?rev=958865&r1=958864&r2=958865&view=diff
==============================================================================
--- 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
 (original)
+++ 
mahout/trunk/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/PearsonCorrelationSimilarityTest.java
 Tue Jun 29 08:09:12 2010
@@ -17,9 +17,14 @@
 
 package org.apache.mahout.cf.taste.impl.similarity;
 
+import java.util.Collection;
+
+import org.apache.mahout.cf.taste.common.Refreshable;
 import org.apache.mahout.cf.taste.common.Weighting;
 import org.apache.mahout.cf.taste.model.DataModel;
 import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
+import org.apache.mahout.cf.taste.similarity.PreferenceInferrer;
+import org.apache.mahout.cf.taste.similarity.UserSimilarity;
 
 /** <p>Tests {...@link PearsonCorrelationSimilarity}.</p> */
 public final class PearsonCorrelationSimilarityTest extends SimilarityTestCase 
{
@@ -217,4 +222,25 @@ public final class PearsonCorrelationSim
     new PearsonCorrelationSimilarity(getDataModel()).refresh(null);
   }
 
+  public void testInferrer() throws Exception {
+    DataModel dataModel = getDataModel(
+      new long[] {1, 2},
+      new Double[][] {
+              {null, 1.0, 2.0,  null, null, 6.0},
+              {1.0, 8.0, null, 3.0,  4.0,  null},
+      });
+    UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
+    similarity.setPreferenceInferrer(new PreferenceInferrer() {
+      @Override
+      public float inferPreference(long userID, long itemID) {
+        return 1.0f;
+      }
+      @Override
+      public void refresh(Collection<Refreshable> alreadyRefreshed) {
+      }
+    });
+
+    assertEquals(-0.435285750066007, similarity.userSimilarity(1L, 2L));
+  }
+
 }


Reply via email to