def test_gaussian_pulse(self): """Test that Gaussian sample pulse matches the pulse library.""" gauss = Gaussian(duration=25, sigma=4, amp=0.5j) sample_pulse = gauss.get_waveform() self.assertIsInstance(sample_pulse, Waveform) pulse_lib_gauss = gaussian(duration=25, sigma=4, amp=0.5j, zero_ends=True).samples np.testing.assert_almost_equal(sample_pulse.samples, pulse_lib_gauss)
def test_sampled_pulse(self): """Test that we can convert to a sampled pulse.""" gauss = Gaussian(duration=25, sigma=4, amp=0.5j) sample_pulse = gauss.get_waveform() self.assertIsInstance(sample_pulse, Waveform) pulse_lib_gaus = gaussian(duration=25, sigma=4, amp=0.5j, zero_ends=False).samples np.testing.assert_almost_equal(sample_pulse.samples, pulse_lib_gaus)
def test_gaussian_limit_amplitude(self): """Test that the check for amplitude less than or equal to 1 can be disabled.""" with self.assertRaises(PulseError): Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j) with patch("qiskit.pulse.library.pulse.Pulse.limit_amplitude", new=False): waveform = Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j) self.assertGreater(np.abs(waveform.amp), 1.0)
def test_gaussian_limit_amplitude_per_instance(self): """Test that the check for amplitude per instance.""" with self.assertRaises(PulseError): Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j) waveform = Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j, limit_amplitude=False) self.assertGreater(np.abs(waveform.amp), 1.0)
def test_gauss_square_extremes(self): """Test that the gaussian square pulse can build a gaussian.""" duration = 125 sigma = 4 amp = 0.5j gaus_square = GaussianSquare(duration=duration, sigma=sigma, amp=amp, width=0) gaus = Gaussian(duration=duration, sigma=sigma, amp=amp) np.testing.assert_almost_equal(gaus_square.get_waveform().samples, gaus.get_waveform().samples) gaus_square = GaussianSquare(duration=duration, sigma=sigma, amp=amp, width=121) const = Constant(duration=duration, amp=amp) np.testing.assert_almost_equal(gaus_square.get_waveform().samples[2:-2], const.get_waveform().samples[2:-2])
def test_gauss_samples(self): """Test that the gaussian samples match the formula.""" duration = 25 sigma = 4 amp = 0.5j # formulaic times = np.array(range(25), dtype=np.complex_) times = times - (duration / 2) + 0.5 gauss = amp * np.exp(-(times / sigma)**2 / 2) # wf wf = Gaussian(duration=duration, sigma=sigma, amp=amp) samples = wf.get_waveform().samples np.testing.assert_almost_equal(samples, gauss)
def test_gaussian_limit_amplitude(self): """Test that the check for amplitude less than or equal to 1 can be disabled.""" waveform = Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j, limit_amplitude=False) self.assertGreater(np.abs(waveform.amp), 1.0) with self.assertRaises(PulseError): Gaussian(duration=100, sigma=1.0, amp=1.1 + 0.8j, limit_amplitude=True)
def test_param_validation(self): """Test that parametric pulse parameters are validated when initialized.""" with self.assertRaises(PulseError): Gaussian(duration=25, sigma=0, amp=0.5j) with self.assertRaises(PulseError): GaussianSquare(duration=150, amp=0.2, sigma=8) with self.assertRaises(PulseError): GaussianSquare(duration=150, amp=0.2, sigma=8, width=100, risefall_sigma_ratio=5) with self.assertRaises(PulseError): GaussianSquare(duration=150, amp=0.2, sigma=8, width=160) with self.assertRaises(PulseError): GaussianSquare(duration=150, amp=0.2, sigma=8, risefall_sigma_ratio=10) with self.assertRaises(PulseError): Constant(duration=150, amp=0.9 + 0.8j) with self.assertRaises(PulseError): Drag(duration=25, amp=0.2 + 0.3j, sigma=-7.8, beta=4) with self.assertRaises(PulseError): Drag(duration=25, amp=0.2 + 0.3j, sigma=7.8, beta=4j)
def test_construction(self): """Test that parametric pulses can be constructed without error.""" Gaussian(duration=25, sigma=4, amp=0.5j) GaussianSquare(duration=150, amp=0.2, sigma=8, width=140) GaussianSquare(duration=150, amp=0.2, sigma=8, risefall_sigma_ratio=2.5) Constant(duration=150, amp=0.1 + 0.4j) Drag(duration=25, amp=0.2 + 0.3j, sigma=7.8, beta=4)
def test_symbolic_amplitude_limit(self): """Test applying amplitude limit to symbolic pulse.""" with builder.build() as test_sched: builder.play( Gaussian(160, 20, 40, limit_amplitude=False), DriveChannel(0), ) self.assert_roundtrip_equal(test_sched)
def test_repr(self): """Test the repr methods for parametric pulses.""" gaus = Gaussian(duration=25, amp=0.7, sigma=4) self.assertEqual(repr(gaus), 'Gaussian(duration=25, amp=(0.7+0j), sigma=4)') gaus_square = GaussianSquare(duration=20, sigma=30, amp=1.0, width=3) self.assertEqual(repr(gaus_square), 'GaussianSquare(duration=20, amp=(1+0j), sigma=30, width=3)') drag = Drag(duration=5, amp=0.5, sigma=7, beta=1) self.assertEqual(repr(drag), 'Drag(duration=5, amp=(0.5+0j), sigma=7, beta=1)') const = Constant(duration=150, amp=0.1 + 0.4j) self.assertEqual(repr(const), 'Constant(duration=150, amp=(0.1+0.4j))')
def test_gaussian_pulse_instruction(self): """Test that parametric pulses are correctly converted to PulseQobjInstructions.""" converter = InstructionToQobjConverter(PulseQobjInstruction, meas_level=2) instruction = Play(Gaussian(duration=25, sigma=15, amp=-0.5 + 0.2j), DriveChannel(0)) valid_qobj = PulseQobjInstruction( name='parametric_pulse', pulse_shape='gaussian', ch='d0', t0=0, parameters={'duration': 25, 'sigma': 15, 'amp': -0.5 + 0.2j}) self.assertEqual(converter(0, instruction), valid_qobj)
def test_parametric_pulses(self): """Test converted qobj from ParametricInstruction.""" instruction = Play(Gaussian(duration=25, sigma=15, amp=-0.5 + 0.2j), DriveChannel(0)) qobj = PulseQobjInstruction( name='parametric_pulse', pulse_shape='gaussian', ch='d0', t0=0, parameters={'duration': 25, 'sigma': 15, 'amp': -0.5 + 0.2j}) converted_instruction = self.converter(qobj) self.assertEqual(converted_instruction.start_time, 0) self.assertEqual(converted_instruction.duration, 25) self.assertEqual(converted_instruction.instructions[0][-1], instruction)
def test_gaussian_pulse_instruction(self): """Test that parametric pulses are correctly converted to PulseQobjInstructions.""" converter = InstructionToQobjConverter(PulseQobjInstruction, meas_level=2) instruction = Play(Gaussian(duration=25, sigma=15, amp=-0.5 + 0.2j), DriveChannel(0)) valid_qobj = PulseQobjInstruction( name="parametric_pulse", pulse_shape="gaussian", ch="d0", t0=0, parameters={ "duration": 25, "sigma": 15, "amp": -0.5 + 0.2j }, ) self.assertEqual(converter(0, instruction), valid_qobj)
def test_parametric_pulses(self): """Test converted qobj from ParametricInstruction.""" instruction = Play( Gaussian(duration=25, sigma=15, amp=-0.5 + 0.2j, name="pulse1"), DriveChannel(0)) qobj = PulseQobjInstruction( name="parametric_pulse", label="pulse1", pulse_shape="gaussian", ch="d0", t0=0, parameters={ "duration": 25, "sigma": 15, "amp": -0.5 + 0.2j }, ) converted_instruction = self.converter(qobj) self.assertEqual(converted_instruction.start_time, 0) self.assertEqual(converted_instruction.duration, 25) self.assertEqual(converted_instruction.instructions[0][-1], instruction) self.assertEqual(converted_instruction.instructions[0][-1].pulse.name, "pulse1")
def test_parameterized(self, channel, *params): """Test playing parameterized pulse.""" # pylint: disable=no-value-for-parameter with builder.build() as test_sched: builder.play(Gaussian(*params), DriveChannel(channel)) self.assert_roundtrip_equal(test_sched)