Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions apps/qsim_amplitudes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsim.h"
#include "../lib/simmux.h"
#include "../lib/util.h"
Expand Down Expand Up @@ -160,7 +160,7 @@ int main(int argc, char* argv[]) {
return 1;
}

Circuit<GateQSim<float>> circuit;
Circuit<Operation<float>> circuit;
unsigned maxtime = opt.times.back();
if (!CircuitQsimParser<IOFile>::FromFile(maxtime, opt.circuit_file,
circuit)) {
Expand Down Expand Up @@ -191,7 +191,7 @@ int main(int argc, char* argv[]) {
using Simulator = Factory::Simulator;
using StateSpace = Simulator::StateSpace;
using State = StateSpace::State;
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
using Fuser = MultiQubitGateFuser<IO>;
using Runner = QSimRunner<IO, Fuser, Factory>;

auto measure = [&opt, &circuit](
Expand Down
6 changes: 3 additions & 3 deletions apps/qsim_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsim.h"
#include "../lib/simmux.h"
#include "../lib/util_cpu.h"
Expand Down Expand Up @@ -114,7 +114,7 @@ int main(int argc, char* argv[]) {
return 1;
}

Circuit<GateQSim<float>> circuit;
Circuit<Operation<float>> circuit;
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
circuit)) {
return 1;
Expand Down Expand Up @@ -144,7 +144,7 @@ int main(int argc, char* argv[]) {
using Simulator = Factory::Simulator;
using StateSpace = Simulator::StateSpace;
using State = StateSpace::State;
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
using Fuser = MultiQubitGateFuser<IO>;
using Runner = QSimRunner<IO, Fuser, Factory>;

StateSpace state_space = Factory(opt.num_threads).CreateStateSpace();
Expand Down
6 changes: 3 additions & 3 deletions apps/qsim_base_cuda.cu
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsim.h"
#include "../lib/simulator_cuda.h"

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

using fp_type = float;

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

StateSpace::Parameter param1;
Expand Down
6 changes: 3 additions & 3 deletions apps/qsim_base_custatevec.cu
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsim.h"
#include "../lib/simulator_custatevec.h"
#include "../lib/util_custatevec.h"
Expand Down Expand Up @@ -108,7 +108,7 @@ int main(int argc, char* argv[]) {

using fp_type = float;

Circuit<GateQSim<fp_type>> circuit;
Circuit<Operation<fp_type>> circuit;
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
circuit)) {
return 1;
Expand Down Expand Up @@ -143,7 +143,7 @@ int main(int argc, char* argv[]) {
using Simulator = Factory::Simulator;
using StateSpace = Simulator::StateSpace;
using State = StateSpace::State;
using Fuser = MultiQubitGateFuser<IO, GateQSim<fp_type>>;
using Fuser = MultiQubitGateFuser<IO>;
using Runner = QSimRunner<IO, Fuser, Factory>;

Factory factory;
Expand Down
4 changes: 2 additions & 2 deletions apps/qsim_base_custatevecex.cu
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@

#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/multiprocess_custatevecex.h"
#include "../lib/operation.h"
#include "../lib/run_custatevecex.h"
#include "../lib/simulator_custatevecex.h"
#include "../lib/util_custatevec.h"
Expand Down Expand Up @@ -106,7 +106,7 @@ int main(int argc, char* argv[]) {

using fp_type = float;

Circuit<GateQSim<fp_type>> circuit;
Circuit<Operation<fp_type>> circuit;
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
circuit)) {
return 1;
Expand Down
72 changes: 37 additions & 35 deletions apps/qsim_qtrajectory_cuda.cu
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/expect.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/qtrajectory.h"
#include "../lib/run_qsim.h"
#include "../lib/simulator_cuda.h"
Expand All @@ -44,10 +44,10 @@ struct Options {
unsigned verbosity = 0;
};

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

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

while ((k = getopt(argc, argv, "c:d:a:p:t:n:f:v:")) != -1) {
while ((k = getopt(argc, argv, "c:d:a:p:0:n:f:v:")) != -1) {
switch (k) {
case 'c':
opt.circuit_file = optarg;
Expand All @@ -73,7 +73,7 @@ Options GetOptions(int argc, char* argv[]) {
case 'p':
opt.phase_damp_const = std::atof(optarg);
break;
case 't':
case '0':
opt.traj0 = std::atoi(optarg);
break;
case 'n':
Expand All @@ -85,7 +85,6 @@ Options GetOptions(int argc, char* argv[]) {
case 'v':
opt.verbosity = std::atoi(optarg);
break;
break;
default:
qsim::IO::errorf(usage);
exit(1);
Expand Down Expand Up @@ -120,47 +119,52 @@ bool ValidateOptions(const Options& opt) {
return true;
}

template <typename Gate, typename Channel1, typename Channel2>
std::vector<qsim::NoisyCircuit<Gate>> AddNoise(
const qsim::Circuit<Gate>& circuit, const std::vector<unsigned>& times,
template <typename FP, typename Channel1, typename Channel2>
std::vector<qsim::Circuit<qsim::Operation<FP>>> AddNoise(
const qsim::Circuit<qsim::Operation<FP>>& circuit,
const std::vector<unsigned>& times,
const Channel1& channel1, const Channel2& channel2) {
std::vector<qsim::NoisyCircuit<Gate>> ncircuits;
std::vector<qsim::Circuit<qsim::Operation<FP>>> ncircuits;
ncircuits.reserve(times.size());

qsim::NoisyCircuit<Gate> ncircuit;
qsim::Circuit<qsim::Operation<FP>> ncircuit;

ncircuit.num_qubits = circuit.num_qubits;
ncircuit.channels.reserve(5 * circuit.gates.size());
ncircuit.ops.reserve(5 * circuit.ops.size());

unsigned cur_time_index = 0;

for (std::size_t i = 0; i < circuit.gates.size(); ++i) {
const auto& gate = circuit.gates[i];
for (std::size_t i = 0; i < circuit.ops.size(); ++i) {
const auto& op = circuit.ops[i];

unsigned time = OpTime(op);
const auto& qubits = OpQubits(op);

ncircuit.channels.push_back(qsim::MakeChannelFromGate(3 * gate.time, gate));
ncircuit.ops.push_back(op);
OpBaseOperation(ncircuit.ops.back()).time = 3 * time;

for (auto q : gate.qubits) {
ncircuit.channels.push_back(channel1.Create(3 * gate.time + 1, q));
for (auto q : qubits) {
ncircuit.ops.push_back(channel1.Create(3 * time + 1, q));
}

for (auto q : gate.qubits) {
ncircuit.channels.push_back(channel2.Create(3 * gate.time + 2, q));
for (auto q : qubits) {
ncircuit.ops.push_back(channel2.Create(3 * time + 2, q));
}
Comment thread
sergeisakov marked this conversation as resolved.

unsigned t = times[cur_time_index];

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

ncircuit = {};

if (i < circuit.gates.size() - 1) {
if (circuit.gates[i + 1].time > times.back()) {
if (i < circuit.ops.size() - 1) {
if (OpTime(circuit.ops[i + 1]) > times.back()) {
break;
}

ncircuit.num_qubits = circuit.num_qubits;
ncircuit.channels.reserve(5 * circuit.gates.size());
ncircuit.ops.reserve(5 * circuit.ops.size());
}

++cur_time_index;
Expand All @@ -170,13 +174,13 @@ std::vector<qsim::NoisyCircuit<Gate>> AddNoise(
return ncircuits;
}

template <typename Gate>
std::vector<std::vector<qsim::OpString<Gate>>> GetObservables(
template <typename FP>
std::vector<std::vector<qsim::OpString<FP>>> GetObservables(
unsigned num_qubits) {
std::vector<std::vector<qsim::OpString<Gate>>> observables;
std::vector<std::vector<qsim::OpString<FP>>> observables;
observables.reserve(num_qubits);

using X = qsim::GateX<typename Gate::fp_type>;
using X = qsim::GateX<FP>;

for (unsigned q = 0; q < num_qubits; ++q) {
observables.push_back({{{1.0, 0.0}, {X::Create(0, q)}}});
Expand Down Expand Up @@ -210,18 +214,16 @@ int main(int argc, char* argv[]) {
using Simulator = Factory::Simulator;
using StateSpace = Simulator::StateSpace;
using State = StateSpace::State;
using Gate = GateQSim<fp_type>;
using Fuser = MultiQubitGateFuser<IO, Gate>;
using FuserQT = MultiQubitGateFuser<IO, const Gate*>;
using RunnerQT = QSimRunner<IO, FuserQT, Factory>;
using QTSimulator = QuantumTrajectorySimulator<IO, Gate, RunnerQT>;
using Fuser = MultiQubitGateFuser<IO>;
using Runner = QSimRunner<IO, Fuser, Factory>;
using QTSimulator = QuantumTrajectorySimulator<IO, Runner>;

auto opt = GetOptions(argc, argv);
if (!ValidateOptions(opt)) {
return 1;
}

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

if (opt.times.size() == 1
&& opt.times[0] == std::numeric_limits<unsigned>::max()) {
opt.times[0] = circuit.gates.back().time;
opt.times[0] = OpTime(circuit.ops.back());
}

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

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

auto observables = GetObservables<Gate>(circuit.num_qubits);
auto observables = GetObservables<fp_type>(circuit.num_qubits);

std::vector<std::vector<std::vector<std::complex<double>>>> results;
results.reserve(opt.num_trajectories);
Expand Down
6 changes: 3 additions & 3 deletions apps/qsim_von_neumann.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_mqubit.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsim.h"
#include "../lib/simmux.h"
#include "../lib/util_cpu.h"
Expand Down Expand Up @@ -99,7 +99,7 @@ int main(int argc, char* argv[]) {
return 1;
}

Circuit<GateQSim<float>> circuit;
Circuit<Operation<float>> circuit;
if (!CircuitQsimParser<IOFile>::FromFile(opt.maxtime, opt.circuit_file,
circuit)) {
return 1;
Expand Down Expand Up @@ -129,7 +129,7 @@ int main(int argc, char* argv[]) {
using Simulator = Factory::Simulator;
using StateSpace = Simulator::StateSpace;
using State = StateSpace::State;
using Fuser = MultiQubitGateFuser<IO, GateQSim<float>>;
using Fuser = MultiQubitGateFuser<IO>;
using Runner = QSimRunner<IO, Fuser, Factory>;

auto measure = [&opt, &circuit](
Expand Down
10 changes: 5 additions & 5 deletions apps/qsimh_amplitudes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
#include "../lib/circuit_qsim_parser.h"
#include "../lib/formux.h"
#include "../lib/fuser_basic.h"
#include "../lib/gates_qsim.h"
#include "../lib/io_file.h"
#include "../lib/operation.h"
#include "../lib/run_qsimh.h"
#include "../lib/simmux.h"
#include "../lib/util.h"
Expand Down Expand Up @@ -174,7 +174,7 @@ int main(int argc, char* argv[]) {
return 1;
}

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

using HybridSimulator = HybridSimulator<IO, GateQSim<float>, BasicGateFuser,
For>;
using Runner = QSimHRunner<IO, HybridSimulator>;
using Fuser = BasicGateFuser<IO>;
using HybridSimulator = HybridSimulator<IO, For>;
using Runner = QSimHRunner<IO, Fuser, HybridSimulator>;

Runner::Parameter param;
param.prefix = opt.prefix;
Expand Down
Loading
Loading