openjij
Framework for the Ising model and QUBO.
Loading...
Searching...
No Matches
continuous_time_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 <utility>
19#include <vector>
20
21#include "openjij/graph/all.hpp"
24
25namespace openjij {
26namespace system {
27
34template <typename GraphType> struct ContinuousTimeIsing;
35
41template <typename FloatType>
42struct ContinuousTimeIsing<graph::Sparse<FloatType>> {
46 using CutPoint = std::pair<TimeType, graph::Spin>;
47
51 using SparseMatrixXx = Eigen::SparseMatrix<FloatType, Eigen::RowMajor>;
52
58 using SpinConfiguration = std::vector<std::vector<CutPoint>>;
59
67 ContinuousTimeIsing(const SpinConfiguration &init_spin_config,
68 const GraphType &init_interaction, const double gamma)
69 : spin_config(init_spin_config), num_spins(init_spin_config.size() + 1),
70 interaction(
71 utility::gen_matrix_from_graph<Eigen::RowMajor>(init_interaction)),
72 gamma(gamma) {
73
74 assert(init_spin_config.size() == init_interaction.get_num_spins());
75
76 // insert numbers to diagnonal elements in the interaction
77 SparseMatrixXx diag(init_interaction.get_num_spins() + 1,
78 init_interaction.get_num_spins() + 1);
79
80 for (typename SparseMatrixXx::InnerIterator it(
81 interaction, init_interaction.get_num_spins());
82 it; ++it) {
83 std::size_t j = it.index();
84 FloatType v = it.value();
85 if (j != init_interaction.get_num_spins()) {
86 diag.insert(j, j) = v;
87 } else {
88 diag.insert(j, j) = -1;
89 }
90 }
91
92 interaction += diag;
93
94 spin_config.push_back(std::vector<CutPoint>{CutPoint(0.0, 1)});
95 // initialize auxiliary spin with 1 along entire timeline
96 }
97
109 const GraphType &init_interaction, const double gamma)
110 : ContinuousTimeIsing(convert_to_spin_config(init_spins),
111 init_interaction, gamma) {
112 } // constructor delegation
113
114 /* initialization helper functions */
115private:
123 SpinConfiguration spin_config;
124 spin_config.reserve(spins.size());
125
126 /* set spin configuration for each site, which has only one cut at time zero
127 */
128 for (auto spin : spins) {
129 spin_config.push_back(std::vector<CutPoint>{
130 CutPoint(TimeType(), spin)}); // TimeType() is zero value of the type
131 }
132
133 return spin_config;
134 }
135
136 /* member functions*/
137public:
144 void reset_spins(const SpinConfiguration &init_spin_config) {
145 assert(init_spin_config.size() == this->num_spins - 1);
146
147 this->spin_config = init_spin_config;
148 this->spin_config.push_back(std::vector<CutPoint>{CutPoint(TimeType(), 1)});
149 // add auxiliary timeline
150 }
151
157 void reset_spins(const graph::Spins &classical_spins) {
158 assert(classical_spins.size() == this->num_spins - 1);
159
160 for (size_t i = 0; i < this->num_spins - 1; i++) {
161 this->spin_config[i] = std::vector<CutPoint>{
163 classical_spins[i]) // TimeType() is zero value of the type
164 };
165 }
166 this->spin_config[this->num_spins - 1] =
167 std::vector<CutPoint>{CutPoint(TimeType(), 1)};
168 }
169
179 TimeType time_point) const {
180 static const auto first_lt = [](CutPoint x, CutPoint y) {
181 return x.first < y.first;
182 };
183 // function to compare two time points (lt; less than)
184
185 const auto &timeline = this->spin_config[site_index];
186 const auto dummy_cut =
187 CutPoint(time_point, 0); // dummy variable for binary search
188 auto found_itr =
189 std::upper_bound(timeline.begin(), timeline.end(), dummy_cut, first_lt);
190
191 if (found_itr ==
192 timeline.begin()) { // if the time_point lies before any time points
193 found_itr = timeline.end() - 1; // periodic boundary condition
194 } else {
195 found_itr--;
196 }
197
198 return std::distance(timeline.begin(), found_itr);
199 }
200
201 /*
202 * @brief return spin configuration at given temporal slice, not containing
203 * auxiliary spin
204 *
205 * @param slice_time
206 */
208 graph::Spins slice;
209
210 for (graph::Index i = 0; i < this->spin_config.size() - 1; i++) {
211 auto temporal_index = get_temporal_spin_index(i, slice_time);
212 slice.push_back(this->spin_config[i][temporal_index].second);
213 }
214
215 return slice;
216 }
217
218 /*
219 * @brief return auxiliary spin state at given temporal slice
220 *
221 * @param slice_time
222 */
224 auto last_index = this->spin_config.size() - 1;
225 auto temporal_index = get_temporal_spin_index(last_index, slice_time);
226 return this->spin_config[last_index][temporal_index].second;
227 }
228
229 /* Member variables */
230
235
240 const std::size_t num_spins;
241
246
252};
253
259template <typename FloatType>
260struct ContinuousTimeIsing<graph::CSRSparse<FloatType>> {
264 using CutPoint = std::pair<TimeType, graph::Spin>;
265
269 using SparseMatrixXx = Eigen::SparseMatrix<FloatType, Eigen::RowMajor>;
270
276 using SpinConfiguration = std::vector<std::vector<CutPoint>>;
277
285 ContinuousTimeIsing(const SpinConfiguration &init_spin_config,
286 const GraphType &init_interaction, const double gamma)
287 : spin_config(init_spin_config), num_spins(init_spin_config.size() + 1),
288 interaction(init_interaction.get_interactions()),
289 gamma(gamma) {
290
291 assert(init_spin_config.size() == init_interaction.get_num_spins());
292
293 // insert numbers to diagnonal elements in the interaction
294 SparseMatrixXx diag(init_interaction.get_num_spins() + 1,
295 init_interaction.get_num_spins() + 1);
296
297 for (typename SparseMatrixXx::InnerIterator it(
298 interaction, init_interaction.get_num_spins());
299 it; ++it) {
300 std::size_t j = it.index();
301 FloatType v = it.value();
302 if (j != init_interaction.get_num_spins()) {
303 diag.insert(j, j) = v;
304 } else {
305 diag.insert(j, j) = -1;
306 }
307 }
308
309 interaction += diag;
310
311 spin_config.push_back(std::vector<CutPoint>{CutPoint(0.0, 1)});
312 // initialize auxiliary spin with 1 along entire timeline
313 }
314
326 const GraphType &init_interaction, const double gamma)
327 : ContinuousTimeIsing(convert_to_spin_config(init_spins),
328 init_interaction, gamma) {
329 } // constructor delegation
330
331 /* initialization helper functions */
332private:
340 SpinConfiguration spin_config;
341 spin_config.reserve(spins.size());
342
343 /* set spin configuration for each site, which has only one cut at time zero
344 */
345 for (auto spin : spins) {
346 spin_config.push_back(std::vector<CutPoint>{
347 CutPoint(TimeType(), spin)}); // TimeType() is zero value of the type
348 }
349
350 return spin_config;
351 }
352
353 /* member functions*/
354public:
361 void reset_spins(const SpinConfiguration &init_spin_config) {
362 assert(init_spin_config.size() == this->num_spins - 1);
363
364 this->spin_config = init_spin_config;
365 this->spin_config.push_back(std::vector<CutPoint>{CutPoint(TimeType(), 1)});
366 // add auxiliary timeline
367 }
368
374 void reset_spins(const graph::Spins &classical_spins) {
375 assert(classical_spins.size() == this->num_spins - 1);
376
377 for (size_t i = 0; i < this->num_spins - 1; i++) {
378 this->spin_config[i] = std::vector<CutPoint>{
380 classical_spins[i]) // TimeType() is zero value of the type
381 };
382 }
383 this->spin_config[this->num_spins - 1] =
384 std::vector<CutPoint>{CutPoint(TimeType(), 1)};
385 }
386
396 TimeType time_point) const {
397 static const auto first_lt = [](CutPoint x, CutPoint y) {
398 return x.first < y.first;
399 };
400 // function to compare two time points (lt; less than)
401
402 const auto &timeline = this->spin_config[site_index];
403 const auto dummy_cut =
404 CutPoint(time_point, 0); // dummy variable for binary search
405 auto found_itr =
406 std::upper_bound(timeline.begin(), timeline.end(), dummy_cut, first_lt);
407
408 if (found_itr ==
409 timeline.begin()) { // if the time_point lies before any time points
410 found_itr = timeline.end() - 1; // periodic boundary condition
411 } else {
412 found_itr--;
413 }
414
415 return std::distance(timeline.begin(), found_itr);
416 }
417
418 /*
419 * @brief return spin configuration at given temporal slice, not containing
420 * auxiliary spin
421 *
422 * @param slice_time
423 */
425 graph::Spins slice;
426
427 for (graph::Index i = 0; i < this->spin_config.size() - 1; i++) {
428 auto temporal_index = get_temporal_spin_index(i, slice_time);
429 slice.push_back(this->spin_config[i][temporal_index].second);
430 }
431
432 return slice;
433 }
434
435 /*
436 * @brief return auxiliary spin state at given temporal slice
437 *
438 * @param slice_time
439 */
441 auto last_index = this->spin_config.size() - 1;
442 auto temporal_index = get_temporal_spin_index(last_index, slice_time);
443 return this->spin_config[last_index][temporal_index].second;
444 }
445
446 /* Member variables */
447
452
457 const std::size_t num_spins;
458
463
469};
470
481template <typename GraphType>
484 const GraphType &init_interaction, double gamma) {
485 return ContinuousTimeIsing<GraphType>(init_spins, init_interaction, gamma);
486}
487} // namespace system
488} // namespace openjij
CSRSparse graph: just store CSR Sparse Matrix (Eigen::Sparse) The Hamiltonian is like.
Definition csr_sparse.hpp:42
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
int Spin
Definition graph.hpp:26
std::size_t Index
Definition graph.hpp:30
ContinuousTimeIsing< GraphType > make_continuous_time_ising(const graph::Spins &init_spins, const GraphType &init_interaction, double gamma)
helper function for ContinuousTimeIsing constructor
Definition continuous_time_ising.hpp:483
Definition algorithm.hpp:24
double FloatType
Note:
Definition compile_config.hpp:37
std::pair< TimeType, graph::Spin > CutPoint
Definition continuous_time_ising.hpp:264
Eigen::SparseMatrix< FloatType, Eigen::RowMajor > SparseMatrixXx
Interaction type (Eigen sparse matrix)
Definition continuous_time_ising.hpp:269
graph::Spin get_auxiliary_spin(TimeType slice_time) const
Definition continuous_time_ising.hpp:440
void reset_spins(const graph::Spins &classical_spins)
reset spins with given spin configuration
Definition continuous_time_ising.hpp:374
size_t get_temporal_spin_index(graph::Index site_index, TimeType time_point) const
return time-direction index which exists just before time_point at "site_index"th site.
Definition continuous_time_ising.hpp:395
const std::size_t num_spins
number of spins, including auxiliary spin for longitudinal magnetic field
Definition continuous_time_ising.hpp:457
SpinConfiguration spin_config
spin configuration
Definition continuous_time_ising.hpp:451
const FloatType gamma
coefficient of transverse field term, actual field would be gamma * s, where s = [0:1]
Definition continuous_time_ising.hpp:468
FloatType TimeType
Definition continuous_time_ising.hpp:263
std::vector< std::vector< CutPoint > > SpinConfiguration
spin configuration in real and continuous time space spin_config[i][j] -> at i th site,...
Definition continuous_time_ising.hpp:276
graph::Spins get_slice_at(TimeType slice_time) const
Definition continuous_time_ising.hpp:424
void reset_spins(const SpinConfiguration &init_spin_config)
reset spins with given spin configuration
Definition continuous_time_ising.hpp:361
SparseMatrixXx interaction
interaction
Definition continuous_time_ising.hpp:462
static SpinConfiguration convert_to_spin_config(const graph::Spins &spins)
convert classical spins to spin configuration; each site has only one cut with given spin state at ti...
Definition continuous_time_ising.hpp:339
ContinuousTimeIsing(const SpinConfiguration &init_spin_config, const GraphType &init_interaction, const double gamma)
ContinuousTimeIsing constructor.
Definition continuous_time_ising.hpp:285
ContinuousTimeIsing(const graph::Spins &init_spins, const GraphType &init_interaction, const double gamma)
ContinuousTimeIsing constructor.
Definition continuous_time_ising.hpp:325
FloatType TimeType
Definition continuous_time_ising.hpp:45
size_t get_temporal_spin_index(graph::Index site_index, TimeType time_point) const
return time-direction index which exists just before time_point at "site_index"th site.
Definition continuous_time_ising.hpp:178
ContinuousTimeIsing(const SpinConfiguration &init_spin_config, const GraphType &init_interaction, const double gamma)
ContinuousTimeIsing constructor.
Definition continuous_time_ising.hpp:67
SpinConfiguration spin_config
spin configuration
Definition continuous_time_ising.hpp:234
void reset_spins(const graph::Spins &classical_spins)
reset spins with given spin configuration
Definition continuous_time_ising.hpp:157
std::vector< std::vector< CutPoint > > SpinConfiguration
spin configuration in real and continuous time space spin_config[i][j] -> at i th site,...
Definition continuous_time_ising.hpp:58
graph::Spins get_slice_at(TimeType slice_time) const
Definition continuous_time_ising.hpp:207
const std::size_t num_spins
number of spins, including auxiliary spin for longitudinal magnetic field
Definition continuous_time_ising.hpp:240
const FloatType gamma
coefficient of transverse field term, actual field would be gamma * s, where s = [0:1]
Definition continuous_time_ising.hpp:251
std::pair< TimeType, graph::Spin > CutPoint
Definition continuous_time_ising.hpp:46
void reset_spins(const SpinConfiguration &init_spin_config)
reset spins with given spin configuration
Definition continuous_time_ising.hpp:144
static SpinConfiguration convert_to_spin_config(const graph::Spins &spins)
convert classical spins to spin configuration; each site has only one cut with given spin state at ti...
Definition continuous_time_ising.hpp:122
SparseMatrixXx interaction
interaction
Definition continuous_time_ising.hpp:245
graph::Spin get_auxiliary_spin(TimeType slice_time) const
Definition continuous_time_ising.hpp:223
ContinuousTimeIsing(const graph::Spins &init_spins, const GraphType &init_interaction, const double gamma)
ContinuousTimeIsing constructor.
Definition continuous_time_ising.hpp:108
Eigen::SparseMatrix< FloatType, Eigen::RowMajor > SparseMatrixXx
Interaction type (Eigen sparse matrix)
Definition continuous_time_ising.hpp:51
Continuous Time Quantum Ising system.
Definition continuous_time_ising.hpp:34
ordinary homogeneous transverse field system (using beta and annealing schedule (s) for annealing par...
Definition system.hpp:48