def test_trivial_layout(self, level): """Test that trivial layout is preferred in level 0 and 1 See: https://github.com/Qiskit/qiskit-terra/pull/3657#pullrequestreview-342012465 """ qr = QuantumRegister(10, 'qr') qc = QuantumCircuit(qr) qc.cx(qr[0], qr[1]) qc.cx(qr[1], qr[2]) qc.cx(qr[2], qr[6]) qc.cx(qr[3], qr[8]) qc.cx(qr[4], qr[9]) qc.cx(qr[9], qr[8]) qc.cx(qr[8], qr[7]) qc.cx(qr[7], qr[6]) qc.cx(qr[6], qr[5]) qc.cx(qr[5], qr[0]) ancilla = QuantumRegister(10, 'ancilla') trivial_layout = {0: qr[0], 1: qr[1], 2: qr[2], 3: qr[3], 4: qr[4], 5: qr[5], 6: qr[6], 7: qr[7], 8: qr[8], 9: qr[9], 10: ancilla[0], 11: ancilla[1], 12: ancilla[2], 13: ancilla[3], 14: ancilla[4], 15: ancilla[5], 16: ancilla[6], 17: ancilla[7], 18: ancilla[8], 19: ancilla[9]} expected_layouts = [trivial_layout, trivial_layout] backend = FakeTokyo() result = transpile(qc, backend, optimization_level=level, seed_transpiler=42) self.assertEqual(result._layout._p2v, expected_layouts[level])
def test_initial_layout(self, level): """When a user provides a layout (initial_layout), it should be used. """ qr = QuantumRegister(10, 'qr') qc = QuantumCircuit(qr) qc.cx(qr[0], qr[1]) qc.cx(qr[1], qr[2]) qc.cx(qr[2], qr[3]) qc.cx(qr[3], qr[9]) qc.cx(qr[4], qr[9]) qc.cx(qr[9], qr[8]) qc.cx(qr[8], qr[7]) qc.cx(qr[7], qr[6]) qc.cx(qr[6], qr[5]) qc.cx(qr[5], qr[0]) initial_layout = {0: qr[0], 2: qr[1], 4: qr[2], 6: qr[3], 8: qr[4], 10: qr[5], 12: qr[6], 14: qr[7], 16: qr[8], 18: qr[9]} backend = FakeTokyo() result = transpile(qc, backend, optimization_level=level, initial_layout=initial_layout, seed_transpiler=42) for physical, virtual in initial_layout.items(): self.assertEqual(result._layout._p2v[physical], virtual)
def test_all_levels_use_trivial_if_perfect(self, level): """Test that we always use trivial if it's a perfect match. See: https://github.com/Qiskit/qiskit-terra/issues/5694 for more details """ backend = FakeTokyo() config = backend.configuration() rows = [x[0] for x in config.coupling_map] cols = [x[1] for x in config.coupling_map] adjacency_matrix = np.zeros((20, 20)) adjacency_matrix[rows, cols] = 1 qc = GraphState(adjacency_matrix) qc.measure_all() expected = { 0: Qubit(QuantumRegister(20, "q"), 0), 1: Qubit(QuantumRegister(20, "q"), 1), 2: Qubit(QuantumRegister(20, "q"), 2), 3: Qubit(QuantumRegister(20, "q"), 3), 4: Qubit(QuantumRegister(20, "q"), 4), 5: Qubit(QuantumRegister(20, "q"), 5), 6: Qubit(QuantumRegister(20, "q"), 6), 7: Qubit(QuantumRegister(20, "q"), 7), 8: Qubit(QuantumRegister(20, "q"), 8), 9: Qubit(QuantumRegister(20, "q"), 9), 10: Qubit(QuantumRegister(20, "q"), 10), 11: Qubit(QuantumRegister(20, "q"), 11), 12: Qubit(QuantumRegister(20, "q"), 12), 13: Qubit(QuantumRegister(20, "q"), 13), 14: Qubit(QuantumRegister(20, "q"), 14), 15: Qubit(QuantumRegister(20, "q"), 15), 16: Qubit(QuantumRegister(20, "q"), 16), 17: Qubit(QuantumRegister(20, "q"), 17), 18: Qubit(QuantumRegister(20, "q"), 18), 19: Qubit(QuantumRegister(20, "q"), 19), } trans_qc = transpile(qc, backend, optimization_level=level, seed_transpiler=42) self.assertEqual(trans_qc._layout._p2v, expected)
def test_optimization_level(self): """Test several backends with all optimization levels""" for backend in [FakeTenerife(), FakeMelbourne(), FakeRueschlikon(), FakeTokyo()]: for optimization_level in range(4): result = transpile( [self._circuit], backend=backend, optimization_level=optimization_level ) self.assertIsInstance(result, QuantumCircuit)
def test_call_limit(self): """Hard to solve situations hit the call limit""" dag = TestCSPLayout.create_hard_dag() coupling_map = CouplingMap(FakeTokyo().configuration().coupling_map) pass_ = CSPLayout(coupling_map, call_limit=1, time_limit=None) start = process_time() pass_.run(dag) runtime = process_time() - start self.assertLess(runtime, 1) self.assertEqual(pass_.property_set['CSPLayout_stop_reason'], 'call limit reached')
class TestTranspileLevels(QiskitTestCase): """Test transpiler on fake backend""" @combine(circuit=[emptycircuit, circuit_2532], level=[0, 1, 2, 3], backend=[FakeTenerife(), FakeMelbourne(), FakeRueschlikon(), FakeTokyo(), FakePoughkeepsie(), None], dsc='Transpiler {circuit.__name__} on {backend} backend at level {level}', name='{circuit.__name__}_{backend}_level{level}') def test(self, circuit, level, backend): """All the levels with all the backends""" result = transpile(circuit(), backend=backend, optimization_level=level, seed_transpiler=42) self.assertIsInstance(result, QuantumCircuit)
def test_layout_tokyo_2845(self, level): """Test that final layout in tokyo #2845 See: https://github.com/Qiskit/qiskit-terra/issues/2845 """ qr1 = QuantumRegister(3, 'qr1') qr2 = QuantumRegister(2, 'qr2') qc = QuantumCircuit(qr1, qr2) qc.cx(qr1[0], qr1[1]) qc.cx(qr1[1], qr1[2]) qc.cx(qr1[2], qr2[0]) qc.cx(qr2[0], qr2[1]) ancilla = QuantumRegister(15, 'ancilla') trivial_layout = {0: qr1[0], 1: qr1[1], 2: qr1[2], 3: qr2[0], 4: qr2[1], 5: ancilla[0], 6: ancilla[1], 7: ancilla[2], 8: ancilla[3], 9: ancilla[4], 10: ancilla[5], 11: ancilla[6], 12: ancilla[7], 13: ancilla[8], 14: ancilla[9], 15: ancilla[10], 16: ancilla[11], 17: ancilla[12], 18: ancilla[13], 19: ancilla[14]} dense_layout = {0: qr2[1], 1: qr1[2], 2: qr1[0], 3: ancilla[0], 4: ancilla[1], 5: qr2[0], 6: qr1[1], 7: ancilla[2], 8: ancilla[3], 9: ancilla[4], 10: ancilla[5], 11: ancilla[6], 12: ancilla[7], 13: ancilla[8], 14: ancilla[9], 15: ancilla[10], 16: ancilla[11], 17: ancilla[12], 18: ancilla[13], 19: ancilla[14]} csp_layout = {0: qr1[1], 1: qr1[2], 2: qr2[0], 5: qr1[0], 3: qr2[1], 4: ancilla[0], 6: ancilla[1], 7: ancilla[2], 8: ancilla[3], 9: ancilla[4], 10: ancilla[5], 11: ancilla[6], 12: ancilla[7], 13: ancilla[8], 14: ancilla[9], 15: ancilla[10], 16: ancilla[11], 17: ancilla[12], 18: ancilla[13], 19: ancilla[14]} # Trivial layout expected_layout_level0 = trivial_layout # Dense layout expected_layout_level1 = dense_layout # CSP layout expected_layout_level2 = csp_layout expected_layout_level3 = csp_layout expected_layouts = [expected_layout_level0, expected_layout_level1, expected_layout_level2, expected_layout_level3] backend = FakeTokyo() result = transpile(qc, backend, optimization_level=level, seed_transpiler=42) self.assertEqual(result._layout._p2v, expected_layouts[level])
def test_layout_tokyo_fully_connected_cx(self, level): """Test that final layout in tokyo in a fully connected circuit """ qr = QuantumRegister(5, 'qr') qc = QuantumCircuit(qr) for qubit_target in qr: for qubit_control in qr: if qubit_control != qubit_target: qc.cx(qubit_control, qubit_target) ancilla = QuantumRegister(15, 'ancilla') trivial_layout = {0: qr[0], 1: qr[1], 2: qr[2], 3: qr[3], 4: qr[4], 5: ancilla[0], 6: ancilla[1], 7: ancilla[2], 8: ancilla[3], 9: ancilla[4], 10: ancilla[5], 11: ancilla[6], 12: ancilla[7], 13: ancilla[8], 14: ancilla[9], 15: ancilla[10], 16: ancilla[11], 17: ancilla[12], 18: ancilla[13], 19: ancilla[14]} dense_layout = {2: qr[0], 6: qr[1], 1: qr[2], 5: qr[3], 0: qr[4], 3: ancilla[0], 4: ancilla[1], 7: ancilla[2], 8: ancilla[3], 9: ancilla[4], 10: ancilla[5], 11: ancilla[6], 12: ancilla[7], 13: ancilla[8], 14: ancilla[9], 15: ancilla[10], 16: ancilla[11], 17: ancilla[12], 18: ancilla[13], 19: ancilla[14]} expected_layout_level0 = trivial_layout expected_layout_level1 = dense_layout expected_layout_level2 = dense_layout expected_layout_level3 = dense_layout expected_layouts = [expected_layout_level0, expected_layout_level1, expected_layout_level2, expected_layout_level3] backend = FakeTokyo() result = transpile(qc, backend, optimization_level=level, seed_transpiler=42) self.assertEqual(result._layout._p2v, expected_layouts[level])
def test_layout_tokyo_2845(self, level): """Test that final layout in tokyo #2845 See: https://github.com/Qiskit/qiskit-terra/issues/2845 """ qr1 = QuantumRegister(3, 'qr1') qr2 = QuantumRegister(2, 'qr2') qc = QuantumCircuit(qr1, qr2) qc.cx(qr1[0], qr1[1]) qc.cx(qr1[1], qr1[2]) qc.cx(qr1[2], qr2[0]) qc.cx(qr2[0], qr2[1]) trivial_layout = { 0: Qubit(QuantumRegister(3, 'qr1'), 0), 1: Qubit(QuantumRegister(3, 'qr1'), 1), 2: Qubit(QuantumRegister(3, 'qr1'), 2), 3: Qubit(QuantumRegister(2, 'qr2'), 0), 4: Qubit(QuantumRegister(2, 'qr2'), 1), 5: Qubit(QuantumRegister(15, 'ancilla'), 0), 6: Qubit(QuantumRegister(15, 'ancilla'), 1), 7: Qubit(QuantumRegister(15, 'ancilla'), 2), 8: Qubit(QuantumRegister(15, 'ancilla'), 3), 9: Qubit(QuantumRegister(15, 'ancilla'), 4), 10: Qubit(QuantumRegister(15, 'ancilla'), 5), 11: Qubit(QuantumRegister(15, 'ancilla'), 6), 12: Qubit(QuantumRegister(15, 'ancilla'), 7), 13: Qubit(QuantumRegister(15, 'ancilla'), 8), 14: Qubit(QuantumRegister(15, 'ancilla'), 9), 15: Qubit(QuantumRegister(15, 'ancilla'), 10), 16: Qubit(QuantumRegister(15, 'ancilla'), 11), 17: Qubit(QuantumRegister(15, 'ancilla'), 12), 18: Qubit(QuantumRegister(15, 'ancilla'), 13), 19: Qubit(QuantumRegister(15, 'ancilla'), 14) } dense_layout = { 2: Qubit(QuantumRegister(3, 'qr1'), 0), 6: Qubit(QuantumRegister(3, 'qr1'), 1), 1: Qubit(QuantumRegister(3, 'qr1'), 2), 5: Qubit(QuantumRegister(2, 'qr2'), 0), 0: Qubit(QuantumRegister(2, 'qr2'), 1), 3: Qubit(QuantumRegister(15, 'ancilla'), 0), 4: Qubit(QuantumRegister(15, 'ancilla'), 1), 7: Qubit(QuantumRegister(15, 'ancilla'), 2), 8: Qubit(QuantumRegister(15, 'ancilla'), 3), 9: Qubit(QuantumRegister(15, 'ancilla'), 4), 10: Qubit(QuantumRegister(15, 'ancilla'), 5), 11: Qubit(QuantumRegister(15, 'ancilla'), 6), 12: Qubit(QuantumRegister(15, 'ancilla'), 7), 13: Qubit(QuantumRegister(15, 'ancilla'), 8), 14: Qubit(QuantumRegister(15, 'ancilla'), 9), 15: Qubit(QuantumRegister(15, 'ancilla'), 10), 16: Qubit(QuantumRegister(15, 'ancilla'), 11), 17: Qubit(QuantumRegister(15, 'ancilla'), 12), 18: Qubit(QuantumRegister(15, 'ancilla'), 13), 19: Qubit(QuantumRegister(15, 'ancilla'), 14) } csp_layout = { 0: Qubit(QuantumRegister(3, 'qr1'), 1), 1: Qubit(QuantumRegister(3, 'qr1'), 2), 2: Qubit(QuantumRegister(2, 'qr2'), 0), 5: Qubit(QuantumRegister(3, 'qr1'), 0), 6: Qubit(QuantumRegister(2, 'qr2'), 1), 3: Qubit(QuantumRegister(15, 'ancilla'), 0), 4: Qubit(QuantumRegister(15, 'ancilla'), 1), 7: Qubit(QuantumRegister(15, 'ancilla'), 2), 8: Qubit(QuantumRegister(15, 'ancilla'), 3), 9: Qubit(QuantumRegister(15, 'ancilla'), 4), 10: Qubit(QuantumRegister(15, 'ancilla'), 5), 11: Qubit(QuantumRegister(15, 'ancilla'), 6), 12: Qubit(QuantumRegister(15, 'ancilla'), 7), 13: Qubit(QuantumRegister(15, 'ancilla'), 8), 14: Qubit(QuantumRegister(15, 'ancilla'), 9), 15: Qubit(QuantumRegister(15, 'ancilla'), 10), 16: Qubit(QuantumRegister(15, 'ancilla'), 11), 17: Qubit(QuantumRegister(15, 'ancilla'), 12), 18: Qubit(QuantumRegister(15, 'ancilla'), 13), 19: Qubit(QuantumRegister(15, 'ancilla'), 14) } # Trivial layout expected_layout_level0 = trivial_layout # Dense layout expected_layout_level1 = dense_layout # CSP layout expected_layout_level2 = csp_layout expected_layout_level3 = csp_layout expected_layouts = [ expected_layout_level0, expected_layout_level1, expected_layout_level2, expected_layout_level3 ] backend = FakeTokyo() result = transpile(qc, backend, optimization_level=level, seed_transpiler=42) self.assertEqual(result._layout._p2v, expected_layouts[level])
oneQ_gates = [HGate, IdGate, SGate, SdgGate, TGate, TdgGate, XGate, YGate, ZGate, Reset] twoQ_gates = [CnotGate, CyGate, CzGate, SwapGate, CHGate] threeQ_gates = [ToffoliGate, FredkinGate] oneQ_oneP_gates = [U0Gate, U1Gate, RXGate, RYGate, RZGate] oneQ_twoP_gates = [U2Gate] oneQ_threeP_gates = [U3Gate] twoQ_oneP_gates = [CrzGate, RZZGate, Cu1Gate] twoQ_threeP_gates = [Cu3Gate] oneQ_oneC_gates = [Measure] variadic_gates = [Barrier] mock_backends = [FakeTenerife(), FakeMelbourne(), FakeRueschlikon(), FakeTokyo(), FakePoughkeepsie()] @settings(report_multiple_bugs=False, max_examples=50, deadline=None) class QCircuitMachine(RuleBasedStateMachine): """Build a Hypothesis rule based state machine for constructing, transpiling and simulating a series of random QuantumCircuits. Build circuits with up to QISKIT_RANDOM_QUBITS qubits, apply a random selection of gates from qiskit.extensions.standard with randomly selected qargs, cargs, and parameters. At random intervals, transpile the circuit for a random backend with a random optimization level and simulate both the initial and the transpiled circuits to verify that their counts are the same.
def setUp(self): self.cmap20 = FakeTokyo().configuration().coupling_map
oneQ_threeP_gates = [U3Gate] twoQ_oneP_gates = [CRZGate, RZZGate, CU1Gate] twoQ_threeP_gates = [CU3Gate] oneQ_oneC_gates = [Measure] variadic_gates = [Barrier] mock_backends = [ FakeYorktown(), FakeTenerife(), FakeOurense(), FakeVigo(), FakeMelbourne(), FakeRueschlikon(), FakeTokyo(), FakePoughkeepsie(), FakeAlmaden(), FakeSingapore(), FakeJohannesburg(), FakeBoeblingen() ] # FakeRochester disabled until https://github.com/Qiskit/qiskit-aer/pull/693 is released. @settings(report_multiple_bugs=False, max_examples=25, deadline=None, suppress_health_check=[HealthCheck.filter_too_much]) class QCircuitMachine(RuleBasedStateMachine):
twoQ_gates = [CXGate, CYGate, CZGate, SwapGate, CHGate] threeQ_gates = [CCXGate, CSwapGate] oneQ_oneP_gates = [U1Gate, RXGate, RYGate, RZGate] oneQ_twoP_gates = [U2Gate] oneQ_threeP_gates = [U3Gate] twoQ_oneP_gates = [CRZGate, RZZGate, CU1Gate] twoQ_threeP_gates = [CU3Gate] oneQ_oneC_gates = [Measure] variadic_gates = [Barrier] mock_backends = [FakeYorktown(), FakeTenerife(), FakeOurense(), FakeVigo(), FakeMelbourne(), FakeRueschlikon(), FakeTokyo(), FakePoughkeepsie(), FakeAlmaden(), FakeSingapore(), FakeJohannesburg(), FakeBoeblingen()] # FakeRochester disabled until https://github.com/Qiskit/qiskit-aer/pull/693 is released. @settings(report_multiple_bugs=False, max_examples=25, deadline=None, suppress_health_check=[HealthCheck.filter_too_much]) class QCircuitMachine(RuleBasedStateMachine): """Build a Hypothesis rule based state machine for constructing, transpiling and simulating a series of random QuantumCircuits. Build circuits with up to QISKIT_RANDOM_QUBITS qubits, apply a random selection of gates from qiskit.circuit.library with randomly selected