4 #include "qcor_observable.hpp"
6 #ifdef _QCOR_FTQC_RUNTIME
8 __qpu__
void reset_all(qreg q) {
9 for (
int i = 0; i < q.size(); ++i) {
17 __qpu__
void measure_basis(qreg q, std::vector<qcor::Operator> bases,
20 for (
int i = 0; i < bases.size(); ++i) {
21 auto pauliOp = bases[i];
22 const std::string pauliStr = pauliOp.toString().substr(6);
23 const auto bitIdx = std::stoi(pauliStr.substr(1));
25 if (pauliStr.rfind(
"X", 0) == 0) {
29 if (pauliStr.rfind(
"Y", 0) == 0) {
30 Rx(q[bitIdx], M_PI_2);
32 if (Measure(q[bitIdx])) {
36 out_parity = oneCount - 2 * (oneCount / 2);
40 __qpu__
void measure_basis_with_scratch(qreg q,
int scratchQubit,
41 std::vector<qcor::Operator> bases,
44 for (
int i = 0; i < bases.size(); ++i) {
45 auto pauliOp = bases[i];
46 const std::string pauliStr = pauliOp.toString().substr(6);
47 const auto bitIdx = std::stoi(pauliStr.substr(1));
49 if (pauliStr.rfind(
"X", 0) == 0) {
50 CX(q[scratchQubit], q[bitIdx]);
53 if (pauliStr.rfind(
"Y", 0) == 0) {
54 CY(q[scratchQubit], q[bitIdx]);
57 if (pauliStr.rfind(
"Z", 0) == 0) {
58 CZ(q[scratchQubit], q[bitIdx]);
62 if (Measure(q[scratchQubit])) {