private static double coLocationScore( int user_a_id, int user_b_id, HashSet<String> colocs ) {
		LinkedList<Record> ra = User.allUserSet.get(user_a_id).records;
		HashMap<String, LinkedList<Record>> raco = new HashMap<String, LinkedList<Record>>();
		LinkedList<Record> rb = User.allUserSet.get(user_b_id).records;
		HashMap<String, LinkedList<Record>> rbco = new HashMap<String, LinkedList<Record>>();
		double interest = 0;
		// System.out.println(String.format("Colocs size %d", colocs.size()));
		// find the reverse map of location count
		for (Record r : ra) {
			if (raco.containsKey(r.GPS())) {
				raco.get(r.GPS()).add(r);
			} else {
				raco.put(r.GPS(), new LinkedList<Record>());
				raco.get(r.GPS()).add(r);
			}
		}
		for (Record r : rb) {
			if (rbco.containsKey(r.GPS())) {
				rbco.get(r.GPS()).add(r);
			} else {
				rbco.put(r.GPS(), new LinkedList<Record>());
				rbco.get(r.GPS()).add(r);
			}
		}
		for (String loc_id : colocs) {
			// judge their co-locating events with time
			for (Record r1 : raco.get(loc_id)) {
				for (Record r2 : rbco.get(loc_id)) {
					// We identify the co-locating event with a 4-hour time window
					if (r1.timestamp - r2.timestamp <= 3600 * 4)
						interest += - Math.log( (double) raco.get(loc_id).size() / ra.size()) 
							- Math.log( (double) rbco.get(loc_id).size() / rb.size() );
				}
			}
		}
		return interest;
	}