versatile-mcmc  0.1.7
blas.hpp
Go to the documentation of this file.
1 
13 #ifndef VMCMC_BLAS_H_
14 #define VMCMC_BLAS_H_
15 
16 #include <boost/numeric/ublas/vector.hpp>
17 #include <boost/numeric/ublas/vector_expression.hpp>
18 #include <boost/numeric/ublas/vector_proxy.hpp>
19 
20 #include <boost/numeric/ublas/matrix.hpp>
21 #include <boost/numeric/ublas/matrix_expression.hpp>
22 #include <boost/numeric/ublas/matrix_proxy.hpp>
23 
24 #include <boost/numeric/ublas/triangular.hpp>
25 
26 namespace vmcmc {
27 
28 namespace ublas = boost::numeric::ublas;
29 
30 using Vector = ublas::vector<double, std::vector<double>>;
31 using Matrix = ublas::matrix<double, ublas::row_major, std::vector<double>>;
32 using MatrixLower = ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double>>;
33 using MatrixUnitLower = ublas::triangular_matrix<double, ublas::unit_lower, ublas::row_major, std::vector<double>>;
34 
43 template <typename InputMatrix, typename OutputTriangularMatrix>
44 inline size_t choleskyDecompose(const InputMatrix& A, OutputTriangularMatrix& L)
45 {
46  using namespace ublas;
47 
48  assert(A.size1() == A.size2());
49  assert(L.size1() == L.size2());
50  assert(A.size1() == L.size1());
51 
52  const size_t n = A.size1();
53 
54  for (size_t k = 0; k < n; k++) {
55 
56  double qL_kk = A(k, k)
57  - inner_prod(project(row(L, k), range(0, k)),
58  project(row(L, k), range(0, k)));
59 
60  if (qL_kk <= 0) {
61  return 1 + k;
62  }
63  else {
64  double L_kk = sqrt(qL_kk);
65  L(k, k) = L_kk;
66  matrix_column<OutputTriangularMatrix> cLk(L, k);
67 
68  project(cLk, range(k + 1, n)) = (project(column(A, k),
69  range(k + 1, n)) - prod(project(L, range(k + 1, n), range(0, k)),
70  project(row(L, k), range(0, k)))) / L_kk;
71  }
72  }
73  return 0;
74 }
75 
76 } /* namespace vmcmc */
77 
78 
79 /* Comparison overloads */
80 
81 namespace boost { namespace numeric { namespace ublas {
82 
83 template <typename T, typename A>
84 inline bool operator== (const vector<T, A>& v1, const vector<T, A>& v2)
85 {
86  return v1.data() == v2.data();
87 }
88 
89 template <typename T, typename A>
90 inline bool operator!= (const vector<T, A>& v1, const vector<T, A>& v2)
91 {
92  return v1.data() != v2.data();
93 }
94 
95 template <typename T, typename L, typename A>
96 inline bool operator== (const matrix<T, L, A>& m1, const matrix<T, L, A>& m2)
97 {
98  return m1.data() == m2.data();
99 }
100 
101 template <typename T, typename L, typename A>
102 inline bool operator!= (const matrix<T, L, A>& m1, const matrix<T, L, A>& m2)
103 {
104  return m1.data() != m2.data();
105 }
106 
107 template <typename T, typename TRI, typename L, typename A>
108 inline bool operator== (const triangular_matrix<T, TRI, L, A>& m1, const triangular_matrix<T, TRI, L, A>& m2)
109 {
110  return m1.data() == m2.data();
111 }
112 
113 template <typename T, typename TRI, typename L, typename A>
114 inline bool operator!= (const triangular_matrix<T, TRI, L, A>& m1, const triangular_matrix<T, TRI, L, A>& m2)
115 {
116  return m1.data() != m2.data();
117 }
118 
119 } } } /* namespace boost::numeric::ublas */
120 
121 #endif /* VMCMC_BLAS_H_ */
Definition: blas.hpp:81
Definition: algorithm.cpp:28
size_t choleskyDecompose(const InputMatrix &A, OutputTriangularMatrix &L)
Decompose a symmetric positive definit matrix A into product L L^T.
Definition: blas.hpp:44
Definition: blas.hpp:81