// Path: src/fr/lri/tao/apro/data/points/Points.java
// public class Points extends ArrayList<Point> {
//   
//   private final Map<Long, Point> pointMap = new HashMap<Long, Point>();
//   
//   @Override
//   public boolean add(Point point) {    
//     this.pointMap.put(point.getId(), point);
//     return super.add(point);
//   }
//   
//   public Point getByIndex(int index) {
//     return this.get(index);
//   }
//   
//   public Point getById(long id) {
//     return pointMap.get(id);
//   }
//   
//   public int indexOf(Point point) {
//     long id = point.getId();
//     for (int i = 0; i < this.size(); i++) {
//       if (this.get(i).getId() == id) return i;
//     }
//     return -1;  
//   }
//   
//   
//   @Override
//   public String toString() {
//     StringBuilder sb = new StringBuilder();
//     sb.append(size()).append(" points: ");
//     for (Point point: this) sb.append(" ").append(point);
//     return sb.toString();
//   }
//   
//   public void shuffle() {
//     Random random = new Random();
//     for (int i = 0; i < size(); i++) {
//       int j = random.nextInt(size());
//       Point point1 = this.get(i);
//       Point point2 = this.get(j);
//       this.set(i, point2);
//       this.set(j, point1);      
//     }
//   }
//   
//      
// }
// 
// Path: src/fr/lri/tao/apro/data/points/Point.java
// public class Point {
// 
//   public final long id;
//   public final double[] features;
//   
//   /** Create a point with an ID and a list of numerical features */
//   public Point(long id, double[] features) {
//     this.id = id;
//     this.features = features;
//   }
//   
//   public long getId() {
//     return id;
//   }
//   
//   /** Create a point with an ID and a collection of numerical features */
//   public Point(long id, Collection<Double> features) {
//     this.id = id;
//     this.features = new double[features.size()];
//     int i = 0;
//     for (Double d: features) {
//       this.features[i++] = d;
//     }
//   }
//   
//   /** Array of point features */
//   public double[] getFeatures() {
//     return features;
//   }
//   
//   /** Euclidean distance between two points */
//   public double distance(Point p) {
//     double s = 0;
//     for (int i=0; i<Math.min(features.length, p.features.length); i++) {
//       double d = features[i] - p.features[i];
//       s += d * d;
//     }
//     return Math.sqrt(s);
//   }
//   
//   /** Default similarity between two points defined as negative squared distance */
//   public double similarity(Point p) {
//     double s = 0;
//     int len = Math.min(features.length, p.features.length);
//     for (int i=0; i<len; i++) {
//       double d = features[i] - p.features[i];
//       s += d * d;
//     }
//     return -s;
//   }
// 
//   @Override
//   public String toString() {
//     StringBuilder sb = new StringBuilder();
//     sb.append("Point ").append(id).append(" (");
//     for (int i=0; i<features.length; i++) {
//       if (i > 0) sb.append(", ");
//       sb.append(features[i]);
//     }
//     sb.append(")");
//     return sb.toString();
//   }
//   
//   @Override
//   public boolean equals(Object o) {
//     Point p = (Point) o;
//     return p.id == this.id;
//   }
// 
//   @Override
//   public int hashCode() {
//     return (int) id;
//   }
//   
// }


import fr.lri.tao.apro.data.points.Points;
import fr.lri.tao.apro.data.points.Point;
import java.util.ArrayList;
package fr.lri.tao.apro.hiap;


/** Helper class for splitting the set of points into n subsets */
public class DataParts extends ArrayList<Points> {

