15#ifndef _QCSIMSIMULATOR_H
16#define _QCSIMSIMULATOR_H
18#ifdef INCLUDED_BY_FACTORY
22#define _USE_MATH_DEFINES
31class IndividualSimulator;
44class QCSimSimulator :
public QCSimState {
45 friend class IndividualSimulator;
48 QCSimSimulator() =
default;
50 QCSimSimulator(
const QCSimSimulator &) =
delete;
51 QCSimSimulator &operator=(
const QCSimSimulator &) =
delete;
54 QCSimSimulator(QCSimSimulator &&other) =
default;
55 QCSimSimulator &operator=(QCSimSimulator &&other) =
default;
65 pgate.SetPhaseShift(lambda);
67 mpsSimulator->ApplyGate(pgate,
static_cast<unsigned int>(qubit));
69 if (std::abs(lambda - M_PI_2) > 1e-10)
70 throw std::runtime_error(
"QCSimSimulator::ApplyP: Invalid phase shift "
71 "angle for a Clifford gate.");
72 cliffordSimulator->ApplyS(
static_cast<unsigned int>(qubit));
74 tensorNetwork->AddGate(pgate,
static_cast<unsigned int>(qubit));
76 state->ApplyGate(pgate,
static_cast<unsigned int>(qubit));
77 NotifyObservers({qubit});
88 mpsSimulator->ApplyGate(xgate,
static_cast<unsigned int>(qubit));
90 cliffordSimulator->ApplyX(
static_cast<unsigned int>(qubit));
92 tensorNetwork->AddGate(xgate,
static_cast<unsigned int>(qubit));
94 state->ApplyGate(xgate,
static_cast<unsigned int>(qubit));
95 NotifyObservers({qubit});
106 mpsSimulator->ApplyGate(ygate,
static_cast<unsigned int>(qubit));
108 cliffordSimulator->ApplyY(
static_cast<unsigned int>(qubit));
110 tensorNetwork->AddGate(ygate,
static_cast<unsigned int>(qubit));
112 state->ApplyGate(ygate,
static_cast<unsigned int>(qubit));
113 NotifyObservers({qubit});
124 mpsSimulator->ApplyGate(zgate,
static_cast<unsigned int>(qubit));
126 cliffordSimulator->ApplyZ(
static_cast<unsigned int>(qubit));
128 tensorNetwork->AddGate(zgate,
static_cast<unsigned int>(qubit));
130 state->ApplyGate(zgate,
static_cast<unsigned int>(qubit));
131 NotifyObservers({qubit});
142 mpsSimulator->ApplyGate(h,
static_cast<unsigned int>(qubit));
144 cliffordSimulator->ApplyH(
static_cast<unsigned int>(qubit));
146 tensorNetwork->AddGate(h,
static_cast<unsigned int>(qubit));
148 state->ApplyGate(h,
static_cast<unsigned int>(qubit));
149 NotifyObservers({qubit});
160 mpsSimulator->ApplyGate(sgate,
static_cast<unsigned int>(qubit));
162 cliffordSimulator->ApplyS(
static_cast<unsigned int>(qubit));
164 tensorNetwork->AddGate(sgate,
static_cast<unsigned int>(qubit));
166 state->ApplyGate(sgate,
static_cast<unsigned int>(qubit));
167 NotifyObservers({qubit});
178 mpsSimulator->ApplyGate(sdggate,
static_cast<unsigned int>(qubit));
180 cliffordSimulator->ApplySdg(
static_cast<unsigned int>(qubit));
182 tensorNetwork->AddGate(sdggate,
static_cast<unsigned int>(qubit));
184 state->ApplyGate(sdggate,
static_cast<unsigned int>(qubit));
185 NotifyObservers({qubit});
196 mpsSimulator->ApplyGate(tgate,
static_cast<unsigned int>(qubit));
198 throw std::runtime_error(
199 "QCSimSimulator::ApplyT: The stabilizer simulator does not support "
200 "non-clifford gates.");
202 tensorNetwork->AddGate(tgate,
static_cast<unsigned int>(qubit));
204 state->ApplyGate(tgate,
static_cast<unsigned int>(qubit));
205 NotifyObservers({qubit});
216 mpsSimulator->ApplyGate(tdggate,
static_cast<unsigned int>(qubit));
218 throw std::runtime_error(
219 "QCSimSimulator::ApplyTDG: The stabilizer simulator does not support "
220 "non-clifford gates.");
222 tensorNetwork->AddGate(tdggate,
static_cast<unsigned int>(qubit));
224 state->ApplyGate(tdggate,
static_cast<unsigned int>(qubit));
225 NotifyObservers({qubit});
236 mpsSimulator->ApplyGate(sxgate,
static_cast<unsigned int>(qubit));
238 cliffordSimulator->ApplySx(
static_cast<unsigned int>(qubit));
240 tensorNetwork->AddGate(sxgate,
static_cast<unsigned int>(qubit));
242 state->ApplyGate(sxgate,
static_cast<unsigned int>(qubit));
243 NotifyObservers({qubit});
254 mpsSimulator->ApplyGate(sxdaggate,
static_cast<unsigned int>(qubit));
256 cliffordSimulator->ApplySxDag(
static_cast<unsigned int>(qubit));
258 tensorNetwork->AddGate(sxdaggate,
static_cast<unsigned int>(qubit));
260 state->ApplyGate(sxdaggate,
static_cast<unsigned int>(qubit));
261 NotifyObservers({qubit});
272 mpsSimulator->ApplyGate(k,
static_cast<unsigned int>(qubit));
274 cliffordSimulator->ApplyK(
static_cast<unsigned int>(qubit));
276 tensorNetwork->AddGate(k,
static_cast<unsigned int>(qubit));
278 state->ApplyGate(k,
static_cast<unsigned int>(qubit));
279 NotifyObservers({qubit});
290 rxgate.SetTheta(theta);
292 mpsSimulator->ApplyGate(rxgate,
static_cast<unsigned int>(qubit));
294 throw std::runtime_error(
"QCSimSimulator::ApplyRx: The stabilizer "
295 "simulator does not support the Rx gate.");
297 tensorNetwork->AddGate(rxgate,
static_cast<unsigned int>(qubit));
299 state->ApplyGate(rxgate,
static_cast<unsigned int>(qubit));
300 NotifyObservers({qubit});
311 rygate.SetTheta(theta);
313 mpsSimulator->ApplyGate(rygate,
static_cast<unsigned int>(qubit));
315 throw std::runtime_error(
"QCSimSimulator::ApplyRy: The stabilizer "
316 "simulator does not support the Ry gate.");
318 tensorNetwork->AddGate(rygate,
static_cast<unsigned int>(qubit));
320 state->ApplyGate(rygate,
static_cast<unsigned int>(qubit));
321 NotifyObservers({qubit});
332 rzgate.SetTheta(theta);
334 mpsSimulator->ApplyGate(rzgate,
static_cast<unsigned int>(qubit));
336 throw std::runtime_error(
"QCSimSimulator::ApplyRz: The stabilizer "
337 "simulator does not support the Rz gate.");
339 tensorNetwork->AddGate(rzgate,
static_cast<unsigned int>(qubit));
341 state->ApplyGate(rzgate,
static_cast<unsigned int>(qubit));
342 NotifyObservers({qubit});
356 double gamma)
override {
357 ugate.SetParams(theta, phi, lambda, gamma);
359 mpsSimulator->ApplyGate(ugate,
static_cast<unsigned int>(qubit));
361 throw std::runtime_error(
"QCSimSimulator::ApplyU: The stabilizer "
362 "simulator does not support the U gate.");
364 tensorNetwork->AddGate(ugate,
static_cast<unsigned int>(qubit));
366 state->ApplyGate(ugate,
static_cast<unsigned int>(qubit));
367 NotifyObservers({qubit});
379 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(tgt_qubit),
380 static_cast<unsigned int>(ctrl_qubit));
382 cliffordSimulator->ApplyCX(
static_cast<unsigned int>(tgt_qubit),
383 static_cast<unsigned int>(ctrl_qubit));
385 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(ctrl_qubit),
386 static_cast<unsigned int>(tgt_qubit));
388 state->ApplyGate(cxgate,
static_cast<unsigned int>(tgt_qubit),
389 static_cast<unsigned int>(ctrl_qubit));
390 NotifyObservers({tgt_qubit, ctrl_qubit});
402 mpsSimulator->ApplyGate(cygate,
static_cast<unsigned int>(tgt_qubit),
403 static_cast<unsigned int>(ctrl_qubit));
405 cliffordSimulator->ApplyCY(
static_cast<unsigned int>(tgt_qubit),
406 static_cast<unsigned int>(ctrl_qubit));
408 tensorNetwork->AddGate(cygate,
static_cast<unsigned int>(ctrl_qubit),
409 static_cast<unsigned int>(tgt_qubit));
411 state->ApplyGate(cygate,
static_cast<unsigned int>(tgt_qubit),
412 static_cast<unsigned int>(ctrl_qubit));
413 NotifyObservers({tgt_qubit, ctrl_qubit});
425 mpsSimulator->ApplyGate(czgate,
static_cast<unsigned int>(tgt_qubit),
426 static_cast<unsigned int>(ctrl_qubit));
428 cliffordSimulator->ApplyCZ(
static_cast<unsigned int>(tgt_qubit),
429 static_cast<unsigned int>(ctrl_qubit));
431 tensorNetwork->AddGate(czgate,
static_cast<unsigned int>(ctrl_qubit),
432 static_cast<unsigned int>(tgt_qubit));
434 state->ApplyGate(czgate,
static_cast<unsigned int>(tgt_qubit),
435 static_cast<unsigned int>(ctrl_qubit));
436 NotifyObservers({tgt_qubit, ctrl_qubit});
448 double lambda)
override {
449 cpgate.SetPhaseShift(lambda);
451 mpsSimulator->ApplyGate(cpgate,
static_cast<unsigned int>(tgt_qubit),
452 static_cast<unsigned int>(ctrl_qubit));
454 throw std::runtime_error(
"QCSimSimulator::ApplyCP: The stabilizer "
455 "simulator does not support the CP gate.");
457 tensorNetwork->AddGate(cpgate,
static_cast<unsigned int>(ctrl_qubit),
458 static_cast<unsigned int>(tgt_qubit));
460 state->ApplyGate(cpgate,
static_cast<unsigned int>(tgt_qubit),
461 static_cast<unsigned int>(ctrl_qubit));
462 NotifyObservers({tgt_qubit, ctrl_qubit});
474 double theta)
override {
475 crxgate.SetTheta(theta);
477 mpsSimulator->ApplyGate(crxgate,
static_cast<unsigned int>(tgt_qubit),
478 static_cast<unsigned int>(ctrl_qubit));
480 throw std::runtime_error(
"QCSimSimulator::ApplyCRx: The stabilizer "
481 "simulator does not support the CRx gate.");
483 tensorNetwork->AddGate(crxgate,
static_cast<unsigned int>(ctrl_qubit),
484 static_cast<unsigned int>(tgt_qubit));
486 state->ApplyGate(crxgate,
static_cast<unsigned int>(tgt_qubit),
487 static_cast<unsigned int>(ctrl_qubit));
488 NotifyObservers({tgt_qubit, ctrl_qubit});
500 double theta)
override {
501 crygate.SetTheta(theta);
503 mpsSimulator->ApplyGate(crygate,
static_cast<unsigned int>(tgt_qubit),
504 static_cast<unsigned int>(ctrl_qubit));
506 throw std::runtime_error(
"QCSimSimulator::ApplyCRy: The stabilizer "
507 "simulator does not support the CRy gate.");
509 tensorNetwork->AddGate(crygate,
static_cast<unsigned int>(ctrl_qubit),
510 static_cast<unsigned int>(tgt_qubit));
512 state->ApplyGate(crygate,
static_cast<unsigned int>(tgt_qubit),
513 static_cast<unsigned int>(ctrl_qubit));
514 NotifyObservers({tgt_qubit, ctrl_qubit});
526 double theta)
override {
527 crzgate.SetTheta(theta);
529 mpsSimulator->ApplyGate(crzgate,
static_cast<unsigned int>(tgt_qubit),
530 static_cast<unsigned int>(ctrl_qubit));
532 throw std::runtime_error(
"QCSimSimulator::ApplyCRz: The stabilizer "
533 "simulator does not support the CRz gate.");
535 tensorNetwork->AddGate(crzgate,
static_cast<unsigned int>(ctrl_qubit),
536 static_cast<unsigned int>(tgt_qubit));
538 state->ApplyGate(crzgate,
static_cast<unsigned int>(tgt_qubit),
539 static_cast<unsigned int>(ctrl_qubit));
540 NotifyObservers({tgt_qubit, ctrl_qubit});
552 mpsSimulator->ApplyGate(ch,
static_cast<unsigned int>(tgt_qubit),
553 static_cast<unsigned int>(ctrl_qubit));
555 throw std::runtime_error(
"QCSimSimulator::ApplyCH: The stabilizer "
556 "simulator does not support the CH gate.");
558 tensorNetwork->AddGate(ch,
static_cast<unsigned int>(ctrl_qubit),
559 static_cast<unsigned int>(tgt_qubit));
561 state->ApplyGate(ch,
static_cast<unsigned int>(tgt_qubit),
562 static_cast<unsigned int>(ctrl_qubit));
563 NotifyObservers({tgt_qubit, ctrl_qubit});
575 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(tgt_qubit),
576 static_cast<unsigned int>(ctrl_qubit));
578 throw std::runtime_error(
"QCSimSimulator::ApplyCSx: The stabilizer "
579 "simulator does not support the CSx gate.");
581 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(ctrl_qubit),
582 static_cast<unsigned int>(tgt_qubit));
584 state->ApplyGate(csx,
static_cast<unsigned int>(tgt_qubit),
585 static_cast<unsigned int>(ctrl_qubit));
586 NotifyObservers({tgt_qubit, ctrl_qubit});
599 mpsSimulator->ApplyGate(csxdag,
static_cast<unsigned int>(tgt_qubit),
600 static_cast<unsigned int>(ctrl_qubit));
602 throw std::runtime_error(
"QCSimSimulator::ApplyCSxDAG: The stabilizer "
603 "simulator does not support the CSxDag gate.");
605 tensorNetwork->AddGate(csxdag,
static_cast<unsigned int>(ctrl_qubit),
606 static_cast<unsigned int>(tgt_qubit));
608 state->ApplyGate(csxdag,
static_cast<unsigned int>(tgt_qubit),
609 static_cast<unsigned int>(ctrl_qubit));
610 NotifyObservers({tgt_qubit, ctrl_qubit});
622 mpsSimulator->ApplyGate(swapgate,
static_cast<unsigned int>(qubit1),
623 static_cast<unsigned int>(qubit0));
625 cliffordSimulator->ApplySwap(
static_cast<unsigned int>(qubit1),
626 static_cast<unsigned int>(qubit0));
628 tensorNetwork->AddGate(swapgate,
static_cast<unsigned int>(qubit0),
629 static_cast<unsigned int>(qubit1));
631 state->ApplyGate(swapgate,
static_cast<unsigned int>(qubit1),
632 static_cast<unsigned int>(qubit0));
633 NotifyObservers({qubit1, qubit0});
647 const size_t q1 = qubit0;
648 const size_t q2 = qubit1;
649 const size_t q3 = qubit2;
652 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(q3),
653 static_cast<unsigned int>(q2));
654 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
655 static_cast<unsigned int>(q1));
656 mpsSimulator->ApplyGate(csxdag,
static_cast<unsigned int>(q3),
657 static_cast<unsigned int>(q2));
658 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
659 static_cast<unsigned int>(q1));
660 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(q3),
661 static_cast<unsigned int>(q1));
663 throw std::runtime_error(
"QCSimSimulator::ApplyCCX: The stabilizer "
664 "simulator does not support the CCX gate.");
666 const size_t q1 = qubit0;
667 const size_t q2 = qubit1;
668 const size_t q3 = qubit2;
671 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(q2),
672 static_cast<unsigned int>(q3));
673 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q1),
674 static_cast<unsigned int>(q2));
675 tensorNetwork->AddGate(csxdag,
static_cast<unsigned int>(q2),
676 static_cast<unsigned int>(q3));
677 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q1),
678 static_cast<unsigned int>(q2));
679 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(q1),
680 static_cast<unsigned int>(q3));
682 state->ApplyGate(ccxgate,
static_cast<unsigned int>(qubit2),
683 static_cast<unsigned int>(qubit1),
684 static_cast<unsigned int>(qubit0));
685 NotifyObservers({qubit2, qubit1, qubit0});
699 const size_t q1 = ctrl_qubit;
700 const size_t q2 = qubit0;
701 const size_t q3 = qubit1;
705 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
706 static_cast<unsigned int>(q3));
707 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(q3),
708 static_cast<unsigned int>(q2));
709 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
710 static_cast<unsigned int>(q1));
712 pgate.SetPhaseShift(M_PI);
713 mpsSimulator->ApplyGate(pgate,
static_cast<unsigned int>(q3));
714 pgate.SetPhaseShift(-M_PI_2);
715 mpsSimulator->ApplyGate(pgate,
static_cast<unsigned int>(q2));
717 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(q3),
718 static_cast<unsigned int>(q2));
719 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
720 static_cast<unsigned int>(q1));
722 pgate.SetPhaseShift(M_PI);
723 mpsSimulator->ApplyGate(pgate,
static_cast<unsigned int>(q3));
725 mpsSimulator->ApplyGate(csx,
static_cast<unsigned int>(q3),
726 static_cast<unsigned int>(q1));
727 mpsSimulator->ApplyGate(cxgate,
static_cast<unsigned int>(q2),
728 static_cast<unsigned int>(q3));
730 throw std::runtime_error(
"QCSimSimulator::ApplyCSwap: The stabilizer "
731 "simulator does not support the CSwap gate.");
733 const size_t q1 = ctrl_qubit;
734 const size_t q2 = qubit0;
735 const size_t q3 = qubit1;
739 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q3),
740 static_cast<unsigned int>(q2));
741 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(q2),
742 static_cast<unsigned int>(q3));
743 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q1),
744 static_cast<unsigned int>(q2));
746 pgate.SetPhaseShift(M_PI);
747 tensorNetwork->AddGate(pgate,
static_cast<unsigned int>(q3));
748 pgate.SetPhaseShift(-M_PI_2);
749 tensorNetwork->AddGate(pgate,
static_cast<unsigned int>(q2));
751 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(q2),
752 static_cast<unsigned int>(q3));
753 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q1),
754 static_cast<unsigned int>(q2));
756 pgate.SetPhaseShift(M_PI);
757 tensorNetwork->AddGate(pgate,
static_cast<unsigned int>(q3));
759 tensorNetwork->AddGate(csx,
static_cast<unsigned int>(q1),
760 static_cast<unsigned int>(q3));
761 tensorNetwork->AddGate(cxgate,
static_cast<unsigned int>(q3),
762 static_cast<unsigned int>(q2));
764 state->ApplyGate(cswapgate,
static_cast<unsigned int>(qubit1),
765 static_cast<unsigned int>(qubit0),
766 static_cast<unsigned int>(ctrl_qubit));
767 NotifyObservers({qubit1, qubit0, ctrl_qubit});
782 double theta,
double phi,
double lambda,
double gamma)
override {
783 cugate.SetParams(theta, phi, lambda, gamma);
785 mpsSimulator->ApplyGate(cugate,
static_cast<unsigned int>(tgt_qubit),
786 static_cast<unsigned int>(ctrl_qubit));
788 throw std::runtime_error(
"QCSimSimulator::ApplyCU: The stabilizer "
789 "simulator does not support the CU gate.");
791 tensorNetwork->AddGate(cugate,
static_cast<unsigned int>(ctrl_qubit),
792 static_cast<unsigned int>(tgt_qubit));
794 state->ApplyGate(cugate,
static_cast<unsigned int>(tgt_qubit),
795 static_cast<unsigned int>(ctrl_qubit));
796 NotifyObservers({tgt_qubit, ctrl_qubit});
806 void ApplyNop()
override {
820 std::unique_ptr<ISimulator> Clone()
override {
821 auto cloned = std::make_unique<QCSimSimulator>();
823 cloned->simulationType = simulationType;
824 cloned->nrQubits = nrQubits;
826 cloned->limitSize = limitSize;
827 cloned->limitEntanglement = limitEntanglement;
829 cloned->singularValueThreshold = singularValueThreshold;
831 cloned->enableMultithreading = enableMultithreading;
832 cloned->useMPSMeasureNoCollapse = useMPSMeasureNoCollapse;
835 cloned->state = state->Clone();
838 cloned->mpsSimulator = mpsSimulator->Clone();
840 if (limitEntanglement && singularValueThreshold > 0.)
841 cloned->mpsSimulator->setLimitEntanglement(singularValueThreshold);
842 if (limitSize && chi > 0)
843 cloned->mpsSimulator->setLimitBondDimension(chi);
846 if (cliffordSimulator)
847 cloned->cliffordSimulator = cliffordSimulator->Clone();
850 cloned->tensorNetwork = tensorNetwork->Clone();
856 QC::Gates::PhaseShiftGate<> pgate;
857 QC::Gates::PauliXGate<> xgate;
858 QC::Gates::PauliYGate<> ygate;
859 QC::Gates::PauliZGate<> zgate;
860 QC::Gates::HadamardGate<> h;
862 QC::Gates::SGate<> sgate;
863 QC::Gates::SDGGate<> sdggate;
864 QC::Gates::TGate<> tgate;
865 QC::Gates::TDGGate<> tdggate;
866 QC::Gates::SquareRootNOTGate<> sxgate;
867 QC::Gates::SquareRootNOTDagGate<> sxdaggate;
868 QC::Gates::HyGate<> k;
869 QC::Gates::RxGate<> rxgate;
870 QC::Gates::RyGate<> rygate;
871 QC::Gates::RzGate<> rzgate;
872 QC::Gates::UGate<> ugate;
873 QC::Gates::CNOTGate<> cxgate;
874 QC::Gates::ControlledYGate<> cygate;
875 QC::Gates::ControlledZGate<> czgate;
876 QC::Gates::ControlledPhaseShiftGate<> cpgate;
877 QC::Gates::ControlledRxGate<> crxgate;
878 QC::Gates::ControlledRyGate<> crygate;
879 QC::Gates::ControlledRzGate<> crzgate;
880 QC::Gates::ControlledHadamardGate<> ch;
881 QC::Gates::ControlledSquareRootNOTGate<> csx;
882 QC::Gates::ControlledSquareRootNOTDagGate<> csxdag;
883 QC::Gates::SwapGate<> swapgate;
884 QC::Gates::ToffoliGate<> ccxgate;
885 QC::Gates::FredkinGate<> cswapgate;
886 QC::Gates::ControlledUGate<> cugate;
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.