Maestro 0.3.1
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
DistributedGpuSimulator.h
Go to the documentation of this file.
1// Gate bridge; native calls check errors before notifying observers.
2#pragma once
3#if defined(__linux__) && defined(INCLUDED_BY_FACTORY)
5namespace Simulators::Private {
6template <class State>
7class DistributedGpuSimulatorBase : public State {
8 public:
9 void ApplyGenericOneQubitGate(Types::qubit_t q,
10 const Eigen::Matrix2cd& gate) override {
11 this->QubitIndex(q);
12 this->Native().ApplyOneQubitMatrixWithLayout(
13 q, reinterpret_cast<const double*>(gate.data()), 1);
14 this->NotifyObservers({q});
15 }
16 void ApplyGenericTwoQubitGate(Types::qubit_t q0, Types::qubit_t q1,
17 const Eigen::Matrix4cd& gate) override {
18 this->QubitIndex(q0);
19 this->QubitIndex(q1);
20 this->Native().ApplyTwoQubitMatrixWithLayout(
21 q0, q1, reinterpret_cast<const double*>(gate.data()), 1);
22 this->NotifyObservers({q0, q1});
23 }
24 void ApplyP(Types::qubit_t qubit, double lambda) override {
25 this->QubitIndex(qubit);
26 this->Native().ApplyP(qubit, lambda);
27 this->NotifyObservers({qubit});
28 }
29 void ApplyX(Types::qubit_t qubit) override {
30 this->QubitIndex(qubit);
31 this->Native().ApplyX(qubit);
32 this->NotifyObservers({qubit});
33 }
34 void ApplyY(Types::qubit_t qubit) override {
35 this->QubitIndex(qubit);
36 this->Native().ApplyY(qubit);
37 this->NotifyObservers({qubit});
38 }
39 void ApplyZ(Types::qubit_t qubit) override {
40 this->QubitIndex(qubit);
41 this->Native().ApplyZ(qubit);
42 this->NotifyObservers({qubit});
43 }
44 void ApplyH(Types::qubit_t qubit) override {
45 this->QubitIndex(qubit);
46 this->Native().ApplyH(qubit);
47 this->NotifyObservers({qubit});
48 }
49 void ApplyS(Types::qubit_t qubit) override {
50 this->QubitIndex(qubit);
51 this->Native().ApplyS(qubit);
52 this->NotifyObservers({qubit});
53 }
54 void ApplySDG(Types::qubit_t qubit) override {
55 this->QubitIndex(qubit);
56 this->Native().ApplySDG(qubit);
57 this->NotifyObservers({qubit});
58 }
59 void ApplyT(Types::qubit_t qubit) override {
60 this->QubitIndex(qubit);
61 this->Native().ApplyT(qubit);
62 this->NotifyObservers({qubit});
63 }
64 void ApplyTDG(Types::qubit_t qubit) override {
65 this->QubitIndex(qubit);
66 this->Native().ApplyTDG(qubit);
67 this->NotifyObservers({qubit});
68 }
69 void ApplySx(Types::qubit_t qubit) override {
70 this->QubitIndex(qubit);
71 this->Native().ApplySX(qubit);
72 this->NotifyObservers({qubit});
73 }
74 void ApplySxDAG(Types::qubit_t qubit) override {
75 this->QubitIndex(qubit);
76 this->Native().ApplySXDG(qubit);
77 this->NotifyObservers({qubit});
78 }
79 void ApplyK(Types::qubit_t qubit) override {
80 this->QubitIndex(qubit);
81 this->Native().ApplyK(qubit);
82 this->NotifyObservers({qubit});
83 }
84 void ApplyRx(Types::qubit_t qubit, double theta) override {
85 this->QubitIndex(qubit);
86 this->Native().ApplyRx(qubit, theta);
87 this->NotifyObservers({qubit});
88 }
89 void ApplyRy(Types::qubit_t qubit, double theta) override {
90 this->QubitIndex(qubit);
91 this->Native().ApplyRy(qubit, theta);
92 this->NotifyObservers({qubit});
93 }
94 void ApplyRz(Types::qubit_t qubit, double theta) override {
95 this->QubitIndex(qubit);
96 this->Native().ApplyRz(qubit, theta);
97 this->NotifyObservers({qubit});
98 }
99 void ApplyU(Types::qubit_t qubit, double theta, double phi, double lambda,
100 double gamma) override {
101 this->QubitIndex(qubit);
102 this->Native().ApplyU(qubit, theta, phi, lambda, gamma);
103 this->NotifyObservers({qubit});
104 }
105 void ApplyCX(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
106 this->QubitIndex(ctrl_qubit);
107 this->QubitIndex(tgt_qubit);
108 this->Native().ApplyCX(ctrl_qubit, tgt_qubit);
109 this->NotifyObservers({ctrl_qubit, tgt_qubit});
110 }
111 void ApplyCY(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
112 this->QubitIndex(ctrl_qubit);
113 this->QubitIndex(tgt_qubit);
114 this->Native().ApplyCY(ctrl_qubit, tgt_qubit);
115 this->NotifyObservers({ctrl_qubit, tgt_qubit});
116 }
117 void ApplyCZ(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
118 this->QubitIndex(ctrl_qubit);
119 this->QubitIndex(tgt_qubit);
120 this->Native().ApplyCZ(ctrl_qubit, tgt_qubit);
121 this->NotifyObservers({ctrl_qubit, tgt_qubit});
122 }
123 void ApplyCP(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
124 double lambda) override {
125 this->QubitIndex(ctrl_qubit);
126 this->QubitIndex(tgt_qubit);
127 this->Native().ApplyCP(ctrl_qubit, tgt_qubit, lambda);
128 this->NotifyObservers({ctrl_qubit, tgt_qubit});
129 }
130 void ApplyCRx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
131 double theta) override {
132 this->QubitIndex(ctrl_qubit);
133 this->QubitIndex(tgt_qubit);
134 this->Native().ApplyCRx(ctrl_qubit, tgt_qubit, theta);
135 this->NotifyObservers({ctrl_qubit, tgt_qubit});
136 }
137 void ApplyCRy(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
138 double theta) override {
139 this->QubitIndex(ctrl_qubit);
140 this->QubitIndex(tgt_qubit);
141 this->Native().ApplyCRy(ctrl_qubit, tgt_qubit, theta);
142 this->NotifyObservers({ctrl_qubit, tgt_qubit});
143 }
144 void ApplyCRz(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
145 double theta) override {
146 this->QubitIndex(ctrl_qubit);
147 this->QubitIndex(tgt_qubit);
148 this->Native().ApplyCRz(ctrl_qubit, tgt_qubit, theta);
149 this->NotifyObservers({ctrl_qubit, tgt_qubit});
150 }
151 void ApplyCH(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
152 this->QubitIndex(ctrl_qubit);
153 this->QubitIndex(tgt_qubit);
154 this->Native().ApplyCH(ctrl_qubit, tgt_qubit);
155 this->NotifyObservers({ctrl_qubit, tgt_qubit});
156 }
157 void ApplyCSx(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit) override {
158 this->QubitIndex(ctrl_qubit);
159 this->QubitIndex(tgt_qubit);
160 this->Native().ApplyCSX(ctrl_qubit, tgt_qubit);
161 this->NotifyObservers({ctrl_qubit, tgt_qubit});
162 }
163 void ApplyCSxDAG(Types::qubit_t ctrl_qubit,
164 Types::qubit_t tgt_qubit) override {
165 this->QubitIndex(ctrl_qubit);
166 this->QubitIndex(tgt_qubit);
167 this->Native().ApplyCSXDG(ctrl_qubit, tgt_qubit);
168 this->NotifyObservers({ctrl_qubit, tgt_qubit});
169 }
170 void ApplySwap(Types::qubit_t qubit0, Types::qubit_t qubit1) override {
171 this->QubitIndex(qubit0);
172 this->QubitIndex(qubit1);
173 this->Native().ApplySwap(qubit0, qubit1);
174 this->NotifyObservers({qubit0, qubit1});
175 }
176 void ApplyCCX(Types::qubit_t qubit0, Types::qubit_t qubit1,
177 Types::qubit_t qubit2) override {
178 this->QubitIndex(qubit0);
179 this->QubitIndex(qubit1);
180 this->QubitIndex(qubit2);
181 this->Native().ApplyCCX(qubit0, qubit1, qubit2);
182 this->NotifyObservers({qubit0, qubit1, qubit2});
183 }
184 void ApplyCSwap(Types::qubit_t ctrl_qubit, Types::qubit_t qubit0,
185 Types::qubit_t qubit1) override {
186 this->QubitIndex(ctrl_qubit);
187 this->QubitIndex(qubit0);
188 this->QubitIndex(qubit1);
189 this->Native().ApplyCSwap(ctrl_qubit, qubit0, qubit1);
190 this->NotifyObservers({ctrl_qubit, qubit0, qubit1});
191 }
192 void ApplyCU(Types::qubit_t ctrl_qubit, Types::qubit_t tgt_qubit,
193 double theta, double phi, double lambda, double gamma) override {
194 this->QubitIndex(ctrl_qubit);
195 this->QubitIndex(tgt_qubit);
196 this->Native().ApplyCU(ctrl_qubit, tgt_qubit, theta, phi, lambda, gamma);
197 this->NotifyObservers({ctrl_qubit, tgt_qubit});
198 }
199 void ApplyNop() override { this->NotifyObservers({}); }
200 std::unique_ptr<ISimulator> Clone() override {
201 auto copy = std::make_unique<DistributedGpuSimulatorBase<State>>();
202 copy->configuration = this->configuration;
203 copy->nrQubits = this->nrQubits;
204 if (this->state) copy->state = this->state->Clone();
205 return copy;
206 }
207};
208using DistributedGpuSimulator =
209 DistributedGpuSimulatorBase<DistributedGpuState>;
210using DistributedMpiGpuSimulator =
211 DistributedGpuSimulatorBase<DistributedMpiGpuState>;
212} // namespace Simulators::Private
213#endif
int ApplyK(void *sim, int qubit)
int ApplyRx(void *sim, int qubit, double theta)
int ApplyX(void *sim, int qubit)
int ApplyU(void *sim, int qubit, double theta, double phi, double lambda, double gamma)
int ApplyCRy(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyTDG(void *sim, int qubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySDG(void *sim, int qubit)
int ApplyCSwap(void *sim, int controlQubit, int qubit1, int qubit2)
int ApplyCCX(void *sim, int controlQubit1, int controlQubit2, int targetQubit)
int ApplyY(void *sim, int qubit)
int ApplyZ(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
int ApplyCY(void *sim, int controlQubit, int targetQubit)
int ApplyCU(void *sim, int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
int ApplySwap(void *sim, int qubit1, int qubit2)
int ApplyRy(void *sim, int qubit, double theta)
int ApplyP(void *sim, int qubit, double theta)
int ApplyCH(void *sim, int controlQubit, int targetQubit)
int ApplyCZ(void *sim, int controlQubit, int targetQubit)
int ApplyRz(void *sim, int qubit, double theta)
int ApplyT(void *sim, int qubit)
int ApplyCRx(void *sim, int controlQubit, int targetQubit, double theta)
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:21