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
5353Options 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 );
0 commit comments