  /**
   * @param points The integral set of points to be split
   * @param n Number of sets to split the set into
   */
  public DataParts(Points points, int n) {
    final Points[] parts = new Points[n];
    for (int i = 0; i < n; i++) {
      parts[i] = new Points();
      this.add(parts[i]);
    }
        
    for (int i = 0; i < points.size(); i++) {
// Path: src/fr/lri/tao/apro/data/points/Points.java
// public class Points extends ArrayList<Point> {
//   
//   private final Map<Long, Point> pointMap = new HashMap<Long, Point>();
//   
//   @Override
//   public boolean add(Point point) {    
//     this.pointMap.put(point.getId(), point);
//     return super.add(point);
//   }
//   
//   public Point getByIndex(int index) {
//     return this.get(index);
//   }
//   
//   public Point getById(long id) {
//     return pointMap.get(id);
//   }
//   
//   public int indexOf(Point point) {
//     long id = point.getId();
//     for (int i = 0; i < this.size(); i++) {
//       if (this.get(i).getId() == id) return i;
//     }
//     return -1;  
//   }
//   
//   
//   @Override
//   public String toString() {
//     StringBuilder sb = new StringBuilder();
//     sb.append(size()).append(" points: ");
//     for (Point point: this) sb.append(" ").append(point);
//     return sb.toString();
//   }
//   
//   public void shuffle() {
//     Random random = new Random();
//     for (int i = 0; i < size(); i++) {
//       int j = random.nextInt(size());
//       Point point1 = this.get(i);
//       Point point2 = this.get(j);
//       this.set(i, point2);
//       this.set(j, point1);      
//     }
//   }
//   
//      
// }
// 
// Path: src/fr/lri/tao/apro/data/points/Point.java
// public class Point {
// 
//   public final long id;
//   public final double[] features;
//   
//   /** Create a point with an ID and a list of numerical features */
//   public Point(long id, double[] features) {
//     this.id = id;
//     this.features = features;
//   }
//   
//   public long getId() {
//     return id;
//   }
//   
//   /** Create a point with an ID and a collection of numerical features */
//   public Point(long id, Collection<Double> features) {
//     this.id = id;
//     this.features = new double[features.size()];
//     int i = 0;
//     for (Double d: features) {
//       this.features[i++] = d;
//     }
//   }
//   
//   /** Array of point features */
//   public double[] getFeatures() {
//     return features;
//   }
//   
//   /** Euclidean distance between two points */
//   public double distance(Point p) {
//     double s = 0;
//     for (int i=0; i<Math.min(features.length, p.features.length); i++) {
//       double d = features[i] - p.features[i];
//       s += d * d;
//     }
//     return Math.sqrt(s);
//   }
//   
//   /** Default similarity between two points defined as negative squared distance */
//   public double similarity(Point p) {
//     double s = 0;
//     int len = Math.min(features.length, p.features.length);
//     for (int i=0; i<len; i++) {
//       double d = features[i] - p.features[i];
//       s += d * d;
//     }
//     return -s;
//   }
// 
//   @Override
//   public String toString() {
//     StringBuilder sb = new StringBuilder();
//     sb.append("Point ").append(id).append(" (");
//     for (int i=0; i<features.length; i++) {
//       if (i > 0) sb.append(", ");
//       sb.append(features[i]);
//     }
//     sb.append(")");
//     return sb.toString();
//   }
//   
//   @Override
//   public boolean equals(Object o) {
//     Point p = (Point) o;
//     return p.id == this.id;
//   }
// 
//   @Override
//   public int hashCode() {
//     return (int) id;
//   }
//   
// }


// Path: src/fr/lri/tao/apro/hiap/DataParts.java
import fr.lri.tao.apro.data.points.Points;
import fr.lri.tao.apro.data.points.Point;
import java.util.ArrayList;

package fr.lri.tao.apro.hiap;


/** Helper class for splitting the set of points into n subsets */
public class DataParts extends ArrayList<Points> {

  /**
   * @param points The integral set of points to be split
   * @param n Number of sets to split the set into
   */
  public DataParts(Points points, int n) {
    final Points[] parts = new Points[n];
    for (int i = 0; i < n; i++) {
      parts[i] = new Points();
      this.add(parts[i]);
    }
        
    for (int i = 0; i < points.size(); i++) {
      Point point = points.getByIndex(i);