15#ifndef _QCSIM_EXTENDED_STABILIZER_H
16#define _QCSIM_EXTENDED_STABILIZER_H 1
22#include <unordered_map>
26#include "ExtendedStabilizer.h"
39 : simulator(std::make_unique<QC::ExtendedStabilizer>(nrQubits, policy))
45 return simulator->GetNrQubits();
50 simulator->Reset(nrQubits);
55 simulator->SetRandomSeed(seed);
61 simulator->SetSeed(seed);
66 simulator->SetMultithreading(enable);
71 return simulator->GetMultithreading();
76 simulator->ApplyH(qubit);
81 simulator->ApplyS(qubit);
86 simulator->ApplyX(qubit);
91 simulator->ApplyY(qubit);
96 simulator->ApplyZ(qubit);
101 simulator->ApplyK(qubit);
106 return simulator->Measure(qubit);
111 return simulator->GetQubitProbability(qubit);
116 return simulator->ExpectationValue(pauliString);
121 std::unordered_map<size_t, size_t>
SampleCounts(
const std::vector<size_t> &qubits,
size_t shots)
123 return simulator->SampleCounts(qubits, shots);
126 std::unordered_map<std::vector<bool>,
size_t>
SampleCountsMany(
const std::vector<size_t> &qubits,
size_t shots)
128 return simulator->SampleCountsMany(qubits, shots);
133 simulator->SaveState();
138 simulator->RestoreState();
141 std::unique_ptr<QCSimExtendedStabilizer>
Clone()
const
150 auto clone = simulator->Clone();
151 clone->SetSeed(seed);
155 const std::vector<QC::ExtendedFrame> &
GetFrames() const noexcept
157 return simulator->GetFrames();
162 return simulator->GetApproximationPolicy();
167 return simulator->GetApproximationStatistics();
172 return simulator->GetApproximationErrorBound();
177 simulator->SetApproximationPolicy(policy);
184 simulator->ApplySdg(qubit);
189 simulator->ApplySx(qubit);
194 simulator->ApplySxDag(qubit);
197 void ApplyCX(
size_t controlQubit,
size_t targetQubit)
199 simulator->ApplyCX(targetQubit, controlQubit);
202 void ApplyCY(
size_t controlQubit,
size_t targetQubit)
204 simulator->ApplyCY(targetQubit, controlQubit);
207 void ApplyCZ(
size_t controlQubit,
size_t targetQubit)
209 simulator->ApplyCZ(targetQubit, controlQubit);
214 simulator->ApplySwap(qubit1, qubit2);
219 simulator->ApplyISwap(qubit1, qubit2);
224 simulator->ApplyISwapDag(qubit1, qubit2);
229 simulator->ApplyRx(qubit, angle);
234 simulator->ApplyRy(qubit, angle);
239 simulator->ApplyRz(qubit, angle);
259 void ApplyU(
size_t qubit,
double theta,
double phi,
double lambda,
double gamma = 0.0)
263 simulator->ApplyU(qubit, theta, phi, lambda);
266 void ApplyCH(
size_t controlQubit,
size_t targetQubit)
268 simulator->ApplyCH(targetQubit, controlQubit);
271 void ApplyCU(
size_t controlQubit,
size_t targetQubit,
double theta,
double phi,
double lambda,
double gamma = 0.0)
273 simulator->ApplyCU(targetQubit, controlQubit, theta, phi, lambda, gamma);
276 void ApplyCRX(
size_t controlQubit,
size_t targetQubit,
double angle)
278 simulator->ApplyCRx(targetQubit, controlQubit, angle);
281 void ApplyCRY(
size_t controlQubit,
size_t targetQubit,
double angle)
283 simulator->ApplyCRy(targetQubit, controlQubit, angle);
286 void ApplyCRZ(
size_t controlQubit,
size_t targetQubit,
double angle)
288 simulator->ApplyCRz(targetQubit, controlQubit, angle);
291 void ApplyCP(
size_t controlQubit,
size_t targetQubit,
double lambda)
293 simulator->ApplyCP(targetQubit, controlQubit, lambda);
296 void ApplyCS(
size_t controlQubit,
size_t targetQubit)
298 simulator->ApplyCS(targetQubit, controlQubit);
303 simulator->ApplyCSdg(targetQubit, controlQubit);
306 void ApplyCSX(
size_t controlQubit,
size_t targetQubit)
308 simulator->ApplyCSx(targetQubit, controlQubit);
313 simulator->ApplyCSxDag(targetQubit, controlQubit);
316 void ApplyCSwap(
size_t controlQubit,
size_t targetQubit1,
size_t targetQubit2)
318 simulator->ApplyCSwap(targetQubit1, targetQubit2, controlQubit);
321 void ApplyCCX(
size_t controlQubit1,
size_t controlQubit2,
size_t targetQubit)
323 simulator->ApplyCCX(targetQubit, controlQubit1, controlQubit2);
327 explicit QCSimExtendedStabilizer(std::unique_ptr<QC::ExtendedStabilizer> simulatorToOwn) : simulator(std::move(simulatorToOwn))
331 std::unique_ptr<QC::ExtendedStabilizer> simulator;
332 static constexpr double kPi = 3.141592653589793238462643383279502884;
void ApplyCU(size_t controlQubit, size_t targetQubit, double theta, double phi, double lambda, double gamma=0.0)
void SetSeed(uint64_t seed)
std::unique_ptr< QCSimExtendedStabilizer > Clone() const
void ApplyY(size_t qubit)
void ApplyCSXDAG(size_t controlQubit, size_t targetQubit)
double GetApproximationErrorBound() const noexcept
std::unique_ptr< QCSimExtendedStabilizer > CloneWithSeed(uint64_t seed) const
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 ApplyISWAPDG(size_t qubit1, size_t qubit2)
const std::vector< QC::ExtendedFrame > & GetFrames() const noexcept
std::unordered_map< size_t, size_t > SampleCounts(const std::vector< size_t > &qubits, size_t shots)
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)
std::unordered_map< std::vector< bool >, size_t > SampleCountsMany(const std::vector< size_t > &qubits, size_t shots)
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 SetMultithreading(bool enable=true)
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 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)
bool GetMultithreading() const
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 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 ApplyH(size_t qubit)
void ApplyCZ(size_t controlQubit, size_t targetQubit)
Bounded online routing based on current physical bond dimensions.