Loading lib/mirror_rb/clifford_gate_utils.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ Srep_t computeLayerSymplecticRepresentations(const CliffordGateLayer_t &layers, assert(iter != srep_dict.end()); const auto &[matrix, phase] = iter->second; const auto nforgate = operands.size(); assert(nforgate > 0); for (int ind1 = 0; ind1 < operands.size(); ++ind1) { const auto qindex1 = operands[ind1]; assert(seen_qubits.find(qindex1) == seen_qubits.end()); Loading Loading @@ -299,6 +300,10 @@ Srep_t computeCircuitSymplecticRepresentations( // Initilize Pvec_t p(2 * nQubits, 0); Smatrix_t s(2 * nQubits, p); // S must be initialized as an identity matrix for (int i = 0; i < 2 * nQubits; ++i) { s[i][i] = 1; } for (const auto &layer : layers) { const auto layerRep = computeLayerSymplecticRepresentations(layer, nQubits, srep_dict); Loading lib/mirror_rb/mirror_circuit_rb.cpp +10 −17 Original line number Diff line number Diff line Loading @@ -47,16 +47,16 @@ createMirrorCircuit(std::shared_ptr<CompositeInstruction> in_circuit) { const auto pauli = in_paulis[i]; switch (pauli) { case qcor::utils::PauliLabel::I: result.emplace_back(std::make_pair("I", i)); result.emplace_back(std::make_pair("I", std::vector<int>{i})); break; case qcor::utils::PauliLabel::X: result.emplace_back(std::make_pair("X", i)); result.emplace_back(std::make_pair("X", std::vector<int>{i})); break; case qcor::utils::PauliLabel::Y: result.emplace_back(std::make_pair("Y", i)); result.emplace_back(std::make_pair("Y", std::vector<int>{i})); break; case qcor::utils::PauliLabel::Z: result.emplace_back(std::make_pair("Z", i)); result.emplace_back(std::make_pair("Z", std::vector<int>{i})); break; default: __builtin_unreachable(); Loading Loading @@ -94,21 +94,14 @@ createMirrorCircuit(std::shared_ptr<CompositeInstruction> in_circuit) { const auto [theta1_inv, theta2_inv, theta3_inv] = qcor::utils::invU3Gate(u3_angles); const size_t qubit = gate->bits()[0]; in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta3_inv})); in_circuit->addInstruction( gateProvider->createInstruction("Rx", {qubit}, {M_PI / 2.0})); in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta2_inv})); in_circuit->addInstruction( gateProvider->createInstruction("Rx", {qubit}, {M_PI / 2.0})); in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta1_inv})); in_circuit->addInstruction(gateProvider->createInstruction( "U", {qubit}, {theta2_inv - M_PI, theta1_inv - 3.0 * M_PI, theta3_inv})); } } } for (int layer = 0; layer < d; ++layer) { const int newDepth = in_circuit->depth(); for (int layer = 0; layer < newDepth; ++layer) { auto current_layers = getLayer(in_circuit->as_xacc(), layer); // New random Pauli layer const std::vector<qcor::utils::PauliLabel> new_paulis = [](int nQubits) { Loading Loading
lib/mirror_rb/clifford_gate_utils.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,7 @@ Srep_t computeLayerSymplecticRepresentations(const CliffordGateLayer_t &layers, assert(iter != srep_dict.end()); const auto &[matrix, phase] = iter->second; const auto nforgate = operands.size(); assert(nforgate > 0); for (int ind1 = 0; ind1 < operands.size(); ++ind1) { const auto qindex1 = operands[ind1]; assert(seen_qubits.find(qindex1) == seen_qubits.end()); Loading Loading @@ -299,6 +300,10 @@ Srep_t computeCircuitSymplecticRepresentations( // Initilize Pvec_t p(2 * nQubits, 0); Smatrix_t s(2 * nQubits, p); // S must be initialized as an identity matrix for (int i = 0; i < 2 * nQubits; ++i) { s[i][i] = 1; } for (const auto &layer : layers) { const auto layerRep = computeLayerSymplecticRepresentations(layer, nQubits, srep_dict); Loading
lib/mirror_rb/mirror_circuit_rb.cpp +10 −17 Original line number Diff line number Diff line Loading @@ -47,16 +47,16 @@ createMirrorCircuit(std::shared_ptr<CompositeInstruction> in_circuit) { const auto pauli = in_paulis[i]; switch (pauli) { case qcor::utils::PauliLabel::I: result.emplace_back(std::make_pair("I", i)); result.emplace_back(std::make_pair("I", std::vector<int>{i})); break; case qcor::utils::PauliLabel::X: result.emplace_back(std::make_pair("X", i)); result.emplace_back(std::make_pair("X", std::vector<int>{i})); break; case qcor::utils::PauliLabel::Y: result.emplace_back(std::make_pair("Y", i)); result.emplace_back(std::make_pair("Y", std::vector<int>{i})); break; case qcor::utils::PauliLabel::Z: result.emplace_back(std::make_pair("Z", i)); result.emplace_back(std::make_pair("Z", std::vector<int>{i})); break; default: __builtin_unreachable(); Loading Loading @@ -94,21 +94,14 @@ createMirrorCircuit(std::shared_ptr<CompositeInstruction> in_circuit) { const auto [theta1_inv, theta2_inv, theta3_inv] = qcor::utils::invU3Gate(u3_angles); const size_t qubit = gate->bits()[0]; in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta3_inv})); in_circuit->addInstruction( gateProvider->createInstruction("Rx", {qubit}, {M_PI / 2.0})); in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta2_inv})); in_circuit->addInstruction( gateProvider->createInstruction("Rx", {qubit}, {M_PI / 2.0})); in_circuit->addInstruction( gateProvider->createInstruction("Rz", {qubit}, {theta1_inv})); in_circuit->addInstruction(gateProvider->createInstruction( "U", {qubit}, {theta2_inv - M_PI, theta1_inv - 3.0 * M_PI, theta3_inv})); } } } for (int layer = 0; layer < d; ++layer) { const int newDepth = in_circuit->depth(); for (int layer = 0; layer < newDepth; ++layer) { auto current_layers = getLayer(in_circuit->as_xacc(), layer); // New random Pauli layer const std::vector<qcor::utils::PauliLabel> new_paulis = [](int nQubits) { Loading