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;
56 questLib->ApplyP(sim,
static_cast<int>(qubit), lambda);
57 NotifyObservers({qubit});
67 questLib->ApplyX(sim,
static_cast<int>(qubit));
68 NotifyObservers({qubit});
78 questLib->ApplyY(sim,
static_cast<int>(qubit));
79 NotifyObservers({qubit});
89 questLib->ApplyZ(sim,
static_cast<int>(qubit));
90 NotifyObservers({qubit});
100 questLib->ApplyH(sim,
static_cast<int>(qubit));
101 NotifyObservers({qubit});
111 questLib->ApplyS(sim,
static_cast<int>(qubit));
112 NotifyObservers({qubit});
122 questLib->ApplySdg(sim,
static_cast<int>(qubit));
123 NotifyObservers({qubit});
133 questLib->ApplyT(sim,
static_cast<int>(qubit));
134 NotifyObservers({qubit});
144 questLib->ApplyTdg(sim,
static_cast<int>(qubit));
145 NotifyObservers({qubit});
155 questLib->ApplySx(sim,
static_cast<int>(qubit));
156 NotifyObservers({qubit});
166 questLib->ApplySxDg(sim,
static_cast<int>(qubit));
167 NotifyObservers({qubit});
177 questLib->ApplyK(sim,
static_cast<int>(qubit));
178 NotifyObservers({qubit});
189 questLib->ApplyRx(sim,
static_cast<int>(qubit), theta);
190 NotifyObservers({qubit});
201 questLib->ApplyRy(sim,
static_cast<int>(qubit), theta);
202 NotifyObservers({qubit});
213 questLib->ApplyRz(sim,
static_cast<int>(qubit), theta);
214 NotifyObservers({qubit});
228 double gamma)
override {
229 questLib->ApplyU(sim,
static_cast<int>(qubit), theta, phi, lambda, gamma);
230 NotifyObservers({qubit});
241 questLib->ApplyCX(sim,
static_cast<int>(ctrl_qubit),
242 static_cast<int>(tgt_qubit));
243 NotifyObservers({tgt_qubit, ctrl_qubit});
254 questLib->ApplyCY(sim,
static_cast<int>(ctrl_qubit),
255 static_cast<int>(tgt_qubit));
256 NotifyObservers({tgt_qubit, ctrl_qubit});
267 questLib->ApplyCZ(sim,
static_cast<int>(ctrl_qubit),
268 static_cast<int>(tgt_qubit));
269 NotifyObservers({tgt_qubit, ctrl_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});
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});
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});
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});
340 questLib->ApplyCH(sim,
static_cast<int>(ctrl_qubit),
341 static_cast<int>(tgt_qubit));
342 NotifyObservers({tgt_qubit, ctrl_qubit});
353 questLib->ApplyCSx(sim,
static_cast<int>(ctrl_qubit),
354 static_cast<int>(tgt_qubit));
355 NotifyObservers({tgt_qubit, ctrl_qubit});
367 questLib->ApplyCSxDg(sim,
static_cast<int>(ctrl_qubit),
368 static_cast<int>(tgt_qubit));
369 NotifyObservers({tgt_qubit, ctrl_qubit});
380 questLib->ApplySwap(sim,
static_cast<int>(qubit0),
381 static_cast<int>(qubit1));
382 NotifyObservers({qubit1, qubit0});
395 questLib->ApplyCCX(sim,
static_cast<int>(qubit0),
static_cast<int>(qubit1),
396 static_cast<int>(qubit2));
397 NotifyObservers({qubit0, qubit1, qubit2});
410 questLib->ApplyCSwap(sim,
static_cast<int>(ctrl_qubit),
411 static_cast<int>(qubit0),
static_cast<int>(qubit1));
412 NotifyObservers({qubit1, qubit0, ctrl_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});
439 void ApplyNop()
override {
453 std::unique_ptr<ISimulator> Clone()
override {
454 auto cloned = std::make_unique<QuestSimulator>();
455 cloned->questLib = questLib;
456 cloned->nrQubits = nrQubits;
459 cloned->simHandle = questLib->CloneSimulator(sim);
460 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.