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)
Example #4
0
    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)