Author: srowen
Date: Tue Jun 5 19:22:15 2012
New Revision: 1346542
URL: http://svn.apache.org/viewvc?rev=1346542&view=rev
Log:
Big speedup to sorting of temp prefs for anonymous user data model
implementation
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.java?rev=1346542&r1=1346541&r2=1346542&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/PlusAnonymousUserDataModel.java
Tue Jun 5 19:22:15 2012
@@ -156,18 +156,7 @@ public class PlusAnonymousUserDataModel
}
for (int i = 0; i < tempPrefs.length(); i++) {
if (tempPrefs.getItemID(i) == itemID) {
- int length = delegatePrefs == null ? 0 : delegatePrefs.length();
- PreferenceArray newPreferenceArray = new
GenericItemPreferenceArray(length + 1);
- for (int j = 0; j < length; j++) {
- newPreferenceArray.setUserID(j, delegatePrefs.getUserID(j));
- newPreferenceArray.setItemID(j, delegatePrefs.getItemID(j));
- newPreferenceArray.setValue(j, delegatePrefs.getValue(j));
- }
- newPreferenceArray.setUserID(length, tempPrefs.getUserID(i));
- newPreferenceArray.setItemID(length, tempPrefs.getItemID(i));
- newPreferenceArray.setValue(length, tempPrefs.getValue(i));
- newPreferenceArray.sortByUser();
- return newPreferenceArray;
+ return cloneAndMergeInto(delegatePrefs, itemID,
tempPrefs.getUserID(i), tempPrefs.getValue(i));
}
}
if (delegatePrefs == null) {
@@ -176,6 +165,37 @@ public class PlusAnonymousUserDataModel
}
return delegatePrefs;
}
+
+ private static PreferenceArray cloneAndMergeInto(PreferenceArray
delegatePrefs,
+ long itemID,
+ long newUserID,
+ float value) {
+
+ int length = delegatePrefs == null ? 0 : delegatePrefs.length();
+ int newLength = length + 1;
+ PreferenceArray newPreferenceArray = new
GenericItemPreferenceArray(newLength);
+
+ // Set item ID once
+ newPreferenceArray.setItemID(0, itemID);
+
+ int positionToInsert = 0;
+ while (positionToInsert < length && newUserID >
delegatePrefs.getUserID(positionToInsert)) {
+ positionToInsert++;
+ }
+
+ for (int i = 0; i < positionToInsert; i++) {
+ newPreferenceArray.setUserID(i, delegatePrefs.getUserID(i));
+ newPreferenceArray.setValue(i, delegatePrefs.getValue(i));
+ }
+ newPreferenceArray.setUserID(positionToInsert, newUserID);
+ newPreferenceArray.setValue(positionToInsert, value);
+ for (int i = positionToInsert + 1; i < newLength; i++) {
+ newPreferenceArray.setUserID(i, delegatePrefs.getUserID(i - 1));
+ newPreferenceArray.setValue(i, delegatePrefs.getValue(i - 1));
+ }
+
+ return newPreferenceArray;
+ }
@Override
public Float getPreferenceValue(long userID, long itemID) throws
TasteException {