Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
ImmediateDistributedGpuSimulator.h
Go to the documentation of this file.
1// Gate bridge; native calls check errors before notifying observers.
2#pragma once
3#if defined(__linux__) && defined(INCLUDED_BY_FACTORY)
5
7{
8template <class State> class ImmediateDistributedGpuSimulatorBase : public State
9{
10 public:
11 void ApplyGenericOneQubitGate(Types::qubit_t q, const Eigen::Matrix2cd &gate) override
12 {
13 this->QubitIndex(q);
14 this->Native().ApplyOneQubitMatrixWithLayout(q, reinterpret_cast<const double *>(gate.data()), DistributedGpuApi::MGD_MATRIX_COLUMN_MAJOR);
15 this->NotifyObservers({q});
16 }
17
18 void ApplyGenericTwoQubitGate(Types::qubit_t q0, Types::qubit_t q1, const Eigen::Matrix4cd &gate) override
19 {
20 this->QubitIndex(q0);
21 this->QubitIndex(q1);
22 this->Native().ApplyTwoQubitMatrixWithLayout(q0, q1, reinterpret_cast<const double *>(gate.data()), DistributedGpuApi::MGD_MATRIX_COLUMN_MAJOR);
23 this->NotifyObservers({q0, q1});
24 }
25
26 void ApplyGenericThreeQubitGate(Types::qubit_t q0, Types::qubit_t q1, Types::qubit_t q2, const Eigen::Matrix<std::complex<double>, 8, 8> &gate) override
27 {
28 this->QubitIndex(q0);
29 this->QubitIndex(q1);
30 this->QubitIndex(q2);
31 this->Native().ApplyThreeQubitMatrixWithLayout(q0, q1, q2, reinterpret_cast<const double *>(gate.data()), DistributedGpuApi::MGD_MATRIX_COLUMN_MAJOR);
32 this->NotifyObservers({q0, q1, q2});
33 }
34
35 void ApplyP(Types::qubit_t qubit, double lambda) override
36 {
37 this->QubitIndex(qubit);
38 this->Native().ApplyP(qubit, lambda);
39 this->NotifyObservers({qubit});
40 }
41
42 void ApplyX(Types::qubit_t qubit) override
43 {
44 this->QubitIndex(qubit);
45 this->Native().ApplyX(qubit);
46 this->NotifyObservers({qubit});
47 }
48
49 void ApplyY(Types::qubit_t qubit) override
50 {
51 this->QubitIndex(qubit);
52 this->Native().ApplyY(qubit);
53 this->NotifyObservers({qubit});
54 }
55
56 void ApplyZ(Types::qubit_t qubit) override
57 {
58 this->QubitIndex(qubit);
59 this->Native().ApplyZ(qubit);
60 this->NotifyObservers({qubit});
61 }
62
63 void ApplyH(Types::qubit_t qubit) override
64 {
65 this->QubitIndex(qubit);
66 this->Native().ApplyH(qubit);
67 this->NotifyObservers({qubit});
68 }
69
70 void ApplyS(Types::qubit_t qubit) override
71 {
72 this->QubitIndex(qubit);
73 this->Native().ApplyS(qubit);
74 this->NotifyObservers({qubit});
75 }
76
77 void ApplySDG(Types::qubit_t qubit) override
78 {
79 this->QubitIndex(qubit);
80 this->Native().ApplySDG(qubit);
81 this->NotifyObservers({qubit});
82 }
83
84 void ApplyT(Types::qubit_t qubit) override
85 {
86 this->QubitIndex(qubit);
87 this->Native().ApplyT(qubit);
88 this->NotifyObservers({qubit});
89 }
90
91 void ApplyTDG(Types::qubit_t qubit) override
92 {
93 this->QubitIndex(qubit);
94 this->Native().ApplyTDG(qubit);
95 this->NotifyObservers({qubit});
96 }
97
98 void ApplySx(Types::qubit_t qubit) override
99 {
100 this->QubitIndex(qubit);
101 this->Native().ApplySX(qubit);
102 this->NotifyObservers({qubit});
103 }
104
105 void ApplySxDAG(Types::qubit_t qubit) override
106 {
107 this->QubitIndex(qubit);
108 this->Native().ApplySXDG(qubit);
109 this->NotifyObservers({qubit});
110 }
111
112 void ApplyK(Types::qubit_t qubit) override
113 {
114 this->QubitIndex(qubit);
115 this->Native().ApplyK(qubit);
116 this->NotifyObservers({qubit});
117 }
118
119 void ApplyRx(Types::qubit_t qubit, double theta) override
120 {
121 this->QubitIndex(qubit);
122 this->Native().ApplyRx(qubit, theta);
123 this->NotifyObservers({qubit});
124 }
125
126 void ApplyRy(Types::qubit_t qubit, double theta) override
127 {
128 this->QubitIndex(qubit);
129 this->Native().ApplyRy(qubit, theta);
130 this->NotifyObservers({qubit});
131 }
132
133 void ApplyRz(Types::qubit_t qubit, double theta) override
134 {
135 this->QubitIndex(qubit);
136 this->Native().ApplyRz(qubit, theta);
137 this->NotifyObservers({qubit});
138 }
139
140 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda, double gamma) override
141 {
142 this->QubitIndex(qubit);
143 this->Native().ApplyU(qubit, theta, phi, lambda, gamma);
144 this->NotifyObservers({qubit});
145 }
146
147 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
148 {
149 this->QubitIndex(ctrl_qubit);
150 this->QubitIndex(tgt_qubit);
151 this->Native().ApplyCX(ctrl_qubit, tgt_qubit);
152 this->NotifyObservers({ctrl_qubit, tgt_qubit});
153 }
154
155 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
156 {
157 this->QubitIndex(ctrl_qubit);
158 this->QubitIndex(tgt_qubit);
159 this->Native().ApplyCY(ctrl_qubit, tgt_qubit);
160 this->NotifyObservers({ctrl_qubit, tgt_qubit});
161 }
162
163 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
164 {
165 this->QubitIndex(ctrl_qubit);
166 this->QubitIndex(tgt_qubit);
167 this->Native().ApplyCZ(ctrl_qubit, tgt_qubit);
168 this->NotifyObservers({ctrl_qubit, tgt_qubit});
169 }
170
171 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double lambda) override
172 {
173 this->QubitIndex(ctrl_qubit);
174 this->QubitIndex(tgt_qubit);
175 this->Native().ApplyCP(ctrl_qubit, tgt_qubit, lambda);
176 this->NotifyObservers({ctrl_qubit, tgt_qubit});
177 }
178
179 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
180 {
181 this->QubitIndex(ctrl_qubit);
182 this->QubitIndex(tgt_qubit);
183 this->Native().ApplyCRx(ctrl_qubit, tgt_qubit, theta);
184 this->NotifyObservers({ctrl_qubit, tgt_qubit});
185 }
186
187 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
188 {
189 this->QubitIndex(ctrl_qubit);
190 this->QubitIndex(tgt_qubit);
191 this->Native().ApplyCRy(ctrl_qubit, tgt_qubit, theta);
192 this->NotifyObservers({ctrl_qubit, tgt_qubit});
193 }
194
195 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
196 {
197 this->QubitIndex(ctrl_qubit);
198 this->QubitIndex(tgt_qubit);
199 this->Native().ApplyCRz(ctrl_qubit, tgt_qubit, theta);
200 this->NotifyObservers({ctrl_qubit, tgt_qubit});
201 }
202
203 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
204 {
205 this->QubitIndex(ctrl_qubit);
206 this->QubitIndex(tgt_qubit);
207 this->Native().ApplyCH(ctrl_qubit, tgt_qubit);
208 this->NotifyObservers({ctrl_qubit, tgt_qubit});
209 }
210
211 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
212 {
213 this->QubitIndex(ctrl_qubit);
214 this->QubitIndex(tgt_qubit);
215 this->Native().ApplyCSX(ctrl_qubit, tgt_qubit);
216 this->NotifyObservers({ctrl_qubit, tgt_qubit});
217 }
218
219 void ApplyCSxDAG(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
220 {
221 this->QubitIndex(ctrl_qubit);
222 this->QubitIndex(tgt_qubit);
223 this->Native().ApplyCSXDG(ctrl_qubit, tgt_qubit);
224 this->NotifyObservers({ctrl_qubit, tgt_qubit});
225 }
226
227 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override
228 {
229 this->QubitIndex(qubit0);
230 this->QubitIndex(qubit1);
231 this->Native().ApplySwap(qubit0, qubit1);
232 this->NotifyObservers({qubit0, qubit1});
233 }
234
235 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1, Types::qubit_t qubit2) override
236 {
237 this->QubitIndex(qubit0);
238 this->QubitIndex(qubit1);
239 this->QubitIndex(qubit2);
240 this->Native().ApplyCCX(qubit0, qubit1, qubit2);
241 this->NotifyObservers({qubit0, qubit1, qubit2});
242 }
243
244 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0, Types::qubit_t qubit1) override
245 {
246 this->QubitIndex(ctrl_qubit);
247 this->QubitIndex(qubit0);
248 this->QubitIndex(qubit1);
249 this->Native().ApplyCSwap(ctrl_qubit, qubit0, qubit1);
250 this->NotifyObservers({ctrl_qubit, qubit0, qubit1});
251 }
252
253 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta, double phi, double lambda, double gamma) override
254 {
255 this->QubitIndex(ctrl_qubit);
256 this->QubitIndex(tgt_qubit);
257 this->Native().ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
258 this->NotifyObservers({ctrl_qubit, tgt_qubit});
259 }
260
261 void ApplyNop() override
262 {
263 this->NotifyObservers({});
264 }
265
266 std::unique_ptr<ISimulator> Clone() override
267 {
268 auto copy = std::make_unique<ImmediateDistributedGpuSimulatorBase<State>>();
269 copy->configuration = this->configuration;
270 copy->nrQubits = this->nrQubits;
271 if (this->state)
272 copy->state = this->state->Clone();
273 return copy;
274 }
275};
276
277using ImmediateDistributedGpuSimulator = ImmediateDistributedGpuSimulatorBase<DistributedGpuState>;
278using ImmediateDistributedMpiGpuSimulator = ImmediateDistributedGpuSimulatorBase<DistributedMpiGpuState>;
279} // namespace Simulators::Private
280#endif
int ApplyK(void *sim, int qubit)
int ApplyRx(void *sim, int qubit, double theta)
int ApplyX(void *sim, int qubit)
int ApplyU(void *sim, int qubit, double theta, double phi, double lambda, double gamma)
int ApplyCRy(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyTDG(void *sim, int qubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySDG(void *sim, int qubit)
int ApplyCSwap(void *sim, int controlQubit, int qubit1, int qubit2)
int ApplyCCX(void *sim, int controlQubit1, int controlQubit2, int targetQubit)
int ApplyY(void *sim, int qubit)
int ApplyZ(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
int ApplyGenericThreeQubitGate(void *sim, unsigned long q0, unsigned long q1, unsigned long q2, const double *buffer)
int ApplyCY(void *sim, int controlQubit, int targetQubit)
int ApplyCU(void *sim, int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
int ApplySwap(void *sim, int qubit1, int qubit2)
int ApplyRy(void *sim, int qubit, double theta)
int ApplyP(void *sim, int qubit, double theta)
int ApplyCH(void *sim, int controlQubit, int targetQubit)
int ApplyCZ(void *sim, int controlQubit, int targetQubit)
int ApplyRz(void *sim, int qubit, double theta)
int ApplyT(void *sim, int qubit)
int ApplyCRx(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyGenericOneQubitGate(void *sim, unsigned long q0, const double *buffer)
int ApplyGenericTwoQubitGate(void *sim, unsigned long q0, unsigned long q1, const double *buffer)
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:23