15#ifndef _GPU_LIB_STATEVECTOR_SIM
16#define _GPU_LIB_STATEVECTOR_SIM 1
26class GpuLibStateVectorSim {
28 explicit GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary> &lib)
31 obj = lib->CreateStateVector();
36 GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj)
37 : lib(lib), obj(obj) {}
39 GpuLibStateVectorSim() =
delete;
40 GpuLibStateVectorSim(
const GpuLibStateVectorSim &) =
delete;
41 GpuLibStateVectorSim &operator=(
const GpuLibStateVectorSim &) =
delete;
42 GpuLibStateVectorSim(GpuLibStateVectorSim &&) =
default;
43 GpuLibStateVectorSim &operator=(GpuLibStateVectorSim &&) =
default;
45 ~GpuLibStateVectorSim() {
46 if (lib && obj) lib->DestroyStateVector(obj);
49 bool Create(
unsigned int nrQubits) {
50 if (obj)
return lib->Create(obj, nrQubits);
55 bool CreateWithState(
unsigned int nrQubits,
const double *state) {
56 if (obj)
return lib->CreateWithState(obj, nrQubits, state);
62 if (obj)
return lib->Reset(obj);
67 bool SetDataType(
bool useDoublePrecision) {
68 if (obj)
return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
72 bool IsDoublePrecision()
const {
73 if (obj)
return lib->IsDoublePrecision(obj);
77 int GetNrQubits()
const {
78 if (obj)
return lib->GetNrQubits(obj);
82 bool MeasureQubitCollapse(
int qubitIndex) {
83 if (obj)
return lib->MeasureQubitCollapse(obj, qubitIndex);
88 bool MeasureQubitNoCollapse(
int qubitIndex) {
89 if (obj)
return lib->MeasureQubitNoCollapse(obj, qubitIndex);
94 bool MeasureQubitsCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
96 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
101 bool MeasureQubitsNoCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
103 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
108 unsigned long long MeasureAllQubitsCollapse() {
109 if (obj)
return lib->MeasureAllQubitsCollapse(obj);
111 return static_cast<unsigned long long>(-1);
114 unsigned long long MeasureAllQubitsNoCollapse() {
115 if (obj)
return lib->MeasureAllQubitsNoCollapse(obj);
117 return static_cast<unsigned long long>(-1);
121 if (obj)
return lib->SaveState(obj);
126 bool SaveStateToHost() {
127 if (obj)
return lib->SaveStateToHost(obj);
132 bool SaveStateDestructive() {
133 if (obj)
return lib->SaveStateDestructive(obj);
138 bool RestoreStateFreeSaved() {
139 if (obj)
return lib->RestoreStateFreeSaved(obj);
144 bool RestoreStateNoFreeSaved() {
145 if (obj)
return lib->RestoreStateNoFreeSaved(obj);
150 void FreeSavedState() {
151 if (obj) lib->FreeSavedState(obj);
154 std::unique_ptr<GpuLibStateVectorSim> Clone() {
156 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
161 bool Sample(
unsigned int nSamples,
long int *samples,
unsigned int nBits,
163 if (obj)
return lib->Sample(obj, nSamples, samples, nBits, bits);
167 bool SampleAll(
unsigned int nSamples,
long int *samples) {
168 if (obj)
return lib->SampleAll(obj, nSamples, samples);
173 bool Amplitude(
long long int state,
double *real,
double *imaginary)
const {
174 if (obj)
return lib->Amplitude(obj, state, real, imaginary);
179 double Probability(
int *qubits,
int *mask,
int len)
const {
180 if (obj)
return lib->Probability(obj, qubits, mask, len);
184 double BasisStateProbability(
long long int state)
const {
185 if (obj)
return lib->BasisStateProbability(obj, state);
190 if (obj)
return lib->AllProbabilities(obj, probabilities);
194 double ExpectationValue(
const std::string &pauliString)
const {
196 return lib->ExpectationValue(obj, pauliString.c_str(),
197 pauliString.length());
203 if (obj)
return lib->ApplyX(obj, qubit);
209 if (obj)
return lib->ApplyY(obj, qubit);
215 if (obj)
return lib->ApplyZ(obj, qubit);
221 if (obj)
return lib->ApplyH(obj, qubit);
227 if (obj)
return lib->ApplyS(obj, qubit);
233 if (obj)
return lib->ApplySDG(obj, qubit);
239 if (obj)
return lib->ApplyT(obj, qubit);
245 if (obj)
return lib->ApplyTDG(obj, qubit);
251 if (obj)
return lib->ApplySX(obj, qubit);
257 if (obj)
return lib->ApplySXDG(obj, qubit);
263 if (obj)
return lib->ApplyK(obj, qubit);
268 bool ApplyP(
int qubit,
double theta) {
269 if (obj)
return lib->ApplyP(obj, qubit, theta);
274 bool ApplyRx(
int qubit,
double theta) {
275 if (obj)
return lib->ApplyRx(obj, qubit, theta) == 1;
280 bool ApplyRy(
int qubit,
double theta) {
281 if (obj)
return lib->ApplyRy(obj, qubit, theta);
286 bool ApplyRz(
int qubit,
double theta) {
287 if (obj)
return lib->ApplyRz(obj, qubit, theta);
292 bool ApplyU(
int qubit,
double theta,
double phi,
double lambda,
294 if (obj)
return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
299 bool ApplyCX(
int controlQubit,
int targetQubit) {
300 if (obj)
return lib->ApplyCX(obj, controlQubit, targetQubit);
305 bool ApplyCY(
int controlQubit,
int targetQubit) {
306 if (obj)
return lib->ApplyCY(obj, controlQubit, targetQubit);
311 bool ApplyCZ(
int controlQubit,
int targetQubit) {
312 if (obj)
return lib->ApplyCZ(obj, controlQubit, targetQubit);
317 bool ApplyCH(
int controlQubit,
int targetQubit) {
318 if (obj)
return lib->ApplyCH(obj, controlQubit, targetQubit);
323 bool ApplyCSX(
int controlQubit,
int targetQubit) {
324 if (obj)
return lib->ApplyCSX(obj, controlQubit, targetQubit);
329 bool ApplyCSXDG(
int controlQubit,
int targetQubit) {
330 if (obj)
return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
335 bool ApplyCP(
int controlQubit,
int targetQubit,
double theta) {
336 if (obj)
return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
341 bool ApplyCRx(
int controlQubit,
int targetQubit,
double theta) {
342 if (obj)
return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
347 bool ApplyCRy(
int controlQubit,
int targetQubit,
double theta) {
348 if (obj)
return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
353 bool ApplyCRz(
int controlQubit,
int targetQubit,
double theta) {
354 if (obj)
return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
359 bool ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit) {
361 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
367 if (obj)
return lib->ApplySwap(obj, qubit1, qubit2);
372 bool ApplyCSwap(
int controlQubit,
int qubit1,
int qubit2) {
373 if (obj)
return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
378 bool ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
379 double lambda,
double gamma) {
381 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
388 std::shared_ptr<GpuLibrary> lib;
int ApplyK(void *sim, int qubit)
double Probability(void *sim, unsigned long long int outcome)
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 ApplyCSXDG(void *sim, int controlQubit, int targetQubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
double * AllProbabilities(void *sim)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySXDG(void *sim, int qubit)
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)
double * Amplitude(void *sim, unsigned long long int outcome)
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 ApplySX(void *sim, int qubit)
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)
int ApplyCSX(void *sim, int controlQubit, int targetQubit)