Skip to content

Instantly share code, notes, and snippets.

@mucaho
Created May 9, 2014 15:33
Show Gist options
  • Save mucaho/5afc88b034d83a1125e8 to your computer and use it in GitHub Desktop.
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
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