Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:25

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 // Detray test include(s)
0010 #include "utils_ranges_cuda_kernel.hpp"
0011 
0012 // Vecmem include(s)
0013 #include <vecmem/memory/cuda/managed_memory_resource.hpp>
0014 #include <vecmem/utils/cuda/copy.hpp>
0015 
0016 // GTest include(s)
0017 #include <gtest/gtest.h>
0018 
0019 using namespace detray;
0020 
0021 // This tests the single value view
0022 TEST(utils_ranges_cuda, single) {
0023   dindex value{251u};
0024   dindex check{std::numeric_limits<dindex>::max()};
0025 
0026   // Run the test code
0027   test_single(value, check);
0028 
0029   // Check result value
0030   ASSERT_EQ(value, check);
0031 }
0032 
0033 // This tests the non-owning single value view
0034 TEST(utils_ranges_cuda, pointer) {
0035   dindex value{251u};
0036   dindex check{std::numeric_limits<dindex>::max()};
0037 
0038   // Run the test code
0039   test_pointer(value, check);
0040 
0041   // Check result value
0042   ASSERT_EQ(value, check);
0043 }
0044 
0045 // This tests the iota range generator
0046 TEST(utils_ranges_cuda, iota) {
0047   // Helper object for performing memory copies.
0048   vecmem::cuda::copy copy;
0049 
0050   // memory resource
0051   vecmem::cuda::managed_memory_resource managed_resource;
0052 
0053   // Input reference vector for test
0054   vecmem::vector<dindex> reference({2u, 3u, 4u, 5u, 6u});
0055 
0056   // Const range for enumeration test
0057   const darray<dindex, 2> range = {2u, 7u};
0058 
0059   // Output vector buffer for enumeration test
0060   vecmem::data::vector_buffer<dindex> check_buffer(
0061       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(range[1] -
0062                                                                   range[0]),
0063       managed_resource, vecmem::data::buffer_type::resizable);
0064   copy.setup(check_buffer)->wait();
0065 
0066   // Run test function
0067   test_iota(range, check_buffer);
0068 
0069   // Copy vector buffer to output vector
0070   vecmem::vector<dindex> check{&managed_resource};
0071   copy(check_buffer, check)->wait();
0072 
0073   // Check the result
0074   ASSERT_EQ(check, reference);
0075 }
0076 
0077 // This tests the cartesian product range adaptor
0078 TEST(utils_ranges_cuda, cartesian_product) {
0079   // Helper object for performing memory copies.
0080   vecmem::cuda::copy copy;
0081 
0082   // memory resource
0083   vecmem::cuda::managed_memory_resource managed_resource;
0084 
0085   // Const range for enumeration test
0086   const darray<dindex, 2> range1 = {2u, 7u};
0087   const darray<dindex, 2> range2 = {1u, 10u};
0088   const darray<dindex, 2> range3 = {3u, 4u};
0089 
0090   auto seq1 = detray::views::iota(range1);
0091   auto seq2 = detray::views::iota(range2);
0092   auto seq3 = detray::views::iota(range3);
0093 
0094   dindex size{seq1.size() * seq2.size() * seq3.size()};
0095 
0096   // Input reference vector for test
0097   vecmem::vector<std::tuple<dindex, dindex, dindex>> result;
0098   for (auto i : seq1) {
0099     for (auto j : seq2) {
0100       for (auto k : seq3) {
0101         result.emplace_back(i, j, k);
0102       }
0103     }
0104   }
0105 
0106   // Output vector buffer for enumeration test
0107   using buffer_t =
0108       vecmem::data::vector_buffer<std::tuple<dindex, dindex, dindex>>;
0109   buffer_t check_buffer(static_cast<buffer_t::size_type>(size),
0110                         managed_resource, vecmem::data::buffer_type::resizable);
0111   copy.setup(check_buffer)->wait();
0112 
0113   // Run test function
0114   test_cartesian_product(range1, range2, range3, check_buffer);
0115 
0116   // Copy vector buffer to output vector
0117   vecmem::vector<std::tuple<dindex, dindex, dindex>> check{&managed_resource};
0118   copy(check_buffer, check)->wait();
0119 
0120   // Check the result
0121   ASSERT_EQ(result.size(), check.size());
0122 
0123   for (std::size_t r = 0; r < check.size(); ++r) {
0124     const auto [i, j, k] = check[r];
0125     const auto [l, m, n] = result[r];
0126 
0127     ASSERT_EQ(i, l);
0128     ASSERT_EQ(j, m);
0129     ASSERT_EQ(k, n);
0130   }
0131 }
0132 
0133 // This tests the convenience enumeration function
0134 TEST(utils_ranges_cuda, enumerate) {
0135   // Helper object for performing memory copies.
0136   vecmem::cuda::copy copy;
0137 
0138   // memory resource
0139   vecmem::cuda::managed_memory_resource managed_resource;
0140 
0141   // Input vector sequence for test
0142   vecmem::vector<uint_holder> seq({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0143                                   &managed_resource);
0144 
0145   // Get vector_data object
0146   auto seq_data = vecmem::get_data(seq);
0147 
0148   // Output vector buffer for enumeration test
0149   vecmem::data::vector_buffer<dindex> idx_buffer(
0150       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0151       managed_resource, vecmem::data::buffer_type::resizable);
0152   copy.setup(idx_buffer)->wait();
0153 
0154   vecmem::data::vector_buffer<dindex> value_buffer(
0155       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0156       managed_resource, vecmem::data::buffer_type::resizable);
0157   copy.setup(value_buffer)->wait();
0158 
0159   // Run test function
0160   test_enumerate(seq_data, idx_buffer, value_buffer);
0161 
0162   // Copy vector buffer to output vector
0163   vecmem::vector<dindex> idx_vec{&managed_resource};
0164   copy(idx_buffer, idx_vec)->wait();
0165 
0166   vecmem::vector<dindex> value_vec{&managed_resource};
0167   copy(value_buffer, value_vec)->wait();
0168 
0169   // Check the result
0170   for (std::size_t i = 0u; i < idx_vec.size(); i++) {
0171     ASSERT_EQ(idx_vec[i], value_vec[i]);
0172   }
0173 }
0174 
0175 // This tests the convenience pick function
0176 TEST(utils_ranges_cuda, pick) {
0177   // Helper object for performing memory copies.
0178   vecmem::cuda::copy copy;
0179 
0180   // memory resource
0181   vecmem::cuda::managed_memory_resource managed_resource;
0182 
0183   // Input vector sequence for test
0184   vecmem::vector<uint_holder> seq({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0185                                   &managed_resource);
0186   // Input index sequence for test
0187   vecmem::vector<dindex> idx({0u, 2u, 4u, 5u}, &managed_resource);
0188 
0189   // Get vector_data object
0190   auto seq_data = vecmem::get_data(seq);
0191   auto idx_data = vecmem::get_data(idx);
0192 
0193   // Output vector buffer for enumeration test
0194   vecmem::data::vector_buffer<dindex> idx_buffer(
0195       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0196       managed_resource, vecmem::data::buffer_type::resizable);
0197   copy.setup(idx_buffer)->wait();
0198 
0199   vecmem::data::vector_buffer<dindex> value_buffer(
0200       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq.size()),
0201       managed_resource, vecmem::data::buffer_type::resizable);
0202   copy.setup(value_buffer)->wait();
0203 
0204   // Run test function
0205   test_pick(seq_data, idx_data, idx_buffer, value_buffer);
0206 
0207   // Copy vector buffer to output vector
0208   vecmem::vector<dindex> idx_vec{&managed_resource};
0209   copy(idx_buffer, idx_vec)->wait();
0210 
0211   vecmem::vector<dindex> value_vec{&managed_resource};
0212   copy(value_buffer, value_vec)->wait();
0213 
0214   // Check the result
0215   for (std::size_t i = 0u; i < idx_vec.size(); i++) {
0216     ASSERT_EQ(idx[i], idx_vec[i]);
0217     ASSERT_EQ(seq[idx_vec[i]].ui, value_vec[i]);
0218   }
0219 }
0220 
0221 // This tests the detray join range
0222 TEST(utils_ranges_cuda, join) {
0223   // Helper object for performing memory copies.
0224   vecmem::cuda::copy copy;
0225 
0226   // memory resource
0227   vecmem::cuda::managed_memory_resource managed_resource;
0228 
0229   // Input vector sequence for test
0230   vecmem::vector<uint_holder> seq_1({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0231                                     &managed_resource);
0232   vecmem::vector<uint_holder> seq_2({{2u}, {0u}, {9u}, {4u}, {15u}},
0233                                     &managed_resource);
0234   // Get vector_data object
0235   auto seq_data_1 = vecmem::get_data(seq_1);
0236   auto seq_data_2 = vecmem::get_data(seq_2);
0237 
0238   // Output vector buffer for join test
0239   vecmem::data::vector_buffer<dindex> value_buffer(
0240       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq_1.size() +
0241                                                                   seq_2.size()),
0242       managed_resource, vecmem::data::buffer_type::resizable);
0243   copy.setup(value_buffer)->wait();
0244 
0245   // Run test function
0246   test_join(seq_data_1, seq_data_2, value_buffer);
0247 
0248   // Copy vector buffer to output vector
0249   vecmem::vector<dindex> value_vec{&managed_resource};
0250   copy(value_buffer, value_vec)->wait();
0251 
0252   // First sequence
0253   for (std::size_t i = 0u; i < seq_1.size(); i++) {
0254     ASSERT_EQ(seq_1[i].ui, value_vec[i]);
0255   }
0256   // Second sequence
0257   for (std::size_t i = 0u; i < seq_2.size(); i++) {
0258     ASSERT_EQ(seq_2[i].ui, value_vec[i + seq_1.size()]);
0259   }
0260 }
0261 
0262 // This tests the convenience enumeration function
0263 TEST(utils_ranges_cuda, static_join) {
0264   // Helper object for performing memory copies.
0265   vecmem::cuda::copy copy;
0266 
0267   // memory resource
0268   vecmem::cuda::managed_memory_resource managed_resource;
0269 
0270   // Input vector sequence for test
0271   vecmem::vector<uint_holder> seq_1({{0u}, {1u}, {2u}, {3u}, {4u}, {5u}},
0272                                     &managed_resource);
0273   vecmem::vector<uint_holder> seq_2({{2u}, {0u}, {9u}, {4u}, {15u}},
0274                                     &managed_resource);
0275   // Get vector_data object
0276   auto seq_data_1 = vecmem::get_data(seq_1);
0277   auto seq_data_2 = vecmem::get_data(seq_2);
0278 
0279   // Output vector buffer for static_join test
0280   vecmem::data::vector_buffer<dindex> value_buffer(
0281       static_cast<vecmem::data::vector_buffer<dindex>::size_type>(seq_1.size() +
0282                                                                   seq_2.size()),
0283       managed_resource, vecmem::data::buffer_type::resizable);
0284   copy.setup(value_buffer)->wait();
0285 
0286   // Run test function
0287   test_static_join(seq_data_1, seq_data_2, value_buffer);
0288 
0289   // Copy vector buffer to output vector
0290   vecmem::vector<dindex> value_vec{&managed_resource};
0291   copy(value_buffer, value_vec)->wait();
0292 
0293   // First sequence
0294   for (std::size_t i = 0u; i < seq_1.size(); i++) {
0295     ASSERT_EQ(seq_1[i].ui, value_vec[i]);
0296   }
0297   // Second sequence
0298   for (std::size_t i = 0u; i < seq_1.size(); i++) {
0299     ASSERT_EQ(seq_2[i].ui, value_vec[i + seq_1.size()]);
0300   }
0301 }
0302 
0303 // This tests the subrange view
0304 TEST(utils_ranges_cuda, subrange) {
0305   // Helper object for performing memory copies.
0306   vecmem::cuda::copy copy;
0307 
0308   // memory resource
0309   vecmem::cuda::managed_memory_resource managed_resource;
0310 
0311   // Input vector sequence for test
0312   vecmem::vector<int> seq({0, 1, 2, 3, 4, 5}, &managed_resource);
0313   // Get vector_data object
0314   auto seq_data = vecmem::get_data(seq);
0315 
0316   // Begin and end index for iteration
0317   const std::size_t begin{1u};
0318   const std::size_t end{4u};
0319 
0320   // Output vector buffer for iteration test
0321   vecmem::data::vector_buffer<int> check_buffer(
0322       static_cast<vecmem::data::vector_buffer<int>::size_type>(end - begin),
0323       managed_resource, vecmem::data::buffer_type::resizable);
0324   copy.setup(check_buffer)->wait();
0325 
0326   // Run test function
0327   test_subrange(seq_data, check_buffer, begin, end);
0328 
0329   // Copy vector buffer to output vector
0330   vecmem::vector<int> check{&managed_resource};
0331   copy(check_buffer, check)->wait();
0332 
0333   // Check the result
0334   ASSERT_EQ(check[0], 1);
0335   ASSERT_EQ(check[1], 2);
0336   ASSERT_EQ(check[2], 3);
0337 }