Graphite
Loading...
Searching...
No Matches
eigen_solver_interface.hpp
Go to the documentation of this file.
1
2#pragma once
3#include <Eigen/Sparse>
4#include <Eigen/SparseCholesky>
5
6namespace graphite {
7
8// We need to make sure the eigen solver function calls are not
9// compiled in a .cu file. So we declare specializations here and
10// implement them in a .cpp file.
11// TODO: Is there a better way to do this?
12
13template <typename T>
14using VecMap = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
15
16template <typename Solver> Solver *create_eigen_ldlt_solver() {
17 return nullptr;
18}
19
20template <typename Solver> void destroy_eigen_ldlt_solver(Solver *solver) {}
21
22template <typename T> class EigenLDLTSolverImpl;
23
24template <>
25EigenLDLTSolverImpl<double> *
26create_eigen_ldlt_solver<EigenLDLTSolverImpl<double>>();
27
28template <>
29EigenLDLTSolverImpl<float> *
30create_eigen_ldlt_solver<EigenLDLTSolverImpl<float>>();
31
32template <>
33void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<double>>(
34 EigenLDLTSolverImpl<double> *solver);
35
36template <>
37void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<float>>(
38 EigenLDLTSolverImpl<float> *solver);
39
40template <typename T> class EigenLDLTWrapper {
41private:
42 // using solver_impl = std::conditional_t<
43 // std::is_same<T, double>::value, EigenLDLTSolverImpl<double>,
44
45 using solver_impl = EigenLDLTSolverImpl<T>;
46
47 solver_impl *solver;
48
49public:
50 EigenLDLTWrapper() { solver = create_eigen_ldlt_solver<solver_impl>(); }
51
53 destroy_eigen_ldlt_solver<solver_impl>(solver);
54 solver = nullptr;
55 }
56
57 bool analyze_pattern(const Eigen::SparseMatrix<T, Eigen::ColMajor> &matrix) {
58 return false;
59 }
60 bool factorize(const Eigen::SparseMatrix<T, Eigen::ColMajor> &matrix) {
61 return false;
62 }
63 bool solve(const VecMap<T> &b, VecMap<T> &x) { return false; }
64};
65
66template <>
68 const Eigen::SparseMatrix<double, Eigen::ColMajor> &matrix);
69
70template <>
72 const Eigen::SparseMatrix<double, Eigen::ColMajor> &matrix);
73
74template <>
75bool EigenLDLTWrapper<double>::solve(const VecMap<double> &b,
76 VecMap<double> &x);
77
78template <>
80 const Eigen::SparseMatrix<float, Eigen::ColMajor> &matrix);
81template <>
83 const Eigen::SparseMatrix<float, Eigen::ColMajor> &matrix);
84template <>
85bool EigenLDLTWrapper<float>::solve(const VecMap<float> &b, VecMap<float> &x);
86
87} // namespace graphite
Definition eigen_solver_interface.hpp:40