package userrecommender;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
import common.Bookmark;
import common.DoubleMapComparator;
import file.BookmarkReader;
/**
* Spear Algorithm wrapper
*
* @author ilire.mavriqi
*
*/
public class SpearCalculator {
private static BookmarkReader reader = new BookmarkReader(0, false);
public static void calculateScores(String inputDataFileName, String outputFileName, int numberOfIterations) {
reader.readFile(inputDataFileName);
LinkedList<Integer> userList = getUsers();
HashMap<Integer, TreeSet<UserActivity>> activities = getActivities();
LinkedList<Integer> uniqueResources = new LinkedList<Integer>();
uniqueResources.addAll(activities.keySet());
SpearAlgorithm alg = new SpearAlgorithm(activities, userList, uniqueResources);
SpearAlgorithmResult result = alg.execute(numberOfIterations);
// sort results
Map<Integer, Double> sortedExpertiseScores = new TreeMap<Integer, Double>(new DoubleMapComparator(result.getExpertiseResult()));
sortedExpertiseScores.putAll(result.getExpertiseResult());
Map<Integer, Double> sortedResourceScores = new TreeMap<Integer, Double>(new DoubleMapComparator(result.getQualityResult()));
sortedResourceScores.putAll(result.getQualityResult());
try {
FileWriter writerUsers = new FileWriter(new File("./data/results/spear/" + outputFileName + "_users.txt"));
BufferedWriter bwUsers = new BufferedWriter(writerUsers);
String userResults = "User | Expertise Score";
userResults += "\n";
userResults += "---------------------------";
userResults += "\n";
for (Map.Entry<Integer, Double> entry : sortedExpertiseScores.entrySet()) {
userResults += entry.getKey() + " | " + entry.getValue();
//System.out.println ("Experts results: User with ID : " + entry.getKey() + " got the score => " +entry.getValue());
userResults += "\n";
}
bwUsers.write(userResults);
bwUsers.flush();
bwUsers.close();
writerUsers.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileWriter writerResources = new FileWriter(new File("./data/results/spear/" + outputFileName + "_resources.txt"));
BufferedWriter bwResources = new BufferedWriter(writerResources);
String resourceResults = "Resource | Quality Score";
resourceResults += "\n";
resourceResults += "---------------------------";
resourceResults += "\n";
for (Map.Entry<Integer, Double> entry : sortedResourceScores.entrySet()) {
resourceResults += entry.getKey() + " | " +entry.getValue();
resourceResults += "\n";
//System.out.println ("Resource results: Resource with ID : " + entry.getKey() + " got the score => " +entry.getValue());
}
bwResources.write(resourceResults);
bwResources.flush();
bwResources.close();
writerResources.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static LinkedList<Integer> getUsers() {
LinkedList<Integer> userList = new LinkedList<Integer>();
for (int i = 0; i < reader.getUsers().size(); i++) {
userList.add(Integer.parseInt(reader.getUsers().get(i)));
}
return userList;
}
private static HashMap<Integer, TreeSet<UserActivity>> getActivities() {
HashMap<Integer, TreeSet<UserActivity>> activities = new HashMap<Integer, TreeSet<UserActivity>>();
for (Bookmark bookmark : reader.getBookmarks()) {
UserActivity activity = new UserActivity();
activity.setUserId(bookmark.getUserID());
activity.setResourceId(bookmark.getResourceID());
activity.setTimeStamp(Long.parseLong(bookmark.getTimestamp()));
if (activities.containsKey(bookmark.getResourceID())) {
//already contains values, get list, add new value
TreeSet<UserActivity> values = activities.get(bookmark.getResourceID());
values.add(activity);
activities.put(bookmark.getResourceID(), values);
} else {
TreeSet<UserActivity> userActivityTree = new TreeSet<UserActivity>();
userActivityTree.add(activity);
activities.put(bookmark.getResourceID(), userActivityTree);
}
}
return activities;
}
}