Files
@ ea18a7bd1a0d
Branch filter:
Location: AENC/switchchain/cpp/graph_spectrum.hpp - annotation
ea18a7bd1a0d
1.7 KiB
text/x-c++hdr
Plot log version of exponential fit for mixing time
b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 b8a998539881 | #include "graph.hpp"
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
using MatrixType =
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
// A: Adjacency matrix
// lambda_max <= d_max
//
// L: Laplacian
// L = D - A
///
// P: Random walk matrix
// lambda_max = 1
class GraphSpectrum {
public:
GraphSpectrum(const Graph& g) : graph(g) {}
~GraphSpectrum() {}
std::vector<float> computeAdjacencySpectrum() const {
// matrix stored as std::vector<std::vector<bool>>
auto& badj = graph.getBooleanAdj();
// Convert it to MatrixType
auto n = badj.size();
MatrixType m(n, n);
for (auto i = 0u; i < n; ++i)
for (auto j = 0u; j < n; ++j)
m(i, j) = badj[i][j] ? 1.0f : 0.0f;
return getEigenvalues_(m);
}
std::vector<float> computeLaplacianSpectrum() const {
// matrix stored as std::vector<std::vector<bool>>
auto& badj = graph.getBooleanAdj();
auto& adj = graph.getAdj();
// - A
auto n = badj.size();
MatrixType m(n, n);
for (auto i = 0u; i < n; ++i)
for (auto j = 0u; j < n; ++j)
m(i, j) = badj[i][j] ? -1.0f : 0.0f;
// + D
for (auto i = 0u; i < n; ++i)
m(i, i) = float(adj[i].size());
return getEigenvalues_(m);
}
private:
const Graph& graph;
std::vector<float> getEigenvalues_(const MatrixType& m) const {
Eigen::SelfAdjointEigenSolver<MatrixType> es(
m, Eigen::DecompositionOptions::EigenvaluesOnly);
auto ev = es.eigenvalues();
return std::vector<float>(ev.data(), ev.data() + ev.rows() * ev.cols());
}
};
|