package processing;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Stopwatch;
import com.google.common.primitives.Ints;
import common.DoubleMapComparator;
import common.Bookmark;
import common.MemoryThread;
import common.PerformanceMeasurement;
import common.Utilities;
import file.PredictionFileWriter;
import file.BookmarkReader;
public class RecencyCalculator {
private List<List<Bookmark>> userBookmarks;
public RecencyCalculator(BookmarkReader reader, int trainSize) {
List<Bookmark> trainList = reader.getBookmarks().subList(0, trainSize);
this.userBookmarks = Utilities.getBookmarks(trainList, false);
}
public Map<Integer, Double> getRankedTagList(int userID) {
Map<Integer, Double> returnMap = new LinkedHashMap<Integer, Double>();
if (userID >= this.userBookmarks.size()) {
return returnMap;
}
List<Bookmark> bookmarks = this.userBookmarks.get(userID);
Collections.sort(bookmarks);
int count = 0;
int index = bookmarks.size() - 1;
while (count < 10 && index >= 0) {
Bookmark b = bookmarks.get(index--);
for (int t : b.getTags()) {
if (!returnMap.containsKey(t)) {
returnMap.put(t, 10.0 - count++);
if (count >= 10) {
break;
}
}
}
}
return returnMap;
}
// Statics ----------------------------------------------------------------------------------------------------------------------
public static BookmarkReader predictSample(String filename, int trainSize, int sampleSize) {
BookmarkReader reader = new BookmarkReader(trainSize, false);
reader.readFile(filename);
List<int[]> predictionValues = new ArrayList<int[]>();
RecencyCalculator calculator = new RecencyCalculator(reader, trainSize);
for (int i = trainSize; i < trainSize + sampleSize; i++) { // the test-set
Bookmark data = reader.getBookmarks().get(i);
Map<Integer, Double> map = calculator.getRankedTagList(data.getUserID());
predictionValues.add(Ints.toArray(map.keySet()));
}
reader.setTestLines(reader.getBookmarks().subList(trainSize, reader.getBookmarks().size()));
PredictionFileWriter writer = new PredictionFileWriter(reader, predictionValues);
writer.writeFile(filename + "_rec");
return reader;
}
}