Maestro 0.2.5
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Factory.cpp
Go to the documentation of this file.
1
16#define _CRT_SECURE_NO_WARNINGS 1
17
18#ifndef NO_QISKIT_AER
19#ifndef __APPLE__
20#ifndef _QV_AVX2_IMPL
21#define _QV_AVX2_IMPL
22#pragma warning(push)
23#pragma warning(disable : 4789)
24#include "simulators/statevector/qv_avx2.cpp"
25#pragma warning(pop)
26#endif
27#endif
28#endif
29
30#include "Factory.h"
31
32#define INCLUDED_BY_FACTORY
33#ifndef NO_QISKIT_AER
34#include "AerSimulator.h"
35#endif
36#include "QCSimSimulator.h"
37#include "Composite.h"
38#include "GpuSimulator.h"
39#include "QuestSimulator.h"
40
41namespace Simulators {
42
43#ifdef __linux__
44std::shared_ptr<GpuLibrary> SimulatorsFactory::gpuLibrary = nullptr;
45std::atomic_bool SimulatorsFactory::firstTime = true;
46
48 if (!gpuLibrary) {
49 gpuLibrary = std::make_shared<GpuLibrary>();
50 if (!firstTime.exchange(false)) gpuLibrary->SetMute(true);
51
52 if (gpuLibrary->Init("libmaestro_gpu_simulators.so"))
53 return true;
54 else
55 gpuLibrary = nullptr;
56 }
57
58 return false;
59}
60
61bool SimulatorsFactory::InitGpuLibraryWithMute() {
62 if (!gpuLibrary) {
63 gpuLibrary = std::make_shared<GpuLibrary>();
64 firstTime = false;
65 gpuLibrary->SetMute(true);
66
67 if (gpuLibrary->Init("libmaestro_gpu_simulators.so"))
68 return true;
69 else
70 gpuLibrary = nullptr;
71 }
72
73 return false;
74}
75
76#endif
77
78std::shared_ptr<QuestLibSim> SimulatorsFactory::questLibrary = nullptr;
79std::atomic_bool SimulatorsFactory::firstTimeQuest = true;
80
82 if (!questLibrary) {
83 questLibrary = std::make_shared<QuestLibSim>();
84 if (!firstTimeQuest.exchange(false)) questLibrary->SetMute(true);
85 if (questLibrary->Init(
86#ifdef _WIN32
87 "maestroquest.dll"
88#elif defined(__APPLE__)
89 "libmaestroquest.dylib"
90#else
91 "libmaestroquest.so"
92#endif
93 ))
94 return true;
95 else
96 questLibrary = nullptr;
97 }
98 return false;
99}
100
101std::shared_ptr<ISimulator> SimulatorsFactory::CreateSimulator(
103 switch (t) {
105 auto sim = std::make_shared<Private::QCSimSimulator>();
107 sim->Configure("method", "matrix_product_state");
108 else if (m == SimulationType::kStabilizer)
109 sim->Configure("method", "stabilizer");
110 else if (m == SimulationType::kTensorNetwork)
111 sim->Configure("method", "tensor_network");
113 sim->Configure("method", "pauli_propagator");
114 else if (m != SimulationType::kStatevector)
115 throw std::invalid_argument("Simulation Type not supported for QCSim");
116
117 return sim;
118 }
119#ifndef NO_QISKIT_AER
121 auto sim = std::make_shared<Private::AerSimulator>();
123 sim->Configure("method", "matrix_product_state");
124 else if (m == SimulationType::kStabilizer)
125 sim->Configure("method", "stabilizer");
126 else if (m == SimulationType::kTensorNetwork)
127 sim->Configure("method", "tensor_network");
129 sim->Configure("method", "extended_stabilizer");
130 else if (m == SimulationType::kStatevector)
131 sim->Configure("method", "statevector");
132 else
133 throw std::invalid_argument(
134 "Simulation Type not supported for Qiskit Aer");
135
136 return sim;
137 }
139 return std::make_shared<Private::CompositeSimulator>(
141#endif
143 return std::make_shared<Private::CompositeSimulator>(
145#ifdef __linux__
147 if (gpuLibrary && gpuLibrary->IsValid() &&
152 auto sim = std::make_shared<Private::GpuSimulator>();
154 sim->Configure("method", "matrix_product_state");
155 else if (m == SimulationType::kTensorNetwork)
156 sim->Configure("method", "tensor_network");
158 sim->Configure("method", "pauli_propagator");
159 else if (m == SimulationType::kStatevector)
160 sim->Configure("method", "statevector");
161
162 return sim;
163 }
164
165 return nullptr;
166#endif
169 throw std::invalid_argument(
170 "Simulation Type not supported for Quest Simulator");
171 else if (questLibrary && questLibrary->IsValid()) {
172 return std::make_shared<Private::QuestSimulator>();
173 }
174 return nullptr;
175 default:
176 break;
177 }
178
179 throw std::invalid_argument("Simulator Type not supported");
180
181 return nullptr; // keep compillers happy
182}
183
186 switch (t) {
188 auto sim = std::make_unique<Private::QCSimSimulator>();
190 sim->Configure("method", "matrix_product_state");
191 else if (m == SimulationType::kStabilizer)
192 sim->Configure("method", "stabilizer");
193 else if (m == SimulationType::kTensorNetwork)
194 sim->Configure("method", "tensor_network");
196 sim->Configure("method", "pauli_propagator");
197 else if (m != SimulationType::kStatevector)
198 throw std::invalid_argument("Simulation Type not supported for QCSim");
199
200 return sim;
201 }
202#ifndef NO_QISKIT_AER
204 auto sim = std::make_unique<Private::AerSimulator>();
206 sim->Configure("method", "matrix_product_state");
207 else if (m == SimulationType::kStabilizer)
208 sim->Configure("method", "stabilizer");
209 else if (m == SimulationType::kTensorNetwork)
210 sim->Configure("method", "tensor_network");
212 sim->Configure("method", "extended_stabilizer");
213 else if (m == SimulationType::kStatevector)
214 sim->Configure("method", "statevector");
215 else
216 throw std::invalid_argument(
217 "Simulation Type not supported for Qiskit Aer");
218
219 return sim;
220 }
222 return std::make_unique<Private::CompositeSimulator>(
224#endif
226 return std::make_unique<Private::CompositeSimulator>(
228#ifdef __linux__
230 if (gpuLibrary && gpuLibrary->IsValid() &&
235 auto sim = std::make_unique<Private::GpuSimulator>();
237 sim->Configure("method", "matrix_product_state");
238 else if (m == SimulationType::kTensorNetwork)
239 sim->Configure("method", "tensor_network");
241 sim->Configure("method", "pauli_propagator");
242 else if (m == SimulationType::kStatevector)
243 sim->Configure("method", "statevector");
244
245 return sim;
246 }
247
248 return nullptr;
249#endif
252 throw std::invalid_argument(
253 "Simulation Type not supported for Quest Simulator");
254 else if (questLibrary && questLibrary->IsValid()) {
255 return std::make_unique<Private::QuestSimulator>();
256 }
257 return nullptr;
258 default:
259 break;
260 }
261
262 throw std::invalid_argument("Simulator Type not supported");
263
264 return nullptr; // keep compillers happy
265}
266} // namespace Simulators
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:101
static bool InitQuestLibrary()
Definition Factory.cpp:81
static std::unique_ptr< ISimulator > CreateSimulatorUnique(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:184
SimulationType
The type of simulation.
Definition State.h:85
@ kExtendedStabilizer
Extended stabilizer simulation type.
@ kStatevector
statevector simulation type
@ kMatrixProductState
matrix product state simulation type
@ kStabilizer
Clifford gates simulation type.
@ kPauliPropagator
Pauli propagator simulation type.
@ kTensorNetwork
Tensor network simulation type.
SimulatorType
The type of simulator.
Definition State.h:68
@ kCompositeQCSim
composite qcsim simulator type
@ kQCSim
qcsim simulator type
@ kQiskitAer
qiskit aer simulator type
@ kQuestSim
quest simulator type
@ kCompositeQiskitAer
composite qiskit aer simulator type
@ kGpuSim
gpu simulator type