Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
QcsimPauliPropagator.h
Go to the documentation of this file.
1
12#pragma once
13
14#ifndef _QCSIM_PAULI_PROPAGATOR_H
15#define _QCSIM_PAULI_PROPAGATOR_H 1
16
17#include "PauliPropagator.h"
18
19
20namespace Simulators {
21
22class QcsimPauliPropagator : public QC::PauliPropagator {
23 public:
24 void ApplyP(int qubit, double lambda) { ApplyRZ(qubit, lambda); }
25
26 void ApplyT(int qubit) { ApplyRZ(qubit, M_PI_4); }
27
28 void ApplyTDG(int qubit) { ApplyRZ(qubit, -M_PI_4); }
29
30 void ApplyU(int qubit, double theta, double phi, double lambda, double gamma = 0.0) {
31 ApplyRZ(qubit, lambda);
32 ApplyRY(qubit, theta);
33 ApplyRZ(qubit, phi);
34 }
35
36 void ApplyCH(int controlQubit, int targetQubit) {
37 ApplyH(targetQubit);
38 ApplySDG(targetQubit);
39 ApplyCX(controlQubit, targetQubit);
40 ApplyH(targetQubit);
41 ApplyT(targetQubit);
42 ApplyCX(controlQubit, targetQubit);
43 ApplyT(targetQubit);
44 ApplyH(targetQubit);
45 ApplyS(targetQubit);
46 ApplyX(targetQubit);
47 ApplyS(controlQubit);
48 }
49
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);
53
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);
62 }
63
64 void ApplyCRX(int controlQubit, int targetQubit, double angle) {
65 const double halfAngle = angle * 0.5;
66
67 ApplyH(targetQubit);
68 ApplyCX(controlQubit, targetQubit);
69 ApplyRZ(targetQubit, -halfAngle);
70 ApplyCX(controlQubit, targetQubit);
71 ApplyRZ(targetQubit, halfAngle);
72 ApplyH(targetQubit);
73 }
74
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);
81 }
82
83 void ApplyCRZ(int controlQubit, int targetQubit, double angle) {
84 const double halfAngle = angle * 0.5;
85
86 ApplyRZ(targetQubit, halfAngle);
87 ApplyCX(controlQubit, targetQubit);
88 ApplyRZ(targetQubit, -halfAngle);
89 ApplyCX(controlQubit, targetQubit);
90 }
91
92
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);
100 }
101
102 void ApplyCS(int controlQubit, int targetQubit) {
103 ApplyT(controlQubit);
104 ApplyT(targetQubit);
105 ApplyCX(controlQubit, targetQubit);
106 ApplyTDG(targetQubit);
107 ApplyCX(controlQubit, targetQubit);
108 }
109
110 void ApplyCSDAG(int controlQubit, int targetQubit) {
111 ApplyCX(controlQubit, targetQubit);
112 ApplyT(targetQubit);
113 ApplyCX(controlQubit, targetQubit);
114 ApplyTDG(controlQubit);
115 ApplyTDG(targetQubit);
116 }
117
118 void ApplyCSX(int controlQubit, int targetQubit) {
119 ApplyH(targetQubit);
120 ApplyCS(controlQubit, targetQubit);
121 ApplyH(targetQubit);
122 }
123
124 void ApplyCSXDAG(int controlQubit, int targetQubit) {
125 ApplyH(targetQubit);
126 ApplyCSDAG(controlQubit, targetQubit);
127 ApplyH(targetQubit);
128 }
129
130 void ApplyCSwap(int controlQubit, int targetQubit1, int targetQubit2) {
131 const int q1 = controlQubit; // control
132 const int q2 = targetQubit1;
133 const int q3 = targetQubit2;
134
135 ApplyCX(q3, q2);
136 ApplyCSX(q2, q3);
137 ApplyCX(q1, q2);
138
139 ApplyP(q3, M_PI);
140 ApplyP(q2, -M_PI_2);
141
142 ApplyCSX(q2, q3);
143 ApplyCX(q1, q2);
144
145 ApplyP(q3, M_PI);
146 ApplyCSX(q1, q3);
147 ApplyCX(q3, q2);
148 }
149
150 void ApplyCCX(int controlQubit1, int controlQubit2, int targetQubit) {
151 const int q1 = controlQubit1; // control 1
152 const int q2 = controlQubit2; // control 2
153 const int q3 = targetQubit; // target
154
155 ApplyCSX(q2, q3);
156 ApplyCX(q1, q2);
157 ApplyCSXDAG(q2, q3);
158 ApplyCX(q1, q2);
159 ApplyCSX(q1, q3);
160 }
161
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();
176
177 return clone;
178 }
179};
180
181} // namespace Simulators
182
183#endif // _QCSIM_PAULI_PROPAGATOR_H
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)