15#ifndef _GPU_LIB_STATEVECTOR_SIM
16#define _GPU_LIB_STATEVECTOR_SIM 1
27class GpuLibStateVectorSim
30 explicit GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary> &lib,
int device = -1) : lib(lib), obj(
nullptr)
34 auto lock = lib->LockInitialization();
35 if (lib->SetGpuDevice(device == -1 ? lib->GetCreationDevice() : device))
36 obj = lib->CreateStateVector();
40 int GetGpuDevice()
const
42 return lib ? lib->GetStateVectorGpuId(obj) : -1;
45 GpuLibStateVectorSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj) : lib(lib), obj(obj)
49 GpuLibStateVectorSim() =
delete;
50 GpuLibStateVectorSim(
const GpuLibStateVectorSim &) =
delete;
51 GpuLibStateVectorSim &operator=(
const GpuLibStateVectorSim &) =
delete;
52 GpuLibStateVectorSim(GpuLibStateVectorSim &&) =
default;
53 GpuLibStateVectorSim &operator=(GpuLibStateVectorSim &&) =
default;
55 ~GpuLibStateVectorSim()
58 lib->DestroyStateVector(obj);
61 bool Create(
unsigned int nrQubits)
64 return lib->Create(obj, nrQubits);
69 bool CreateWithState(
unsigned int nrQubits,
const double *state)
72 return lib->CreateWithState(obj, nrQubits, state);
79 return lib->StateVectorSynchronize(obj);
85 return lib->Reset(obj);
90 bool SetSeed(uint64_t seed)
92 return obj && lib->SetSeed(obj, seed);
95 bool SetDataType(
bool useDoublePrecision)
98 return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
102 bool IsDoublePrecision()
const
105 return lib->IsDoublePrecision(obj);
109 int GetNrQubits()
const
112 return lib->GetNrQubits(obj);
116 bool MeasureQubitCollapse(
int qubitIndex)
119 return lib->MeasureQubitCollapse(obj, qubitIndex);
124 bool MeasureQubitNoCollapse(
int qubitIndex)
127 return lib->MeasureQubitNoCollapse(obj, qubitIndex);
132 bool MeasureQubitsCollapse(
int *qubits,
int *bitstring,
int bitstringLen)
135 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
140 bool MeasureQubitsNoCollapse(
int *qubits,
int *bitstring,
int bitstringLen)
143 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
148 unsigned long long MeasureAllQubitsCollapse()
151 return lib->MeasureAllQubitsCollapse(obj);
153 return static_cast<unsigned long long>(-1);
156 unsigned long long MeasureAllQubitsNoCollapse()
159 return lib->MeasureAllQubitsNoCollapse(obj);
161 return static_cast<unsigned long long>(-1);
167 return lib->SaveState(obj);
172 bool SaveStateToHost()
175 return lib->SaveStateToHost(obj);
180 bool SaveStateDestructive()
183 return lib->SaveStateDestructive(obj);
188 bool RestoreStateFreeSaved()
191 return lib->RestoreStateFreeSaved(obj);
196 bool RestoreStateNoFreeSaved()
199 return lib->RestoreStateNoFreeSaved(obj);
204 void FreeSavedState()
207 lib->FreeSavedState(obj);
210 std::unique_ptr<GpuLibStateVectorSim> Clone()
213 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
218 bool Sample(
unsigned int nSamples,
long int *samples,
unsigned int nBits,
int *bits)
221 return lib->Sample(obj, nSamples, samples, nBits, bits);
225 bool SampleAll(
unsigned int nSamples,
long int *samples)
228 return lib->SampleAll(obj, nSamples, samples);
233 bool Amplitude(
long long int state,
double *real,
double *imaginary)
const
236 return lib->Amplitude(obj, state, real, imaginary);
241 double Probability(
int *qubits,
int *mask,
int len)
const
244 return lib->Probability(obj, qubits, mask, len);
248 double BasisStateProbability(
long long int state)
const
251 return lib->BasisStateProbability(obj, state);
258 return lib->AllProbabilities(obj, probabilities);
262 double ExpectationValue(
const std::string &pauliString)
const
265 return lib->ExpectationValue(obj, pauliString.c_str(), pauliString.length());
273 return lib->ApplyX(obj, qubit);
281 return lib->ApplyY(obj, qubit);
289 return lib->ApplyZ(obj, qubit);
297 return lib->ApplyH(obj, qubit);
305 return lib->ApplyS(obj, qubit);
313 return lib->ApplySDG(obj, qubit);
321 return lib->ApplyT(obj, qubit);
329 return lib->ApplyTDG(obj, qubit);
337 return lib->ApplySX(obj, qubit);
345 return lib->ApplySXDG(obj, qubit);
353 return lib->ApplyK(obj, qubit);
358 bool ApplyP(
int qubit,
double theta)
361 return lib->ApplyP(obj, qubit, theta);
366 bool ApplyRx(
int qubit,
double theta)
369 return lib->ApplyRx(obj, qubit, theta) == 1;
374 bool ApplyRy(
int qubit,
double theta)
377 return lib->ApplyRy(obj, qubit, theta);
382 bool ApplyRz(
int qubit,
double theta)
385 return lib->ApplyRz(obj, qubit, theta);
390 bool ApplyU(
int qubit,
double theta,
double phi,
double lambda,
double gamma)
393 return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
398 bool ApplyCX(
int controlQubit,
int targetQubit)
401 return lib->ApplyCX(obj, controlQubit, targetQubit);
406 bool ApplyCY(
int controlQubit,
int targetQubit)
409 return lib->ApplyCY(obj, controlQubit, targetQubit);
414 bool ApplyCZ(
int controlQubit,
int targetQubit)
417 return lib->ApplyCZ(obj, controlQubit, targetQubit);
422 bool ApplyCH(
int controlQubit,
int targetQubit)
425 return lib->ApplyCH(obj, controlQubit, targetQubit);
430 bool ApplyCSX(
int controlQubit,
int targetQubit)
433 return lib->ApplyCSX(obj, controlQubit, targetQubit);
438 bool ApplyCSXDG(
int controlQubit,
int targetQubit)
441 return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
446 bool ApplyCP(
int controlQubit,
int targetQubit,
double theta)
449 return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
454 bool ApplyCRx(
int controlQubit,
int targetQubit,
double theta)
457 return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
462 bool ApplyCRy(
int controlQubit,
int targetQubit,
double theta)
465 return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
470 bool ApplyCRz(
int controlQubit,
int targetQubit,
double theta)
473 return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
478 bool ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit)
481 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
489 return lib->ApplySwap(obj, qubit1, qubit2);
494 bool ApplyCSwap(
int controlQubit,
int qubit1,
int qubit2)
497 return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
502 bool ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
double lambda,
double gamma)
505 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda, gamma);
511 bool ApplyOneQubitMatrix(
int q0,
const double *matrix)
513 return obj && lib->ApplyOneQubitMatrix(obj, q0, matrix);
516 bool ApplyOneQubitMatrixWithLayout(
int q0,
const double *matrix,
int layout)
518 return obj && lib->ApplyOneQubitMatrixWithLayout(obj, q0, matrix, layout);
521 bool ApplyTwoQubitMatrix(
int q0,
int q1,
const double *matrix)
523 return obj && lib->ApplyTwoQubitMatrix(obj, q0, q1, matrix);
526 bool ApplyTwoQubitMatrixWithLayout(
int q0,
int q1,
const double *matrix,
int layout)
528 return obj && lib->ApplyTwoQubitMatrixWithLayout(obj, q0, q1, matrix, layout);
531 bool ApplyThreeQubitMatrix(
int q0,
int q1,
int q2,
const double *matrix)
533 return obj && lib->ApplyThreeQubitMatrix(obj, q0, q1, q2, matrix);
536 bool ApplyThreeQubitMatrixWithLayout(
int q0,
int q1,
int q2,
const double *matrix,
int layout)
538 return obj && lib->ApplyThreeQubitMatrixWithLayout(obj, q0, q1, q2, matrix, layout);
542 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)
Bounded online routing based on current physical bond dimensions.