QuISP
Loading...
Searching...
No Matches
test.h
Go to the documentation of this file.
1#pragma once
2#include <backends/Backends.h>
3#include <omnetpp.h>
4#include <memory>
5#include <stdexcept>
8#include "Backend.h"
9#include "Qubit.h"
10#include "omnetpp/simtime.h"
11
12using namespace quisp::backends::graph_state;
14
16using omnetpp::SimTime;
17using ::quisp::backends::StationaryQubitConfiguration;
18using ::quisp::backends::abstract::IQubit;
19using ::quisp::backends::abstract::IQubitId;
20using ::quisp::backends::graph_state::GraphStateBackend;
21using ::quisp::backends::graph_state::GraphStateQubit;
22using namespace ::quisp::backends;
23using namespace ::quisp::backends::abstract;
24
25class QubitId : public IQubitId {
26 public:
27 QubitId(int id) : id(id) {}
28 int id;
29
30 inline std::size_t hash() const override { return std::hash<int>()(id); }
31 bool compare(const IQubitId& qubit_id_ref) const override {
32 auto qubit_id = dynamic_cast<const QubitId&>(qubit_id_ref);
33 return id == qubit_id.id;
34 }
35};
36
38 public:
40 double doubleRandom() override { return double_value; }
41 double double_value = 0.0;
42};
43
44class Qubit : public GraphStateQubit {
45 public:
82
83 std::unordered_set<GraphStateQubit*> getNeighborSet() { return neighbors; }
87 void reset() {
88 // we should not call setFree() here
89 this->neighbors.clear();
90 this->vertex_operator = CliffordOperator::H;
91 }
92 void fillParams() {
93 // ceiled values should be:
94 // No error= 0.1, X error = 0.6, Z error = 0.7, Y error = 0.8, Excitation = 0.9, Relaxation = 1.0
95 double x_error_rate = 0;
96 double y_error_rate = 0;
97 double z_error_rate = 0;
98 double energy_excitation_rate = 0;
99 double energy_relaxation_rate = 0;
100 this->setMemoryErrorRates(x_error_rate, y_error_rate, z_error_rate, energy_excitation_rate, energy_relaxation_rate);
101
102 // // No error= 0.4, X error = 0.6, Z error = 0.8, Y error = 1.0
103 double h_gate_error_rate = 0;
104 double h_gate_x_error_ratio = 0;
105 double h_gate_z_error_ratio = 0;
106 double h_gate_y_error_ratio = 0;
107 this->gate_err_h.setParams(h_gate_x_error_ratio, h_gate_y_error_ratio, h_gate_z_error_ratio, h_gate_error_rate);
108
109 double x_gate_error_rate = 0;
110 double x_gate_x_error_ratio = 0;
111 double x_gate_z_error_ratio = 0;
112 double x_gate_y_error_ratio = 0;
113 this->gate_err_x.setParams(x_gate_x_error_ratio, x_gate_y_error_ratio, x_gate_z_error_ratio, x_gate_error_rate);
114
115 double z_gate_error_rate = 0;
116 double z_gate_x_error_ratio = 0;
117 double z_gate_z_error_ratio = 0;
118 double z_gate_y_error_ratio = 0;
119 this->gate_err_z.setParams(z_gate_x_error_ratio, z_gate_y_error_ratio, z_gate_z_error_ratio, z_gate_error_rate);
120
121 double cnot_gate_error_rate = 0;
122 double cnot_gate_ix_error_ratio = 0;
123 double cnot_gate_iy_error_ratio = 0;
124 double cnot_gate_iz_error_ratio = 0;
125 double cnot_gate_xi_error_ratio = 0;
126 double cnot_gate_xx_error_ratio = 0;
127 double cnot_gate_xy_error_ratio = 0;
128 double cnot_gate_xz_error_ratio = 0;
129 double cnot_gate_yi_error_ratio = 0;
130 double cnot_gate_yx_error_ratio = 0;
131 double cnot_gate_yy_error_ratio = 0;
132 double cnot_gate_yz_error_ratio = 0;
133 double cnot_gate_zi_error_ratio = 0;
134 double cnot_gate_zx_error_ratio = 0;
135 double cnot_gate_zy_error_ratio = 0;
136 double cnot_gate_zz_error_ratio = 0;
137 this->gate_err_cnot.setParams(cnot_gate_error_rate, cnot_gate_ix_error_ratio, cnot_gate_iy_error_ratio, cnot_gate_iz_error_ratio, cnot_gate_xi_error_ratio,
138 cnot_gate_xx_error_ratio, cnot_gate_xy_error_ratio, cnot_gate_xz_error_ratio, cnot_gate_yi_error_ratio, cnot_gate_yx_error_ratio,
139 cnot_gate_yy_error_ratio, cnot_gate_yz_error_ratio, cnot_gate_zi_error_ratio, cnot_gate_zx_error_ratio, cnot_gate_zy_error_ratio,
140 cnot_gate_zz_error_ratio);
141
142 double x_measurement_error_rate = 0;
143 double y_measurement_error_rate = 0;
144 double z_measurement_error_rate = 0;
145 this->measurement_err.setParams(x_measurement_error_rate, y_measurement_error_rate, z_measurement_error_rate);
146
147 this->updated_time = SimTime(0);
148 }
149};
150
152 public:
153 using GraphStateBackend::qubits;
154 Backend(std::unique_ptr<IRandomNumberGenerator> rng, std::unique_ptr<StationaryQubitConfiguration> config) : GraphStateBackend(std::move(rng), std::move(config)) {}
155 IQubit* createQubit(int id) { return this->createQubitInternal(new QubitId(id)); }
156 IQubit* getQubit(int id) { return this->getQubitInternal(new QubitId(id)); }
158 auto qubit = qubits.find(id);
159
160 if (qubit != qubits.cend()) {
161 return nullptr;
162 }
163 auto original_qubit = std::make_unique<Qubit>(id, this);
164 auto* qubit_ptr = original_qubit.get();
165 qubits.insert({id, std::move(original_qubit)});
166 return qubit_ptr;
167 }
168 IQubit* getQubitInternal(const IQubitId* id) { return qubits.find(id)->second.get(); }
169};
170
171} // namespace quisp_test::backends::graph_state
Definition IQubit.h:30
a key to identify a qubit in a backend.
Definition IQubitId.h:14
Definition IRandomNumberGenerator.h:4
const std::unique_ptr< IRandomNumberGenerator > rng
Definition Backend.h:48
std::unique_ptr< StationaryQubitConfiguration > config
Definition Backend.h:49
std::unordered_map< const IQubitId *, std::unique_ptr< GraphStateQubit >, IQubitId::Hash, IQubitId::Pred > qubits
Definition Backend.h:46
void applyRightClifford(CliffordOperator op)
Definition Qubit.cc:275
SimTime updated_time
Definition Qubit.h:99
EigenvalueResult measureY() override
Definition Qubit.cc:482
void applyClifford(CliffordOperator op)
Definition Qubit.cc:273
void removeVertexOperation(GraphStateQubit *qubit_to_avoid)
Definition Qubit.cc:320
void removeAllEdges()
Definition Qubit.cc:298
void setMemoryErrorRates(double x_error_rate, double y_error_rate, double z_error_rate, double excitation_rate, double relaxation_rate)
Definition Qubit.cc:38
EigenvalueResult measureZ() override
Definition Qubit.cc:494
void applyMemoryError()
Definition Qubit.cc:171
GraphStateBackend *const backend
Definition Qubit.h:113
void relax()
Definition Qubit.cc:265
void toggleEdge(GraphStateQubit *another_qubit)
Definition Qubit.cc:290
void gateCNOT(IQubit *const target_qubit) override
Definition Qubit.cc:427
MeasurementErrorModel measurement_err
Definition Qubit.h:81
void applyTwoQubitGateError(TwoQubitGateErrorModel const &err, GraphStateQubit *another_qubit)
Definition Qubit.cc:84
void applySingleQubitGateError(SingleGateErrorModel const &err)
Definition Qubit.cc:57
EigenvalueResult measureX() override
Definition Qubit.cc:471
Eigen::MatrixXd memory_transition_matrix
Definition Qubit.h:83
std::unordered_set< GraphStateQubit * > neighbors
Definition Qubit.h:102
SingleGateErrorModel gate_err_z
Definition Qubit.h:79
SingleGateErrorModel gate_err_h
Definition Qubit.h:77
const IQubitId * id
Definition Qubit.h:112
void gateS() override
Definition Qubit.cc:458
void localComplement()
Definition Qubit.cc:305
void deleteEdge(GraphStateQubit *another_qubit)
Definition Qubit.cc:285
bool isNeighbor(GraphStateQubit *another_qubit)
Definition Qubit.cc:277
void gateH() override
Definition Qubit.cc:437
CliffordOperator vertex_operator
Definition Qubit.h:103
void setFree() override
Definition Qubit.cc:420
SingleGateErrorModel gate_err_x
Definition Qubit.h:78
void addEdge(GraphStateQubit *another_qubit)
Definition Qubit.cc:279
void gateSdg() override
Definition Qubit.cc:464
void excite()
Definition Qubit.cc:257
TwoQubitGateErrorModel gate_err_cnot
Definition Qubit.h:80
void gateX() override
Definition Qubit.cc:447
EigenvalueResult graphMeasureZ()
Definition Qubit.cc:366
void applyPureCZ(GraphStateQubit *another_qubit)
Definition Qubit.cc:343
void gateZ() override
Definition Qubit.cc:442
Backend(std::unique_ptr< IRandomNumberGenerator > rng, std::unique_ptr< StationaryQubitConfiguration > config)
Definition test.h:154
IQubit * createQubit(int id)
Definition test.h:155
IQubit * getQubitInternal(const IQubitId *id)
Definition test.h:168
IQubit * createQubitInternal(const IQubitId *id)
Definition test.h:157
IQubit * getQubit(int id)
Definition test.h:156
void setVertexOperator(CliffordOperator op)
Definition test.h:84
CliffordOperator getVertexOperator()
Definition test.h:85
void reset()
Definition test.h:87
std::unordered_set< GraphStateQubit * > getNeighborSet()
Definition test.h:83
void fillParams()
Definition test.h:92
Qubit(const IQubitId *id, GraphStateBackend *const backend)
Definition test.h:86
QubitId(int id)
Definition test.h:27
bool compare(const IQubitId &qubit_id_ref) const override
Definition test.h:31
std::size_t hash() const override
Definition test.h:30
double double_value
Definition test.h:41
double doubleRandom() override
Definition test.h:40
Definition IConfiguration.h:4
CliffordOperator
Definition types.h:4
Definition Backend.cc:9
Definition Backends.h:10
Definition QNIC.h:49
void setParams(double x, double y, double z)
Definition types.h:130
void setParams(double x_ratio, double y_ratio, double z_ratio, double error_rate)
Definition types.h:37
void setParams(double error_rate, double ix_ratio, double iy_ratio, double iz_ratio, double xi_ratio, double xx_ratio, double xy_ratio, double xz_ratio, double yi_ratio, double yx_ratio, double yy_ratio, double yz_ratio, double zi_ratio, double zx_ratio, double zy_ratio, double zz_ratio)
Definition types.h:71