Loading include/dca/phys/dca_step/cluster_solver/ctint/structs/solver_configuration.hpp +13 −13 Original line number Diff line number Diff line Loading @@ -49,11 +49,11 @@ public: template <class RngType> void insertRandom(RngType& rng); // TODO: pass output as argument. // Returns at most two candidates. -1 stands for a missing candidate. template <class RngType> std::vector<int> randomRemovalCandidate(RngType& rng, double removal_rand); std::array<int, 2> randomRemovalCandidate(RngType& rng, double removal_rand); template <class RngType> std::vector<int> randomRemovalCandidate(RngType& rng); std::array<int, 2> randomRemovalCandidate(RngType& rng); // Out: indices. Appends the result of the search to indices. template <class Alloc> Loading Loading @@ -161,15 +161,16 @@ void SolverConfiguration::insertRandom(Rng& rng) { assert(2 * size() == getSector(0).size() + getSector(1).size()); } // TODO: remove. template <class RngType> std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng) { std::array<int, 2> SolverConfiguration::randomRemovalCandidate(RngType& rng) { return randomRemovalCandidate(rng, rng()); } // TODO: possibly use only the above signature. template <class RngType> std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, double removal_rand) { std::vector<int> candidates; std::array<int, 2> SolverConfiguration::randomRemovalCandidate(RngType& rng, double removal_rand) { // TODO: generalize to n > 2. std::array<int, 2> candidates{-1, -1}; if (n_annihilatable_ == 0) return candidates; Loading @@ -184,11 +185,10 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl constexpr unsigned threshold = 10; if (n_annihilatable_ >= threshold) { int candidate = removal_rand * size(); while (!vertices_[candidate].annihilatable) { candidate = rng() * size(); candidates[0] = removal_rand * size(); while (!vertices_[candidates[0]].annihilatable) { candidates[0] = rng() * size(); } candidates.push_back(candidate); } else { unsigned annihilatable_idx = removal_rand * n_annihilatable_; Loading @@ -196,7 +196,7 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl for (int i = 0; i < vertices_.size(); ++i) { if (vertices_[i].annihilatable) { if (annihilatable_found == annihilatable_idx) { candidates.push_back(i); candidates[0] = i; break; } ++annihilatable_found; Loading @@ -211,7 +211,7 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl partners_lists_.push_back(&existing_[partner_id]); const auto tag = details::getRandomElement(partners_lists_, rng()); candidates.push_back(findTag(tag)); candidates[1] = findTag(tag); assert(candidates[1] < int(size()) && candidates[1] >= 0); assert(vertices_[candidates[1]].annihilatable); } Loading test/unit/phys/dca_step/cluster_solver/ctint/structs/solver_configuration_test.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -72,12 +72,10 @@ TEST(SolverConfigurationTest, randomRemovalCandidate) { tags.insert(tag); } std::vector<int> candidates; auto execute_test = [&](int n_attempts) { for (int i = 0; i < n_attempts; ++i) { candidates = config.randomRemovalCandidate(rng); ASSERT_EQ(candidates.size(), 1); const auto candidates = config.randomRemovalCandidate(rng); EXPECT_EQ(candidates[1], -1); const auto tag = config[candidates[0]].tag; EXPECT_EQ(tags.count(tag), 1); } Loading Loading
include/dca/phys/dca_step/cluster_solver/ctint/structs/solver_configuration.hpp +13 −13 Original line number Diff line number Diff line Loading @@ -49,11 +49,11 @@ public: template <class RngType> void insertRandom(RngType& rng); // TODO: pass output as argument. // Returns at most two candidates. -1 stands for a missing candidate. template <class RngType> std::vector<int> randomRemovalCandidate(RngType& rng, double removal_rand); std::array<int, 2> randomRemovalCandidate(RngType& rng, double removal_rand); template <class RngType> std::vector<int> randomRemovalCandidate(RngType& rng); std::array<int, 2> randomRemovalCandidate(RngType& rng); // Out: indices. Appends the result of the search to indices. template <class Alloc> Loading Loading @@ -161,15 +161,16 @@ void SolverConfiguration::insertRandom(Rng& rng) { assert(2 * size() == getSector(0).size() + getSector(1).size()); } // TODO: remove. template <class RngType> std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng) { std::array<int, 2> SolverConfiguration::randomRemovalCandidate(RngType& rng) { return randomRemovalCandidate(rng, rng()); } // TODO: possibly use only the above signature. template <class RngType> std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, double removal_rand) { std::vector<int> candidates; std::array<int, 2> SolverConfiguration::randomRemovalCandidate(RngType& rng, double removal_rand) { // TODO: generalize to n > 2. std::array<int, 2> candidates{-1, -1}; if (n_annihilatable_ == 0) return candidates; Loading @@ -184,11 +185,10 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl constexpr unsigned threshold = 10; if (n_annihilatable_ >= threshold) { int candidate = removal_rand * size(); while (!vertices_[candidate].annihilatable) { candidate = rng() * size(); candidates[0] = removal_rand * size(); while (!vertices_[candidates[0]].annihilatable) { candidates[0] = rng() * size(); } candidates.push_back(candidate); } else { unsigned annihilatable_idx = removal_rand * n_annihilatable_; Loading @@ -196,7 +196,7 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl for (int i = 0; i < vertices_.size(); ++i) { if (vertices_[i].annihilatable) { if (annihilatable_found == annihilatable_idx) { candidates.push_back(i); candidates[0] = i; break; } ++annihilatable_found; Loading @@ -211,7 +211,7 @@ std::vector<int> SolverConfiguration::randomRemovalCandidate(RngType& rng, doubl partners_lists_.push_back(&existing_[partner_id]); const auto tag = details::getRandomElement(partners_lists_, rng()); candidates.push_back(findTag(tag)); candidates[1] = findTag(tag); assert(candidates[1] < int(size()) && candidates[1] >= 0); assert(vertices_[candidates[1]].annihilatable); } Loading
test/unit/phys/dca_step/cluster_solver/ctint/structs/solver_configuration_test.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -72,12 +72,10 @@ TEST(SolverConfigurationTest, randomRemovalCandidate) { tags.insert(tag); } std::vector<int> candidates; auto execute_test = [&](int n_attempts) { for (int i = 0; i < n_attempts; ++i) { candidates = config.randomRemovalCandidate(rng); ASSERT_EQ(candidates.size(), 1); const auto candidates = config.randomRemovalCandidate(rng); EXPECT_EQ(candidates[1], -1); const auto tag = config[candidates[0]].tag; EXPECT_EQ(tags.count(tag), 1); } Loading