Commit ddf7d0d9 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Start working on QEC std lib



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 3e2e0690
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
#include <qcor_qec>

int main() {
  auto q = qalloc(4);
  bit_flip_encoder(q, 0, {1, 2});
}
 No newline at end of file
+31 −0
Original line number Diff line number Diff line
#pragma once
#include <qcor_common>

__qpu__ void bit_flip_encoder(qreg q, int dataQubitIdx,
                              std::vector<int> scratchQubitIdx) {
  CX(q[dataQubitIdx], q[scratchQubitIdx[0]]);
  CX(q[dataQubitIdx], q[scratchQubitIdx[1]]);
}

#ifdef _QCOR_FTQC_RUNTIME
namespace ftqc {
__qpu__ void measure_stabilizer_generators(
    qreg q, std::vector<std::vector<qcor::PauliOperator>> stabilizerGroup,
    std::vector<int> logicalReg, int scratchQubitIdx,
    std::vector<int> &out_syndromes) {
  for (auto &stabilizer : stabilizerGroup) {
    for(auto &op : stabilizer) {
      // TODO: generalize for all codes
      std::map<int, int> bitMap;
      bitMap[0] = logicalReg[0];
      bitMap[1] = logicalReg[1];
      bitMap[2] = logicalReg[2];
      op.mapQubitSites(bitMap);
    }
    int syndromeResult;
    measure_basis_with_scratch(q, scratchQubitIdx, stabilizer, syndromeResult);
    out_syndromes.emplace_back(syndromeResult);
  }
}
} // namespace ftqc
#endif
 No newline at end of file
+32 −0
Original line number Diff line number Diff line
@@ -35,5 +35,37 @@ __qpu__ void measure_basis(qreg q, std::vector<qcor::PauliOperator> bases,
  }
  out_parity = oneCount - 2 * (oneCount / 2);
}

// Measure the given Pauli operator using an explicit scratch qubit to perform the measurement.
__qpu__ void measure_basis_with_scratch(qreg q, int scratchQubit,
                                        std::vector<qcor::PauliOperator> bases,
                                        int &out_result) {
  H(q[scratchQubit]);
  for (int i = 0; i < bases.size(); ++i) {
    auto pauliOp = bases[i];
    const std::string pauliStr = pauliOp.toString().substr(6);
    const auto bitIdx = std::stoi(pauliStr.substr(1));
    // Pauli-X
    if (pauliStr.rfind("X", 0) == 0) {
      CX(q[scratchQubit], q[bitIdx]);
    }
    // Pauli-Y
    if (pauliStr.rfind("Y", 0) == 0) {
      CY(q[scratchQubit], q[bitIdx]);
    }
    // Pauli-Z
    if (pauliStr.rfind("Z", 0) == 0) {
      CZ(q[scratchQubit], q[bitIdx]);
    }
  }
  H(q[scratchQubit]);
  if (Measure(q[scratchQubit])) {
    out_result = 1;
    // Reset scratchQubit as well
    X(q[scratchQubit]);
  } else {
    out_result = 0;
  }
}
} // namespace ftqc
#endif
 No newline at end of file

lib/qcor_qec

0 → 100644
+2 −0
Original line number Diff line number Diff line
#pragma once
#include "impl/bit_flip_code.hpp"