Created
May 9, 2014 15:33
-
-
Save mucaho/5afc88b034d83a1125e8 to your computer and use it in GitHub Desktop.
Apache Mahout: DataModel implementation which delegates to underlying DataModel, while allowing filtering of items
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.apache.mahout.cf.taste.common.NoSuchItemException; | |
import org.apache.mahout.cf.taste.common.Refreshable; | |
import org.apache.mahout.cf.taste.common.TasteException; | |
import org.apache.mahout.cf.taste.impl.common.FastIDSet; | |
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveArrayIterator; | |
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; | |
import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray; | |
import org.apache.mahout.cf.taste.model.DataModel; | |
import org.apache.mahout.cf.taste.model.PreferenceArray; | |
import java.util.Collection; | |
public class SelectiveItemDataModel implements DataModel { | |
private DataModel delegate; | |
private FastIDSet retainedItemIDs; | |
public SelectiveItemDataModel(DataModel delegate, FastIDSet retainedItemIDs) { | |
this.delegate = delegate; | |
this.retainedItemIDs = retainedItemIDs; | |
} | |
@Override | |
public LongPrimitiveIterator getUserIDs() throws TasteException { | |
return delegate.getUserIDs(); | |
} | |
@Override | |
public PreferenceArray getPreferencesFromUser(long userID) throws TasteException { | |
PreferenceArray inPreferences = delegate.getPreferencesFromUser(userID); | |
long[] inIDs = inPreferences.getIDs(); | |
int size = 0; | |
long[] outIds = new long[inIDs.length]; | |
float[] outValues = new float[inIDs.length]; | |
for (int i = 0; i < inIDs.length; i++) { | |
if (retainedItemIDs.contains(inIDs[i])) { | |
outIds[size] = inPreferences.getItemID(i); | |
outValues[size] = inPreferences.getValue(i); | |
size++; | |
} | |
} | |
PreferenceArray outPreferences = new GenericUserPreferenceArray(size); | |
outPreferences.setUserID(0, inPreferences.getUserID(0)); | |
for (int i = 0; i < size; i++) { | |
outPreferences.setItemID(i, outIds[i]); | |
outPreferences.setValue(i, outValues[i]); | |
} | |
return outPreferences; | |
} | |
@Override | |
public FastIDSet getItemIDsFromUser(long userID) throws TasteException { | |
FastIDSet itemIDs = delegate.getItemIDsFromUser(userID).clone(); | |
itemIDs.retainAll(retainedItemIDs); | |
return itemIDs; | |
} | |
@Override | |
public LongPrimitiveIterator getItemIDs() throws TasteException { | |
return new LongPrimitiveArrayIterator(retainedItemIDs.toArray()); | |
} | |
@Override | |
public PreferenceArray getPreferencesForItem(long itemID) throws TasteException { | |
if (!retainedItemIDs.contains(itemID)) | |
throw new NoSuchItemException(itemID); | |
return delegate.getPreferencesForItem(itemID); | |
} | |
@Override | |
public Float getPreferenceValue(long userID, long itemID) throws TasteException { | |
if (!retainedItemIDs.contains(itemID)) | |
return null; | |
return delegate.getPreferenceValue(userID, itemID); | |
} | |
@Override | |
public Long getPreferenceTime(long userID, long itemID) throws TasteException { | |
if (!retainedItemIDs.contains(itemID)) | |
return null; | |
return delegate.getPreferenceTime(userID, itemID); | |
} | |
@Override | |
public int getNumItems() throws TasteException { | |
return retainedItemIDs.size(); | |
} | |
@Override | |
public int getNumUsers() throws TasteException { | |
return delegate.getNumUsers(); | |
} | |
@Override | |
public int getNumUsersWithPreferenceFor(long itemID) throws TasteException { | |
if (!retainedItemIDs.contains(itemID)) | |
return 0; | |
return delegate.getNumUsersWithPreferenceFor(itemID); | |
} | |
@Override | |
public int getNumUsersWithPreferenceFor(long itemID1, long itemID2) throws TasteException { | |
if (!retainedItemIDs.contains(itemID1) || !retainedItemIDs.contains(itemID2)) | |
return 0; | |
return delegate.getNumUsersWithPreferenceFor(itemID1, itemID2); | |
} | |
@Override | |
public void setPreference(long userID, long itemID, float value) throws TasteException { | |
delegate.setPreference(userID, itemID, value); | |
} | |
@Override | |
public void removePreference(long userID, long itemID) throws TasteException { | |
delegate.removePreference(userID, itemID); | |
} | |
@Override | |
public boolean hasPreferenceValues() { | |
return delegate.hasPreferenceValues(); | |
} | |
@Override | |
public float getMaxPreference() { | |
return delegate.getMaxPreference(); | |
} | |
@Override | |
public float getMinPreference() { | |
return delegate.getMinPreference(); | |
} | |
@Override | |
public void refresh(Collection<Refreshable> alreadyRefreshed) { | |
delegate.refresh(alreadyRefreshed); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment