15#ifndef _QCSIM_EXTENDED_STABILIZER_H
16#define _QCSIM_EXTENDED_STABILIZER_H 1
24#include "ExtendedStabilizer.h"
31 : simulator(std::make_unique<QC::ExtendedStabilizer>(nrQubits)) {}
35 const QC::ExtendedStabilizerApproximationPolicy& policy)
36 : simulator(std::make_unique<QC::ExtendedStabilizer>(nrQubits, policy)) {}
38 size_t GetNrQubits()
const {
return simulator->GetNrQubits(); }
40 void Reset(
size_t nrQubits) { simulator->Reset(nrQubits); }
43 simulator->SetRandomSeed(seed);
46 void ApplyH(
size_t qubit) { simulator->ApplyH(qubit); }
48 void ApplyS(
size_t qubit) { simulator->ApplyS(qubit); }
50 void ApplyX(
size_t qubit) { simulator->ApplyX(qubit); }
52 void ApplyY(
size_t qubit) { simulator->ApplyY(qubit); }
54 void ApplyZ(
size_t qubit) { simulator->ApplyZ(qubit); }
56 void ApplyK(
size_t qubit) { simulator->ApplyK(qubit); }
58 bool Measure(
size_t qubit) {
return simulator->Measure(qubit); }
61 return simulator->GetQubitProbability(qubit);
65 return simulator->ExpectationValue(pauliString);
72 std::unique_ptr<QCSimExtendedStabilizer>
Clone()
const {
73 return std::unique_ptr<QCSimExtendedStabilizer>(
77 const std::vector<QC::ExtendedFrame>&
GetFrames() const noexcept {
78 return simulator->GetFrames();
83 return simulator->GetApproximationPolicy();
86 const QC::ExtendedStabilizerApproximationStatistics&
88 return simulator->GetApproximationStatistics();
92 return simulator->GetApproximationErrorBound();
96 const QC::ExtendedStabilizerApproximationPolicy& policy) {
97 simulator->SetApproximationPolicy(policy);
102 void ApplySDG(
size_t qubit) { simulator->ApplySdg(qubit); }
104 void ApplySX(
size_t qubit) { simulator->ApplySx(qubit); }
106 void ApplySXDG(
size_t qubit) { simulator->ApplySxDag(qubit); }
110 void ApplyCX(
size_t controlQubit,
size_t targetQubit) {
111 simulator->ApplyCX(targetQubit, controlQubit);
114 void ApplyCY(
size_t controlQubit,
size_t targetQubit) {
115 simulator->ApplyCY(targetQubit, controlQubit);
118 void ApplyCZ(
size_t controlQubit,
size_t targetQubit) {
119 simulator->ApplyCZ(targetQubit, controlQubit);
123 simulator->ApplySwap(qubit1, qubit2);
127 simulator->ApplyISwap(qubit1, qubit2);
131 simulator->ApplyISwapDag(qubit1, qubit2);
135 simulator->ApplyRx(qubit, angle);
139 simulator->ApplyRy(qubit, angle);
143 simulator->ApplyRz(qubit, angle);
152 void ApplyU(
size_t qubit,
double theta,
double phi,
double lambda,
153 double gamma = 0.0) {
161 void ApplyCH(
size_t controlQubit,
size_t targetQubit) {
164 ApplyCX(controlQubit, targetQubit);
167 ApplyCX(controlQubit, targetQubit);
175 void ApplyCU(
size_t controlQubit,
size_t targetQubit,
double theta,
176 double phi,
double lambda,
double gamma = 0.0) {
177 if (gamma != 0.0)
ApplyP(controlQubit, gamma);
179 const double lambdaPlusPhiHalf = 0.5 * (lambda + phi);
180 const double halfTheta = 0.5 * theta;
181 ApplyP(targetQubit, 0.5 * (lambda - phi));
182 ApplyP(controlQubit, lambdaPlusPhiHalf);
183 ApplyCX(controlQubit, targetQubit);
184 ApplyU(targetQubit, -halfTheta, 0.0, -lambdaPlusPhiHalf);
185 ApplyCX(controlQubit, targetQubit);
186 ApplyU(targetQubit, halfTheta, phi, 0.0);
189 void ApplyCRX(
size_t controlQubit,
size_t targetQubit,
double angle) {
190 const double halfAngle = angle * 0.5;
193 ApplyCX(controlQubit, targetQubit);
194 ApplyRZ(targetQubit, -halfAngle);
195 ApplyCX(controlQubit, targetQubit);
196 ApplyRZ(targetQubit, halfAngle);
200 void ApplyCRx(
size_t controlQubit,
size_t targetQubit,
double angle) {
201 ApplyCRX(controlQubit, targetQubit, angle);
204 void ApplyCRY(
size_t controlQubit,
size_t targetQubit,
double angle) {
205 const double halfAngle = angle * 0.5;
206 ApplyRY(targetQubit, halfAngle);
207 ApplyCX(controlQubit, targetQubit);
208 ApplyRY(targetQubit, -halfAngle);
209 ApplyCX(controlQubit, targetQubit);
212 void ApplyCRy(
size_t controlQubit,
size_t targetQubit,
double angle) {
213 ApplyCRY(controlQubit, targetQubit, angle);
216 void ApplyCRZ(
size_t controlQubit,
size_t targetQubit,
double angle) {
217 const double halfAngle = angle * 0.5;
219 ApplyRZ(targetQubit, halfAngle);
220 ApplyCX(controlQubit, targetQubit);
221 ApplyRZ(targetQubit, -halfAngle);
222 ApplyCX(controlQubit, targetQubit);
225 void ApplyCRz(
size_t controlQubit,
size_t targetQubit,
double angle) {
226 ApplyCRZ(controlQubit, targetQubit, angle);
229 void ApplyCP(
size_t controlQubit,
size_t targetQubit,
double lambda) {
230 const double halfAngle = lambda * 0.5;
231 ApplyP(controlQubit, halfAngle);
232 ApplyCX(controlQubit, targetQubit);
233 ApplyP(targetQubit, -halfAngle);
234 ApplyCX(controlQubit, targetQubit);
235 ApplyP(targetQubit, halfAngle);
238 void ApplyCS(
size_t controlQubit,
size_t targetQubit) {
241 ApplyCX(controlQubit, targetQubit);
243 ApplyCX(controlQubit, targetQubit);
247 ApplyCX(controlQubit, targetQubit);
249 ApplyCX(controlQubit, targetQubit);
254 void ApplyCSX(
size_t controlQubit,
size_t targetQubit) {
256 ApplyCS(controlQubit, targetQubit);
260 void ApplyCSx(
size_t controlQubit,
size_t targetQubit) {
261 ApplyCSX(controlQubit, targetQubit);
275 size_t targetQubit2) {
276 const size_t q1 = controlQubit;
277 const size_t q2 = targetQubit1;
278 const size_t q3 = targetQubit2;
295 void ApplyCCX(
size_t controlQubit1,
size_t controlQubit2,
296 size_t targetQubit) {
297 const size_t q1 = controlQubit1;
298 const size_t q2 = controlQubit2;
299 const size_t q3 = targetQubit;
310 std::unique_ptr<QC::ExtendedStabilizer> simulatorToOwn)
311 : simulator(std::move(simulatorToOwn)) {}
313 std::unique_ptr<QC::ExtendedStabilizer> simulator;
314 static constexpr double kPi = 3.141592653589793238462643383279502884;
void ApplyCU(size_t controlQubit, size_t targetQubit, double theta, double phi, double lambda, double gamma=0.0)
std::unique_ptr< QCSimExtendedStabilizer > Clone() const
void ApplyY(size_t qubit)
void ApplyCSXDAG(size_t controlQubit, size_t targetQubit)
double GetApproximationErrorBound() const noexcept
void ApplyCCX(size_t controlQubit1, size_t controlQubit2, size_t targetQubit)
void ApplyZ(size_t qubit)
void ApplySWAP(size_t qubit1, size_t qubit2)
void ApplySXDG(size_t qubit)
void ApplyCSxDAG(size_t controlQubit, size_t targetQubit)
void ApplyISWAPDG(size_t qubit1, size_t qubit2)
const std::vector< QC::ExtendedFrame > & GetFrames() const noexcept
void ApplyCRY(size_t controlQubit, size_t targetQubit, double angle)
void ApplyCSwap(size_t controlQubit, size_t targetQubit1, size_t targetQubit2)
void ApplyRX(size_t qubit, double angle)
size_t GetNrQubits() const
void ApplyCSX(size_t controlQubit, size_t targetQubit)
void ApplyX(size_t qubit)
void ApplyCX(size_t controlQubit, size_t targetQubit)
bool Measure(size_t qubit)
void ApplySX(size_t qubit)
QCSimExtendedStabilizer(size_t nrQubits, const QC::ExtendedStabilizerApproximationPolicy &policy)
void ApplyCS(size_t controlQubit, size_t targetQubit)
void ApplyTDG(size_t qubit)
void ApplyCRZ(size_t controlQubit, size_t targetQubit, double angle)
void SetApproximationPolicy(const QC::ExtendedStabilizerApproximationPolicy &policy)
void ApplyISWAP(size_t qubit1, size_t qubit2)
void ApplyP(size_t qubit, double lambda)
void ApplyRY(size_t qubit, double angle)
QCSimExtendedStabilizer(size_t nrQubits)
void ApplyS(size_t qubit)
void ApplyK(size_t qubit)
void ApplyRZ(size_t qubit, double angle)
void ApplyCRx(size_t controlQubit, size_t targetQubit, double angle)
void ApplyCSx(size_t controlQubit, size_t targetQubit)
void ApplySxDAG(size_t qubit)
void Reset(size_t nrQubits)
double ExpectationValue(const std::string &pauliString) const
void ApplyCRX(size_t controlQubit, size_t targetQubit, double angle)
const QC::ExtendedStabilizerApproximationPolicy & GetApproximationPolicy() const noexcept
const QC::ExtendedStabilizerApproximationStatistics & GetApproximationStatistics() const noexcept
void ApplySDG(size_t qubit)
double GetQubitProbability(size_t qubit) const
void ApplyCH(size_t controlQubit, size_t targetQubit)
void ApplyCP(size_t controlQubit, size_t targetQubit, double lambda)
void ApplyT(size_t qubit)
void ApplyCRy(size_t controlQubit, size_t targetQubit, double angle)
void ApplyU(size_t qubit, double theta, double phi, double lambda, double gamma=0.0)
void ApplyCY(size_t controlQubit, size_t targetQubit)
void SetRandomSeed(std::mt19937::result_type seed)
void ApplyCSDAG(size_t controlQubit, size_t targetQubit)
void ApplyCRz(size_t controlQubit, size_t targetQubit, double angle)
void ApplyH(size_t qubit)
void ApplyCZ(size_t controlQubit, size_t targetQubit)