15#ifndef _GPU_LIB_TN_SIM_H_
16#define _GPU_LIB_TN_SIM_H_
28 explicit GpuLibTNSim(
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->CreateTensorNet();
37 int GetGpuDevice()
const {
return lib ? lib->TNGetGpuId(obj) : -1; }
39 GpuLibTNSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj)
40 : lib(lib), obj(obj) {}
42 GpuLibTNSim() =
delete;
43 GpuLibTNSim(
const GpuLibTNSim &) =
delete;
44 GpuLibTNSim &operator=(
const GpuLibTNSim &) =
delete;
45 GpuLibTNSim(GpuLibTNSim &&) =
default;
46 GpuLibTNSim &operator=(GpuLibTNSim &&) =
default;
49 if (lib && obj) lib->DestroyTensorNet(obj);
52 bool Create(
unsigned int nrQubits) {
53 if (obj)
return lib->TNCreate(obj, nrQubits);
59 if (obj)
return lib->TNReset(obj);
64 bool SetSeed(uint64_t seed) {
return obj && lib->TNSetSeed(obj, seed); }
66 bool IsValid()
const {
67 if (obj)
return lib->TNIsValid(obj);
72 bool IsCreated()
const {
73 if (obj)
return lib->TNIsCreated(obj);
78 bool SetDataType(
int useDoublePrecision) {
79 if (obj)
return lib->TNSetDataType(obj, useDoublePrecision);
84 bool IsDoublePrecision()
const {
85 if (obj)
return lib->TNIsDoublePrecision(obj);
90 bool SetCutoff(
double val) {
91 if (obj)
return lib->TNSetCutoff(obj, val);
96 double GetCutoff()
const {
97 if (obj)
return lib->TNGetCutoff(obj);
104 bool SetTruncationMode(
int mode) {
105 if (obj)
return lib->TNSetTruncationMode(obj, mode);
110 int GetTruncationMode()
const {
111 if (obj)
return lib->TNGetTruncationMode(obj);
116 bool SetGesvdJ(
int val) {
117 if (obj)
return lib->TNSetGesvdJ(obj, val);
122 bool GetGesvdJ()
const {
123 if (obj)
return lib->TNGetGesvdJ(obj);
129 bool SetGesvdP(
bool enable) {
130 return obj && lib->TNSetGesvdP(obj, enable);
132 bool GetGesvdP()
const {
return lib->TNGetGesvdP(obj); }
133 bool SetGesvdR(
bool enable) {
134 return obj && lib->TNSetGesvdR(obj, enable);
136 bool GetGesvdR()
const {
return lib->TNGetGesvdR(obj); }
138 bool SetMaxExtent(
long int val) {
139 if (obj)
return lib->TNSetMaxExtent(obj, val);
144 long int GetMaxExtent()
const {
145 if (obj)
return lib->TNGetMaxExtent(obj);
150 int GetNrQubits()
const {
151 if (obj)
return lib->TNGetNrQubits(obj);
156 bool Amplitude(
long int numFixedValues,
long int *fixedValues,
double *real,
157 double *imaginary)
const {
159 return lib->TNAmplitude(obj, numFixedValues, fixedValues, real,
165 double Probability0(
unsigned int qubit)
const {
166 if (obj)
return lib->TNProbability0(obj, qubit);
171 bool Measure(
unsigned int qubit) {
172 if (obj)
return lib->TNMeasure(obj, qubit);
177 bool MeasureQubits(
long int numQubits,
unsigned int *qubits,
int *result) {
178 if (obj)
return lib->TNMeasureQubits(obj, numQubits, qubits, result);
183 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample()
const {
184 if (lib)
return lib->TNGetMapForSample();
189 bool FreeMapForSample(
190 std::unordered_map<std::vector<bool>, int64_t> *map)
const {
191 if (lib)
return lib->TNFreeMapForSample(map);
196 bool Sample(
long int numShots,
long int numQubits,
unsigned int *qubits,
198 if (obj)
return lib->TNSample(obj, numShots, numQubits, qubits, resultMap);
204 if (obj)
return lib->TNSaveState(obj);
210 if (obj)
return lib->TNRestoreState(obj);
215 bool CleanSavedState() {
216 if (obj)
return lib->TNCleanSavedState(obj);
221 std::unique_ptr<GpuLibTNSim> Clone()
const {
227 double ExpectationValue(
const std::string &pauliString)
const {
229 return lib->TNExpectationValue(obj, pauliString.c_str(),
230 pauliString.length());
235 bool ApplyX(
unsigned int siteA) {
236 if (obj)
return lib->TNApplyX(obj, siteA);
241 bool ApplyY(
unsigned int siteA) {
242 if (obj)
return lib->TNApplyY(obj, siteA);
247 bool ApplyZ(
unsigned int siteA) {
248 if (obj)
return lib->TNApplyZ(obj, siteA);
253 bool ApplyH(
unsigned int siteA) {
254 if (obj)
return lib->TNApplyH(obj, siteA);
259 bool ApplyS(
unsigned int siteA) {
260 if (obj)
return lib->TNApplyS(obj, siteA);
266 if (obj)
return lib->TNApplySDG(obj, siteA);
271 bool ApplyT(
unsigned int siteA) {
272 if (obj)
return lib->TNApplyT(obj, siteA);
278 if (obj)
return lib->TNApplyTDG(obj, siteA);
283 bool ApplySX(
unsigned int siteA) {
284 if (obj)
return lib->TNApplySX(obj, siteA);
290 if (obj)
return lib->TNApplySXDG(obj, siteA);
295 bool ApplyK(
unsigned int siteA) {
296 if (obj)
return lib->TNApplyK(obj, siteA);
301 bool ApplyP(
unsigned int siteA,
double theta) {
302 if (obj)
return lib->TNApplyP(obj, siteA, theta);
307 bool ApplyRx(
unsigned int siteA,
double theta) {
308 if (obj)
return lib->TNApplyRx(obj, siteA, theta);
313 bool ApplyRy(
unsigned int siteA,
double theta) {
314 if (obj)
return lib->TNApplyRy(obj, siteA, theta);
319 bool ApplyRz(
unsigned int siteA,
double theta) {
320 if (obj)
return lib->TNApplyRz(obj, siteA, theta);
325 bool ApplyU(
unsigned int siteA,
double theta,
double phi,
double lambda,
327 if (obj)
return lib->TNApplyU(obj, siteA, theta, phi, lambda, gamma);
332 bool ApplySwap(
unsigned int controlQubit,
unsigned int targetQubit) {
333 if (obj)
return lib->TNApplySwap(obj, controlQubit, targetQubit);
338 bool ApplyCX(
unsigned int controlQubit,
unsigned int targetQubit) {
339 if (obj)
return lib->TNApplyCX(obj, controlQubit, targetQubit);
344 bool ApplyCY(
unsigned int controlQubit,
unsigned int targetQubit) {
345 if (obj)
return lib->TNApplyCY(obj, controlQubit, targetQubit);
350 bool ApplyCZ(
unsigned int controlQubit,
unsigned int targetQubit) {
351 if (obj)
return lib->TNApplyCZ(obj, controlQubit, targetQubit);
356 bool ApplyCH(
unsigned int controlQubit,
unsigned int targetQubit) {
357 if (obj)
return lib->TNApplyCH(obj, controlQubit, targetQubit);
362 bool ApplyCSX(
unsigned int controlQubit,
unsigned int targetQubit) {
363 if (obj)
return lib->TNApplyCSX(obj, controlQubit, targetQubit);
368 bool ApplyCSXDG(
unsigned int controlQubit,
unsigned int targetQubit) {
369 if (obj)
return lib->TNApplyCSXDG(obj, controlQubit, targetQubit);
374 bool ApplyCP(
unsigned int controlQubit,
unsigned int targetQubit,
376 if (obj)
return lib->TNApplyCP(obj, controlQubit, targetQubit, theta);
381 bool ApplyCRx(
unsigned int controlQubit,
unsigned int targetQubit,
383 if (obj)
return lib->TNApplyCRx(obj, controlQubit, targetQubit, theta);
388 bool ApplyCRy(
unsigned int controlQubit,
unsigned int targetQubit,
390 if (obj)
return lib->TNApplyCRy(obj, controlQubit, targetQubit, theta);
395 bool ApplyCRz(
unsigned int controlQubit,
unsigned int targetQubit,
397 if (obj)
return lib->TNApplyCRz(obj, controlQubit, targetQubit, theta);
402 bool ApplyCU(
unsigned int controlQubit,
unsigned int targetQubit,
403 double theta,
double phi,
double lambda,
double gamma) {
405 return lib->TNApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
411 bool ApplyCCX(
unsigned int controlQubit1,
unsigned int controlQubit2,
412 unsigned int targetQubit) {
414 return lib->TNApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
418 bool ApplyCSwap(
unsigned int controlQubit,
unsigned int qubit1,
419 unsigned int qubit2) {
420 if (obj)
return lib->TNApplyCSwap(obj, controlQubit, qubit1, qubit2);
425 GpuDeviceContext lib;
int ApplyK(void *sim, int qubit)
int RestoreState(void *sim)
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)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySXDG(void *sim, int qubit)
int ApplySDG(void *sim, int qubit)
unsigned long long int Measure(void *sim, const unsigned long int *qubits, unsigned long int nrQubits)
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)