Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Simulators/Core/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 "../Gpu/GpuLibMPSSim.h"
26#include "../Gpu/GpuLibTNSim.h"
27#include "../Gpu/GpuMPO.h"
32
34
35#ifdef _WIN32
36#define MAESTRO_FACTORY_EXPORT __declspec(dllexport)
37#else
38#define MAESTRO_FACTORY_EXPORT
39#endif
40
41namespace Simulators
42{
43
51{
52 public:
61
70
71 // Concrete backends without a fusion adapter. Composite children use statevector.
72 // The method is fixed for the lifetime of the returned object.
73 MAESTRO_FACTORY_EXPORT static std::unique_ptr<ISimulator> CreateImmediateSimulatorUnique(SimulatorType type,
75
76#ifdef __linux__
77 // Defined in the core library so Python's hidden-visibility extension
78 // shares the same plugin instances and native-state lifetime counters.
79 static std::shared_ptr<DistributedGpuLibrary> GetDistributedGpuLibrary();
80 static std::shared_ptr<DistributedMpiGpuLibrary> GetDistributedMpiGpuLibrary();
81 static bool IsDistributedGpuAvailable() noexcept;
82 static void FinalizeDistributedMpiGpuBackend();
83 static bool InitGpuLibrary();
84 static bool InitGpuLibraryWithMute();
85
86 // Default for subsequently created simulators; explicit gpu_device wins.
87 static void SelectGpuDevice(int deviceId);
88 static int ResolveGpuDevice(int deviceId = -1);
89 static int GetGpuDeviceCount();
90 static bool IsGpuLibraryAvailable(int deviceId = -1);
91 static std::shared_ptr<GpuLibrary> GetGpuLibrary(int deviceId = -1);
92
93 // Legacy estimators construct simulators synchronously without accepting a
94 // configuration map. Scope their default to the requesting network without
95 // changing the process-wide default or another network's worker thread.
96 class ScopedGpuDevice
97 {
98 public:
99 explicit ScopedGpuDevice(int deviceId);
100 ~ScopedGpuDevice();
101 ScopedGpuDevice(const ScopedGpuDevice &) = delete;
102 ScopedGpuDevice &operator=(const ScopedGpuDevice &) = delete;
103
104 private:
105 int previous;
106 };
107
108 static std::unique_ptr<GpuLibStateVectorSim> CreateGpuLibStateVectorSim(int deviceId = -1)
109 {
110 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
111 auto gpuLibrary = GetGpuLibrary(deviceId);
112 if (!gpuLibrary || !gpuLibrary->IsValid())
113 return nullptr;
114
115 return std::make_unique<GpuLibStateVectorSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
116 }
117
118 static std::unique_ptr<GpuDensityMatrix> CreateGpuDensityMatrix(int deviceId = -1)
119 {
120 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
121 auto gpuLibrary = GetGpuLibrary(deviceId);
122 if (!gpuLibrary || !gpuLibrary->HasDensityMatrixAPI())
123 return nullptr;
124 return std::make_unique<GpuDensityMatrix>(gpuLibrary, gpuLibrary->GetCreationDevice());
125 }
126
127 static std::unique_ptr<GpuMPO> CreateGpuMPO(int deviceId = -1)
128 {
129 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
130 auto gpuLibrary = GetGpuLibrary(deviceId);
131 if (!gpuLibrary || !gpuLibrary->HasMPOAPI())
132 return nullptr;
133 return std::make_unique<GpuMPO>(gpuLibrary, gpuLibrary->GetCreationDevice());
134 }
135
136 static std::unique_ptr<GpuLibMPSSim> CreateGpuLibMPSSim(int deviceId = -1)
137 {
138 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
139 auto gpuLibrary = GetGpuLibrary(deviceId);
140 if (!gpuLibrary || !gpuLibrary->IsValid())
141 return nullptr;
142
143 return std::make_unique<GpuLibMPSSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
144 }
145
146 static std::unique_ptr<GpuLibTNSim> CreateGpuLibTensorNetSim(int deviceId = -1)
147 {
148 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
149 auto gpuLibrary = GetGpuLibrary(deviceId);
150 if (!gpuLibrary || !gpuLibrary->IsValid())
151 return nullptr;
152
153 return std::make_unique<GpuLibTNSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
154 }
155
156 static std::shared_ptr<GpuStabilizer> CreateGpuStabilizerSimulator(int deviceId = -1)
157 {
158 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
159 auto gpuLibrary = GetGpuLibrary(deviceId);
160 if (!gpuLibrary || !gpuLibrary->IsValid())
161 return nullptr;
162 return std::make_shared<GpuStabilizer>(gpuLibrary, gpuLibrary->GetCreationDevice());
163 }
164
165 static std::shared_ptr<GpuPauliPropagator> CreateGpuPauliPropagatorSimulator(int deviceId = -1)
166 {
167 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
168 auto gpuLibrary = GetGpuLibrary(deviceId);
169 if (!gpuLibrary || !gpuLibrary->IsValid())
170 return nullptr;
171 return std::make_shared<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
172 }
173
174 static std::unique_ptr<GpuPauliPropagator> CreateGpuPauliPropagatorSimulatorUnique(int deviceId = -1)
175 {
176 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
177 auto gpuLibrary = GetGpuLibrary(deviceId);
178 if (!gpuLibrary || !gpuLibrary->IsValid())
179 return nullptr;
180 return std::make_unique<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
181 }
182
183 private:
184 static std::atomic_int requestedGpuDeviceId;
185 static thread_local int scopedGpuDeviceId;
186
187 public:
188#else
189 static bool IsGpuLibraryAvailable(int = -1)
190 {
191 return false;
192 }
193
194 static bool InitGpuLibrary()
195 {
196 return false;
197 }
198
199 static void SelectGpuDevice(int)
200 {
201 }
202
203 static int GetGpuDeviceCount()
204 {
205 return 0;
206 }
207#endif
211 MAESTRO_FACTORY_EXPORT static std::shared_ptr<QuestLibSim> GetQuestLibrary();
212
213 static std::shared_ptr<PathIntegralSimulator> CreatePathIntegralSimulator()
214 {
215 return std::make_shared<PathIntegralSimulator>();
216 }
217
218 private:
219 static std::shared_ptr<QuestLibSim> questLibrary;
220 static std::atomic_bool firstTimeQuest;
221};
222
223} // namespace Simulators
224
225#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.
#define MAESTRO_FACTORY_EXPORT
static MAESTRO_FACTORY_EXPORT std::unique_ptr< ISimulator > CreateImmediateSimulatorUnique(SimulatorType type, SimulationType method=SimulationType::kStatevector)
Definition Factory.cpp:25
static MAESTRO_FACTORY_EXPORT std::shared_ptr< QuestLibSim > GetQuestLibrary()
static MAESTRO_FACTORY_EXPORT std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:45
static MAESTRO_FACTORY_EXPORT bool InitQuestLibrary()
static MAESTRO_FACTORY_EXPORT std::unique_ptr< ISimulator > CreateSimulatorUnique(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:50
static MAESTRO_FACTORY_EXPORT bool InitQuestLibraryWithMute()
static std::shared_ptr< PathIntegralSimulator > CreatePathIntegralSimulator()
static MAESTRO_FACTORY_EXPORT bool IsQuestLibraryAvailable()
Bounded online routing based on current physical bond dimensions.
SimulationType
The type of simulation.
Definition State.h:109
@ kStatevector
statevector simulation type
Definition State.h:110
@ kMatrixProductState
matrix product state simulation type
Definition State.h:111
SimulatorType
The type of simulator.
Definition State.h:79
@ kQCSim
qcsim simulator type
Definition State.h:83