openjij
Framework for the Ising model and QUBO.
Loading...
Searching...
No Matches
classical_ising.hpp
Go to the documentation of this file.
1// Copyright 2023 Jij Inc.
2
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6
7// http://www.apache.org/licenses/LICENSE-2.0
8
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <cassert>
18#include <type_traits>
19#include <utility>
20
21#include <Eigen/Dense>
22#include <Eigen/Sparse>
23
24#include <cimod/utilities.hpp>
25
26#include "openjij/graph/all.hpp"
29
30namespace openjij {
31namespace system {
32
38template <typename GraphType> struct ClassicalIsing;
39
45template <typename FloatType> struct ClassicalIsing<graph::Dense<FloatType>> {
47
48 // matrix (row major)
49 using MatrixXx =
50 Eigen::Matrix<FloatType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
51 // vector (col major)
52 using VectorXx = Eigen::Matrix<FloatType, Eigen::Dynamic, 1, Eigen::ColMajor>;
53
60 ClassicalIsing(const graph::Spins &init_spin,
61 const graph::Dense<FloatType> &init_interaction)
62 : spin(utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
63 init_spin)),
64 interaction(init_interaction.get_interactions()),
65 num_spins(init_interaction.get_num_spins()) {
66 cimod::CheckVariables(init_spin, cimod::Vartype::SPIN);
67 assert(init_spin.size() == init_interaction.get_num_spins());
68 reset_dE();
69 }
70
76 void reset_spins(const graph::Spins &init_spin) {
77 this->spin =
78 utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
79 init_spin);
80 reset_dE();
81 }
82
87 inline void reset_dE() {
88 this->dE =
89 -2.0 * this->spin.array() * (this->interaction * this->spin).array();
90 }
91
96
101
105 const std::size_t num_spins; // spin.size()-1
106
111};
112
118template <typename FloatType> struct ClassicalIsing<graph::Sparse<FloatType>> {
120
121 // matrix (row major)
122 using SparseMatrixXx = Eigen::SparseMatrix<FloatType, Eigen::RowMajor>;
123 // vector (col major)
124 using VectorXx = Eigen::Matrix<FloatType, Eigen::Dynamic, 1, Eigen::ColMajor>;
125
132 ClassicalIsing(const graph::Spins &init_spin,
133 const graph::Sparse<FloatType> &init_interaction)
134 : spin(utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
135 init_spin)),
136 interaction(
137 utility::gen_matrix_from_graph<Eigen::RowMajor>(init_interaction)),
138 num_spins(init_interaction.get_num_spins()) {
139 assert(init_spin.size() == init_interaction.get_num_spins());
140 reset_dE();
141 }
142
148 void reset_spins(const graph::Spins &init_spin) {
149 this->spin =
150 utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
151 init_spin);
152 reset_dE();
153 }
154
159 void reset_dE() {
160 this->dE =
161 -2.0 * this->spin.array() * (this->interaction * this->spin).array();
162 }
163
168
173
177 const std::size_t num_spins; // spin.size()-1
178
183};
184
190template <typename FloatType> struct ClassicalIsing<graph::CSRSparse<FloatType>> {
192
193 // matrix (row major)
194 using SparseMatrixXx = Eigen::SparseMatrix<FloatType, Eigen::RowMajor>;
195 // vector (col major)
196 using VectorXx = Eigen::Matrix<FloatType, Eigen::Dynamic, 1, Eigen::ColMajor>;
197
204 ClassicalIsing(const graph::Spins &init_spin,
205 const graph::CSRSparse<FloatType> &init_interaction)
206 : spin(utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
207 init_spin)),
208 interaction(init_interaction.get_interactions()),
209 num_spins(init_interaction.get_num_spins()) {
210 assert(init_spin.size() == init_interaction.get_num_spins());
211 reset_dE();
212 }
213
219 void reset_spins(const graph::Spins &init_spin) {
220 this->spin =
221 utility::gen_vector_from_std_vector<FloatType, Eigen::ColMajor>(
222 init_spin);
223 reset_dE();
224 }
225
230 void reset_dE() {
231 this->dE =
232 -2.0 * this->spin.array() * (this->interaction * this->spin).array();
233 }
234
239
244
248 const std::size_t num_spins; // spin.size()-1
249
254};
255
265template <typename GraphType>
266auto make_classical_ising(const graph::Spins &init_spin,
267 const GraphType &init_interaction) {
268 return ClassicalIsing<GraphType>(init_spin, init_interaction);
269}
270
271} // namespace system
272} // namespace openjij
CSRSparse graph: just store CSR Sparse Matrix (Eigen::Sparse) The Hamiltonian is like.
Definition csr_sparse.hpp:42
two-body all-to-all interactions The Hamiltonian is like
Definition dense.hpp:44
std::size_t get_num_spins() const noexcept
get number of spins
Definition graph.hpp:89
Sparse graph: two-body intereactions with O(1) connectivity The Hamiltonian is like.
Definition sparse.hpp:40
std::vector< Spin > Spins
Definition graph.hpp:27
auto make_classical_ising(const graph::Spins &init_spin, const GraphType &init_interaction)
helper function for ClassicalIsing constructor
Definition classical_ising.hpp:266
Definition algorithm.hpp:24
double FloatType
Note:
Definition compile_config.hpp:37
VectorXx spin
spins (Eigen Vector)
Definition classical_ising.hpp:238
const std::size_t num_spins
number of real spins (dummy spin excluded)
Definition classical_ising.hpp:248
Eigen::SparseMatrix< FloatType, Eigen::RowMajor > SparseMatrixXx
Definition classical_ising.hpp:194
void reset_dE()
reset dE
Definition classical_ising.hpp:230
ClassicalIsing(const graph::Spins &init_spin, const graph::CSRSparse< FloatType > &init_interaction)
Constructor to initialize spin and interaction.
Definition classical_ising.hpp:204
VectorXx dE
delta E for updater
Definition classical_ising.hpp:253
const SparseMatrixXx interaction
interaction (Eigen SparseMatrix)
Definition classical_ising.hpp:243
void reset_spins(const graph::Spins &init_spin)
reset spins
Definition classical_ising.hpp:219
Eigen::Matrix< FloatType, Eigen::Dynamic, 1, Eigen::ColMajor > VectorXx
Definition classical_ising.hpp:196
const std::size_t num_spins
number of real spins (dummy spin excluded)
Definition classical_ising.hpp:105
void reset_dE()
reset dE
Definition classical_ising.hpp:87
Eigen::Matrix< FloatType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixXx
Definition classical_ising.hpp:50
void reset_spins(const graph::Spins &init_spin)
reset spins
Definition classical_ising.hpp:76
VectorXx dE
delta E for updater
Definition classical_ising.hpp:110
Eigen::Matrix< FloatType, Eigen::Dynamic, 1, Eigen::ColMajor > VectorXx
Definition classical_ising.hpp:52
ClassicalIsing(const graph::Spins &init_spin, const graph::Dense< FloatType > &init_interaction)
Constructor to initialize spin and interaction.
Definition classical_ising.hpp:60
const MatrixXx interaction
interactions (Eigen Matrix)
Definition classical_ising.hpp:100
VectorXx spin
spins (Eigen Vector)
Definition classical_ising.hpp:95
Eigen::SparseMatrix< FloatType, Eigen::RowMajor > SparseMatrixXx
Definition classical_ising.hpp:122
const std::size_t num_spins
number of real spins (dummy spin excluded)
Definition classical_ising.hpp:177
ClassicalIsing(const graph::Spins &init_spin, const graph::Sparse< FloatType > &init_interaction)
Constructor to initialize spin and interaction.
Definition classical_ising.hpp:132
VectorXx spin
spins (Eigen Vector)
Definition classical_ising.hpp:167
const SparseMatrixXx interaction
interaction (Eigen SparseMatrix)
Definition classical_ising.hpp:172
void reset_spins(const graph::Spins &init_spin)
reset spins
Definition classical_ising.hpp:148
void reset_dE()
reset dE
Definition classical_ising.hpp:159
VectorXx dE
delta E for updater
Definition classical_ising.hpp:182
Eigen::Matrix< FloatType, Eigen::Dynamic, 1, Eigen::ColMajor > VectorXx
Definition classical_ising.hpp:124
ClassicalIsing structure (system for classical Ising model)
Definition classical_ising.hpp:38
classical monte carlo system (using beta (inverse temperature) for annealing parameter)
Definition system.hpp:31