4 #include "bit_flip_code.hpp"
5 #include "five_qubit_code.hpp"
6 #include "seven_qubit_steane_code.hpp"
13 using encodeFn = std::function<void(qreg,
int, std::vector<int>)>;
19 using recoverFn = std::function<void(qreg, std::vector<int>, std::vector<int>)>;
22 using stabilizerGroups = std::vector<std::vector<qcor::Operator>>;
24 using QecCode = std::tuple<stabilizerGroups, encodeFn, recoverFn>;
33 QecCode getQecCode(
const std::string &in_codeName) {
34 if (in_codeName ==
"bit-flip") {
36 [](qreg q,
int dataQubitIdx, std::vector<int> scratchQubitIdx) {
37 bit_flip_encoder(q, dataQubitIdx, scratchQubitIdx);
40 [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
41 bit_flip_recover(q, logicalReg, syndromes);
43 return std::make_tuple(bit_flip_code_stabilizers(), encoder, recover);
45 if (in_codeName ==
"five-qubit") {
47 [](qreg q,
int dataQubitIdx, std::vector<int> scratchQubitIdx) {
48 five_qubit_code_encoder(q, dataQubitIdx, scratchQubitIdx);
51 [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
52 five_qubit_code_recover(q, logicalReg, syndromes);
54 return std::make_tuple(five_qubit_code_stabilizers(), encoder, recover);
56 if (in_codeName ==
"steane") {
58 [](qreg q,
int dataQubitIdx, std::vector<int> scratchQubitIdx) {
59 seven_qubit_code_encoder(q, dataQubitIdx, scratchQubitIdx);
62 [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
63 seven_qubit_code_recover(q, logicalReg, syndromes);
65 return std::make_tuple(seven_qubit_code_stabilizers(), encoder, recover);
68 throw std::runtime_error(
"Error: '" + in_codeName +
69 "' is not a valid QEC code.");