/*
 * SpectralCluster.java
 *
 * Created on February 23, 2007, 11:00 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package medusa.spectral;

import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.impl.SparseDoubleMatrix2D;
import cern.colt.matrix.linalg.Algebra;
import cern.colt.matrix.linalg.EigenvalueDecomposition;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;
import medusa.graph.Edge;
import medusa.graph.Graph;

/**
 *
 * @author shooper
 */
public class SparseSpectralCluster {

    private SparseSimilarityCollection sc;
    private IndexedValue[] ivs;
    private DoubleMatrix2D Y;
    private DoubleMatrix2D S;
    private double secondEig = 0.0;

    public double getSecondEig() {
        return secondEig;
    }

    /** Creates a new instance of SpectralCluster */
    public SparseSpectralCluster() {
    }

    // methods we need
    private IndexedValue[] sortDesc(final double[] arr) {
        // first index the data
        IndexedValue[] ivs = new IndexedValue[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ivs[i] = new IndexedValue(arr[i], i);
        }

        // then reorder
        Arrays.sort(ivs, Collections.reverseOrder());
        return ivs;
    }

    private IndexedValue[] sortAsc(final double[] arr) {
        // first index the data
        IndexedValue[] ivs = new IndexedValue[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ivs[i] = new IndexedValue(arr[i], i);
        }

        // then reorder
        Arrays.sort(ivs);
        return ivs;
    }

//      private double EigenSum(IndexedValue[] ivs){
//          double absSum=0.o;
//      }
//          for (int i=0; i getVector(DoubleMatrix2D a, IndexedValue[] ivs){
//        Vector v = new Vector();
//        //double[][] data=a.getArrayCopy();
//        String label;
//        for (int i=0; i getVector(Matrix a, IndexedValue[] ivs){
//        Vector v = new Vector();
//        double[][] data=a.getArrayCopy();
//        String label;
//        for (int i=0; i epsilon
        return 0;

    }

    private int nPositiveEvals(IndexedValue[] ivs) {
        // assume the ivs are sorted
        int pos = 0;
        for (int k = 0; k < ivs.length; k++) {
            if (ivs[k].getValue() < 0.00) {
                return pos;
            }
            pos++;
        }
        return pos;
    }

//    private DoubleMatrix2D symmetric(DoubleMatrix2D S){
//        // make sure matrix is symmetric
//        for (int row=0; row < S.rows(); row++) {
//            for (int column=0; column < S.columns(); column++) {
//                S.setQuick(column,row,S.get(row,column));
//            }
//        }
//        double[][] data= S.getArrayCopy();
//        for (int i=0; i getVector(int k) {
        Vector v = new Vector();
        //System.out.println(k+" "+Y.getRowDimension());

        // get k best evecs
        //Matrix subY=Y.getMatrix(0,Y.getRowDimension()-1,0,k-1);
        DoubleMatrix2D subY = Y.viewPart(0, 0, Y.rows(), k);
        Y = null;

        normalizeToUnitLength(subY);


        //double[][] data=subY.getArrayCopy();
        double[][] data = subY.toArray();
        //System.out.println("");
        String label;

        KMeansPoint dmd;
        for (int i = 0; i < data.length; i++) {
            label = (new Integer(i)).toString();
            dmd = new KMeansPoint(label, data[i]);
            //System.out.println("Adding datapoint "+label+" "+dmd.toString());
            v.add(dmd);
        }
        return v;
    }

    public void cluster(int k) {
        //System.out.println("debug 335");
        int nClusters = k;
        if (k == 0) {
            nClusters = nPositiveEvals(ivs);
        //System.out.println("Determining number of clusters to "+nClusters);
        }
        //Y.print(3,3);
        // convert to datapoints
        //System.out.println("convert to datapoints");
        Vector dataPoints = getVector(nClusters);
        // k-means clustering of eigenvectors

        KMeans km = new KMeans(nClusters, dataPoints);

        // and run the kmeans
        km.runKMeans();

        //System.out.println(km);
        niceReport(km.getClusters(), sc);
        
        
        // play with coloring
       
//        Vector result=km.getVector();
//        for (int i=0; i ");
        System.out.println("If clusters are omitted, all positive eigenvalues will ");
        System.out.println("be considered");
        System.out.println("HINT: For memory-intense use, set the heap sizes");
        System.out.println("with -Xmx800m (max size) and -Xms250m (initial size).");
        System.out.println("Change these parameters according to your system.");
        System.out.println("");
        System.out.println("Sean Hooper 2007");
    }

    public boolean isDebug() {
        return debug;
    }

    public void setDebug(boolean debug) {
        this.debug = debug;
    }

// private helper class for spectral clusterer
    private class IndexedValue implements Comparable {

        double value;
        int index;

        public IndexedValue(double value, int index) {
            this.value = value;
            this.index = index;
        }

        public double getValue() {
            return value;
        }

        public double getAbsoluteValue() {
            return Math.abs(value);
        }

        public int getIndex() {
            return index;
        }

        public int compareTo(Object o2) {
            // compare by absolute values!
            IndexedValue i2 = (IndexedValue) o2;
//        if (getAbsoluteValue() 

Ads help maintain this website.