Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
FusionSimulator.h
Go to the documentation of this file.
1#pragma once
2#include "FusionState.h"
3
5{
6// Gate submission shared by QCSim, GPU, distributed and composite adapters.
7template <class State> class FusionSimulator : public State
8{
9 public:
10 using State::State;
11
12 void ApplyP(Types::qubit_t q0, double p0) override
13 {
14 this->SubmitGate({FusionGate::Kind::kPhaseGateType, {q0}, {p0}, {}});
15 }
16
17 void ApplyX(Types::qubit_t q0) override
18 {
19 this->SubmitGate({FusionGate::Kind::kXGateType, {q0}, {}, {}});
20 }
21
22 void ApplyY(Types::qubit_t q0) override
23 {
24 this->SubmitGate({FusionGate::Kind::kYGateType, {q0}, {}, {}});
25 }
26
27 void ApplyZ(Types::qubit_t q0) override
28 {
29 this->SubmitGate({FusionGate::Kind::kZGateType, {q0}, {}, {}});
30 }
31
32 void ApplyH(Types::qubit_t q0) override
33 {
34 this->SubmitGate({FusionGate::Kind::kHadamardGateType, {q0}, {}, {}});
35 }
36
37 void ApplyS(Types::qubit_t q0) override
38 {
39 this->SubmitGate({FusionGate::Kind::kSGateType, {q0}, {}, {}});
40 }
41
42 void ApplySDG(Types::qubit_t q0) override
43 {
44 this->SubmitGate({FusionGate::Kind::kSdgGateType, {q0}, {}, {}});
45 }
46
47 void ApplyT(Types::qubit_t q0) override
48 {
49 this->SubmitGate({FusionGate::Kind::kTGateType, {q0}, {}, {}});
50 }
51
52 void ApplyTDG(Types::qubit_t q0) override
53 {
54 this->SubmitGate({FusionGate::Kind::kTdgGateType, {q0}, {}, {}});
55 }
56
57 void ApplySx(Types::qubit_t q0) override
58 {
59 this->SubmitGate({FusionGate::Kind::kSxGateType, {q0}, {}, {}});
60 }
61
62 void ApplySxDAG(Types::qubit_t q0) override
63 {
64 this->SubmitGate({FusionGate::Kind::kSxDagGateType, {q0}, {}, {}});
65 }
66
67 void ApplyK(Types::qubit_t q0) override
68 {
69 this->SubmitGate({FusionGate::Kind::kKGateType, {q0}, {}, {}});
70 }
71
72 void ApplyRx(Types::qubit_t q0, double p0) override
73 {
74 this->SubmitGate({FusionGate::Kind::kRxGateType, {q0}, {p0}, {}});
75 }
76
77 void ApplyRy(Types::qubit_t q0, double p0) override
78 {
79 this->SubmitGate({FusionGate::Kind::kRyGateType, {q0}, {p0}, {}});
80 }
81
82 void ApplyRz(Types::qubit_t q0, double p0) override
83 {
84 this->SubmitGate({FusionGate::Kind::kRzGateType, {q0}, {p0}, {}});
85 }
86
87 void ApplyU(Types::qubit_t q0, double p0, double p1, double p2, double p3) override
88 {
89 this->SubmitGate({FusionGate::Kind::kUGateType, {q0}, {p0, p1, p2, p3}, {}});
90 }
91
93 {
94 this->SubmitGate({FusionGate::Kind::kSwapGateType, {q0, q1}, {}, {}});
95 }
96
98 {
99 this->SubmitGate({FusionGate::Kind::kCXGateType, {q0, q1}, {}, {}});
100 }
101
103 {
104 this->SubmitGate({FusionGate::Kind::kCYGateType, {q0, q1}, {}, {}});
105 }
106
108 {
109 this->SubmitGate({FusionGate::Kind::kCZGateType, {q0, q1}, {}, {}});
110 }
111
112 void ApplyCP(Types::qubit_t q0, Types::qubit_t q1, double p0) override
113 {
114 this->SubmitGate({FusionGate::Kind::kCPGateType, {q0, q1}, {p0}, {}});
115 }
116
117 void ApplyCRx(Types::qubit_t q0, Types::qubit_t q1, double p0) override
118 {
119 this->SubmitGate({FusionGate::Kind::kCRxGateType, {q0, q1}, {p0}, {}});
120 }
121
122 void ApplyCRy(Types::qubit_t q0, Types::qubit_t q1, double p0) override
123 {
124 this->SubmitGate({FusionGate::Kind::kCRyGateType, {q0, q1}, {p0}, {}});
125 }
126
127 void ApplyCRz(Types::qubit_t q0, Types::qubit_t q1, double p0) override
128 {
129 this->SubmitGate({FusionGate::Kind::kCRzGateType, {q0, q1}, {p0}, {}});
130 }
131
133 {
134 this->SubmitGate({FusionGate::Kind::kCHGateType, {q0, q1}, {}, {}});
135 }
136
138 {
139 this->SubmitGate({FusionGate::Kind::kCSxGateType, {q0, q1}, {}, {}});
140 }
141
143 {
144 this->SubmitGate({FusionGate::Kind::kCSxDagGateType, {q0, q1}, {}, {}});
145 }
146
147 void ApplyCU(Types::qubit_t q0, Types::qubit_t q1, double p0, double p1, double p2, double p3) override
148 {
149 this->SubmitGate({FusionGate::Kind::kCUGateType, {q0, q1}, {p0, p1, p2, p3}, {}});
150 }
151
153 {
154 this->SubmitGate({FusionGate::Kind::kCSwapGateType, {q0, q1, q2}, {}, {}});
155 }
156
158 {
159 this->SubmitGate({FusionGate::Kind::kCCXGateType, {q0, q1, q2}, {}, {}});
160 }
161
162 void ApplyGenericOneQubitGate(Types::qubit_t q, const Eigen::Matrix2cd &m) override
163 {
164 this->SubmitGate({FusionGate::Kind::kNone, {q}, {}, m});
165 }
166
167 void ApplyGenericTwoQubitGate(Types::qubit_t a, Types::qubit_t b, const Eigen::Matrix4cd &m) override
168 {
169 this->SubmitGate({FusionGate::Kind::kNone, {a, b}, {}, m});
170 }
171
173 {
174 this->SubmitGate({FusionGate::Kind::kNone, {a, b, c}, {}, m});
175 }
176
177 void ApplyNop() override
178 {
179 this->FlushPendingGates();
180 this->immediate_->ApplyNop();
181 this->ConsumeBoundary(Circuits::OperationType::kNoOp);
182 this->NotifyObservers({});
183 }
184};
185} // namespace Simulators::Private
Eigen::Matrix< std::complex< double >, 8, 8 > Matrix8cd
Definition Simulator.h:43
void ApplyK(Types::qubit_t q0) override
void ApplyGenericThreeQubitGate(Types::qubit_t a, Types::qubit_t b, Types::qubit_t c, const ISimulator::Matrix8cd &m) override
void ApplyCRx(Types::qubit_t q0, Types::qubit_t q1, double p0) override
void ApplyT(Types::qubit_t q0) override
void ApplySx(Types::qubit_t q0) override
void ApplyCX(Types::qubit_t q0, Types::qubit_t q1) override
void ApplyCRz(Types::qubit_t q0, Types::qubit_t q1, double p0) override
void ApplyCU(Types::qubit_t q0, Types::qubit_t q1, double p0, double p1, double p2, double p3) override
void ApplyU(Types::qubit_t q0, double p0, double p1, double p2, double p3) override
void ApplyCRy(Types::qubit_t q0, Types::qubit_t q1, double p0) override
void ApplyH(Types::qubit_t q0) override
void ApplyP(Types::qubit_t q0, double p0) override
void ApplyCY(Types::qubit_t q0, Types::qubit_t q1) override
void ApplyRz(Types::qubit_t q0, double p0) override
void ApplyGenericTwoQubitGate(Types::qubit_t a, Types::qubit_t b, const Eigen::Matrix4cd &m) override
void ApplySDG(Types::qubit_t q0) override
void ApplyY(Types::qubit_t q0) override
void ApplyTDG(Types::qubit_t q0) override
void ApplyCH(Types::qubit_t q0, Types::qubit_t q1) override
void ApplyS(Types::qubit_t q0) override
void ApplyRx(Types::qubit_t q0, double p0) override
void ApplyCSwap(Types::qubit_t q0, Types::qubit_t q1, Types::qubit_t q2) override
void ApplyX(Types::qubit_t q0) override
void ApplyCZ(Types::qubit_t q0, Types::qubit_t q1) override
void ApplySxDAG(Types::qubit_t q0) override
void ApplyRy(Types::qubit_t q0, double p0) override
void ApplyCP(Types::qubit_t q0, Types::qubit_t q1, double p0) override
void ApplyZ(Types::qubit_t q0) override
void ApplyCSxDAG(Types::qubit_t q0, Types::qubit_t q1) override
void ApplySwap(Types::qubit_t q0, Types::qubit_t q1) override
void ApplyGenericOneQubitGate(Types::qubit_t q, const Eigen::Matrix2cd &m) override
void ApplyCSx(Types::qubit_t q0, Types::qubit_t q1) override
void ApplyCCX(Types::qubit_t q0, Types::qubit_t q1, Types::qubit_t q2) override
@ kNoOp
no operation, just a placeholder, could be used to erase some operation from a circuit
Definition Operations.h:44
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:23