Ejemplo n.º 1
0
    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])
Ejemplo n.º 2
0
    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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
    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')
Ejemplo n.º 6
0
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])
Ejemplo n.º 8
0
    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])
Ejemplo n.º 10
0
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.
Ejemplo n.º 11
0
 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