43template <
typename GraphType>
66 template <
typename RandomNumberEngine>
72 auto urd = std::uniform_real_distribution<>(0, 1.0);
74 Eigen::setNbThreads(1);
75 Eigen::initParallel();
78 for (std::size_t index = 0; index < system.num_spins; ++index) {
80 if (system.dE(index) <= 0 ||
81 std::exp(-parameter.
beta * system.dE(index)) >
82 urd(random_number_engine)) {
84 system.dE += 4 * system.spin(index) *
85 (system.interaction.row(index).transpose().cwiseProduct(
88 system.dE(index) *= -1;
89 system.spin(index) *= -1;
93 system.spin(system.num_spins) = 1;
104template <
typename GraphType>
127 template <
typename RandomNumberEngine>
133 std::size_t num_classical_spins = system.num_classical_spins;
135 std::size_t num_trotter_slices = system.trotter_spins.cols();
138 auto urd = std::uniform_real_distribution<>(0, 1.0);
142 const auto &gamma = system.gamma;
143 const auto &beta = parameter.
beta;
144 const auto &s = parameter.
s;
148 (1 / 2.) * log(tanh(beta * gamma * (1.0 - s) / num_trotter_slices));
150 Eigen::setNbThreads(1);
151 Eigen::initParallel();
154 for (std::size_t t = 0; t < num_trotter_slices; t++) {
155 for (std::size_t i = 0; i < num_classical_spins; i++) {
156 system.rand_pool(i, t) = urd(random_number_engine);
163 std::size_t upper_limit = num_trotter_slices % 2 != 0
164 ? num_trotter_slices - 1
165 : num_trotter_slices;
168#pragma omp parallel for
169 for (int64_t t = 0; t < (int64_t)upper_limit; t += 2) {
170 for (int64_t i = 0; i < (int64_t)num_classical_spins; i++) {
172 do_calc(system, parameter, i, t, B);
177#pragma omp parallel for
178 for (int64_t t = 1; t < (int64_t)num_trotter_slices; t += 2) {
179 for (int64_t i = 0; i < (int64_t)num_classical_spins; i++) {
181 do_calc(system, parameter, i, t, B);
186 if (num_trotter_slices % 2 != 0) {
187 int64_t t = (int64_t)(num_trotter_slices - 1);
188 for (int64_t i = 0; i < (int64_t)num_classical_spins; i++) {
190 do_calc(system, parameter, i, t, B);
202 std::size_t num_trotter_slices = system.trotter_spins.cols();
205 auto &spins = system.trotter_spins;
207 const auto &beta = parameter.
beta;
208 const auto &s = parameter.
s;
212 (spins(i, mod_t((int64_t)t + 1, num_trotter_slices)) +
213 spins(i, mod_t((int64_t)t - 1, num_trotter_slices)));
217 s * (beta / num_trotter_slices) * system.dE(i, t) + B * dEtrot;
240 if (dE < 0 || exp(-dE) > system.rand_pool(i, t)) {
245 (system.interaction.row(i).transpose().cwiseProduct(spins.col(t)));
246 system.dE(i, t) *= -1;
253 inline static std::size_t
mod_t(std::int64_t a,
254 std::size_t num_trotter_slices) {
257 return (a + num_trotter_slices) % num_trotter_slices;
264template <
typename GraphType>
279 template <
typename RandomNumberEngine>
284 if (system.vartype == cimod::Vartype::SPIN) {
285 update_spin<RandomNumberEngine>(system, random_number_engine, parameter);
286 }
else if (system.vartype == cimod::Vartype::BINARY) {
287 update_binary<RandomNumberEngine>(system, random_number_engine,
290 std::stringstream ss;
291 ss <<
"Unknown vartype detected in " << __func__ << std::endl;
292 throw std::runtime_error(ss.str());
302 template <
typename RandomNumberEngine>
307 auto urd = std::uniform_real_distribution<>(0, 1.0);
308 for (
const auto &index_spin : system.get_active_variables()) {
309 if (system.dE(index_spin) <= 0.0 ||
310 std::exp(-parameter.
beta * system.dE(index_spin)) >
311 urd(random_number_engine)) {
312 system.update_spin_system(index_spin);
323 template <
typename RandomNumberEngine>
328 auto urd = std::uniform_real_distribution<>(0, 1.0);
329 for (
const auto &index_binary : system.get_active_variables()) {
330 if (system.dE(index_binary) <= 0.0 ||
331 std::exp(-parameter.
beta * system.dE(index_binary)) >
332 urd(random_number_engine)) {
333 system.update_binary_system(index_binary);
340template<
class SystemType,
typename RandType>
342 const std::int32_t num_sweeps,
343 const std::vector<typename SystemType::ValueType> &beta_list,
344 const typename RandType::result_type seed,
347 const std::int32_t system_size = system->GetSystemSize();
350 RandType random_number_engine(seed);
351 std::uniform_real_distribution<typename SystemType::ValueType> dist_real(0, 1);
355 for (std::int32_t sweep_count = 0; sweep_count < num_sweeps; sweep_count++) {
356 const auto beta = beta_list[sweep_count];
357 for (std::int32_t i = 0; i < system_size; i++) {
358 const auto delta_energy = system->GetEnergyDifference(i);
359 if (delta_energy <= 0 || std::exp(-beta*delta_energy) > dist_real(random_number_engine)) {
367 for (std::int32_t sweep_count = 0; sweep_count < num_sweeps; sweep_count++) {
368 const auto beta = beta_list[sweep_count];
369 for (std::int32_t i = 0; i < system_size; i++) {
370 const auto delta_energy = system->GetEnergyDifference(i);
371 if (1/(1 + std::exp(beta*delta_energy)) > dist_real(random_number_engine)) {
378 throw std::runtime_error(
"Unknown UpdateMethod");
ClassicalIsingPolynomial class, which is a system to solve higher order unconstrained binary optimiza...
Definition classical_ising_polynomial.hpp:36
UpdateMethod
Definition algorithm.hpp:63
@ HEAT_BATH
Heat bath update.
@ METROPOLIS
Metropolis update.
void SingleFlipUpdater(SystemType *system, const std::int32_t num_sweeps, const std::vector< typename SystemType::ValueType > &beta_list, const typename RandType::result_type seed, const algorithm::UpdateMethod update_metod)
Definition single_spin_flip.hpp:341
Definition algorithm.hpp:24
ClassicalIsing structure (system for classical Ising model)
Definition classical_ising.hpp:38
TransverseIsing structure with discrete-time trotter spins.
Definition transverse_ising.hpp:39
typename GraphType::value_type FloatType
floating point type
Definition single_spin_flip.hpp:271
static void update_binary(ClPIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
Operate single spin flip when the system is composed of binary variables.
Definition single_spin_flip.hpp:325
static void update(ClPIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
Operate single spin flip for Ising models with polynomial interactions and polynomial unconstrained b...
Definition single_spin_flip.hpp:281
static void update_spin(ClPIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
Operate single spin flip when the system is composed of spin variables.
Definition single_spin_flip.hpp:304
typename GraphType::value_type FloatType
float type
Definition single_spin_flip.hpp:54
static void update(ClIsing &system, RandomNumberEngine &random_number_engine, const utility::ClassicalUpdaterParameter ¶meter)
operate single spin flip in a classical ising system
Definition single_spin_flip.hpp:68
static void do_calc(QIsing &system, const utility::TransverseFieldUpdaterParameter ¶meter, size_t i, size_t t, FloatType B)
Definition single_spin_flip.hpp:197
static void update(QIsing &system, RandomNumberEngine &random_number_engine, const utility::TransverseFieldUpdaterParameter ¶meter)
operate single spin flip in a transverse ising system
Definition single_spin_flip.hpp:129
static std::size_t mod_t(std::int64_t a, std::size_t num_trotter_slices)
Definition single_spin_flip.hpp:253
typename GraphType::value_type FloatType
float type
Definition single_spin_flip.hpp:115
naive single spin flip updater
Definition single_spin_flip.hpp:36
updater parameter for classical ising system
Definition schedule_list.hpp:37
double beta
inverse temperature
Definition schedule_list.hpp:46
updater paramter for transverse ising model
Definition schedule_list.hpp:74
double beta
inverse temperature
Definition schedule_list.hpp:85
double s
annealing schedule (from 0 (only transverse field) to 1 (only classical Hamiltonian))
Definition schedule_list.hpp:91