def test_objective_function(self): """Test if ``objective`` functions priorities metrics correctly.""" qc = QuantumCircuit(4) qc.dcx(0, 1) qc.cx(2, 3) qc.dcx(0, 2) qc.cx(1, 3) qc.dcx(0, 1) qc.cx(2, 3) coupling = CouplingMap(FakeLima().configuration().coupling_map) dep_opt = BIPMapping(coupling, objective="depth", qubit_subset=[0, 1, 3, 4])(qc) err_opt = BIPMapping( coupling, objective="gate_error", qubit_subset=[0, 1, 3, 4], backend_prop=FakeLima().properties(), )(qc) # depth = number of su4 layers (mirrored gates have to be consolidated as single su4 gates) pm_ = PassManager( [Collect2qBlocks(), ConsolidateBlocks(basis_gates=["cx"])]) dep_opt = pm_.run(dep_opt) err_opt = pm_.run(err_opt) self.assertLessEqual(dep_opt.depth(), err_opt.depth()) # count CNOTs after synthesized dep_opt = UnitarySynthesis(basis_gates=["cx"])(dep_opt) err_opt = UnitarySynthesis(basis_gates=["cx"])(err_opt) self.assertGreater(dep_opt.count_ops()["cx"], err_opt.count_ops()["cx"])
def test_swaps_in_dummy_steps(self): """Test the case when swaps are inserted in dummy steps.""" circuit = QuantumCircuit(4) circuit.cx(0, 1) circuit.cx(2, 3) circuit.h([0, 1, 2, 3]) circuit.barrier() circuit.cx(0, 3) circuit.cx(1, 2) circuit.barrier() circuit.cx(0, 2) circuit.cx(1, 3) coupling = CouplingMap.from_line(4) property_set = {} actual = BIPMapping(coupling, objective="depth")(circuit, property_set) self.assertEqual(7, actual.depth()) CheckMap(coupling)(actual, property_set) self.assertTrue(property_set["is_swap_mapped"]) # no swaps before the first barrier for inst, _, _ in actual.data: if isinstance(inst, Barrier): break self.assertFalse(isinstance(inst, SwapGate))
def test_no_swap_multi_layer(self): """Can find the best layout for a circuit with multiple layers.""" coupling = CouplingMap([[0, 1], [1, 2], [2, 3]]) qr = QuantumRegister(4, name="qr") circuit = QuantumCircuit(qr) circuit.cx(qr[1], qr[0]) circuit.cx(qr[0], qr[3]) property_set = {} actual = BIPMapping(coupling, objective="depth")(circuit, property_set) self.assertEqual(2, actual.depth()) CheckMap(coupling)(actual, property_set) self.assertTrue(property_set["is_swap_mapped"])
def test_multi_cregs(self): """Test for multiple ClassicalRegisters.""" # ┌───┐ ░ ┌─┐ # qr_0: ──■────────────┤ X ├─░─┤M├───────── # ┌─┴─┐ ┌───┐└─┬─┘ ░ └╥┘┌─┐ # qr_1: ┤ X ├──■──┤ H ├──■───░──╫─┤M├────── # └───┘┌─┴─┐└───┘ ░ ║ └╥┘┌─┐ # qr_2: ──■──┤ X ├───────────░──╫──╫─┤M├─── # ┌─┴─┐└───┘ ░ ║ ║ └╥┘┌─┐ # qr_3: ┤ X ├────────────────░──╫──╫──╫─┤M├ # └───┘ ░ ║ ║ ║ └╥┘ # c: 2/════════════════════════╩══╬══╩══╬═ # 0 ║ 1 ║ # ║ ║ # d: 2/═══════════════════════════╩═════╩═ # 0 1 qr = QuantumRegister(4, "qr") cr1 = ClassicalRegister(2, "c") cr2 = ClassicalRegister(2, "d") circuit = QuantumCircuit(qr, cr1, cr2) circuit.cx(qr[0], qr[1]) circuit.cx(qr[2], qr[3]) circuit.cx(qr[1], qr[2]) circuit.h(qr[1]) circuit.cx(qr[1], qr[0]) circuit.barrier(qr) circuit.measure(qr[0], cr1[0]) circuit.measure(qr[1], cr2[0]) circuit.measure(qr[2], cr1[1]) circuit.measure(qr[3], cr2[1]) coupling = CouplingMap([[0, 1], [0, 2], [2, 3]]) # linear [1, 0, 2, 3] property_set = {} actual = BIPMapping(coupling, objective="depth")(circuit, property_set) self.assertEqual(5, actual.depth()) CheckMap(coupling)(actual, property_set) self.assertTrue(property_set["is_swap_mapped"])
def test_multi_cregs(self): """Test for multiple ClassicalRegisters.""" qr = QuantumRegister(4, "qr") cr1 = ClassicalRegister(2, "c") cr2 = ClassicalRegister(2, "d") circuit = QuantumCircuit(qr, cr1, cr2) circuit.cx(qr[0], qr[1]) circuit.cx(qr[2], qr[3]) circuit.cx(qr[1], qr[2]) circuit.h(qr[1]) circuit.cx(qr[1], qr[0]) circuit.barrier(qr) circuit.measure(qr[0], cr1[0]) circuit.measure(qr[1], cr2[0]) circuit.measure(qr[2], cr1[1]) circuit.measure(qr[3], cr2[1]) coupling = CouplingMap([[0, 1], [0, 2], [2, 3]]) # linear [1, 0, 2, 3] property_set = {} actual = BIPMapping(coupling, objective="depth")(circuit, property_set) self.assertEqual(5, actual.depth()) CheckMap(coupling)(actual, property_set) self.assertTrue(property_set["is_swap_mapped"])
def test_swaps_in_dummy_steps(self): """Test the case when swaps are inserted in dummy steps.""" # ┌───┐ ░ ░ # q_0: ──■──┤ H ├─░───■────────░───■─────── # ┌─┴─┐├───┤ ░ │ ░ │ # q_1: ┤ X ├┤ H ├─░───┼────■───░───┼────■── # └───┘├───┤ ░ │ ┌─┴─┐ ░ ┌─┴─┐ │ # q_2: ──■──┤ H ├─░───┼──┤ X ├─░─┤ X ├──┼── # ┌─┴─┐├───┤ ░ ┌─┴─┐└───┘ ░ └───┘┌─┴─┐ # q_3: ┤ X ├┤ H ├─░─┤ X ├──────░──────┤ X ├ # └───┘└───┘ ░ └───┘ ░ └───┘ circuit = QuantumCircuit(4) circuit.cx(0, 1) circuit.cx(2, 3) circuit.h([0, 1, 2, 3]) circuit.barrier() circuit.cx(0, 3) circuit.cx(1, 2) circuit.barrier() circuit.cx(0, 2) circuit.cx(1, 3) coupling = CouplingMap.from_line(4) property_set = {} actual = BIPMapping(coupling, objective="depth")(circuit, property_set) self.assertEqual(7, actual.depth()) CheckMap(coupling)(actual, property_set) self.assertTrue(property_set["is_swap_mapped"]) # no swaps before the first barrier for inst, _, _ in actual.data: if isinstance(inst, Barrier): break self.assertFalse(isinstance(inst, SwapGate))