Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
QCSimExtendedStabilizer.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#ifndef _QCSIM_EXTENDED_STABILIZER_H
16#define _QCSIM_EXTENDED_STABILIZER_H 1
17
18#include <cstdint>
19#include <memory>
20#include <random>
21#include <string>
22#include <unordered_map>
23#include <utility>
24#include <vector>
25
26#include "ExtendedStabilizer.h"
27
28namespace Simulators
29{
30
32{
33 public:
34 explicit QCSimExtendedStabilizer(size_t nrQubits) : simulator(std::make_unique<QC::ExtendedStabilizer>(nrQubits))
35 {
36 }
37
38 QCSimExtendedStabilizer(size_t nrQubits, const QC::ExtendedStabilizerApproximationPolicy &policy)
39 : simulator(std::make_unique<QC::ExtendedStabilizer>(nrQubits, policy))
40 {
41 }
42
43 size_t GetNrQubits() const
44 {
45 return simulator->GetNrQubits();
46 }
47
48 void Reset(size_t nrQubits)
49 {
50 simulator->Reset(nrQubits);
51 }
52
53 void SetRandomSeed(std::mt19937::result_type seed)
54 {
55 simulator->SetRandomSeed(seed);
56 }
57
58 // Uses all 64 bits, as SetSeed does for the other QCSim backends.
59 void SetSeed(uint64_t seed)
60 {
61 simulator->SetSeed(seed);
62 }
63
64 void SetMultithreading(bool enable = true)
65 {
66 simulator->SetMultithreading(enable);
67 }
68
69 bool GetMultithreading() const
70 {
71 return simulator->GetMultithreading();
72 }
73
74 void ApplyH(size_t qubit)
75 {
76 simulator->ApplyH(qubit);
77 }
78
79 void ApplyS(size_t qubit)
80 {
81 simulator->ApplyS(qubit);
82 }
83
84 void ApplyX(size_t qubit)
85 {
86 simulator->ApplyX(qubit);
87 }
88
89 void ApplyY(size_t qubit)
90 {
91 simulator->ApplyY(qubit);
92 }
93
94 void ApplyZ(size_t qubit)
95 {
96 simulator->ApplyZ(qubit);
97 }
98
99 void ApplyK(size_t qubit)
100 {
101 simulator->ApplyK(qubit);
102 }
103
104 bool Measure(size_t qubit)
105 {
106 return simulator->Measure(qubit);
107 }
108
109 double GetQubitProbability(size_t qubit) const
110 {
111 return simulator->GetQubitProbability(qubit);
112 }
113
114 double ExpectationValue(const std::string &pauliString) const
115 {
116 return simulator->ExpectationValue(pauliString);
117 }
118
119 // Counts preserve the live and saved state and draw the same random numbers
120 // as restoring the state and measuring the qubits in order for each shot.
121 std::unordered_map<size_t, size_t> SampleCounts(const std::vector<size_t> &qubits, size_t shots)
122 {
123 return simulator->SampleCounts(qubits, shots);
124 }
125
126 std::unordered_map<std::vector<bool>, size_t> SampleCountsMany(const std::vector<size_t> &qubits, size_t shots)
127 {
128 return simulator->SampleCountsMany(qubits, shots);
129 }
130
132 {
133 simulator->SaveState();
134 }
135
137 {
138 simulator->RestoreState();
139 }
140
141 std::unique_ptr<QCSimExtendedStabilizer> Clone() const
142 {
143 return std::unique_ptr<QCSimExtendedStabilizer>(new QCSimExtendedStabilizer(simulator->Clone()));
144 }
145
146 // A backend Clone is a complete snapshot, including its RNG position.
147 // Sampling and execution workers instead get a seed from their owner's stream.
148 std::unique_ptr<QCSimExtendedStabilizer> CloneWithSeed(uint64_t seed) const
149 {
150 auto clone = simulator->Clone();
151 clone->SetSeed(seed);
152 return std::unique_ptr<QCSimExtendedStabilizer>(new QCSimExtendedStabilizer(std::move(clone)));
153 }
154
155 const std::vector<QC::ExtendedFrame> &GetFrames() const noexcept
156 {
157 return simulator->GetFrames();
158 }
159
160 const QC::ExtendedStabilizerApproximationPolicy &GetApproximationPolicy() const noexcept
161 {
162 return simulator->GetApproximationPolicy();
163 }
164
165 const QC::ExtendedStabilizerApproximationStatistics &GetApproximationStatistics() const noexcept
166 {
167 return simulator->GetApproximationStatistics();
168 }
169
170 double GetApproximationErrorBound() const noexcept
171 {
172 return simulator->GetApproximationErrorBound();
173 }
174
175 void SetApproximationPolicy(const QC::ExtendedStabilizerApproximationPolicy &policy)
176 {
177 simulator->SetApproximationPolicy(policy);
178 }
179
180 // Keep the gate names and control/target order consistent with the other
181 // Maestro QCSim wrappers. QCSim's ExtendedStabilizer uses target/control.
182 void ApplySDG(size_t qubit)
183 {
184 simulator->ApplySdg(qubit);
185 }
186
187 void ApplySX(size_t qubit)
188 {
189 simulator->ApplySx(qubit);
190 }
191
192 void ApplySXDG(size_t qubit)
193 {
194 simulator->ApplySxDag(qubit);
195 }
196
197 void ApplyCX(size_t controlQubit, size_t targetQubit)
198 {
199 simulator->ApplyCX(targetQubit, controlQubit);
200 }
201
202 void ApplyCY(size_t controlQubit, size_t targetQubit)
203 {
204 simulator->ApplyCY(targetQubit, controlQubit);
205 }
206
207 void ApplyCZ(size_t controlQubit, size_t targetQubit)
208 {
209 simulator->ApplyCZ(targetQubit, controlQubit);
210 }
211
212 void ApplySWAP(size_t qubit1, size_t qubit2)
213 {
214 simulator->ApplySwap(qubit1, qubit2);
215 }
216
217 void ApplyISWAP(size_t qubit1, size_t qubit2)
218 {
219 simulator->ApplyISwap(qubit1, qubit2);
220 }
221
222 void ApplyISWAPDG(size_t qubit1, size_t qubit2)
223 {
224 simulator->ApplyISwapDag(qubit1, qubit2);
225 }
226
227 void ApplyRX(size_t qubit, double angle)
228 {
229 simulator->ApplyRx(qubit, angle);
230 }
231
232 void ApplyRY(size_t qubit, double angle)
233 {
234 simulator->ApplyRy(qubit, angle);
235 }
236
237 void ApplyRZ(size_t qubit, double angle)
238 {
239 simulator->ApplyRz(qubit, angle);
240 }
241
242 void ApplyP(size_t qubit, double lambda)
243 {
244 ApplyRZ(qubit, lambda);
245 }
246
247 void ApplyT(size_t qubit)
248 {
249 ApplyRZ(qubit, kPi / 4.0);
250 }
251
252 void ApplyTDG(size_t qubit)
253 {
254 ApplyRZ(qubit, -kPi / 4.0);
255 }
256
257 // QCSim applies these gates in one pass each, without the rotation
258 // decompositions; at Clifford angles they only update the stabilizer basis.
259 void ApplyU(size_t qubit, double theta, double phi, double lambda, double gamma = 0.0)
260 {
261 // A global phase has no observable effect for a non-controlled U gate.
262 (void)gamma;
263 simulator->ApplyU(qubit, theta, phi, lambda);
264 }
265
266 void ApplyCH(size_t controlQubit, size_t targetQubit)
267 {
268 simulator->ApplyCH(targetQubit, controlQubit);
269 }
270
271 void ApplyCU(size_t controlQubit, size_t targetQubit, double theta, double phi, double lambda, double gamma = 0.0)
272 {
273 simulator->ApplyCU(targetQubit, controlQubit, theta, phi, lambda, gamma);
274 }
275
276 void ApplyCRX(size_t controlQubit, size_t targetQubit, double angle)
277 {
278 simulator->ApplyCRx(targetQubit, controlQubit, angle);
279 }
280
281 void ApplyCRY(size_t controlQubit, size_t targetQubit, double angle)
282 {
283 simulator->ApplyCRy(targetQubit, controlQubit, angle);
284 }
285
286 void ApplyCRZ(size_t controlQubit, size_t targetQubit, double angle)
287 {
288 simulator->ApplyCRz(targetQubit, controlQubit, angle);
289 }
290
291 void ApplyCP(size_t controlQubit, size_t targetQubit, double lambda)
292 {
293 simulator->ApplyCP(targetQubit, controlQubit, lambda);
294 }
295
296 void ApplyCS(size_t controlQubit, size_t targetQubit)
297 {
298 simulator->ApplyCS(targetQubit, controlQubit);
299 }
300
301 void ApplyCSDAG(size_t controlQubit, size_t targetQubit)
302 {
303 simulator->ApplyCSdg(targetQubit, controlQubit);
304 }
305
306 void ApplyCSX(size_t controlQubit, size_t targetQubit)
307 {
308 simulator->ApplyCSx(targetQubit, controlQubit);
309 }
310
311 void ApplyCSXDAG(size_t controlQubit, size_t targetQubit)
312 {
313 simulator->ApplyCSxDag(targetQubit, controlQubit);
314 }
315
316 void ApplyCSwap(size_t controlQubit, size_t targetQubit1, size_t targetQubit2)
317 {
318 simulator->ApplyCSwap(targetQubit1, targetQubit2, controlQubit);
319 }
320
321 void ApplyCCX(size_t controlQubit1, size_t controlQubit2, size_t targetQubit)
322 {
323 simulator->ApplyCCX(targetQubit, controlQubit1, controlQubit2);
324 }
325
326 private:
327 explicit QCSimExtendedStabilizer(std::unique_ptr<QC::ExtendedStabilizer> simulatorToOwn) : simulator(std::move(simulatorToOwn))
328 {
329 }
330
331 std::unique_ptr<QC::ExtendedStabilizer> simulator;
332 static constexpr double kPi = 3.141592653589793238462643383279502884;
333};
334
335} // namespace Simulators
336
337#endif // _QCSIM_EXTENDED_STABILIZER_H
void ApplyCU(size_t controlQubit, size_t targetQubit, double theta, double phi, double lambda, double gamma=0.0)
std::unique_ptr< QCSimExtendedStabilizer > Clone() const
void ApplyCSXDAG(size_t controlQubit, size_t targetQubit)
std::unique_ptr< QCSimExtendedStabilizer > CloneWithSeed(uint64_t seed) const
void ApplyCCX(size_t controlQubit1, size_t controlQubit2, size_t targetQubit)
void ApplySWAP(size_t qubit1, size_t qubit2)
void ApplyISWAPDG(size_t qubit1, size_t qubit2)
const std::vector< QC::ExtendedFrame > & GetFrames() const noexcept
std::unordered_map< size_t, size_t > SampleCounts(const std::vector< size_t > &qubits, size_t shots)
void ApplyCRY(size_t controlQubit, size_t targetQubit, double angle)
void ApplyCSwap(size_t controlQubit, size_t targetQubit1, size_t targetQubit2)
void ApplyRX(size_t qubit, double angle)
void ApplyCSX(size_t controlQubit, size_t targetQubit)
std::unordered_map< std::vector< bool >, size_t > SampleCountsMany(const std::vector< size_t > &qubits, size_t shots)
void ApplyCX(size_t controlQubit, size_t targetQubit)
QCSimExtendedStabilizer(size_t nrQubits, const QC::ExtendedStabilizerApproximationPolicy &policy)
void ApplyCS(size_t controlQubit, size_t targetQubit)
void ApplyCRZ(size_t controlQubit, size_t targetQubit, double angle)
void SetApproximationPolicy(const QC::ExtendedStabilizerApproximationPolicy &policy)
void ApplyISWAP(size_t qubit1, size_t qubit2)
void ApplyP(size_t qubit, double lambda)
void ApplyRY(size_t qubit, double angle)
void ApplyRZ(size_t qubit, double angle)
double ExpectationValue(const std::string &pauliString) const
void ApplyCRX(size_t controlQubit, size_t targetQubit, double angle)
const QC::ExtendedStabilizerApproximationPolicy & GetApproximationPolicy() const noexcept
const QC::ExtendedStabilizerApproximationStatistics & GetApproximationStatistics() const noexcept
double GetQubitProbability(size_t qubit) const
void ApplyCH(size_t controlQubit, size_t targetQubit)
void ApplyCP(size_t controlQubit, size_t targetQubit, double lambda)
void ApplyU(size_t qubit, double theta, double phi, double lambda, double gamma=0.0)
void ApplyCY(size_t controlQubit, size_t targetQubit)
void SetRandomSeed(std::mt19937::result_type seed)
void ApplyCSDAG(size_t controlQubit, size_t targetQubit)
void ApplyCZ(size_t controlQubit, size_t targetQubit)
Bounded online routing based on current physical bond dimensions.