]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/qvm/detail/determinant_impl.hpp
Add patch for failing prerm scripts
[ceph.git] / ceph / src / boost / boost / qvm / detail / determinant_impl.hpp
CommitLineData
b32b8144
FG
1//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.\r
2\r
3//Distributed under the Boost Software License, Version 1.0. (See accompanying\r
4//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
5\r
6#ifndef UUID_3DCF6B90AE0E11DE9A315BE555D89593\r
7#define UUID_3DCF6B90AE0E11DE9A315BE555D89593\r
8\r
9#include <boost/qvm/inline.hpp>\r
10#include <boost/qvm/mat_traits_array.hpp>\r
11#include <boost/qvm/static_assert.hpp>\r
12\r
13namespace\r
14boost\r
15 {\r
16 namespace\r
17 qvm\r
18 {\r
19 namespace\r
20 qvm_detail\r
21 {\r
22 template <int N>\r
23 struct\r
24 det_size\r
25 {\r
26 };\r
27\r
28 template <class M>\r
29 BOOST_QVM_INLINE_TRIVIAL\r
30 typename mat_traits<M>::scalar_type\r
31 determinant_impl_( M const & a, det_size<2> )\r
32 {\r
33 return\r
34 mat_traits<M>::template read_element<0,0>(a) * mat_traits<M>::template read_element<1,1>(a) -\r
35 mat_traits<M>::template read_element<1,0>(a) * mat_traits<M>::template read_element<0,1>(a);\r
36 }\r
37\r
38 template <class M,int N>\r
39 BOOST_QVM_INLINE_RECURSION\r
40 typename mat_traits<M>::scalar_type\r
41 determinant_impl_( M const & a, det_size<N> )\r
42 {\r
43 typedef typename mat_traits<M>::scalar_type T;\r
44 T m[N-1][N-1];\r
45 T det=T(0);\r
46 for( int j1=0; j1!=N; ++j1 )\r
47 {\r
48 for( int i=1; i!=N; ++i )\r
49 {\r
50 int j2 = 0;\r
51 for( int j=0; j!=N; ++j )\r
52 {\r
53 if( j==j1 )\r
54 continue;\r
55 m[i-1][j2] = mat_traits<M>::read_element_idx(i,j,a);\r
56 ++j2;\r
57 }\r
58 }\r
59 T d=determinant_impl_(m,det_size<N-1>());\r
60 if( j1&1 )\r
61 d=-d;\r
62 det += mat_traits<M>::read_element_idx(0,j1,a) * d;\r
63 }\r
64 return det;\r
65 }\r
66\r
67 template <class M>\r
68 BOOST_QVM_INLINE_TRIVIAL\r
69 typename mat_traits<M>::scalar_type\r
70 determinant_impl( M const & a )\r
71 {\r
72 BOOST_QVM_STATIC_ASSERT(mat_traits<M>::rows==mat_traits<M>::cols);\r
73 return determinant_impl_(a,det_size<mat_traits<M>::rows>());\r
74 }\r
75 }\r
76 }\r
77 }\r
78\r
79#endif\r