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