package GeDBIT.index.algorithms; import java.util.List; import GeDBIT.dist.Metric; import GeDBIT.type.IndexObject; @SuppressWarnings("serial") public class EigenOnFFT implements PivotSelectionMethod, java.io.Serializable { // private static final long serialVersionUID = 6928847050089693231L; @SuppressWarnings("unused") private final int FFTScale; public EigenOnFFT(int scale) { this.FFTScale = scale; } public int[] selectPivots(Metric metric, List<? extends IndexObject> data, int numPivots) { final int dataSize = data.size(); if (numPivots >= dataSize) { int[] pivots = new int[dataSize]; for (int i = 0; i < dataSize; i++) pivots[i] = i; return IncrementalSelection.removeDuplicate(metric, data, pivots); } /* * // run fft to get a candidate set int[] fftResult = * PivotSelectionMethods.FFT.selectPivots(metric, data, numPivots * * FFTScale); * * // compute the distance matrix if (fftResult.length <= * Math.min(dataSize, numPivots)) return fftResult; */ // DoubleMatrix2D matrix = // LargeDenseDoubleMatrix2D.createDoubleMatrix2D(dataSize, // fftResult.length); double matrix[][] = new double[dataSize][dataSize]; for (int col = 0; col < dataSize; col++) for (int row = 0; row < dataSize; row++) // matrix.set(row, col, metric.getDistance(data.get(row), // data.get(fftResult[col]))); matrix[row][col] = metric.getDistance(data.get(row), data.get(col)); // compute eigen value Eigen eigen = new Eigen(matrix); eigen.calEigen(); int[] result = eigen.getEigen(); // eigen.printEigenDouble(); // eigen.printEigenFloat(); // eigen.printEigenFloatPositive(); eigen.printBiggestEigen(dataSize); return result; } /* * (non-Javadoc) * * @see * GeDBIT.index.algorithms.PivotSelectionMethod#selectPivots(GeDBIT.dist * .Metric, java.util.List, int, int, int) */ public int[] selectPivots(Metric metric, List<? extends IndexObject> data, int first, int dataSize, int numPivots) { int[] result = selectPivots(metric, data.subList(first, dataSize), numPivots); for (int i = 0; i < result.length; i++) result[i] += first; return result; } }