@@ -1,5 +1,4 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -8,11 +7,17 @@
import HBF.Match;
import HBF.Tournament;
import HBF.User;
import KNN.KNN;
import KNN.Player;
import KNN.TournamentResult;
import KNN.WeekDay;

public class HBF {
public static HashMap<Integer, User> users = new HashMap<Integer, User>();
public static HashMap<Integer, Tournament> tournaments = new HashMap<Integer, Tournament>();
public static HashMap<Integer, Match> matches = new HashMap<Integer, Match>();

public static HashMap<Integer, Integer> lostToArm = new HashMap<Integer, Integer>();
private static DBConn db;

public static int calculateMMR(int winnerMMR, int loserMMR) {
@@ -41,7 +46,7 @@ public static void updateMMRInMatches(ArrayList<Match> matches) {
}
}

public static void main(String args[]) {
public static void main(String args[]) throws Exception {
Date startTime = new Date();
db = new DBConn();
if(!db.connect()) return;
@@ -67,15 +72,117 @@ public static void main(String args[]) {
System.out.println("Number of matches: " + matches.size());
System.out.println("Number of tournaments: " + tournaments.size());

ArrayList<int[]> participants = new ArrayList<int[]>();

ArrayList<Float> bjarkeWinRates = new ArrayList<Float>();

for(Map.Entry<Integer, Tournament> entry : tournaments.entrySet()) {
Tournament t = entry.getValue();
updateMMRInMatches(t.getMatches());

// if(t.hasUser(986)) {
// int numberOfMatches = 0;
// int numberOfWins = 0;
//
// for(Match m : t.getMatches()) {
// if(m.hasUser(986) && m.hasWinner()) {
// numberOfMatches++;
// if(m.didUserWin(986)) {
// numberOfWins++;
// }
// }
// }
//
// bjarkeWinRates.add((float)numberOfWins/numberOfMatches);
// }

// // APRIORI DATA PREPARATION
// if(t.getDate().before(new Date(115, 1, 1)) && t.getDate().getDay() != 2) continue;
// int[] parts = new int[t.getTeams().size()*2];
// for(int i = 0; i < parts.length; i+=2) {
// parts[i] = t.getTeams().get(i/2).getPlayer1().id();
// parts[i+1] = t.getTeams().get(i/2).getPlayer2().id();
//
//
//
// }
// Arrays.sort(parts);
// //System.out.println(Arrays.toString(parts));
// participants.add(parts);
}

// for(Map.Entry<Integer, Integer> entry : lostToArm.entrySet()) {
// int numberOfLosses = entry.getValue();
// String name = users.get(entry.getKey()).getName();
//
// System.out.println(numberOfLosses + " - " + name);
// }

// for(Map.Entry<String, Integer> entry : db.getELOChangesForUser(986).entrySet()) {
// System.out.println(entry.getKey() + " - " + entry.getValue());
// }

ArrayList<User> sortedRatingList = new ArrayList<User>(users.values());
Collections.sort(sortedRatingList);
for(User u : sortedRatingList) {
System.out.println(u.getName() + "\t"+u.getMMR());
// ArrayList<User> sortedRatingList = new ArrayList<User>(users.values());
// Collections.sort(sortedRatingList);
// for(User u : sortedRatingList) {
// if(u.getMMR() != 1200)
// System.out.println(u.getName() + "\t"+u.getMMR());
// }


////////////////////////////////////////////////////////
//////////////// APRIORI ///////////////
////////////////////////////////////////////////////////
// System.out.println("Participants size = " + participants.size());
// Apriori apriori = new Apriori();
// List<ItemSet> result = apriori.apriori(participants.toArray(new int[participants.size()][]), 10.0f);
// for(ItemSet set : result) {
// System.out.print("#"+set.getOccurenses());
// for(int id : set.set) {
// System.out.print(" - " + users.get(id).getName());
// }
// System.out.println();
// }

// for(float winRate : bjarkeWinRates) {
// System.out.println(winRate);
// }


////////////////////////////////////////////////////////
//////////////// KNN ///////////////
////////////////////////////////////////////////////////
String[][] data = CSVFileReader.readDataFile("ratinghistory_turneringer.csv",";", "-",true);
int k = 15;
int numberOfTournaments = 15;
KNN kNN = new KNN();
ArrayList<Player> players = new ArrayList<Player>();
Player testPlayer = null;
for(int i = 0; i < data.length; i++) {
if(i+numberOfTournaments >= data.length) break;
if(players.size() > 0)
if(Integer.parseInt(data[i][0]) == players.get(players.size()-1).id) continue;

// New Player
if(Integer.parseInt(data[i][0]) == Integer.parseInt(data[i+numberOfTournaments][0])) {
// Player has required number of tournaments
TournamentResult[] tr = new TournamentResult[numberOfTournaments];
for(int j = 0; j < numberOfTournaments; j++) {
tr[j] = new TournamentResult(Integer.parseInt(data[i+j][4]), Integer.parseInt(data[i+j][3]));
}

if(Integer.parseInt(data[i][0]) == 986) testPlayer = new Player(Integer.parseInt(data[i][0]), tr, users.get(Integer.parseInt(data[i][0])).getMMR());
else players.add(new Player(Integer.parseInt(data[i][0]), tr, users.get(Integer.parseInt(data[i][0])).getMMR()));
}
}

kNN.init(players, k);

int[] ids = kNN.calc(testPlayer);
for(int id : ids) {
System.out.println("-----------------------------------");
System.out.println("Navn: " + users.get(id).getName());
System.out.println("MMR: " + users.get(id).getMMR());
}


@@ -85,6 +85,7 @@ public boolean hasUser(int userId) {
}

public boolean didUserWin(int userId) throws Exception {
if(!hasWinner()) return false;
if(hasUser(userId)) {
return getWinner().hasUser(userId);
} else {
@@ -26,6 +26,8 @@ public User getPlayer2() {
}

public boolean hasUser(int userId) {
if(player1 == null || player2 == null) return false;

if(player1.id() == userId || player2.id() == userId)
return true;
else return false;
@@ -63,4 +63,12 @@ public Team getTeamWithPlayer(int user_id) {
public Date getDate() {
return date;
}

public boolean hasUser(int userId) {
for(Team t : teams) {
if(t.hasUser(userId))
return true;
}
return false;
}
}
@@ -0,0 +1,14 @@
package KNN;

import java.util.Comparator;

public class DistanceComparator implements Comparator<Result>{

@Override
public int compare(Result x, Result y) {
if(x.distance < y.distance) return -1;
else if(x.distance == y.distance) return 0;
else return 1;
}

}
@@ -0,0 +1,72 @@
package KNN;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class KNN {
ArrayList<Player> data;
int k;

public void init(ArrayList<Player> data, int k) {
this.data = data;
this.k = k;
}

public int[] calc(Player player) {
ArrayList<Result> results = new ArrayList<Result>();
for(Player point : data) {
results.add(distanceBetween(point, player));
}
results.sort(new DistanceComparator());

int[] ids = new int[k];
for(int i = 0; i < k; i++) {
ids[i] = results.get(i).id;
}

return ids;
}

private Result distanceBetween(Player to, Player from) {
if(to.tournaments.length != from.tournaments.length) return null;

double temp = 0;
for(int i = 0; i < to.tournaments.length; i++) {
temp += Math.pow(to.tournaments[i].mmrChange-from.tournaments[i].mmrChange, 2);
temp += Math.pow(to.tournaments[i].day-from.tournaments[i].day, 2);
}

double dist = Math.sqrt(temp);

return new Result(to.id, to.presentMMR, dist);
}

// private Course findMajority(Course[] c) {
// HashMap<Course, Integer> count = new HashMap<Course, Integer>();
// for(int i = 0; i<c.length; i++) {
// if(count.containsKey(c[i])) {
// count.replace(c[i], count.get(c[i])+1);
// } else {
// count.put(c[i], 1);
// }
// }
//
// Map.Entry<Course, Integer> maxEntry = null;
// for(Map.Entry<Course, Integer> entry : count.entrySet()) {
// if(maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
// maxEntry = entry;
// }
// }
//
// return maxEntry.getKey();
// }

private int findAverageMMR(Player[] players) {
int mmrAverage = 0;
for(Player p : players) {
mmrAverage += p.presentMMR;
}
return mmrAverage/players.length;
}
}
@@ -0,0 +1,26 @@
package KNN;

public class Player {
public int id;
public String name;
public TournamentResult[] tournaments;
public int presentMMR;


public Player(int id, TournamentResult[] tournaments, int presentMMR) {
this.id = id;
this.tournaments = tournaments;
this.presentMMR = presentMMR;
}

public void print() {
System.out.println("----------------------------------------");
System.out.println("Name: " + name);
System.out.println("Present MMR: " + presentMMR);
System.out.println("Tournament Results:");
for(TournamentResult t : tournaments) {
t.print();
}
System.out.println("----------------------------------------");
}
}
@@ -0,0 +1,13 @@
package KNN;

public class Result {
public int MMR;
public double distance;
public int id;

public Result(int id, int MMR, double dist) {
this.id = id;
this.MMR = MMR;
distance = dist;
}
}
@@ -0,0 +1,34 @@
package KNN;

import java.util.Date;

public class TournamentResult {
public int mmrChange;
public double day;
public Date date;

public TournamentResult(int mmrChange, int day) {
this.mmrChange = mmrChange;
WeekDay wd = new WeekDay();
switch (day) {
case 1:
this.day = wd.MONDAY;
break;
case 2:
this.day = wd.TUESDAY;
break;
case 3:
this.day = wd.WEDNESDAY;
break;
case 4:
this.day = wd.THURSDAY;
break;
default:
break;
}
}

public void print() {
System.out.println("\tDay: " + day + " - MMR Change: " + mmrChange);
}
}
@@ -0,0 +1,8 @@
package KNN;

public class WeekDay {
public final double WEDNESDAY = 0.0;
public final double MONDAY = 1/3;
public final double THURSDAY = 2/3;
public final double TUESDAY = 1.0;
}