XACC
dwave_expectation_strategy.hpp
1 /*******************************************************************************
2  * Copyright (c) 2020 UT-Battelle, LLC.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * and Eclipse Distribution License v1.0 which accompanies this
6  * distribution. The Eclipse Public License is available at
7  * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
8  *License is available at https://eclipse.org/org/documents/edl-v10.php
9  *
10  * Contributors:
11  * Alexander J. McCaskey - initial API and implementation
12  *******************************************************************************/
13 #ifndef XACC_ALGORITHM_RBM_CLASSIFICATION_DWAVE_DATAEXP_HPP_
14 #define XACC_ALGORITHM_RBM_CLASSIFICATION_DWAVE_DATAEXP_HPP_
15 
16 #include "rbm_classification.hpp"
17 #include "xacc.hpp"
18 
19 namespace xacc {
20 namespace algorithm {
21 
23 public:
24  const std::string name() const override { return "dwave-exp"; }
25  const std::string description() const override { return ""; }
26  std::tuple<Eigen::MatrixXd, Eigen::VectorXd, Eigen::VectorXd>
27  compute(Eigen::MatrixXd &features, Eigen::MatrixXd &w, Eigen::VectorXd &v,
28  Eigen::VectorXd &h, HeterogeneousMap options = {}) override {
29 
30 // def set_dwave_couplings(w, bh, bv):
31 // n_visible = len(bv)
32 // n_hidden = len(bh)
33 
34 // # Set Qubo
35 // Q = {}
36 // for i in range(n_visible):
37 // Q[(i, i)] = -1 * bv[i]
38 // for i in range(n_hidden):
39 // Q[(i + n_visible, i + n_visible)] = -1 * bh[i]
40 // for i in range(n_visible):
41 // for j in range(n_hidden):
42 // Q[(i, n_visible + j)] = -1 * w[i][j]
43 
44 // return Q
45 
46  auto qpu = xacc::getAccelerator("dwave");
47  auto provider = xacc::getIRProvider("quantum");
48  auto qubo = xacc::ir::asComposite(provider->createInstruction("rbm", {}));
49  int nv = qubo->getParameter(0).as<int>();
50  int nh = qubo->getParameter(1).as<int>();
51 
52  std::vector<double> evaled_params(nv + nh + nv*nh);
53  for (int i = 0; i < nv; i++) {
54  evaled_params[i] = v(i);
55  }
56  for (int i = nv; i < nv+nh; i++) {
57  evaled_params[i] = h(i);
58  }
59 
60  auto w_vec = w.data();
61  for (int i = nv+nh; i <nv+nh+nv*nh ; i++) {
62  evaled_params[i] = w_vec[i];
63  }
64 
65  auto evaled_qubo = (*qubo)(evaled_params);
66 
67  auto buffer = xacc::qalloc();
68  qpu->execute(buffer, evaled_qubo);
69 
70  // w = W.numpy()
71  // hidden_bias = bh.numpy()[0]
72  // visible_bias = bv.numpy()[0]
73  // n_hidden = len(hidden_bias)
74  // n_visible = len(visible_bias)
75 
76  // j = w/beta
77  // hh = hidden_bias/beta
78  // hv = visible_bias/beta
79 
80  // # Set Qubo
81  // Q = set_dwave_couplings(j, hh, hv)
82 
83  // samples, energies, num_occurrences = sampler.sample_qubo(Q, num_samples,
84  // save_embed,
85  // load_embed)
86 
87  // if save_samples:
88  // np.save(f'samples_{str(step).zfill(4)}.npy', samples)
89  // np.save(f'energies_{str(step).zfill(4)}.npy', energies)
90  // np.save(f'nocc_{str(step).zfill(4)}.npy', num_occurrences)
91  // np.save(f'w_{str(step).zfill(4)}.npy', w)
92  // np.save(f'bv_{str(step).zfill(4)}.npy', visible_bias)
93  // np.save(f'bh_{str(step).zfill(4)}.npy', hidden_bias)
94 
95  // visibles = samples[:, :n_visible]
96  // hidden = samples[:, n_visible:n_visible + n_hidden]
97  // visibles = np.repeat(visibles, num_occurrences, axis=0)
98  // hidden = np.repeat(hidden, num_occurrences, axis=0)
99  // visibles, hidden = gibbs_sample(num_gibbs_steps, visibles, hidden,
100  // w, bh, bv)
101  // sum_v = np.sum(visibles, axis=0)
102  // sum_h = np.sum(hidden, axis=0)
103  // sum_vh = np.matmul(np.transpose(visibles), hidden)
104  // sum_v = tf.reshape(tfe.Variable(sum_v, dtype=tf.float32), (1, n_visible))
105  // sum_h = tf.reshape(tfe.Variable(sum_h, dtype=tf.float32), (1, n_hidden))
106  // sum_vh = tfe.Variable(sum_vh, dtype=tf.float32)
107 
108  // expectation_W = sum_vh / float(num_samples)
109  // expectation_v = sum_v / float(num_samples)
110  // expectation_h = sum_h / float(num_samples)
111  // return expectation_W, expectation_v, expectation_h
112 
113  return;
114  }
115 };
116 } // namespace algorithm
117 } // namespace xacc
118 #endif
Definition: Accelerator.hpp:25
Definition: dwave_expectation_strategy.hpp:22
Definition: rbm_classification.hpp:24
const std::string name() const override
Definition: dwave_expectation_strategy.hpp:24
Definition: heterogeneous.hpp:45
const std::string description() const override
Definition: dwave_expectation_strategy.hpp:25