def test_3q_blocks(self): """blocks of more than 2 qubits work.""" # ┌────────┐ # qr_0: ──────┤ P(0.5) ├────────────■── # ┌─────┴────────┴────┐┌───┐┌─┴─┐ # qr_1: ┤ U(1.5708,0.2,0.6) ├┤ X ├┤ X ├ # └───────────────────┘└─┬─┘└───┘ # qr_2: ───────────────────────■─────── qr = QuantumRegister(3, "qr") qc = QuantumCircuit(qr) qc.p(0.5, qr[0]) qc.u(1.5708, 0.2, 0.6, qr[1]) qc.cx(qr[2], qr[1]) qc.cx(qr[0], qr[1]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set["block_list"] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) unitary = Operator(qc) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(Operator(new_dag.op_nodes()[0].op), unitary) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_block_spanning_two_regs(self): """blocks spanning wires on different quantum registers work.""" # ┌────────┐ # qr0: ──────┤ P(0.5) ├───────■── # ┌─────┴────────┴────┐┌─┴─┐ # qr1: ┤ U(1.5708,0.2,0.6) ├┤ X ├ # └───────────────────┘└───┘ qr0 = QuantumRegister(1, "qr0") qr1 = QuantumRegister(1, "qr1") qc = QuantumCircuit(qr0, qr1) qc.p(0.5, qr0[0]) qc.u(1.5708, 0.2, 0.6, qr1[0]) qc.cx(qr0[0], qr1[0]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set["block_list"] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) unitary = Operator(qc) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(Operator(new_dag.op_nodes()[0].op), unitary) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_two_qubit_kak(self): """Verify KAK decomposition for random Haar 4x4 unitaries. """ for _ in range(100): unitary = random_unitary(4) with self.subTest(unitary=unitary): decomp_circuit = two_qubit_kak(unitary) result = execute(decomp_circuit, UnitarySimulatorPy()).result() decomp_unitary = Unitary(result.get_unitary()) self.assertAlmostEqual(process_fidelity( unitary.representation, decomp_unitary.representation), 1.0, places=7)
def test_wire_order(self): """order of qubits and the corresponding unitary is correct""" qr = QuantumRegister(2, "qr") qc = QuantumCircuit(qr) qc.cx(qr[1], qr[0]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set["block_list"] = [dag.op_nodes()] new_dag = pass_.run(dag) new_node = new_dag.op_nodes()[0] self.assertEqual(new_node.qargs, [qr[0], qr[1]]) unitary = Operator(qc) fidelity = process_fidelity(Operator(new_node.op), unitary) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_consolidate_small_block(self): """test a small block of gates can be turned into a unitary on same wires""" qr = QuantumRegister(2, "qr") qc = QuantumCircuit(qr) qc.p(0.5, qr[0]) qc.u(1.5708, 0.2, 0.6, qr[1]) qc.cx(qr[0], qr[1]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set['block_list'] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) unitary = Operator(qc) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(Operator(new_dag.op_nodes()[0].op), unitary) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_wire_order(self): """order of qubits and the corresponding unitary is correct""" qr = QuantumRegister(2, "qr") qc = QuantumCircuit(qr) qc.cx(qr[1], qr[0]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks() pass_.property_set['block_list'] = [dag.op_nodes()] new_dag = pass_.run(dag) new_node = new_dag.op_nodes()[0] self.assertEqual(new_node.qargs, [qr[0], qr[1]]) # the canonical CNOT matrix occurs when the control is more # significant than target, which is the case here fidelity = process_fidelity( new_node.op.representation, np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_consolidate_small_block(self): """test a small block of gates can be turned into a unitary on same wires""" qr = QuantumRegister(2, "qr") qc = QuantumCircuit(qr) qc.u1(0.5, qr[0]) qc.u2(0.2, 0.6, qr[1]) qc.cx(qr[0], qr[1]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set['block_list'] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) sim = UnitarySimulatorPy() result = execute(qc, sim).result() unitary = UnitaryGate(result.get_unitary()) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(new_dag.op_nodes()[0].op.to_matrix(), unitary.to_matrix()) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_block_spanning_two_regs(self): """blocks spanning wires on different quantum registers work.""" qr0 = QuantumRegister(1, "qr0") qr1 = QuantumRegister(1, "qr1") qc = QuantumCircuit(qr0, qr1) qc.u1(0.5, qr0[0]) qc.u2(0.2, 0.6, qr1[0]) qc.cx(qr0[0], qr1[0]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set['block_list'] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) sim = UnitarySimulatorPy() result = execute(qc, sim).result() unitary = UnitaryGate(result.get_unitary()) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(new_dag.op_nodes()[0].op.to_matrix(), unitary.to_matrix()) self.assertAlmostEqual(fidelity, 1.0, places=7)
def test_3q_blocks(self): """blocks of more than 2 qubits work.""" qr = QuantumRegister(3, "qr") qc = QuantumCircuit(qr) qc.u1(0.5, qr[0]) qc.u2(0.2, 0.6, qr[1]) qc.cx(qr[2], qr[1]) qc.cx(qr[0], qr[1]) dag = circuit_to_dag(qc) pass_ = ConsolidateBlocks(force_consolidate=True) pass_.property_set['block_list'] = [list(dag.topological_op_nodes())] new_dag = pass_.run(dag) sim = UnitarySimulatorPy() result = execute(qc, sim).result() unitary = UnitaryGate(result.get_unitary()) self.assertEqual(len(new_dag.op_nodes()), 1) fidelity = process_fidelity(new_dag.op_nodes()[0].op.to_matrix(), unitary.to_matrix()) self.assertAlmostEqual(fidelity, 1.0, places=7)