44template <
typename FloatType>
class Dense :
public Graph {
45 static_assert(std::is_floating_point<FloatType>::value,
46 "FloatType must be floating-point type.");
64 Eigen::Matrix<FloatType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
83 explicit Dense(std::size_t num_spins)
85 _J(num_spins, num_spins) = 1;
109 this->_J =
bqm.interaction_matrix();
118 if (interaction.rows() != interaction.cols()) {
119 std::runtime_error(
"interaction.rows() != interaction.cols()");
123 throw std::runtime_error(
"invalid matrix size.");
127 for (
size_t i = 0; i < (
size_t)(interaction.rows() - 1); i++) {
128 if (interaction(i, i) != 0) {
129 throw std::runtime_error(
130 "The diagonal elements of interaction matrix must be zero.");
134 if (interaction(interaction.rows() - 1, interaction.rows() - 1) != 1) {
135 throw std::runtime_error(
136 "The right bottom element of interaction matrix must be unity.");
161 return this->
energy(spins);
165 Eigen::ColMajor> &
spins)
const {
177 if (
spins.size() !=
this->get_num_spins()) {
178 throw std::out_of_range(
"Out of range in energy in Dense graph.");
181 using Vec = Eigen::Matrix<FloatType, Eigen::Dynamic, 1, Eigen::ColMajor>;
183 for (
size_t i = 0; i <
spins.size(); i++) {
189 return (s.transpose() *
195 Eigen::ColMajor> &
spins)
const {
197 for (
size_t i = 0; i <
temp_spins.size(); i++) {
216 return _J(std::min(i,
j), std::max(i,
j));
234 return _J(std::min(i,
j), std::max(i,
j));
two-body all-to-all interactions The Hamiltonian is like
Definition dense.hpp:44
Dense(const json &j)
Dense constructor (from nlohmann::json)
Definition dense.hpp:93
FloatType value_type
float type
Definition dense.hpp:69
FloatType & J(Index i, Index j)
access J_{ij}
Definition dense.hpp:211
FloatType energy(const Spins &spins) const
calculate total energy
Definition dense.hpp:176
Interactions _J
interactions
Definition dense.hpp:75
FloatType energy(const Eigen::Matrix< FloatType, Eigen::Dynamic, 1, Eigen::ColMajor > &spins) const
Definition dense.hpp:194
void set_interaction_matrix(const Interactions &interaction)
set interaction matrix from Eigen Matrix.
Definition dense.hpp:117
FloatType calc_energy(const Spins &spins) const
calculate total energy
Definition dense.hpp:160
Eigen::Matrix< FloatType, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > Interactions
interaction type (Eigen) The stored matrix has the following triangular form:
Definition dense.hpp:64
const FloatType & h(Index i) const
access h_{i} (local field)
Definition dense.hpp:258
const Interactions get_interactions() const
get interactions (Eigen Matrix)
Definition dense.hpp:280
Dense(std::size_t num_spins)
Dense constructor.
Definition dense.hpp:83
Dense(Dense< FloatType > &&)=default
Dense move constructor.
Dense(const Dense< FloatType > &)=default
Dense copy constructor.
FloatType calc_energy(const Eigen::Matrix< FloatType, Eigen::Dynamic, 1, Eigen::ColMajor > &spins) const
Definition dense.hpp:164
const FloatType & J(Index i, Index j) const
access J_{ij}
Definition dense.hpp:229
FloatType & h(Index i)
access h_{i} (local field)
Definition dense.hpp:246
Abstract graph class.
Definition graph.hpp:37
std::size_t get_num_spins() const noexcept
get number of spins
Definition graph.hpp:89
auto json_parse(const json &obj, bool relabel=true)
parse json object from bqm.to_serializable
Definition parse.hpp:50
std::vector< Spin > Spins
Definition graph.hpp:27
nlohmann::json json
Definition parse.hpp:33
std::size_t Index
Definition graph.hpp:30
Definition algorithm.hpp:24
double FloatType
Note:
Definition compile_config.hpp:37