Skip to content

Commit 3f6a337

Browse files
committed
Refactor gate interface.
1 parent 0c242e7 commit 3f6a337

66 files changed

Lines changed: 5428 additions & 3901 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/qsim_amplitudes.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#include "../lib/circuit_qsim_parser.h"
2626
#include "../lib/formux.h"
2727
#include "../lib/fuser_mqubit.h"
28-
#include "../lib/gates_qsim.h"
2928
#include "../lib/io_file.h"
29+
#include "../lib/operation.h"
3030
#include "../lib/run_qsim.h"
3131
#include "../lib/simmux.h"
3232
#include "../lib/util.h"
@@ -160,7 +160,7 @@ int main(int argc, char* argv[]) {
160160
return 1;
161161
}
162162

163-
Circuit<GateQSim<float>> circuit;
163+
Circuit<Operation<float>> circuit;
164164
unsigned maxtime = opt.times.back();
165165
if (!CircuitQsimParser<IOFile>::FromFile(maxtime, opt.circuit_file,
166166
circuit)) {
@@ -191,7 +191,7 @@ int main(int argc, char* argv[]) {
191191
using Simulator = Factory::Simulator;
192192
using StateSpace = Simulator::StateSpace;
193193
using State = StateSpace::State;
194-
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
194+
using Fuser = MultiQubitGateFuser<IO>;
195195
using Runner = QSimRunner<IO, Fuser, Factory>;
196196

197197
auto measure = [&opt, &circuit](

apps/qsim_base.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include "../lib/circuit_qsim_parser.h"
2323
#include "../lib/formux.h"
2424
#include "../lib/fuser_mqubit.h"
25-
#include "../lib/gates_qsim.h"
2625
#include "../lib/io_file.h"
26+
#include "../lib/operation.h"
2727
#include "../lib/run_qsim.h"
2828
#include "../lib/simmux.h"
2929
#include "../lib/util_cpu.h"
@@ -114,7 +114,7 @@ int main(int argc, char* argv[]) {
114114
return 1;
115115
}
116116

117-
Circuit<GateQSim<float>> circuit;
117+
Circuit<Operation<float>> circuit;
118118
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
119119
circuit)) {
120120
return 1;
@@ -144,7 +144,7 @@ int main(int argc, char* argv[]) {
144144
using Simulator = Factory::Simulator;
145145
using StateSpace = Simulator::StateSpace;
146146
using State = StateSpace::State;
147-
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
147+
using Fuser = MultiQubitGateFuser<IO>;
148148
using Runner = QSimRunner<IO, Fuser, Factory>;
149149

150150
StateSpace state_space = Factory(opt.num_threads).CreateStateSpace();

apps/qsim_base_cuda.cu

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include "../lib/circuit_qsim_parser.h"
2323
#include "../lib/formux.h"
2424
#include "../lib/fuser_mqubit.h"
25-
#include "../lib/gates_qsim.h"
2625
#include "../lib/io_file.h"
26+
#include "../lib/operation.h"
2727
#include "../lib/run_qsim.h"
2828
#include "../lib/simulator_cuda.h"
2929

@@ -114,7 +114,7 @@ int main(int argc, char* argv[]) {
114114

115115
using fp_type = float;
116116

117-
Circuit<GateQSim<fp_type>> circuit;
117+
Circuit<Operation<fp_type>> circuit;
118118
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
119119
circuit)) {
120120
return 1;
@@ -140,7 +140,7 @@ int main(int argc, char* argv[]) {
140140
using Simulator = Factory::Simulator;
141141
using StateSpace = Simulator::StateSpace;
142142
using State = StateSpace::State;
143-
using Fuser = MultiQubitGateFuser<IO, GateQSim<fp_type>>;
143+
using Fuser = MultiQubitGateFuser<IO>;
144144
using Runner = QSimRunner<IO, Fuser, Factory>;
145145

146146
StateSpace::Parameter param1;

apps/qsim_base_custatevec.cu

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
#include "../lib/circuit_qsim_parser.h"
2525
#include "../lib/formux.h"
2626
#include "../lib/fuser_mqubit.h"
27-
#include "../lib/gates_qsim.h"
2827
#include "../lib/io_file.h"
28+
#include "../lib/operation.h"
2929
#include "../lib/run_qsim.h"
3030
#include "../lib/simulator_custatevec.h"
3131
#include "../lib/util_custatevec.h"
@@ -108,7 +108,7 @@ int main(int argc, char* argv[]) {
108108

109109
using fp_type = float;
110110

111-
Circuit<GateQSim<fp_type>> circuit;
111+
Circuit<Operation<fp_type>> circuit;
112112
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
113113
circuit)) {
114114
return 1;
@@ -143,7 +143,7 @@ int main(int argc, char* argv[]) {
143143
using Simulator = Factory::Simulator;
144144
using StateSpace = Simulator::StateSpace;
145145
using State = StateSpace::State;
146-
using Fuser = MultiQubitGateFuser<IO, GateQSim<fp_type>>;
146+
using Fuser = MultiQubitGateFuser<IO>;
147147
using Runner = QSimRunner<IO, Fuser, Factory>;
148148

149149
Factory factory;

apps/qsim_base_custatevecex.cu

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121

2222
#include "../lib/circuit_qsim_parser.h"
2323
#include "../lib/formux.h"
24-
#include "../lib/gates_qsim.h"
2524
#include "../lib/io_file.h"
2625
#include "../lib/multiprocess_custatevecex.h"
26+
#include "../lib/operation.h"
2727
#include "../lib/run_custatevecex.h"
2828
#include "../lib/simulator_custatevecex.h"
2929
#include "../lib/util_custatevec.h"
@@ -106,7 +106,7 @@ int main(int argc, char* argv[]) {
106106

107107
using fp_type = float;
108108

109-
Circuit<GateQSim<fp_type>> circuit;
109+
Circuit<Operation<fp_type>> circuit;
110110
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
111111
circuit)) {
112112
return 1;

apps/qsim_qtrajectory_cuda.cu

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
#include "../lib/circuit_qsim_parser.h"
2828
#include "../lib/expect.h"
2929
#include "../lib/fuser_mqubit.h"
30-
#include "../lib/gates_qsim.h"
3130
#include "../lib/io_file.h"
31+
#include "../lib/operation.h"
3232
#include "../lib/qtrajectory.h"
3333
#include "../lib/run_qsim.h"
3434
#include "../lib/simulator_cuda.h"
@@ -44,10 +44,10 @@ struct Options {
4444
unsigned verbosity = 0;
4545
};
4646

47-
constexpr char usage[] = "usage:\n ./qsim_qtrajectory_cuda.x "
47+
constexpr char usage[] = "usage:\n ./qsim_qtrajectory.x "
4848
"-c circuit_file -d times_to_calculate_observables "
4949
"-a amplitude_damping_const -p phase_damping_const "
50-
"-t traj0 -n num_trajectories -f max_fused_size "
50+
"-0 traj0 -n num_trajectories -f max_fused_size "
5151
"-v verbosity\n";
5252

5353
Options GetOptions(int argc, char* argv[]) {
@@ -59,7 +59,7 @@ Options GetOptions(int argc, char* argv[]) {
5959
return std::atoi(word.c_str());
6060
};
6161

62-
while ((k = getopt(argc, argv, "c:d:a:p:t:n:f:v:")) != -1) {
62+
while ((k = getopt(argc, argv, "c:d:a:p:0:n:f:v:")) != -1) {
6363
switch (k) {
6464
case 'c':
6565
opt.circuit_file = optarg;
@@ -73,7 +73,7 @@ Options GetOptions(int argc, char* argv[]) {
7373
case 'p':
7474
opt.phase_damp_const = std::atof(optarg);
7575
break;
76-
case 't':
76+
case '0':
7777
opt.traj0 = std::atoi(optarg);
7878
break;
7979
case 'n':
@@ -85,7 +85,6 @@ Options GetOptions(int argc, char* argv[]) {
8585
case 'v':
8686
opt.verbosity = std::atoi(optarg);
8787
break;
88-
break;
8988
default:
9089
qsim::IO::errorf(usage);
9190
exit(1);
@@ -120,47 +119,52 @@ bool ValidateOptions(const Options& opt) {
120119
return true;
121120
}
122121

123-
template <typename Gate, typename Channel1, typename Channel2>
124-
std::vector<qsim::NoisyCircuit<Gate>> AddNoise(
125-
const qsim::Circuit<Gate>& circuit, const std::vector<unsigned>& times,
122+
template <typename FP, typename Channel1, typename Channel2>
123+
std::vector<qsim::Circuit<qsim::Operation<FP>>> AddNoise(
124+
const qsim::Circuit<qsim::Operation<FP>>& circuit,
125+
const std::vector<unsigned>& times,
126126
const Channel1& channel1, const Channel2& channel2) {
127-
std::vector<qsim::NoisyCircuit<Gate>> ncircuits;
127+
std::vector<qsim::Circuit<qsim::Operation<FP>>> ncircuits;
128128
ncircuits.reserve(times.size());
129129

130-
qsim::NoisyCircuit<Gate> ncircuit;
130+
qsim::Circuit<qsim::Operation<FP>> ncircuit;
131131

132132
ncircuit.num_qubits = circuit.num_qubits;
133-
ncircuit.channels.reserve(5 * circuit.gates.size());
133+
ncircuit.ops.reserve(5 * circuit.ops.size());
134134

135135
unsigned cur_time_index = 0;
136136

137-
for (std::size_t i = 0; i < circuit.gates.size(); ++i) {
138-
const auto& gate = circuit.gates[i];
137+
for (std::size_t i = 0; i < circuit.ops.size(); ++i) {
138+
const auto& op = circuit.ops[i];
139+
140+
unsigned time = OpTime(op);
141+
const auto& qubits = OpQubits(op);
139142

140-
ncircuit.channels.push_back(qsim::MakeChannelFromGate(3 * gate.time, gate));
143+
ncircuit.ops.push_back(op);
144+
OpBaseOperation(ncircuit.ops.back()).time = 3 * time;
141145

142-
for (auto q : gate.qubits) {
143-
ncircuit.channels.push_back(channel1.Create(3 * gate.time + 1, q));
146+
for (auto q : qubits) {
147+
ncircuit.ops.push_back(channel1.Create(3 * time + 1, q));
144148
}
145149

146-
for (auto q : gate.qubits) {
147-
ncircuit.channels.push_back(channel2.Create(3 * gate.time + 2, q));
150+
for (auto q : qubits) {
151+
ncircuit.ops.push_back(channel2.Create(3 * time + 2, q));
148152
}
149153

150154
unsigned t = times[cur_time_index];
151155

152-
if (i == circuit.gates.size() - 1 || t < circuit.gates[i + 1].time) {
156+
if (i == circuit.ops.size() - 1 || t < OpTime(circuit.ops[i + 1])) {
153157
ncircuits.push_back(std::move(ncircuit));
154158

155159
ncircuit = {};
156160

157-
if (i < circuit.gates.size() - 1) {
158-
if (circuit.gates[i + 1].time > times.back()) {
161+
if (i < circuit.ops.size() - 1) {
162+
if (OpTime(circuit.ops[i + 1]) > times.back()) {
159163
break;
160164
}
161165

162166
ncircuit.num_qubits = circuit.num_qubits;
163-
ncircuit.channels.reserve(5 * circuit.gates.size());
167+
ncircuit.ops.reserve(5 * circuit.ops.size());
164168
}
165169

166170
++cur_time_index;
@@ -170,13 +174,13 @@ std::vector<qsim::NoisyCircuit<Gate>> AddNoise(
170174
return ncircuits;
171175
}
172176

173-
template <typename Gate>
174-
std::vector<std::vector<qsim::OpString<Gate>>> GetObservables(
177+
template <typename FP>
178+
std::vector<std::vector<qsim::OpString<FP>>> GetObservables(
175179
unsigned num_qubits) {
176-
std::vector<std::vector<qsim::OpString<Gate>>> observables;
180+
std::vector<std::vector<qsim::OpString<FP>>> observables;
177181
observables.reserve(num_qubits);
178182

179-
using X = qsim::GateX<typename Gate::fp_type>;
183+
using X = qsim::GateX<FP>;
180184

181185
for (unsigned q = 0; q < num_qubits; ++q) {
182186
observables.push_back({{{1.0, 0.0}, {X::Create(0, q)}}});
@@ -210,18 +214,16 @@ int main(int argc, char* argv[]) {
210214
using Simulator = Factory::Simulator;
211215
using StateSpace = Simulator::StateSpace;
212216
using State = StateSpace::State;
213-
using Gate = GateQSim<fp_type>;
214-
using Fuser = MultiQubitGateFuser<IO, Gate>;
215-
using FuserQT = MultiQubitGateFuser<IO, const Gate*>;
216-
using RunnerQT = QSimRunner<IO, FuserQT, Factory>;
217-
using QTSimulator = QuantumTrajectorySimulator<IO, Gate, RunnerQT>;
217+
using Fuser = MultiQubitGateFuser<IO>;
218+
using Runner = QSimRunner<IO, Fuser, Factory>;
219+
using QTSimulator = QuantumTrajectorySimulator<IO, Runner>;
218220

219221
auto opt = GetOptions(argc, argv);
220222
if (!ValidateOptions(opt)) {
221223
return 1;
222224
}
223225

224-
Circuit<Gate> circuit;
226+
Circuit<Operation<fp_type>> circuit;
225227
unsigned maxtime = opt.times.back();
226228
if (!CircuitQsimParser<IOFile>::FromFile(maxtime, opt.circuit_file,
227229
circuit)) {
@@ -230,7 +232,7 @@ int main(int argc, char* argv[]) {
230232

231233
if (opt.times.size() == 1
232234
&& opt.times[0] == std::numeric_limits<unsigned>::max()) {
233-
opt.times[0] = circuit.gates.back().time;
235+
opt.times[0] = OpTime(circuit.ops.back());
234236
}
235237

236238
StateSpace::Parameter param1;
@@ -256,7 +258,7 @@ int main(int argc, char* argv[]) {
256258

257259
auto noisy_circuits = AddNoise(circuit, opt.times, channel1, channel2);
258260

259-
auto observables = GetObservables<Gate>(circuit.num_qubits);
261+
auto observables = GetObservables<fp_type>(circuit.num_qubits);
260262

261263
std::vector<std::vector<std::vector<std::complex<double>>>> results;
262264
results.reserve(opt.num_trajectories);

apps/qsim_von_neumann.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
#include "../lib/circuit_qsim_parser.h"
2525
#include "../lib/formux.h"
2626
#include "../lib/fuser_mqubit.h"
27-
#include "../lib/gates_qsim.h"
2827
#include "../lib/io_file.h"
28+
#include "../lib/operation.h"
2929
#include "../lib/run_qsim.h"
3030
#include "../lib/simmux.h"
3131
#include "../lib/util_cpu.h"
@@ -99,7 +99,7 @@ int main(int argc, char* argv[]) {
9999
return 1;
100100
}
101101

102-
Circuit<GateQSim<float>> circuit;
102+
Circuit<Operation<float>> circuit;
103103
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
104104
circuit)) {
105105
return 1;
@@ -129,7 +129,7 @@ int main(int argc, char* argv[]) {
129129
using Simulator = Factory::Simulator;
130130
using StateSpace = Simulator::StateSpace;
131131
using State = StateSpace::State;
132-
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
132+
using Fuser = MultiQubitGateFuser<IO>;
133133
using Runner = QSimRunner<IO, Fuser, Factory>;
134134

135135
auto measure = [&opt, &circuit](

apps/qsimh_amplitudes.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#include "../lib/circuit_qsim_parser.h"
2626
#include "../lib/formux.h"
2727
#include "../lib/fuser_basic.h"
28-
#include "../lib/gates_qsim.h"
2928
#include "../lib/io_file.h"
29+
#include "../lib/operation.h"
3030
#include "../lib/run_qsimh.h"
3131
#include "../lib/simmux.h"
3232
#include "../lib/util.h"
@@ -174,7 +174,7 @@ int main(int argc, char* argv[]) {
174174
return 1;
175175
}
176176

177-
Circuit<GateQSim<float>> circuit;
177+
Circuit<Operation<float>> circuit;
178178
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
179179
circuit)) {
180180
return 1;
@@ -213,9 +213,9 @@ int main(int argc, char* argv[]) {
213213
unsigned num_threads;
214214
};
215215

216-
using HybridSimulator = HybridSimulator<IO, GateQSim<float>, BasicGateFuser,
217-
For>;
218-
using Runner = QSimHRunner<IO, HybridSimulator>;
216+
using Fuser = BasicGateFuser<IO>;
217+
using HybridSimulator = HybridSimulator<IO, For>;
218+
using Runner = QSimHRunner<IO, Fuser, HybridSimulator>;
219219

220220
Runner::Parameter param;
221221
param.prefix = opt.prefix;

0 commit comments

Comments
 (0)