// Path: src/fr/lri/tao/apro/util/Logger.java
// public class Logger {
// 
//   private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger("fr.lri.tao.apro");
//   
//   public static void info(String msg, Object... params) {
//     logger.info(String.format(msg, params));
//   }
//   
//   public static void warn(String msg, Object... params) {
//     logger.warning(String.format(msg, params));
//   }
//   
//   public static void warn(Throwable t) {
//     logger.warning(t.getMessage());
//   }
//   
//   public static void warn(Throwable t, String msg, Object... params) {
//     logger.warning(t.getMessage() + "\n" + String.format(msg, params));
//   }
//   
//   public static void error(String msg, Object... params) {
//     logger.severe(String.format(msg, params));
//   }
//   
//   public static void error(Throwable t) {
//     logger.severe(t.getMessage());
//   }
//   
//   public static void error(Throwable t, String msg, Object... params) {
//     logger.severe(t.getMessage() + "\n" + String.format(msg, params));
//   }
//   
//   public static void log(Level level, String msg) {
//     logger.log(level, msg);
//   }
//   
//   public static void main(String[] args) {
//     Logger.info("Test %d", 5);
//   }
// }
// 
// Path: src/fr/lri/tao/apro/util/Utils.java
// public class Utils {
//   
//   private static final double EPSILON = 1E-14;
//   private static final double REALMIN100 = 100 * Double.MIN_NORMAL;
//   
// 
//   public static String toString(double[][] a) {
//     int maxLength = 12;
//     StringBuilder sb = new StringBuilder();
//     for (int i=0; i<a.length; i++) {
//       for (int j=0; j<a[i].length; j++) {
//         String val = String.valueOf(a[i][j]);
//         maxLength = Math.max(maxLength, val.length());
//         while (val.length() < maxLength) val = " " + val;
//         sb.append(val);
//       }
//       sb.append("\n");
//     }
//     return sb.toString();
//   }
//   
//   public static String toString(double[][] a, int decimals) {
//     if (decimals < 0) throw new IllegalArgumentException("Number of decimals must be positive");
//     StringBuilder decs = new StringBuilder("0.");
//     for (int i = 0; i < decimals; i++) decs.append("0");
//     NumberFormat decimalsFormat = new DecimalFormat(decs.toString());
//     
//     StringBuilder sb = new StringBuilder();
//     for (int i=0; i<a.length; i++) {
//       for (int j=0; j<a[i].length; j++) {
//         sb.append(decimalsFormat.format(a[i][j])).append(" ");
//       }
//       sb.append("\n");
//     }
//     return sb.toString();
//   }
//   
//   public static void addNoise(double[][] s) {
//     for (int i=0; i<s.length; i++) {
//       for (int j=0; j<s[i].length; j++) {
//         s[i][j] = s[i][j] + (EPSILON * s[i][j] + REALMIN100) * Math.random();
//       }
//     }
//   }
//   
//   public static void addNoise(DoubleMatrix2D s) {
//     IntArrayList is = new IntArrayList();
//     IntArrayList ks = new IntArrayList();
//     DoubleArrayList vs = new DoubleArrayList();            
//     s.getNonZeros(is, ks, vs);
//     
//     for (int j=0; j<is.size(); j++) {
//       int i = is.get(j);
//       int k = ks.get(j);
//       double v = vs.get(j);
//       v = v + (EPSILON * v + REALMIN100) * Math.random();
//       s.setQuick(i, k, v);
//     }    
//   }
//   
// }


