Loading examples/ftqc_qrt/error_correcting_code.cpp 0 → 100644 +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 lib/impl/bit_flip_code.hpp 0 → 100644 +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 lib/impl/common.hpp +32 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
examples/ftqc_qrt/error_correcting_code.cpp 0 → 100644 +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
lib/impl/bit_flip_code.hpp 0 → 100644 +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
lib/impl/common.hpp +32 −0 Original line number Diff line number Diff line Loading @@ -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"