SymGEigsShiftSolver.h
Go to the documentation of this file.
1 // Copyright (C) 2020-2025 Yixuan Qiu <yixuan.qiu@cos.name>
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_SYM_GEIGS_SHIFT_SOLVER_H
8 #define SPECTRA_SYM_GEIGS_SHIFT_SOLVER_H
9 
10 #include <utility> // std::move
11 #include "HermEigsBase.h"
12 #include "Util/GEigsMode.h"
16 
17 namespace Spectra {
18 
41 
42 // Empty class template
43 template <typename OpType, typename BOpType, GEigsMode Mode>
45 {};
46 
144 
145 // Partial specialization for mode = GEigsMode::ShiftInvert
146 template <typename OpType, typename BOpType>
147 class SymGEigsShiftSolver<OpType, BOpType, GEigsMode::ShiftInvert> :
148  public HermEigsBase<SymGEigsShiftInvertOp<OpType, BOpType>, BOpType>
149 {
150 private:
151  using Scalar = typename OpType::Scalar;
154 
157  using Base::m_nev;
158  using Base::m_ritz_val;
159 
161 
162  // Set shift and forward
164  {
165  op.set_shift(sigma);
166  return std::move(op);
167  }
168 
169  // First transform back the Ritz values, and then sort
170  void sort_ritzpair(SortRule sort_rule) override
171  {
172  // The eigenvalues we get from the iteration is nu = 1 / (lambda - sigma)
173  // So the eigenvalues of the original problem is lambda = 1 / nu + sigma
174  m_ritz_val.head(m_nev).array() = Scalar(1) / m_ritz_val.head(m_nev).array() + m_sigma;
175  Base::sort_ritzpair(sort_rule);
176  }
177 
178 public:
200  SymGEigsShiftSolver(OpType& op, BOpType& Bop, Index nev, Index ncv, const Scalar& sigma) :
201  Base(set_shift_and_move(ModeMatOp(op, Bop), sigma), Bop, nev, ncv),
202  m_sigma(sigma)
203  {}
204 };
205 
304 
305 // Partial specialization for mode = GEigsMode::Buckling
306 template <typename OpType, typename BOpType>
307 class SymGEigsShiftSolver<OpType, BOpType, GEigsMode::Buckling> :
308  public HermEigsBase<SymGEigsBucklingOp<OpType, BOpType>, BOpType>
309 {
310 private:
311  using Scalar = typename OpType::Scalar;
314 
317  using Base::m_nev;
318  using Base::m_ritz_val;
319 
321 
322  // Set shift and forward
324  {
325  if (sigma == Scalar(0))
326  throw std::invalid_argument("SymGEigsShiftSolver: sigma cannot be zero in the buckling mode");
327  op.set_shift(sigma);
328  return std::move(op);
329  }
330 
331  // First transform back the Ritz values, and then sort
332  void sort_ritzpair(SortRule sort_rule) override
333  {
334  // The eigenvalues we get from the iteration is nu = lambda / (lambda - sigma)
335  // So the eigenvalues of the original problem is lambda = sigma * nu / (nu - 1)
336  m_ritz_val.head(m_nev).array() = m_sigma * m_ritz_val.head(m_nev).array() /
337  (m_ritz_val.head(m_nev).array() - Scalar(1));
338  Base::sort_ritzpair(sort_rule);
339  }
340 
341 public:
363  SymGEigsShiftSolver(OpType& op, BOpType& Bop, Index nev, Index ncv, const Scalar& sigma) :
364  Base(set_shift_and_move(ModeMatOp(op, Bop), sigma), Bop, nev, ncv),
365  m_sigma(sigma)
366  {}
367 };
368 
396 
397 // Partial specialization for mode = GEigsMode::Cayley
398 template <typename OpType, typename BOpType>
399 class SymGEigsShiftSolver<OpType, BOpType, GEigsMode::Cayley> :
400  public HermEigsBase<SymGEigsCayleyOp<OpType, BOpType>, BOpType>
401 {
402 private:
403  using Scalar = typename OpType::Scalar;
406 
409  using Base::m_nev;
410  using Base::m_ritz_val;
411 
413 
414  // Set shift and forward
416  {
417  if (sigma == Scalar(0))
418  throw std::invalid_argument("SymGEigsShiftSolver: sigma cannot be zero in the Cayley mode");
419  op.set_shift(sigma);
420  return std::move(op);
421  }
422 
423  // First transform back the Ritz values, and then sort
424  void sort_ritzpair(SortRule sort_rule) override
425  {
426  // The eigenvalues we get from the iteration is nu = (lambda + sigma) / (lambda - sigma)
427  // So the eigenvalues of the original problem is lambda = sigma * (nu + 1) / (nu - 1)
428  m_ritz_val.head(m_nev).array() = m_sigma * (m_ritz_val.head(m_nev).array() + Scalar(1)) /
429  (m_ritz_val.head(m_nev).array() - Scalar(1));
430  Base::sort_ritzpair(sort_rule);
431  }
432 
433 public:
455  SymGEigsShiftSolver(OpType& op, BOpType& Bop, Index nev, Index ncv, const Scalar& sigma) :
456  Base(set_shift_and_move(ModeMatOp(op, Bop), sigma), Bop, nev, ncv),
457  m_sigma(sigma)
458  {}
459 };
460 
461 } // namespace Spectra
462 
463 #endif // SPECTRA_SYM_GEIGS_SHIFT_SOLVER_H
Spectra::SymGEigsShiftInvertOp
Definition: SymGEigsShiftInvertOp.h:28
Spectra::SymGEigsShiftSolver
Definition: SymGEigsShiftSolver.h:44
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::SymGEigsShiftSolver
SymGEigsShiftSolver(OpType &op, BOpType &Bop, Index nev, Index ncv, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:455
SymGEigsCayleyOp.h
Spectra::SymGEigsBucklingOp
Definition: SymGEigsBucklingOp.h:28
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::Index
Eigen::Index Index
Definition: SymGEigsShiftSolver.h:312
Spectra::GEigsMode::Buckling
@ Buckling
Buckling mode for generalized eigenvalue solver.
Cayley
Matrix Cayley(const Matrix &A)
Definition: testRot3.cpp:648
Eigen::Array
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:45
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::sort_ritzpair
void sort_ritzpair(SortRule sort_rule) override
Definition: SymGEigsShiftSolver.h:332
Spectra::SymGEigsCayleyOp
Definition: SymGEigsCayleyOp.h:28
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::Scalar
typename OpType::Scalar Scalar
Definition: SymGEigsShiftSolver.h:311
GEigsMode.h
sampling::sigma
static const double sigma
Definition: testGaussianBayesNet.cpp:170
HermEigsBase.h
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::m_sigma
const Scalar m_sigma
Definition: SymGEigsShiftSolver.h:412
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::Scalar
typename OpType::Scalar Scalar
Definition: SymGEigsShiftSolver.h:151
SymGEigsBucklingOp.h
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::m_sigma
const Scalar m_sigma
Definition: SymGEigsShiftSolver.h:320
Spectra::SymGEigsShiftInvertOp::set_shift
void set_shift(const Scalar &sigma)
Definition: SymGEigsShiftInvertOp.h:74
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::sort_ritzpair
void sort_ritzpair(SortRule sort_rule) override
Definition: SymGEigsShiftSolver.h:170
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::Index
Eigen::Index Index
Definition: SymGEigsShiftSolver.h:152
Spectra::GEigsMode::ShiftInvert
@ ShiftInvert
Shift-and-invert mode for generalized eigenvalue solver.
Spectra::SortRule
SortRule
Definition: SelectionRule.h:33
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::Scalar
typename OpType::Scalar Scalar
Definition: SymGEigsShiftSolver.h:403
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::set_shift_and_move
static ModeMatOp set_shift_and_move(ModeMatOp &&op, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:415
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::Index
Eigen::Index Index
Definition: SymGEigsShiftSolver.h:404
Spectra
Definition: LOBPCGSolver.h:19
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::m_sigma
const Scalar m_sigma
Definition: SymGEigsShiftSolver.h:160
Spectra::GEigsMode
GEigsMode
Definition: GEigsMode.h:17
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::set_shift_and_move
static ModeMatOp set_shift_and_move(ModeMatOp &&op, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:323
Spectra::HermEigsBase
Definition: HermEigsBase.h:44
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::SymGEigsShiftSolver
SymGEigsShiftSolver(OpType &op, BOpType &Bop, Index nev, Index ncv, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:200
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Buckling >::SymGEigsShiftSolver
SymGEigsShiftSolver(OpType &op, BOpType &Bop, Index nev, Index ncv, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:363
Spectra::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::Cayley >::sort_ritzpair
void sort_ritzpair(SortRule sort_rule) override
Definition: SymGEigsShiftSolver.h:424
SymGEigsShiftInvertOp.h
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::SymGEigsShiftSolver< OpType, BOpType, GEigsMode::ShiftInvert >::set_shift_and_move
static ModeMatOp set_shift_and_move(ModeMatOp &&op, const Scalar &sigma)
Definition: SymGEigsShiftSolver.h:163


gtsam
Author(s):
autogenerated on Thu Apr 10 2025 03:04:25