JDSymEigsBase.h
Go to the documentation of this file.
1 // Copyright (C) 2020 Netherlands eScience Center <J.Wehner@esciencecenter.nl>
2 //
3 // This Source Code Form is subject to the terms of the Mozilla
4 // Public License v. 2.0. If a copy of the MPL was not distributed
5 // with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #ifndef SPECTRA_JD_SYM_EIGS_BASE_H
8 #define SPECTRA_JD_SYM_EIGS_BASE_H
9 
10 #include <Eigen/Core>
11 #include <vector> // std::vector
12 #include <cmath> // std::abs, std::pow
13 #include <algorithm> // std::min
14 #include <stdexcept> // std::invalid_argument
15 #include <iostream>
16 
17 #include "Util/SelectionRule.h"
18 #include "Util/CompInfo.h"
19 #include "LinAlg/SearchSpace.h"
20 #include "LinAlg/RitzPairs.h"
21 
22 namespace Spectra {
23 
33 template <typename Derived, typename OpType>
35 {
36 protected:
38  using Scalar = typename OpType::Scalar;
41 
42  const OpType& m_matrix_operator; // object to conduct matrix operation,
43  // e.g. matrix-vector product
45  const Index m_number_eigenvalues; // number of eigenvalues requested
48  Index m_correction_size; // how many correction vectors are added in each iteration
49  RitzPairs<Scalar> m_ritz_pairs; // Ritz eigen pair structure
51 
52 private:
53  CompInfo m_info = CompInfo::NotComputed; // status of the computation
54 
55  void check_argument() const
56  {
57  if (m_number_eigenvalues < 1 || m_number_eigenvalues > m_matrix_operator.cols() - 1)
58  throw std::invalid_argument("nev must satisfy 1 <= nev <= n - 1, n is the size of matrix");
59  }
60 
61  void initialize()
62  {
63  // TODO better input validation and checks
65  {
67  }
69  {
72  }
73  }
74 
75 public:
76  JDSymEigsBase(OpType& op, Index nev, Index nvec_init, Index nvec_max) :
79  m_max_search_space_size(nvec_max < op.rows() ? nvec_max : 10 * m_number_eigenvalues),
80  m_initial_search_space_size(nvec_init < op.rows() ? nvec_init : 2 * m_number_eigenvalues),
82  {
84  initialize();
85  }
86 
87  JDSymEigsBase(OpType& op, Index nev) :
88  JDSymEigsBase(op, nev, 2 * nev, 10 * nev) {}
89 
93  void set_max_search_space_size(Index max_search_space_size)
94  {
95  m_max_search_space_size = max_search_space_size;
96  }
100  void set_correction_size(Index correction_size)
101  {
102  m_correction_size = correction_size;
103  }
104 
108  void set_initial_search_space_size(Index initial_search_space_size)
109  {
110  m_initial_search_space_size = initial_search_space_size;
111  }
112 
116  virtual ~JDSymEigsBase() {}
117 
122  CompInfo info() const { return m_info; }
123 
127  Index num_iterations() const { return niter_; }
128 
129  Vector eigenvalues() const { return m_ritz_pairs.ritz_values().head(m_number_eigenvalues); }
130 
131  Matrix eigenvectors() const { return m_ritz_pairs.ritz_vectors().leftCols(m_number_eigenvalues); }
132 
135  {
136  Derived& derived = static_cast<Derived&>(*this);
137  Matrix intial_space = derived.setup_initial_search_space(selection);
138  return compute_with_guess(intial_space, selection, maxit, tol);
139  }
140 
142  SortRule selection = SortRule::LargestMagn,
143  Index maxit = 100,
145 
146  {
147  m_search_space.initialize_search_space(initial_space);
148  niter_ = 0;
149  for (niter_ = 0; niter_ < maxit; niter_++)
150  {
151  bool do_restart = (m_search_space.size() > m_max_search_space_size);
152 
153  if (do_restart)
154  {
156  }
157 
158  m_search_space.update_operator_basis_product(m_matrix_operator);
159 
160  Eigen::ComputationInfo small_problem_info = m_ritz_pairs.compute_eigen_pairs(m_search_space);
161  if (small_problem_info != Eigen::ComputationInfo::Success)
162  {
164  break;
165  }
166  m_ritz_pairs.sort(selection);
167 
168  bool converged = m_ritz_pairs.check_convergence(tol, m_number_eigenvalues);
169  if (converged)
170  {
172  break;
173  }
174  else if (niter_ == maxit - 1)
175  {
177  break;
178  }
179  Derived& derived = static_cast<Derived&>(*this);
180  Matrix corr_vect = derived.calculate_correction_vector();
181 
182  m_search_space.extend_basis(corr_vect);
183  }
184  return (m_ritz_pairs.converged_eigenvalues()).template cast<Index>().head(m_number_eigenvalues).sum();
185  }
186 };
187 
188 } // namespace Spectra
189 
190 #endif // SPECTRA_JD_SYM_EIGS_BASE_H
Spectra::JDSymEigsBase::set_max_search_space_size
void set_max_search_space_size(Index max_search_space_size)
Definition: JDSymEigsBase.h:93
Spectra::JDSymEigsBase::m_search_space
SearchSpace< Scalar > m_search_space
Definition: JDSymEigsBase.h:50
Spectra::CompInfo::Successful
@ Successful
Computation was successful.
Spectra::JDSymEigsBase< DavidsonSymEigsSolver< OpType >, OpType >::Scalar
typename OpType::Scalar Scalar
Definition: JDSymEigsBase.h:38
Spectra::JDSymEigsBase::m_max_search_space_size
Index m_max_search_space_size
Definition: JDSymEigsBase.h:46
Spectra::JDSymEigsBase::m_correction_size
Index m_correction_size
Definition: JDSymEigsBase.h:48
Spectra::JDSymEigsBase::check_argument
void check_argument() const
Definition: JDSymEigsBase.h:55
Eigen::Success
@ Success
Definition: Constants.h:442
Spectra::JDSymEigsBase::set_initial_search_space_size
void set_initial_search_space_size(Index initial_search_space_size)
Definition: JDSymEigsBase.h:108
Spectra::JDSymEigsBase::eigenvectors
Matrix eigenvectors() const
Definition: JDSymEigsBase.h:131
Spectra::JDSymEigsBase::niter_
Index niter_
Definition: JDSymEigsBase.h:44
Spectra::JDSymEigsBase::initialize
void initialize()
Definition: JDSymEigsBase.h:61
Spectra::JDSymEigsBase::num_iterations
Index num_iterations() const
Definition: JDSymEigsBase.h:127
rows
int rows
Definition: Tutorial_commainit_02.cpp:1
Spectra::JDSymEigsBase::m_ritz_pairs
RitzPairs< Scalar > m_ritz_pairs
Definition: JDSymEigsBase.h:49
Spectra::SearchSpace
Definition: RitzPairs.h:18
Spectra::JDSymEigsBase::m_info
CompInfo m_info
Definition: JDSymEigsBase.h:53
Spectra::JDSymEigsBase::info
CompInfo info() const
Definition: JDSymEigsBase.h:122
Spectra::CompInfo::NotConverging
@ NotConverging
Spectra::JDSymEigsBase::set_correction_size
void set_correction_size(Index correction_size)
Definition: JDSymEigsBase.h:100
Spectra::RitzPairs
Definition: RitzPairs.h:23
Spectra::CompInfo
CompInfo
Definition: CompInfo.h:17
SearchSpace.h
CompInfo.h
Spectra::JDSymEigsBase::compute_with_guess
Index compute_with_guess(const Eigen::Ref< const Matrix > &initial_space, SortRule selection=SortRule::LargestMagn, Index maxit=100, Scalar tol=100 *Eigen::NumTraits< Scalar >::dummy_precision())
Definition: JDSymEigsBase.h:141
Spectra::CompInfo::NumericalIssue
@ NumericalIssue
Spectra::JDSymEigsBase::m_number_eigenvalues
const Index m_number_eigenvalues
Definition: JDSymEigsBase.h:45
RitzPairs.h
Spectra::JDSymEigsBase::~JDSymEigsBase
virtual ~JDSymEigsBase()
Definition: JDSymEigsBase.h:116
SelectionRule.h
Eigen::Ref< const Matrix >
Spectra::JDSymEigsBase::m_initial_search_space_size
Index m_initial_search_space_size
Definition: JDSymEigsBase.h:47
Spectra::JDSymEigsBase::JDSymEigsBase
JDSymEigsBase(OpType &op, Index nev, Index nvec_init, Index nvec_max)
Definition: JDSymEigsBase.h:76
Spectra::SortRule
SortRule
Definition: SelectionRule.h:33
Spectra::JDSymEigsBase::m_matrix_operator
const OpType & m_matrix_operator
Definition: JDSymEigsBase.h:42
Spectra::JDSymEigsBase
Definition: JDSymEigsBase.h:34
Spectra
Definition: LOBPCGSolver.h:19
Spectra::SortRule::LargestMagn
@ LargestMagn
gtsam::tol
const G double tol
Definition: Group.h:79
Spectra::JDSymEigsBase< DavidsonSymEigsSolver< OpType >, OpType >::Index
Eigen::Index Index
Definition: JDSymEigsBase.h:37
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic >
Spectra::JDSymEigsBase::JDSymEigsBase
JDSymEigsBase(OpType &op, Index nev)
Definition: JDSymEigsBase.h:87
Spectra::CompInfo::NotComputed
@ NotComputed
Eigen::ComputationInfo
ComputationInfo
Definition: Constants.h:440
Eigen::NumTraits
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:232
Spectra::JDSymEigsBase::eigenvalues
Vector eigenvalues() const
Definition: JDSymEigsBase.h:129
Scalar
SCALAR Scalar
Definition: bench_gemm.cpp:46
Eigen::Index
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Spectra::JDSymEigsBase::compute
Index compute(SortRule selection=SortRule::LargestMagn, Index maxit=100, Scalar tol=100 *Eigen::NumTraits< Scalar >::dummy_precision())
Definition: JDSymEigsBase.h:133


gtsam
Author(s):
autogenerated on Thu Apr 10 2025 03:01:45