#include #include #include #include #include #include "../../src/array/cpu/concurrent_id_hash_map.h" #include "./common.h" using namespace dgl; using namespace dgl::runtime; using namespace dgl::aten; namespace { template size_t ConstructRandomSet( size_t size, IdType range, std::vector& id_vec) { id_vec.resize(size); std::srand(std::time(nullptr)); for (size_t i = 0; i < size; i++) { id_vec[i] = static_cast(std::rand() % range); } size_t num_seeds = size / 5 + 1; std::sort(id_vec.begin(), id_vec.begin() + num_seeds); return std::unique(id_vec.begin(), id_vec.begin() + num_seeds) - id_vec.begin(); } template void _TestIdMap() { std::vector id_vec; auto num_seeds = ConstructRandomSet(size, range, id_vec); std::set id_set(id_vec.begin(), id_vec.end()); IdArray ids = VecToIdArray(id_vec, sizeof(IdType) * 8, CTX); ConcurrentIdHashMap id_map; IdArray unique_ids = id_map.Init(ids, num_seeds); auto unique_num = static_cast(unique_ids->shape[0]); IdType* unique_id_data = unique_ids.Ptr(); EXPECT_EQ(id_set.size(), unique_num); parallel_for(0, num_seeds, 64, [&](int64_t s, int64_t e) { for (int64_t i = s; i < e; i++) { EXPECT_EQ(id_vec[i], unique_id_data[i]); } }); parallel_for(num_seeds, unique_num, 128, [&](int64_t s, int64_t e) { for (int64_t i = s; i < e; i++) { EXPECT_TRUE(id_set.find(unique_id_data[i]) != id_set.end()); } }); IdArray new_ids = id_map.MapIds(unique_ids); EXPECT_TRUE(new_ids.IsContiguous()); ids->shape[0] = num_seeds; IdArray new_seed_ids = id_map.MapIds(ids); EXPECT_TRUE(new_seed_ids.IsContiguous()); EXPECT_EQ(new_seed_ids.Ptr()[0], static_cast(0)); } TEST(ConcurrentIdHashMapTest, TestConcurrentIdHashMap) { _TestIdMap(); _TestIdMap(); _TestIdMap(); _TestIdMap(); _TestIdMap(); _TestIdMap(); _TestIdMap(); _TestIdMap(); } }; // namespace