15#ifndef _QUESTSIMULATOR_H
16#define _QUESTSIMULATOR_H
18#ifdef INCLUDED_BY_FACTORY
36class QuestSimulator :
public QuestState {
38 QuestSimulator() =
default;
41 QuestSimulator(
const QuestSimulator &) =
delete;
42 QuestSimulator &operator=(
const QuestSimulator &) =
delete;
45 QuestSimulator(QuestSimulator &&other) =
default;
46 QuestSimulator &operator=(QuestSimulator &&other) =
default;
54 const Eigen::Matrix2cd& gate)
override {
55 throw std::runtime_error(
56 "QuestSimulator::ApplyGenericOneQubitGate: Not supported for Quest "
67 const Eigen::Matrix4cd& gate)
override {
68 throw std::runtime_error(
69 "QuestSimulator::ApplyGenericTwoQubitGate: Not supported for Quest "
81 questLib->ApplyP(sim,
static_cast<int>(qubit), lambda);
82 NotifyObservers({qubit});
92 questLib->ApplyX(sim,
static_cast<int>(qubit));
93 NotifyObservers({qubit});
103 questLib->ApplyY(sim,
static_cast<int>(qubit));
104 NotifyObservers({qubit});
114 questLib->ApplyZ(sim,
static_cast<int>(qubit));
115 NotifyObservers({qubit});
125 questLib->ApplyH(sim,
static_cast<int>(qubit));
126 NotifyObservers({qubit});
136 questLib->ApplyS(sim,
static_cast<int>(qubit));
137 NotifyObservers({qubit});
147 questLib->ApplySdg(sim,
static_cast<int>(qubit));
148 NotifyObservers({qubit});
158 questLib->ApplyT(sim,
static_cast<int>(qubit));
159 NotifyObservers({qubit});
169 questLib->ApplyTdg(sim,
static_cast<int>(qubit));
170 NotifyObservers({qubit});
180 questLib->ApplySx(sim,
static_cast<int>(qubit));
181 NotifyObservers({qubit});
191 questLib->ApplySxDg(sim,
static_cast<int>(qubit));
192 NotifyObservers({qubit});
202 questLib->ApplyK(sim,
static_cast<int>(qubit));
203 NotifyObservers({qubit});
214 questLib->ApplyRx(sim,
static_cast<int>(qubit), theta);
215 NotifyObservers({qubit});
226 questLib->ApplyRy(sim,
static_cast<int>(qubit), theta);
227 NotifyObservers({qubit});
238 questLib->ApplyRz(sim,
static_cast<int>(qubit), theta);
239 NotifyObservers({qubit});
253 double gamma)
override {
254 questLib->ApplyU(sim,
static_cast<int>(qubit), theta, phi, lambda, gamma);
255 NotifyObservers({qubit});
266 questLib->ApplyCX(sim,
static_cast<int>(ctrl_qubit),
267 static_cast<int>(tgt_qubit));
268 NotifyObservers({tgt_qubit, ctrl_qubit});
279 questLib->ApplyCY(sim,
static_cast<int>(ctrl_qubit),
280 static_cast<int>(tgt_qubit));
281 NotifyObservers({tgt_qubit, ctrl_qubit});
292 questLib->ApplyCZ(sim,
static_cast<int>(ctrl_qubit),
293 static_cast<int>(tgt_qubit));
294 NotifyObservers({tgt_qubit, ctrl_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});
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});
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});
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});
365 questLib->ApplyCH(sim,
static_cast<int>(ctrl_qubit),
366 static_cast<int>(tgt_qubit));
367 NotifyObservers({tgt_qubit, ctrl_qubit});
378 questLib->ApplyCSx(sim,
static_cast<int>(ctrl_qubit),
379 static_cast<int>(tgt_qubit));
380 NotifyObservers({tgt_qubit, ctrl_qubit});
392 questLib->ApplyCSxDg(sim,
static_cast<int>(ctrl_qubit),
393 static_cast<int>(tgt_qubit));
394 NotifyObservers({tgt_qubit, ctrl_qubit});
405 questLib->ApplySwap(sim,
static_cast<int>(qubit0),
406 static_cast<int>(qubit1));
407 NotifyObservers({qubit1, qubit0});
420 questLib->ApplyCCX(sim,
static_cast<int>(qubit0),
static_cast<int>(qubit1),
421 static_cast<int>(qubit2));
422 NotifyObservers({qubit0, qubit1, qubit2});
435 questLib->ApplyCSwap(sim,
static_cast<int>(ctrl_qubit),
436 static_cast<int>(qubit0),
static_cast<int>(qubit1));
437 NotifyObservers({qubit1, qubit0, ctrl_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});
464 void ApplyNop()
override {
478 std::unique_ptr<ISimulator> Clone()
override {
479 auto cloned = std::make_unique<QuestSimulator>();
480 cloned->questLib = questLib;
481 cloned->nrQubits = nrQubits;
484 cloned->simHandle = questLib->CloneSimulator(sim);
485 cloned->sim = questLib->GetSimulator(cloned->simHandle);
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.