15#ifndef _QUESTSIMULATOR_H
16#define _QUESTSIMULATOR_H
18#ifdef INCLUDED_BY_FACTORY
38class QuestSimulator :
public QuestState
41 QuestSimulator() =
default;
44 QuestSimulator(
const QuestSimulator &) =
delete;
45 QuestSimulator &operator=(
const QuestSimulator &) =
delete;
48 QuestSimulator(QuestSimulator &&other) =
default;
49 QuestSimulator &operator=(QuestSimulator &&other) =
default;
58 throw std::runtime_error(
"QuestSimulator::ApplyGenericOneQubitGate: Not supported for Quest "
70 throw std::runtime_error(
"QuestSimulator::ApplyGenericTwoQubitGate: Not supported for Quest "
83 questLib->ApplyP(sim,
static_cast<int>(qubit), lambda);
84 NotifyObservers({qubit});
95 questLib->ApplyX(sim,
static_cast<int>(qubit));
96 NotifyObservers({qubit});
107 questLib->ApplyY(sim,
static_cast<int>(qubit));
108 NotifyObservers({qubit});
119 questLib->ApplyZ(sim,
static_cast<int>(qubit));
120 NotifyObservers({qubit});
131 questLib->ApplyH(sim,
static_cast<int>(qubit));
132 NotifyObservers({qubit});
143 questLib->ApplyS(sim,
static_cast<int>(qubit));
144 NotifyObservers({qubit});
155 questLib->ApplySdg(sim,
static_cast<int>(qubit));
156 NotifyObservers({qubit});
167 questLib->ApplyT(sim,
static_cast<int>(qubit));
168 NotifyObservers({qubit});
179 questLib->ApplyTdg(sim,
static_cast<int>(qubit));
180 NotifyObservers({qubit});
191 questLib->ApplySx(sim,
static_cast<int>(qubit));
192 NotifyObservers({qubit});
203 questLib->ApplySxDg(sim,
static_cast<int>(qubit));
204 NotifyObservers({qubit});
215 questLib->ApplyK(sim,
static_cast<int>(qubit));
216 NotifyObservers({qubit});
228 questLib->ApplyRx(sim,
static_cast<int>(qubit), theta);
229 NotifyObservers({qubit});
241 questLib->ApplyRy(sim,
static_cast<int>(qubit), theta);
242 NotifyObservers({qubit});
254 questLib->ApplyRz(sim,
static_cast<int>(qubit), theta);
255 NotifyObservers({qubit});
268 void ApplyU(
Types::qubit_t qubit,
double theta,
double phi,
double lambda,
double gamma)
override
270 questLib->ApplyU(sim,
static_cast<int>(qubit), theta, phi, lambda, gamma);
271 NotifyObservers({qubit});
283 questLib->ApplyCX(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
284 NotifyObservers({tgt_qubit, ctrl_qubit});
296 questLib->ApplyCY(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
297 NotifyObservers({tgt_qubit, ctrl_qubit});
309 questLib->ApplyCZ(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
310 NotifyObservers({tgt_qubit, ctrl_qubit});
323 questLib->ApplyCP(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit), lambda);
324 NotifyObservers({tgt_qubit, ctrl_qubit});
337 questLib->ApplyCRx(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit), theta);
338 NotifyObservers({tgt_qubit, ctrl_qubit});
351 questLib->ApplyCRy(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit), theta);
352 NotifyObservers({tgt_qubit, ctrl_qubit});
365 questLib->ApplyCRz(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit), theta);
366 NotifyObservers({tgt_qubit, ctrl_qubit});
378 questLib->ApplyCH(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
379 NotifyObservers({tgt_qubit, ctrl_qubit});
391 questLib->ApplyCSx(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
392 NotifyObservers({tgt_qubit, ctrl_qubit});
404 questLib->ApplyCSxDg(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit));
405 NotifyObservers({tgt_qubit, ctrl_qubit});
417 questLib->ApplySwap(sim,
static_cast<int>(qubit0),
static_cast<int>(qubit1));
418 NotifyObservers({qubit1, qubit0});
431 questLib->ApplyCCX(sim,
static_cast<int>(qubit0),
static_cast<int>(qubit1),
static_cast<int>(qubit2));
432 NotifyObservers({qubit0, qubit1, qubit2});
445 questLib->ApplyCSwap(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(qubit0),
static_cast<int>(qubit1));
446 NotifyObservers({qubit1, qubit0, ctrl_qubit});
462 questLib->ApplyCU(sim,
static_cast<int>(ctrl_qubit),
static_cast<int>(tgt_qubit), theta, phi, lambda, gamma);
463 NotifyObservers({tgt_qubit, ctrl_qubit});
472 void ApplyNop()
override
487 std::unique_ptr<ISimulator> Clone()
override
489 auto cloned = std::make_unique<QuestSimulator>();
490 cloned->questLib = questLib;
491 cloned->nrQubits = nrQubits;
495 cloned->simHandle = questLib->CloneSimulator(sim);
496 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)
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.