13 #ifndef XACC_ALGORITHM_RBM_CLASSIFICATION_DWAVE_MCMCEXP_HPP_ 14 #define XACC_ALGORITHM_RBM_CLASSIFICATION_DWAVE_MCMCEXP_HPP_ 16 #include "rbm_classification.hpp" 29 Eigen::VectorXi sampleArray(Eigen::VectorXd &probs) {
31 Eigen::VectorXd random = Eigen::VectorXd::Random(probs.size());
32 Eigen::VectorXi A = Eigen::VectorXi::Ones(probs.size());
34 for (
int i = 0; i < probs.size(); i++) {
35 A(i) = random(i) > probs(i) ? -1 : A(i);
41 Eigen::VectorXi sampleHGivenV(Eigen::VectorXi &v, Eigen::VectorXd &b,
43 Eigen::VectorXd tmp = 2 * (b + w * v.cast<
double>());
44 for (
int i = 0; i < tmp.size(); i++) {
45 tmp(i) = 1. / (1. + std::exp(-tmp(i)));
47 Eigen::VectorXd h_probs = tmp;
48 return sampleArray(h_probs);
50 Eigen::VectorXi sampleVGivenH(Eigen::VectorXi &h, Eigen::VectorXd &a,
52 Eigen::VectorXd tmp = 2 * (a + w * h.cast<
double>());
53 for (
int i = 0; i < tmp.size(); i++) {
54 tmp(i) = 1. / (1. + std::exp(-tmp(i)));
56 Eigen::VectorXd v_probs = tmp;
57 return sampleArray(v_probs);
61 const std::string
name()
const override {
return "dwave-mcmc"; }
64 std::tuple<Eigen::MatrixXd, Eigen::VectorXd, Eigen::VectorXd>
65 compute(Eigen::MatrixXd &features, Eigen::MatrixXd &w, Eigen::VectorXd &v,
68 int nSamples = options.keyExists<
int>(
"n-samples")
69 ? options.get<
int>(
"n-samples")
72 Eigen::VectorXi curr_v = Eigen::VectorXi::Ones(v.size());
73 Eigen::VectorXd tmp = Eigen::VectorXd::Random(v.size());
74 for (
int i = 0; i < tmp.size(); i++) {
75 curr_v(i) = tmp(i) > .5 ? curr_v(i) : -1;
77 std::vector<Eigen::VectorXi> vs, hs;
78 for (
int i = 0; i < nSamples; i++) {
80 Eigen::VectorXi curr_h = sampleHGivenV(curr_v, h, w);
82 curr_v = sampleVGivenH(curr_h, v, w);
85 Eigen::MatrixXi visibles = Eigen::MatrixXi::Zero(nSamples, v.size());
86 for (
int i = 0; i < nSamples; i++) {
87 visibles.row(i) = vs[i];
89 Eigen::MatrixXi hidden = Eigen::MatrixXi::Zero(nSamples, h.size());
90 for (
int i = 0; i < nSamples; i++) {
91 hidden.row(i) = hs[i];
95 Eigen::VectorXd sum_v = Eigen::VectorXd::Zero(v.size());
96 for (
int i = 0; i < v.size(); i++) {
97 sum_v(i) = visibles.col(i).sum();
101 Eigen::VectorXd sum_h = Eigen::VectorXd::Zero(h.size());
102 for (
int i = 0; i < h.size(); i++) {
103 sum_h(i) = hidden.col(i).sum();
107 Eigen::MatrixXd sum_vh = (visibles.transpose() * hidden).cast<double>();
110 Eigen::MatrixXd expW = sum_vh / nSamples;
111 Eigen::VectorXd expv = sum_v / nSamples;
112 Eigen::VectorXd exph = sum_h / nSamples;
116 return std::make_tuple(expW, expv, exph);
const std::string description() const override
Definition: dwave_rbm_mcmc_expectations.hpp:62
const std::string name() const override
Definition: dwave_rbm_mcmc_expectations.hpp:61
Definition: dwave_rbm_mcmc_expectations.hpp:21
Definition: Accelerator.hpp:25
Definition: rbm_classification.hpp:24
Definition: heterogeneous.hpp:45