diff --git a/ccsrc/lib/simulator/stabilizer/stabilizer.cpp b/ccsrc/lib/simulator/stabilizer/stabilizer.cpp index ba2071ff78078d9c2ceec8af48364600c5955ac9..6f0d536fcced70e07a381c82acc702c17c49504f 100644 --- a/ccsrc/lib/simulator/stabilizer/stabilizer.cpp +++ b/ccsrc/lib/simulator/stabilizer/stabilizer.cpp @@ -216,7 +216,7 @@ int CalcG(size_t x1, size_t z1, size_t x2, size_t z2) { void StabilizerTableau::RowSum(size_t h, size_t i) { int r0 = 2 * (phase.GetBit(h) + phase.GetBit(i)); for (size_t j = 0; j < n_qubits; ++j) { - r0 = CalcG(GetElement(i, j), GetElement(i, j + n_qubits), GetElement(h, j), GetElement(h, j + n_qubits)); + r0 += CalcG(GetElement(i, j), GetElement(i, j + n_qubits), GetElement(h, j), GetElement(h, j + n_qubits)); table[j].SetBit(h, table[j].GetBit(h) ^ table[j].GetBit(i)); table[j + n_qubits].SetBit(h, table[j + n_qubits].GetBit(h) ^ table[j + n_qubits].GetBit(i)); } @@ -247,10 +247,10 @@ size_t StabilizerTableau::ApplyMeasurement(size_t a) { if (GetElement(i, a) == 1) { int r0 = 2 * (tail.GetBit(2 * n_qubits) + phase.GetBit(i + n_qubits)); for (size_t j = 0; j < n_qubits; ++j) { - r0 = CalcG(GetElement(i + n_qubits, j), GetElement(i + n_qubits, j + n_qubits), tail.GetBit(j), - tail.GetBit(j + n_qubits)); - tail.SetBit(j, tail.GetBit(j) ^ table[j].GetBit(i)); - tail.SetBit(j + n_qubits, tail.GetBit(j + n_qubits) ^ table[j + n_qubits].GetBit(i)); + r0 += CalcG(GetElement(i + n_qubits, j), GetElement(i + n_qubits, j + n_qubits), tail.GetBit(j), + tail.GetBit(j + n_qubits)); + tail.SetBit(j, tail.GetBit(j) ^ table[j].GetBit(i + n_qubits)); + tail.SetBit(j + n_qubits, tail.GetBit(j + n_qubits) ^ table[j + n_qubits].GetBit(i + n_qubits)); } tail.SetBit(2 * n_qubits, (((r0 % 4) + 4) % 4) / 2); } diff --git a/ccsrc/python/simulator/lib/_mq_vector.cpp b/ccsrc/python/simulator/lib/_mq_vector.cpp index fc1a2a9b85e9b7bc5005a7e4c1da7d4f9be06f5c..19e982bf77c3532e3e652d5d2826bd496a118521 100644 --- a/ccsrc/python/simulator/lib/_mq_vector.cpp +++ b/ccsrc/python/simulator/lib/_mq_vector.cpp @@ -91,7 +91,7 @@ PYBIND11_MODULE(_mq_vector, module) { #ifndef __CUDACC__ using namespace mindquantum::stabilizer; // NOLINT pybind11::class_(stabilizer, "StabilizerTableau") - .def(pybind11::init()) + .def(pybind11::init(), "n_qubits"_a, "seed"_a = 42) .def("copy", [](const StabilizerTableau& s) { return s; }) .def("tableau_to_string", &StabilizerTableau::TableauToString) .def("stabilizer_to_string", &StabilizerTableau::StabilizerToString) diff --git a/mindquantum/simulator/stabilizer.py b/mindquantum/simulator/stabilizer.py index a9a0fab65c080351bd321f23f921613da412a0ac..29ba249c49b43cbd207c72771350ecda6d9bc7cc 100644 --- a/mindquantum/simulator/stabilizer.py +++ b/mindquantum/simulator/stabilizer.py @@ -46,7 +46,7 @@ class Stabilizer(BackendBase): self.sim = name self.name = 'stabilizer' else: - self.sim = _mq_vector.stabilizer.StabilizerTableau(n_qubits) + self.sim = _mq_vector.stabilizer.StabilizerTableau(n_qubits, seed) def __str__(self): """Return a string representation of the object.""" diff --git a/tests/st/test_simulator/test_stabilizer.py b/tests/st/test_simulator/test_stabilizer.py index 612ea246709b2b011f856e9295166672d4b105a8..518a342d4962558adb86495c7b7bb1a2b6585ef0 100644 --- a/tests/st/test_simulator/test_stabilizer.py +++ b/tests/st/test_simulator/test_stabilizer.py @@ -90,6 +90,8 @@ def test_stabilizer_sampling(): sim = Simulator('stabilizer', clifford.n_qubits) res_clifford = sim.sampling(clifford, shots=10000) res_state_vector = Simulator('mqvector', clifford.n_qubits).sampling(clifford, shots=10000) - dis1 = np.array(list(res_clifford.data.values())) / res_clifford.shots - dis2 = np.array(list(res_state_vector.data.values())) / res_state_vector.shots + + keys = set(res_clifford.data.keys()) | set(res_state_vector.data.keys()) + dis1 = np.array([res_clifford.data.get(key, 0) for key in keys]) / res_clifford.shots + dis2 = np.array([res_state_vector.data.get(key, 0) for key in keys]) / res_state_vector.shots assert entropy(dis1, dis2) < 0.01