6 #include "qcor_observable.hpp"
8 #ifdef _QCOR_FTQC_RUNTIME
10 __qpu__
void estimate_term_expectation(
11 qreg q,
const std::function<
void(qreg)> &statePrep,
12 std::vector<qcor::Operator> bases,
int nSamples,
double &out_energy) {
14 for (
int i = 0; i < nSamples; ++i) {
17 measure_basis(q, bases, parity);
25 out_energy = sum / nSamples;
37 __qpu__
void estimate_energy(qreg q,
const std::function<
void(qreg)> &statePrep,
40 std::complex<double> energy = observable.hasIdentitySubTerm() ? observable.getIdentitySubTerm().coefficient().real() : 0.0;
41 for (
auto pauliInst : observable.getNonIdentitySubTerms()) {
42 auto coeff = pauliInst.coefficient().real();
43 auto [zv, xv] = pauliInst.toBinaryVectors(q.size());
44 std::vector<qcor::Operator> ops;
45 for (
auto [i, x_val] : enumerate(xv)) {
49 ops.emplace_back(qcor::Y(i));
50 }
else if (x_val == 0) {
52 ops.emplace_back(qcor::Z(i));
56 ops.emplace_back(qcor::X(i));
60 double termEnergy = 0.0;
61 estimate_term_expectation(q, statePrep, ops, nSamples, termEnergy);
62 energy = energy + (coeff * termEnergy);
65 energy = energy + coeff;
68 out_energy = energy.real();