//package arida.ufc.br.moap.function.sim;
//
//import arida.ufc.br.moap.function.beans.DefaultDataset;
//import arida.ufc.br.moap.functions.spi.SimilarityFunction;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Set;
//
///**
// *
// * @author igobrilhante
// */
//public class PearsonSimilarity extends SimilarityFunction {
//
//// private double[][] similarities;
// private double[][] matrix;
// private double[] averages;
// private DefaultDataset dataset;
//// private Map<Object, Integer> indices;
// private Map<Object, Integer> itemIndices;
//
// /**
// *
// * @param dataset
// */
// public PearsonSimilarity(DefaultDataset dataset) {
// super();
// this.dataset = dataset;
// }
//
// private void initialize() {
// int userCount = 0;
// int itemCount = 0;
//
// this.itemIndices = new HashMap<Object, Integer>();
//
// for (Object u : dataset.getUsers()) {
// indices.put(u, userCount);
// Set<Object> items = this.dataset.getItems(u);
// for (Object item : items) {
// if (!itemIndices.containsKey(item)) {
// itemIndices.put(item, itemCount);
// itemCount++;
// }
// }
// userCount++;
// }
//
//
// int rows = userCount;
// int cols = itemCount;
//
// matrix = new double[rows][cols];
//
// for (int i = 0; i < rows; i++) {
// for (int j = 0; j < cols; j++) {
// this.matrix[i][j] = 0.0;
// }
// }
//
// for (Object u : dataset.getUsers()) {
// int userIndex = indices.get(u);
// Set<Object> items = this.dataset.getItems(u);
// for (Object item : items) {
// int itemIndex = itemIndices.get(item);
// double rating = this.dataset.getRating(u, item);
// this.matrix[userIndex][itemIndex] = rating;
// }
// }
// }
//
// /**
// *
// */
// @Override
// public void execute() {
// // TODO Auto-generated method stub
//
// initialize();
//
// int rows = matrix.length;
// int cols = matrix[0].length;
// similarities = new double[rows][rows];
// computeAverage();
// for (int i = 0; i < rows; i++) {
// for (int j = i + 1; j < rows; j++) {
// double sim = 0.0;
// double dot_product = 0.0;
// double a_value = 0.0;
// double b_value = 0.0;
//// double i_avg = this.averages[i];
//// double j_avg = this.averages[j];
// double[] avg = computeAverage(i, j);
// double i_avg = avg[0];
// double j_avg = avg[1];
//
// for (int k = 0; k < cols; k++) {
// if (matrix[i][k] > 0 && matrix[j][k] > 0) {
// dot_product = dot_product + ((matrix[i][k] - i_avg) * (matrix[j][k] - j_avg));
// a_value = a_value + (Math.pow((matrix[i][k] - i_avg), 2));
// b_value = b_value + (Math.pow((matrix[j][k] - j_avg), 2));
// }
// }
//
// if (a_value != 0 && b_value != 0) {
// a_value = Math.sqrt(a_value);
// b_value = Math.sqrt(b_value);
// double denominator = a_value * b_value;
// sim = dot_product / denominator;
// }
//
// this.similarities[i][j] = sim;
// this.similarities[j][i] = sim;
// }
// }
// }
//
//// @Override
//// public double[][] getSimilarities() {
//// // TODO Auto-generated method stub
//// return this.similarities;
//// }
////
//// @Override
//// public double getSimilarity(Object o1, Object o2) {
//// // TODO Auto-generated method stub
//// int index1 = indices.get(o1);
//// int index2 = indices.get(o2);
//// return this.similarities[index1][index2];
//// }
//
// private double[] computeAverage(int i, int j) {
//// System.out.printf("AVG %d and %d\n", i,j);
// double[] avg = new double[2];
// int cols = this.matrix[0].length;
// int count = 0;
// for (int k = 0; k < 2; k++) {
// avg[k] = 0.0;
// }
// for (int k = 0; k < cols; k++) {
// if (this.matrix[i][k] > 0 && this.matrix[j][k] > 0) {
//// System.out.printf("Item %d, %d: %f and %d: %f\n",k, i,this.matrix[i][k],j,this.matrix[j][k]);
// avg[0] = avg[0] + this.matrix[i][k];
// avg[1] = avg[1] + this.matrix[j][k];
// count++;
// }
// }
// if (count > 0) {
// avg[0] = (double) avg[0] / count;
// avg[1] = (double) avg[1] / count;
// }
//
// return avg;
// }
//
// private void computeAverage() {
// int rows = this.matrix.length;
// int cols = this.matrix[0].length;
// this.averages = new double[rows];
// for (int i = 0; i < rows; i++) {
// this.averages[i] = 0;
// }
//
// for (int i = 0; i < rows; i++) {
// int count = 0;
// for (int j = 0; j < cols; j++) {
// if (matrix[i][j] > 0) {
// this.averages[i] = this.averages[i] + matrix[i][j];
// count++;
// }
//
// }
// if (count > 0) {
// this.averages[i] = (double) this.averages[i] / count;
// }
//// System.out.println(i +" avg "+ this.averages[i]);
// }
// }
//
// /**
// *
// * @return
// */
// @Override
// public String toString(){
// return PearsonSimilarity.class.getName();
// }
//}