1 //
2 //  Copyright (C) 2004-2006 Rational Discovery LLC
3 //
4 //   @@ All Rights Reserved @@
5 //  This file is part of the RDKit.
6 //  The contents are covered by the terms of the BSD license
7 //  which is included in the file license.txt, found at the root
8 //  of the RDKit source tree.
9 //
10 
11 #include <RDGeneral/export.h>
12 #ifndef _RD_POWER_EIGENSOLVER_H
13 #define _RD_POWER_EIGENSOLVER_H
14 
15 #include <Numerics/Vector.h>
16 #include <Numerics/Matrix.h>
17 #include <Numerics/SymmMatrix.h>
18 
19 namespace RDNumeric {
20 namespace EigenSolvers {
21 //! Compute the \c numEig largest eigenvalues and, optionally,  the
22 // corresponding
23 //! eigenvectors.
24 /*!
25 
26 \param numEig       the number of eigenvalues we are interested in
27 \param mat          symmetric input matrix of dimension N*N
28 \param eigenValues  Vector used to return the eigenvalues (size = numEig)
29 \param eigenVectors Optional matrix used to return the eigenvectors (size =
30 N*numEig)
31 \param seed         Optional values to seed the random value generator used to
32                     initialize the eigen vectors
33 \return a boolean indicating whether or not the calculation converged.
34 
35 <b>Notes:</b>
36 - The matrix, \c mat, is changed in this function
37 
38 <b>Algorithm:</b>
39 
40 We use the iterative power method, which works like this:
41 
42 \verbatim
43  u = arbitrary unit vector
44  tol = 0.001
45  currEigVal = 0.0;
46  prevEigVal = -1.0e100
47  while (abs(currEigVal - prevEigVal) > tol) :
48      v = Au
49      prevEigVal = currEigVal
50      currEigVal = v[i] // where i is the id of the largest absolute component
51      u = c*v
52 \endverbatim
53 
54 
55 */
56 bool RDKIT_EIGENSOLVERS_EXPORT powerEigenSolver(
57     unsigned int numEig, DoubleSymmMatrix &mat, DoubleVector &eigenValues,
58     DoubleMatrix *eigenVectors = nullptr, int seed = -1);
59 //! \overload
60 static inline bool powerEigenSolver(unsigned int numEig, DoubleSymmMatrix &mat,
61                                     DoubleVector &eigenValues,
62                                     DoubleMatrix &eigenVectors, int seed = -1) {
63   return powerEigenSolver(numEig, mat, eigenValues, &eigenVectors, seed);
64 }
65 };  // namespace EigenSolvers
66 };  // namespace RDNumeric
67 
68 #endif
69