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() {
47 lib->DestroyStateVector(obj);
50 bool Create(
unsigned int nrQubits) {
52 return lib->Create(obj, nrQubits);
57 bool CreateWithState(
unsigned int nrQubits,
const double *state) {
59 return lib->CreateWithState(obj, nrQubits, state);
66 return lib->Reset(obj);
71 bool SetDataType(
bool useDoublePrecision) {
73 return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
77 bool IsDoublePrecision()
const {
79 return lib->IsDoublePrecision(obj);
83 bool MeasureQubitCollapse(
int qubitIndex) {
85 return lib->MeasureQubitCollapse(obj, qubitIndex);
90 bool MeasureQubitNoCollapse(
int qubitIndex) {
92 return lib->MeasureQubitNoCollapse(obj, qubitIndex);
97 bool MeasureQubitsCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
99 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
104 bool MeasureQubitsNoCollapse(
int *qubits,
int *bitstring,
int bitstringLen) {
106 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
111 unsigned long long MeasureAllQubitsCollapse() {
113 return lib->MeasureAllQubitsCollapse(obj);
115 return static_cast<unsigned long long>(-1);
118 unsigned long long MeasureAllQubitsNoCollapse() {
120 return lib->MeasureAllQubitsNoCollapse(obj);
122 return static_cast<unsigned long long>(-1);
127 return lib->SaveState(obj);
132 bool SaveStateToHost() {
134 return lib->SaveStateToHost(obj);
139 bool SaveStateDestructive() {
141 return lib->SaveStateDestructive(obj);
146 bool RestoreStateFreeSaved() {
148 return lib->RestoreStateFreeSaved(obj);
153 bool RestoreStateNoFreeSaved() {
155 return lib->RestoreStateNoFreeSaved(obj);
160 void FreeSavedState() {
162 lib->FreeSavedState(obj);
165 std::unique_ptr<GpuLibStateVectorSim> Clone() {
167 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
172 bool Sample(
unsigned int nSamples,
long int *samples,
unsigned int nBits,
175 return lib->Sample(obj, nSamples, samples, nBits, bits);
179 bool SampleAll(
unsigned int nSamples,
long int *samples) {
181 return lib->SampleAll(obj, nSamples, samples);
186 bool Amplitude(
long long int state,
double *real,
double *imaginary)
const {
188 return lib->Amplitude(obj, state, real, imaginary);
193 double Probability(
int *qubits,
int *mask,
int len)
const {
195 return lib->Probability(obj, qubits, mask, len);
199 double BasisStateProbability(
long long int state)
const {
201 return lib->BasisStateProbability(obj, state);
207 return lib->AllProbabilities(obj, probabilities);
211 double ExpectationValue(
const std::string &pauliString)
const {
213 return lib->ExpectationValue(obj, pauliString.c_str(),
214 pauliString.length());
221 return lib->ApplyX(obj, qubit);
228 return lib->ApplyY(obj, qubit);
235 return lib->ApplyZ(obj, qubit);
242 return lib->ApplyH(obj, qubit);
249 return lib->ApplyS(obj, qubit);
256 return lib->ApplySDG(obj, qubit);
263 return lib->ApplyT(obj, qubit);
270 return lib->ApplyTDG(obj, qubit);
277 return lib->ApplySX(obj, qubit);
284 return lib->ApplySXDG(obj, qubit);
291 return lib->ApplyK(obj, qubit);
296 bool ApplyP(
int qubit,
double theta) {
298 return lib->ApplyP(obj, qubit, theta);
303 bool ApplyRx(
int qubit,
double theta) {
305 return lib->ApplyRx(obj, qubit, theta) == 1;
310 bool ApplyRy(
int qubit,
double theta) {
312 return lib->ApplyRy(obj, qubit, theta);
317 bool ApplyRz(
int qubit,
double theta) {
319 return lib->ApplyRz(obj, qubit, theta);
324 bool ApplyU(
int qubit,
double theta,
double phi,
double lambda,
327 return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
332 bool ApplyCX(
int controlQubit,
int targetQubit) {
334 return lib->ApplyCX(obj, controlQubit, targetQubit);
339 bool ApplyCY(
int controlQubit,
int targetQubit) {
341 return lib->ApplyCY(obj, controlQubit, targetQubit);
346 bool ApplyCZ(
int controlQubit,
int targetQubit) {
348 return lib->ApplyCZ(obj, controlQubit, targetQubit);
353 bool ApplyCH(
int controlQubit,
int targetQubit) {
355 return lib->ApplyCH(obj, controlQubit, targetQubit);
360 bool ApplyCSX(
int controlQubit,
int targetQubit) {
362 return lib->ApplyCSX(obj, controlQubit, targetQubit);
367 bool ApplyCSXDG(
int controlQubit,
int targetQubit) {
369 return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
374 bool ApplyCP(
int controlQubit,
int targetQubit,
double theta) {
376 return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
381 bool ApplyCRx(
int controlQubit,
int targetQubit,
double theta) {
383 return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
388 bool ApplyCRy(
int controlQubit,
int targetQubit,
double theta) {
390 return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
395 bool ApplyCRz(
int controlQubit,
int targetQubit,
double theta) {
397 return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
402 bool ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit) {
404 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
411 return lib->ApplySwap(obj, qubit1, qubit2);
416 bool ApplyCSwap(
int controlQubit,
int qubit1,
int qubit2) {
418 return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
423 bool ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
424 double lambda,
double gamma) {
426 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
433 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)