20#include <unordered_map>
42template <
typename FloatType>
43struct SwendsenWang<system::ClassicalIsing<graph::Sparse<FloatType>>> {
47 template <
typename RandomNumberEngine>
51 auto urd = std::uniform_real_distribution<>(0, 1.0);
54 const size_t num_spin = system.
spin.size();
58 for (std::size_t node = 0; node < num_spin; ++node) {
59 for (
typename ClIsing::SparseMatrixXx::InnerIterator it(
63 std::size_t adj_node = it.index();
69 if (J * system.
spin(node) * system.
spin(adj_node) > 0)
71 const auto unite_rate =
74 1.0 - std::exp(-2.0 * parameter.
beta * std::abs(J))));
75 if (urd(random_number_engine) < unite_rate)
76 union_find_tree.unite_sets(node, adj_node);
81 const auto cluster_map = [num_spin, &union_find_tree]() {
84 for (std::size_t node = 0; node < num_spin; ++node) {
85 cluster_map.insert({union_find_tree.find_set(node), node});
91 for (
auto &&c : union_find_tree.get_roots()) {
92 const auto range = cluster_map.equal_range(c);
96 if (urd(random_number_engine) < probability) {
98 for (
auto itr = range.first, last = range.second; itr != last; ++itr) {
99 const auto idx = itr->second;
100 system.
spin(idx) *= -1;
114template <
typename FloatType>
115struct SwendsenWang<system::ClassicalIsing<graph::CSRSparse<FloatType>>> {
120 template <
typename RandomNumberEngine>
124 auto urd = std::uniform_real_distribution<>(0, 1.0);
127 const size_t num_spin = system.
spin.size();
131 for (std::size_t node = 0; node < num_spin; ++node) {
132 for (
typename ClIsing::SparseMatrixXx::InnerIterator it(
136 std::size_t adj_node = it.index();
139 if (node >= adj_node)
142 if (J * system.
spin(node) * system.
spin(adj_node) > 0)
144 const auto unite_rate =
147 1.0 - std::exp(-2.0 * parameter.
beta * std::abs(J))));
148 if (urd(random_number_engine) < unite_rate)
149 union_find_tree.unite_sets(node, adj_node);
154 const auto cluster_map = [num_spin, &union_find_tree]() {
157 for (std::size_t node = 0; node < num_spin; ++node) {
158 cluster_map.insert({union_find_tree.find_set(node), node});
164 for (
auto &&c : union_find_tree.get_roots()) {
165 const auto range = cluster_map.equal_range(c);
169 if (urd(random_number_engine) < probability) {
171 for (
auto itr = range.first, last = range.second; itr != last; ++itr) {
172 const auto idx = itr->second;
173 system.
spin(idx) *= -1;
Definition algorithm.hpp:24
double FloatType
Note:
Definition compile_config.hpp:37
ClassicalIsing structure for CSR Sparse graph (Eigen-based)
Definition classical_ising.hpp:190
VectorXx spin
spins (Eigen Vector)
Definition classical_ising.hpp:238
const SparseMatrixXx interaction
interaction (Eigen SparseMatrix)
Definition classical_ising.hpp:243
ClassicalIsing structure for Sparse graph (Eigen-based)
Definition classical_ising.hpp:118
VectorXx spin
spins (Eigen Vector)
Definition classical_ising.hpp:167
const SparseMatrixXx interaction
interaction (Eigen SparseMatrix)
Definition classical_ising.hpp:172
ClassicalIsing structure (system for classical Ising model)
Definition classical_ising.hpp:38
static void update(ClIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
Definition swendsen_wang.hpp:122
static void update(ClIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
Definition swendsen_wang.hpp:49
swendsen wang updater
Definition swendsen_wang.hpp:35
Definition union_find.hpp:24
std::size_t Node
Definition union_find.hpp:25
updater parameter for classical ising system
Definition schedule_list.hpp:37
double beta
inverse temperature
Definition schedule_list.hpp:46