def test_3q_schedule(self):
     """Test a schedule that was recommended by David McKay :D """
     backend = FakeOpenPulse3Q()
     inst_map = backend.defaults().instruction_schedule_map
     q = QuantumRegister(3)
     c = ClassicalRegister(3)
     qc = QuantumCircuit(q, c)
     qc.cx(q[0], q[1])
     qc.u2(0.778, 0.122, q[2])
     qc.u3(3.14, 1.57, 0., q[0])
     qc.u2(3.14, 1.57, q[1])
     qc.cx(q[1], q[2])
     qc.u2(0.778, 0.122, q[2])
     sched = schedule(qc, backend)
     expected = Schedule(
         inst_map.get('cx', [0, 1]),
         (22, inst_map.get('u2', [1], 3.14, 1.57)),
         (46, inst_map.get('u2', [2], 0.778, 0.122)),
         (50, inst_map.get('cx', [1, 2])),
         (72, inst_map.get('u2', [2], 0.778, 0.122)),
         (74, inst_map.get('u3', [0], 3.14, 1.57)))
     for actual, expected in zip(sched.instructions, expected.instructions):
         self.assertEqual(actual[0], expected[0])
         self.assertEqual(actual[1].command, expected[1].command)
         self.assertEqual(actual[1].channels, expected[1].channels)
    def test_3q_schedule(self):
        """Test a schedule that was recommended by David McKay :D"""

        #                          ┌─────────────────┐
        # q0_0: ─────────■─────────┤ U3(3.14,1.57,0) ├────────────────────────
        #              ┌─┴─┐       └┬───────────────┬┘
        # q0_1: ───────┤ X ├────────┤ U2(3.14,1.57) ├───■─────────────────────
        #       ┌──────┴───┴──────┐ └───────────────┘ ┌─┴─┐┌─────────────────┐
        # q0_2: ┤ U2(0.778,0.122) ├───────────────────┤ X ├┤ U2(0.778,0.122) ├
        #       └─────────────────┘                   └───┘└─────────────────┘
        backend = FakeOpenPulse3Q()
        inst_map = backend.defaults().instruction_schedule_map
        q = QuantumRegister(3)
        c = ClassicalRegister(3)
        qc = QuantumCircuit(q, c)
        qc.cx(q[0], q[1])
        qc.append(U2Gate(0.778, 0.122), [q[2]])
        qc.append(U3Gate(3.14, 1.57, 0), [q[0]])
        qc.append(U2Gate(3.14, 1.57), [q[1]])
        qc.cx(q[1], q[2])
        qc.append(U2Gate(0.778, 0.122), [q[2]])
        sched = schedule(qc, backend)
        expected = Schedule(
            inst_map.get("cx", [0, 1]),
            (22, inst_map.get("u2", [1], 3.14, 1.57)),
            (22, inst_map.get("u2", [2], 0.778, 0.122)),
            (24, inst_map.get("cx", [1, 2])),
            (44, inst_map.get("u3", [0], 3.14, 1.57, 0)),
            (46, inst_map.get("u2", [2], 0.778, 0.122)),
        )
        for actual, expected in zip(sched.instructions, expected.instructions):
            self.assertEqual(actual[0], expected[0])
            self.assertEqual(actual[1], expected[1])
Beispiel #3
0
    def test_assemble_parametric(self):
        """Test that parametric pulses can be assembled properly into a PulseQobj."""
        sched = pulse.Schedule(name='test_parametric')
        sched += Play(pulse.Gaussian(duration=25, sigma=4, amp=0.5j), DriveChannel(0))
        sched += Play(pulse.Drag(duration=25, amp=0.2+0.3j, sigma=7.8, beta=4), DriveChannel(1))
        sched += Play(pulse.Constant(duration=25, amp=1), DriveChannel(2))
        sched += Play(pulse.GaussianSquare(duration=150, amp=0.2,
                                           sigma=8, width=140), MeasureChannel(0)) << sched.duration
        backend = FakeOpenPulse3Q()
        backend.configuration().parametric_pulses = ['gaussian', 'drag',
                                                     'gaussian_square', 'constant']
        qobj = assemble(sched, backend)

        self.assertEqual(qobj.config.pulse_library, [])
        qobj_insts = qobj.experiments[0].instructions
        self.assertTrue(all(inst.name == 'parametric_pulse'
                            for inst in qobj_insts))
        self.assertEqual(qobj_insts[0].pulse_shape, 'gaussian')
        self.assertEqual(qobj_insts[1].pulse_shape, 'drag')
        self.assertEqual(qobj_insts[2].pulse_shape, 'constant')
        self.assertEqual(qobj_insts[3].pulse_shape, 'gaussian_square')
        self.assertDictEqual(qobj_insts[0].parameters, {'duration': 25, 'sigma': 4, 'amp': 0.5j})
        self.assertDictEqual(qobj_insts[1].parameters,
                             {'duration': 25, 'sigma': 7.8, 'amp': 0.2+0.3j, 'beta': 4})
        self.assertDictEqual(qobj_insts[2].parameters, {'duration': 25, 'amp': 1})
        self.assertDictEqual(qobj_insts[3].parameters,
                             {'duration': 150, 'sigma': 8, 'amp': 0.2, 'width': 140})
        self.assertEqual(
            qobj.to_dict()['experiments'][0]['instructions'][0]['parameters']['amp'],
            0.5j)
