def test_build_waveform_none_channel(self): ppt = PointPulseTemplate([('t1', 'A'), ('t2', 0., 'hold'), ('t1+t2', 'B+C', 'linear')], [0, 'A', 'C'], measurements=[('M', 'n', 1), ('L', 'n', 1)]) parameters = { 't1': 0.1, 't2': 1., 'A': np.ones(3), 'B': np.arange(3), 'C': 19., 'n': 0.2 } self.assertIsNone( ppt.build_waveform(parameters, { 0: None, 'A': None, 'C': None })) wf = ppt.build_waveform(parameters, {0: 1, 'A': None, 'C': None}) self.assertIsInstance(wf, PointWaveform) self.assertEqual(wf.defined_channels, {1}) wf = ppt.build_waveform(parameters, {0: 1, 'A': 2, 'C': None}) self.assertIsInstance(wf, MultiChannelWaveform) self.assertEqual(wf.defined_channels, {1, 2})
def test_build_waveform_multi_channel_vectorized(self): ppt = PointPulseTemplate([('t1', 'A'), ('t2', 0., 'hold'), ('t1+t2', 'B+C', 'linear')], [0, 'A'], measurements=[('M', 'n', 1), ('L', 'n', 1)]) parameters = { 't1': 0.1, 't2': 1., 'A': np.ones(2), 'B': np.arange(2), 'C': 19., 'n': 0.2 } wf = ppt.build_waveform(parameters=parameters, channel_mapping={ 0: 1, 'A': 'A' }) expected_1 = PointWaveform(1, [(0, 1., HoldInterpolationStrategy()), (0.1, 1., HoldInterpolationStrategy()), (1., 0., HoldInterpolationStrategy()), (1.1, 19., LinearInterpolationStrategy())]) expected_A = PointWaveform('A', [(0, 1., HoldInterpolationStrategy()), (0.1, 1., HoldInterpolationStrategy()), (1., 0., HoldInterpolationStrategy()), (1.1, 20., LinearInterpolationStrategy())]) self.assertEqual(wf.defined_channels, {1, 'A'}) self.assertEqual(wf._sub_waveforms[0].defined_channels, {1}) self.assertEqual(wf._sub_waveforms[0], expected_1) self.assertEqual(wf._sub_waveforms[1].defined_channels, {'A'}) self.assertEqual(wf._sub_waveforms[1], expected_A)
def test_build_waveform_single_channel_with_measurements(self): ppt = PointPulseTemplate([('t1', 'A'), ('t2', 0., 'hold'), ('t1+t2', 'B+C', 'linear')], [0], measurements=[('M', 'n', 1), ('L', 'n', 1)]) parameters = {'t1': 0.1, 't2': 1., 'A': 1., 'B': 2., 'C': 19., 'n': 0.2} wf = ppt.build_waveform(parameters=parameters, channel_mapping={0: 1}) expected = PointWaveform(1, [(0, 1., HoldInterpolationStrategy()), (0.1, 1., HoldInterpolationStrategy()), (1., 0., HoldInterpolationStrategy()), (1.1, 21., LinearInterpolationStrategy())]) self.assertEqual(wf, expected)
def test_build_waveform_single_channel(self): ppt = PointPulseTemplate([('t1', 'A'), ('t2', 0., 'hold'), ('t1+t2', 'B+C', 'linear')], [0]) parameters = {'t1': 0.1, 't2': 1., 'A': 1., 'B': 2., 'C': 19.} wf = ppt.build_waveform(parameters=parameters, channel_mapping={0: 1}) expected = PointWaveform.from_table( 1, [(0, 1., HoldInterpolationStrategy()), (0.1, 1., HoldInterpolationStrategy()), (1., 0., HoldInterpolationStrategy()), (1.1, 21., LinearInterpolationStrategy())]) self.assertIsInstance(wf, PointWaveform) self.assertEqual(wf, expected)
class PointPulseExpressionIntegralTests(unittest.TestCase): def setUp(self): self.template = PointPulseTemplate( **PointPulseTemplateSerializationTests().make_kwargs()) self.parameter_sets = [ { 'foo': 1., 'hugo': 2., 'sudo': 3., 'A': 4., 'B': 5., 'a': 6., 'ilse': 7., 'k': 8. }, { 'foo': 1.1, 'hugo': 2.6, 'sudo': 2.7, 'A': np.array([3., 4.]), 'B': 5., 'a': 6., 'ilse': 7., 'k': 8. }, ] def test_integral_as_expression_compatible(self): import sympy t = self.template._AS_EXPRESSION_TIME as_expression = self.template._as_expression() integral = self.template.integral duration = self.template.duration.underlying_expression self.assertEqual(self.template.defined_channels, integral.keys()) self.assertEqual(self.template.defined_channels, as_expression.keys()) for channel in self.template.defined_channels: ch_expr = as_expression[channel].underlying_expression ch_int = integral[channel].underlying_expression symbolic = sympy.integrate(ch_expr, (t, 0, duration)) symbolic = sympy.simplify(symbolic) scalar_from_as_expr = ExpressionScalar(symbolic) scalar_from_integral = ExpressionScalar(ch_int) for parameters in self.parameter_sets: num_from_expr = scalar_from_as_expr.evaluate_in_scope( parameters) num_from_in = scalar_from_integral.evaluate_in_scope( parameters) np.testing.assert_almost_equal(num_from_in, num_from_expr) # TODO: the following fails even with a lot of assumptions in sympy 1.6 # self.assertEqual(ch_int, symbolic) def test_as_expression_wf_and_sample_compatible(self): as_expression = self.template._as_expression() for parameters in self.parameter_sets: wf = self.template.build_waveform( parameters, {c: c for c in self.template.defined_channels}) ts = np.linspace(0, float(wf.duration), num=33) sampled = { ch: wf.get_sampled(ch, ts) for ch in self.template.defined_channels } from_expr = {} for ch, expected_vs in sampled.items(): ch_expr = as_expression[ch] ch_from_expr = [] for t, expected in zip(ts, expected_vs): result_expr = ch_expr.evaluate_symbolic({ **parameters, self.template._AS_EXPRESSION_TIME: t }) ch_from_expr.append(result_expr.sympified_expression) from_expr[ch] = ch_from_expr np.testing.assert_almost_equal(expected_vs, ch_from_expr)