12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
20namespace detray::algebra {
34template <concepts::scalar scalar_t, concepts::value value_t>
35 requires std::convertible_to<scalar_t, value_t>
36DETRAY_HOST_DEVICE
constexpr auto approx_equal(
37 const scalar_t a,
const scalar_t b,
38 const value_t rel_error = 16.f * std::numeric_limits<value_t>::epsilon(),
39 const value_t max_error = std::numeric_limits<value_t>::epsilon()) {
40 if constexpr (std::integral<scalar_t>) {
47 if (diff <= max_error) {
54 return (diff <= largest * rel_error);
68template <
typename vector1_t,
typename vector2_t>
69 requires((concepts::vector<vector1_t> || concepts::point<vector1_t>) &&
70 (concepts::vector<vector2_t> || concepts::point<vector2_t>) &&
71 !concepts::simd_scalar<vector1_t> &&
72 !concepts::simd_scalar<vector2_t>)
73DETRAY_HOST_DEVICE
constexpr auto approx_equal(
74 const vector1_t& v1,
const vector2_t& v2,
75 const detray::traits::value_t<vector1_t> rel_error =
77 std::numeric_limits<detray::traits::value_t<vector1_t>>::epsilon(),
78 const detray::traits::value_t<vector1_t> max_error =
79 std::numeric_limits<detray::traits::value_t<vector1_t>>::epsilon()) {
80 static_assert(std::same_as<detray::traits::value_t<vector1_t>,
81 detray::traits::value_t<vector2_t>>);
83 using index_t = detray::traits::index_t<vector1_t>;
85 constexpr index_t size{detray::traits::size<vector1_t>};
88 for (index_t i = 0; i < size; ++i) {
90 ::detray::algebra::approx_equal(v1[i], v2[i], rel_error, max_error);
107template <concepts::column_matrix vector1_t, concepts::column_matrix vector2_t>
108DETRAY_HOST_DEVICE
constexpr auto approx_equal(
109 const vector1_t& v1,
const vector2_t& v2,
110 const detray::traits::value_t<vector1_t> rel_error =
112 std::numeric_limits<detray::traits::value_t<vector1_t>>::epsilon(),
113 const detray::traits::value_t<vector1_t> max_error =
114 std::numeric_limits<detray::traits::value_t<vector1_t>>::epsilon()) {
115 static_assert(std::same_as<detray::traits::value_t<vector1_t>,
116 detray::traits::value_t<vector2_t>>);
118 using index_t = detray::traits::index_t<vector1_t>;
119 using element_getter_t = detray::traits::element_getter_t<vector1_t>;
121 constexpr index_t rows{detray::traits::rows<vector1_t>};
124 for (index_t i = 0; i < rows; ++i) {
125 ret = ret && ::detray::algebra::approx_equal(element_getter_t{}(v1, i, 0),
126 element_getter_t{}(v2, i, 0),
127 rel_error, max_error);
143template <concepts::matrix matrix1_t, concepts::matrix matrix2_t>
144DETRAY_HOST_DEVICE
constexpr auto approx_equal(
145 const matrix1_t& m1,
const matrix2_t& m2,
146 const detray::traits::value_t<matrix1_t> rel_error =
148 std::numeric_limits<detray::traits::value_t<matrix1_t>>::epsilon(),
149 const detray::traits::value_t<matrix1_t> max_error =
150 std::numeric_limits<detray::traits::value_t<matrix1_t>>::epsilon()) {
151 static_assert(std::same_as<detray::traits::value_t<matrix1_t>,
152 detray::traits::value_t<matrix2_t>>);
154 using index_t = detray::traits::index_t<matrix1_t>;
155 using element_getter_t = detray::traits::element_getter_t<matrix1_t>;
157 constexpr index_t rows{detray::traits::rows<matrix1_t>};
158 constexpr index_t columns{detray::traits::columns<matrix1_t>};
161 for (index_t j = 0; j < columns; ++j) {
162 for (index_t i = 0; i < rows; ++i) {
163 ret = ret && ::detray::algebra::approx_equal(element_getter_t{}(m1, i, j),
164 element_getter_t{}(
m2, i, j),
165 rel_error, max_error);
183template <concepts::transform3D transform_t>
184DETRAY_HOST_DEVICE
constexpr auto approx_equal(
185 const transform_t& trf1,
const transform_t& trf2,
186 const detray::traits::value_t<typename transform_t::scalar_type> rel_error =
187 16.f * std::numeric_limits<detray::traits::value_t<
188 typename transform_t::scalar_type>>::epsilon(),
189 const detray::traits::value_t<typename transform_t::scalar_type> max_error =
190 std::numeric_limits<detray::traits::value_t<
191 typename transform_t::scalar_type>>::epsilon()) {
192 return (::detray::algebra::approx_equal(trf1.matrix(), trf2.matrix(),
193 rel_error, max_error) &&
194 ::detray::algebra::approx_equal(trf1.matrix_inverse(),
195 trf2.matrix_inverse(), rel_error,
constexpr double m2
Square meter.
Definition Units.hpp:110
constexpr decltype(auto) fabs(T &&vec)
Definition vc_soa_math.hpp:71
constexpr decltype(auto) max(T &&vec)
Definition vc_soa_math.hpp:151