Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Maestro.h
Go to the documentation of this file.
1
9#pragma once
10
11#ifdef COMPOSER
12#include "../../composer/composer/Network/SimpleFullyConnectedNetwork.h"
13#else
14#include "../Network/SimpleDisconnectedNetwork.h"
15#endif
16
17#include "../Simulators/Factory.h"
18
19class Maestro {
20 public:
21 Maestro() = default;
22 ~Maestro() = default;
23
24 // Add methods to expose functionality to Maestro here.
25 // For example, methods to create circuits, simulators, run simulations, etc.
26 unsigned long int CreateSimpleSimulator(int nrQubits) {
27 if (nrQubits <= 0) return 0;
28
29 const std::vector<Types::qubit_t> qubits{
30 static_cast<Types::qubit_t>(nrQubits)};
31 const std::vector<size_t> cbits{static_cast<size_t>(nrQubits)};
32
33#ifdef COMPOSER
34 auto network = std::make_shared<Network::SimpleNetwork<>>(qubits, cbits);
35#else
36 auto network =
37 std::make_shared<Network::SimpleDisconnectedNetwork<>>(qubits, cbits);
38#endif
39
40 // lock the mutex to safely add the simulator
41 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
42
43 if (curHandle == std::numeric_limits<unsigned long int>::max()) {
44 // Handle overflow, reset to 0
45 curHandle = 0;
46 }
47 const unsigned long int handle = ++curHandle;
48
49 simpleSimulators[handle] = network;
50
51 return handle;
52 }
53
54 void DestroySimpleSimulator(unsigned long int simHandle) {
55 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
56
57 simpleSimulators.erase(simHandle);
58 }
59
60 std::shared_ptr<Network::INetwork<>> GetSimpleSimulator(
61 unsigned long int simHandle) {
62 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
63 auto it = simpleSimulators.find(simHandle);
64 if (it != simpleSimulators.end()) return it->second;
65
66 return nullptr;
67 }
68
70 unsigned long int simHandle, Simulators::SimulatorType simType,
71 Simulators::SimulationType simExecType) {
72 auto sim = GetSimpleSimulator(simHandle);
73 if (!sim) return 0;
74
75 sim->RemoveAllOptimizationSimulatorsAndAdd(simType, simExecType);
76
77 return 1;
78 }
79
80 int AddOptimizationSimulator(unsigned long int simHandle,
82 Simulators::SimulationType simExecType) {
83 auto sim = GetSimpleSimulator(simHandle);
84 if (!sim) return 0;
85 sim->AddOptimizationSimulator(simType, simExecType);
86 return 1;
87 }
88
89 unsigned long int CreateSimulator(
91 Simulators::SimulationType simExecType =
93 auto simulator =
95
96 std::lock_guard<std::mutex> lock(simulatorsMutex);
97 if (curSimulatorHandle == std::numeric_limits<unsigned long int>::max()) {
98 // Handle overflow, reset to 0
99 curSimulatorHandle = 0;
100 }
101 const unsigned long int handle = ++curSimulatorHandle;
102
103 simulators[handle] = simulator;
104
105 return handle;
106 }
107
108 void *GetSimulator(unsigned long int simHandle) {
109 std::lock_guard<std::mutex> lock(simulatorsMutex);
110 auto it = simulators.find(simHandle);
111 if (it != simulators.end()) return it->second.get();
112
113 return nullptr;
114 }
115
116 void DestroySimulator(unsigned long int simHandle) {
117 std::lock_guard<std::mutex> lock(simulatorsMutex);
118 simulators.erase(simHandle);
119 }
120
121 private:
122 // allow multithreaded access
123 std::mutex simpleSimulatorsMutex;
124 std::mutex simulatorsMutex;
125
126 std::unordered_map<unsigned long int, std::shared_ptr<Network::INetwork<>>>
127 simpleSimulators; // map for network simulators
128 std::unordered_map<unsigned long int, std::shared_ptr<Simulators::ISimulator>>
129 simulators; // map for simulators
130
131 unsigned long int curHandle = 0;
132 unsigned long int curSimulatorHandle = 0; // current handle for simulators
133};
Maestro()=default
int RemoveAllOptimizationSimulatorsAndAdd(unsigned long int simHandle, Simulators::SimulatorType simType, Simulators::SimulationType simExecType)
Definition Maestro.h:69
unsigned long int CreateSimulator(Simulators::SimulatorType simType=Simulators::SimulatorType::kQCSim, Simulators::SimulationType simExecType=Simulators::SimulationType::kMatrixProductState)
Definition Maestro.h:89
void DestroySimulator(unsigned long int simHandle)
Definition Maestro.h:116
int AddOptimizationSimulator(unsigned long int simHandle, Simulators::SimulatorType simType, Simulators::SimulationType simExecType)
Definition Maestro.h:80
void DestroySimpleSimulator(unsigned long int simHandle)
Definition Maestro.h:54
std::shared_ptr< Network::INetwork<> > GetSimpleSimulator(unsigned long int simHandle)
Definition Maestro.h:60
unsigned long int CreateSimpleSimulator(int nrQubits)
Definition Maestro.h:26
~Maestro()=default
void * GetSimulator(unsigned long int simHandle)
Definition Maestro.h:108
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:77
SimulationType
The type of simulation.
Definition State.h:79
@ kMatrixProductState
matrix product state simulation type
SimulatorType
The type of simulator.
Definition State.h:63
@ kQCSim
qcsim simulator type