Beispiel #4
0
 def test_multiple_measure_in_3Q(self):
     """Test multiple measure, user memslot mapping, 3Q."""
     backend = FakeOpenPulse3Q()
     cmd_def = backend.defaults().build_cmd_def()
     q = QuantumRegister(3)
     c = ClassicalRegister(5)
     qc = QuantumCircuit(q, c)
     qc.measure(q[0], c[2])
     qc.measure(q[0], c[4])
     sched = schedule(qc, backend)
     expected = Schedule(
         cmd_def.get('measure',
                     [0, 1, 2]).filter(channels=[MeasureChannel(0)]),
         Acquire(duration=10)(
             [AcquireChannel(0),
              AcquireChannel(1),
              AcquireChannel(2)],
             [MemorySlot(2), MemorySlot(0),
              MemorySlot(1)]),
         (10, cmd_def.get('measure',
                          [0, 1, 2]).filter(channels=[MeasureChannel(0)])),
         (10, Acquire(duration=10)(
             [AcquireChannel(0),
              AcquireChannel(1),
              AcquireChannel(2)],
             [MemorySlot(4), MemorySlot(0),
              MemorySlot(1)])))
     self.assertEqual(sched.instructions, expected.instructions)
    def test_subset_calibrated_measurements(self):
        """Test that measurement calibrations can be added and used for some qubits, even
        if the other qubits do not also have calibrated measurements."""
        qc = QuantumCircuit(3, 3)
        qc.measure(0, 0)
        qc.measure(1, 1)
        qc.measure(2, 2)
        meas_scheds = []
        for qubit in [0, 2]:
            meas = (Play(Gaussian(1200, 0.2, 4), MeasureChannel(qubit)) +
                    Acquire(1200, AcquireChannel(qubit), MemorySlot(qubit)))
            meas_scheds.append(meas)
            qc.add_calibration('measure', [qubit], meas)

        meas = macros.measure([1], FakeOpenPulse3Q())
        meas = meas.exclude(channels=[AcquireChannel(0), AcquireChannel(2)])
        sched = schedule(qc, FakeOpenPulse3Q())
        expected = Schedule(meas_scheds[0], meas_scheds[1], meas)
        self.assertEqual(sched.instructions, expected.instructions)
Beispiel #6
0
    def test_assemble_parametric_unsupported(self):
        """Test that parametric pulses are translated to Waveform if they're not supported
        by the backend during assemble time.
        """
        sched = pulse.Schedule(name='test_parametric_to_sample_pulse')
        sched += Play(pulse.Drag(duration=25, amp=0.2+0.3j, sigma=7.8, beta=4), DriveChannel(1))
        sched += Play(pulse.Constant(duration=25, amp=1), DriveChannel(2))

        backend = FakeOpenPulse3Q()
        backend.configuration().parametric_pulses = ['something_extra']

        qobj = assemble(sched, backend)

        self.assertNotEqual(qobj.config.pulse_library, [])
        qobj_insts = qobj.experiments[0].instructions
        self.assertFalse(hasattr(qobj_insts[0], 'pulse_shape'))
 def test_user_mapping_for_memslots_3Q(self):
     """Test measuring two of three qubits."""
     backend = FakeOpenPulse3Q()
     cmd_def = backend.defaults().build_cmd_def()
     q = QuantumRegister(3)
     c = ClassicalRegister(3)
     qc = QuantumCircuit(q, c)
     qc.measure(q[1], c[2])
     qc.measure(q[2], c[0])
     sched = schedule(qc, backend)
     expected = Schedule(
         cmd_def.get('measure', [0, 1, 2]).filter(
             channels=[MeasureChannel(1), MeasureChannel(2)]),
         Acquire(duration=10)([AcquireChannel(0), AcquireChannel(1), AcquireChannel(2)],
                              [MemorySlot(1), MemorySlot(2), MemorySlot(0)]))
     self.assertEqual(sched.instructions, expected.instructions)
Beispiel #8
0
 def test_3q_schedule(self):
     """Test a schedule that was recommended by David McKay :D """
     backend = FakeOpenPulse3Q()
     cmd_def = backend.defaults().build_cmd_def()
     q = QuantumRegister(3)
     c = ClassicalRegister(3)
     qc = QuantumCircuit(q, c)
     qc.cx(q[0], q[1])
     qc.u2(0.778, 0.122, q[2])
     qc.u3(3.14, 1.57, 0., q[0])
     qc.u2(3.14, 1.57, q[1])
     qc.cx(q[1], q[2])
     qc.u2(0.778, 0.122, q[2])
     sched = schedule(qc, backend)
     expected = Schedule(cmd_def.get('cx', [0, 1]),
                         (22, cmd_def.get('u2', [1], 3.14, 1.57)),
                         (46, cmd_def.get('u2', [2], 0.778, 0.122)),
                         (50, cmd_def.get('cx', [1, 2])),
                         (72, cmd_def.get('u2', [2], 0.778, 0.122)),
                         (74, cmd_def.get('u3', [0], 3.14, 1.57)))
     self.assertEqual(sched.instructions, expected.instructions)