15#ifndef _GPUSIMULATOR_H
16#define _GPUSIMULATOR_H
18#ifdef INCLUDED_BY_FACTORY
41class GpuSimulator :
public GpuState {
43 GpuSimulator() =
default;
45 GpuSimulator(
const GpuSimulator &) =
delete;
46 GpuSimulator &operator=(
const GpuSimulator &) =
delete;
49 GpuSimulator(GpuSimulator &&other) =
default;
50 GpuSimulator &operator=(GpuSimulator &&other) =
default;
61 state->ApplyP(qubit, lambda);
63 mps->ApplyP(qubit, lambda);
65 NotifyObservers({qubit});
80 NotifyObservers({qubit});
95 NotifyObservers({qubit});
106 state->ApplyZ(qubit);
110 NotifyObservers({qubit});
121 state->ApplyH(qubit);
125 NotifyObservers({qubit});
136 state->ApplyS(qubit);
140 NotifyObservers({qubit});
151 state->ApplySDG(qubit);
153 mps->ApplySDG(qubit);
155 NotifyObservers({qubit});
166 state->ApplyT(qubit);
170 NotifyObservers({qubit});
181 state->ApplyTDG(qubit);
183 mps->ApplyTDG(qubit);
185 NotifyObservers({qubit});
196 state->ApplySX(qubit);
200 NotifyObservers({qubit});
211 state->ApplySXDG(qubit);
213 mps->ApplySXDG(qubit);
215 NotifyObservers({qubit});
226 state->ApplyK(qubit);
230 NotifyObservers({qubit});
242 state->ApplyRx(qubit, theta);
244 mps->ApplyRx(qubit, theta);
246 NotifyObservers({qubit});
258 state->ApplyRy(qubit, theta);
260 mps->ApplyRy(qubit, theta);
262 NotifyObservers({qubit});
274 state->ApplyRz(qubit, theta);
276 mps->ApplyRz(qubit, theta);
278 NotifyObservers({qubit});
289 double gamma)
override {
291 state->ApplyU(qubit, theta, phi, lambda, gamma);
293 mps->ApplyU(qubit, theta, phi, lambda, gamma);
295 NotifyObservers({qubit});
307 state->ApplyCX(ctrl_qubit, tgt_qubit);
309 mps->ApplyCX(ctrl_qubit, tgt_qubit);
311 NotifyObservers({tgt_qubit, ctrl_qubit});
323 state->ApplyCY(ctrl_qubit, tgt_qubit);
325 mps->ApplyCY(ctrl_qubit, tgt_qubit);
327 NotifyObservers({tgt_qubit, ctrl_qubit});
339 state->ApplyCZ(ctrl_qubit, tgt_qubit);
341 mps->ApplyCZ(ctrl_qubit, tgt_qubit);
343 NotifyObservers({tgt_qubit, ctrl_qubit});
355 double lambda)
override {
357 state->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
359 mps->ApplyCP(ctrl_qubit, tgt_qubit, lambda);
361 NotifyObservers({tgt_qubit, ctrl_qubit});
373 double theta)
override {
375 state->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
377 mps->ApplyCRx(ctrl_qubit, tgt_qubit, theta);
379 NotifyObservers({tgt_qubit, ctrl_qubit});
391 double theta)
override {
393 state->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
395 mps->ApplyCRy(ctrl_qubit, tgt_qubit, theta);
397 NotifyObservers({tgt_qubit, ctrl_qubit});
409 double theta)
override {
411 state->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
413 mps->ApplyCRz(ctrl_qubit, tgt_qubit, theta);
415 NotifyObservers({tgt_qubit, ctrl_qubit});
427 state->ApplyCH(ctrl_qubit, tgt_qubit);
429 mps->ApplyCH(ctrl_qubit, tgt_qubit);
431 NotifyObservers({tgt_qubit, ctrl_qubit});
443 state->ApplyCSX(ctrl_qubit, tgt_qubit);
445 mps->ApplyCSX(ctrl_qubit, tgt_qubit);
447 NotifyObservers({tgt_qubit, ctrl_qubit});
460 state->ApplyCSXDG(ctrl_qubit, tgt_qubit);
462 mps->ApplyCSXDG(ctrl_qubit, tgt_qubit);
464 NotifyObservers({tgt_qubit, ctrl_qubit});
476 state->ApplySwap(qubit0, qubit1);
478 mps->ApplySwap(qubit0, qubit1);
480 NotifyObservers({qubit1, qubit0});
494 state->ApplyCCX(qubit0, qubit1, qubit2);
496 const size_t q1 = qubit0;
497 const size_t q2 = qubit1;
498 const size_t q3 = qubit2;
501 mps->ApplyCSX(
static_cast<unsigned int>(q2),
502 static_cast<unsigned int>(q3));
503 mps->ApplyCX(
static_cast<unsigned int>(q1),
504 static_cast<unsigned int>(q2));
505 mps->ApplyCSXDG(
static_cast<unsigned int>(q2),
506 static_cast<unsigned int>(q3));
507 mps->ApplyCX(
static_cast<unsigned int>(q1),
508 static_cast<unsigned int>(q2));
509 mps->ApplyCSX(
static_cast<unsigned int>(q1),
510 static_cast<unsigned int>(q3));
513 NotifyObservers({qubit2, qubit1, qubit0});
527 state->ApplyCSwap(ctrl_qubit, qubit0, qubit1);
529 const size_t q1 = ctrl_qubit;
530 const size_t q2 = qubit0;
531 const size_t q3 = qubit1;
535 mps->ApplyCX(
static_cast<unsigned int>(q3),
536 static_cast<unsigned int>(q2));
537 mps->ApplyCSX(
static_cast<unsigned int>(q2),
538 static_cast<unsigned int>(q3));
539 mps->ApplyCX(
static_cast<unsigned int>(q1),
540 static_cast<unsigned int>(q2));
542 mps->ApplyP(
static_cast<unsigned int>(q3), M_PI);
543 mps->ApplyP(
static_cast<unsigned int>(q2), -M_PI_2);
545 mps->ApplyCSX(
static_cast<unsigned int>(q2),
546 static_cast<unsigned int>(q3));
547 mps->ApplyCX(
static_cast<unsigned int>(q1),
548 static_cast<unsigned int>(q2));
550 mps->ApplyP(
static_cast<unsigned int>(q3), M_PI);
552 mps->ApplyCSX(
static_cast<unsigned int>(q1),
553 static_cast<unsigned int>(q3));
554 mps->ApplyCX(
static_cast<unsigned int>(q3),
555 static_cast<unsigned int>(q2));
558 NotifyObservers({qubit1, qubit0, ctrl_qubit});
573 double theta,
double phi,
double lambda,
double gamma)
override {
575 state->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
577 mps->ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
579 NotifyObservers({tgt_qubit, ctrl_qubit});
589 void ApplyNop()
override {
603 std::unique_ptr<ISimulator> Clone()
override {
604 auto cloned = std::make_unique<GpuSimulator>();
606 cloned->simulationType = simulationType;
607 cloned->nrQubits = nrQubits;
609 cloned->limitSize = limitSize;
610 cloned->limitEntanglement = limitEntanglement;
612 cloned->singularValueThreshold = singularValueThreshold;
615 cloned->state = state->Clone();
617 cloned->mps = mps->Clone();
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 GetSimulationType(void *sim)
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.