/**
   * Calculates the weight for two users over all items they share recorded ratings for.
   *
   * @param train User object for particular user in training data.
   * @param test User object for active user.
   * @return Returns a Double representing the computed weight.
   */
  public static double calculateWeight(User train, User test) {
    double numSum = 0;
    double denTestSum = 0;
    double denTrainSum = 0;
    Map<Integer, Rating> ratings = train.getRatings();

    for (Rating r : test.getRatings().values()) {
      if (ratings.containsKey(r.getMovieId())) {
        numSum +=
            (r.getRating() - test.getMean())
                * (ratings.get(r.getMovieId()).getRating() - train.getMean());
        denTestSum += Math.pow(r.getRating() - test.getMean(), 2);
        denTrainSum += Math.pow(ratings.get(r.getMovieId()).getRating() - train.getMean(), 2);
      }
    }
    return (denTestSum == 0 || denTrainSum == 0) ? 0 : numSum / Math.sqrt(denTestSum * denTrainSum);
  }