/*
 * Copyright (c) 2002-2006 Samit Basu
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#ifndef __EigenDecompose_hpp__
#define __EigenDecompose_hpp__

/**
 * Compute the eigen decomposition of an arbitrary, real valued
 * matrix of size $$n \times n$$.  The $$n \times n$$ matrix of
 * real eigenvectors are stored in the array v, which must be 
 * pre-allocated before the routine is called.  The $$n$$ complex 
 * eigenvalues are stored in the array d, with the real and 
 * imaginary parts stored sequentially.
 */
void floatEigenDecompose(int n, float *v, float *d, float *a,
			 bool eigenvectors, bool balance);
void floatEigenDecomposeSymmetric(int n, float *v, float *d, float *a,
				  bool eigenvectors);
void floatGenEigenDecompose(int n, float *v, float *d, float *a,
			    float *b, bool eigenvectors);
bool floatGenEigenDecomposeSymmetric(int n, float *v, float *d,
				     float *a, float *b, bool eigenvectors);
/**
 * Compute the eigen decomposition of an arbitrary, complex valued
 * matrix of size $$n \times n$$.  The $$n \times n$$ matrix of
 * complex eigenvectors are stored in the array v, which must be 
 * pre-allocated before the routine is called.  The $$n$$ complex 
 * eigenvalues are stored in the array d.
 */
void complexEigenDecompose(int n, float *v, float *d, float *a,
			   bool eigenvectors, bool balance);
void complexEigenDecomposeSymmetric(int n, float *v, float *d, 
				    float *a, bool eigenvectors);
void complexGenEigenDecompose(int n, float *v, float *d, float *a,
			      float *b, bool eigenvectors);
bool complexGenEigenDecomposeSymmetric(int n, float *v, float *d,
				       float *a, float *b, 
				       bool eigenvectors);
/**
 * Compute the eigen decomposition of an arbitrary, double valued
 * matrix of size $$n \times n$$.  The $$n \times n$$ matrix of
 * double eigenvectors are stored in the array v, which must be 
 * pre-allocated before the routine is called.  The $$n$$ dcomplex 
 * eigenvalues are stored in the array d, with the real and 
 * imaginary parts stored sequentially.
 */
void doubleEigenDecompose(int n, double *v, double *d, double *a,
			  bool eigenvectors, bool balance);
void doubleEigenDecomposeSymmetric(int n, double *v, double *d, 
				   double *a, bool eigenvectors);
void doubleGenEigenDecompose(int n, double *v, double *d, double *a,
			     double *b, bool eigenvectors);
bool doubleGenEigenDecomposeSymmetric(int n, double *v, double *d,
				      double *a, double *b, 
				      bool eigenvectors);
/**
 * Compute the eigen decomposition of an arbitrary, dcomplex valued
 * matrix of size $$n \times n$$.  The $$n \times n$$ matrix of
 * dcomplex eigenvectors are stored in the array v, which must be 
 * pre-allocated before the routine is called.  The $$n$$ dcomplex 
 * eigenvalues are stored in the array d.
 */
void dcomplexEigenDecompose(int n, double *v, double *d, double *a,
			    bool eigenvectors, bool balance);
void dcomplexEigenDecomposeSymmetric(int n, double *v, double *d, 
				     double *a, bool eigenvectors);
void dcomplexGenEigenDecompose(int n, double *v, double *d, double *a,
			       double *b, bool eigenvectors);
bool dcomplexGenEigenDecomposeSymmetric(int n, double *v, double *d,
					double *a, double *b, 
					bool eigenvectors);

#endif


syntax highlighted by Code2HTML, v. 0.9.1