Graphite  0.5.0
GPU-accelerated graph optimization framework
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#include <cstdint>
6#include <type_traits>
7
8namespace graphite {
9
10// We need to make sure the eigen solver function calls are not
11// compiled in a .cu file. So we declare specializations here and
12// implement them in a .cpp file.
13// TODO: Is there a better way to do this?
14
15template <typename T>
16using VecMap = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>>;
17
18template <typename Solver> Solver *create_eigen_ldlt_solver() {
19 return nullptr;
20}
21
22template <typename Solver> void destroy_eigen_ldlt_solver(Solver *solver) {}
23
24template <typename T, typename Index> class EigenLDLTSolverImpl;
25
26template <>
27EigenLDLTSolverImpl<double, int32_t> *
28create_eigen_ldlt_solver<EigenLDLTSolverImpl<double, int32_t>>();
29
30template <>
31EigenLDLTSolverImpl<float, int32_t> *
32create_eigen_ldlt_solver<EigenLDLTSolverImpl<float, int32_t>>();
33
34template <>
35EigenLDLTSolverImpl<double, int64_t> *
36create_eigen_ldlt_solver<EigenLDLTSolverImpl<double, int64_t>>();
37
38template <>
39EigenLDLTSolverImpl<float, int64_t> *
40create_eigen_ldlt_solver<EigenLDLTSolverImpl<float, int64_t>>();
41
42template <>
43void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<double, int32_t>>(
44 EigenLDLTSolverImpl<double, int32_t> *solver);
45
46template <>
47void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<float, int32_t>>(
48 EigenLDLTSolverImpl<float, int32_t> *solver);
49
50template <>
51void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<double, int64_t>>(
52 EigenLDLTSolverImpl<double, int64_t> *solver);
53
54template <>
55void destroy_eigen_ldlt_solver<EigenLDLTSolverImpl<float, int64_t>>(
56 EigenLDLTSolverImpl<float, int64_t> *solver);
57
58template <typename T,
59 typename Index =
60 typename Eigen::SparseMatrix<T, Eigen::ColMajor>::StorageIndex>
62private:
63 static_assert(std::is_same<Index, int32_t>::value ||
64 std::is_same<Index, int64_t>::value,
65 "EigenLDLTWrapper index type must be int32_t or int64_t");
66
67 // using solver_impl = std::conditional_t<
68 // std::is_same<T, double>::value, EigenLDLTSolverImpl<double>,
69
70 using solver_impl = EigenLDLTSolverImpl<T, Index>;
71
72 solver_impl *solver;
73
74public:
75 EigenLDLTWrapper() { solver = create_eigen_ldlt_solver<solver_impl>(); }
76
78 destroy_eigen_ldlt_solver<solver_impl>(solver);
79 solver = nullptr;
80 }
81
82 bool
83 analyze_pattern(const Eigen::SparseMatrix<T, Eigen::ColMajor, Index> &matrix);
84 bool factorize(const Eigen::SparseMatrix<T, Eigen::ColMajor, Index> &matrix);
85 bool solve(const VecMap<T> &b, VecMap<T> &x);
86};
87
88} // namespace graphite
Definition eigen_solver_interface.hpp:61
The top-level namespace for Graphite.
Definition eigen_solver.cpp:4