package beast.evolution.substitutionmodel;
/**
* A storage structure to hold an Eigen Decomposition of a rate matrix.
* This encapsulates everything and facilitates copying for store/restore
* mechanisms.
*
* @author Andrew Rambaut
* @author Alexei Drummond
* @author Marc A. Suchard
*/
public class EigenDecomposition {
public EigenDecomposition(double[] evec, double[] ievc, double[] eval) {
Evec = evec;
Ievc = ievc;
Eval = eval;
Evali = null;
}
public EigenDecomposition(double[] evec, double[] ievc, double[] eval, double[] evali) {
Evec = evec;
Ievc = ievc;
Eval = eval;
Evali = evali; // the imaginary parts are being ignored at the moment
}
public EigenDecomposition copy() {
double[] evec = Evec.clone();
double[] ievc = Ievc.clone();
double[] eval = Eval.clone();
return new EigenDecomposition(evec, ievc, eval);
}
/**
* This function returns the Eigen vectors.
*
* @return the array
*/
public final double[] getEigenVectors() {
return Evec;
}
/**
* This function returns the inverse Eigen vectors.
*
* @return the array
*/
public final double[] getInverseEigenVectors() {
return Ievc;
}
/**
* This function returns the Eigen values.
*
* @return the Eigen values
*/
public final double[] getEigenValues() {
return Eval;
}
/**
* This function returns the imaginary part of the Eigen values.
*
* @return the Eigen values
*/
public final double[] getImEigenValues() {
return Evali;
}
/**
* This functions returns true if the diagonalization may be complex
*
* @return bool
*/
public boolean canReturnComplexDiagonalization() {
return false;
}
/**
* This function rescales the eigen values; this is more stable than
* rescaling the original Q matrix, also O(stateCount) instead of O(stateCount^2)
*/
public void normalizeEigenValues(double scale) {
int dim = Eval.length;
for (int i = 0; i < dim; i++)
Eval[i] /= scale;
}
public Boolean hasImagEigenvectors() {
if (Evali == null) return false;
for (int i = 0; i < Evali.length; i++)
if (Evali[i] != 0) {
// System.err.println("Imaginary eigenvectors found. Discard.");
return true;
}
return false;
}
// Eigenvalues, eigenvectors, and inverse eigenvectors
private final double[] Evec;
private final double[] Ievc;
private final double[] Eval;
private final double[] Evali; // imaginary part of eigenvalues
}