14#ifndef _QCSIM_PAULI_PROPAGATOR_H
15#define _QCSIM_PAULI_PROPAGATOR_H 1
17#include "PauliPropagator.h"
24 void ApplyP(
int qubit,
double lambda) { ApplyRZ(qubit, lambda); }
26 void ApplyT(
int qubit) { ApplyRZ(qubit, M_PI_4); }
28 void ApplyTDG(
int qubit) { ApplyRZ(qubit, -M_PI_4); }
30 void ApplyU(
int qubit,
double theta,
double phi,
double lambda,
double gamma = 0.0) {
31 ApplyRZ(qubit, lambda);
32 ApplyRY(qubit, theta);
36 void ApplyCH(
int controlQubit,
int targetQubit) {
39 ApplyCX(controlQubit, targetQubit);
42 ApplyCX(controlQubit, targetQubit);
50 void ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
51 double lambda,
double gamma = 0.0) {
52 if (gamma != 0.0)
ApplyP(controlQubit, gamma);
54 const double lambdaPlusPhiHalf = 0.5 * (lambda + phi);
55 const double halfTheta = 0.5 * theta;
56 ApplyP(targetQubit, 0.5 * (lambda - phi));
57 ApplyP(controlQubit, lambdaPlusPhiHalf);
58 ApplyCX(controlQubit, targetQubit);
59 ApplyU(targetQubit, -halfTheta, 0, -lambdaPlusPhiHalf);
60 ApplyCX(controlQubit, targetQubit);
61 ApplyU(targetQubit, halfTheta, phi, 0);
64 void ApplyCRX(
int controlQubit,
int targetQubit,
double angle) {
65 const double halfAngle = angle * 0.5;
68 ApplyCX(controlQubit, targetQubit);
69 ApplyRZ(targetQubit, -halfAngle);
70 ApplyCX(controlQubit, targetQubit);
71 ApplyRZ(targetQubit, halfAngle);
75 void ApplyCRY(
int controlQubit,
int targetQubit,
double angle) {
76 const double halfAngle = angle * 0.5;
77 ApplyRY(targetQubit, halfAngle);
78 ApplyCX(controlQubit, targetQubit);
79 ApplyRY(targetQubit, -halfAngle);
80 ApplyCX(controlQubit, targetQubit);
83 void ApplyCRZ(
int controlQubit,
int targetQubit,
double angle) {
84 const double halfAngle = angle * 0.5;
86 ApplyRZ(targetQubit, halfAngle);
87 ApplyCX(controlQubit, targetQubit);
88 ApplyRZ(targetQubit, -halfAngle);
89 ApplyCX(controlQubit, targetQubit);
93 void ApplyCP(
int controlQubit,
int targetQubit,
double lambda) {
94 const double halfAngle = lambda * 0.5;
95 ApplyP(controlQubit, halfAngle);
96 ApplyCX(controlQubit, targetQubit);
97 ApplyP(targetQubit, -halfAngle);
98 ApplyCX(controlQubit, targetQubit);
99 ApplyP(targetQubit, halfAngle);
102 void ApplyCS(
int controlQubit,
int targetQubit) {
105 ApplyCX(controlQubit, targetQubit);
107 ApplyCX(controlQubit, targetQubit);
111 ApplyCX(controlQubit, targetQubit);
113 ApplyCX(controlQubit, targetQubit);
120 ApplyCS(controlQubit, targetQubit);
130 void ApplyCSwap(
int controlQubit,
int targetQubit1,
int targetQubit2) {
131 const int q1 = controlQubit;
132 const int q2 = targetQubit1;
133 const int q3 = targetQubit2;
150 void ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit) {
151 const int q1 = controlQubit1;
152 const int q2 = controlQubit2;
153 const int q3 = targetQubit;
162 std::unique_ptr<QcsimPauliPropagator>
Clone()
const {
163 auto clone = std::make_unique<QcsimPauliPropagator>();
164 clone->SetNrQubits(GetNrQubits());
165 clone->SetPauliWeightThreshold(GetPauliWeightThreshold());
166 clone->SetBatchSize(GetBatchSize());
167 clone->SetBatchSizeForSum(GetBatchSizeForSum());
168 clone->SetCoefficientThreshold(GetCoefficientThreshold());
169 clone->SetParallelThreshold(GetParallelThreshold());
170 clone->SetParallelThresholdForSum(GetParallelThresholdForSum());
171 clone->SetStepsBetweenDeduplication(StepsBetweenDeduplication());
172 clone->SetStepsBetweenTrims(StepsBetweenTrims());
173 clone->SetOperations(std::move(GetOperations()));
174 clone->SetSavePosition(GetSavePosition());
175 if (IsParallelEnabled()) clone->EnableParallel();
int ApplyX(void *sim, int qubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplySDG(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
void ApplyCH(int controlQubit, int targetQubit)
void ApplyCU(int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma=0.0)
std::unique_ptr< QcsimPauliPropagator > Clone() const
void ApplyCRZ(int controlQubit, int targetQubit, double angle)
void ApplyCRY(int controlQubit, int targetQubit, double angle)
void ApplyP(int qubit, double lambda)
void ApplyCP(int controlQubit, int targetQubit, double lambda)
void ApplyU(int qubit, double theta, double phi, double lambda, double gamma=0.0)
void ApplyCSXDAG(int controlQubit, int targetQubit)
void ApplyCSDAG(int controlQubit, int targetQubit)
void ApplyCSX(int controlQubit, int targetQubit)
void ApplyCSwap(int controlQubit, int targetQubit1, int targetQubit2)
void ApplyCS(int controlQubit, int targetQubit)
void ApplyCCX(int controlQubit1, int controlQubit2, int targetQubit)
void ApplyCRX(int controlQubit, int targetQubit, double angle)