Maestro 0.3.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{
24
25namespace Private
26{
38class QuestSimulator : public QuestState
39{
40 public:
41 QuestSimulator() = default;
42
43 // allow no copy or assignment
44 QuestSimulator(const QuestSimulator &) = delete;
45 QuestSimulator &operator=(const QuestSimulator &) = delete;
46
47 // but allow moving
48 QuestSimulator(QuestSimulator &&other) = default;
49 QuestSimulator &operator=(QuestSimulator &&other) = default;
50
56 void ApplyGenericOneQubitGate(Types::qubit_t qubit, const Eigen::Matrix2cd &gate) override
57 {
58 throw std::runtime_error("QuestSimulator::ApplyGenericOneQubitGate: Not supported for Quest "
59 "simulator.");
60 }
61
68 void ApplyGenericTwoQubitGate(Types::qubit_t qubit0, Types::qubit_t qubit1, const Eigen::Matrix4cd &gate) override
69 {
70 throw std::runtime_error("QuestSimulator::ApplyGenericTwoQubitGate: Not supported for Quest "
71 "simulator.");
72 }
73
81 void ApplyP(Types::qubit_t qubit, double lambda) override
82 {
83 questLib->ApplyP(sim, static_cast<int>(qubit), lambda);
84 NotifyObservers({qubit});
85 }
86
93 void ApplyX(Types::qubit_t qubit) override
94 {
95 questLib->ApplyX(sim, static_cast<int>(qubit));
96 NotifyObservers({qubit});
97 }
98
105 void ApplyY(Types::qubit_t qubit) override
106 {
107 questLib->ApplyY(sim, static_cast<int>(qubit));
108 NotifyObservers({qubit});
109 }
110
117 void ApplyZ(Types::qubit_t qubit) override
118 {
119 questLib->ApplyZ(sim, static_cast<int>(qubit));
120 NotifyObservers({qubit});
121 }
122
129 void ApplyH(Types::qubit_t qubit) override
130 {
131 questLib->ApplyH(sim, static_cast<int>(qubit));
132 NotifyObservers({qubit});
133 }
134
141 void ApplyS(Types::qubit_t qubit) override
142 {
143 questLib->ApplyS(sim, static_cast<int>(qubit));
144 NotifyObservers({qubit});
145 }
146
153 void ApplySDG(Types::qubit_t qubit) override
154 {
155 questLib->ApplySdg(sim, static_cast<int>(qubit));
156 NotifyObservers({qubit});
157 }
158
165 void ApplyT(Types::qubit_t qubit) override
166 {
167 questLib->ApplyT(sim, static_cast<int>(qubit));
168 NotifyObservers({qubit});
169 }
170
177 void ApplyTDG(Types::qubit_t qubit) override
178 {
179 questLib->ApplyTdg(sim, static_cast<int>(qubit));
180 NotifyObservers({qubit});
181 }
182
189 void ApplySx(Types::qubit_t qubit) override
190 {
191 questLib->ApplySx(sim, static_cast<int>(qubit));
192 NotifyObservers({qubit});
193 }
194
201 void ApplySxDAG(Types::qubit_t qubit) override
202 {
203 questLib->ApplySxDg(sim, static_cast<int>(qubit));
204 NotifyObservers({qubit});
205 }
206
213 void ApplyK(Types::qubit_t qubit) override
214 {
215 questLib->ApplyK(sim, static_cast<int>(qubit));
216 NotifyObservers({qubit});
217 }
218
226 void ApplyRx(Types::qubit_t qubit, double theta) override
227 {
228 questLib->ApplyRx(sim, static_cast<int>(qubit), theta);
229 NotifyObservers({qubit});
230 }
231
239 void ApplyRy(Types::qubit_t qubit, double theta) override
240 {
241 questLib->ApplyRy(sim, static_cast<int>(qubit), theta);
242 NotifyObservers({qubit});
243 }
244
252 void ApplyRz(Types::qubit_t qubit, double theta) override
253 {
254 questLib->ApplyRz(sim, static_cast<int>(qubit), theta);
255 NotifyObservers({qubit});
256 }
257
268 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda, double gamma) override
269 {
270 questLib->ApplyU(sim, static_cast<int>(qubit), theta, phi, lambda, gamma);
271 NotifyObservers({qubit});
272 }
273
281 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
282 {
283 questLib->ApplyCX(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
284 NotifyObservers({tgt_qubit, ctrl_qubit});
285 }
286
294 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
295 {
296 questLib->ApplyCY(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
297 NotifyObservers({tgt_qubit, ctrl_qubit});
298 }
299
307 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
308 {
309 questLib->ApplyCZ(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
310 NotifyObservers({tgt_qubit, ctrl_qubit});
311 }
312
321 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double lambda) override
322 {
323 questLib->ApplyCP(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit), lambda);
324 NotifyObservers({tgt_qubit, ctrl_qubit});
325 }
326
335 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
336 {
337 questLib->ApplyCRx(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit), theta);
338 NotifyObservers({tgt_qubit, ctrl_qubit});
339 }
340
349 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
350 {
351 questLib->ApplyCRy(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit), theta);
352 NotifyObservers({tgt_qubit, ctrl_qubit});
353 }
354
363 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta) override
364 {
365 questLib->ApplyCRz(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit), theta);
366 NotifyObservers({tgt_qubit, ctrl_qubit});
367 }
368
376 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
377 {
378 questLib->ApplyCH(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
379 NotifyObservers({tgt_qubit, ctrl_qubit});
380 }
381
389 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
390 {
391 questLib->ApplyCSx(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
392 NotifyObservers({tgt_qubit, ctrl_qubit});
393 }
394
402 void ApplyCSxDAG(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override
403 {
404 questLib->ApplyCSxDg(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit));
405 NotifyObservers({tgt_qubit, ctrl_qubit});
406 }
407
415 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override
416 {
417 questLib->ApplySwap(sim, static_cast<int>(qubit0), static_cast<int>(qubit1));
418 NotifyObservers({qubit1, qubit0});
419 }
420
429 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1, Types::qubit_t qubit2) override
430 {
431 questLib->ApplyCCX(sim, static_cast<int>(qubit0), static_cast<int>(qubit1), static_cast<int>(qubit2));
432 NotifyObservers({qubit0, qubit1, qubit2});
433 }
434
443 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0, Types::qubit_t qubit1) override
444 {
445 questLib->ApplyCSwap(sim, static_cast<int>(ctrl_qubit), static_cast<int>(qubit0), static_cast<int>(qubit1));
446 NotifyObservers({qubit1, qubit0, ctrl_qubit});
447 }
448
460 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit, double theta, double phi, double lambda, double gamma) override
461 {
462 questLib->ApplyCU(sim, static_cast<int>(ctrl_qubit), static_cast<int>(tgt_qubit), theta, phi, lambda, gamma);
463 NotifyObservers({tgt_qubit, ctrl_qubit});
464 }
465
472 void ApplyNop() override
473 {
474 // do nothing
475 }
476
487 std::unique_ptr<ISimulator> Clone() override
488 {
489 auto cloned = std::make_unique<QuestSimulator>();
490 cloned->questLib = questLib;
491 cloned->nrQubits = nrQubits;
492
493 if (sim)
494 {
495 cloned->simHandle = questLib->CloneSimulator(sim);
496 cloned->sim = questLib->GetSimulator(cloned->simHandle);
497 }
498
499 return cloned;
500 }
501};
502} // namespace Private
503} // namespace Simulators
504
505#endif
506
507#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)
int ApplyGenericOneQubitGate(void *sim, unsigned long q0, const double *buffer)
int ApplyGenericTwoQubitGate(void *sim, unsigned long q0, unsigned long q1, const double *buffer)
Bounded online routing based on current physical bond dimensions.
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:23