QCOR
qec_factory.hpp
1 
2 #pragma once
3 #include <functional>
4 #include "bit_flip_code.hpp"
5 #include "five_qubit_code.hpp"
6 #include "seven_qubit_steane_code.hpp"
7 
8 // Encode a physical qubit into a logical qubit using given scratch qubits.
9 // Inputs:
10 // - Qubit register
11 // - Data qubit index (int)
12 // - List of scratch qubits (vector<int>)
13 using encodeFn = std::function<void(qreg, int, std::vector<int>)>;
14 // Recover (apply error correction) based on syndrome data:
15 // Inputs:
16 // - Qubit register
17 // - Logical qubit register (vector<int>)
18 // - Syndrome data (vector<int>)
19 using recoverFn = std::function<void(qreg, std::vector<int>, std::vector<int>)>;
20 
21 // Set of stabilizers define the QEC code
22 using stabilizerGroups = std::vector<std::vector<qcor::Operator>>;
23 
24 using QecCode = std::tuple<stabilizerGroups, encodeFn, recoverFn>;
25 
26 // Get the set of utils to handle a specific QEC code
27 // Code name:
28 // - "bit-flip"
29 // - "five-qubit"
30 // - "steane" (7 qubits)
31 // - "surface-code",
32 // etc.
33 QecCode getQecCode(const std::string &in_codeName) {
34  if (in_codeName == "bit-flip") {
35  encodeFn encoder(
36  [](qreg q, int dataQubitIdx, std::vector<int> scratchQubitIdx) {
37  bit_flip_encoder(q, dataQubitIdx, scratchQubitIdx);
38  });
39  recoverFn recover(
40  [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
41  bit_flip_recover(q, logicalReg, syndromes);
42  });
43  return std::make_tuple(bit_flip_code_stabilizers(), encoder, recover);
44  }
45  if (in_codeName == "five-qubit") {
46  encodeFn encoder(
47  [](qreg q, int dataQubitIdx, std::vector<int> scratchQubitIdx) {
48  five_qubit_code_encoder(q, dataQubitIdx, scratchQubitIdx);
49  });
50  recoverFn recover(
51  [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
52  five_qubit_code_recover(q, logicalReg, syndromes);
53  });
54  return std::make_tuple(five_qubit_code_stabilizers(), encoder, recover);
55  }
56  if (in_codeName == "steane") {
57  encodeFn encoder(
58  [](qreg q, int dataQubitIdx, std::vector<int> scratchQubitIdx) {
59  seven_qubit_code_encoder(q, dataQubitIdx, scratchQubitIdx);
60  });
61  recoverFn recover(
62  [](qreg q, std::vector<int> logicalReg, std::vector<int> syndromes) {
63  seven_qubit_code_recover(q, logicalReg, syndromes);
64  });
65  return std::make_tuple(seven_qubit_code_stabilizers(), encoder, recover);
66  }
67 
68  throw std::runtime_error("Error: '" + in_codeName +
69  "' is not a valid QEC code.");
70 }