package GeDBIT.index.algorithms;
import cern.colt.matrix.DoubleMatrix2D;
import cern.colt.matrix.impl.DenseDoubleMatrix2D;
//import cern.colt.matrix.linalg.Algebra;
import cern.colt.matrix.linalg.EigenvalueDecomposition;
public class Eigen {
double x[][];
DoubleMatrix2D x_matrix;
DoubleMatrix2D eigen_matrix;
float float_positive_result[];
float sort_result[];
// construction function
public Eigen(double[][] m_x) {
x = m_x;
x_matrix = new DenseDoubleMatrix2D(x);
float_positive_result = new float[x_matrix.columns()];
sort_result = new float[x_matrix.columns()];
}
public int calEigen() {
EigenvalueDecomposition eigen_cal = new EigenvalueDecomposition(
x_matrix);
eigen_matrix = eigen_cal.getD();
@SuppressWarnings("unused")
int[] result = getEigen();
sort();
return 0;
}
public int[] getEigen() {
int[] result = new int[eigen_matrix.columns()];
for (int i = 0; i < eigen_matrix.columns(); i++) {
// result[i] = eigen_matrix.get(i, i);
Double double_temp = eigen_matrix.get(i, i);
if (double_temp < 0)
double_temp = -double_temp;
Float float_temp = double_temp.floatValue();
float_positive_result[i] = float_temp;
result[i] = float_temp.intValue();
}
return result;
}
public int printEigenDouble() {
// int i = 0;
for (int i = 0; i < eigen_matrix.columns(); i++)
System.out.println(eigen_matrix.get(i, i) + " ");
System.out.println();
return 0;
}
public int printEigenFloat() {
for (int i = 0; i < eigen_matrix.columns(); i++) {
Double temp_double = eigen_matrix.get(i, i);
System.out.printf("%.3f", temp_double.floatValue());
// System.out.print(" ");
System.out.println();
}
System.out.println();
return 0;
}
public int printEigenFloatPositive() {
for (int i = 0; i < eigen_matrix.columns(); i++) {
// Double temp_double = eigen_matrix.get(i, i);
// if(temp_double<0)
// temp_double = -temp_double;
// System.out.printf("%.3f\n", temp_double.floatValue());
// float_positive_result[i] = temp_double.floatValue();
System.out.printf("%.3f\n", float_positive_result[i]);
}
return 0;
}
public int sort() {
int n = eigen_matrix.columns();
float temp = 0;
for (int i = 0; i < n; i++)
sort_result[i] = float_positive_result[i];
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (sort_result[i] < sort_result[j]) {
temp = sort_result[i];
sort_result[i] = sort_result[j];
sort_result[j] = temp;
}
// for(int i=0; i<n; i++)
// System.out.printf("%.3f\n", sort_result[i]);
return 0;
}
public int calPivotNumber() {
int n = eigen_matrix.columns();
double maxratio = 0.0;
int numPivot = 0;
for (int i = 1; i < n - 1; i++) {
double ratio = sort_result[i] / sort_result[i + 1];
if (ratio > maxratio) {
maxratio = ratio;
numPivot = i;
}
}
return numPivot + 1;
}
public int printBiggestEigen(int n) {
// sort();
for (int i = 0; i < n; i++)
System.out.printf("%.3f\n", sort_result[i]);
// System.out.printf("%.3f\n", float_positive_result[i]);
return 0;
}
public int printSortResult() {
int n = eigen_matrix.columns();
System.out.println("Eigen result::::::");
for (int i = 0; i < n; i++)
System.out.println(sort_result[i]);
System.out.println("::::::::::::::::");
return 0;
}
}