PersistentLaplacians
eigs_algorithms.hpp
Go to the documentation of this file.
1 #ifndef eigs_algs_H
2 #define eigs_algs_H
3 
4 #include "../typedefs.hpp"
5 #include "Eigen/Eigenvalues"
6 #include "Eigen/SVD"
7 #include "../PersistentLaplacians.hpp"
8 namespace PersistentLaplacians{
9 
10  // wrapper classes for all algorithms to compute eigenvalues.
11  // just need to implement at least one of the following signatures (or both if wrapping with python):
12 
13  // spectra_vec eigenvalues(DenseMatrix_PL &L);
14  // std::pair<spectra_vec,DenseMatrix_spectra_PL> eigenpairs(DenseMatrix_PL &L);
15 
16  // The "eigenvalues" function is necessary if you call the "spectra" function of a PersistentLaplacian,
17  // The "eigenpairs" function is necessary if you call the "eigenpairs" function of a PersistentLaplacian.
18  // The python wrapping code requires both, but for a c++ only version you can just use one.
19 
20 
21  // Wrapper for Eigen's SelfAdjointEigenSolver
22  class selfadjoint{
23  public:
25  Eigen::SelfAdjointEigenSolver<DenseMatrix_PL> es = Eigen::SelfAdjointEigenSolver<DenseMatrix_PL>(L, Eigen::EigenvaluesOnly);
26  spectra_vec eigs = es.eigenvalues();
27  round_zeros(eigs, 1e-3);
28  return eigs;
29  }
30  std::pair<spectra_vec,DenseMatrix_spectra_PL> eigenpairs(DenseMatrix_PL &L){
31  Eigen::SelfAdjointEigenSolver<DenseMatrix_PL> es = Eigen::SelfAdjointEigenSolver<DenseMatrix_PL>(L);
32  spectra_vec eigs = es.eigenvalues();
33  DenseMatrix_spectra_PL eigvs = es.eigenvectors();
34  round_zeros(eigs, 1e-3);
35  return std::pair<spectra_vec,DenseMatrix_spectra_PL>(eigs, eigvs);
36  }
37  };
38 
39  // Wrapper for Eigen's standard EigenSolver (does not assume self-adjoint)
40  class eigensolver{
41  public:
43  Eigen::EigenSolver<DenseMatrix_PL> es = Eigen::EigenSolver<DenseMatrix_PL>(L, Eigen::EigenvaluesOnly);
44  spectra_vec eigs = es.eigenvalues().real();
45  round_zeros(eigs, 1e-3);
46  std::sort(eigs.begin(), eigs.end()); // Eigen::Eigensolver returns unsorted
47  return eigs;
48  }
49  // TODO: this is placeholder
50  std::pair<spectra_vec,DenseMatrix_spectra_PL> eigenpairs(DenseMatrix_PL &L){
51  Eigen::SelfAdjointEigenSolver<DenseMatrix_PL> es = Eigen::SelfAdjointEigenSolver<DenseMatrix_PL>(L);
52  spectra_vec eigs = es.eigenvalues();
53  DenseMatrix_spectra_PL eigvs = es.eigenvectors();
54  round_zeros(eigs, 1e-3);
55  return std::pair<spectra_vec,DenseMatrix_spectra_PL>(eigs, eigvs);
56  }
57  };
58 
59  // // Wrapper for Eigen's standard EigenSolver (does not assume self-adjoint) that gives eigenvectors too
60  // class eigensolver_v{
61  // public:
62  // std::pair<spectra_vec,DenseMatrix_spectra_PL> operator()(DenseMatrix_PL &L){
63  // Eigen::EigenSolver<DenseMatrix_PL> es = Eigen::EigenSolver<DenseMatrix_PL>(L); // Eigen::Eigensolver returns unsorted
64  // spectra_vec eigs = es.eigenvalues().real();
65  // DenseMatrix_spectra_PL eigvs = es.eigenvectors().real();
66 
67  // // sort eigenvectors and eigenvalues together - wrap in custom struct
68  // int num_eigs = eigs.size();
69  // std::vector<Eigenpair> eigenpairs;
70  // eigenpairs.reserve(num_eigs);
71 
72  // for (int i = 0; i < num_eigs; i++){
73  // Eigenpair p = {eigs[i], eigvs.col(i)};
74  // eigenpairs.push_back(p);
75  // }
76  // round_zeros(eigs, 1e-3);
77 
78  // std::sort(eigenpairs.begin(), eigenpairs.end(),
79  // [](const auto& a, const auto& b) {return a.eig < b.eig;}); // custom comparator for sorting
80 
81  // spectra_vec eigs_sorted(num_eigs);
82  // DenseMatrix_spectra_PL eigvs_sorted(eigvs.rows(),eigvs.cols());
83 
84  // for (int i = 0; i < num_eigs; i++){
85  // eigs_sorted[i] = eigenpairs[i].eig;
86  // eigvs_sorted.col(i) = eigenpairs[i].eigv;
87  // }
88 
89 
90  // return std::pair<spectra_vec,DenseMatrix_spectra_PL>(eigs_sorted, eigvs_sorted);
91  // }
92  // private:
93  // struct Eigenpair{
94  // spectra_type eig;// one eigenvalue
95  // DenseMatrix_spectra_PL eigv; // one eigenvector
96  // };
97 
98  // };
99 
100  // Wrapper for Eigen's BDCSVD singular value decomposition
101  class bdcsvd{
102  public:
104  Eigen::BDCSVD<DenseMatrix_PL> bdcsvd(L.rows(), L.cols());
105  bdcsvd.compute(L);
106  spectra_vec eigs = bdcsvd.singularValues();
107  round_zeros(eigs, 1e-3);
108  std::sort(eigs.begin(), eigs.end());
109  return eigs;
110  }
111  // TODO: this is placeholder
112  std::pair<spectra_vec,DenseMatrix_spectra_PL> eigenpairs(DenseMatrix_PL &L){
113  Eigen::SelfAdjointEigenSolver<DenseMatrix_PL> es = Eigen::SelfAdjointEigenSolver<DenseMatrix_PL>(L);
114  spectra_vec eigs = es.eigenvalues();
115  DenseMatrix_spectra_PL eigvs = es.eigenvectors();
116  round_zeros(eigs, 1e-3);
117  return std::pair<spectra_vec,DenseMatrix_spectra_PL>(eigs, eigvs);
118  }
119  };
120 
121 
122 }
123 
124 #endif
Definition: eigs_algorithms.hpp:101
std::pair< spectra_vec, DenseMatrix_spectra_PL > eigenpairs(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:112
spectra_vec eigenvalues(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:103
Definition: eigs_algorithms.hpp:40
spectra_vec eigenvalues(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:42
std::pair< spectra_vec, DenseMatrix_spectra_PL > eigenpairs(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:50
Definition: eigs_algorithms.hpp:22
spectra_vec eigenvalues(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:24
std::pair< spectra_vec, DenseMatrix_spectra_PL > eigenpairs(DenseMatrix_PL &L)
Definition: eigs_algorithms.hpp:30
Definition: PersistentLaplacians.cpp:7
void round_zeros(spectra_vec &inout, spectra_type threshold)
Definition: PersistentLaplacians.cpp:10
Eigen::Matrix< coefficient_type, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix_PL
Definition: typedefs.hpp:24
Eigen::Matrix< spectra_type, Eigen::Dynamic, 1 > spectra_vec
Definition: typedefs.hpp:27
Eigen::Matrix< spectra_type, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix_spectra_PL
Definition: typedefs.hpp:26