ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
hard_coded.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/algebra/concepts.hpp"
13#include "detray/algebra/type_traits.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
15
16// System include(s)
17#include <type_traits>
18
19namespace detray::algebra::generic::matrix::determinant {
20
22template <concepts::square_matrix matrix_t>
23struct hard_coded {
25 using scalar_t = detray::traits::value_t<matrix_t>;
27 using index_t = detray::traits::index_t<matrix_t>;
28
30 using element_getter_t = detray::traits::element_getter_t<matrix_t>;
31
35 template <typename M = matrix_t>
36 requires(detray::traits::max_rank<M> == 2)
37 DETRAY_HOST_DEVICE constexpr scalar_t operator()(const matrix_t &m) const {
38 constexpr element_getter_t elem{};
39
40 return elem(m, 0, 0) * elem(m, 1, 1) - elem(m, 0, 1) * elem(m, 1, 0);
41 }
42
46 template <typename M = matrix_t>
47 requires(detray::traits::max_rank<M> == 4)
48 DETRAY_HOST_DEVICE constexpr scalar_t operator()(const matrix_t &m) const {
49 constexpr element_getter_t elem{};
50
51 return elem(m, 0, 3) * elem(m, 1, 2) * elem(m, 2, 1) * elem(m, 3, 0) -
52 elem(m, 0, 2) * elem(m, 1, 3) * elem(m, 2, 1) * elem(m, 3, 0) -
53 elem(m, 0, 3) * elem(m, 1, 1) * elem(m, 2, 2) * elem(m, 3, 0) +
54 elem(m, 0, 1) * elem(m, 1, 3) * elem(m, 2, 2) * elem(m, 3, 0) +
55 elem(m, 0, 2) * elem(m, 1, 1) * elem(m, 2, 3) * elem(m, 3, 0) -
56 elem(m, 0, 1) * elem(m, 1, 2) * elem(m, 2, 3) * elem(m, 3, 0) -
57 elem(m, 0, 3) * elem(m, 1, 2) * elem(m, 2, 0) * elem(m, 3, 1) +
58 elem(m, 0, 2) * elem(m, 1, 3) * elem(m, 2, 0) * elem(m, 3, 1) +
59 elem(m, 0, 3) * elem(m, 1, 0) * elem(m, 2, 2) * elem(m, 3, 1) -
60 elem(m, 0, 0) * elem(m, 1, 3) * elem(m, 2, 2) * elem(m, 3, 1) -
61 elem(m, 0, 2) * elem(m, 1, 0) * elem(m, 2, 3) * elem(m, 3, 1) +
62 elem(m, 0, 0) * elem(m, 1, 2) * elem(m, 2, 3) * elem(m, 3, 1) +
63 elem(m, 0, 3) * elem(m, 1, 1) * elem(m, 2, 0) * elem(m, 3, 2) -
64 elem(m, 0, 1) * elem(m, 1, 3) * elem(m, 2, 0) * elem(m, 3, 2) -
65 elem(m, 0, 3) * elem(m, 1, 0) * elem(m, 2, 1) * elem(m, 3, 2) +
66 elem(m, 0, 0) * elem(m, 1, 3) * elem(m, 2, 1) * elem(m, 3, 2) +
67 elem(m, 0, 1) * elem(m, 1, 0) * elem(m, 2, 3) * elem(m, 3, 2) -
68 elem(m, 0, 0) * elem(m, 1, 1) * elem(m, 2, 3) * elem(m, 3, 2) -
69 elem(m, 0, 2) * elem(m, 1, 1) * elem(m, 2, 0) * elem(m, 3, 3) +
70 elem(m, 0, 1) * elem(m, 1, 2) * elem(m, 2, 0) * elem(m, 3, 3) +
71 elem(m, 0, 2) * elem(m, 1, 0) * elem(m, 2, 1) * elem(m, 3, 3) -
72 elem(m, 0, 0) * elem(m, 1, 2) * elem(m, 2, 1) * elem(m, 3, 3) -
73 elem(m, 0, 1) * elem(m, 1, 0) * elem(m, 2, 2) * elem(m, 3, 3) +
74 elem(m, 0, 0) * elem(m, 1, 1) * elem(m, 2, 2) * elem(m, 3, 3);
75 }
76};
77
78} // namespace detray::algebra::generic::matrix::determinant
"Determinant getter", assuming a N X N matrix
Definition hard_coded.hpp:23
detray::traits::value_t< matrix_t > scalar_t
Matrix element type.
Definition hard_coded.hpp:25
detray::traits::index_t< matrix_t > index_t
Matrix index type.
Definition hard_coded.hpp:27
detray::traits::element_getter_t< matrix_t > element_getter_t
Function (object) used for accessing a matrix element.
Definition hard_coded.hpp:30