import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.impl.SparseDoubleMatrix2D;
import fr.lri.tao.apro.util.Logger;
import fr.lri.tao.apro.util.Utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
    int simCount = 0;
    String line;
    BufferedReader reader = new BufferedReader(new FileReader(similarities));
    while ((line = reader.readLine()) != null) {  
      List<String> tokens = getTokens(line, delimiters);
      int i = Integer.parseInt(tokens.get(0)) - base;
      int j = Integer.parseInt(tokens.get(1)) - base;
      Double v = Double.parseDouble(tokens.get(2));
      s.set(i, j, v);
      simCount++;
    }
    reader.close();
        
    
    double full = 100d * (simCount + n) / (n * n);
    Logger.info("[Loader] Loaded %d similarities, matrix is %f%% populated", simCount, full);
  }
  
  @Override
  public DoubleMatrix2D getMatrix() {
    return s;
  }
  
  @Override
  public int size() {
    return n;
  }

  @Override
  public void addNoise() {
// Path: src/fr/lri/tao/apro/util/Logger.java
// public class Logger {
// 
//   private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger("fr.lri.tao.apro");
//   
//   public static void info(String msg, Object... params) {
//     logger.info(String.format(msg, params));
//   }
//   
//   public static void warn(String msg, Object... params) {
//     logger.warning(String.format(msg, params));
//   }
//   
//   public static void warn(Throwable t) {
//     logger.warning(t.getMessage());
//   }
//   
//   public static void warn(Throwable t, String msg, Object... params) {
//     logger.warning(t.getMessage() + "\n" + String.format(msg, params));
//   }
//   
//   public static void error(String msg, Object... params) {
//     logger.severe(String.format(msg, params));
//   }
//   
//   public static void error(Throwable t) {
//     logger.severe(t.getMessage());
//   }
//   
//   public static void error(Throwable t, String msg, Object... params) {
//     logger.severe(t.getMessage() + "\n" + String.format(msg, params));
//   }
//   
//   public static void log(Level level, String msg) {
//     logger.log(level, msg);
//   }
//   
//   public static void main(String[] args) {
//     Logger.info("Test %d", 5);
//   }
// }
// 
// Path: src/fr/lri/tao/apro/util/Utils.java
// public class Utils {
//   
//   private static final double EPSILON = 1E-14;
//   private static final double REALMIN100 = 100 * Double.MIN_NORMAL;
//   
// 
//   public static String toString(double[][] a) {
//     int maxLength = 12;
//     StringBuilder sb = new StringBuilder();
//     for (int i=0; i<a.length; i++) {
//       for (int j=0; j<a[i].length; j++) {
//         String val = String.valueOf(a[i][j]);
//         maxLength = Math.max(maxLength, val.length());
//         while (val.length() < maxLength) val = " " + val;
//         sb.append(val);
//       }
//       sb.append("\n");
//     }
//     return sb.toString();
//   }
//   
//   public static String toString(double[][] a, int decimals) {
//     if (decimals < 0) throw new IllegalArgumentException("Number of decimals must be positive");
//     StringBuilder decs = new StringBuilder("0.");
//     for (int i = 0; i < decimals; i++) decs.append("0");
//     NumberFormat decimalsFormat = new DecimalFormat(decs.toString());
//     
//     StringBuilder sb = new StringBuilder();
//     for (int i=0; i<a.length; i++) {
//       for (int j=0; j<a[i].length; j++) {
//         sb.append(decimalsFormat.format(a[i][j])).append(" ");
//       }
//       sb.append("\n");
//     }
//     return sb.toString();
//   }
//   
//   public static void addNoise(double[][] s) {
//     for (int i=0; i<s.length; i++) {
//       for (int j=0; j<s[i].length; j++) {
//         s[i][j] = s[i][j] + (EPSILON * s[i][j] + REALMIN100) * Math.random();
//       }
//     }
//   }
//   
//   public static void addNoise(DoubleMatrix2D s) {
//     IntArrayList is = new IntArrayList();
//     IntArrayList ks = new IntArrayList();
//     DoubleArrayList vs = new DoubleArrayList();            
//     s.getNonZeros(is, ks, vs);
//     
//     for (int j=0; j<is.size(); j++) {
//       int i = is.get(j);
//       int k = ks.get(j);
//       double v = vs.get(j);
//       v = v + (EPSILON * v + REALMIN100) * Math.random();
//       s.setQuick(i, k, v);
//     }    
//   }
//   
// }


// Path: src/fr/lri/tao/apro/data/DSVProvider.java
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.impl.SparseDoubleMatrix2D;
import fr.lri.tao.apro.util.Logger;
import fr.lri.tao.apro.util.Utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

    int simCount = 0;
    String line;
    BufferedReader reader = new BufferedReader(new FileReader(similarities));
    while ((line = reader.readLine()) != null) {  
      List<String> tokens = getTokens(line, delimiters);
      int i = Integer.parseInt(tokens.get(0)) - base;
      int j = Integer.parseInt(tokens.get(1)) - base;
      Double v = Double.parseDouble(tokens.get(2));
      s.set(i, j, v);
      simCount++;
    }
    reader.close();
        
    
    double full = 100d * (simCount + n) / (n * n);
    Logger.info("[Loader] Loaded %d similarities, matrix is %f%% populated", simCount, full);
  }
  
  @Override
  public DoubleMatrix2D getMatrix() {
    return s;
  }
  
  @Override
  public int size() {
    return n;
  }

  @Override
  public void addNoise() {
    Utils.addNoise(s);