Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Agony5757 committed May 8, 2024
1 parent ead1584 commit f504eae
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 70 deletions.
122 changes: 62 additions & 60 deletions QPandaLiteCpp/Pybinder/QPandaLitePy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,37 +29,38 @@ PYBIND11_MODULE(QPandaLitePy, m)
.def_readonly("state", &qpandalite::Simulator::state)
.def("init_n_qubit", &qpandalite::Simulator::init_n_qubit)
.def("hadamard", &qpandalite::Simulator::hadamard, py::arg("qn"), py::arg("dagger") = false)
// .def("u22", &qpandalite::Simulator::u22, py::arg("qn"), py::arg("unitary"))
.def("u22", &qpandalite::Simulator::u22, py::arg("qn"), py::arg("unitary"), py::arg("dagger") = false)
.def("x", &qpandalite::Simulator::x, py::arg("qn"), py::arg("dagger") = false)
.def("sx", &qpandalite::Simulator::sx, py::arg("qn"), py::arg("dagger") = false)
.def("y", &qpandalite::Simulator::y, py::arg("qn"), py::arg("dagger") = false)
.def("z", &qpandalite::Simulator::z, py::arg("qn"), py::arg("dagger") = false)
.def("cz", &qpandalite::Simulator::cz, py::arg("qn1"), py::arg("qn2"), py::arg("is_dagger") = false)
// .def("iswap", &qpandalite::Simulator::iswap, py::arg("dagger") = false)
// .def("xy", &qpandalite::Simulator::xy, py::arg("dagger") = false)
.def("iswap", &qpandalite::Simulator::iswap, py::arg("qn1"), py::arg("qn2"), py::arg("dagger") = false)
.def("xy", &qpandalite::Simulator::xy, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("dagger") = false)
.def("cnot", &qpandalite::Simulator::cnot, py::arg("controller"), py::arg("target"), py::arg("is_dagger") = false)
.def("rx", &qpandalite::Simulator::rx, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
.def("ry", &qpandalite::Simulator::ry, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
.def("rz", &qpandalite::Simulator::rz, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
// .def("rphi90", &qpandalite::Simulator::rphi90, py::arg("dagger") = false)
// .def("rphi180", &qpandalite::Simulator::rphi180, py::arg("dagger") = false)
// .def("rphi", &qpandalite::Simulator::rphi, py::arg("dagger") = false)
// .def("hadamard_cont", &qpandalite::Simulator::hadamard_cont, py::arg("dagger") = false)
// .def("u22_cont", &qpandalite::Simulator::u22_cont, py::arg("dagger") = false)
// .def("x_cont", &qpandalite::Simulator::x_cont, py::arg("dagger") = false)
// .def("sx_cont", &qpandalite::Simulator::sx_cont, py::arg("dagger") = false)
// .def("y_cont", &qpandalite::Simulator::y_cont, py::arg("dagger") = false)
// .def("z_cont", &qpandalite::Simulator::z_cont, py::arg("dagger") = false)
// .def("cz_cont", &qpandalite::Simulator::cz_cont, py::arg("dagger") = false)
// .def("iswap_cont", &qpandalite::Simulator::iswap_cont, py::arg("dagger") = false)
// .def("xy_cont", &qpandalite::Simulator::xy_cont, py::arg("dagger") = false)
// .def("cnot_cont", &qpandalite::Simulator::cnot_cont, py::arg("dagger") = false)
// .def("rx_cont", &qpandalite::Simulator::rx_cont, py::arg("dagger") = false)
// .def("ry_cont", &qpandalite::Simulator::ry_cont, py::arg("dagger") = false)
// .def("rz_cont", &qpandalite::Simulator::rz_cont, py::arg("dagger") = false)
// .def("rphi90_cont", &qpandalite::Simulator::rphi90_cont, py::arg("dagger") = false)
// .def("rphi180_cont", &qpandalite::Simulator::rphi180_cont, py::arg("dagger") = false)
// .def("rphi_cont", &qpandalite::Simulator::rphi_cont, py::arg("dagger") = false)
.def("rphi90", &qpandalite::Simulator::rphi90, py::arg("qn"), py::arg("phi"), py::arg("dagger") = false)
.def("rphi180", &qpandalite::Simulator::rphi180, py::arg("qn"), py::arg("phi"), py::arg("dagger") = false)
.def("rphi", &qpandalite::Simulator::rphi, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("dagger") = false)

.def("hadamard_cont", &qpandalite::Simulator::hadamard_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("u22_cont", &qpandalite::Simulator::u22_cont, py::arg("qn"), py::arg("unitary"), py::arg("global_controller"), py::arg("dagger") = false)
.def("x_cont", &qpandalite::Simulator::x_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("sx_cont", &qpandalite::Simulator::sx_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("y_cont", &qpandalite::Simulator::y_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("z_cont", &qpandalite::Simulator::z_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("cz_cont", &qpandalite::Simulator::cz_cont, py::arg("qn1"), py::arg("qn2"), py::arg("global_controller"), py::arg("dagger") = false)
.def("iswap_cont", &qpandalite::Simulator::iswap_cont, py::arg("qn1"), py::arg("qn2"), py::arg("global_controller"), py::arg("dagger") = false)
.def("xy_cont", &qpandalite::Simulator::xy_cont, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("cnot_cont", &qpandalite::Simulator::cnot_cont, py::arg("controller"), py::arg("target"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rx_cont", &qpandalite::Simulator::rx_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("ry_cont", &qpandalite::Simulator::ry_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rz_cont", &qpandalite::Simulator::rz_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi90_cont", &qpandalite::Simulator::rphi90_cont, py::arg("qn"), py::arg("phi"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi180_cont", &qpandalite::Simulator::rphi180_cont, py::arg("qn"), py::arg("phi"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi_cont", &qpandalite::Simulator::rphi_cont, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("get_prob", &qpandalite::Simulator::get_prob)
.def("get_prob", &qpandalite::Simulator::get_prob_map)
.def("pmeasure", &qpandalite::Simulator::pmeasure)
Expand Down Expand Up @@ -116,41 +117,42 @@ PYBIND11_MODULE(QPandaLitePy, m)
.def_readonly("measurement_error_matrices", &qpandalite::NoisySimulator::measurement_error_matrices)
.def("load_opcode", &qpandalite::NoisySimulator::load_opcode)
.def("insert_error", &qpandalite::NoisySimulator::insert_error)
.def("get_measure_no_readout_error", &qpandalite::NoisySimulator::get_measure_no_readout_error)
.def("get_measure", &qpandalite::NoisySimulator::get_measure)

.def("hadamard", &qpandalite::NoisySimulator::hadamard, py::arg("qn"), py::arg("is_dagger") = false)
.def("u22", &qpandalite::NoisySimulator::u22, py::arg("qn"), py::arg("u22"), py::arg("is_dagger") = false)
.def("x", &qpandalite::NoisySimulator::x, py::arg("qn"), py::arg("is_dagger") = false)
.def("sx", &qpandalite::NoisySimulator::sx, py::arg("qn"), py::arg("is_dagger") = false)
.def("y", &qpandalite::NoisySimulator::y, py::arg("qn"), py::arg("is_dagger") = false)
.def("z", &qpandalite::NoisySimulator::z, py::arg("qn"), py::arg("is_dagger") = false)
.def("hadamard", &qpandalite::NoisySimulator::hadamard, py::arg("qn"), py::arg("dagger") = false)
.def("u22", &qpandalite::NoisySimulator::u22, py::arg("qn"), py::arg("unitary"), py::arg("dagger") = false)
.def("x", &qpandalite::NoisySimulator::x, py::arg("qn"), py::arg("dagger") = false)
.def("sx", &qpandalite::NoisySimulator::sx, py::arg("qn"), py::arg("dagger") = false)
.def("y", &qpandalite::NoisySimulator::y, py::arg("qn"), py::arg("dagger") = false)
.def("z", &qpandalite::NoisySimulator::z, py::arg("qn"), py::arg("dagger") = false)
.def("cz", &qpandalite::NoisySimulator::cz, py::arg("qn1"), py::arg("qn2"), py::arg("is_dagger") = false)
.def("iswap", &qpandalite::NoisySimulator::iswap, py::arg("qn1"), py::arg("qn2"), py::arg("is_dagger") = false)
.def("xy", &qpandalite::NoisySimulator::xy, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("is_dagger") = false)
.def("cnot", &qpandalite::NoisySimulator::cnot, py::arg("controller"), py::arg("target"), py::arg("is_dagger") = false)
.def("rx", &qpandalite::NoisySimulator::rx, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
.def("ry", &qpandalite::NoisySimulator::ry, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
.def("rz", &qpandalite::NoisySimulator::rz, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
.def("rphi90", &qpandalite::NoisySimulator::rphi90, py::arg("qn"), py::arg("phi"), py::arg("is_dagger") = false)
.def("rphi180", &qpandalite::NoisySimulator::rphi180, py::arg("qn"), py::arg("phi"), py::arg("is_dagger") = false)
.def("rphi", &qpandalite::NoisySimulator::rphi, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("is_dagger") = false)
.def("measure_shots", &qpandalite::NoisySimulator::measure_shots, py::arg("measure_list"), py::arg("shots"))

//.def("hadamard_cont", &qpandalite::NoisySimulator::hadamard_cont, py::arg("qn"), py::arg("is_dagger") = false)
//.def("u22_cont", &qpandalite::NoisySimulator::u22_cont, py::arg("is_dagger") = false)
//.def("x_cont", &qpandalite::NoisySimulator::x_cont, py::arg("qn"), py::arg("is_dagger") = false)
//.def("sx_cont", &qpandalite::NoisySimulator::sx_cont, py::arg("qn"), py::arg("is_dagger") = false)
//.def("y_cont", &qpandalite::NoisySimulator::y_cont, py::arg("qn"), py::arg("is_dagger") = false)
//.def("z_cont", &qpandalite::NoisySimulator::z_cont, py::arg("qn"), py::arg("is_dagger") = false)
//.def("cz_cont", &qpandalite::NoisySimulator::cz_cont, py::arg("qn1"), py::arg("qn2"), py::arg("is_dagger") = false)
//.def("iswap_cont", &qpandalite::NoisySimulator::iswap_cont, py::arg("qn1"), py::arg("qn2"), py::arg("is_dagger") = false)
//.def("xy_cont", &qpandalite::NoisySimulator::xy_cont, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("is_dagger") = false)
//.def("cnot_cont", &qpandalite::NoisySimulator::cnot_cont, py::arg("controller"), py::arg("target"), py::arg("is_dagger") = false)
//.def("rx_cont", &qpandalite::NoisySimulator::rx_cont, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
//.def("ry_cont", &qpandalite::NoisySimulator::ry_cont, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
//.def("rz_cont", &qpandalite::NoisySimulator::rz_cont, py::arg("qn"), py::arg("theta"), py::arg("is_dagger") = false)
//.def("rphi90_cont", &qpandalite::NoisySimulator::rphi90_cont, py::arg("qn"), py::arg("phi"), py::arg("is_dagger") = false)
//.def("rphi180_cont", &qpandalite::NoisySimulator::rphi180_cont, py::arg("qn"), py::arg("phi"), py::arg("is_dagger") = false)
//.def("rphi_cont", &qpandalite::NoisySimulator::rphi_cont, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("is_dagger") = false)
.def("iswap", &qpandalite::NoisySimulator::iswap, py::arg("qn1"), py::arg("qn2"), py::arg("dagger") = false)
.def("xy", &qpandalite::NoisySimulator::xy, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("dagger") = false)
.def("cnot", &qpandalite::NoisySimulator::cnot, py::arg("controller"), py::arg("target"), py::arg("is_dagger") = false)
.def("rx", &qpandalite::NoisySimulator::rx, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
.def("ry", &qpandalite::NoisySimulator::ry, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
.def("rz", &qpandalite::NoisySimulator::rz, py::arg("qn"), py::arg("theta"), py::arg("dagger") = false)
.def("rphi90", &qpandalite::NoisySimulator::rphi90, py::arg("qn"), py::arg("phi"), py::arg("dagger") = false)
.def("rphi180", &qpandalite::NoisySimulator::rphi180, py::arg("qn"), py::arg("phi"), py::arg("dagger") = false)
.def("rphi", &qpandalite::NoisySimulator::rphi, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("dagger") = false)

.def("hadamard_cont", &qpandalite::NoisySimulator::hadamard_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("u22_cont", &qpandalite::NoisySimulator::u22_cont, py::arg("qn"), py::arg("unitary"), py::arg("global_controller"), py::arg("dagger") = false)
.def("x_cont", &qpandalite::NoisySimulator::x_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("sx_cont", &qpandalite::NoisySimulator::sx_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("y_cont", &qpandalite::NoisySimulator::y_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("z_cont", &qpandalite::NoisySimulator::z_cont, py::arg("qn"), py::arg("global_controller"), py::arg("dagger") = false)
.def("cz_cont", &qpandalite::NoisySimulator::cz_cont, py::arg("qn1"), py::arg("qn2"), py::arg("global_controller"), py::arg("dagger") = false)
.def("iswap_cont", &qpandalite::NoisySimulator::iswap_cont, py::arg("qn1"), py::arg("qn2"), py::arg("global_controller"), py::arg("dagger") = false)
.def("xy_cont", &qpandalite::NoisySimulator::xy_cont, py::arg("qn1"), py::arg("qn2"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("cnot_cont", &qpandalite::NoisySimulator::cnot_cont, py::arg("controller"), py::arg("target"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rx_cont", &qpandalite::NoisySimulator::rx_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("ry_cont", &qpandalite::NoisySimulator::ry_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rz_cont", &qpandalite::NoisySimulator::rz_cont, py::arg("qn"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi90_cont", &qpandalite::NoisySimulator::rphi90_cont, py::arg("qn"), py::arg("phi"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi180_cont", &qpandalite::NoisySimulator::rphi180_cont, py::arg("qn"), py::arg("phi"), py::arg("global_controller"), py::arg("dagger") = false)
.def("rphi_cont", &qpandalite::NoisySimulator::rphi_cont, py::arg("qn"), py::arg("phi"), py::arg("theta"), py::arg("global_controller"), py::arg("dagger") = false)
;

py::class_<qpandalite::NoisySimulator_GateDependent, qpandalite::NoisySimulator>(m, "NoisySimulator_GateDependent")
Expand All @@ -165,16 +167,16 @@ PYBIND11_MODULE(QPandaLitePy, m)
)
;

py::class_<qpandalite::NoisySimulator_GateErrorSpecific, qpandalite::NoisySimulator>(m, "NoisySimulator_GateErrorSpecific")
py::class_<qpandalite::NoisySimulator_GateSpecificError, qpandalite::NoisySimulator>(m, "NoisySimulator_GateSpecificError")
.def(py::init<size_t,
const std::map<std::string, double>&,
const qpandalite::NoisySimulator_GateErrorSpecific::GateError1q_Description_t&,
const qpandalite::NoisySimulator_GateErrorSpecific::GateError2q_Description_t&,
const qpandalite::NoisySimulator_GateSpecificError::GateError1q_Description_t&,
const qpandalite::NoisySimulator_GateSpecificError::GateError2q_Description_t&,
const std::vector<std::array<double, 2>>&>(),
py::arg("n_qubit"),
py::arg("noise_description") = std::map<std::string, double>{}, // Default empty map
py::arg("gate_error1q_description") = qpandalite::NoisySimulator_GateErrorSpecific::GateError1q_Description_t{}, // Default empty map
py::arg("gate_error2q_description") = qpandalite::NoisySimulator_GateErrorSpecific::GateError2q_Description_t{}, // Default empty map
py::arg("gate_error1q_description") = qpandalite::NoisySimulator_GateSpecificError::GateError1q_Description_t{}, // Default empty map
py::arg("gate_error2q_description") = qpandalite::NoisySimulator_GateSpecificError::GateError2q_Description_t{}, // Default empty map
py::arg("measurement_error") = std::vector<std::array<double, 2>>{} // Default empty vector
)
;
Expand Down
12 changes: 6 additions & 6 deletions QPandaLiteCpp/src/noisy_simulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -990,7 +990,7 @@ namespace qpandalite {
}
}

NoisySimulator_GateErrorSpecific::NoisySimulator_GateErrorSpecific(size_t n_qubit,
NoisySimulator_GateSpecificError::NoisySimulator_GateSpecificError(size_t n_qubit,
const std::map<std::string, double>& noise_description,
const GateError1q_Description_t& gate_error1q_description,
const GateError2q_Description_t& gate_error2q_description,
Expand All @@ -1001,7 +1001,7 @@ namespace qpandalite {
_load_gate_error2q(gate_error2q_description);
}

void NoisySimulator_GateErrorSpecific::_load_gate_error1q(const GateError1q_Description_t& gate_error_description)
void NoisySimulator_GateSpecificError::_load_gate_error1q(const GateError1q_Description_t& gate_error_description)
{
for (auto& [gate_qubit, noise_type] : gate_error_description)
{
Expand All @@ -1020,7 +1020,7 @@ namespace qpandalite {
}
}

void NoisySimulator_GateErrorSpecific::_load_gate_error2q(const GateError2q_Description_t& gate_error_description)
void NoisySimulator_GateSpecificError::_load_gate_error2q(const GateError2q_Description_t& gate_error_description)
{
for (auto& [gate_qubit, noise_type] : gate_error_description)
{
Expand All @@ -1039,7 +1039,7 @@ namespace qpandalite {
}
}

void NoisySimulator_GateErrorSpecific::insert_error(const std::vector<size_t>& qubits, SupportOperationType gateType)
void NoisySimulator_GateSpecificError::insert_error(const std::vector<size_t>& qubits, SupportOperationType gateType)
{
_insert_global_error(qubits);

Expand All @@ -1064,7 +1064,7 @@ namespace qpandalite {
}
}

void NoisySimulator_GateErrorSpecific::_insert_gate_error1q(SupportOperationType gateType, size_t qn)
void NoisySimulator_GateSpecificError::_insert_gate_error1q(SupportOperationType gateType, size_t qn)
{
if (gate_error1q.empty()) return;

Expand All @@ -1076,7 +1076,7 @@ namespace qpandalite {
}
}

void NoisySimulator_GateErrorSpecific::_insert_gate_error2q(SupportOperationType gateType, size_t qn1, size_t qn2)
void NoisySimulator_GateSpecificError::_insert_gate_error2q(SupportOperationType gateType, size_t qn1, size_t qn2)
{
if (gate_error2q.empty()) return;

Expand Down
4 changes: 2 additions & 2 deletions QPandaLiteCpp/src/noisy_simulator.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ namespace qpandalite {

};

struct NoisySimulator_GateErrorSpecific : public NoisySimulator
struct NoisySimulator_GateSpecificError : public NoisySimulator
{
using GateError1q_t = std::map<std::pair<SupportOperationType, size_t>, std::map<NoiseType, double>>;
using GateError2q_t = std::map<std::pair<SupportOperationType, std::pair<size_t, size_t>>, std::map<NoiseType, double>>;
Expand All @@ -271,7 +271,7 @@ namespace qpandalite {
GateError1q_t gate_error1q;
GateError2q_t gate_error2q;

NoisySimulator_GateErrorSpecific(size_t n_qubit,
NoisySimulator_GateSpecificError(size_t n_qubit,
const std::map<std::string, double>& noise_description,
const GateError1q_Description_t& gate_error1q_description,
const GateError2q_Description_t& gate_error2q_description,
Expand Down
2 changes: 1 addition & 1 deletion qpandalite/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ def change_working_directory(new_directory):
from .transpiler import plot_time_line
from .task.task_utils import (get_last_taskid, load_circuit, load_circuit_group, load_all_online_info)

from .test import run_test
from .test import run_test
16 changes: 15 additions & 1 deletion qpandalite/test/test_general.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
import qpandalite
import qpandalite.simulator as qsim

import numpy

def iswap_test():
sim = qsim.Simulator()
sim.init_n_qubit(3)
sim.sx(1)
sim.xy(0, 1)

print(sim.state)

def run_test_general():
pass
pass

if __name__ == '__main__':
iswap_test()

0 comments on commit f504eae

Please sign in to comment.