package itemrecommendations; import java.util.ArrayList; 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.Bookmark; import common.IntMapComparator; import common.MemoryThread; import common.PerformanceMeasurement; import common.Utilities; import file.BookmarkReader; import file.PredictionFileWriter; public class MPResourceCalculator { private static String timeString; private static List<int[]> getPopularResources(BookmarkReader reader, int count, int trainSize) { List<int[]> resources = new ArrayList<int[]>(); Map<Integer, Integer> countMap = new LinkedHashMap<Integer, Integer>(); for (int i = 0; i < reader.getResources().size(); i++) { countMap.put(i, reader.getResourceCounts().get(i)); } Map<Integer, Integer> sortedCountMap = new TreeMap<Integer, Integer>(new IntMapComparator(countMap)); sortedCountMap.putAll(countMap); for (int userID : reader.getUniqueUserListFromTestSet(trainSize)) { List<Integer> userResources = Bookmark.getResourcesFromUser(reader.getBookmarks().subList(0, trainSize), userID); //System.out.println(userResources.size()); List<Integer> resIDs = new ArrayList<Integer>(); int i = 0; for (Integer key : sortedCountMap.keySet()) { if (i < count) { if (!userResources.contains(key)) { resIDs.add(key); i++; } } else { break; } } resources.add(Ints.toArray(resIDs)); } return resources; } private static List<int[]> getRandomResources(BookmarkReader reader, int count, int trainSize) { List<int[]> resources = new ArrayList<int[]>(); int resCount = reader.getResources().size(); for (int userID : reader.getUniqueUserListFromTestSet(trainSize)) { List<Integer> userResources = Bookmark.getResourcesFromUser(reader.getBookmarks().subList(0, trainSize), userID); List<Integer> resIDs = new ArrayList<Integer>(); int i = 0; for (Integer res : Utilities.getRandomIndices(0, resCount - 1)) { if (i < count) { if (!userResources.contains(res)) { resIDs.add(res); i++; } } else { break; } } resources.add(Ints.toArray(resIDs)); } return resources; } public static BookmarkReader predictPopularResources(String filename, int trainSize, boolean writeTime) { Timer timerThread = new Timer(); MemoryThread memoryThread = new MemoryThread(); timerThread.schedule(memoryThread, 0, MemoryThread.TIME_SPAN); BookmarkReader reader = new BookmarkReader(trainSize, false); reader.readFile(filename); Stopwatch timer = new Stopwatch(); timer.start(); List<int[]> values = getPopularResources(reader, 20, trainSize); timer.stop(); long trainingTime = timer.elapsed(TimeUnit.MILLISECONDS); timer.reset(); timer.start(); PredictionFileWriter writer = new PredictionFileWriter(reader, values); writer.writeResourcePredictionsToFile(filename + "_mp", trainSize, 0); timer.stop(); long testTime = timer.elapsed(TimeUnit.MILLISECONDS); timeString = PerformanceMeasurement.addTimeMeasurement(timeString, true, trainingTime, testTime, reader.getBookmarks().size() - trainSize); timeString = PerformanceMeasurement.addMemoryMeasurement(timeString, false, memoryThread.getMaxMemory()); timerThread.cancel(); if (writeTime) { Utilities.writeStringToFile("./data/metrics/" + filename + "_mp_TIME.txt", timeString); } return reader; } public static BookmarkReader predictRandomResources(String filename, int trainSize, boolean writeTime) { BookmarkReader reader = new BookmarkReader(trainSize, false); reader.readFile(filename); List<int[]> values = getRandomResources(reader, 20, trainSize); PredictionFileWriter writer = new PredictionFileWriter(reader, values); writer.writeResourcePredictionsToFile(filename + "_rand", trainSize, 0); return reader; } }