Maestro 0.2.5
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
QuestSimulator.h
Go to the documentation of this file.
1
13#pragma once
14
15#ifndef _QUESTSIMULATOR_H
16#define _QUESTSIMULATOR_H
17
18#ifdef INCLUDED_BY_FACTORY
19
20#include "QuestState.h"
21
22namespace Simulators {
23
24namespace Private {
36class QuestSimulator : public QuestState {
37 public:
38 QuestSimulator() = default;
39
40 // allow no copy or assignment
41 QuestSimulator(const QuestSimulator &) = delete;
42 QuestSimulator &operator=(const QuestSimulator &) = delete;
43
44 // but allow moving
45 QuestSimulator(QuestSimulator &&other) = default;
46 QuestSimulator &operator=(QuestSimulator &&other) = default;
47
55 void ApplyP(Types::qubit_t qubit, double lambda) override {
56 questLib->ApplyP(sim, static_cast<int>(qubit), lambda);
57 NotifyObservers({qubit});
58 }
59
66 void ApplyX(Types::qubit_t qubit) override {
67 questLib->ApplyX(sim, static_cast<int>(qubit));
68 NotifyObservers({qubit});
69 }
70
77 void ApplyY(Types::qubit_t qubit) override {
78 questLib->ApplyY(sim, static_cast<int>(qubit));
79 NotifyObservers({qubit});
80 }
81
88 void ApplyZ(Types::qubit_t qubit) override {
89 questLib->ApplyZ(sim, static_cast<int>(qubit));
90 NotifyObservers({qubit});
91 }
92
99 void ApplyH(Types::qubit_t qubit) override {
100 questLib->ApplyH(sim, static_cast<int>(qubit));
101 NotifyObservers({qubit});
102 }
103
110 void ApplyS(Types::qubit_t qubit) override {
111 questLib->ApplyS(sim, static_cast<int>(qubit));
112 NotifyObservers({qubit});
113 }
114
121 void ApplySDG(Types::qubit_t qubit) override {
122 questLib->ApplySdg(sim, static_cast<int>(qubit));
123 NotifyObservers({qubit});
124 }
125
132 void ApplyT(Types::qubit_t qubit) override {
133 questLib->ApplyT(sim, static_cast<int>(qubit));
134 NotifyObservers({qubit});
135 }
136
143 void ApplyTDG(Types::qubit_t qubit) override {
144 questLib->ApplyTdg(sim, static_cast<int>(qubit));
145 NotifyObservers({qubit});
146 }
147
154 void ApplySx(Types::qubit_t qubit) override {
155 questLib->ApplySx(sim, static_cast<int>(qubit));
156 NotifyObservers({qubit});
157 }
158
165 void ApplySxDAG(Types::qubit_t qubit) override {
166 questLib->ApplySxDg(sim, static_cast<int>(qubit));
167 NotifyObservers({qubit});
168 }
169
176 void ApplyK(Types::qubit_t qubit) override {
177 questLib->ApplyK(sim, static_cast<int>(qubit));
178 NotifyObservers({qubit});
179 }
180
188 void ApplyRx(Types::qubit_t qubit, double theta) override {
189 questLib->ApplyRx(sim, static_cast<int>(qubit), theta);
190 NotifyObservers({qubit});
191 }
192
200 void ApplyRy(Types::qubit_t qubit, double theta) override {
201 questLib->ApplyRy(sim, static_cast<int>(qubit), theta);
202 NotifyObservers({qubit});
203 }
204
212 void ApplyRz(Types::qubit_t qubit, double theta) override {
213 questLib->ApplyRz(sim, static_cast<int>(qubit), theta);
214 NotifyObservers({qubit});
215 }
216
227 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
228 double gamma) override {
229 questLib->ApplyU(sim, static_cast<int>(qubit), theta, phi, lambda, gamma);
230 NotifyObservers({qubit});
231 }
232
240 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
241 questLib->ApplyCX(sim, static_cast<int>(ctrl_qubit),
242 static_cast<int>(tgt_qubit));
243 NotifyObservers({tgt_qubit, ctrl_qubit});
244 }
245
253 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
254 questLib->ApplyCY(sim, static_cast<int>(ctrl_qubit),
255 static_cast<int>(tgt_qubit));
256 NotifyObservers({tgt_qubit, ctrl_qubit});
257 }
258
266 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
267 questLib->ApplyCZ(sim, static_cast<int>(ctrl_qubit),
268 static_cast<int>(tgt_qubit));
269 NotifyObservers({tgt_qubit, ctrl_qubit});
270 }
271
280 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
281 double lambda) override {
282 questLib->ApplyCP(sim, static_cast<int>(ctrl_qubit),
283 static_cast<int>(tgt_qubit), lambda);
284 NotifyObservers({tgt_qubit, ctrl_qubit});
285 }
286
295 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
296 double theta) override {
297 questLib->ApplyCRx(sim, static_cast<int>(ctrl_qubit),
298 static_cast<int>(tgt_qubit), theta);
299 NotifyObservers({tgt_qubit, ctrl_qubit});
300 }
301
310 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
311 double theta) override {
312 questLib->ApplyCRy(sim, static_cast<int>(ctrl_qubit),
313 static_cast<int>(tgt_qubit), theta);
314 NotifyObservers({tgt_qubit, ctrl_qubit});
315 }
316
325 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
326 double theta) override {
327 questLib->ApplyCRz(sim, static_cast<int>(ctrl_qubit),
328 static_cast<int>(tgt_qubit), theta);
329 NotifyObservers({tgt_qubit, ctrl_qubit});
330 }
331
339 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
340 questLib->ApplyCH(sim, static_cast<int>(ctrl_qubit),
341 static_cast<int>(tgt_qubit));
342 NotifyObservers({tgt_qubit, ctrl_qubit});
343 }
344
352 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
353 questLib->ApplyCSx(sim, static_cast<int>(ctrl_qubit),
354 static_cast<int>(tgt_qubit));
355 NotifyObservers({tgt_qubit, ctrl_qubit});
356 }
357
365 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
366 Types::qubit_t tgt_qubit) override {
367 questLib->ApplyCSxDg(sim, static_cast<int>(ctrl_qubit),
368 static_cast<int>(tgt_qubit));
369 NotifyObservers({tgt_qubit, ctrl_qubit});
370 }
371
379 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
380 questLib->ApplySwap(sim, static_cast<int>(qubit0),
381 static_cast<int>(qubit1));
382 NotifyObservers({qubit1, qubit0});
383 }
384
393 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
394 Types::qubit_t qubit2) override {
395 questLib->ApplyCCX(sim, static_cast<int>(qubit0), static_cast<int>(qubit1),
396 static_cast<int>(qubit2));
397 NotifyObservers({qubit0, qubit1, qubit2});
398 }
399
408 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
409 Types::qubit_t qubit1) override {
410 questLib->ApplyCSwap(sim, static_cast<int>(ctrl_qubit),
411 static_cast<int>(qubit0), static_cast<int>(qubit1));
412 NotifyObservers({qubit1, qubit0, ctrl_qubit});
413 }
414
426 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
427 double theta, double phi, double lambda, double gamma) override {
428 questLib->ApplyCU(sim, static_cast<int>(ctrl_qubit),
429 static_cast<int>(tgt_qubit), theta, phi, lambda, gamma);
430 NotifyObservers({tgt_qubit, ctrl_qubit});
431 }
432
439 void ApplyNop() override {
440 // do nothing
441 }
442
453 std::unique_ptr<ISimulator> Clone() override {
454 auto cloned = std::make_unique<QuestSimulator>();
455 cloned->questLib = questLib;
456 cloned->nrQubits = nrQubits;
457
458 if (sim) {
459 cloned->simHandle = questLib->CloneSimulator(sim);
460 cloned->sim = questLib->GetSimulator(cloned->simHandle);
461 }
462
463 return cloned;
464 }
465};
466} // namespace Private
467} // namespace Simulators
468
469#endif
470
471#endif // _QUESTSIMULATOR_H
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 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)
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:21