Maestro 0.3.1
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Simulators/Factory.h
Go to the documentation of this file.
1
15
16#pragma once
17
18#ifndef _SIMULATORS_FACTORY_H_
19#define _SIMULATORS_FACTORY_H_
20
24#include "GpuDensityMatrix.h"
25#include "GpuMPO.h"
26#include "GpuLibMPSSim.h"
27#include "GpuLibTNSim.h"
28#include "GpuStabilizer.h"
29#include "GpuPauliPropagator.h"
30#include "QuestLibSim.h"
32
33#include "Simulator.h"
34
35namespace Simulators {
36
44 public:
51 static std::shared_ptr<ISimulator> CreateSimulator(
54
61 static std::unique_ptr<ISimulator> CreateSimulatorUnique(
64
65#ifdef __linux__
66 // Defined in the core library so Python's hidden-visibility extension
67 // shares the same plugin instances and native-state lifetime counters.
68 static std::shared_ptr<DistributedGpuLibrary> GetDistributedGpuLibrary();
69 static std::shared_ptr<DistributedMpiGpuLibrary> GetDistributedMpiGpuLibrary();
70 static bool IsDistributedGpuAvailable() noexcept;
71 static void FinalizeDistributedMpiGpuBackend();
72 static bool InitGpuLibrary();
73 static bool InitGpuLibraryWithMute();
74
75 // Default for subsequently created simulators; explicit gpu_device wins.
76 static void SelectGpuDevice(int deviceId);
77 static int ResolveGpuDevice(int deviceId = -1);
78 static int GetGpuDeviceCount();
79 static bool IsGpuLibraryAvailable(int deviceId = -1);
80 static std::shared_ptr<GpuLibrary> GetGpuLibrary(int deviceId = -1);
81
82 // Legacy estimators construct simulators synchronously without accepting a
83 // configuration map. Scope their default to the requesting network without
84 // changing the process-wide default or another network's worker thread.
85 class ScopedGpuDevice {
86 public:
87 explicit ScopedGpuDevice(int deviceId);
88 ~ScopedGpuDevice();
89 ScopedGpuDevice(const ScopedGpuDevice&) = delete;
90 ScopedGpuDevice& operator=(const ScopedGpuDevice&) = delete;
91 private:
92 int previous;
93 };
94
95 static std::unique_ptr<GpuLibStateVectorSim> CreateGpuLibStateVectorSim(int deviceId = -1) {
96 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
97 auto gpuLibrary = GetGpuLibrary(deviceId);
98 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
99
100 return std::make_unique<GpuLibStateVectorSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
101 }
102
103 static std::unique_ptr<GpuDensityMatrix> CreateGpuDensityMatrix(int deviceId = -1) {
104 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
105 auto gpuLibrary = GetGpuLibrary(deviceId);
106 if (!gpuLibrary || !gpuLibrary->HasDensityMatrixAPI()) return nullptr;
107 return std::make_unique<GpuDensityMatrix>(gpuLibrary, gpuLibrary->GetCreationDevice());
108 }
109
110 static std::unique_ptr<GpuMPO> CreateGpuMPO(int deviceId = -1) {
111 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
112 auto gpuLibrary = GetGpuLibrary(deviceId);
113 if (!gpuLibrary || !gpuLibrary->HasMPOAPI()) return nullptr;
114 return std::make_unique<GpuMPO>(gpuLibrary, gpuLibrary->GetCreationDevice());
115 }
116
117 static std::unique_ptr<GpuLibMPSSim> CreateGpuLibMPSSim(int deviceId = -1) {
118 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
119 auto gpuLibrary = GetGpuLibrary(deviceId);
120 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
121
122 return std::make_unique<GpuLibMPSSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
123 }
124
125 static std::unique_ptr<GpuLibTNSim> CreateGpuLibTensorNetSim(int deviceId = -1) {
126 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
127 auto gpuLibrary = GetGpuLibrary(deviceId);
128 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
129
130 return std::make_unique<GpuLibTNSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
131 }
132
133 static std::shared_ptr<GpuStabilizer> CreateGpuStabilizerSimulator(int deviceId = -1) {
134 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
135 auto gpuLibrary = GetGpuLibrary(deviceId);
136 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
137 return std::make_shared<GpuStabilizer>(gpuLibrary, gpuLibrary->GetCreationDevice());
138 }
139
140 static std::shared_ptr<GpuPauliPropagator>
141 CreateGpuPauliPropagatorSimulator(int deviceId = -1) {
142 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
143 auto gpuLibrary = GetGpuLibrary(deviceId);
144 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
145 return std::make_shared<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
146 }
147
148 static std::unique_ptr<GpuPauliPropagator>
149 CreateGpuPauliPropagatorSimulatorUnique(int deviceId = -1) {
150 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
151 auto gpuLibrary = GetGpuLibrary(deviceId);
152 if (!gpuLibrary || !gpuLibrary->IsValid()) return nullptr;
153 return std::make_unique<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
154 }
155
156 private:
157 static std::atomic_int requestedGpuDeviceId;
158 static thread_local int scopedGpuDeviceId;
159
160 public:
161#else
162 static bool IsGpuLibraryAvailable(int = -1) { return false; }
163
164 static bool InitGpuLibrary() { return false; }
165
166 static void SelectGpuDevice(int) {}
167
168 static int GetGpuDeviceCount() { return 0; }
169#endif
170 static bool InitQuestLibrary();
171 static bool InitQuestLibraryWithMute();
173 return questLibrary && questLibrary->IsValid();
174 }
175
176 static std::shared_ptr<QuestLibSim> GetQuestLibrary() {
177 if (!questLibrary || !questLibrary->IsValid()) return nullptr;
178 return questLibrary;
179 }
180
181 static std::shared_ptr<PathIntegralSimulator> CreatePathIntegralSimulator() {
182 return std::make_shared<PathIntegralSimulator>();
183 }
184
185 private:
186 static std::shared_ptr<QuestLibSim> questLibrary;
187 static std::atomic_bool firstTimeQuest;
188};
189
190} // namespace Simulators
191
192#endif // !_SIMULATORS_FACTORY_H_
Thin C++ wrapper around the optional GPU density-matrix C API.
Thin C++ wrapper around the optional GPU matrix-product-operator C API.
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:173
static bool IsGpuLibraryAvailable(int=-1)
static std::unique_ptr< ISimulator > CreateSimulatorUnique(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:283
static bool InitQuestLibraryWithMute()
Definition Factory.cpp:152
static std::shared_ptr< PathIntegralSimulator > CreatePathIntegralSimulator()
static std::shared_ptr< QuestLibSim > GetQuestLibrary()
SimulationType
The type of simulation.
Definition State.h:98
@ kMatrixProductState
matrix product state simulation type
Definition State.h:100
SimulatorType
The type of simulator.
Definition State.h:72
@ kQCSim
qcsim simulator type
Definition State.h:76