Maestro 0.2.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
QuestSimulator.h
Go to the documentation of this file.
1
12
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
53 void ApplyGenericOneQubitGate(Types::qubit_t qubit,
54 const Eigen::Matrix2cd& gate) override {
55 throw std::runtime_error(
56 "QuestSimulator::ApplyGenericOneQubitGate: Not supported for Quest "
57 "simulator.");
58 }
59
66 void ApplyGenericTwoQubitGate(Types::qubit_t qubit0, Types::qubit_t qubit1,
67 const Eigen::Matrix4cd& gate) override {
68 throw std::runtime_error(
69 "QuestSimulator::ApplyGenericTwoQubitGate: Not supported for Quest "
70 "simulator.");
71 }
72
80 void ApplyP(Types::qubit_t qubit, double lambda) override {
81 questLib->ApplyP(sim, static_cast<int>(qubit), lambda);
82 NotifyObservers({qubit});
83 }
84
91 void ApplyX(Types::qubit_t qubit) override {
92 questLib->ApplyX(sim, static_cast<int>(qubit));
93 NotifyObservers({qubit});
94 }
95
102 void ApplyY(Types::qubit_t qubit) override {
103 questLib->ApplyY(sim, static_cast<int>(qubit));
104 NotifyObservers({qubit});
105 }
106
113 void ApplyZ(Types::qubit_t qubit) override {
114 questLib->ApplyZ(sim, static_cast<int>(qubit));
115 NotifyObservers({qubit});
116 }
117
124 void ApplyH(Types::qubit_t qubit) override {
125 questLib->ApplyH(sim, static_cast<int>(qubit));
126 NotifyObservers({qubit});
127 }
128
135 void ApplyS(Types::qubit_t qubit) override {
136 questLib->ApplyS(sim, static_cast<int>(qubit));
137 NotifyObservers({qubit});
138 }
139
146 void ApplySDG(Types::qubit_t qubit) override {
147 questLib->ApplySdg(sim, static_cast<int>(qubit));
148 NotifyObservers({qubit});
149 }
150
157 void ApplyT(Types::qubit_t qubit) override {
158 questLib->ApplyT(sim, static_cast<int>(qubit));
159 NotifyObservers({qubit});
160 }
161
168 void ApplyTDG(Types::qubit_t qubit) override {
169 questLib->ApplyTdg(sim, static_cast<int>(qubit));
170 NotifyObservers({qubit});
171 }
172
179 void ApplySx(Types::qubit_t qubit) override {
180 questLib->ApplySx(sim, static_cast<int>(qubit));
181 NotifyObservers({qubit});
182 }
183
190 void ApplySxDAG(Types::qubit_t qubit) override {
191 questLib->ApplySxDg(sim, static_cast<int>(qubit));
192 NotifyObservers({qubit});
193 }
194
201 void ApplyK(Types::qubit_t qubit) override {
202 questLib->ApplyK(sim, static_cast<int>(qubit));
203 NotifyObservers({qubit});
204 }
205
213 void ApplyRx(Types::qubit_t qubit, double theta) override {
214 questLib->ApplyRx(sim, static_cast<int>(qubit), theta);
215 NotifyObservers({qubit});
216 }
217
225 void ApplyRy(Types::qubit_t qubit, double theta) override {
226 questLib->ApplyRy(sim, static_cast<int>(qubit), theta);
227 NotifyObservers({qubit});
228 }
229
237 void ApplyRz(Types::qubit_t qubit, double theta) override {
238 questLib->ApplyRz(sim, static_cast<int>(qubit), theta);
239 NotifyObservers({qubit});
240 }
241
252 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
253 double gamma) override {
254 questLib->ApplyU(sim, static_cast<int>(qubit), theta, phi, lambda, gamma);
255 NotifyObservers({qubit});
256 }
257
265 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
266 questLib->ApplyCX(sim, static_cast<int>(ctrl_qubit),
267 static_cast<int>(tgt_qubit));
268 NotifyObservers({tgt_qubit, ctrl_qubit});
269 }
270
278 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
279 questLib->ApplyCY(sim, static_cast<int>(ctrl_qubit),
280 static_cast<int>(tgt_qubit));
281 NotifyObservers({tgt_qubit, ctrl_qubit});
282 }
283
291 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
292 questLib->ApplyCZ(sim, static_cast<int>(ctrl_qubit),
293 static_cast<int>(tgt_qubit));
294 NotifyObservers({tgt_qubit, ctrl_qubit});
295 }
296
305 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
306 double lambda) override {
307 questLib->ApplyCP(sim, static_cast<int>(ctrl_qubit),
308 static_cast<int>(tgt_qubit), lambda);
309 NotifyObservers({tgt_qubit, ctrl_qubit});
310 }
311
320 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
321 double theta) override {
322 questLib->ApplyCRx(sim, static_cast<int>(ctrl_qubit),
323 static_cast<int>(tgt_qubit), theta);
324 NotifyObservers({tgt_qubit, ctrl_qubit});
325 }
326
335 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
336 double theta) override {
337 questLib->ApplyCRy(sim, static_cast<int>(ctrl_qubit),
338 static_cast<int>(tgt_qubit), theta);
339 NotifyObservers({tgt_qubit, ctrl_qubit});
340 }
341
350 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
351 double theta) override {
352 questLib->ApplyCRz(sim, static_cast<int>(ctrl_qubit),
353 static_cast<int>(tgt_qubit), theta);
354 NotifyObservers({tgt_qubit, ctrl_qubit});
355 }
356
364 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
365 questLib->ApplyCH(sim, static_cast<int>(ctrl_qubit),
366 static_cast<int>(tgt_qubit));
367 NotifyObservers({tgt_qubit, ctrl_qubit});
368 }
369
377 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
378 questLib->ApplyCSx(sim, static_cast<int>(ctrl_qubit),
379 static_cast<int>(tgt_qubit));
380 NotifyObservers({tgt_qubit, ctrl_qubit});
381 }
382
390 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
391 Types::qubit_t tgt_qubit) override {
392 questLib->ApplyCSxDg(sim, static_cast<int>(ctrl_qubit),
393 static_cast<int>(tgt_qubit));
394 NotifyObservers({tgt_qubit, ctrl_qubit});
395 }
396
404 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
405 questLib->ApplySwap(sim, static_cast<int>(qubit0),
406 static_cast<int>(qubit1));
407 NotifyObservers({qubit1, qubit0});
408 }
409
418 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
419 Types::qubit_t qubit2) override {
420 questLib->ApplyCCX(sim, static_cast<int>(qubit0), static_cast<int>(qubit1),
421 static_cast<int>(qubit2));
422 NotifyObservers({qubit0, qubit1, qubit2});
423 }
424
433 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
434 Types::qubit_t qubit1) override {
435 questLib->ApplyCSwap(sim, static_cast<int>(ctrl_qubit),
436 static_cast<int>(qubit0), static_cast<int>(qubit1));
437 NotifyObservers({qubit1, qubit0, ctrl_qubit});
438 }
439
451 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
452 double theta, double phi, double lambda, double gamma) override {
453 questLib->ApplyCU(sim, static_cast<int>(ctrl_qubit),
454 static_cast<int>(tgt_qubit), theta, phi, lambda, gamma);
455 NotifyObservers({tgt_qubit, ctrl_qubit});
456 }
457
464 void ApplyNop() override {
465 // do nothing
466 }
467
478 std::unique_ptr<ISimulator> Clone() override {
479 auto cloned = std::make_unique<QuestSimulator>();
480 cloned->questLib = questLib;
481 cloned->nrQubits = nrQubits;
482
483 if (sim) {
484 cloned->simHandle = questLib->CloneSimulator(sim);
485 cloned->sim = questLib->GetSimulator(cloned->simHandle);
486 }
487
488 return cloned;
489 }
490};
491} // namespace Private
492} // namespace Simulators
493
494#endif
495
496#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