15#ifndef _GPU_LIB_STATEVECTOR_SIM
16#define _GPU_LIB_STATEVECTOR_SIM 1
26class GpuLibStateVectorSim {
28 explicit GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary>& lib,
int device = -1)
29 : lib(lib), obj(
nullptr) {
31 auto lock = lib->LockInitialization();
32 if (lib->SetGpuDevice(device == -1 ? lib->GetCreationDevice() : device))
33 obj = lib->CreateStateVector();
37 int GetGpuDevice()
const {
return lib ? lib->GetStateVectorGpuId(obj) : -1; }
39 GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj)
40 : lib(lib), obj(obj) {}
42 GpuLibStateVectorSim() =
delete;
43 GpuLibStateVectorSim(
const GpuLibStateVectorSim &) =
delete;
44 GpuLibStateVectorSim &operator=(
const GpuLibStateVectorSim &) =
delete;
45 GpuLibStateVectorSim(GpuLibStateVectorSim &&) =
default;
46 GpuLibStateVectorSim &operator=(GpuLibStateVectorSim &&) =
default;
48 ~GpuLibStateVectorSim() {
49 if (lib && obj) lib->DestroyStateVector(obj);
52 bool Create(
unsigned int nrQubits) {
53 if (obj)
return lib->Create(obj, nrQubits);
58 bool CreateWithState(
unsigned int nrQubits,
const double *state) {
59 if (obj)
return lib->CreateWithState(obj, nrQubits, state);
65 if (obj)
return lib->Reset(obj);
70 bool SetSeed(uint64_t seed) {
return obj && lib->SetSeed(obj, seed); }
72 bool SetDataType(
bool useDoublePrecision) {
73 if (obj)
return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
77 bool IsDoublePrecision()
const {
78 if (obj)
return lib->IsDoublePrecision(obj);
82 int GetNrQubits()
const {
83 if (obj)
return lib->GetNrQubits(obj);
87 bool MeasureQubitCollapse(
int qubitIndex) {
88 if (obj)
return lib->MeasureQubitCollapse(obj, qubitIndex);
93 bool MeasureQubitNoCollapse(
int qubitIndex) {
94 if (obj)
return lib->MeasureQubitNoCollapse(obj, qubitIndex);
99 bool MeasureQubitsCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
101 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
106 bool MeasureQubitsNoCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
108 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
113 unsigned long long MeasureAllQubitsCollapse() {
114 if (obj)
return lib->MeasureAllQubitsCollapse(obj);
116 return static_cast<unsigned long long>(-1);
119 unsigned long long MeasureAllQubitsNoCollapse() {
120 if (obj)
return lib->MeasureAllQubitsNoCollapse(obj);
122 return static_cast<unsigned long long>(-1);
126 if (obj)
return lib->SaveState(obj);
131 bool SaveStateToHost() {
132 if (obj)
return lib->SaveStateToHost(obj);
137 bool SaveStateDestructive() {
138 if (obj)
return lib->SaveStateDestructive(obj);
143 bool RestoreStateFreeSaved() {
144 if (obj)
return lib->RestoreStateFreeSaved(obj);
149 bool RestoreStateNoFreeSaved() {
150 if (obj)
return lib->RestoreStateNoFreeSaved(obj);
155 void FreeSavedState() {
156 if (obj) lib->FreeSavedState(obj);
159 std::unique_ptr<GpuLibStateVectorSim> Clone() {
161 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
166 bool Sample(
unsigned int nSamples,
long int *samples,
unsigned int nBits,
168 if (obj)
return lib->Sample(obj, nSamples, samples, nBits, bits);
172 bool SampleAll(
unsigned int nSamples,
long int *samples) {
173 if (obj)
return lib->SampleAll(obj, nSamples, samples);
178 bool Amplitude(
long long int state,
double *real,
double *imaginary)
const {
179 if (obj)
return lib->Amplitude(obj, state, real, imaginary);
184 double Probability(
int *qubits,
int *mask,
int len)
const {
185 if (obj)
return lib->Probability(obj, qubits, mask, len);
189 double BasisStateProbability(
long long int state)
const {
190 if (obj)
return lib->BasisStateProbability(obj, state);
195 if (obj)
return lib->AllProbabilities(obj, probabilities);
199 double ExpectationValue(
const std::string &pauliString)
const {
201 return lib->ExpectationValue(obj, pauliString.c_str(),
202 pauliString.length());
208 if (obj)
return lib->ApplyX(obj, qubit);
214 if (obj)
return lib->ApplyY(obj, qubit);
220 if (obj)
return lib->ApplyZ(obj, qubit);
226 if (obj)
return lib->ApplyH(obj, qubit);
232 if (obj)
return lib->ApplyS(obj, qubit);
238 if (obj)
return lib->ApplySDG(obj, qubit);
244 if (obj)
return lib->ApplyT(obj, qubit);
250 if (obj)
return lib->ApplyTDG(obj, qubit);
256 if (obj)
return lib->ApplySX(obj, qubit);
262 if (obj)
return lib->ApplySXDG(obj, qubit);
268 if (obj)
return lib->ApplyK(obj, qubit);
273 bool ApplyP(
int qubit,
double theta) {
274 if (obj)
return lib->ApplyP(obj, qubit, theta);
279 bool ApplyRx(
int qubit,
double theta) {
280 if (obj)
return lib->ApplyRx(obj, qubit, theta) == 1;
285 bool ApplyRy(
int qubit,
double theta) {
286 if (obj)
return lib->ApplyRy(obj, qubit, theta);
291 bool ApplyRz(
int qubit,
double theta) {
292 if (obj)
return lib->ApplyRz(obj, qubit, theta);
297 bool ApplyU(
int qubit,
double theta,
double phi,
double lambda,
299 if (obj)
return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
304 bool ApplyCX(
int controlQubit,
int targetQubit) {
305 if (obj)
return lib->ApplyCX(obj, controlQubit, targetQubit);
310 bool ApplyCY(
int controlQubit,
int targetQubit) {
311 if (obj)
return lib->ApplyCY(obj, controlQubit, targetQubit);
316 bool ApplyCZ(
int controlQubit,
int targetQubit) {
317 if (obj)
return lib->ApplyCZ(obj, controlQubit, targetQubit);
322 bool ApplyCH(
int controlQubit,
int targetQubit) {
323 if (obj)
return lib->ApplyCH(obj, controlQubit, targetQubit);
328 bool ApplyCSX(
int controlQubit,
int targetQubit) {
329 if (obj)
return lib->ApplyCSX(obj, controlQubit, targetQubit);
334 bool ApplyCSXDG(
int controlQubit,
int targetQubit) {
335 if (obj)
return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
340 bool ApplyCP(
int controlQubit,
int targetQubit,
double theta) {
341 if (obj)
return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
346 bool ApplyCRx(
int controlQubit,
int targetQubit,
double theta) {
347 if (obj)
return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
352 bool ApplyCRy(
int controlQubit,
int targetQubit,
double theta) {
353 if (obj)
return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
358 bool ApplyCRz(
int controlQubit,
int targetQubit,
double theta) {
359 if (obj)
return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
364 bool ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit) {
366 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
372 if (obj)
return lib->ApplySwap(obj, qubit1, qubit2);
377 bool ApplyCSwap(
int controlQubit,
int qubit1,
int qubit2) {
378 if (obj)
return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
383 bool ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
384 double lambda,
double gamma) {
386 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
393 GpuDeviceContext 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)